chartkick 4.2.1 → 5.0.1
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +12 -0
- data/LICENSE.txt +1 -1
- data/README.md +19 -28
- data/lib/chartkick/core_ext.rb +26 -0
- data/lib/chartkick/helper.rb +3 -27
- data/lib/chartkick/utils.rb +24 -0
- data/lib/chartkick/version.rb +1 -1
- data/lib/chartkick.rb +10 -5
- data/licenses/LICENSE-kurkle-color.txt +9 -0
- data/vendor/assets/javascripts/Chart.bundle.js +9831 -9289
- data/vendor/assets/javascripts/chartkick.js +673 -621
- metadata +7 -5
- data/lib/chartkick/enumerable.rb +0 -25
@@ -1,8 +1,7 @@
|
|
1
1
|
/*!
|
2
|
-
* Chartkick.js
|
2
|
+
* Chartkick.js v5.0.1
|
3
3
|
* Create beautiful charts with one line of JavaScript
|
4
4
|
* https://github.com/ankane/chartkick.js
|
5
|
-
* v4.2.0
|
6
5
|
* MIT License
|
7
6
|
*/
|
8
7
|
|
@@ -27,8 +26,7 @@
|
|
27
26
|
|
28
27
|
// https://github.com/madrobby/zepto/blob/master/src/zepto.js
|
29
28
|
function extend(target, source) {
|
30
|
-
var key
|
31
|
-
for (key in source) {
|
29
|
+
for (var key in source) {
|
32
30
|
// protect against prototype pollution, defense 1
|
33
31
|
if (key === "__proto__") { continue; }
|
34
32
|
|
@@ -53,13 +51,12 @@
|
|
53
51
|
return target;
|
54
52
|
}
|
55
53
|
|
56
|
-
var DATE_PATTERN = /^(\d\d\d\d)(
|
54
|
+
var DATE_PATTERN = /^(\d\d\d\d)(?:-)?(\d\d)(?:-)?(\d\d)$/i;
|
57
55
|
|
58
56
|
function negativeValues(series) {
|
59
|
-
var i
|
60
|
-
|
61
|
-
|
62
|
-
for (j = 0; j < data.length; j++) {
|
57
|
+
for (var i = 0; i < series.length; i++) {
|
58
|
+
var data = series[i].data;
|
59
|
+
for (var j = 0; j < data.length; j++) {
|
63
60
|
if (data[j][1] < 0) {
|
64
61
|
return true;
|
65
62
|
}
|
@@ -68,49 +65,49 @@
|
|
68
65
|
return false;
|
69
66
|
}
|
70
67
|
|
71
|
-
function toStr(
|
72
|
-
return "" +
|
68
|
+
function toStr(obj) {
|
69
|
+
return "" + obj;
|
73
70
|
}
|
74
71
|
|
75
|
-
function toFloat(
|
76
|
-
return parseFloat(
|
72
|
+
function toFloat(obj) {
|
73
|
+
return parseFloat(obj);
|
77
74
|
}
|
78
75
|
|
79
|
-
function toDate(
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
76
|
+
function toDate(obj) {
|
77
|
+
if (obj instanceof Date) {
|
78
|
+
return obj;
|
79
|
+
} else if (typeof obj === "number") {
|
80
|
+
return new Date(obj * 1000); // ms
|
81
|
+
} else {
|
82
|
+
var s = toStr(obj);
|
83
|
+
var matches = s.match(DATE_PATTERN);
|
84
|
+
if (matches) {
|
85
|
+
var year = parseInt(matches[1], 10);
|
86
|
+
var month = parseInt(matches[2], 10) - 1;
|
87
|
+
var day = parseInt(matches[3], 10);
|
88
|
+
return new Date(year, month, day);
|
84
89
|
} else {
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
return new Date(year, month, day);
|
91
|
-
} else {
|
92
|
-
// try our best to get the str into iso8601
|
93
|
-
// TODO be smarter about this
|
94
|
-
var str = n.replace(/ /, "T").replace(" ", "").replace("UTC", "Z");
|
95
|
-
// Date.parse returns milliseconds if valid and NaN if invalid
|
96
|
-
n = new Date(Date.parse(str) || n);
|
97
|
-
}
|
90
|
+
// try our best to get the str into iso8601
|
91
|
+
// TODO be smarter about this
|
92
|
+
var str = s.replace(/ /, "T").replace(" ", "").replace("UTC", "Z");
|
93
|
+
// Date.parse returns milliseconds if valid and NaN if invalid
|
94
|
+
return new Date(Date.parse(str) || s);
|
98
95
|
}
|
99
96
|
}
|
100
|
-
return n;
|
101
97
|
}
|
102
98
|
|
103
|
-
function toArr(
|
104
|
-
if (
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
99
|
+
function toArr(obj) {
|
100
|
+
if (isArray(obj)) {
|
101
|
+
return obj;
|
102
|
+
} else {
|
103
|
+
var arr = [];
|
104
|
+
for (var i in obj) {
|
105
|
+
if (Object.prototype.hasOwnProperty.call(obj, i)) {
|
106
|
+
arr.push([i, obj[i]]);
|
109
107
|
}
|
110
108
|
}
|
111
|
-
|
109
|
+
return arr;
|
112
110
|
}
|
113
|
-
return n;
|
114
111
|
}
|
115
112
|
|
116
113
|
function jsOptionsFunc(defaultOptions, hideLegend, setTitle, setMin, setMax, setStacked, setXtitle, setYtitle) {
|
@@ -170,32 +167,63 @@
|
|
170
167
|
return a[0] - b[0];
|
171
168
|
}
|
172
169
|
|
170
|
+
// needed since sort() without arguments does string comparison
|
173
171
|
function sortByNumber(a, b) {
|
174
172
|
return a - b;
|
175
173
|
}
|
176
174
|
|
177
|
-
function
|
178
|
-
|
175
|
+
function every(values, fn) {
|
176
|
+
for (var i = 0; i < values.length; i++) {
|
177
|
+
if (!fn(values[i])) {
|
178
|
+
return false;
|
179
|
+
}
|
180
|
+
}
|
181
|
+
return true;
|
179
182
|
}
|
180
183
|
|
181
|
-
function
|
182
|
-
return
|
184
|
+
function isDay(timeUnit) {
|
185
|
+
return timeUnit === "day" || timeUnit === "week" || timeUnit === "month" || timeUnit === "year";
|
183
186
|
}
|
184
187
|
|
185
|
-
function
|
186
|
-
|
187
|
-
}
|
188
|
+
function calculateTimeUnit(values, maxDay) {
|
189
|
+
if ( maxDay === void 0 ) maxDay = false;
|
188
190
|
|
189
|
-
|
190
|
-
|
191
|
-
|
191
|
+
if (values.length === 0) {
|
192
|
+
return null;
|
193
|
+
}
|
192
194
|
|
193
|
-
|
194
|
-
|
195
|
-
|
195
|
+
var minute = every(values, function (d) { return d.getMilliseconds() === 0 && d.getSeconds() === 0; });
|
196
|
+
if (!minute) {
|
197
|
+
return null;
|
198
|
+
}
|
196
199
|
|
197
|
-
|
198
|
-
|
200
|
+
var hour = every(values, function (d) { return d.getMinutes() === 0; });
|
201
|
+
if (!hour) {
|
202
|
+
return "minute";
|
203
|
+
}
|
204
|
+
|
205
|
+
var day = every(values, function (d) { return d.getHours() === 0; });
|
206
|
+
if (!day) {
|
207
|
+
return "hour";
|
208
|
+
}
|
209
|
+
|
210
|
+
if (maxDay) {
|
211
|
+
return "day";
|
212
|
+
}
|
213
|
+
|
214
|
+
var month = every(values, function (d) { return d.getDate() === 1; });
|
215
|
+
if (!month) {
|
216
|
+
var dayOfWeek = values[0].getDay();
|
217
|
+
var week = every(values, function (d) { return d.getDay() === dayOfWeek; });
|
218
|
+
return (week ? "week" : "day");
|
219
|
+
}
|
220
|
+
|
221
|
+
var year = every(values, function (d) { return d.getMonth() === 0; });
|
222
|
+
if (!year) {
|
223
|
+
return "month";
|
224
|
+
}
|
225
|
+
|
226
|
+
return "year";
|
199
227
|
}
|
200
228
|
|
201
229
|
function isDate(obj) {
|
@@ -223,9 +251,14 @@
|
|
223
251
|
var round = options.round;
|
224
252
|
|
225
253
|
if (options.byteScale) {
|
226
|
-
var
|
254
|
+
var positive = value >= 0;
|
255
|
+
if (!positive) {
|
256
|
+
value *= -1;
|
257
|
+
}
|
258
|
+
|
227
259
|
var baseValue = axis ? options.byteScale : value;
|
228
260
|
|
261
|
+
var suffixIdx;
|
229
262
|
if (baseValue >= 1152921504606846976) {
|
230
263
|
value /= 1152921504606846976;
|
231
264
|
suffixIdx = 6;
|
@@ -259,6 +292,11 @@
|
|
259
292
|
precision = value >= 1000 ? 4 : 3;
|
260
293
|
}
|
261
294
|
suffix = " " + byteSuffixes[suffixIdx];
|
295
|
+
|
296
|
+
// flip value back
|
297
|
+
if (!positive) {
|
298
|
+
value *= -1;
|
299
|
+
}
|
262
300
|
}
|
263
301
|
|
264
302
|
if (precision !== undefined && round !== undefined) {
|
@@ -310,19 +348,6 @@
|
|
310
348
|
return null;
|
311
349
|
}
|
312
350
|
|
313
|
-
function allZeros(data) {
|
314
|
-
var i, j, d;
|
315
|
-
for (i = 0; i < data.length; i++) {
|
316
|
-
d = data[i].data;
|
317
|
-
for (j = 0; j < d.length; j++) {
|
318
|
-
if (d[j][1] != 0) {
|
319
|
-
return false;
|
320
|
-
}
|
321
|
-
}
|
322
|
-
}
|
323
|
-
return true;
|
324
|
-
}
|
325
|
-
|
326
351
|
var baseOptions = {
|
327
352
|
maintainAspectRatio: false,
|
328
353
|
animation: false,
|
@@ -379,7 +404,7 @@
|
|
379
404
|
"#6633CC", "#E67300", "#8B0707", "#329262", "#5574A6", "#651067"
|
380
405
|
];
|
381
406
|
|
382
|
-
|
407
|
+
function hideLegend$2(options, legend, hideLegend) {
|
383
408
|
if (legend !== undefined) {
|
384
409
|
options.plugins.legend.display = !!legend;
|
385
410
|
if (legend && legend !== true) {
|
@@ -388,61 +413,59 @@
|
|
388
413
|
} else if (hideLegend) {
|
389
414
|
options.plugins.legend.display = false;
|
390
415
|
}
|
391
|
-
}
|
416
|
+
}
|
392
417
|
|
393
|
-
|
418
|
+
function setTitle$2(options, title) {
|
394
419
|
options.plugins.title.display = true;
|
395
420
|
options.plugins.title.text = title;
|
396
|
-
}
|
421
|
+
}
|
397
422
|
|
398
|
-
|
423
|
+
function setMin$2(options, min) {
|
399
424
|
if (min !== null) {
|
400
425
|
options.scales.y.min = toFloat(min);
|
401
426
|
}
|
402
|
-
}
|
427
|
+
}
|
403
428
|
|
404
|
-
|
429
|
+
function setMax$2(options, max) {
|
405
430
|
options.scales.y.max = toFloat(max);
|
406
|
-
}
|
431
|
+
}
|
407
432
|
|
408
|
-
|
433
|
+
function setBarMin$1(options, min) {
|
409
434
|
if (min !== null) {
|
410
435
|
options.scales.x.min = toFloat(min);
|
411
436
|
}
|
412
|
-
}
|
437
|
+
}
|
413
438
|
|
414
|
-
|
439
|
+
function setBarMax$1(options, max) {
|
415
440
|
options.scales.x.max = toFloat(max);
|
416
|
-
}
|
441
|
+
}
|
417
442
|
|
418
|
-
|
443
|
+
function setStacked$2(options, stacked) {
|
419
444
|
options.scales.x.stacked = !!stacked;
|
420
445
|
options.scales.y.stacked = !!stacked;
|
421
|
-
}
|
446
|
+
}
|
422
447
|
|
423
|
-
|
448
|
+
function setXtitle$2(options, title) {
|
424
449
|
options.scales.x.title.display = true;
|
425
450
|
options.scales.x.title.text = title;
|
426
|
-
}
|
451
|
+
}
|
427
452
|
|
428
|
-
|
453
|
+
function setYtitle$2(options, title) {
|
429
454
|
options.scales.y.title.display = true;
|
430
455
|
options.scales.y.title.text = title;
|
431
|
-
}
|
456
|
+
}
|
432
457
|
|
433
458
|
// https://stackoverflow.com/questions/5623838/rgb-to-hex-and-hex-to-rgb
|
434
|
-
|
459
|
+
function addOpacity(hex, opacity) {
|
435
460
|
var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
|
436
461
|
return result ? "rgba(" + parseInt(result[1], 16) + ", " + parseInt(result[2], 16) + ", " + parseInt(result[3], 16) + ", " + opacity + ")" : hex;
|
437
|
-
}
|
462
|
+
}
|
438
463
|
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
return x != null;
|
443
|
-
};
|
464
|
+
function notnull(x) {
|
465
|
+
return x !== null && x !== undefined;
|
466
|
+
}
|
444
467
|
|
445
|
-
|
468
|
+
function setLabelSize(chart, data, options) {
|
446
469
|
var maxLabelSize = Math.ceil(chart.element.offsetWidth / 4.0 / data.labels.length);
|
447
470
|
if (maxLabelSize > 25) {
|
448
471
|
maxLabelSize = 25;
|
@@ -459,18 +482,33 @@
|
|
459
482
|
}
|
460
483
|
};
|
461
484
|
}
|
462
|
-
}
|
485
|
+
}
|
463
486
|
|
464
|
-
|
465
|
-
var
|
487
|
+
function calculateScale(series) {
|
488
|
+
var scale = 1;
|
489
|
+
var max = maxAbsY(series);
|
490
|
+
while (max >= 1024) {
|
491
|
+
scale *= 1024;
|
492
|
+
max /= 1024;
|
493
|
+
}
|
494
|
+
return scale;
|
495
|
+
}
|
496
|
+
|
497
|
+
function setFormatOptions$1(chart, options, chartType) {
|
498
|
+
// options to apply to x and r values for scatter and bubble
|
499
|
+
var numericOptions = {
|
500
|
+
thousands: chart.options.thousands,
|
501
|
+
decimal: chart.options.decimal
|
502
|
+
};
|
503
|
+
|
504
|
+
// options to apply to y value
|
505
|
+
var formatOptions = merge({
|
466
506
|
prefix: chart.options.prefix,
|
467
507
|
suffix: chart.options.suffix,
|
468
|
-
thousands: chart.options.thousands,
|
469
|
-
decimal: chart.options.decimal,
|
470
508
|
precision: chart.options.precision,
|
471
509
|
round: chart.options.round,
|
472
510
|
zeros: chart.options.zeros
|
473
|
-
};
|
511
|
+
}, numericOptions);
|
474
512
|
|
475
513
|
if (chart.options.bytes) {
|
476
514
|
var series = chart.data;
|
@@ -478,26 +516,8 @@
|
|
478
516
|
series = [{data: series}];
|
479
517
|
}
|
480
518
|
|
481
|
-
// calculate max
|
482
|
-
var max = 0;
|
483
|
-
for (var i = 0; i < series.length; i++) {
|
484
|
-
var s = series[i];
|
485
|
-
for (var j = 0; j < s.data.length; j++) {
|
486
|
-
if (s.data[j][1] > max) {
|
487
|
-
max = s.data[j][1];
|
488
|
-
}
|
489
|
-
}
|
490
|
-
}
|
491
|
-
|
492
|
-
// calculate scale
|
493
|
-
var scale = 1;
|
494
|
-
while (max >= 1024) {
|
495
|
-
scale *= 1024;
|
496
|
-
max /= 1024;
|
497
|
-
}
|
498
|
-
|
499
519
|
// set step size
|
500
|
-
formatOptions.byteScale =
|
520
|
+
formatOptions.byteScale = calculateScale(series);
|
501
521
|
}
|
502
522
|
|
503
523
|
if (chartType !== "pie") {
|
@@ -520,6 +540,12 @@
|
|
520
540
|
return formatValue("", value, formatOptions, true);
|
521
541
|
};
|
522
542
|
}
|
543
|
+
|
544
|
+
if ((chartType === "scatter" || chartType === "bubble") && !options.scales.x.ticks.callback) {
|
545
|
+
options.scales.x.ticks.callback = function (value) {
|
546
|
+
return formatValue("", value, numericOptions, true);
|
547
|
+
};
|
548
|
+
}
|
523
549
|
}
|
524
550
|
|
525
551
|
if (!options.plugins.tooltip.callbacks.label) {
|
@@ -529,7 +555,9 @@
|
|
529
555
|
if (label) {
|
530
556
|
label += ': ';
|
531
557
|
}
|
532
|
-
|
558
|
+
|
559
|
+
var dataPoint = context.parsed;
|
560
|
+
return label + '(' + formatValue('', dataPoint.x, numericOptions) + ', ' + formatValue('', dataPoint.y, formatOptions) + ')';
|
533
561
|
};
|
534
562
|
} else if (chartType === "bubble") {
|
535
563
|
options.plugins.tooltip.callbacks.label = function (context) {
|
@@ -538,24 +566,12 @@
|
|
538
566
|
label += ': ';
|
539
567
|
}
|
540
568
|
var dataPoint = context.raw;
|
541
|
-
return label + '(' + dataPoint.x + ', ' + dataPoint.y + ', ' + dataPoint.v + ')';
|
569
|
+
return label + '(' + formatValue('', dataPoint.x, numericOptions) + ', ' + formatValue('', dataPoint.y, formatOptions) + ', ' + formatValue('', dataPoint.v, numericOptions) + ')';
|
542
570
|
};
|
543
571
|
} else if (chartType === "pie") {
|
544
572
|
// need to use separate label for pie charts
|
545
573
|
options.plugins.tooltip.callbacks.label = function (context) {
|
546
|
-
|
547
|
-
var value = ': ';
|
548
|
-
|
549
|
-
if (isArray(dataLabel)) {
|
550
|
-
// show value on first line of multiline label
|
551
|
-
// need to clone because we are changing the value
|
552
|
-
dataLabel = dataLabel.slice();
|
553
|
-
dataLabel[0] += value;
|
554
|
-
} else {
|
555
|
-
dataLabel += value;
|
556
|
-
}
|
557
|
-
|
558
|
-
return formatValue(dataLabel, context.parsed, formatOptions);
|
574
|
+
return formatValue('', context.parsed, formatOptions);
|
559
575
|
};
|
560
576
|
} else {
|
561
577
|
var valueLabel = chartType === "bar" ? "x" : "y";
|
@@ -573,124 +589,187 @@
|
|
573
589
|
};
|
574
590
|
}
|
575
591
|
}
|
576
|
-
};
|
577
592
|
|
578
|
-
|
579
|
-
|
580
|
-
|
581
|
-
|
582
|
-
|
583
|
-
|
584
|
-
|
593
|
+
// avoid formatting x-axis labels
|
594
|
+
// by default, Chart.js applies locale
|
595
|
+
if ((chartType === "line" || chartType === "area") && chart.xtype === "number") {
|
596
|
+
if (!options.scales.x.ticks.callback) {
|
597
|
+
options.scales.x.ticks.callback = function (value) {
|
598
|
+
return toStr(value);
|
599
|
+
};
|
600
|
+
}
|
585
601
|
|
586
|
-
|
587
|
-
|
588
|
-
|
589
|
-
|
590
|
-
|
591
|
-
|
592
|
-
|
602
|
+
if (!options.plugins.tooltip.callbacks.title) {
|
603
|
+
options.plugins.tooltip.callbacks.title = function (context) {
|
604
|
+
return toStr(context[0].parsed.x);
|
605
|
+
};
|
606
|
+
}
|
607
|
+
}
|
608
|
+
}
|
593
609
|
|
594
|
-
|
610
|
+
function maxAbsY(series) {
|
611
|
+
var max = 0;
|
612
|
+
for (var i = 0; i < series.length; i++) {
|
613
|
+
var data = series[i].data;
|
614
|
+
for (var j = 0; j < data.length; j++) {
|
615
|
+
var v = Math.abs(data[j][1]);
|
616
|
+
if (v > max) {
|
617
|
+
max = v;
|
618
|
+
}
|
619
|
+
}
|
620
|
+
}
|
621
|
+
return max;
|
622
|
+
}
|
595
623
|
|
624
|
+
function maxR(series) {
|
625
|
+
// start at zero since radius must be positive
|
596
626
|
var max = 0;
|
597
|
-
|
598
|
-
|
599
|
-
|
600
|
-
|
601
|
-
|
602
|
-
|
603
|
-
}
|
627
|
+
for (var i = 0; i < series.length; i++) {
|
628
|
+
var data = series[i].data;
|
629
|
+
for (var j = 0; j < data.length; j++) {
|
630
|
+
var v = data[j][2];
|
631
|
+
if (v > max) {
|
632
|
+
max = v;
|
604
633
|
}
|
605
634
|
}
|
606
635
|
}
|
636
|
+
return max;
|
637
|
+
}
|
607
638
|
|
608
|
-
|
639
|
+
var jsOptions$2 = jsOptionsFunc(merge(baseOptions, defaultOptions$2), hideLegend$2, setTitle$2, setMin$2, setMax$2, setStacked$2, setXtitle$2, setYtitle$2);
|
609
640
|
|
610
|
-
|
611
|
-
|
641
|
+
function prepareDefaultData(chart) {
|
642
|
+
var series = chart.data;
|
643
|
+
var rows = {};
|
644
|
+
var keys = [];
|
645
|
+
var labels = [];
|
646
|
+
var values = [];
|
612
647
|
|
613
|
-
|
614
|
-
|
648
|
+
for (var i = 0; i < series.length; i++) {
|
649
|
+
var data = series[i].data;
|
615
650
|
|
616
|
-
|
617
|
-
|
618
|
-
|
619
|
-
|
620
|
-
|
621
|
-
|
622
|
-
rows[key][i] = toFloat(d[1]);
|
623
|
-
if (sortedLabels.indexOf(key) === -1) {
|
624
|
-
sortedLabels.push(key);
|
625
|
-
}
|
651
|
+
for (var j = 0; j < data.length; j++) {
|
652
|
+
var d = data[j];
|
653
|
+
var key = chart.xtype === "datetime" ? d[0].getTime() : d[0];
|
654
|
+
if (!rows[key]) {
|
655
|
+
rows[key] = new Array(series.length);
|
656
|
+
keys.push(key);
|
626
657
|
}
|
658
|
+
rows[key][i] = d[1];
|
627
659
|
}
|
660
|
+
}
|
661
|
+
|
662
|
+
if (chart.xtype === "datetime" || chart.xtype === "number") {
|
663
|
+
keys.sort(sortByNumber);
|
664
|
+
}
|
665
|
+
|
666
|
+
for (var i$1 = 0; i$1 < series.length; i$1++) {
|
667
|
+
values.push([]);
|
668
|
+
}
|
669
|
+
|
670
|
+
for (var i$2 = 0; i$2 < keys.length; i$2++) {
|
671
|
+
var key$1 = keys[i$2];
|
628
672
|
|
629
|
-
|
630
|
-
|
673
|
+
var label = chart.xtype === "datetime" ? new Date(key$1) : key$1;
|
674
|
+
labels.push(label);
|
675
|
+
|
676
|
+
var row = rows[key$1];
|
677
|
+
for (var j$1 = 0; j$1 < series.length; j$1++) {
|
678
|
+
var v = row[j$1];
|
679
|
+
// Chart.js doesn't like undefined
|
680
|
+
values[j$1].push(v === undefined ? null : v);
|
631
681
|
}
|
682
|
+
}
|
632
683
|
|
633
|
-
|
634
|
-
|
684
|
+
return {
|
685
|
+
labels: labels,
|
686
|
+
values: values
|
687
|
+
};
|
688
|
+
}
|
689
|
+
|
690
|
+
function prepareBubbleData(chart) {
|
691
|
+
var series = chart.data;
|
692
|
+
var values = [];
|
693
|
+
var max = maxR(series);
|
694
|
+
|
695
|
+
for (var i = 0; i < series.length; i++) {
|
696
|
+
var data = series[i].data;
|
697
|
+
var points = [];
|
698
|
+
for (var j = 0; j < data.length; j++) {
|
699
|
+
var v = data[j];
|
700
|
+
points.push({
|
701
|
+
x: v[0],
|
702
|
+
y: v[1],
|
703
|
+
r: v[2] * 20 / max,
|
704
|
+
// custom attribute, for tooltip
|
705
|
+
v: v[2]
|
706
|
+
});
|
635
707
|
}
|
708
|
+
values.push(points);
|
709
|
+
}
|
636
710
|
|
637
|
-
|
638
|
-
|
639
|
-
|
640
|
-
|
641
|
-
|
642
|
-
|
643
|
-
|
644
|
-
|
645
|
-
|
646
|
-
|
647
|
-
|
648
|
-
|
649
|
-
|
650
|
-
|
651
|
-
|
652
|
-
|
653
|
-
|
654
|
-
|
655
|
-
|
656
|
-
|
657
|
-
|
658
|
-
|
659
|
-
|
660
|
-
}
|
711
|
+
return {
|
712
|
+
labels: [],
|
713
|
+
values: values
|
714
|
+
};
|
715
|
+
}
|
716
|
+
|
717
|
+
// scatter or numeric line/area
|
718
|
+
function prepareNumberData(chart) {
|
719
|
+
var series = chart.data;
|
720
|
+
var values = [];
|
721
|
+
|
722
|
+
for (var i = 0; i < series.length; i++) {
|
723
|
+
var data = series[i].data;
|
724
|
+
|
725
|
+
data.sort(sortByNumberSeries);
|
726
|
+
|
727
|
+
var points = [];
|
728
|
+
for (var j = 0; j < data.length; j++) {
|
729
|
+
var v = data[j];
|
730
|
+
points.push({
|
731
|
+
x: v[0],
|
732
|
+
y: v[1]
|
733
|
+
});
|
661
734
|
}
|
735
|
+
values.push(points);
|
736
|
+
}
|
737
|
+
|
738
|
+
return {
|
739
|
+
labels: [],
|
740
|
+
values: values
|
741
|
+
};
|
742
|
+
}
|
743
|
+
|
744
|
+
function prepareData(chart, chartType) {
|
745
|
+
if (chartType === "bubble") {
|
746
|
+
return prepareBubbleData(chart);
|
747
|
+
} else if (chart.xtype === "number" && chartType !== "bar" && chartType !== "column") {
|
748
|
+
return prepareNumberData(chart);
|
662
749
|
} else {
|
663
|
-
|
664
|
-
var s$2 = series[i$2];
|
665
|
-
var d$1 = [];
|
666
|
-
for (var j$2 = 0; j$2 < s$2.data.length; j$2++) {
|
667
|
-
var point = {
|
668
|
-
x: toFloat(s$2.data[j$2][0]),
|
669
|
-
y: toFloat(s$2.data[j$2][1])
|
670
|
-
};
|
671
|
-
if (chartType === "bubble") {
|
672
|
-
point.r = toFloat(s$2.data[j$2][2]) * 20 / max;
|
673
|
-
// custom attribute, for tooltip
|
674
|
-
point.v = s$2.data[j$2][2];
|
675
|
-
}
|
676
|
-
d$1.push(point);
|
677
|
-
}
|
678
|
-
rows2.push(d$1);
|
679
|
-
}
|
750
|
+
return prepareDefaultData(chart);
|
680
751
|
}
|
752
|
+
}
|
681
753
|
|
682
|
-
|
683
|
-
var
|
754
|
+
function createDataTable(chart, options, chartType) {
|
755
|
+
var ref = prepareData(chart, chartType);
|
756
|
+
var labels = ref.labels;
|
757
|
+
var values = ref.values;
|
684
758
|
|
685
|
-
|
686
|
-
|
759
|
+
var series = chart.data;
|
760
|
+
var datasets = [];
|
761
|
+
var colors = chart.options.colors || defaultColors;
|
762
|
+
for (var i = 0; i < series.length; i++) {
|
763
|
+
var s = series[i];
|
687
764
|
|
688
765
|
// use colors for each bar for single series format
|
766
|
+
var color = (void 0);
|
767
|
+
var backgroundColor = (void 0);
|
689
768
|
if (chart.options.colors && chart.singleSeriesFormat && (chartType === "bar" || chartType === "column") && !s.color && isArray(chart.options.colors) && !isArray(chart.options.colors[0])) {
|
690
769
|
color = colors;
|
691
770
|
backgroundColor = [];
|
692
|
-
for (var j
|
693
|
-
backgroundColor[j
|
771
|
+
for (var j = 0; j < colors.length; j++) {
|
772
|
+
backgroundColor[j] = addOpacity(color[j], 0.5);
|
694
773
|
}
|
695
774
|
} else {
|
696
775
|
color = s.color || colors[i];
|
@@ -699,7 +778,7 @@
|
|
699
778
|
|
700
779
|
var dataset = {
|
701
780
|
label: s.name || "",
|
702
|
-
data:
|
781
|
+
data: values[i],
|
703
782
|
fill: chartType === "area",
|
704
783
|
borderColor: color,
|
705
784
|
backgroundColor: backgroundColor,
|
@@ -762,90 +841,90 @@
|
|
762
841
|
}
|
763
842
|
}
|
764
843
|
|
765
|
-
|
766
|
-
|
767
|
-
if (notnull(xmin)) {
|
768
|
-
labels.push(toDate(xmin));
|
769
|
-
}
|
770
|
-
if (notnull(xmax)) {
|
771
|
-
labels.push(toDate(xmax));
|
772
|
-
}
|
773
|
-
day = false;
|
774
|
-
week = false;
|
775
|
-
month = false;
|
776
|
-
year = false;
|
777
|
-
hour = false;
|
778
|
-
minute = false;
|
779
|
-
}
|
780
|
-
|
781
|
-
if (chart.xtype === "datetime" && labels.length > 0) {
|
782
|
-
var minTime = (notnull(xmin) ? toDate(xmin) : labels[0]).getTime();
|
783
|
-
var maxTime = (notnull(xmax) ? toDate(xmax) : labels[0]).getTime();
|
844
|
+
if (chart.xtype === "datetime") {
|
845
|
+
var timeUnit = calculateTimeUnit(labels);
|
784
846
|
|
785
|
-
for
|
786
|
-
|
787
|
-
if (
|
788
|
-
|
847
|
+
// for empty datetime chart
|
848
|
+
if (labels.length === 0) {
|
849
|
+
if (notnull(xmin)) {
|
850
|
+
labels.push(toDate(xmin));
|
789
851
|
}
|
790
|
-
if (
|
791
|
-
|
852
|
+
if (notnull(xmax)) {
|
853
|
+
labels.push(toDate(xmax));
|
792
854
|
}
|
793
855
|
}
|
794
856
|
|
795
|
-
|
796
|
-
|
797
|
-
|
798
|
-
|
799
|
-
|
800
|
-
|
801
|
-
|
802
|
-
|
803
|
-
|
804
|
-
|
805
|
-
|
806
|
-
|
807
|
-
step = 1;
|
808
|
-
} else if (hour || timeDiff > 0.5) {
|
809
|
-
options.scales.x.time.displayFormats = {hour: "MMM d, h a"};
|
810
|
-
options.scales.x.time.unit = "hour";
|
811
|
-
step = 1 / 24.0;
|
812
|
-
} else if (minute) {
|
813
|
-
options.scales.x.time.displayFormats = {minute: "h:mm a"};
|
814
|
-
options.scales.x.time.unit = "minute";
|
815
|
-
step = 1 / 24.0 / 60.0;
|
857
|
+
if (labels.length > 0) {
|
858
|
+
var minTime = (notnull(xmin) ? toDate(xmin) : labels[0]).getTime();
|
859
|
+
var maxTime = (notnull(xmax) ? toDate(xmax) : labels[0]).getTime();
|
860
|
+
|
861
|
+
for (var i$1 = 1; i$1 < labels.length; i$1++) {
|
862
|
+
var value = labels[i$1].getTime();
|
863
|
+
if (value < minTime) {
|
864
|
+
minTime = value;
|
865
|
+
}
|
866
|
+
if (value > maxTime) {
|
867
|
+
maxTime = value;
|
868
|
+
}
|
816
869
|
}
|
817
870
|
|
818
|
-
|
819
|
-
|
820
|
-
|
821
|
-
|
822
|
-
|
823
|
-
|
824
|
-
|
871
|
+
var timeDiff = (maxTime - minTime) / (86400 * 1000.0);
|
872
|
+
|
873
|
+
if (!options.scales.x.time.unit) {
|
874
|
+
var step;
|
875
|
+
if (timeUnit === "year" || timeDiff > 365 * 10) {
|
876
|
+
options.scales.x.time.unit = "year";
|
877
|
+
step = 365;
|
878
|
+
} else if (timeUnit === "month" || timeDiff > 30 * 10) {
|
879
|
+
options.scales.x.time.unit = "month";
|
880
|
+
step = 30;
|
881
|
+
} else if (timeUnit === "week" || timeUnit === "day" || timeDiff > 10) {
|
882
|
+
options.scales.x.time.unit = "day";
|
883
|
+
step = 1;
|
884
|
+
} else if (timeUnit === "hour" || timeDiff > 0.5) {
|
885
|
+
options.scales.x.time.displayFormats = {hour: "MMM d, h a"};
|
886
|
+
options.scales.x.time.unit = "hour";
|
887
|
+
step = 1 / 24.0;
|
888
|
+
} else if (timeUnit === "minute") {
|
889
|
+
options.scales.x.time.displayFormats = {minute: "h:mm a"};
|
890
|
+
options.scales.x.time.unit = "minute";
|
891
|
+
step = 1 / 24.0 / 60.0;
|
892
|
+
}
|
893
|
+
|
894
|
+
if (step && timeDiff > 0) {
|
895
|
+
// width not available for hidden elements
|
896
|
+
var width = chart.element.offsetWidth;
|
897
|
+
if (width > 0) {
|
898
|
+
var unitStepSize = Math.ceil(timeDiff / step / (width / 100.0));
|
899
|
+
if (timeUnit === "week" && step === 1) {
|
900
|
+
unitStepSize = Math.ceil(unitStepSize / 7.0) * 7;
|
901
|
+
}
|
902
|
+
options.scales.x.ticks.stepSize = unitStepSize;
|
825
903
|
}
|
826
|
-
options.scales.x.time.stepSize = unitStepSize;
|
827
904
|
}
|
828
905
|
}
|
829
|
-
}
|
830
906
|
|
831
|
-
|
832
|
-
|
833
|
-
|
834
|
-
|
835
|
-
|
836
|
-
|
837
|
-
|
907
|
+
if (!options.scales.x.time.tooltipFormat) {
|
908
|
+
if (timeUnit === "year") {
|
909
|
+
options.scales.x.time.tooltipFormat = "yyyy";
|
910
|
+
} else if (timeUnit === "month") {
|
911
|
+
options.scales.x.time.tooltipFormat = "MMM yyyy";
|
912
|
+
} else if (timeUnit === "week" || timeUnit === "day") {
|
913
|
+
options.scales.x.time.tooltipFormat = "PP";
|
914
|
+
} else if (timeUnit === "hour") {
|
915
|
+
options.scales.x.time.tooltipFormat = "MMM d, h a";
|
916
|
+
} else if (timeUnit === "minute") {
|
917
|
+
options.scales.x.time.tooltipFormat = "h:mm a";
|
918
|
+
}
|
838
919
|
}
|
839
920
|
}
|
840
921
|
}
|
841
922
|
|
842
|
-
|
923
|
+
return {
|
843
924
|
labels: labels,
|
844
925
|
datasets: datasets
|
845
926
|
};
|
846
|
-
|
847
|
-
return data;
|
848
|
-
};
|
927
|
+
}
|
849
928
|
|
850
929
|
var defaultExport$2 = function defaultExport(library) {
|
851
930
|
this.name = "chartjs";
|
@@ -853,20 +932,20 @@
|
|
853
932
|
};
|
854
933
|
|
855
934
|
defaultExport$2.prototype.renderLineChart = function renderLineChart (chart, chartType) {
|
856
|
-
|
857
|
-
|
858
|
-
if (!chart.options.max && allZeros(chart.data)) {
|
859
|
-
chartOptions.max = 1;
|
935
|
+
if (!chartType) {
|
936
|
+
chartType = "line";
|
860
937
|
}
|
861
938
|
|
939
|
+
var chartOptions = {};
|
940
|
+
|
862
941
|
var options = jsOptions$2(chart, merge(chartOptions, chart.options));
|
863
942
|
setFormatOptions$1(chart, options, chartType);
|
864
943
|
|
865
|
-
var data = createDataTable(chart, options, chartType
|
944
|
+
var data = createDataTable(chart, options, chartType);
|
866
945
|
|
867
946
|
if (chart.xtype === "number") {
|
868
947
|
options.scales.x.type = options.scales.x.type || "linear";
|
869
|
-
options.scales.x.position = options.scales.x.position ||"bottom";
|
948
|
+
options.scales.x.position = options.scales.x.position || "bottom";
|
870
949
|
} else {
|
871
950
|
options.scales.x.type = chart.xtype === "string" ? "category" : "time";
|
872
951
|
}
|
@@ -933,6 +1012,9 @@
|
|
933
1012
|
if (chartType !== "bar") {
|
934
1013
|
setLabelSize(chart, data, options);
|
935
1014
|
}
|
1015
|
+
if (!("mode" in options.interaction)) {
|
1016
|
+
options.interaction.mode = "index";
|
1017
|
+
}
|
936
1018
|
this.drawChart(chart, "bar", data, options);
|
937
1019
|
};
|
938
1020
|
|
@@ -1044,7 +1126,7 @@
|
|
1044
1126
|
}
|
1045
1127
|
};
|
1046
1128
|
|
1047
|
-
|
1129
|
+
function hideLegend$1(options, legend, hideLegend) {
|
1048
1130
|
if (legend !== undefined) {
|
1049
1131
|
options.legend.enabled = !!legend;
|
1050
1132
|
if (legend && legend !== true) {
|
@@ -1059,38 +1141,38 @@
|
|
1059
1141
|
} else if (hideLegend) {
|
1060
1142
|
options.legend.enabled = false;
|
1061
1143
|
}
|
1062
|
-
}
|
1144
|
+
}
|
1063
1145
|
|
1064
|
-
|
1146
|
+
function setTitle$1(options, title) {
|
1065
1147
|
options.title.text = title;
|
1066
|
-
}
|
1148
|
+
}
|
1067
1149
|
|
1068
|
-
|
1150
|
+
function setMin$1(options, min) {
|
1069
1151
|
options.yAxis.min = min;
|
1070
|
-
}
|
1152
|
+
}
|
1071
1153
|
|
1072
|
-
|
1154
|
+
function setMax$1(options, max) {
|
1073
1155
|
options.yAxis.max = max;
|
1074
|
-
}
|
1156
|
+
}
|
1075
1157
|
|
1076
|
-
|
1158
|
+
function setStacked$1(options, stacked) {
|
1077
1159
|
var stackedValue = stacked ? (stacked === true ? "normal" : stacked) : null;
|
1078
1160
|
options.plotOptions.series.stacking = stackedValue;
|
1079
1161
|
options.plotOptions.area.stacking = stackedValue;
|
1080
1162
|
options.plotOptions.areaspline.stacking = stackedValue;
|
1081
|
-
}
|
1163
|
+
}
|
1082
1164
|
|
1083
|
-
|
1165
|
+
function setXtitle$1(options, title) {
|
1084
1166
|
options.xAxis.title.text = title;
|
1085
|
-
}
|
1167
|
+
}
|
1086
1168
|
|
1087
|
-
|
1169
|
+
function setYtitle$1(options, title) {
|
1088
1170
|
options.yAxis.title.text = title;
|
1089
|
-
}
|
1171
|
+
}
|
1090
1172
|
|
1091
1173
|
var jsOptions$1 = jsOptionsFunc(defaultOptions$1, hideLegend$1, setTitle$1, setMin$1, setMax$1, setStacked$1, setXtitle$1, setYtitle$1);
|
1092
1174
|
|
1093
|
-
|
1175
|
+
function setFormatOptions(chart, options, chartType) {
|
1094
1176
|
var formatOptions = {
|
1095
1177
|
prefix: chart.options.prefix,
|
1096
1178
|
suffix: chart.options.suffix,
|
@@ -1113,7 +1195,7 @@
|
|
1113
1195
|
return '<span style="color:' + this.color + '">\u25CF</span> ' + formatValue(this.series.name + ': <b>', this.y, formatOptions) + '</b><br/>';
|
1114
1196
|
};
|
1115
1197
|
}
|
1116
|
-
}
|
1198
|
+
}
|
1117
1199
|
|
1118
1200
|
var defaultExport$1 = function defaultExport(library) {
|
1119
1201
|
this.name = "highcharts";
|
@@ -1149,7 +1231,7 @@
|
|
1149
1231
|
}
|
1150
1232
|
}
|
1151
1233
|
|
1152
|
-
var options = jsOptions$1(chart, chart.options, chartOptions)
|
1234
|
+
var options = jsOptions$1(chart, chart.options, chartOptions);
|
1153
1235
|
if (chart.xtype === "number") {
|
1154
1236
|
options.xAxis.type = options.xAxis.type || "linear";
|
1155
1237
|
} else {
|
@@ -1161,13 +1243,15 @@
|
|
1161
1243
|
setFormatOptions(chart, options, chartType);
|
1162
1244
|
|
1163
1245
|
var series = chart.data;
|
1164
|
-
for (i = 0; i < series.length; i++) {
|
1246
|
+
for (var i = 0; i < series.length; i++) {
|
1165
1247
|
series[i].name = series[i].name || "Value";
|
1166
|
-
data = series[i].data;
|
1248
|
+
var data = series[i].data;
|
1167
1249
|
if (chart.xtype === "datetime") {
|
1168
|
-
for (j = 0; j < data.length; j++) {
|
1250
|
+
for (var j = 0; j < data.length; j++) {
|
1169
1251
|
data[j][0] = data[j][0].getTime();
|
1170
1252
|
}
|
1253
|
+
} else if (chart.xtype === "number") {
|
1254
|
+
data.sort(sortByNumberSeries);
|
1171
1255
|
}
|
1172
1256
|
series[i].marker = {symbol: "circle"};
|
1173
1257
|
if (chart.options.points === false) {
|
@@ -1216,15 +1300,17 @@
|
|
1216
1300
|
defaultExport$1.prototype.renderColumnChart = function renderColumnChart (chart, chartType) {
|
1217
1301
|
chartType = chartType || "column";
|
1218
1302
|
var series = chart.data;
|
1219
|
-
var options = jsOptions$1(chart, chart.options)
|
1303
|
+
var options = jsOptions$1(chart, chart.options);
|
1304
|
+
var rows = [];
|
1305
|
+
var categories = [];
|
1220
1306
|
options.chart.type = chartType;
|
1221
1307
|
setFormatOptions(chart, options, chartType);
|
1222
1308
|
|
1223
|
-
for (i = 0; i < series.length; i++) {
|
1224
|
-
s = series[i];
|
1309
|
+
for (var i = 0; i < series.length; i++) {
|
1310
|
+
var s = series[i];
|
1225
1311
|
|
1226
|
-
for (j = 0; j < s.data.length; j++) {
|
1227
|
-
d = s.data[j];
|
1312
|
+
for (var j = 0; j < s.data.length; j++) {
|
1313
|
+
var d = s.data[j];
|
1228
1314
|
if (!rows[d[0]]) {
|
1229
1315
|
rows[d[0]] = new Array(series.length);
|
1230
1316
|
categories.push(d[0]);
|
@@ -1239,19 +1325,19 @@
|
|
1239
1325
|
|
1240
1326
|
options.xAxis.categories = categories;
|
1241
1327
|
|
1242
|
-
var newSeries = []
|
1243
|
-
for (i = 0; i < series.length; i++) {
|
1244
|
-
d = [];
|
1245
|
-
for (j = 0; j < categories.length; j++) {
|
1246
|
-
d.push(rows[categories[j]][i] || 0);
|
1328
|
+
var newSeries = [];
|
1329
|
+
for (var i$1 = 0; i$1 < series.length; i$1++) {
|
1330
|
+
var d$1 = [];
|
1331
|
+
for (var j$1 = 0; j$1 < categories.length; j$1++) {
|
1332
|
+
d$1.push(rows[categories[j$1]][i$1] || 0);
|
1247
1333
|
}
|
1248
1334
|
|
1249
|
-
d2 = {
|
1250
|
-
name: series[i].name || "Value",
|
1251
|
-
data: d
|
1335
|
+
var d2 = {
|
1336
|
+
name: series[i$1].name || "Value",
|
1337
|
+
data: d$1
|
1252
1338
|
};
|
1253
|
-
if (series[i].stack) {
|
1254
|
-
d2.stack = series[i].stack;
|
1339
|
+
if (series[i$1].stack) {
|
1340
|
+
d2.stack = series[i$1].stack;
|
1255
1341
|
}
|
1256
1342
|
|
1257
1343
|
newSeries.push(d2);
|
@@ -1334,7 +1420,7 @@
|
|
1334
1420
|
}
|
1335
1421
|
};
|
1336
1422
|
|
1337
|
-
|
1423
|
+
function hideLegend(options, legend, hideLegend) {
|
1338
1424
|
if (legend !== undefined) {
|
1339
1425
|
var position;
|
1340
1426
|
if (!legend) {
|
@@ -1348,53 +1434,53 @@
|
|
1348
1434
|
} else if (hideLegend) {
|
1349
1435
|
options.legend.position = "none";
|
1350
1436
|
}
|
1351
|
-
}
|
1437
|
+
}
|
1352
1438
|
|
1353
|
-
|
1439
|
+
function setTitle(options, title) {
|
1354
1440
|
options.title = title;
|
1355
1441
|
options.titleTextStyle = {color: "#333", fontSize: "20px"};
|
1356
|
-
}
|
1442
|
+
}
|
1357
1443
|
|
1358
|
-
|
1444
|
+
function setMin(options, min) {
|
1359
1445
|
options.vAxis.viewWindow.min = min;
|
1360
|
-
}
|
1446
|
+
}
|
1361
1447
|
|
1362
|
-
|
1448
|
+
function setMax(options, max) {
|
1363
1449
|
options.vAxis.viewWindow.max = max;
|
1364
|
-
}
|
1450
|
+
}
|
1365
1451
|
|
1366
|
-
|
1452
|
+
function setBarMin(options, min) {
|
1367
1453
|
options.hAxis.viewWindow.min = min;
|
1368
|
-
}
|
1454
|
+
}
|
1369
1455
|
|
1370
|
-
|
1456
|
+
function setBarMax(options, max) {
|
1371
1457
|
options.hAxis.viewWindow.max = max;
|
1372
|
-
}
|
1458
|
+
}
|
1373
1459
|
|
1374
|
-
|
1375
|
-
options.isStacked = stacked
|
1376
|
-
}
|
1460
|
+
function setStacked(options, stacked) {
|
1461
|
+
options.isStacked = stacked || false;
|
1462
|
+
}
|
1377
1463
|
|
1378
|
-
|
1464
|
+
function setXtitle(options, title) {
|
1379
1465
|
options.hAxis.title = title;
|
1380
1466
|
options.hAxis.titleTextStyle.italic = false;
|
1381
|
-
}
|
1467
|
+
}
|
1382
1468
|
|
1383
|
-
|
1469
|
+
function setYtitle(options, title) {
|
1384
1470
|
options.vAxis.title = title;
|
1385
1471
|
options.vAxis.titleTextStyle.italic = false;
|
1386
|
-
}
|
1472
|
+
}
|
1387
1473
|
|
1388
1474
|
var jsOptions = jsOptionsFunc(defaultOptions, hideLegend, setTitle, setMin, setMax, setStacked, setXtitle, setYtitle);
|
1389
1475
|
|
1390
|
-
|
1476
|
+
function resize(callback) {
|
1391
1477
|
if (window.attachEvent) {
|
1392
1478
|
window.attachEvent("onresize", callback);
|
1393
1479
|
} else if (window.addEventListener) {
|
1394
1480
|
window.addEventListener("resize", callback, true);
|
1395
1481
|
}
|
1396
1482
|
callback();
|
1397
|
-
}
|
1483
|
+
}
|
1398
1484
|
|
1399
1485
|
var defaultExport = function defaultExport(library) {
|
1400
1486
|
this.name = "google";
|
@@ -1530,11 +1616,12 @@
|
|
1530
1616
|
var chartOptions = {};
|
1531
1617
|
var options = jsOptions(chart, chart.options, chartOptions);
|
1532
1618
|
|
1533
|
-
var series = chart.data
|
1534
|
-
|
1619
|
+
var series = chart.data;
|
1620
|
+
var rows2 = [];
|
1621
|
+
for (var i = 0; i < series.length; i++) {
|
1535
1622
|
series[i].name = series[i].name || "Value";
|
1536
|
-
d = series[i].data;
|
1537
|
-
for (j = 0; j < d.length; j++) {
|
1623
|
+
var d = series[i].data;
|
1624
|
+
for (var j = 0; j < d.length; j++) {
|
1538
1625
|
var row = new Array(series.length + 1);
|
1539
1626
|
row[0] = d[j][0];
|
1540
1627
|
row[i + 1] = d[j][1];
|
@@ -1542,10 +1629,10 @@
|
|
1542
1629
|
}
|
1543
1630
|
}
|
1544
1631
|
|
1545
|
-
data = new this$1$1.library.visualization.DataTable();
|
1632
|
+
var data = new this$1$1.library.visualization.DataTable();
|
1546
1633
|
data.addColumn("number", "");
|
1547
|
-
for (i = 0; i < series.length; i++) {
|
1548
|
-
data.addColumn("number", series[i].name);
|
1634
|
+
for (var i$1 = 0; i$1 < series.length; i$1++) {
|
1635
|
+
data.addColumn("number", series[i$1].name);
|
1549
1636
|
}
|
1550
1637
|
data.addRows(rows2);
|
1551
1638
|
|
@@ -1632,10 +1719,9 @@
|
|
1632
1719
|
};
|
1633
1720
|
|
1634
1721
|
defaultExport.prototype.runCallbacks = function runCallbacks () {
|
1635
|
-
var cb, call;
|
1636
1722
|
for (var i = 0; i < callbacks.length; i++) {
|
1637
|
-
cb = callbacks[i];
|
1638
|
-
call = this.library.visualization && ((cb.pack === "corechart" && this.library.visualization.LineChart) || (cb.pack === "timeline" && this.library.visualization.Timeline) || (cb.pack === "geochart" && this.library.visualization.GeoChart));
|
1723
|
+
var cb = callbacks[i];
|
1724
|
+
var call = this.library.visualization && ((cb.pack === "corechart" && this.library.visualization.LineChart) || (cb.pack === "timeline" && this.library.visualization.Timeline) || (cb.pack === "geochart" && this.library.visualization.GeoChart));
|
1639
1725
|
if (call) {
|
1640
1726
|
cb.callback();
|
1641
1727
|
callbacks.splice(i, 1);
|
@@ -1646,44 +1732,48 @@
|
|
1646
1732
|
|
1647
1733
|
// cant use object as key
|
1648
1734
|
defaultExport.prototype.createDataTable = function createDataTable (series, columnType) {
|
1649
|
-
var
|
1650
|
-
|
1651
|
-
|
1735
|
+
var rows = [];
|
1736
|
+
var sortedLabels = [];
|
1737
|
+
for (var i = 0; i < series.length; i++) {
|
1738
|
+
var s = series[i];
|
1652
1739
|
series[i].name = series[i].name || "Value";
|
1653
1740
|
|
1654
|
-
for (j = 0; j < s.data.length; j++) {
|
1655
|
-
d = s.data[j];
|
1656
|
-
key =
|
1741
|
+
for (var j = 0; j < s.data.length; j++) {
|
1742
|
+
var d = s.data[j];
|
1743
|
+
var key = columnType === "datetime" ? d[0].getTime() : d[0];
|
1657
1744
|
if (!rows[key]) {
|
1658
1745
|
rows[key] = new Array(series.length);
|
1659
1746
|
sortedLabels.push(key);
|
1660
1747
|
}
|
1661
|
-
rows[key][i] =
|
1748
|
+
rows[key][i] = d[1];
|
1662
1749
|
}
|
1663
1750
|
}
|
1664
1751
|
|
1665
1752
|
var rows2 = [];
|
1666
|
-
var
|
1667
|
-
var
|
1668
|
-
|
1669
|
-
|
1753
|
+
var values = [];
|
1754
|
+
for (var j$1 = 0; j$1 < sortedLabels.length; j$1++) {
|
1755
|
+
var i$1 = sortedLabels[j$1];
|
1756
|
+
var value = (void 0);
|
1670
1757
|
if (columnType === "datetime") {
|
1671
|
-
value = new Date(
|
1672
|
-
|
1673
|
-
} else if (columnType === "number") {
|
1674
|
-
value = toFloat(i);
|
1758
|
+
value = new Date(i$1);
|
1759
|
+
values.push(value);
|
1675
1760
|
} else {
|
1676
|
-
value = i;
|
1761
|
+
value = i$1;
|
1677
1762
|
}
|
1678
|
-
rows2.push([value].concat(rows[i]));
|
1763
|
+
rows2.push([value].concat(rows[i$1]));
|
1679
1764
|
}
|
1765
|
+
|
1766
|
+
var day = true;
|
1680
1767
|
if (columnType === "datetime") {
|
1681
1768
|
rows2.sort(sortByTime);
|
1769
|
+
|
1770
|
+
var timeUnit = calculateTimeUnit(values, true);
|
1771
|
+
day = isDay(timeUnit);
|
1682
1772
|
} else if (columnType === "number") {
|
1683
1773
|
rows2.sort(sortByNumberSeries);
|
1684
1774
|
|
1685
|
-
for (i = 0; i < rows2.length; i++) {
|
1686
|
-
rows2[i][0] = toStr(rows2[i][0]);
|
1775
|
+
for (var i$2 = 0; i$2 < rows2.length; i$2++) {
|
1776
|
+
rows2[i$2][0] = toStr(rows2[i$2][0]);
|
1687
1777
|
}
|
1688
1778
|
|
1689
1779
|
columnType = "string";
|
@@ -1693,17 +1783,132 @@
|
|
1693
1783
|
var data = new this.library.visualization.DataTable();
|
1694
1784
|
columnType = columnType === "datetime" && day ? "date" : columnType;
|
1695
1785
|
data.addColumn(columnType, "");
|
1696
|
-
for (i = 0; i < series.length; i++) {
|
1697
|
-
data.addColumn("number", series[i].name);
|
1786
|
+
for (var i$3 = 0; i$3 < series.length; i$3++) {
|
1787
|
+
data.addColumn("number", series[i$3].name);
|
1698
1788
|
}
|
1699
1789
|
data.addRows(rows2);
|
1700
1790
|
|
1701
1791
|
return data;
|
1702
1792
|
};
|
1703
1793
|
|
1794
|
+
var adapters = [];
|
1795
|
+
|
1796
|
+
function getAdapterType(library) {
|
1797
|
+
if (library) {
|
1798
|
+
if (library.product === "Highcharts") {
|
1799
|
+
return defaultExport$1;
|
1800
|
+
} else if (library.charts) {
|
1801
|
+
return defaultExport;
|
1802
|
+
} else if (isFunction(library)) {
|
1803
|
+
return defaultExport$2;
|
1804
|
+
}
|
1805
|
+
}
|
1806
|
+
throw new Error("Unknown adapter");
|
1807
|
+
}
|
1808
|
+
|
1809
|
+
function addAdapter(library) {
|
1810
|
+
var adapterType = getAdapterType(library);
|
1811
|
+
|
1812
|
+
for (var i = 0; i < adapters.length; i++) {
|
1813
|
+
if (adapters[i].library === library) {
|
1814
|
+
return;
|
1815
|
+
}
|
1816
|
+
}
|
1817
|
+
|
1818
|
+
adapters.push(new adapterType(library));
|
1819
|
+
}
|
1820
|
+
|
1821
|
+
function loadAdapters() {
|
1822
|
+
if ("Chart" in window) {
|
1823
|
+
addAdapter(window.Chart);
|
1824
|
+
}
|
1825
|
+
|
1826
|
+
if ("Highcharts" in window) {
|
1827
|
+
addAdapter(window.Highcharts);
|
1828
|
+
}
|
1829
|
+
|
1830
|
+
if (window.google && window.google.charts) {
|
1831
|
+
addAdapter(window.google);
|
1832
|
+
}
|
1833
|
+
}
|
1834
|
+
|
1835
|
+
// TODO remove chartType if cross-browser way
|
1836
|
+
// to get the name of the chart class
|
1837
|
+
function callAdapter(chartType, chart) {
|
1838
|
+
var fnName = "render" + chartType;
|
1839
|
+
var adapterName = chart.options.adapter;
|
1840
|
+
|
1841
|
+
loadAdapters();
|
1842
|
+
|
1843
|
+
for (var i = 0; i < adapters.length; i++) {
|
1844
|
+
var adapter = adapters[i];
|
1845
|
+
if ((!adapterName || adapterName === adapter.name) && isFunction(adapter[fnName])) {
|
1846
|
+
chart.adapter = adapter.name;
|
1847
|
+
chart.__adapterObject = adapter;
|
1848
|
+
return adapter[fnName](chart);
|
1849
|
+
}
|
1850
|
+
}
|
1851
|
+
|
1852
|
+
if (adapters.length > 0) {
|
1853
|
+
throw new Error("No charting library found for " + chartType);
|
1854
|
+
} else {
|
1855
|
+
throw new Error("No charting libraries found - be sure to include one before your charts");
|
1856
|
+
}
|
1857
|
+
}
|
1858
|
+
|
1859
|
+
var Chartkick = {
|
1860
|
+
charts: {},
|
1861
|
+
configure: function (options) {
|
1862
|
+
for (var key in options) {
|
1863
|
+
if (Object.prototype.hasOwnProperty.call(options, key)) {
|
1864
|
+
Chartkick.config[key] = options[key];
|
1865
|
+
}
|
1866
|
+
}
|
1867
|
+
},
|
1868
|
+
setDefaultOptions: function (opts) {
|
1869
|
+
Chartkick.options = opts;
|
1870
|
+
},
|
1871
|
+
eachChart: function (callback) {
|
1872
|
+
for (var chartId in Chartkick.charts) {
|
1873
|
+
if (Object.prototype.hasOwnProperty.call(Chartkick.charts, chartId)) {
|
1874
|
+
callback(Chartkick.charts[chartId]);
|
1875
|
+
}
|
1876
|
+
}
|
1877
|
+
},
|
1878
|
+
destroyAll: function () {
|
1879
|
+
for (var chartId in Chartkick.charts) {
|
1880
|
+
if (Object.prototype.hasOwnProperty.call(Chartkick.charts, chartId)) {
|
1881
|
+
Chartkick.charts[chartId].destroy();
|
1882
|
+
delete Chartkick.charts[chartId];
|
1883
|
+
}
|
1884
|
+
}
|
1885
|
+
},
|
1886
|
+
config: {},
|
1887
|
+
options: {},
|
1888
|
+
adapters: adapters,
|
1889
|
+
addAdapter: addAdapter,
|
1890
|
+
use: function (adapter) {
|
1891
|
+
addAdapter(adapter);
|
1892
|
+
return Chartkick;
|
1893
|
+
}
|
1894
|
+
};
|
1895
|
+
|
1896
|
+
function formatSeriesBubble(data) {
|
1897
|
+
var r = [];
|
1898
|
+
for (var i = 0; i < data.length; i++) {
|
1899
|
+
r.push([toFloat(data[i][0]), toFloat(data[i][1]), toFloat(data[i][2])]);
|
1900
|
+
}
|
1901
|
+
return r;
|
1902
|
+
}
|
1903
|
+
|
1904
|
+
// casts data to proper type
|
1905
|
+
// sorting is left to adapters
|
1704
1906
|
function formatSeriesData(data, keyType) {
|
1705
|
-
|
1907
|
+
if (keyType === "bubble") {
|
1908
|
+
return formatSeriesBubble(data);
|
1909
|
+
}
|
1706
1910
|
|
1911
|
+
var keyFunc;
|
1707
1912
|
if (keyType === "number") {
|
1708
1913
|
keyFunc = toFloat;
|
1709
1914
|
} else if (keyType === "datetime") {
|
@@ -1712,22 +1917,10 @@
|
|
1712
1917
|
keyFunc = toStr;
|
1713
1918
|
}
|
1714
1919
|
|
1715
|
-
|
1716
|
-
|
1717
|
-
|
1718
|
-
}
|
1719
|
-
} else {
|
1720
|
-
for (j = 0; j < data.length; j++) {
|
1721
|
-
r.push([keyFunc(data[j][0]), toFloat(data[j][1])]);
|
1722
|
-
}
|
1920
|
+
var r = [];
|
1921
|
+
for (var i = 0; i < data.length; i++) {
|
1922
|
+
r.push([keyFunc(data[i][0]), toFloat(data[i][1])]);
|
1723
1923
|
}
|
1724
|
-
|
1725
|
-
if (keyType === "datetime") {
|
1726
|
-
r.sort(sortByTime);
|
1727
|
-
} else if (keyType === "number") {
|
1728
|
-
r.sort(sortByNumberSeries);
|
1729
|
-
}
|
1730
|
-
|
1731
1924
|
return r;
|
1732
1925
|
}
|
1733
1926
|
|
@@ -1748,10 +1941,9 @@
|
|
1748
1941
|
}
|
1749
1942
|
|
1750
1943
|
function detectXTypeWithFunction(series, func) {
|
1751
|
-
var i
|
1752
|
-
|
1753
|
-
|
1754
|
-
for (j = 0; j < data.length; j++) {
|
1944
|
+
for (var i = 0; i < series.length; i++) {
|
1945
|
+
var data = toArr(series[i].data);
|
1946
|
+
for (var j = 0; j < data.length; j++) {
|
1755
1947
|
if (!func(data[j][0])) {
|
1756
1948
|
return false;
|
1757
1949
|
}
|
@@ -1763,11 +1955,11 @@
|
|
1763
1955
|
// creates a shallow copy of each element of the array
|
1764
1956
|
// elements are expected to be objects
|
1765
1957
|
function copySeries(series) {
|
1766
|
-
var newSeries = []
|
1767
|
-
for (i = 0; i < series.length; i++) {
|
1958
|
+
var newSeries = [];
|
1959
|
+
for (var i = 0; i < series.length; i++) {
|
1768
1960
|
var copy = {};
|
1769
|
-
for (j in series[i]) {
|
1770
|
-
if (series[i]
|
1961
|
+
for (var j in series[i]) {
|
1962
|
+
if (Object.prototype.hasOwnProperty.call(series[i], j)) {
|
1771
1963
|
copy[j] = series[i][j];
|
1772
1964
|
}
|
1773
1965
|
}
|
@@ -1777,13 +1969,11 @@
|
|
1777
1969
|
}
|
1778
1970
|
|
1779
1971
|
function processSeries(chart, keyType, noDatetime) {
|
1780
|
-
var i;
|
1781
|
-
|
1782
1972
|
var opts = chart.options;
|
1783
1973
|
var series = chart.rawData;
|
1784
1974
|
|
1785
1975
|
// see if one series or multiple
|
1786
|
-
chart.singleSeriesFormat =
|
1976
|
+
chart.singleSeriesFormat = !isArray(series) || !isPlainObject(series[0]);
|
1787
1977
|
if (chart.singleSeriesFormat) {
|
1788
1978
|
series = [{name: opts.label, data: series}];
|
1789
1979
|
}
|
@@ -1791,23 +1981,23 @@
|
|
1791
1981
|
// convert to array
|
1792
1982
|
// must come before dataEmpty check
|
1793
1983
|
series = copySeries(series);
|
1794
|
-
for (i = 0; i < series.length; i++) {
|
1984
|
+
for (var i = 0; i < series.length; i++) {
|
1795
1985
|
series[i].data = toArr(series[i].data);
|
1796
1986
|
}
|
1797
1987
|
|
1798
|
-
chart.xtype = keyType
|
1988
|
+
chart.xtype = keyType || (opts.discrete ? "string" : detectXType(series, noDatetime, opts));
|
1799
1989
|
|
1800
1990
|
// right format
|
1801
|
-
for (i = 0; i < series.length; i++) {
|
1802
|
-
series[i].data = formatSeriesData(series[i].data, chart.xtype);
|
1991
|
+
for (var i$1 = 0; i$1 < series.length; i$1++) {
|
1992
|
+
series[i$1].data = formatSeriesData(series[i$1].data, chart.xtype);
|
1803
1993
|
}
|
1804
1994
|
|
1805
1995
|
return series;
|
1806
1996
|
}
|
1807
1997
|
|
1808
1998
|
function processSimple(chart) {
|
1809
|
-
var perfectData = toArr(chart.rawData)
|
1810
|
-
for (i = 0; i < perfectData.length; i++) {
|
1999
|
+
var perfectData = toArr(chart.rawData);
|
2000
|
+
for (var i = 0; i < perfectData.length; i++) {
|
1811
2001
|
perfectData[i] = [toStr(perfectData[i][0]), toFloat(perfectData[i][1])];
|
1812
2002
|
}
|
1813
2003
|
return perfectData;
|
@@ -1827,48 +2017,51 @@
|
|
1827
2017
|
}
|
1828
2018
|
|
1829
2019
|
function addDownloadButton(chart) {
|
1830
|
-
var element = chart.element;
|
1831
|
-
var link = document.createElement("a");
|
1832
|
-
|
1833
2020
|
var download = chart.options.download;
|
1834
2021
|
if (download === true) {
|
1835
2022
|
download = {};
|
1836
2023
|
} else if (typeof download === "string") {
|
1837
2024
|
download = {filename: download};
|
1838
2025
|
}
|
1839
|
-
link.download = download.filename || "chart.png"; // https://caniuse.com/download
|
1840
2026
|
|
2027
|
+
var link = document.createElement("a");
|
2028
|
+
link.download = download.filename || "chart.png";
|
1841
2029
|
link.style.position = "absolute";
|
1842
2030
|
link.style.top = "20px";
|
1843
2031
|
link.style.right = "20px";
|
1844
2032
|
link.style.zIndex = 1000;
|
1845
2033
|
link.style.lineHeight = "20px";
|
1846
2034
|
link.target = "_blank"; // for safari
|
2035
|
+
|
1847
2036
|
var image = document.createElement("img");
|
2037
|
+
// icon from Font Awesome, modified to set fill color
|
2038
|
+
var svg = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><!--! Font Awesome Free 6.2.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path fill=\"#CCCCCC\" d=\"M344 240h-56L287.1 152c0-13.25-10.75-24-24-24h-16C234.7 128 223.1 138.8 223.1 152L224 240h-56c-9.531 0-18.16 5.656-22 14.38C142.2 263.1 143.9 273.3 150.4 280.3l88.75 96C243.7 381.2 250.1 384 256.8 384c7.781-.3125 13.25-2.875 17.75-7.844l87.25-96c6.406-7.031 8.031-17.19 4.188-25.88S353.5 240 344 240zM256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM256 464c-114.7 0-208-93.31-208-208S141.3 48 256 48s208 93.31 208 208S370.7 464 256 464z\"/></svg>";
|
2039
|
+
image.src = "data:image/svg+xml;utf8," + (encodeURIComponent(svg));
|
1848
2040
|
image.alt = "Download";
|
2041
|
+
image.style.width = "20px";
|
2042
|
+
image.style.height = "20px";
|
1849
2043
|
image.style.border = "none";
|
1850
|
-
// icon from font-awesome
|
1851
|
-
// http://fa2png.io/
|
1852
|
-
image.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAMAAAC6V+0/AAABCFBMVEUAAADMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMywEsqxAAAAV3RSTlMAAQIDBggJCgsMDQ4PERQaHB0eISIjJCouLzE0OTo/QUJHSUpLTU5PUllhYmltcHh5foWLjI+SlaCio6atr7S1t7m6vsHHyM7R2tze5Obo7fHz9ff5+/1hlxK2AAAA30lEQVQYGUXBhVYCQQBA0TdYWAt2d3d3YWAHyur7/z9xgD16Lw0DW+XKx+1GgX+FRzM3HWQWrHl5N/oapW5RPe0PkBu+UYeICvozTWZVK23Ao04B79oJrOsJDOoxkZoQPWgX29pHpCZEk7rEvQYiNSFq1UMqvlCjJkRBS1R8hb00Vb/TajtBL7nTHE1X1vyMQF732dQhyF2o6SAwrzP06iUQzvwsArlnzcOdrgBhJyHa1QOgO9U1GsKuvjUTjavliZYQ8nNPapG6sap/3nrIdJ6bOWzmX/fy0XVpfzZP3S8OJT3g9EEiJwAAAABJRU5ErkJggg==";
|
1853
2044
|
link.appendChild(image);
|
2045
|
+
|
2046
|
+
var element = chart.element;
|
1854
2047
|
element.style.position = "relative";
|
1855
2048
|
|
1856
2049
|
chart.__downloadAttached = true;
|
1857
2050
|
|
1858
2051
|
// mouseenter
|
1859
|
-
chart.__enterEvent =
|
2052
|
+
chart.__enterEvent = element.addEventListener("mouseover", function (e) {
|
1860
2053
|
var related = e.relatedTarget;
|
1861
2054
|
// check download option again to ensure it wasn't changed
|
1862
|
-
if ((!related || (related !== this && !
|
2055
|
+
if ((!related || (related !== this && !this.contains(related))) && chart.options.download) {
|
1863
2056
|
link.href = chart.toImage(download);
|
1864
2057
|
element.appendChild(link);
|
1865
2058
|
}
|
1866
2059
|
});
|
1867
2060
|
|
1868
2061
|
// mouseleave
|
1869
|
-
chart.__leaveEvent =
|
2062
|
+
chart.__leaveEvent = element.addEventListener("mouseout", function (e) {
|
1870
2063
|
var related = e.relatedTarget;
|
1871
|
-
if (!related || (related !== this && !
|
2064
|
+
if (!related || (related !== this && !this.contains(related))) {
|
1872
2065
|
if (link.parentNode) {
|
1873
2066
|
link.parentNode.removeChild(link);
|
1874
2067
|
}
|
@@ -1876,37 +2069,9 @@
|
|
1876
2069
|
});
|
1877
2070
|
}
|
1878
2071
|
|
1879
|
-
|
1880
|
-
|
1881
|
-
|
1882
|
-
elem.addEventListener(event, fn, false);
|
1883
|
-
return fn;
|
1884
|
-
} else {
|
1885
|
-
var fn2 = function() {
|
1886
|
-
// set the this pointer same as addEventListener when fn is called
|
1887
|
-
return(fn.call(elem, window.event));
|
1888
|
-
};
|
1889
|
-
elem.attachEvent("on" + event, fn2);
|
1890
|
-
return fn2;
|
1891
|
-
}
|
1892
|
-
}
|
1893
|
-
|
1894
|
-
function removeEvent(elem, event, fn) {
|
1895
|
-
if (elem.removeEventListener) {
|
1896
|
-
elem.removeEventListener(event, fn, false);
|
1897
|
-
} else {
|
1898
|
-
elem.detachEvent("on" + event, fn);
|
1899
|
-
}
|
1900
|
-
}
|
1901
|
-
|
1902
|
-
// https://gist.github.com/shawnbot/4166283
|
1903
|
-
function childOf(p, c) {
|
1904
|
-
if (p === c) { return false; }
|
1905
|
-
while (c && c !== p) { c = c.parentNode; }
|
1906
|
-
return c === p;
|
1907
|
-
}
|
1908
|
-
|
1909
|
-
var pendingRequests = [], runningRequests = 0, maxRequests = 4;
|
2072
|
+
var pendingRequests = [];
|
2073
|
+
var runningRequests = 0;
|
2074
|
+
var maxRequests = 4;
|
1910
2075
|
|
1911
2076
|
function pushRequest(url, success, error) {
|
1912
2077
|
pendingRequests.push([url, success, error]);
|
@@ -1930,50 +2095,24 @@
|
|
1930
2095
|
}
|
1931
2096
|
|
1932
2097
|
function getJSON(url, success, error) {
|
1933
|
-
|
1934
|
-
|
1935
|
-
|
1936
|
-
|
1937
|
-
|
1938
|
-
|
1939
|
-
|
1940
|
-
|
1941
|
-
|
1942
|
-
|
1943
|
-
|
1944
|
-
|
1945
|
-
url: url,
|
1946
|
-
success: success,
|
1947
|
-
error: error,
|
1948
|
-
complete: requestComplete
|
1949
|
-
});
|
1950
|
-
} else {
|
1951
|
-
var xhr = new XMLHttpRequest();
|
1952
|
-
xhr.open("GET", url, true);
|
1953
|
-
xhr.setRequestHeader("Content-Type", "application/json");
|
1954
|
-
xhr.onload = function () {
|
1955
|
-
requestComplete();
|
1956
|
-
if (xhr.status === 200) {
|
1957
|
-
success(JSON.parse(xhr.responseText), xhr.statusText, xhr);
|
1958
|
-
} else {
|
1959
|
-
error(xhr, "error", xhr.statusText);
|
1960
|
-
}
|
1961
|
-
};
|
1962
|
-
xhr.send();
|
1963
|
-
}
|
2098
|
+
var xhr = new XMLHttpRequest();
|
2099
|
+
xhr.open("GET", url, true);
|
2100
|
+
xhr.setRequestHeader("Content-Type", "application/json");
|
2101
|
+
xhr.onload = function () {
|
2102
|
+
requestComplete();
|
2103
|
+
if (xhr.status === 200) {
|
2104
|
+
success(JSON.parse(xhr.responseText));
|
2105
|
+
} else {
|
2106
|
+
error(xhr.statusText);
|
2107
|
+
}
|
2108
|
+
};
|
2109
|
+
xhr.send();
|
1964
2110
|
}
|
1965
2111
|
|
1966
|
-
var config = {};
|
1967
|
-
var adapters = [];
|
1968
|
-
|
1969
2112
|
// helpers
|
1970
2113
|
|
1971
2114
|
function setText(element, text) {
|
1972
|
-
|
1973
|
-
element.innerText = text;
|
1974
|
-
} else {
|
1975
|
-
element.textContent = text;
|
1976
|
-
}
|
2115
|
+
element.textContent = text;
|
1977
2116
|
}
|
1978
2117
|
|
1979
2118
|
// TODO remove prefix for all messages
|
@@ -2024,95 +2163,41 @@
|
|
2024
2163
|
}
|
2025
2164
|
}
|
2026
2165
|
|
2027
|
-
function getAdapterType(library) {
|
2028
|
-
if (library) {
|
2029
|
-
if (library.product === "Highcharts") {
|
2030
|
-
return defaultExport$1;
|
2031
|
-
} else if (library.charts) {
|
2032
|
-
return defaultExport;
|
2033
|
-
} else if (isFunction(library)) {
|
2034
|
-
return defaultExport$2;
|
2035
|
-
}
|
2036
|
-
}
|
2037
|
-
throw new Error("Unknown adapter");
|
2038
|
-
}
|
2039
|
-
|
2040
|
-
function addAdapter(library) {
|
2041
|
-
var adapterType = getAdapterType(library);
|
2042
|
-
var adapter = new adapterType(library);
|
2043
|
-
|
2044
|
-
if (adapters.indexOf(adapter) === -1) {
|
2045
|
-
adapters.push(adapter);
|
2046
|
-
}
|
2047
|
-
}
|
2048
|
-
|
2049
|
-
function loadAdapters() {
|
2050
|
-
if ("Chart" in window) {
|
2051
|
-
addAdapter(window.Chart);
|
2052
|
-
}
|
2053
|
-
|
2054
|
-
if ("Highcharts" in window) {
|
2055
|
-
addAdapter(window.Highcharts);
|
2056
|
-
}
|
2057
|
-
|
2058
|
-
if (window.google && window.google.charts) {
|
2059
|
-
addAdapter(window.google);
|
2060
|
-
}
|
2061
|
-
}
|
2062
|
-
|
2063
2166
|
function renderChart(chartType, chart) {
|
2064
2167
|
if (dataEmpty(chart.data, chartType)) {
|
2065
2168
|
var message = chart.options.empty || (chart.options.messages && chart.options.messages.empty) || "No data";
|
2066
2169
|
setText(chart.element, message);
|
2067
2170
|
} else {
|
2068
2171
|
callAdapter(chartType, chart);
|
2172
|
+
// TODO add downloadSupported method to adapter
|
2069
2173
|
if (chart.options.download && !chart.__downloadAttached && chart.adapter === "chartjs") {
|
2070
2174
|
addDownloadButton(chart);
|
2071
2175
|
}
|
2072
2176
|
}
|
2073
2177
|
}
|
2074
2178
|
|
2075
|
-
|
2076
|
-
|
2077
|
-
|
2078
|
-
|
2079
|
-
|
2080
|
-
|
2081
|
-
|
2082
|
-
loadAdapters();
|
2083
|
-
|
2084
|
-
for (i = 0; i < adapters.length; i++) {
|
2085
|
-
adapter = adapters[i];
|
2086
|
-
if ((!adapterName || adapterName === adapter.name) && isFunction(adapter[fnName])) {
|
2087
|
-
chart.adapter = adapter.name;
|
2088
|
-
chart.__adapterObject = adapter;
|
2089
|
-
return adapter[fnName](chart);
|
2179
|
+
function getElement(element) {
|
2180
|
+
if (typeof element === "string") {
|
2181
|
+
var elementId = element;
|
2182
|
+
element = document.getElementById(element);
|
2183
|
+
if (!element) {
|
2184
|
+
throw new Error("No element with id " + elementId);
|
2090
2185
|
}
|
2091
2186
|
}
|
2092
|
-
|
2093
|
-
if (adapters.length > 0) {
|
2094
|
-
throw new Error("No charting library found for " + chartType);
|
2095
|
-
} else {
|
2096
|
-
throw new Error("No charting libraries found - be sure to include one before your charts");
|
2097
|
-
}
|
2187
|
+
return element;
|
2098
2188
|
}
|
2099
2189
|
|
2100
2190
|
// define classes
|
2101
2191
|
|
2102
2192
|
var Chart = function Chart(element, dataSource, options) {
|
2103
|
-
|
2104
|
-
if (typeof element === "string") {
|
2105
|
-
elementId = element;
|
2106
|
-
element = document.getElementById(element);
|
2107
|
-
if (!element) {
|
2108
|
-
throw new Error("No element with id " + elementId);
|
2109
|
-
}
|
2110
|
-
}
|
2111
|
-
this.element = element;
|
2193
|
+
this.element = getElement(element);
|
2112
2194
|
this.options = merge(Chartkick.options, options || {});
|
2113
2195
|
this.dataSource = dataSource;
|
2114
2196
|
|
2115
|
-
|
2197
|
+
// TODO handle charts without an id for eachChart and destroyAll
|
2198
|
+
if (this.element.id) {
|
2199
|
+
Chartkick.charts[this.element.id] = this;
|
2200
|
+
}
|
2116
2201
|
|
2117
2202
|
fetchDataSource(this, dataSource, true);
|
2118
2203
|
|
@@ -2184,7 +2269,7 @@
|
|
2184
2269
|
|
2185
2270
|
if (!this.intervalId) {
|
2186
2271
|
if (refresh) {
|
2187
|
-
this.intervalId = setInterval(
|
2272
|
+
this.intervalId = setInterval(function () {
|
2188
2273
|
this$1$1.refreshData();
|
2189
2274
|
}, refresh * 1000);
|
2190
2275
|
} else {
|
@@ -2201,6 +2286,7 @@
|
|
2201
2286
|
};
|
2202
2287
|
|
2203
2288
|
Chart.prototype.toImage = function toImage (download) {
|
2289
|
+
// TODO move logic to adapter
|
2204
2290
|
if (this.adapter === "chartjs") {
|
2205
2291
|
if (download && download.background && download.background !== "transparent") {
|
2206
2292
|
// https://stackoverflow.com/questions/30464750/chartjs-line-chart-set-background-color
|
@@ -2231,11 +2317,11 @@
|
|
2231
2317
|
}
|
2232
2318
|
|
2233
2319
|
if (this.__enterEvent) {
|
2234
|
-
|
2320
|
+
this.element.removeEventListener("mouseover", this.__enterEvent);
|
2235
2321
|
}
|
2236
2322
|
|
2237
2323
|
if (this.__leaveEvent) {
|
2238
|
-
|
2324
|
+
this.element.removeEventListener("mouseout", this.__leaveEvent);
|
2239
2325
|
}
|
2240
2326
|
};
|
2241
2327
|
|
@@ -2254,7 +2340,7 @@
|
|
2254
2340
|
};
|
2255
2341
|
|
2256
2342
|
Chart.prototype.__config = function __config () {
|
2257
|
-
return config;
|
2343
|
+
return Chartkick.config;
|
2258
2344
|
};
|
2259
2345
|
|
2260
2346
|
var LineChart = /*@__PURE__*/(function (Chart) {
|
@@ -2427,8 +2513,8 @@
|
|
2427
2513
|
Timeline.prototype.constructor = Timeline;
|
2428
2514
|
|
2429
2515
|
Timeline.prototype.__processData = function __processData () {
|
2430
|
-
var
|
2431
|
-
for (i = 0; i < data.length; i++) {
|
2516
|
+
var data = this.rawData;
|
2517
|
+
for (var i = 0; i < data.length; i++) {
|
2432
2518
|
data[i][1] = toDate(data[i][1]);
|
2433
2519
|
data[i][2] = toDate(data[i][2]);
|
2434
2520
|
}
|
@@ -2442,70 +2528,36 @@
|
|
2442
2528
|
return Timeline;
|
2443
2529
|
}(Chart));
|
2444
2530
|
|
2445
|
-
|
2446
|
-
|
2447
|
-
|
2448
|
-
|
2449
|
-
|
2450
|
-
|
2451
|
-
|
2452
|
-
|
2453
|
-
|
2454
|
-
Timeline: Timeline,
|
2455
|
-
charts: {},
|
2456
|
-
configure: function (options) {
|
2457
|
-
for (var key in options) {
|
2458
|
-
if (options.hasOwnProperty(key)) {
|
2459
|
-
config[key] = options[key];
|
2460
|
-
}
|
2461
|
-
}
|
2462
|
-
},
|
2463
|
-
setDefaultOptions: function (opts) {
|
2464
|
-
Chartkick.options = opts;
|
2465
|
-
},
|
2466
|
-
eachChart: function (callback) {
|
2467
|
-
for (var chartId in Chartkick.charts) {
|
2468
|
-
if (Chartkick.charts.hasOwnProperty(chartId)) {
|
2469
|
-
callback(Chartkick.charts[chartId]);
|
2470
|
-
}
|
2471
|
-
}
|
2472
|
-
},
|
2473
|
-
destroyAll: function() {
|
2474
|
-
for (var chartId in Chartkick.charts) {
|
2475
|
-
if (Chartkick.charts.hasOwnProperty(chartId)) {
|
2476
|
-
Chartkick.charts[chartId].destroy();
|
2477
|
-
delete Chartkick.charts[chartId];
|
2478
|
-
}
|
2479
|
-
}
|
2480
|
-
},
|
2481
|
-
config: config,
|
2482
|
-
options: {},
|
2483
|
-
adapters: adapters,
|
2484
|
-
addAdapter: addAdapter,
|
2485
|
-
use: function(adapter) {
|
2486
|
-
addAdapter(adapter);
|
2487
|
-
return Chartkick;
|
2488
|
-
}
|
2489
|
-
};
|
2531
|
+
Chartkick.LineChart = LineChart;
|
2532
|
+
Chartkick.PieChart = PieChart;
|
2533
|
+
Chartkick.ColumnChart = ColumnChart;
|
2534
|
+
Chartkick.BarChart = BarChart;
|
2535
|
+
Chartkick.AreaChart = AreaChart;
|
2536
|
+
Chartkick.GeoChart = GeoChart;
|
2537
|
+
Chartkick.ScatterChart = ScatterChart;
|
2538
|
+
Chartkick.BubbleChart = BubbleChart;
|
2539
|
+
Chartkick.Timeline = Timeline;
|
2490
2540
|
|
2491
2541
|
// not ideal, but allows for simpler integration
|
2492
2542
|
if (typeof window !== "undefined" && !window.Chartkick) {
|
2493
2543
|
window.Chartkick = Chartkick;
|
2494
2544
|
|
2495
2545
|
// clean up previous charts before Turbolinks loads new page
|
2496
|
-
document.addEventListener("turbolinks:before-render", function() {
|
2497
|
-
if (config.autoDestroy !== false) {
|
2546
|
+
document.addEventListener("turbolinks:before-render", function () {
|
2547
|
+
if (Chartkick.config.autoDestroy !== false) {
|
2498
2548
|
Chartkick.destroyAll();
|
2499
2549
|
}
|
2500
2550
|
});
|
2501
|
-
|
2502
|
-
|
2551
|
+
|
2552
|
+
// clean up previous charts before Turbo loads new page
|
2553
|
+
document.addEventListener("turbo:before-render", function () {
|
2554
|
+
if (Chartkick.config.autoDestroy !== false) {
|
2503
2555
|
Chartkick.destroyAll();
|
2504
2556
|
}
|
2505
2557
|
});
|
2506
2558
|
|
2507
2559
|
// use setTimeout so charting library can come later in same JS file
|
2508
|
-
setTimeout(function() {
|
2560
|
+
setTimeout(function () {
|
2509
2561
|
window.dispatchEvent(new Event("chartkick:load"));
|
2510
2562
|
}, 0);
|
2511
2563
|
}
|