Skip to content

Commit d57e1ea

Browse files
committed
1.24.0 release
1 parent fafb2c2 commit d57e1ea

36 files changed

+916
-148
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,5 @@ node_modules
3333

3434
# Mac
3535
.DS_Store
36+
37+
*.diff

CHANGELOG.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,23 @@
1+
# 1.24.0 (02/04/2016)
2+
3+
## Features
4+
5+
- Scrolling Dashboards: Dashboards now automatically scroll if the Widgets on a page exceed the size of the browser. If the Widgets on a page fit without overflowing, the Dashboard will appear as before without any scrollbars. This replaces the previous behavior of fitting the page to the browser window, and hiding any overflowing content.
6+
7+
- Likes: Added the ability for logged-in users to like (and unlike) dashboards. Users can search for dashboards they liked, or sort search results by the number of likes
8+
9+
- Sortable Search Results: The Dashboard Search results can be sorted using various keys such as Name, Tags, Visits, Likes, etc.
10+
11+
- Advanced Search Filters: Dashboards can be searched using several new search filters: "is:deleted", "include:deleted", "likedby:<user>", "lastupdatedby:<user>".
12+
13+
## Bug Fixes
14+
15+
- Data Sources must be created with unique names
16+
17+
- Navigating through Cyclotron pages using browser back button does not work
18+
19+
- Annotation Chart: annotationsWidth property in AnnotationChart widget should be a numerical field instead of a string
20+
121
# 1.23.0 (01/21/2016)
222

323
## Features

cyclotron-site/app/partials/analytics.jade

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,23 @@
4040
dd
4141
ng-pluralize(count='statistics.revisions.avgRevisionCount', when='{"one": "Revision", "other": "Revisions"}')
4242
| per Dashboard
43+
44+
h2 Likes
45+
dl(title='Total number of Dashboard Likes')
46+
dt {{ statistics.likes.count | numeraljs:'0,0' }}
47+
dd total Likes
48+
dl(title='Total number of Dashboard Likes within the last day')
49+
dt {{ statistics.likes.occurredPastDayCount | numeraljs:'0,0' }}
50+
dd Likes in the last day
51+
dl(title='Total number of Dashboard Likes within the last week')
52+
dt {{ statistics.likes.occurredPastWeekCount | numeraljs:'0,0' }}
53+
dd Likes in the last week
54+
dl(title='Total number of Dashboard Likes within the last 6 months')
55+
dt {{ statistics.likes.occurredPastSixMonthsCount | numeraljs:'0,0' }}
56+
dd Likes in the last 6 months
57+
dl(title='Total number of Dashboard Unlikes')
58+
dt {{ statistics.unlikes.count | numeraljs:'0,0' }}
59+
dd total Unlikes
4360

4461
h2 Visits
4562
dl(title='Total number of times any Dashboard was visited')
Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11

22
//- Dashboards
3-
div.dashboard.fullscreen
3+
div.dashboard
44

55
.dashboard-controls
66
i.fa.fa-chevron-left(ng-click='moveBack()', ng-class='{ disabled: !canMoveBack() }', title='Go to the previous page')
77
i.fa.fa-pause(ng-click='pause()', ng-show='!paused', title='Pause Dashboard page rotation')
88
i.fa.fa-play(ng-click='play()', ng-show='paused', ng-class='{ disabled: !canMoveForward() }', title='Start Dashboard page rotation')
99
a.fa.fa-download(ng-href='{{ exportUrl }}', target='_blank', title='Export the Dashboard')
10+
i.fa.fa-thumbs-o-up(requires-login, ng-if='!isLiked', ng-click='toggleLike()', title='Like this Dashboard')
11+
i.fa.fa-thumbs-up(requires-login, ng-if='isLiked', ng-click='toggleLike()', title='Unlike this Dashboard')
1012
i.fa.fa-chevron-right(ng-click='moveForward()', ng-class='{ disabled: !canMoveForward() }', title='Go to the next page')
1113

12-
div(dashboard-page, dashboard='dashboard', page='page', page-number='{{ currentPageIndex }}', ng-repeat='page in currentPage')
14+
.dashboard-pages
15+
div(dashboard-page, dashboard='dashboard', page='page', page-number='{{ currentPageIndex }}',
16+
ng-repeat='page in currentPage')
1317

cyclotron-site/app/partials/editor/dataSource.jade

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212
select.form-control(ng-model='dataSource.type', title='{{ dashboardProperties.dataSources.properties.type.description }}')
1313
option(ng-repeat='(optionKey, optionValue) in dashboardProperties.dataSources.options') {{ optionValue.value }}
1414

15-
.bg-info(ng-show='dataSourceMessage()', ng-bind-html='dataSourceMessage()')
15+
.bg-info(ng-if='dataSourceMessage()', ng-bind-html='dataSourceMessage()')
16+
17+
.bg-danger(ng-if='isDuplicateDataSourceName(dataSource)')
18+
| The Data Source name must be unique to the Dashboard.
1619

1720
.editor-property-set(model='dataSource', definition='combinedDataSourceProperties(dataSource)', ng-if='dataSource.type')

cyclotron-site/app/partials/editor/guiEditor.jade

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,25 +27,36 @@
2727
title='{{ editor.dashboardWrapper.visits }} total visits, {{ editor.dashboardWrapper.pageViews }} total page views')
2828
i(class='fa {{ getVisitCategory().icon }}')
2929
span {{ getVisitCategory().text }}
30-
ng-pluralize(count='getVisitCategory().text', when='{"one": "visit","other": "visits"}')
30+
ng-pluralize(count='getVisitCategory().text', when='{"one": "visit", "other": "visits"}')
3131

32-
h4.small.text-muted(ng-show='editor.dashboard.description')
32+
h2.text-muted.likes-control(requires-auth,
33+
ng-hide='editor.isNew || !isLatestRevision() || !editor.likeCount',
34+
title='{{ editor.likeCount }} likes')
35+
i.fa.fa-thumbs-up
36+
span {{ editor.likeCount }}
37+
ng-pluralize(count='editor.likeCount', when='{1: "like", "other": "likes"}')
38+
39+
h4.small.text-muted(ng-if='editor.dashboard.description')
3340
i.fa.fa-quote-left
3441
| {{ editor.dashboard.description }}
3542
i.fa.fa-quote-right
3643

37-
h4.small.text-danger(ng-show='editor.dashboardWrapper.deleted')
44+
h4.small.text-danger(ng-if='editor.dashboardWrapper.deleted')
3845
i.fa.fa-exclamation-triangle
3946
| This Dashboard has been deleted. Saving a new revision will undelete it.
4047

41-
h4.small.text-warning(ng-show='!isLoggedIn()')
48+
h4.small.text-warning(ng-if='!isLoggedIn()')
4249
i.fa.fa-exclamation-triangle
4350
| Dashboards cannot be created or edited without being logged in.
4451

45-
h4.small.text-warning(ng-show='isLoggedIn() && !editor.hasEditPermission')
52+
h4.small.text-warning(ng-if='isLoggedIn() && !editor.hasEditPermission')
4653
i.fa.fa-exclamation-triangle
4754
| You don't have permission to edit this Dashboard.
4855

56+
h4.small.text-warning(ng-if='hasDuplicateDataSourceName()')
57+
i.fa.fa-exclamation-triangle
58+
| One or more Data Source names has been repeated. All Data Source names must be unique to the Dashboard.
59+
4960
.row
5061
.sidebar.col-sm-4
5162
ul.nav.nav-pills.nav-stacked
@@ -66,6 +77,7 @@
6677
a(ng-click='goToSubState("edit.dataSource", dataSource, $index)', id='editor-dataSource-{{ dataSource.name }}')
6778
i.fa.fa-angle-right
6879
| {{ getDataSourceName(dataSource) }}
80+
i.fa.fa-exclamation-triangle.right-hand-icon(ng-if='isDuplicateDataSourceName(dataSource)', title='This Data Source has a conflicting Name property.')
6981

7082
li(ng-class='{active: editor.currentEditor=="edit.pages"}')
7183
a#editor-pages(ng-click='goToSubState("edit.pages", editor.dashboard.pages)')

cyclotron-site/app/partials/editor/propertySet.jade

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@
4646
ng-required='{{ value.required }}', placeholder='{{ value.placeholder }}',
4747
type='number', ng-switch-when='integer')
4848

49+
input.form-control(ng-model='model[value.name]',
50+
ng-required='{{ value.required }}', placeholder='{{ value.placeholder }}',
51+
type='number', ng-switch-when='number')
52+
4953
input.form-control(ng-model='model[value.name]',
5054
ng-required='{{ value.required }}', placeholder='{{ value.placeholder }}',
5155
type='{{ value.inputType || "text" }}', ng-switch-default)

cyclotron-site/app/partials/help/layout.jade

Lines changed: 41 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,22 @@
11
h3 Layout
22

3-
p Dashboard pages are divided into rows and columns. Each Widget in the Dashboard has a height and a width, which correspond to
4-
| the number of rows and columns that the Widget spans. For example, a 2x2 Page can fit four 1x1 Widgets. But it could also
5-
| fit one 2x1 and two 1x1 Widgets. There are no limits on the number of rows and columns for a page, but lower values tend to
6-
| work better for all resolutions.
3+
h4 Grid Layout
4+
p.
5+
The primary layout scheme for Dashboards is a grid layout. This means that a Dashboard page is divided into a fixed
6+
number of rows and columns, which automatically scale up and down with the browser resolution. Widgets are given a
7+
corresponding number of rows and columns, and they are resized accordingly to match the grid. In general, this allows
8+
the Dashboard to be viewed at different browser resolutions and aspect ratios.
79

8-
p The Page itself scales up and down based on the browser size, and gracefully handles resize events. Each Widget will be resized
9-
| accordingly. In general, this allows Dashboards to be viewed at different browser resolutions and on mobile devices. For
10-
| example, the Chart Widget resizes the chart to fill the entire space available to that widget. The Table Widget, on the
11-
| other hand, will overflow the Widget if the content is larger than the widget dimensions, and will enable scrolling by default.
10+
h5 Widgets
11+
p Each Widget in the Dashboard can be assigned a
12+
em gridHeight
13+
| and
14+
em gridWidth
15+
| , which correspond to the number of rows and columns that the Widget spans.
16+
| For example, a 2x2 Page can fit four 1x1 Widgets. But it could also
17+
| fit one 2x1 and two 1x1 Widgets. It's possible to split rows and columns&mdash;e.g.
18+
em gridWidth
19+
| of 1.5 to span one and a half columns. Care must be taken to ensure the Widgets align as expected.
1220

1321
p Widgets are sized according to their
1422
em gridHeight
@@ -20,8 +28,23 @@ p Widgets are sized according to their
2028
| will not rearrange the Widgets to fit, but rather it only removes empty vertical space. The Widgets are placed in order from the top left,
2129
| wrapping as needed based on the number of columns.
2230

23-
p It's also possible to provide more Widgets than will fit on the Dashboard. Dashboards don't currently allow scrolling, since the original intention
24-
| is to provide a scaled single-page dashboard view.
31+
h5 Mobile Devices
32+
p.
33+
Special consideration is given to mobile devices in landscape or portrait mode. This overrides the normal grid settings
34+
with either a 2x1 or 1x2 layout. Widgets are also overridden to display in a 1x1 resolution.
35+
36+
h5 Scrolling Dashboards
37+
p It's possible to provide more Widgets than will fit on the screen at once. Dashboards can be scrolled to view additional
38+
|widgets. The Grid Layout can still be used if the Page is longer than the browser&mdash;the Grid Height remains fixed
39+
| to the browser height. However unless a Dashboard is designed for full-screen use, it may be desirable to specify fixed
40+
| heights for Widgets. See the section on
41+
strong Absolute Layout
42+
| below for more information.
43+
44+
p If needed, the ability to vertically scroll a Page can be forcibly disabled by setting the
45+
em scrolling
46+
| property to "false" in the Page's layout section. However this should not be needed if the Widgets on a Page do not
47+
| extend below the bottom of the browser.
2548

2649
p The default settings are for Pages to be 2x2 and Widgets to be 1x1.
2750

@@ -73,7 +96,12 @@ p It is also possible to define absolute sizes for all or some Widgets. The Wid
7396
| and
7497
em width
7598
| properties which take CSS-compatible dimensions, e.g. "20%", "200px", "5rem".
76-
| This is not recommended since it prevents the Dashboard from scaling correctly, but may be desirable
77-
| to specify dimensions in pixels for Dashboards intended for a display with a known size.
99+
| This may be useful for displaying fixed-height or non-scalable content, however this prevents
100+
| Widgets from automatically scaling with the Dashboard.
78101

79-
p There's not much benefit to using percentages, since the grid layout implemention is effectively the same.
102+
p Absolute sizing can be combined with the Grid Layout by defining only one property of each. For example,
103+
| setting the
104+
em height
105+
| property and the
106+
em gridWidth
107+
| property together will create a fixed-height but fluid-width Widget.

cyclotron-site/app/partials/home.jade

Lines changed: 39 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,13 @@
1111

1212
ui-select(ng-model='search.query', multiple='',
1313
tagging='', tagging-label='false', tagging-tokens='SPACE|ENTER')
14-
ui-select-match(placeholder='Search by Name or Tags...')
14+
ui-select-match(placeholder='Search by Name or Tags...')
1515
i.fa.fa-tag(ng-if='isTag($item)')
16+
i.fa.fa-filter(ng-if='isAdvanced($item)')
1617
span {{ $item }}
1718
ui-select-choices(repeat='hint in search.hints | filter:$select.search | limitTo:100')
1819
i.fa.fa-tag(ng-if='isTag(hint)')
20+
i.fa.fa-filter(ng-if='isAdvanced(hint)')
1921
span {{ hint }}
2022

2123
section.main-links(ng-show='showSplash')
@@ -31,10 +33,10 @@
3133
a.login(ui-sref='analytics', title='Analytics for Cyclotron')
3234
i.fa.fa-bar-chart
3335
span Analytics
34-
a.login(requires-auth, ng-click='login()', ng-if='!isLoggedIn()', title='Login')
36+
a.login(requires-auth, ng-if='!isLoggedIn()', ng-click='login()',title='Login')
3537
i.fa.fa-unlock
3638
span Login
37-
a.logout(requires-auth, ng-click='logout()', ng-if='isLoggedIn()', title='Logout')
39+
a.logout(requires-login, ng-click='logout()', title='Logout')
3840
i.fa.fa-lock
3941
span Logout
4042

@@ -46,15 +48,38 @@
4648
.no-results.well.well-sm(ng-show='dashboards.length == 0')
4749
span No matching Dashboards were found
4850

49-
table.table
50-
tr.dashboard-item(ng-repeat='dashboard in dashboards | orderBy:"name"', ng-class='{"dashboard-item-unviewable": !dashboard._canView}')
51-
51+
table.table(ng-show='dashboards.length > 0')
52+
thead
53+
tr
54+
th(requires-login)
55+
a(ng-click='sortBy("_liked", true)')
56+
i.fa.fa-thumbs-up
57+
th
58+
a(ng-click='sortBy("name", false)', ng-class='{ selected: sortByField == "name" }') Name
59+
span /
60+
a(ng-click='sortBy(tagSorter, false)', ng-class='{ selected: sortByField == tagSorter }') Tags
61+
span /
62+
a(ng-click='sortBy("date", true)', ng-class='{ selected: sortByField == "date" }') Last Modified
63+
th.dashboard-analytics
64+
a(ng-click='sortBy("visits", true)', ng-class='{ selected: sortByField == "visits" }') Visits
65+
span(requires-auth) /
66+
a(requires-auth, ng-click='sortBy("likeCount", true)', ng-class='{ selected: sortByField == "likeCount" }') Likes
67+
th
68+
tr.dashboard-item(ng-repeat='dashboard in dashboards | orderBy:sortByField:sortByReverse',
69+
ng-class='{"dashboard-item-unviewable": !dashboard._canView, "dashboard-item-deleted": dashboard.deleted }')
70+
td.like(requires-login)
71+
a(ng-click='toggleLike(dashboard)')
72+
i.fa.fa-thumbs-up(ng-if='dashboard._liked', title='Unlike this Dashboard')
73+
i.fa.fa-thumbs-o-up(ng-if='!dashboard._liked', title='Like this Dashboard')
5274
td
75+
span.name(ng-if='dashboard.deleted') {{ dashboard.name }}
76+
i.fa.fa-trash-o(title="This Dashboard has been deleted.")
77+
5378
span.name(ng-if='!dashboard._canView') {{ dashboard.name }}
5479
i.fa.fa-lock(title="You don't have permission to edit this Dashboard.")
5580
i.fa.fa-eye-slash(title="You don't have permission to view this Dashboard.")
5681

57-
a.name(ng-if='dashboard._canView', ng-href='/{{ dashboard.name }}', target='_blank', title='Open the Dashboard') {{ dashboard.name }}
82+
a.name(ng-if='dashboard._canView && !dashboard.deleted', ng-href='/{{ dashboard.name }}', target='_blank', title='Open the Dashboard') {{ dashboard.name }}
5883
i.fa.fa-lock(ng-if='isLoggedIn() && !dashboard._canEdit', title="You don't have permission to edit this Dashboard.")
5984
i.fa.fa-external-link
6085

@@ -74,12 +99,16 @@
7499
ng-click='selectTag(tag)', title='Add to search') {{ tag }}
75100

76101
td.dashboard-analytics
77-
.info
78-
a.text-muted(ng-if='dashboard.visits > 0',
79-
ui-sref='dashboardAnalytics({ dashboardName: dashboard.name })', title='View Analytics for this Dashboard')
102+
.info(ng-if='dashboard.visits > 0')
103+
a(ui-sref='dashboardAnalytics({ dashboardName: dashboard.name })',
104+
title='View Analytics for this Dashboard')
80105
i(class='fa {{ dashboard.visitCategory.icon }}')
81106
span {{ dashboard.visitCategory.text }}
82107
ng-pluralize(count='dashboard.visits', when='{"one": "visit","other": "visits"}')
108+
.info(requires-auth, ng-if='dashboard.likeCount > 0')
109+
i.fa.fa-thumbs-up
110+
span {{ dashboard.likeCount }}
111+
ng-pluralize(count='dashboard.likeCount', when='{"one": "like","other": "likes"}')
83112

84113
td.dashboard-links
85114
div

cyclotron-site/app/scripts/common/app.coffee

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -341,8 +341,7 @@ cyclotronApp.run ($rootScope, $urlRouter, $location, $state, $stateParams, $moda
341341
# Prevent $urlRouter's default handler from firing
342342
event.preventDefault()
343343

344-
currentName = $state.current.name
345-
if currentName != 'dashboard' and currentName.substring(0,5) != 'edit.'
344+
if $state.current.name != 'dashboard'
346345
$urlRouter.sync()
347346

348347
$rootScope.$on '$stateChangeError', (event, toState, toParams, fromState, fromParams, error) ->

0 commit comments

Comments
 (0)