datavis-glide 4.0.0-PRE.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +45 -0
- package/README.md +129 -0
- package/datavis.js +101 -0
- package/dist/wcdatavis.css +1957 -0
- package/dist/wcdatavis.min.js +1 -0
- package/global-jquery.js +4 -0
- package/ie-fixes.js +13 -0
- package/index.js +70 -0
- package/meteor.js +1 -0
- package/package.json +102 -0
- package/src/flags.js +6 -0
- package/src/graph.js +1079 -0
- package/src/graph_renderer.js +85 -0
- package/src/grid.js +2777 -0
- package/src/grid_control.js +1957 -0
- package/src/grid_filter.js +1073 -0
- package/src/grid_renderer.js +276 -0
- package/src/group_fun_win.js +121 -0
- package/src/lang/en-US.js +188 -0
- package/src/lang/es-MX.js +188 -0
- package/src/lang/fr-FR.js +188 -0
- package/src/lang/id-ID.js +188 -0
- package/src/lang/nl-NL.js +188 -0
- package/src/lang/pt-BR.js +188 -0
- package/src/lang/ru-RU.js +188 -0
- package/src/lang/th-TH.js +188 -0
- package/src/lang/vi-VN.js +188 -0
- package/src/lang/zh-Hans-CN.js +188 -0
- package/src/operations_palette.js +176 -0
- package/src/prefs_modules.js +132 -0
- package/src/reg/graph_renderer.js +17 -0
- package/src/renderers/graph/chartjs.js +457 -0
- package/src/renderers/graph/google.js +584 -0
- package/src/renderers/graph/jit.js +61 -0
- package/src/renderers/graph/svelte-gantt.js +168 -0
- package/src/renderers/grid/dummy.js +79 -0
- package/src/renderers/grid/handlebars.js +217 -0
- package/src/renderers/grid/squirrelly.js +215 -0
- package/src/renderers/grid/table/group_detail.js +1404 -0
- package/src/renderers/grid/table/group_summary.js +380 -0
- package/src/renderers/grid/table/pivot.js +915 -0
- package/src/renderers/grid/table/plain.js +1592 -0
- package/src/renderers/grid/table.js +2510 -0
- package/src/trans.js +101 -0
- package/src/ui/collapsible.js +234 -0
- package/src/ui/filters/date.js +283 -0
- package/src/ui/grid_filter.js +398 -0
- package/src/ui/popup_menu.js +224 -0
- package/src/ui/popup_window.js +572 -0
- package/src/ui/slider.js +156 -0
- package/src/ui/tabs.js +202 -0
- package/src/ui/templates.js +131 -0
- package/src/ui/toolbar.js +63 -0
- package/src/ui/toolbars/grid.js +873 -0
- package/src/ui/windows/col_config.js +341 -0
- package/src/ui/windows/debug.js +164 -0
- package/src/ui/windows/grid_table_opts.js +139 -0
- package/src/util/handlebars.js +158 -0
- package/src/util/jquery.js +630 -0
- package/src/util/misc.js +1058 -0
- package/src/util/squirrelly.js +155 -0
- package/wcdatavis.css +1601 -0
|
@@ -0,0 +1,457 @@
|
|
|
1
|
+
import _ from 'underscore';
|
|
2
|
+
import moment from 'moment';
|
|
3
|
+
import numeral from 'numeral';
|
|
4
|
+
import jQuery from 'jquery';
|
|
5
|
+
import Chart from 'chart.js/auto'; // FIXME: This imports everything.
|
|
6
|
+
|
|
7
|
+
import {
|
|
8
|
+
deepDefaults,
|
|
9
|
+
gensym,
|
|
10
|
+
getProp,
|
|
11
|
+
makeSubclass,
|
|
12
|
+
mixinLogging,
|
|
13
|
+
setProp,
|
|
14
|
+
} from '../../util/misc.js';
|
|
15
|
+
import {AggregateInfo, OrdMap} from 'datavis-ace';
|
|
16
|
+
import { GraphRenderer } from '../../graph_renderer.js';
|
|
17
|
+
import { trans } from '../../trans.js';
|
|
18
|
+
|
|
19
|
+
// GraphRendererChartJs {{{1
|
|
20
|
+
|
|
21
|
+
var GraphRendererChartJs = makeSubclass('GraphRendererChartJs', GraphRenderer, null, {
|
|
22
|
+
graphTypes: OrdMap.fromArray([{
|
|
23
|
+
value: 'bar',
|
|
24
|
+
name: 'Bar Chart',
|
|
25
|
+
modes: ['plain', 'group', 'pivot'],
|
|
26
|
+
}, {
|
|
27
|
+
value: 'column',
|
|
28
|
+
name: 'Column Chart',
|
|
29
|
+
modes: ['plain', 'group', 'pivot'],
|
|
30
|
+
}], 'value')
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
mixinLogging(GraphRendererChartJs);
|
|
34
|
+
|
|
35
|
+
// #draw_plain {{{2
|
|
36
|
+
|
|
37
|
+
GraphRendererChartJs.prototype.draw_plain = function (data, typeInfo, dt, config) {
|
|
38
|
+
var self = this;
|
|
39
|
+
|
|
40
|
+
if (config == null) {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
var convertType = function (t) {
|
|
45
|
+
switch (t) {
|
|
46
|
+
case 'currency':
|
|
47
|
+
return 'number';
|
|
48
|
+
default:
|
|
49
|
+
return t;
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
var getRealValue = function (f, x) {
|
|
54
|
+
if (typeInfo.get(f).type === 'date' && moment.isMoment(x.value)) {
|
|
55
|
+
return {v: x.value.toDate(), f: x.orig};
|
|
56
|
+
}
|
|
57
|
+
else if (['number', 'currency'].indexOf(typeInfo.get(f).type) >= 0 && numeral.isNumeral(x.value)) {
|
|
58
|
+
return {v: x.value._value, f: x.orig};
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
return x.value;
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
switch (config.graphType) {
|
|
66
|
+
case 'gantt':
|
|
67
|
+
if (config.nameField == null) {
|
|
68
|
+
throw new Error('Configuration option `nameField` must exist');
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
var timeConfigStr = '' + (+config.startField) + (+config.endField) + (+config.durationField);
|
|
72
|
+
if (timeConfigStr === '100' || timeConfigStr === '010' || timeConfigStr === '000') {
|
|
73
|
+
throw new Error('Time configuration is insufficient to determine offsets');
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
dt.addColumn('string', 'ID');
|
|
77
|
+
dt.addColumn('string', 'Name');
|
|
78
|
+
dt.addColumn('string', 'Resource');
|
|
79
|
+
dt.addColumn('date', 'Start');
|
|
80
|
+
dt.addColumn('date', 'End');
|
|
81
|
+
dt.addColumn('number', 'Duration');
|
|
82
|
+
dt.addColumn('number', 'Completion');
|
|
83
|
+
dt.addColumn('string', 'Dependencies');
|
|
84
|
+
|
|
85
|
+
var configOpts = [
|
|
86
|
+
{ name: 'id', default: (function () { var x = 0; return function () { return x++; }; }) },
|
|
87
|
+
{ name: 'name' },
|
|
88
|
+
{ name: 'resource', default: null },
|
|
89
|
+
{ name: 'start', default: null },
|
|
90
|
+
{ name: 'end', default: null },
|
|
91
|
+
{ name: 'duration', default: null },
|
|
92
|
+
{ name: 'completion', default: 0 },
|
|
93
|
+
{ name: 'dependencies', default: null }
|
|
94
|
+
];
|
|
95
|
+
|
|
96
|
+
_.each(configOpts, function (opt) {
|
|
97
|
+
if (config[opt.name + 'Field'] != null) {
|
|
98
|
+
Source.decodeAll(data.dataByRowId, config[opt.name + 'Field']);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
_.each(data.data, function (row) {
|
|
103
|
+
var newRow = [];
|
|
104
|
+
_.each(configOpts, function (opt) {
|
|
105
|
+
if (config[opt.name + 'Field'] != null) {
|
|
106
|
+
newRow.push(getRealValue(config[opt.name + 'Field'], row.rowData[config[opt.name + 'Field']]));
|
|
107
|
+
}
|
|
108
|
+
else if (opt.default === undefined) {
|
|
109
|
+
throw new Error();
|
|
110
|
+
}
|
|
111
|
+
else if (typeof opt.default === 'function') {
|
|
112
|
+
newRow.push(opt.default());
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
newRow.push(opt.default);
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
dt.addRow(newRow);
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
break;
|
|
122
|
+
default:
|
|
123
|
+
dt.addColumn(convertType(typeInfo.get(config.categoryField).type), config.categoryField);
|
|
124
|
+
|
|
125
|
+
_.each(config.valueFields, function (field) {
|
|
126
|
+
dt.addColumn(convertType(typeInfo.get(field).type), field);
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
_.each(config.valueFields, function (field) {
|
|
130
|
+
Source.decodeAll(data.dataByRowId, field);
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
_.each(data.data, function (row) {
|
|
134
|
+
var newRow;
|
|
135
|
+
|
|
136
|
+
newRow = _.map([config.categoryField].concat(config.valueFields), function (f) {
|
|
137
|
+
return getRealValue(f, row.rowData[f]);
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
dt.addRow(newRow);
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
return config;
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
// #draw_group {{{2
|
|
148
|
+
|
|
149
|
+
GraphRendererChartJs.prototype.draw_group = function (data, typeInfo, obj, config) {
|
|
150
|
+
var self = this;
|
|
151
|
+
var obj = {
|
|
152
|
+
data: {
|
|
153
|
+
datasets: [],
|
|
154
|
+
labels: []
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
|
|
158
|
+
if (typeof config === 'function') {
|
|
159
|
+
config = config(data.groupFields);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
config = deepDefaults(config, {
|
|
163
|
+
graphType: 'bar',
|
|
164
|
+
categoryField: data.groupFields[0],
|
|
165
|
+
valueFields: [{
|
|
166
|
+
name: 'Count',
|
|
167
|
+
fun: 'count'
|
|
168
|
+
}]
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
if (config.aggType != null && config.aggNum != null) {
|
|
172
|
+
// We only have a single aggregate that's been specified in the configuration. This is what is
|
|
173
|
+
// *supposed* to happen when the user clicks the "graph" button in the aggregate control of the
|
|
174
|
+
// grid that's attached to this graph.
|
|
175
|
+
|
|
176
|
+
obj.data.datasets[0] = {};
|
|
177
|
+
obj.data.datasets[0].label = config.categoryField;
|
|
178
|
+
|
|
179
|
+
var aggInfo = getProp(data, 'agg', 'info', config.aggType, config.aggNum);
|
|
180
|
+
if (aggInfo == null) {
|
|
181
|
+
self.logError(self.makeLogTag() + ' The specified aggregate does not exist: ' + config.aggType + '[' + config.aggNum + ']');
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
184
|
+
if (data.agg.results[config.aggType][config.aggNum] == null) {
|
|
185
|
+
self.logError(self.makeLogTag() + ' No results exist for the specified aggregate: ' + config.aggType + '[' + config.aggNum + ']');
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
var name = aggInfo.name || aggInfo.instance.getFullName();
|
|
189
|
+
var aggResultType = aggInfo.instance.getType();
|
|
190
|
+
|
|
191
|
+
if (aggResultType === 'currency') {
|
|
192
|
+
aggResultType = 'number';
|
|
193
|
+
setProp('currency', config, 'options', valueAxis, 'format');
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
obj.data.datasets[0].data = [];
|
|
197
|
+
|
|
198
|
+
_.each(data.rowVals, function (rowVal, rowValIdx) {
|
|
199
|
+
obj.data.labels.push(rowVal.join(', '));
|
|
200
|
+
var aggResult = data.agg.results[config.aggType][config.aggNum][rowValIdx];
|
|
201
|
+
if (aggResultType === 'number') {
|
|
202
|
+
aggResult = +aggResult;
|
|
203
|
+
}
|
|
204
|
+
obj.data.datasets[0].data.push(aggResult);
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
var ai = [];
|
|
209
|
+
|
|
210
|
+
// For each value field, create the AggregateInfo instance that will manage it. Also create a
|
|
211
|
+
// column for the result in the data table.
|
|
212
|
+
|
|
213
|
+
_.each(config.valueFields, function (v) {
|
|
214
|
+
var aggInfo = new AggregateInfo('group', v, 0, null /* colConfig */, self.typeInfo, null /* convert */);
|
|
215
|
+
ai.push(aggInfo);
|
|
216
|
+
obj.data.datasets.push({
|
|
217
|
+
label: (aggInfo.instance.getType(), v.name || aggInfo.instance.getFullName()),
|
|
218
|
+
data: []
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
// Go through each rowval and create a row for it in the data table. Every value field gets its
|
|
223
|
+
// own column, which is the result of the corresponding aggregate function specified above.
|
|
224
|
+
|
|
225
|
+
_.each(data.rowVals, function (rowVal, rowValIdx) {
|
|
226
|
+
obj.data.labels.push(rowVal.join(', '));
|
|
227
|
+
|
|
228
|
+
_.each(ai, function (aggInfo, i) {
|
|
229
|
+
var aggResult = aggInfo.instance.calculate(_.flatten(data.data[rowValIdx]));
|
|
230
|
+
obj.data.datasets[i].data.push(aggResult);
|
|
231
|
+
if (aggInfo.debug) {
|
|
232
|
+
self.logDebug(self.makeLogTag() + ' Group aggregate (%s) : Group [%s] = %s',
|
|
233
|
+
aggInfo.instance.name + (aggInfo.name ? ' -> ' + aggInfo.name : ''),
|
|
234
|
+
rowVal.join(', '),
|
|
235
|
+
JSON.stringify(aggResult));
|
|
236
|
+
}
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
return obj;
|
|
242
|
+
};
|
|
243
|
+
|
|
244
|
+
// #draw_pivot {{{2
|
|
245
|
+
|
|
246
|
+
GraphRendererChartJs.prototype.draw_pivot = function (data, typeInfo, dt, config) {
|
|
247
|
+
var self = this;
|
|
248
|
+
|
|
249
|
+
if (typeof config === 'function') {
|
|
250
|
+
config = config(data.groupFields, data.pivotFields);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
config = deepDefaults(config, {
|
|
254
|
+
graphType: 'column',
|
|
255
|
+
categoryField: data.groupFields[0],
|
|
256
|
+
valueFields: [{
|
|
257
|
+
fun: 'count'
|
|
258
|
+
}],
|
|
259
|
+
options: {
|
|
260
|
+
isStacked: true
|
|
261
|
+
}
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
var valueAxis = config.graphType === 'bar' ? 'hAxis' : 'vAxis';
|
|
265
|
+
|
|
266
|
+
dt.addColumn('string', config.categoryField);
|
|
267
|
+
|
|
268
|
+
if (config.aggType != null && config.aggNum != null) {
|
|
269
|
+
var aggInfo = getProp(data, 'agg', 'info', config.aggType, config.aggNum);
|
|
270
|
+
if (aggInfo == null) {
|
|
271
|
+
self.logError(self.makeLogTag() + ' The specified aggregate does not exist: ' + config.aggType + '[' + config.aggNum + ']');
|
|
272
|
+
return null;
|
|
273
|
+
}
|
|
274
|
+
if (data.agg.results[config.aggType][config.aggNum] == null) {
|
|
275
|
+
self.logError(self.makeLogTag() + ' No results exist for the specified aggregate: ' + config.aggType + '[' + config.aggNum + ']');
|
|
276
|
+
return null;
|
|
277
|
+
}
|
|
278
|
+
var name = aggInfo.name || aggInfo.instance.getFullName();
|
|
279
|
+
var aggResultType = aggInfo.instance.getType();
|
|
280
|
+
|
|
281
|
+
if (aggResultType === 'currency') {
|
|
282
|
+
aggResultType = 'number';
|
|
283
|
+
setProp('currency', config, 'options', valueAxis, 'format');
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
switch (config.aggType) {
|
|
287
|
+
case 'cell':
|
|
288
|
+
_.each(data.colVals, function (colVal) {
|
|
289
|
+
dt.addColumn(aggResultType, colVal.join(', '));
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
setProp(name, config, 'options', valueAxis, 'title');
|
|
293
|
+
|
|
294
|
+
_.each(data.rowVals, function (rowVal, rowValIdx) {
|
|
295
|
+
var newRow = [rowVal.join(', ')];
|
|
296
|
+
|
|
297
|
+
_.each(data.colVals, function (colVal, colValIdx) {
|
|
298
|
+
var aggResult = data.agg.results[config.aggType][config.aggNum][rowValIdx][colValIdx];
|
|
299
|
+
if (aggResultType === 'number') {
|
|
300
|
+
aggResult = +aggResult;
|
|
301
|
+
}
|
|
302
|
+
newRow.push(aggResult);
|
|
303
|
+
});
|
|
304
|
+
|
|
305
|
+
dt.addRow(newRow);
|
|
306
|
+
});
|
|
307
|
+
break;
|
|
308
|
+
case 'group':
|
|
309
|
+
dt.addColumn(aggResultType, name);
|
|
310
|
+
setProp(name, config, 'options', valueAxis, 'title');
|
|
311
|
+
|
|
312
|
+
_.each(data.rowVals, function (rowVal, rowValIdx) {
|
|
313
|
+
var newRow = [rowVal.join(', ')];
|
|
314
|
+
|
|
315
|
+
var aggResult = data.agg.results[config.aggType][config.aggNum][rowValIdx];
|
|
316
|
+
if (aggResultType === 'number') {
|
|
317
|
+
aggResult = +aggResult;
|
|
318
|
+
}
|
|
319
|
+
newRow.push(aggResult);
|
|
320
|
+
dt.addRow(newRow);
|
|
321
|
+
});
|
|
322
|
+
break;
|
|
323
|
+
case 'pivot':
|
|
324
|
+
dt.addColumn(aggResultType, name);
|
|
325
|
+
setProp(name, config, 'options', valueAxis, 'title');
|
|
326
|
+
|
|
327
|
+
_.each(data.colVals, function (colVal, colValIdx) {
|
|
328
|
+
var newRow = [colVal.join(', ')];
|
|
329
|
+
|
|
330
|
+
var aggResult = data.agg.results[config.aggType][config.aggNum][colValIdx];
|
|
331
|
+
if (aggResultType === 'number') {
|
|
332
|
+
aggResult = +aggResult;
|
|
333
|
+
}
|
|
334
|
+
newRow.push(aggResult);
|
|
335
|
+
dt.addRow(newRow);
|
|
336
|
+
});
|
|
337
|
+
break;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
else {
|
|
341
|
+
var ai = [];
|
|
342
|
+
|
|
343
|
+
// For each value field, create the AggregateInfo instance that will manage it. Also create
|
|
344
|
+
// columns for the results (one for each colval) in the data table.
|
|
345
|
+
|
|
346
|
+
_.each(config.valueFields, function (v) {
|
|
347
|
+
var aggInfo = new AggregateInfo('cell', v, 0, null /* colConfig */, self.typeInfo, null /* convert */);
|
|
348
|
+
|
|
349
|
+
_.each(data.colVals, function (colVal) {
|
|
350
|
+
dt.addColumn(aggInfo.instance.getType(), colVal.join(', '));
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
ai.push(aggInfo);
|
|
354
|
+
});
|
|
355
|
+
|
|
356
|
+
_.each(data.rowVals, function (rowVal, rowValIndex) {
|
|
357
|
+
var newRow = [rowVal.join(', ')];
|
|
358
|
+
|
|
359
|
+
_.each(data.colVals, function (colVal, colValIndex) {
|
|
360
|
+
_.each(ai, function (aggInfo) {
|
|
361
|
+
var aggResult = aggInfo.instance.calculate(data.data[rowValIndex][colValIndex]);
|
|
362
|
+
newRow.push(aggResult);
|
|
363
|
+
if (aggInfo.debug) {
|
|
364
|
+
self.logDebug(self.makeLogTag() + ' Group aggregate (%s) : RowVal [%s] x ColVal [%s] = %s',
|
|
365
|
+
aggInfo.instance.name + (aggInfo.name ? ' -> ' + aggInfo.name : ''),
|
|
366
|
+
rowVal.join(', '),
|
|
367
|
+
colVal.join(', '),
|
|
368
|
+
JSON.stringify(aggResult));
|
|
369
|
+
}
|
|
370
|
+
});
|
|
371
|
+
});
|
|
372
|
+
|
|
373
|
+
dt.addRow(newRow);
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
return config;
|
|
378
|
+
};
|
|
379
|
+
|
|
380
|
+
// #draw {{{2
|
|
381
|
+
|
|
382
|
+
GraphRendererChartJs.prototype.draw = function (devConfig, userConfig) {
|
|
383
|
+
var self = this;
|
|
384
|
+
|
|
385
|
+
if (!self.hasRun) {
|
|
386
|
+
self.super['GraphRenderer'].addRedrawHandlers();
|
|
387
|
+
}
|
|
388
|
+
self.hasRun = true;
|
|
389
|
+
|
|
390
|
+
devConfig = devConfig || {};
|
|
391
|
+
userConfig = userConfig || {};
|
|
392
|
+
|
|
393
|
+
self.view.getData(function (ok, data) {
|
|
394
|
+
self.view.getTypeInfo(function (ok, typeInfo) {
|
|
395
|
+
self.elt.children().remove();
|
|
396
|
+
var id = gensym();
|
|
397
|
+
self.elt.append(jQuery('<canvas>', { id: id }));
|
|
398
|
+
|
|
399
|
+
var makeMessage = function (msg) {
|
|
400
|
+
jQuery('<div>')
|
|
401
|
+
.addClass('wcdv_graph_message_container')
|
|
402
|
+
.css({ 'height': self.opts.height + 'px' })
|
|
403
|
+
.append(
|
|
404
|
+
jQuery('<div>')
|
|
405
|
+
.addClass('wcdv_graph_message')
|
|
406
|
+
.text(msg)
|
|
407
|
+
)
|
|
408
|
+
.appendTo(self.elt);
|
|
409
|
+
};
|
|
410
|
+
|
|
411
|
+
if (data.data.length === 0) {
|
|
412
|
+
makeMessage(trans('DATA.NO_DATA'));
|
|
413
|
+
return;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
var config = null;
|
|
417
|
+
|
|
418
|
+
if (data.isPlain) {
|
|
419
|
+
config = self.draw_plain(data, typeInfo, getProp(userConfig, 'plain', 'graphs', getProp(userConfig, 'plain', 'current')) || devConfig.whenPlain);
|
|
420
|
+
}
|
|
421
|
+
else if (data.isGroup) {
|
|
422
|
+
config = self.draw_group(data, typeInfo, getProp(userConfig, 'group', 'graphs', getProp(userConfig, 'group', 'current')) || devConfig.whenGroup);
|
|
423
|
+
}
|
|
424
|
+
else if (data.isPivot) {
|
|
425
|
+
config = self.draw_pivot(data, typeInfo, getProp(userConfig, 'pivot', 'graphs', getProp(userConfig, 'pivot', 'current')) || devConfig.whenPivot);
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
if (config == null) {
|
|
429
|
+
makeMessage(trans('DATA.NOTHING_TO_GRAPH'));
|
|
430
|
+
return;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
var graphTypeMap = {
|
|
434
|
+
bar: {
|
|
435
|
+
type: 'bar',
|
|
436
|
+
options: {
|
|
437
|
+
indexAxis: 'y'
|
|
438
|
+
}
|
|
439
|
+
},
|
|
440
|
+
column: {
|
|
441
|
+
type: 'bar'
|
|
442
|
+
}
|
|
443
|
+
};
|
|
444
|
+
|
|
445
|
+
var obj = deepDefaults({}, graphTypeMap.bar, config);
|
|
446
|
+
|
|
447
|
+
self.logDebug(self.makeLogTag() + ' Starting draw: [%O]', obj);
|
|
448
|
+
|
|
449
|
+
var chart = new Chart(document.getElementById(id), obj);
|
|
450
|
+
self.fire('draw', null, config);
|
|
451
|
+
});
|
|
452
|
+
}, 'Drawing Chart.js graph');
|
|
453
|
+
};
|
|
454
|
+
|
|
455
|
+
// Exports {{{1
|
|
456
|
+
|
|
457
|
+
export default GraphRendererChartJs;
|