Skip to content

Commit ab19699

Browse files
committed
Merge pull request #263 from Turbo87/chart-component
Ember: Extract download graph component
2 parents 8b24730 + 316b022 commit ab19699

File tree

7 files changed

+112
-101
lines changed

7 files changed

+112
-101
lines changed

app/components/download-graph.js

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import Ember from 'ember';
2+
3+
export default Ember.Component.extend({
4+
classNames: 'graph-data',
5+
6+
didInsertElement() {
7+
this._super(...arguments);
8+
9+
Ember.$(window).on('resize.chart', () => this.rerender());
10+
Ember.$(document).on('googleChartsLoaded', () => this.rerender());
11+
},
12+
13+
willDestroyElement() {
14+
Ember.$(window).off('resize.chart');
15+
Ember.$(document).off('googleChartsLoaded');
16+
},
17+
18+
didRender() {
19+
this._super(...arguments);
20+
21+
let data = this.get('data');
22+
23+
if (!data || !window.google || !window.googleChartsLoaded) {
24+
this.$().hide();
25+
return;
26+
} else {
27+
this.$().show();
28+
}
29+
30+
var myData = window.google.visualization.arrayToDataTable(data);
31+
32+
var fmt = new window.google.visualization.DateFormat({
33+
pattern: 'LLL d, yyyy',
34+
});
35+
fmt.format(myData, 0);
36+
37+
var chart = new window.google.visualization.AreaChart(this.get('element'));
38+
chart.draw(myData, {
39+
chartArea: { 'left': 85, 'width': '77%', 'height': '80%' },
40+
hAxis: {
41+
minorGridlines: { count: 8 },
42+
},
43+
vAxis: {
44+
minorGridlines: { count: 5 },
45+
viewWindow: { min: 0, },
46+
},
47+
isStacked: true,
48+
focusTarget: 'category',
49+
});
50+
},
51+
});

app/controllers/crate/version.js

Lines changed: 56 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ const { computed } = Ember;
99
export default Ember.Controller.extend({
1010
isDownloading: false,
1111

12-
fetchingDownloads: true,
12+
extraDownloads: Ember.computed('downloads.meta.extra_downloads', function() {
13+
return this.get('downloads.meta.extra_downloads') || [];
14+
}),
15+
1316
fetchingFollowing: true,
1417
following: false,
1518
currentVersion: computed.alias('model'),
@@ -112,104 +115,65 @@ export default Ember.Controller.extend({
112115
url
113116
}).finally(() => this.set('fetchingFollowing', false));
114117
},
118+
},
115119

116-
renderChart(model, downloads, extra) {
117-
var dates = {};
118-
var versions = [];
119-
for (var i = 0; i < 90; i++) {
120-
var now = moment().subtract(i, 'days');
121-
dates[now.format('MMM D')] = { date: now, cnt: {} };
122-
}
120+
downloadData: Ember.computed('downloads', 'extraDownloads', function() {
121+
let { downloads, extraDownloads: extra } = this.getProperties('downloads', 'extraDownloads');
122+
if (!downloads || !extra) {
123+
return;
124+
}
123125

124-
downloads.forEach((d) => {
125-
var version_id = d.get('version.id');
126-
var key = moment(d.get('date')).utc().format('MMM D');
127-
if (dates[key]) {
128-
var prev = dates[key].cnt[version_id] || 0;
129-
dates[key].cnt[version_id] = prev + d.get('downloads');
130-
}
131-
});
126+
var dates = {};
127+
var versions = [];
128+
for (var i = 0; i < 90; i++) {
129+
var now = moment().subtract(i, 'days');
130+
dates[now.format('MMM D')] = { date: now, cnt: {} };
131+
}
132132

133-
extra.forEach((d) => {
134-
var key = moment(d.date).utc().format('MMM D');
135-
if (dates[key]) {
136-
var prev = dates[key].cnt[null] || 0;
137-
dates[key].cnt[null] = prev + d.downloads;
138-
}
139-
});
140-
if (this.get('requestedVersion')) {
141-
versions.push({
142-
id: model.get('id'),
143-
num: model.get('num'),
144-
});
145-
} else {
146-
var tmp = this.get('smallSortedVersions');
147-
for (i = 0; i < tmp.length; i++) {
148-
versions.push({
149-
id: tmp[i].get('id'),
150-
num: tmp[i].get('num')
151-
});
152-
}
153-
}
154-
if (extra.length > 0) {
155-
versions.push({
156-
id: null,
157-
num: 'Other'
158-
});
133+
downloads.forEach((d) => {
134+
var version_id = d.get('version.id');
135+
var key = moment(d.get('date')).utc().format('MMM D');
136+
if (dates[key]) {
137+
var prev = dates[key].cnt[version_id] || 0;
138+
dates[key].cnt[version_id] = prev + d.get('downloads');
159139
}
140+
});
160141

161-
var headers = ['Date'];
162-
versions.sort((b) => b.num).reverse();
163-
for (i = 0; i < versions.length; i++) {
164-
headers.push(versions[i].num);
142+
extra.forEach((d) => {
143+
var key = moment(d.date).utc().format('MMM D');
144+
if (dates[key]) {
145+
var prev = dates[key].cnt[null] || 0;
146+
dates[key].cnt[null] = prev + d.downloads;
165147
}
166-
var data = [headers];
167-
for (var date in dates) {
168-
var row = [dates[date].date.toDate()];
169-
for (i = 0; i < versions.length; i++) {
170-
row.push(dates[date].cnt[versions[i].id] || 0);
171-
}
172-
data.push(row);
173-
}
174-
175-
// TODO: move this to a component
176-
function drawChart() {
177-
if (!window.google || !window.googleChartsLoaded) {
178-
Ember.$('.graph').hide();
179-
return;
180-
} else {
181-
Ember.$('.graph').show();
182-
}
183-
var myData = window.google.visualization.arrayToDataTable(data);
148+
});
149+
if (this.get('requestedVersion')) {
150+
versions.push(this.get('model').getProperties('id', 'num'));
151+
} else {
152+
this.get('smallSortedVersions').forEach(version => {
153+
versions.push(version.getProperties('id', 'num'));
154+
});
155+
}
156+
if (extra.length > 0) {
157+
versions.push({
158+
id: null,
159+
num: 'Other'
160+
});
161+
}
184162

185-
var fmt = new window.google.visualization.DateFormat({
186-
pattern: 'LLL d, yyyy',
187-
});
188-
fmt.format(myData, 0);
189-
var el = document.getElementById('graph-data');
190-
if (!el) {
191-
return;
192-
}
193-
var chart = new window.google.visualization.AreaChart(el);
194-
chart.draw(myData, {
195-
chartArea: { 'left': 85, 'width': '77%', 'height': '80%' },
196-
hAxis: {
197-
minorGridlines: { count: 8 },
198-
},
199-
vAxis: {
200-
minorGridlines: { count: 5 },
201-
viewWindow: { min: 0, },
202-
},
203-
isStacked: true,
204-
focusTarget: 'category',
205-
});
163+
var headers = ['Date'];
164+
versions.sort((b) => b.num).reverse();
165+
for (i = 0; i < versions.length; i++) {
166+
headers.push(versions[i].num);
167+
}
168+
var data = [headers];
169+
for (var date in dates) {
170+
var row = [dates[date].date.toDate()];
171+
for (i = 0; i < versions.length; i++) {
172+
row.push(dates[date].cnt[versions[i].id] || 0);
206173
}
174+
data.push(row);
175+
}
207176

208-
Ember.run.scheduleOnce('afterRender', this, drawChart);
209-
Ember.$(window).off('resize.chart');
210-
Ember.$(window).on('resize.chart', drawChart);
211-
Ember.$(document).off('googleChartsLoaded');
212-
Ember.$(document).on('googleChartsLoaded', drawChart);
213-
},
214-
},
177+
return data;
178+
}),
215179
});

app/routes/crate/version.js

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ export default Ember.Route.extend({
1717

1818
controller.set('crate', crate);
1919
controller.set('requestedVersion', requestedVersion);
20-
controller.set('fetchingDownloads', true);
2120
controller.set('fetchingFollowing', true);
2221

2322
crate.get('keywords')
@@ -53,10 +52,7 @@ export default Ember.Route.extend({
5352
const context = controller.get('requestedVersion') ? model : this.modelFor('crate');
5453

5554
context.get('version_downloads').then(downloads => {
56-
controller.set('fetchingDownloads', false);
57-
58-
// make sure to pass the new `model` here because the controller's model won't have been updated yet
59-
controller.send('renderChart', model, downloads, downloads.get('meta.extra_downloads') || []);
55+
controller.set('downloads', downloads);
6056
});
6157
},
6258

app/styles/crate.scss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@
269269

270270
h4 { color: $main-color-light; }
271271
}
272-
#graph-data {
272+
.graph-data {
273273
width: 100%;
274274
height: 500px;
275275
}

app/templates/components/download-graph.hbs

Whitespace-only changes.

app/templates/crate/version.hbs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@
231231
</div>
232232
<div class='graph'>
233233
<h4>Downloads over the last 90 days</h4>
234-
<div id='graph-data'></div>
234+
{{download-graph data=downloadData}}
235235
</div>
236236
</div>
237237
{{/if}}

config/environment.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ module.exports = function(environment) {
2121

2222
if (environment === 'development') {
2323
// ENV.APP.LOG_RESOLVER = true;
24-
ENV.APP.LOG_ACTIVE_GENERATION = true;
24+
//ENV.APP.LOG_ACTIVE_GENERATION = true;
2525
// ENV.APP.LOG_TRANSITIONS = true;
2626
// ENV.APP.LOG_TRANSITIONS_INTERNAL = true;
27-
ENV.APP.LOG_VIEW_LOOKUPS = true;
27+
//ENV.APP.LOG_VIEW_LOOKUPS = true;
2828
}
2929

3030
if (environment === 'test') {

0 commit comments

Comments
 (0)