-
Notifications
You must be signed in to change notification settings - Fork 29
/
render-chart.js
52 lines (36 loc) · 1.56 KB
/
render-chart.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import RSVP from 'rsvp';
import { capitalize } from '@ember/string';
import getVisualizationName from 'ember-google-charts/utils/get-visualization-name';
import formatData from 'ember-google-charts/utils/format-data';
export default function renderChart(element, { data, type, design = 'classic', options = {} }) {
return new RSVP.Promise((resolve, reject) => {
const { google: { charts, visualization } } = window;
const capitalizedType = capitalize(type);
const isAsyncChart = type === 'geo';
const isMaterialChart = design === 'material';
const constructorName = isMaterialChart ? capitalizedType : getVisualizationName(type);
const googlePackage = isMaterialChart ? charts : visualization;
const chartConstructor = googlePackage[constructorName];
function formatOptions(options) {
return isMaterialChart ? charts[capitalizedType].convertOptions(options) : options;
}
/* Create the chart */
const chart = new chartConstructor(element);
/* For charts that are are created asyncronously, listen for the
ready event */
if (isAsyncChart) {
visualization.events.addListener(chart, 'ready', function() {
resolve(chart);
});
}
/* Make sure errors in render are caught */
visualization.events.addListener(chart, 'error', reject);
/* Make the Google Chart object publically available (e.g. for use in tests) */
element.chart = chart;
/* Render the chart */
chart.draw(formatData(data), formatOptions(options));
if (!isAsyncChart) {
resolve(chart);
}
});
}