Skip to content

Commit

Permalink
1.38.0 release
Browse files Browse the repository at this point in the history
  • Loading branch information
baumandm committed Sep 2, 2016
1 parent 2112cf1 commit d9f6710
Show file tree
Hide file tree
Showing 67 changed files with 1,047 additions and 523 deletions.
26 changes: 26 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,29 @@
# 1.38.0 (09/02/2016)

## Features

- Dashboard Sidebar: Show/Hide Widgets now allows drag-and-drop reordering of Widgets. Like the visibility toggle, this overrides the Widget order for the current user, and is persisted across sessions (in the same browser).

- Analytics/Statistics Update: Revisited the instance statistics displayed on the Analytics page: added/removed/renamed where appropriate. Switched from 1 month metrics to last 30 days for consistency.

- Widget Data Export: Added new export dropdown menu to all Widgets by default, with the option to download data in JSON/CSV/XLSX formats. Also added JavaScript hooks to custom trigger exporting of Widget data, or to export custom data.

- Table Widget: Added a property for configuring a message to display underneath the pager when pagination is enabled. Message can interpolate paging variables such as #{totalItems}, #{itemsPerPage}, and #{currentPage}.

- Widgets: Auto-Height (Fit to Content): Added option to allow Widgets to scale vertically to fit their contents, instead of providing a Grid or absolute height value. This may be useful for embedding HTML content of varying length.

- View Permissions Failed Dialog: Added Dashboard Editors (including emails) to the dialog, so users who lack permissions can request accesss from the owners of the Dashboard.

## Bug Fixes

- After login failure, set focus on password field

- Dashboards: in some cases, multiple browser history entries would be created when a Dashboard is loaded, confusing navigation. The extra entries have been removed.

- Update Data Sources to automatically use the current protocol (HTTP/HTTPS) for proxies.

- Fix issues with missing fonts in certain circumstances.

# 1.37.0 (08/18/2016)

## Features
Expand Down
86 changes: 32 additions & 54 deletions cyclotron-site/app/partials/analytics.jade
Original file line number Diff line number Diff line change
Expand Up @@ -8,33 +8,21 @@
dt {{ statistics.dashboards.total.count | numeraljs:'0,0' }}
dd total
ng-pluralize(count='statistics.dashboards.total.count', when='{"one": "Dashboard", "other": "Dashboards"}')
dl(title='Total number of non-deleted Dashboards')
dt {{ statistics.dashboards.undeletedDashboards.count | numeraljs:'0,0' }}
dd active
ng-pluralize(count='statistics.dashboards.undeletedDashboards.count', when='{"one": "Dashboard", "other": "Dashboards"}')
dl(title='Number of viewed Dashboards in the last 30 days')
dt {{ statistics.dashboards.active.activePastThirtyDayCount | numeraljs:'0,0' }}
dd 30-day active
ng-pluralize(count='statistics.dashboards.active.activePastThirtyDayCount', when='{"one": "Dashboard", "other": "Dashboards"}')
dl(title='Total number of deleted Dashboards')
dt {{ statistics.dashboards.deletedDashboards.count | numeraljs:'0,0' }}
dd deleted
ng-pluralize(count='statistics.dashboards.deletedDashboards.count', when='{"one": "Dashboard", "other": "Dashboards"}')
dl(title='Total number of Dashboards modified within the last day')
dt {{ statistics.dashboards.total.editedPastDayCount | numeraljs:'0,0' }}
dd modified in the past day
dl(title='Total number of Dashboards modified within the last 6 months')
dt {{ statistics.dashboards.total.editedPastSixMonthsCount | numeraljs:'0,0' }}
dd modified in the last 6 months
dl(title='Total number of Dashboards modified within the last 30 days')
dt {{ statistics.dashboards.total.editedPastThirtyDayCount | numeraljs:'0,0' }}
dd modified in the last 30 days
dl(title='Total number of Dashboards deleted within the last 30 days')
dt {{ statistics.dashboards.deletedDashboards.editedPastThirtyDayCount | numeraljs:'0,0' }}
dd deleted in the last 30 days

dl(title='Total number of Dashboards with limited editing permissions')
dt {{ statistics.dashboards.total.restrictedEditingCount | numeraljs:'0,0' }}
dd secured
ng-pluralize(count='statistics.dashboards.total.restrictedEditingCount', when='{"one": "Dashboard", "other": "Dashboards"}')
dl(title='Total number of Dashboards with limited viewing permissions')
dt {{ statistics.dashboards.total.restrictedViewingCount | numeraljs:'0,0' }}
dd private
ng-pluralize(count='statistics.dashboards.total.restrictedViewingCount', when='{"one": "Dashboard", "other": "Dashboards"}')

dl(title='Average number of tags assigned per Dashboard')
dt {{ statistics.dashboards.total.avgTagsCount | numeraljs:'0.00' }}
dd tags per Dashboard
dl(title='Total number of Revisions, including those for deleted Dashboards')
dt {{ statistics.revisions.count | numeraljs:'0,0' }}
dd total
Expand All @@ -49,30 +37,27 @@
h2 Likes
dl(title='Total number of likes for all active Dashboards (currently)')
dt {{ statistics.likes.count | numeraljs:'0,0' }}
dd unique Likes
dl(title='Total number of times a Dashboard was liked')
dd current Likes
dl(title='Total number of times Dashboards have been liked (or re-liked)')
dt {{ statistics.likeEvents.count | numeraljs:'0,0' }}
dd all-time Likes
dl(title='Total number of Dashboard Likes within the last day')
dd all-time Likes (including repeats)
dl(title='Total number of Dashboard Likes within the past day')
dt {{ statistics.likeEvents.occurredPastDayCount | numeraljs:'0,0' }}
dd times Liked in the last day
dl(title='Total number of Dashboard Likes within the last week')
dt {{ statistics.likeEvents.occurredPastWeekCount | numeraljs:'0,0' }}
dd times Liked in the last week
dl(title='Total number of Dashboard Likes within the last 6 months')
dt {{ statistics.likeEvents.occurredPastSixMonthsCount | numeraljs:'0,0' }}
dd times Liked in the last 6 months
dd Likes in the past day
dl(title='Total number of Dashboard Likes within the last 30 days')
dt {{ statistics.likeEvents.occurredPastThirtyDayCount | numeraljs:'0,0' }}
dd Likes in the last 30 days
dl(title='Total number of times a Dashboard was unliked')
dt {{ statistics.unlikeEvents.count | numeraljs:'0,0' }}
dd times Unliked
dd Unlikes

h2 Visits
dl(title='Total number of times any Dashboard was visited')
dt {{ statistics.pageViews.totalVisits | numeraljs:'0,0' }}
dd total Visits
dd total Dashboard Visits
dl(title='Total number of times a Page in any Dashboard was viewed')
dt {{ statistics.pageViews.totalPageViews | numeraljs:'0,0' }}
dd total Page Views
dd total Dashboard Page Views
dl(title='Average number of Pages viewed during each Visit')
dt {{ statistics.pageViews.avgPageViewsPerVisit | numeraljs:'0.0' }}
dd Page Views per Visit
Expand All @@ -86,18 +71,16 @@
h2 Users
dl(title='Number of unique logged-in users')
dt {{ statistics.users.count | numeraljs:'0,0' }}
dd authenticated
dd registered
ng-pluralize(count='statistics.users.count', when='{"one": "user", "other": "users"}')
dl(title='Number of users who have logged in during the last 24 hours')
dl(title='Number of users who have logged in during the past 24 hours')
dt {{ statistics.users.activePastDayCount | numeraljs:'0,0' }}
dd active
dd daily active
ng-pluralize(count='statistics.users.activePastDayCount', when='{"one": "user", "other": "users"}')
| (1 day)
dl(title='Number of users who have logged in during the last month')
dt {{ statistics.users.activePastMonthCount | numeraljs:'0,0' }}
dd active
ng-pluralize(count='statistics.users.activePastMonthCount', when='{"one": "user", "other": "users"}')
| (1 month)
dl(title='Number of users who have logged in during the last 30 days')
dt {{ statistics.users.activePastThirtyDayCount | numeraljs:'0,0' }}
dd 30-day active
ng-pluralize(count='statistics.users.activePastThirtyDayCount', when='{"one": "user", "other": "users"}')
dl(title='Average number of times users have logged in')
dt {{ statistics.users.avgLoginsPerUser | numeraljs: '0.0' }}
dd logins per user
Expand All @@ -110,15 +93,10 @@
dt {{ statistics.pageViews.uniqueUids | numeraljs:'0,0' }}
dd unique
ng-pluralize(count='statistics.pageViews.uniqueUids', when='{"one": "UID", "other": "UIDs"}')
dl(title='Number of unique user cookies active over the past month (may not be authenticated)')
dt {{ statistics.users.uidsPastMonthCount | numeraljs:'0,0' }}
dd active
ng-pluralize(count='statistics.users.uidsPastMonthCount', when='{"one": "UID", "other": "UIDs"}')
| (1 month)
dl(title='Number of user sessions currently active')
dt {{ statistics.sessions.activeSessions | numeraljs:'0,0' }}
dd active
ng-pluralize(count='statistics.sessions.activeSessions', when='{"one": "session", "other": "sessions"}')
dl(title='Number of unique user cookies active over the last 30 days (may not be authenticated)')
dt {{ statistics.users.uidsPastSixMonthsCount | numeraljs:'0,0' }}
dd 30-day active
ng-pluralize(count='statistics.users.uidsPastSixMonthsCount', when='{"one": "UID", "other": "UIDs"}')
.content
.container-fluid
.row
Expand Down
26 changes: 16 additions & 10 deletions cyclotron-site/app/partials/dashboardSidebar.jade
Original file line number Diff line number Diff line change
Expand Up @@ -26,17 +26,23 @@
div(ng-bind-html='trustHtml(content.html)')

accordion-group.show-hide-widgets(heading='Show/Hide Widgets', ng-if='dashboard.sidebar.showHideWidgets == true')
table.table
tr(ng-repeat='widget in widgetVisibilities track by $index')
td {{ widget.label }}
td

ul.widget-list(dnd-list='calculatedWidgets')
li(ng-repeat='widget in calculatedWidgets',
dnd-draggable='widget',
dnd-effect-allowed='move',
dnd-moved='moveWidget($index)')
span.icon
i.fa.fa-bars
span.title {{ widget.label }}
span.swtch
switch(ng-model='widget.visible', ng-change='changeVisibility(widget, $index)')
tr
td(colspan='2')
hr
tr
td All Widgets
td

ul.widget-list.final
li
span.icon
span.title All Widgets
span.swtch
switch(ng-model='allWidgetsVisible', ng-change='toggleAllWidgets()')
p.centered
a(ng-click='resetDashboardOverrides()', title='Reset to default')
Expand Down
6 changes: 3 additions & 3 deletions cyclotron-site/app/partials/editor/pushDashboard.jade
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@

form(ng-submit='push()')
.push-dashboard.well.well-sm
select#editor-push-environment(ng-model='fields.pushLocation', ng-options='environment.name for environment in environmentsForPush')
select#editor-push-environment(ng-model='fields.pushLocation', ng-options='environment.name for environment in environmentsForPush', ng-change='updateFocus()')

div(ng-if='fields.pushLocation.requiresAuth === true')
input(type='text', ng-model='fields.username', focus-me='focusUsername', placeholder='Username')
input(type='password', ng-model='fields.password', focus-me='focusPassword', placeholder='Password')
input(type='text', ng-model='fields.username', focus-on='focusUsername', placeholder='Username')
input(type='password', ng-model='fields.password', focus-on='focusPassword', placeholder='Password')

//- Hidden input for ng-submit to work
input(type='submit', style='position: absolute; left: -9999px')
Expand Down
10 changes: 10 additions & 0 deletions cyclotron-site/app/partials/help/javascriptApi.jade
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,11 @@ table
tr
td Cyclotron.functions.forceUpdate()
td Forces Cyclotron to do an internal update of Dashboard state, e.g. syncing parameters to the URL. In general, this should not be needed, but can be used to immediately trigger an update cycle after running custom JavaScript.
tr
td Cyclotron.functions.exportData(format, data)
td Downloads the provided data in one of the following formats: 'json', 'csv', 'xlsx'. CSV and XLSX are both tabular formats and may not be correctly formatted with nested data. See also
em Cyclotron.currentPage.widgets['widgetName'].exportData(format)
| .

h4 Built-In Parameters

Expand Down Expand Up @@ -121,6 +126,11 @@ table
td Toggles the visibility of a Widget; overrides the Widget's
em hidden
| property
tr
td Cyclotron.currentPage.widgets['widgetName'].exportData(format)
td Downloads the data behind a Widget in one of the following formats: 'json', 'csv', 'xlsx'. CSV and XLSX are both tabular formats and may not be correctly formatted with nested data. See also
em Cyclotron.functions.exportData()
| .

h4 CyclotronData

Expand Down
4 changes: 2 additions & 2 deletions cyclotron-site/app/partials/login.jade
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
.login-message(ng-if='loginMessage') {{ loginMessage }}

form(ng-submit='login()')
input(type='text', ng-model='credentials.username', required, focus-me='focusUsername', placeholder='Username')
input(type='password', ng-model='credentials.password', required, focus-me='focusPassword', placeholder='Password')
input(type='text', ng-model='credentials.username', required, focus-on='focusUsername', placeholder='Username')
input(type='password', ng-model='credentials.password', required, focus-on='focusPassword', placeholder='Password')

//- Hidden input for ng-submit to work
input(type='submit', style='position: absolute; left: -9999px')
Expand Down
5 changes: 4 additions & 1 deletion cyclotron-site/app/partials/viewPermissionDenied.jade
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,10 @@
strong View Permissions
| that prevent you from being able to view or edit it.

p This is managed by the owner of this Dashboard.
p This is managed by the owner of this Dashboard. Please contact:
ul
li(ng-repeat='editor in dashboardEditors') {{ editor.displayName }}
a(href='mailto:{{ editor.mail }}?subject=Cyclotron:%20Access%20to%20Dashboard:%20{{ dashboardName }}') ({{ editor.mail }})

.modal-footer
button.btn.btn-primary(ng-click='goHome()')
Expand Down
20 changes: 20 additions & 0 deletions cyclotron-site/app/partials/widget.jade
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
.widget-control-bar
i.widget-control.widget-helptext.fa.fa-question-circle(ng-if='widgetContext.helpText', uib-tooltip='{{ ::widgetContext.helpText }}', tooltip-placement='auto-right', tooltip-trigger='outsideClick')
.widget-control.widget-dropdown-menu.btn-group(ng-if='showDropdown()', uib-dropdown='')
i.fa.fa-caret-down(uib-dropdown-toggle='')
ul.dropdown-menu-right(uib-dropdown-menu='', role='menu')
li(role='menuitem')
a(ng-click='exportData("csv")')
i.fa.fa-file-o
| Export data as CSV
li(role='menuitem')
a(ng-click='exportData("json")')
i.fa.fa-file-code-o
| Export data as JSON
li(role='menuitem')
a(ng-click='exportData("xlsx")')
i.fa.fa-file-excel-o
| Export data as Excel
i.widget-control.widget-fullscreen.fa.fa-expand(ng-if='widgetContext.allowFullscreen', title='Click to view fullscreen')

.dashboard-widget(class='{{ widgetClass }}', ng-include='widgetTemplateUrl')
3 changes: 2 additions & 1 deletion cyclotron-site/app/scripts/common/app.coffee
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
###
# Copyright (c) 2013-2015 the original author or authors.
# Copyright (c) 2013-2016 the original author or authors.
#
# Licensed under the MIT License (the "License");
# you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -48,6 +48,7 @@ cyclotronApp = angular.module 'cyclotronApp', [
'ui.select'
'ui.bootstrap'
'ui.ace'
'dndLists'
'drahak.hotkeys'
'googlechart'
'LocalForageModule'
Expand Down
10 changes: 4 additions & 6 deletions cyclotron-site/app/scripts/common/controller.login.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -17,22 +17,19 @@
#
# Login controller -- for login modal dialog
#
cyclotronApp.controller 'LoginController', ($scope, $uibModalInstance, $localForage, configService, userService) ->
cyclotronApp.controller 'LoginController', ($scope, $uibModalInstance, $localForage, configService, focusService, userService) ->

$scope.credentials = {}
$scope.loginError = false

$scope.focusUsername = false
$scope.focusPassword = false

$scope.loginMessage ?= configService.authentication.loginMessage

# Load cached username
if userService.cachedUsername?
$scope.credentials.username = userService.cachedUsername
$scope.focusPassword = true
focusService.focus 'focusPassword', $scope
else
$scope.focusUsername = true
focusService.focus 'focusUsername', $scope

$scope.canLogin = ->
return !_.isEmpty($scope.credentials.username) && !_.isEmpty($scope.credentials.password)
Expand All @@ -48,6 +45,7 @@ cyclotronApp.controller 'LoginController', ($scope, $uibModalInstance, $localFor
loginPromise.catch (error) ->
$scope.loginError = true
$scope.credentials.password = ''
focusService.focus 'focusPassword', $scope

$scope.cancel = ->
$uibModalInstance.dismiss('cancel')
Loading

0 comments on commit d9f6710

Please sign in to comment.