chart 0.1.4.9 → 0.1.5.0.pre
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/chart/version.rb +1 -1
- data/vendor/assets/javascripts/chart2.js +582 -428
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d4225c1955f40f8dcf778eee2ef9e95073e7c122
|
4
|
+
data.tar.gz: ce6c3583f0a3de0632ca29ad26a79ebc62f78416
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7053a201f730e01e912314c5a29c0dbdd35b00dd569b03c8e24567321af95d51efebd7f602970190da137355f3b905abe95d88164cf04de9e087fc16bf0e1b05
|
7
|
+
data.tar.gz: 283abed337cff774cc8a77a0a846751ffc2a7b4bc27a931421de26ffb6849966ec1b31e75d17d1d9c7396aacd1649ea6902437eb3fc8850bf84a5b69d8420573
|
data/lib/chart/version.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
/*!
|
2
2
|
* Chart.js
|
3
3
|
* http://chartjs.org/
|
4
|
-
* Version: 2.1
|
4
|
+
* Version: 2.2.1
|
5
5
|
*
|
6
6
|
* Copyright 2016 Nick Downie
|
7
7
|
* Released under the MIT license
|
@@ -1665,32 +1665,33 @@ module.exports = {
|
|
1665
1665
|
/**
|
1666
1666
|
* @namespace Chart
|
1667
1667
|
*/
|
1668
|
-
var Chart = require(
|
1668
|
+
var Chart = require(27)();
|
1669
1669
|
|
1670
|
+
require(26)(Chart);
|
1671
|
+
require(22)(Chart);
|
1670
1672
|
require(25)(Chart);
|
1671
|
-
require(24)(Chart);
|
1672
1673
|
require(21)(Chart);
|
1673
|
-
require(22)(Chart);
|
1674
1674
|
require(23)(Chart);
|
1675
|
-
require(
|
1676
|
-
require(31)(Chart);
|
1677
|
-
require(29)(Chart);
|
1678
|
-
require(30)(Chart);
|
1679
|
-
require(32)(Chart);
|
1675
|
+
require(24)(Chart);
|
1680
1676
|
require(28)(Chart);
|
1677
|
+
require(32)(Chart);
|
1678
|
+
require(30)(Chart);
|
1679
|
+
require(31)(Chart);
|
1681
1680
|
require(33)(Chart);
|
1682
|
-
|
1681
|
+
require(29)(Chart);
|
1683
1682
|
require(34)(Chart);
|
1683
|
+
|
1684
1684
|
require(35)(Chart);
|
1685
1685
|
require(36)(Chart);
|
1686
1686
|
require(37)(Chart);
|
1687
|
-
|
1688
|
-
require(40)(Chart);
|
1689
1687
|
require(38)(Chart);
|
1690
|
-
|
1688
|
+
|
1691
1689
|
require(41)(Chart);
|
1690
|
+
require(39)(Chart);
|
1691
|
+
require(40)(Chart);
|
1692
1692
|
require(42)(Chart);
|
1693
1693
|
require(43)(Chart);
|
1694
|
+
require(44)(Chart);
|
1694
1695
|
|
1695
1696
|
// Controllers must be loaded after elements
|
1696
1697
|
// See Chart.core.datasetController.dataElementType
|
@@ -1711,7 +1712,7 @@ require(14)(Chart);
|
|
1711
1712
|
|
1712
1713
|
window.Chart = module.exports = Chart;
|
1713
1714
|
|
1714
|
-
},{"10":10,"11":11,"12":12,"13":13,"14":14,"15":15,"16":16,"17":17,"18":18,"19":19,"20":20,"21":21,"22":22,"23":23,"24":24,"25":25,"26":26,"27":27,"28":28,"29":29,"30":30,"31":31,"32":32,"33":33,"34":34,"35":35,"36":36,"37":37,"38":38,"39":39,"40":40,"41":41,"42":42,"43":43,"8":8,"9":9}],8:[function(require,module,exports){
|
1715
|
+
},{"10":10,"11":11,"12":12,"13":13,"14":14,"15":15,"16":16,"17":17,"18":18,"19":19,"20":20,"21":21,"22":22,"23":23,"24":24,"25":25,"26":26,"27":27,"28":28,"29":29,"30":30,"31":31,"32":32,"33":33,"34":34,"35":35,"36":36,"37":37,"38":38,"39":39,"40":40,"41":41,"42":42,"43":43,"44":44,"8":8,"9":9}],8:[function(require,module,exports){
|
1715
1716
|
"use strict";
|
1716
1717
|
|
1717
1718
|
module.exports = function(Chart) {
|
@@ -1809,11 +1810,11 @@ module.exports = function(Chart) {
|
|
1809
1810
|
|
1810
1811
|
tooltips: {
|
1811
1812
|
callbacks: {
|
1812
|
-
title: function(
|
1813
|
+
title: function() {
|
1813
1814
|
// Title doesn't make sense for scatter since we format the data as a point
|
1814
1815
|
return '';
|
1815
1816
|
},
|
1816
|
-
label: function(tooltipItem
|
1817
|
+
label: function(tooltipItem) {
|
1817
1818
|
return '(' + tooltipItem.xLabel + ', ' + tooltipItem.yLabel + ')';
|
1818
1819
|
}
|
1819
1820
|
}
|
@@ -1875,7 +1876,7 @@ module.exports = function(Chart) {
|
|
1875
1876
|
},
|
1876
1877
|
|
1877
1878
|
// Get the number of datasets that display bars. We use this to correctly calculate the bar width
|
1878
|
-
getBarCount: function
|
1879
|
+
getBarCount: function() {
|
1879
1880
|
var me = this;
|
1880
1881
|
var barCount = 0;
|
1881
1882
|
helpers.each(me.chart.data.datasets, function(dataset, datasetIndex) {
|
@@ -1887,14 +1888,14 @@ module.exports = function(Chart) {
|
|
1887
1888
|
return barCount;
|
1888
1889
|
},
|
1889
1890
|
|
1890
|
-
update: function
|
1891
|
+
update: function(reset) {
|
1891
1892
|
var me = this;
|
1892
1893
|
helpers.each(me.getMeta().data, function(rectangle, index) {
|
1893
1894
|
me.updateElement(rectangle, index, reset);
|
1894
1895
|
}, me);
|
1895
1896
|
},
|
1896
1897
|
|
1897
|
-
updateElement: function
|
1898
|
+
updateElement: function(rectangle, index, reset) {
|
1898
1899
|
var me = this;
|
1899
1900
|
var meta = me.getMeta();
|
1900
1901
|
var xScale = me.getScaleForId(meta.xAxisID);
|
@@ -1941,23 +1942,14 @@ module.exports = function(Chart) {
|
|
1941
1942
|
if (yScale.options.stacked) {
|
1942
1943
|
var chart = me.chart;
|
1943
1944
|
var datasets = chart.data.datasets;
|
1944
|
-
var value = datasets[datasetIndex].data[index];
|
1945
|
+
var value = Number(datasets[datasetIndex].data[index]);
|
1945
1946
|
|
1946
|
-
|
1947
|
-
|
1948
|
-
|
1949
|
-
|
1950
|
-
|
1951
|
-
|
1952
|
-
}
|
1953
|
-
}
|
1954
|
-
} else {
|
1955
|
-
for (var j = 0; j < datasetIndex; j++) {
|
1956
|
-
var posDS = datasets[j];
|
1957
|
-
var posDSMeta = chart.getDatasetMeta(j);
|
1958
|
-
if (posDSMeta.bar && posDSMeta.yAxisID === yScale.id && chart.isDatasetVisible(j)) {
|
1959
|
-
base += posDS.data[index] > 0 ? posDS.data[index] : 0;
|
1960
|
-
}
|
1947
|
+
for (var i = 0; i < datasetIndex; i++) {
|
1948
|
+
var currentDs = datasets[i];
|
1949
|
+
var currentDsMeta = chart.getDatasetMeta(i);
|
1950
|
+
if (currentDsMeta.bar && currentDsMeta.yAxisID === yScale.id && chart.isDatasetVisible(i)) {
|
1951
|
+
var currentVal = Number(currentDs.data[index]);
|
1952
|
+
base += value < 0 ? Math.min(currentVal, 0) : Math.max(currentVal, 0);
|
1961
1953
|
}
|
1962
1954
|
}
|
1963
1955
|
|
@@ -2006,6 +1998,9 @@ module.exports = function(Chart) {
|
|
2006
1998
|
|
2007
1999
|
calculateBarWidth: function(index) {
|
2008
2000
|
var xScale = this.getScaleForId(this.getMeta().xAxisID);
|
2001
|
+
if (xScale.options.barThickness) {
|
2002
|
+
return xScale.options.barThickness;
|
2003
|
+
}
|
2009
2004
|
var ruler = this.getRuler(index);
|
2010
2005
|
return xScale.options.stacked ? ruler.categoryWidth : ruler.barWidth;
|
2011
2006
|
},
|
@@ -2051,7 +2046,7 @@ module.exports = function(Chart) {
|
|
2051
2046
|
var me = this;
|
2052
2047
|
var meta = me.getMeta();
|
2053
2048
|
var yScale = me.getScaleForId(meta.yAxisID);
|
2054
|
-
var value = me.getDataset().data[index];
|
2049
|
+
var value = Number(me.getDataset().data[index]);
|
2055
2050
|
|
2056
2051
|
if (yScale.options.stacked) {
|
2057
2052
|
|
@@ -2062,10 +2057,11 @@ module.exports = function(Chart) {
|
|
2062
2057
|
var ds = me.chart.data.datasets[i];
|
2063
2058
|
var dsMeta = me.chart.getDatasetMeta(i);
|
2064
2059
|
if (dsMeta.bar && dsMeta.yAxisID === yScale.id && me.chart.isDatasetVisible(i)) {
|
2065
|
-
|
2066
|
-
|
2060
|
+
var stackedVal = Number(ds.data[index]);
|
2061
|
+
if (stackedVal < 0) {
|
2062
|
+
sumNeg += stackedVal || 0;
|
2067
2063
|
} else {
|
2068
|
-
sumPos +=
|
2064
|
+
sumPos += stackedVal || 0;
|
2069
2065
|
}
|
2070
2066
|
}
|
2071
2067
|
}
|
@@ -2173,7 +2169,7 @@ module.exports = function(Chart) {
|
|
2173
2169
|
};
|
2174
2170
|
|
2175
2171
|
Chart.controllers.horizontalBar = Chart.controllers.bar.extend({
|
2176
|
-
updateElement: function
|
2172
|
+
updateElement: function(rectangle, index, reset) {
|
2177
2173
|
var me = this;
|
2178
2174
|
var meta = me.getMeta();
|
2179
2175
|
var xScale = me.getScaleForId(meta.xAxisID);
|
@@ -2289,24 +2285,16 @@ module.exports = function(Chart) {
|
|
2289
2285
|
var base = 0;
|
2290
2286
|
|
2291
2287
|
if (xScale.options.stacked) {
|
2288
|
+
var chart = me.chart;
|
2289
|
+
var datasets = chart.data.datasets;
|
2290
|
+
var value = Number(datasets[datasetIndex].data[index]);
|
2292
2291
|
|
2293
|
-
var
|
2294
|
-
|
2295
|
-
|
2296
|
-
|
2297
|
-
var
|
2298
|
-
|
2299
|
-
if (negDSMeta.bar && negDSMeta.xAxisID === xScale.id && me.chart.isDatasetVisible(i)) {
|
2300
|
-
base += negDS.data[index] < 0 ? negDS.data[index] : 0;
|
2301
|
-
}
|
2302
|
-
}
|
2303
|
-
} else {
|
2304
|
-
for (var j = 0; j < datasetIndex; j++) {
|
2305
|
-
var posDS = me.chart.data.datasets[j];
|
2306
|
-
var posDSMeta = me.chart.getDatasetMeta(j);
|
2307
|
-
if (posDSMeta.bar && posDSMeta.xAxisID === xScale.id && me.chart.isDatasetVisible(j)) {
|
2308
|
-
base += posDS.data[index] > 0 ? posDS.data[index] : 0;
|
2309
|
-
}
|
2292
|
+
for (var i = 0; i < datasetIndex; i++) {
|
2293
|
+
var currentDs = datasets[i];
|
2294
|
+
var currentDsMeta = chart.getDatasetMeta(i);
|
2295
|
+
if (currentDsMeta.bar && currentDsMeta.xAxisID === xScale.id && chart.isDatasetVisible(i)) {
|
2296
|
+
var currentVal = Number(currentDs.data[index]);
|
2297
|
+
base += value < 0 ? Math.min(currentVal, 0) : Math.max(currentVal, 0);
|
2310
2298
|
}
|
2311
2299
|
}
|
2312
2300
|
|
@@ -2355,6 +2343,9 @@ module.exports = function(Chart) {
|
|
2355
2343
|
calculateBarHeight: function (index) {
|
2356
2344
|
var me = this;
|
2357
2345
|
var yScale = me.getScaleForId(me.getMeta().yAxisID);
|
2346
|
+
if (yScale.options.barThickness) {
|
2347
|
+
return yScale.options.barThickness;
|
2348
|
+
}
|
2358
2349
|
var ruler = me.getRuler(index);
|
2359
2350
|
return yScale.options.stacked ? ruler.categoryHeight : ruler.barHeight;
|
2360
2351
|
},
|
@@ -2363,7 +2354,7 @@ module.exports = function(Chart) {
|
|
2363
2354
|
var me = this;
|
2364
2355
|
var meta = me.getMeta();
|
2365
2356
|
var xScale = me.getScaleForId(meta.xAxisID);
|
2366
|
-
var value = me.getDataset().data[index];
|
2357
|
+
var value = Number(me.getDataset().data[index]);
|
2367
2358
|
|
2368
2359
|
if (xScale.options.stacked) {
|
2369
2360
|
|
@@ -2374,10 +2365,11 @@ module.exports = function(Chart) {
|
|
2374
2365
|
var ds = me.chart.data.datasets[i];
|
2375
2366
|
var dsMeta = me.chart.getDatasetMeta(i);
|
2376
2367
|
if (dsMeta.bar && dsMeta.xAxisID === xScale.id && me.chart.isDatasetVisible(i)) {
|
2377
|
-
|
2378
|
-
|
2368
|
+
var stackedVal = Number(ds.data[index]);
|
2369
|
+
if (stackedVal < 0) {
|
2370
|
+
sumNeg += stackedVal || 0;
|
2379
2371
|
} else {
|
2380
|
-
sumPos +=
|
2372
|
+
sumPos += stackedVal || 0;
|
2381
2373
|
}
|
2382
2374
|
}
|
2383
2375
|
}
|
@@ -2443,7 +2435,7 @@ module.exports = function(Chart) {
|
|
2443
2435
|
|
2444
2436
|
tooltips: {
|
2445
2437
|
callbacks: {
|
2446
|
-
title: function(
|
2438
|
+
title: function() {
|
2447
2439
|
// Title doesn't make sense for scatter since we format the data as a point
|
2448
2440
|
return '';
|
2449
2441
|
},
|
@@ -2460,7 +2452,7 @@ module.exports = function(Chart) {
|
|
2460
2452
|
|
2461
2453
|
dataElementType: Chart.elements.Point,
|
2462
2454
|
|
2463
|
-
update: function
|
2455
|
+
update: function(reset) {
|
2464
2456
|
var me = this;
|
2465
2457
|
var meta = me.getMeta();
|
2466
2458
|
var points = meta.data;
|
@@ -2492,7 +2484,7 @@ module.exports = function(Chart) {
|
|
2492
2484
|
|
2493
2485
|
// Desired view properties
|
2494
2486
|
_model: {
|
2495
|
-
x: reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(data, index, dsIndex, me.chart.isCombo),
|
2487
|
+
x: reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(typeof data === 'object' ? data : NaN, index, dsIndex, me.chart.isCombo),
|
2496
2488
|
y: reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, dsIndex),
|
2497
2489
|
// Appearance
|
2498
2490
|
radius: reset ? 0 : custom.radius ? custom.radius : me.getRadius(data),
|
@@ -2589,7 +2581,7 @@ module.exports = function(Chart) {
|
|
2589
2581
|
var meta = chart.getDatasetMeta(0);
|
2590
2582
|
var ds = data.datasets[0];
|
2591
2583
|
var arc = meta.data[i];
|
2592
|
-
var custom = arc.custom || {};
|
2584
|
+
var custom = arc && arc.custom || {};
|
2593
2585
|
var getValueAtIndexOrDefault = helpers.getValueAtIndexOrDefault;
|
2594
2586
|
var arcOpts = chart.options.elements.arc;
|
2595
2587
|
var fill = custom.backgroundColor ? custom.backgroundColor : getValueAtIndexOrDefault(ds.backgroundColor, i, arcOpts.backgroundColor);
|
@@ -2662,7 +2654,7 @@ module.exports = function(Chart) {
|
|
2662
2654
|
linkScales: helpers.noop,
|
2663
2655
|
|
2664
2656
|
// Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly
|
2665
|
-
getRingIndex: function
|
2657
|
+
getRingIndex: function(datasetIndex) {
|
2666
2658
|
var ringIndex = 0;
|
2667
2659
|
|
2668
2660
|
for (var j = 0; j < datasetIndex; ++j) {
|
@@ -2674,7 +2666,7 @@ module.exports = function(Chart) {
|
|
2674
2666
|
return ringIndex;
|
2675
2667
|
},
|
2676
2668
|
|
2677
|
-
update: function
|
2669
|
+
update: function(reset) {
|
2678
2670
|
var me = this;
|
2679
2671
|
var chart = me.chart,
|
2680
2672
|
chartArea = chart.chartArea,
|
@@ -2709,8 +2701,9 @@ module.exports = function(Chart) {
|
|
2709
2701
|
minSize = Math.min(availableWidth / size.width, availableHeight / size.height);
|
2710
2702
|
offset = {x: (max.x + min.x) * -0.5, y: (max.y + min.y) * -0.5};
|
2711
2703
|
}
|
2704
|
+
chart.borderWidth = me.getMaxBorderWidth(meta.data);
|
2712
2705
|
|
2713
|
-
chart.outerRadius = Math.max(minSize / 2, 0);
|
2706
|
+
chart.outerRadius = Math.max((minSize - chart.borderWidth) / 2, 0);
|
2714
2707
|
chart.innerRadius = Math.max(cutoutPercentage ? (chart.outerRadius / 100) * (cutoutPercentage) : 1, 0);
|
2715
2708
|
chart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount();
|
2716
2709
|
chart.offsetX = offset.x * chart.outerRadius;
|
@@ -2732,7 +2725,6 @@ module.exports = function(Chart) {
|
|
2732
2725
|
chartArea = chart.chartArea,
|
2733
2726
|
opts = chart.options,
|
2734
2727
|
animationOpts = opts.animation,
|
2735
|
-
arcOpts = opts.elements.arc,
|
2736
2728
|
centerX = (chartArea.left + chartArea.right) / 2,
|
2737
2729
|
centerY = (chartArea.top + chartArea.bottom) / 2,
|
2738
2730
|
startAngle = opts.rotation, // non reset case handled later
|
@@ -2741,7 +2733,6 @@ module.exports = function(Chart) {
|
|
2741
2733
|
circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / (2.0 * Math.PI)),
|
2742
2734
|
innerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius,
|
2743
2735
|
outerRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius,
|
2744
|
-
custom = arc.custom || {},
|
2745
2736
|
valueAtIndexOrDefault = helpers.getValueAtIndexOrDefault;
|
2746
2737
|
|
2747
2738
|
helpers.extend(arc, {
|
@@ -2797,6 +2788,10 @@ module.exports = function(Chart) {
|
|
2797
2788
|
}
|
2798
2789
|
});
|
2799
2790
|
|
2791
|
+
/*if (total === 0) {
|
2792
|
+
total = NaN;
|
2793
|
+
}*/
|
2794
|
+
|
2800
2795
|
return total;
|
2801
2796
|
},
|
2802
2797
|
|
@@ -2807,7 +2802,25 @@ module.exports = function(Chart) {
|
|
2807
2802
|
} else {
|
2808
2803
|
return 0;
|
2809
2804
|
}
|
2810
|
-
}
|
2805
|
+
},
|
2806
|
+
|
2807
|
+
//gets the max border or hover width to properly scale pie charts
|
2808
|
+
getMaxBorderWidth: function (elements) {
|
2809
|
+
var max = 0,
|
2810
|
+
index = this.index,
|
2811
|
+
length = elements.length,
|
2812
|
+
borderWidth,
|
2813
|
+
hoverWidth;
|
2814
|
+
|
2815
|
+
for (var i = 0; i < length; i++) {
|
2816
|
+
borderWidth = elements[i]._model ? elements[i]._model.borderWidth : 0;
|
2817
|
+
hoverWidth = elements[i]._chart ? elements[i]._chart.config.data.datasets[index].hoverBorderWidth : 0;
|
2818
|
+
|
2819
|
+
max = borderWidth > max ? borderWidth : max;
|
2820
|
+
max = hoverWidth > max ? hoverWidth : max;
|
2821
|
+
}
|
2822
|
+
return max;
|
2823
|
+
}
|
2811
2824
|
});
|
2812
2825
|
};
|
2813
2826
|
|
@@ -2820,6 +2833,7 @@ module.exports = function(Chart) {
|
|
2820
2833
|
|
2821
2834
|
Chart.defaults.line = {
|
2822
2835
|
showLines: true,
|
2836
|
+
spanGaps: false,
|
2823
2837
|
|
2824
2838
|
hover: {
|
2825
2839
|
mode: "label"
|
@@ -2860,7 +2874,7 @@ module.exports = function(Chart) {
|
|
2860
2874
|
}
|
2861
2875
|
},
|
2862
2876
|
|
2863
|
-
update: function
|
2877
|
+
update: function(reset) {
|
2864
2878
|
var me = this;
|
2865
2879
|
var meta = me.getMeta();
|
2866
2880
|
var line = meta.dataset;
|
@@ -2892,7 +2906,7 @@ module.exports = function(Chart) {
|
|
2892
2906
|
// The default behavior of lines is to break at null values, according
|
2893
2907
|
// to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158
|
2894
2908
|
// This option gives linse the ability to span gaps
|
2895
|
-
spanGaps: dataset.spanGaps ? dataset.spanGaps :
|
2909
|
+
spanGaps: dataset.spanGaps ? dataset.spanGaps : options.spanGaps,
|
2896
2910
|
tension: custom.tension ? custom.tension : helpers.getValueOrDefault(dataset.lineTension, lineElementOptions.tension),
|
2897
2911
|
backgroundColor: custom.backgroundColor ? custom.backgroundColor : (dataset.backgroundColor || lineElementOptions.backgroundColor),
|
2898
2912
|
borderWidth: custom.borderWidth ? custom.borderWidth : (dataset.borderWidth || lineElementOptions.borderWidth),
|
@@ -2902,6 +2916,7 @@ module.exports = function(Chart) {
|
|
2902
2916
|
borderDashOffset: custom.borderDashOffset ? custom.borderDashOffset : (dataset.borderDashOffset || lineElementOptions.borderDashOffset),
|
2903
2917
|
borderJoinStyle: custom.borderJoinStyle ? custom.borderJoinStyle : (dataset.borderJoinStyle || lineElementOptions.borderJoinStyle),
|
2904
2918
|
fill: custom.fill ? custom.fill : (dataset.fill !== undefined ? dataset.fill : lineElementOptions.fill),
|
2919
|
+
steppedLine: custom.steppedLine ? custom.steppedLine : helpers.getValueOrDefault(dataset.steppedLine, lineElementOptions.stepped),
|
2905
2920
|
// Scale
|
2906
2921
|
scaleTop: scale.top,
|
2907
2922
|
scaleBottom: scale.bottom,
|
@@ -2994,8 +3009,8 @@ module.exports = function(Chart) {
|
|
2994
3009
|
dataset.pointHitRadius = dataset.hitRadius;
|
2995
3010
|
}
|
2996
3011
|
|
2997
|
-
x = xScale.getPixelForValue(value, index, datasetIndex, me.chart.isCombo);
|
2998
|
-
y = reset ? yScale.getBasePixel() : me.calculatePointY(value, index, datasetIndex
|
3012
|
+
x = xScale.getPixelForValue(typeof value === 'object' ? value : NaN, index, datasetIndex, me.chart.isCombo);
|
3013
|
+
y = reset ? yScale.getBasePixel() : me.calculatePointY(value, index, datasetIndex);
|
2999
3014
|
|
3000
3015
|
// Utility
|
3001
3016
|
point._xScale = xScale;
|
@@ -3015,12 +3030,13 @@ module.exports = function(Chart) {
|
|
3015
3030
|
borderColor: me.getPointBorderColor(point, index),
|
3016
3031
|
borderWidth: me.getPointBorderWidth(point, index),
|
3017
3032
|
tension: meta.dataset._model ? meta.dataset._model.tension : 0,
|
3033
|
+
steppedLine: meta.dataset._model ? meta.dataset._model.steppedLine : false,
|
3018
3034
|
// Tooltip
|
3019
3035
|
hitRadius: custom.hitRadius || helpers.getValueAtIndexOrDefault(dataset.pointHitRadius, index, pointOptions.hitRadius)
|
3020
3036
|
};
|
3021
3037
|
},
|
3022
3038
|
|
3023
|
-
calculatePointY: function(value, index, datasetIndex
|
3039
|
+
calculatePointY: function(value, index, datasetIndex) {
|
3024
3040
|
var me = this;
|
3025
3041
|
var chart = me.chart;
|
3026
3042
|
var meta = me.getMeta();
|
@@ -3033,19 +3049,21 @@ module.exports = function(Chart) {
|
|
3033
3049
|
for (i = 0; i < datasetIndex; i++) {
|
3034
3050
|
ds = chart.data.datasets[i];
|
3035
3051
|
dsMeta = chart.getDatasetMeta(i);
|
3036
|
-
if (dsMeta.type === 'line' && chart.isDatasetVisible(i)) {
|
3037
|
-
|
3038
|
-
|
3052
|
+
if (dsMeta.type === 'line' && dsMeta.yAxisID === yScale.id && chart.isDatasetVisible(i)) {
|
3053
|
+
var stackedRightValue = Number(yScale.getRightValue(ds.data[index]));
|
3054
|
+
if (stackedRightValue < 0) {
|
3055
|
+
sumNeg += stackedRightValue || 0;
|
3039
3056
|
} else {
|
3040
|
-
sumPos +=
|
3057
|
+
sumPos += stackedRightValue || 0;
|
3041
3058
|
}
|
3042
3059
|
}
|
3043
3060
|
}
|
3044
3061
|
|
3045
|
-
|
3046
|
-
|
3062
|
+
var rightValue = Number(yScale.getRightValue(value));
|
3063
|
+
if (rightValue < 0) {
|
3064
|
+
return yScale.getPixelForValue(sumNeg + rightValue);
|
3047
3065
|
} else {
|
3048
|
-
return yScale.getPixelForValue(sumPos +
|
3066
|
+
return yScale.getPixelForValue(sumPos + rightValue);
|
3049
3067
|
}
|
3050
3068
|
}
|
3051
3069
|
|
@@ -3053,11 +3071,19 @@ module.exports = function(Chart) {
|
|
3053
3071
|
},
|
3054
3072
|
|
3055
3073
|
updateBezierControlPoints: function() {
|
3056
|
-
var
|
3057
|
-
var
|
3058
|
-
var
|
3074
|
+
var me = this;
|
3075
|
+
var meta = me.getMeta();
|
3076
|
+
var area = me.chart.chartArea;
|
3077
|
+
|
3078
|
+
// only consider points that are drawn in case the spanGaps option is ued
|
3079
|
+
var points = (meta.data || []).filter(function(pt) { return !pt._model.skip; });
|
3059
3080
|
var i, ilen, point, model, controlPoints;
|
3060
3081
|
|
3082
|
+
var needToCap = me.chart.options.elements.line.capBezierPoints;
|
3083
|
+
function capIfNecessary(pt, min, max) {
|
3084
|
+
return needToCap ? Math.max(Math.min(pt, max), min) : pt;
|
3085
|
+
}
|
3086
|
+
|
3061
3087
|
for (i=0, ilen=points.length; i<ilen; ++i) {
|
3062
3088
|
point = points[i];
|
3063
3089
|
model = point._model;
|
@@ -3068,10 +3094,10 @@ module.exports = function(Chart) {
|
|
3068
3094
|
meta.dataset._model.tension
|
3069
3095
|
);
|
3070
3096
|
|
3071
|
-
model.controlPointPreviousX = controlPoints.previous.x;
|
3072
|
-
model.controlPointPreviousY = controlPoints.previous.y;
|
3073
|
-
model.controlPointNextX = controlPoints.next.x;
|
3074
|
-
model.controlPointNextY = controlPoints.next.y;
|
3097
|
+
model.controlPointPreviousX = capIfNecessary(controlPoints.previous.x, area.left, area.right);
|
3098
|
+
model.controlPointPreviousY = capIfNecessary(controlPoints.previous.y, area.top, area.bottom);
|
3099
|
+
model.controlPointNextX = capIfNecessary(controlPoints.next.x, area.left, area.right);
|
3100
|
+
model.controlPointNextY = capIfNecessary(controlPoints.next.y, area.top, area.bottom);
|
3075
3101
|
}
|
3076
3102
|
},
|
3077
3103
|
|
@@ -3142,7 +3168,10 @@ module.exports = function(Chart) {
|
|
3142
3168
|
|
3143
3169
|
scale: {
|
3144
3170
|
type: "radialLinear",
|
3145
|
-
lineArc: true // so that lines are circular
|
3171
|
+
lineArc: true, // so that lines are circular
|
3172
|
+
ticks: {
|
3173
|
+
beginAtZero: true
|
3174
|
+
}
|
3146
3175
|
},
|
3147
3176
|
|
3148
3177
|
//Boolean - Whether to animate the rotation of the chart
|
@@ -3151,6 +3180,7 @@ module.exports = function(Chart) {
|
|
3151
3180
|
animateScale: true
|
3152
3181
|
},
|
3153
3182
|
|
3183
|
+
startAngle: -0.5 * Math.PI,
|
3154
3184
|
aspectRatio: 1,
|
3155
3185
|
legendCallback: function(chart) {
|
3156
3186
|
var text = [];
|
@@ -3239,7 +3269,7 @@ module.exports = function(Chart) {
|
|
3239
3269
|
|
3240
3270
|
linkScales: helpers.noop,
|
3241
3271
|
|
3242
|
-
update: function
|
3272
|
+
update: function(reset) {
|
3243
3273
|
var me = this;
|
3244
3274
|
var chart = me.chart;
|
3245
3275
|
var chartArea = chart.chartArea;
|
@@ -3264,19 +3294,16 @@ module.exports = function(Chart) {
|
|
3264
3294
|
updateElement: function(arc, index, reset) {
|
3265
3295
|
var me = this;
|
3266
3296
|
var chart = me.chart;
|
3267
|
-
var chartArea = chart.chartArea;
|
3268
3297
|
var dataset = me.getDataset();
|
3269
3298
|
var opts = chart.options;
|
3270
3299
|
var animationOpts = opts.animation;
|
3271
|
-
var arcOpts = opts.elements.arc;
|
3272
|
-
var custom = arc.custom || {};
|
3273
3300
|
var scale = chart.scale;
|
3274
3301
|
var getValueAtIndexOrDefault = helpers.getValueAtIndexOrDefault;
|
3275
3302
|
var labels = chart.data.labels;
|
3276
3303
|
|
3277
3304
|
var circumference = me.calculateCircumference(dataset.data[index]);
|
3278
|
-
var centerX =
|
3279
|
-
var centerY =
|
3305
|
+
var centerX = scale.xCenter;
|
3306
|
+
var centerY = scale.yCenter;
|
3280
3307
|
|
3281
3308
|
// If there is NaN data before us, we need to calculate the starting angle correctly.
|
3282
3309
|
// We could be way more efficient here, but its unlikely that the polar area chart will have a lot of data
|
@@ -3288,9 +3315,10 @@ module.exports = function(Chart) {
|
|
3288
3315
|
}
|
3289
3316
|
}
|
3290
3317
|
|
3291
|
-
var negHalfPI = -0.5 * Math.PI;
|
3318
|
+
//var negHalfPI = -0.5 * Math.PI;
|
3319
|
+
var datasetStartAngle = opts.startAngle;
|
3292
3320
|
var distance = arc.hidden ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);
|
3293
|
-
var startAngle =
|
3321
|
+
var startAngle = datasetStartAngle + (circumference * visibleCount);
|
3294
3322
|
var endAngle = startAngle + (arc.hidden ? 0 : circumference);
|
3295
3323
|
|
3296
3324
|
var resetRadius = animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);
|
@@ -3307,8 +3335,8 @@ module.exports = function(Chart) {
|
|
3307
3335
|
y: centerY,
|
3308
3336
|
innerRadius: 0,
|
3309
3337
|
outerRadius: reset ? resetRadius : distance,
|
3310
|
-
startAngle: reset && animationOpts.animateRotate ?
|
3311
|
-
endAngle: reset && animationOpts.animateRotate ?
|
3338
|
+
startAngle: reset && animationOpts.animateRotate ? datasetStartAngle : startAngle,
|
3339
|
+
endAngle: reset && animationOpts.animateRotate ? datasetStartAngle : endAngle,
|
3312
3340
|
label: getValueAtIndexOrDefault(labels, index, labels[index])
|
3313
3341
|
}
|
3314
3342
|
});
|
@@ -3381,7 +3409,7 @@ module.exports = function(Chart) {
|
|
3381
3409
|
this.updateBezierControlPoints();
|
3382
3410
|
},
|
3383
3411
|
|
3384
|
-
update: function
|
3412
|
+
update: function(reset) {
|
3385
3413
|
var me = this;
|
3386
3414
|
var meta = me.getMeta();
|
3387
3415
|
var line = meta.dataset;
|
@@ -3497,7 +3525,7 @@ module.exports = function(Chart) {
|
|
3497
3525
|
var easingDecimal = ease || 1;
|
3498
3526
|
|
3499
3527
|
// Transition Point Locations
|
3500
|
-
helpers.each(meta.data, function(point
|
3528
|
+
helpers.each(meta.data, function(point) {
|
3501
3529
|
point.transition(easingDecimal);
|
3502
3530
|
});
|
3503
3531
|
|
@@ -3673,6 +3701,111 @@ module.exports = function(Chart) {
|
|
3673
3701
|
},{}],22:[function(require,module,exports){
|
3674
3702
|
"use strict";
|
3675
3703
|
|
3704
|
+
module.exports = function(Chart) {
|
3705
|
+
// Global Chart canvas helpers object for drawing items to canvas
|
3706
|
+
var helpers = Chart.canvasHelpers = {};
|
3707
|
+
|
3708
|
+
helpers.drawPoint = function(ctx, pointStyle, radius, x, y) {
|
3709
|
+
var type, edgeLength, xOffset, yOffset, height, size;
|
3710
|
+
|
3711
|
+
if (typeof pointStyle === 'object') {
|
3712
|
+
type = pointStyle.toString();
|
3713
|
+
if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {
|
3714
|
+
ctx.drawImage(pointStyle, x - pointStyle.width / 2, y - pointStyle.height / 2);
|
3715
|
+
return;
|
3716
|
+
}
|
3717
|
+
}
|
3718
|
+
|
3719
|
+
if (isNaN(radius) || radius <= 0) {
|
3720
|
+
return;
|
3721
|
+
}
|
3722
|
+
|
3723
|
+
switch (pointStyle) {
|
3724
|
+
// Default includes circle
|
3725
|
+
default:
|
3726
|
+
ctx.beginPath();
|
3727
|
+
ctx.arc(x, y, radius, 0, Math.PI * 2);
|
3728
|
+
ctx.closePath();
|
3729
|
+
ctx.fill();
|
3730
|
+
break;
|
3731
|
+
case 'triangle':
|
3732
|
+
ctx.beginPath();
|
3733
|
+
edgeLength = 3 * radius / Math.sqrt(3);
|
3734
|
+
height = edgeLength * Math.sqrt(3) / 2;
|
3735
|
+
ctx.moveTo(x - edgeLength / 2, y + height / 3);
|
3736
|
+
ctx.lineTo(x + edgeLength / 2, y + height / 3);
|
3737
|
+
ctx.lineTo(x, y - 2 * height / 3);
|
3738
|
+
ctx.closePath();
|
3739
|
+
ctx.fill();
|
3740
|
+
break;
|
3741
|
+
case 'rect':
|
3742
|
+
size = 1 / Math.SQRT2 * radius;
|
3743
|
+
ctx.beginPath();
|
3744
|
+
ctx.fillRect(x - size, y - size, 2 * size, 2 * size);
|
3745
|
+
ctx.strokeRect(x - size, y - size, 2 * size, 2 * size);
|
3746
|
+
break;
|
3747
|
+
case 'rectRot':
|
3748
|
+
size = 1 / Math.SQRT2 * radius;
|
3749
|
+
ctx.beginPath();
|
3750
|
+
ctx.moveTo(x - size, y);
|
3751
|
+
ctx.lineTo(x, y + size);
|
3752
|
+
ctx.lineTo(x + size, y);
|
3753
|
+
ctx.lineTo(x, y - size);
|
3754
|
+
ctx.closePath();
|
3755
|
+
ctx.fill();
|
3756
|
+
break;
|
3757
|
+
case 'cross':
|
3758
|
+
ctx.beginPath();
|
3759
|
+
ctx.moveTo(x, y + radius);
|
3760
|
+
ctx.lineTo(x, y - radius);
|
3761
|
+
ctx.moveTo(x - radius, y);
|
3762
|
+
ctx.lineTo(x + radius, y);
|
3763
|
+
ctx.closePath();
|
3764
|
+
break;
|
3765
|
+
case 'crossRot':
|
3766
|
+
ctx.beginPath();
|
3767
|
+
xOffset = Math.cos(Math.PI / 4) * radius;
|
3768
|
+
yOffset = Math.sin(Math.PI / 4) * radius;
|
3769
|
+
ctx.moveTo(x - xOffset, y - yOffset);
|
3770
|
+
ctx.lineTo(x + xOffset, y + yOffset);
|
3771
|
+
ctx.moveTo(x - xOffset, y + yOffset);
|
3772
|
+
ctx.lineTo(x + xOffset, y - yOffset);
|
3773
|
+
ctx.closePath();
|
3774
|
+
break;
|
3775
|
+
case 'star':
|
3776
|
+
ctx.beginPath();
|
3777
|
+
ctx.moveTo(x, y + radius);
|
3778
|
+
ctx.lineTo(x, y - radius);
|
3779
|
+
ctx.moveTo(x - radius, y);
|
3780
|
+
ctx.lineTo(x + radius, y);
|
3781
|
+
xOffset = Math.cos(Math.PI / 4) * radius;
|
3782
|
+
yOffset = Math.sin(Math.PI / 4) * radius;
|
3783
|
+
ctx.moveTo(x - xOffset, y - yOffset);
|
3784
|
+
ctx.lineTo(x + xOffset, y + yOffset);
|
3785
|
+
ctx.moveTo(x - xOffset, y + yOffset);
|
3786
|
+
ctx.lineTo(x + xOffset, y - yOffset);
|
3787
|
+
ctx.closePath();
|
3788
|
+
break;
|
3789
|
+
case 'line':
|
3790
|
+
ctx.beginPath();
|
3791
|
+
ctx.moveTo(x - radius, y);
|
3792
|
+
ctx.lineTo(x + radius, y);
|
3793
|
+
ctx.closePath();
|
3794
|
+
break;
|
3795
|
+
case 'dash':
|
3796
|
+
ctx.beginPath();
|
3797
|
+
ctx.moveTo(x, y);
|
3798
|
+
ctx.lineTo(x + radius, y);
|
3799
|
+
ctx.closePath();
|
3800
|
+
break;
|
3801
|
+
}
|
3802
|
+
|
3803
|
+
ctx.stroke();
|
3804
|
+
};
|
3805
|
+
};
|
3806
|
+
},{}],23:[function(require,module,exports){
|
3807
|
+
"use strict";
|
3808
|
+
|
3676
3809
|
module.exports = function(Chart) {
|
3677
3810
|
|
3678
3811
|
var helpers = Chart.helpers;
|
@@ -3718,7 +3851,7 @@ module.exports = function(Chart) {
|
|
3718
3851
|
|
3719
3852
|
helpers.extend(Chart.Controller.prototype, /** @lends Chart.Controller */ {
|
3720
3853
|
|
3721
|
-
initialize: function
|
3854
|
+
initialize: function() {
|
3722
3855
|
var me = this;
|
3723
3856
|
// Before init plugin notification
|
3724
3857
|
Chart.plugins.notify('beforeInit', [me]);
|
@@ -3741,12 +3874,12 @@ module.exports = function(Chart) {
|
|
3741
3874
|
return me;
|
3742
3875
|
},
|
3743
3876
|
|
3744
|
-
clear: function
|
3877
|
+
clear: function() {
|
3745
3878
|
helpers.clear(this.chart);
|
3746
3879
|
return this;
|
3747
3880
|
},
|
3748
3881
|
|
3749
|
-
stop: function
|
3882
|
+
stop: function() {
|
3750
3883
|
// Stops any current animation loop occuring
|
3751
3884
|
Chart.animationService.cancelAnimation(this);
|
3752
3885
|
return this;
|
@@ -3788,7 +3921,7 @@ module.exports = function(Chart) {
|
|
3788
3921
|
return me;
|
3789
3922
|
},
|
3790
3923
|
|
3791
|
-
ensureScalesHaveIDs: function
|
3924
|
+
ensureScalesHaveIDs: function() {
|
3792
3925
|
var options = this.options;
|
3793
3926
|
var scalesOptions = options.scales || {};
|
3794
3927
|
var scaleOptions = options.scale;
|
@@ -3809,7 +3942,7 @@ module.exports = function(Chart) {
|
|
3809
3942
|
/**
|
3810
3943
|
* Builds a map of scale ID to scale object for future lookup.
|
3811
3944
|
*/
|
3812
|
-
buildScales: function
|
3945
|
+
buildScales: function() {
|
3813
3946
|
var me = this;
|
3814
3947
|
var options = me.options;
|
3815
3948
|
var scales = me.scales = {};
|
@@ -3827,7 +3960,7 @@ module.exports = function(Chart) {
|
|
3827
3960
|
items.push({ options: options.scale, dtype: 'radialLinear', isDefault: true });
|
3828
3961
|
}
|
3829
3962
|
|
3830
|
-
helpers.each(items, function(item
|
3963
|
+
helpers.each(items, function(item) {
|
3831
3964
|
var scaleOptions = item.options;
|
3832
3965
|
var scaleType = helpers.getValueOrDefault(scaleOptions.type, item.dtype);
|
3833
3966
|
var scaleClass = Chart.scaleService.getScaleConstructor(scaleType);
|
@@ -3859,7 +3992,7 @@ module.exports = function(Chart) {
|
|
3859
3992
|
Chart.layoutService.update(this, this.chart.width, this.chart.height);
|
3860
3993
|
},
|
3861
3994
|
|
3862
|
-
buildOrUpdateControllers: function
|
3995
|
+
buildOrUpdateControllers: function() {
|
3863
3996
|
var me = this;
|
3864
3997
|
var types = [];
|
3865
3998
|
var newControllers = [];
|
@@ -3892,7 +4025,7 @@ module.exports = function(Chart) {
|
|
3892
4025
|
return newControllers;
|
3893
4026
|
},
|
3894
4027
|
|
3895
|
-
resetElements: function
|
4028
|
+
resetElements: function() {
|
3896
4029
|
var me = this;
|
3897
4030
|
helpers.each(me.data.datasets, function(dataset, datasetIndex) {
|
3898
4031
|
me.getDatasetMeta(datasetIndex).controller.reset();
|
@@ -4048,7 +4181,7 @@ module.exports = function(Chart) {
|
|
4048
4181
|
helpers.each(me.data.datasets, function(dataset, datasetIndex) {
|
4049
4182
|
if (me.isDatasetVisible(datasetIndex)) {
|
4050
4183
|
var meta = me.getDatasetMeta(datasetIndex);
|
4051
|
-
helpers.each(meta.data, function(element
|
4184
|
+
helpers.each(meta.data, function(element) {
|
4052
4185
|
if (element.inRange(eventPosition.x, eventPosition.y)) {
|
4053
4186
|
elementsArray.push(element);
|
4054
4187
|
return elementsArray;
|
@@ -4057,7 +4190,7 @@ module.exports = function(Chart) {
|
|
4057
4190
|
}
|
4058
4191
|
});
|
4059
4192
|
|
4060
|
-
return elementsArray;
|
4193
|
+
return elementsArray.slice(0, 1);
|
4061
4194
|
},
|
4062
4195
|
|
4063
4196
|
getElementsAtEvent: function(e) {
|
@@ -4084,10 +4217,52 @@ module.exports = function(Chart) {
|
|
4084
4217
|
return elementsArray;
|
4085
4218
|
}
|
4086
4219
|
|
4220
|
+
helpers.each(me.data.datasets, function(dataset, datasetIndex) {
|
4221
|
+
if (me.isDatasetVisible(datasetIndex)) {
|
4222
|
+
var meta = me.getDatasetMeta(datasetIndex),
|
4223
|
+
element = meta.data[found._index];
|
4224
|
+
if(element && !element._view.skip){
|
4225
|
+
elementsArray.push(element);
|
4226
|
+
}
|
4227
|
+
}
|
4228
|
+
}, me);
|
4229
|
+
|
4230
|
+
return elementsArray;
|
4231
|
+
},
|
4232
|
+
|
4233
|
+
getElementsAtXAxis: function(e) {
|
4234
|
+
var me = this;
|
4235
|
+
var eventPosition = helpers.getRelativePosition(e, me.chart);
|
4236
|
+
var elementsArray = [];
|
4237
|
+
|
4238
|
+
var found = (function() {
|
4239
|
+
if (me.data.datasets) {
|
4240
|
+
for (var i = 0; i < me.data.datasets.length; i++) {
|
4241
|
+
var meta = me.getDatasetMeta(i);
|
4242
|
+
if (me.isDatasetVisible(i)) {
|
4243
|
+
for (var j = 0; j < meta.data.length; j++) {
|
4244
|
+
if (meta.data[j].inLabelRange(eventPosition.x, eventPosition.y)) {
|
4245
|
+
return meta.data[j];
|
4246
|
+
}
|
4247
|
+
}
|
4248
|
+
}
|
4249
|
+
}
|
4250
|
+
}
|
4251
|
+
}).call(me);
|
4252
|
+
|
4253
|
+
if (!found) {
|
4254
|
+
return elementsArray;
|
4255
|
+
}
|
4256
|
+
|
4087
4257
|
helpers.each(me.data.datasets, function(dataset, datasetIndex) {
|
4088
4258
|
if (me.isDatasetVisible(datasetIndex)) {
|
4089
4259
|
var meta = me.getDatasetMeta(datasetIndex);
|
4090
|
-
|
4260
|
+
var index = helpers.findIndex(meta.data, function (it) {
|
4261
|
+
return found._model.x === it._model.x;
|
4262
|
+
});
|
4263
|
+
if(index !== -1 && !meta.data[index]._view.skip) {
|
4264
|
+
elementsArray.push(meta.data[index]);
|
4265
|
+
}
|
4091
4266
|
}
|
4092
4267
|
}, me);
|
4093
4268
|
|
@@ -4103,6 +4278,8 @@ module.exports = function(Chart) {
|
|
4103
4278
|
return me.getElementsAtEvent(e);
|
4104
4279
|
case 'dataset':
|
4105
4280
|
return me.getDatasetAtEvent(e);
|
4281
|
+
case 'x-axis':
|
4282
|
+
return me.getElementsAtXAxis(e);
|
4106
4283
|
default:
|
4107
4284
|
return e;
|
4108
4285
|
}
|
@@ -4159,11 +4336,11 @@ module.exports = function(Chart) {
|
|
4159
4336
|
return typeof meta.hidden === 'boolean'? !meta.hidden : !this.data.datasets[datasetIndex].hidden;
|
4160
4337
|
},
|
4161
4338
|
|
4162
|
-
generateLegend: function
|
4339
|
+
generateLegend: function() {
|
4163
4340
|
return this.options.legendCallback(this);
|
4164
4341
|
},
|
4165
4342
|
|
4166
|
-
destroy: function
|
4343
|
+
destroy: function() {
|
4167
4344
|
var me = this;
|
4168
4345
|
me.stop();
|
4169
4346
|
me.clear();
|
@@ -4189,11 +4366,11 @@ module.exports = function(Chart) {
|
|
4189
4366
|
delete Chart.instances[me.id];
|
4190
4367
|
},
|
4191
4368
|
|
4192
|
-
toBase64Image: function
|
4369
|
+
toBase64Image: function() {
|
4193
4370
|
return this.chart.canvas.toDataURL.apply(this.chart.canvas, arguments);
|
4194
4371
|
},
|
4195
4372
|
|
4196
|
-
initToolTip: function
|
4373
|
+
initToolTip: function() {
|
4197
4374
|
var me = this;
|
4198
4375
|
me.tooltip = new Chart.Tooltip({
|
4199
4376
|
_chart: me.chart,
|
@@ -4203,7 +4380,7 @@ module.exports = function(Chart) {
|
|
4203
4380
|
}, me);
|
4204
4381
|
},
|
4205
4382
|
|
4206
|
-
bindEvents: function
|
4383
|
+
bindEvents: function() {
|
4207
4384
|
var me = this;
|
4208
4385
|
helpers.bindEvents(me, me.options.events, function(evt) {
|
4209
4386
|
me.eventHandler(evt);
|
@@ -4220,6 +4397,7 @@ module.exports = function(Chart) {
|
|
4220
4397
|
break;
|
4221
4398
|
case 'label':
|
4222
4399
|
case 'dataset':
|
4400
|
+
case 'x-axis':
|
4223
4401
|
// elements = elements;
|
4224
4402
|
break;
|
4225
4403
|
default:
|
@@ -4313,7 +4491,7 @@ module.exports = function(Chart) {
|
|
4313
4491
|
});
|
4314
4492
|
};
|
4315
4493
|
|
4316
|
-
},{}],
|
4494
|
+
},{}],24:[function(require,module,exports){
|
4317
4495
|
"use strict";
|
4318
4496
|
|
4319
4497
|
module.exports = function(Chart) {
|
@@ -4421,7 +4599,7 @@ module.exports = function(Chart) {
|
|
4421
4599
|
me.updateElement(element, index, true);
|
4422
4600
|
},
|
4423
4601
|
|
4424
|
-
buildOrUpdateElements: function
|
4602
|
+
buildOrUpdateElements: function() {
|
4425
4603
|
// Handle the number of data points changing
|
4426
4604
|
var meta = this.getMeta(),
|
4427
4605
|
md = meta.data,
|
@@ -4444,7 +4622,7 @@ module.exports = function(Chart) {
|
|
4444
4622
|
|
4445
4623
|
draw: function(ease) {
|
4446
4624
|
var easingDecimal = ease || 1;
|
4447
|
-
helpers.each(this.getMeta().data, function(element
|
4625
|
+
helpers.each(this.getMeta().data, function(element) {
|
4448
4626
|
element.transition(easingDecimal).draw();
|
4449
4627
|
});
|
4450
4628
|
},
|
@@ -4454,7 +4632,6 @@ module.exports = function(Chart) {
|
|
4454
4632
|
index = element._index,
|
4455
4633
|
custom = element.custom || {},
|
4456
4634
|
valueOrDefault = helpers.getValueAtIndexOrDefault,
|
4457
|
-
color = helpers.color,
|
4458
4635
|
model = element._model;
|
4459
4636
|
|
4460
4637
|
model.backgroundColor = custom.backgroundColor ? custom.backgroundColor : valueOrDefault(dataset.backgroundColor, index, elementOpts.backgroundColor);
|
@@ -4467,7 +4644,6 @@ module.exports = function(Chart) {
|
|
4467
4644
|
index = element._index,
|
4468
4645
|
custom = element.custom || {},
|
4469
4646
|
valueOrDefault = helpers.getValueAtIndexOrDefault,
|
4470
|
-
color = helpers.color,
|
4471
4647
|
getHoverColor = helpers.getHoverColor,
|
4472
4648
|
model = element._model;
|
4473
4649
|
|
@@ -4475,11 +4651,13 @@ module.exports = function(Chart) {
|
|
4475
4651
|
model.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : valueOrDefault(dataset.hoverBorderColor, index, getHoverColor(model.borderColor));
|
4476
4652
|
model.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : valueOrDefault(dataset.hoverBorderWidth, index, model.borderWidth);
|
4477
4653
|
}
|
4478
|
-
|
4654
|
+
|
4655
|
+
});
|
4656
|
+
|
4479
4657
|
|
4480
4658
|
Chart.DatasetController.extend = helpers.inherits;
|
4481
4659
|
};
|
4482
|
-
},{}],
|
4660
|
+
},{}],25:[function(require,module,exports){
|
4483
4661
|
"use strict";
|
4484
4662
|
|
4485
4663
|
module.exports = function(Chart) {
|
@@ -4585,7 +4763,7 @@ module.exports = function(Chart) {
|
|
4585
4763
|
|
4586
4764
|
};
|
4587
4765
|
|
4588
|
-
},{}],
|
4766
|
+
},{}],26:[function(require,module,exports){
|
4589
4767
|
/*global window: false */
|
4590
4768
|
/*global document: false */
|
4591
4769
|
"use strict";
|
@@ -5534,7 +5712,7 @@ module.exports = function(Chart) {
|
|
5534
5712
|
};
|
5535
5713
|
};
|
5536
5714
|
|
5537
|
-
},{"3":3}],
|
5715
|
+
},{"3":3}],27:[function(require,module,exports){
|
5538
5716
|
"use strict";
|
5539
5717
|
|
5540
5718
|
module.exports = function() {
|
@@ -5543,7 +5721,11 @@ module.exports = function() {
|
|
5543
5721
|
var Chart = function(context, config) {
|
5544
5722
|
var me = this;
|
5545
5723
|
var helpers = Chart.helpers;
|
5546
|
-
me.config = config
|
5724
|
+
me.config = config || {
|
5725
|
+
data: {
|
5726
|
+
datasets: []
|
5727
|
+
}
|
5728
|
+
};
|
5547
5729
|
|
5548
5730
|
// Support a jQuery'd canvas element
|
5549
5731
|
if (context.length && context[0].getContext) {
|
@@ -5582,10 +5764,7 @@ module.exports = function() {
|
|
5582
5764
|
|
5583
5765
|
// High pixel density displays - multiply the size of the canvas height/width by the device pixel ratio, then scale.
|
5584
5766
|
helpers.retinaScale(me);
|
5585
|
-
|
5586
|
-
if (config) {
|
5587
|
-
me.controller = new Chart.Controller(me);
|
5588
|
-
}
|
5767
|
+
me.controller = new Chart.Controller(me);
|
5589
5768
|
|
5590
5769
|
// Always bind this so that if the responsive state changes we still work
|
5591
5770
|
helpers.addResizeListener(context.canvas.parentNode, function() {
|
@@ -5645,7 +5824,7 @@ module.exports = function() {
|
|
5645
5824
|
|
5646
5825
|
};
|
5647
5826
|
|
5648
|
-
},{}],
|
5827
|
+
},{}],28:[function(require,module,exports){
|
5649
5828
|
"use strict";
|
5650
5829
|
|
5651
5830
|
module.exports = function(Chart) {
|
@@ -5915,8 +6094,6 @@ module.exports = function(Chart) {
|
|
5915
6094
|
// Step 7 - Position the boxes
|
5916
6095
|
var left = xPadding;
|
5917
6096
|
var top = yPadding;
|
5918
|
-
var right = 0;
|
5919
|
-
var bottom = 0;
|
5920
6097
|
|
5921
6098
|
helpers.each(leftBoxes.concat(topBoxes), placeBox);
|
5922
6099
|
|
@@ -5970,7 +6147,7 @@ module.exports = function(Chart) {
|
|
5970
6147
|
};
|
5971
6148
|
};
|
5972
6149
|
|
5973
|
-
},{}],
|
6150
|
+
},{}],29:[function(require,module,exports){
|
5974
6151
|
"use strict";
|
5975
6152
|
|
5976
6153
|
module.exports = function(Chart) {
|
@@ -6025,6 +6202,7 @@ module.exports = function(Chart) {
|
|
6025
6202
|
lineJoin: dataset.borderJoinStyle,
|
6026
6203
|
lineWidth: dataset.borderWidth,
|
6027
6204
|
strokeStyle: dataset.borderColor,
|
6205
|
+
pointStyle: dataset.pointStyle,
|
6028
6206
|
|
6029
6207
|
// Below is extra data used for toggling the datasets
|
6030
6208
|
datasetIndex: i
|
@@ -6174,7 +6352,11 @@ module.exports = function(Chart) {
|
|
6174
6352
|
ctx.textBaseline = 'top';
|
6175
6353
|
|
6176
6354
|
helpers.each(me.legendItems, function(legendItem, i) {
|
6177
|
-
var
|
6355
|
+
var boxWidth = labelOpts.usePointStyle ?
|
6356
|
+
fontSize * Math.sqrt(2) :
|
6357
|
+
labelOpts.boxWidth;
|
6358
|
+
|
6359
|
+
var width = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;
|
6178
6360
|
if (lineWidths[lineWidths.length - 1] + width + labelOpts.padding >= me.width) {
|
6179
6361
|
totalHeight += fontSize + (labelOpts.padding);
|
6180
6362
|
lineWidths[lineWidths.length] = me.left;
|
@@ -6202,7 +6384,11 @@ module.exports = function(Chart) {
|
|
6202
6384
|
var itemHeight = fontSize + vPadding;
|
6203
6385
|
|
6204
6386
|
helpers.each(me.legendItems, function(legendItem, i) {
|
6205
|
-
|
6387
|
+
// If usePointStyle is set, multiple boxWidth by 2 since it represents
|
6388
|
+
// the radius and not truly the width
|
6389
|
+
var boxWidth = labelOpts.usePointStyle ? 2 * labelOpts.boxWidth : labelOpts.boxWidth;
|
6390
|
+
|
6391
|
+
var itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;
|
6206
6392
|
|
6207
6393
|
// If too tall, go to new column
|
6208
6394
|
if (currentColHeight + itemHeight > minSize.height) {
|
@@ -6250,7 +6436,6 @@ module.exports = function(Chart) {
|
|
6250
6436
|
var globalDefault = Chart.defaults.global,
|
6251
6437
|
lineDefault = globalDefault.elements.line,
|
6252
6438
|
legendWidth = me.width,
|
6253
|
-
legendHeight = me.height,
|
6254
6439
|
lineWidths = me.lineWidths;
|
6255
6440
|
|
6256
6441
|
if (opts.display) {
|
@@ -6276,6 +6461,10 @@ module.exports = function(Chart) {
|
|
6276
6461
|
|
6277
6462
|
// current position
|
6278
6463
|
var drawLegendBox = function(x, y, legendItem) {
|
6464
|
+
if (isNaN(boxWidth) || boxWidth <= 0) {
|
6465
|
+
return;
|
6466
|
+
}
|
6467
|
+
|
6279
6468
|
// Set the ctx for the box
|
6280
6469
|
ctx.save();
|
6281
6470
|
|
@@ -6291,9 +6480,22 @@ module.exports = function(Chart) {
|
|
6291
6480
|
ctx.setLineDash(itemOrDefault(legendItem.lineDash, lineDefault.borderDash));
|
6292
6481
|
}
|
6293
6482
|
|
6294
|
-
|
6295
|
-
|
6296
|
-
|
6483
|
+
if (opts.labels && opts.labels.usePointStyle) {
|
6484
|
+
// Recalulate x and y for drawPoint() because its expecting
|
6485
|
+
// x and y to be center of figure (instead of top left)
|
6486
|
+
var radius = fontSize * Math.SQRT2 / 2;
|
6487
|
+
var offSet = radius / Math.SQRT2;
|
6488
|
+
var centerX = x + offSet;
|
6489
|
+
var centerY = y + offSet;
|
6490
|
+
|
6491
|
+
// Draw pointStyle as legend symbol
|
6492
|
+
Chart.canvasHelpers.drawPoint(ctx, legendItem.pointStyle, radius, centerX, centerY);
|
6493
|
+
}
|
6494
|
+
else {
|
6495
|
+
// Draw box as legend symbol
|
6496
|
+
ctx.strokeRect(x, y, boxWidth, fontSize);
|
6497
|
+
ctx.fillRect(x, y, boxWidth, fontSize);
|
6498
|
+
}
|
6297
6499
|
|
6298
6500
|
ctx.restore();
|
6299
6501
|
};
|
@@ -6321,7 +6523,7 @@ module.exports = function(Chart) {
|
|
6321
6523
|
} else {
|
6322
6524
|
cursor = {
|
6323
6525
|
x: me.left + labelOpts.padding,
|
6324
|
-
y: me.top,
|
6526
|
+
y: me.top + labelOpts.padding,
|
6325
6527
|
line: 0
|
6326
6528
|
};
|
6327
6529
|
}
|
@@ -6329,13 +6531,15 @@ module.exports = function(Chart) {
|
|
6329
6531
|
var itemHeight = fontSize + labelOpts.padding;
|
6330
6532
|
helpers.each(me.legendItems, function(legendItem, i) {
|
6331
6533
|
var textWidth = ctx.measureText(legendItem.text).width,
|
6332
|
-
width =
|
6534
|
+
width = labelOpts.usePointStyle ?
|
6535
|
+
fontSize + (fontSize / 2) + textWidth :
|
6536
|
+
boxWidth + (fontSize / 2) + textWidth,
|
6333
6537
|
x = cursor.x,
|
6334
6538
|
y = cursor.y;
|
6335
6539
|
|
6336
6540
|
if (isHorizontal) {
|
6337
6541
|
if (x + width >= legendWidth) {
|
6338
|
-
y = cursor.y +=
|
6542
|
+
y = cursor.y += itemHeight;
|
6339
6543
|
cursor.line++;
|
6340
6544
|
x = cursor.x = me.left + ((legendWidth - lineWidths[cursor.line]) / 2);
|
6341
6545
|
}
|
@@ -6347,7 +6551,6 @@ module.exports = function(Chart) {
|
|
6347
6551
|
}
|
6348
6552
|
}
|
6349
6553
|
|
6350
|
-
|
6351
6554
|
drawLegendBox(x, y, legendItem);
|
6352
6555
|
|
6353
6556
|
hitboxes[i].left = x;
|
@@ -6411,7 +6614,7 @@ module.exports = function(Chart) {
|
|
6411
6614
|
});
|
6412
6615
|
};
|
6413
6616
|
|
6414
|
-
},{}],
|
6617
|
+
},{}],30:[function(require,module,exports){
|
6415
6618
|
"use strict";
|
6416
6619
|
|
6417
6620
|
module.exports = function(Chart) {
|
@@ -6542,7 +6745,7 @@ module.exports = function(Chart) {
|
|
6542
6745
|
Chart.pluginService = Chart.plugins;
|
6543
6746
|
};
|
6544
6747
|
|
6545
|
-
},{}],
|
6748
|
+
},{}],31:[function(require,module,exports){
|
6546
6749
|
"use strict";
|
6547
6750
|
|
6548
6751
|
module.exports = function(Chart) {
|
@@ -6829,9 +7032,6 @@ module.exports = function(Chart) {
|
|
6829
7032
|
var tickLabelFont = helpers.fontString(tickFontSize, tickFontStyle, tickFontFamily);
|
6830
7033
|
|
6831
7034
|
var scaleLabelFontSize = helpers.getValueOrDefault(scaleLabelOpts.fontSize, globalDefaults.defaultFontSize);
|
6832
|
-
var scaleLabelFontStyle = helpers.getValueOrDefault(scaleLabelOpts.fontStyle, globalDefaults.defaultFontStyle);
|
6833
|
-
var scaleLabelFontFamily = helpers.getValueOrDefault(scaleLabelOpts.fontFamily, globalDefaults.defaultFontFamily);
|
6834
|
-
var scaleLabelFont = helpers.fontString(scaleLabelFontSize, scaleLabelFontStyle, scaleLabelFontFamily);
|
6835
7035
|
|
6836
7036
|
var tickMarkLength = opts.gridLines.tickMarkLength;
|
6837
7037
|
|
@@ -6938,7 +7138,7 @@ module.exports = function(Chart) {
|
|
6938
7138
|
},
|
6939
7139
|
|
6940
7140
|
// Get the correct value. NaN bad inputs, If the value type is object get the x or y based on whether we are horizontal or not
|
6941
|
-
getRightValue: function
|
7141
|
+
getRightValue: function(rawValue) {
|
6942
7142
|
// Null and undefined values first
|
6943
7143
|
if (rawValue === null || typeof(rawValue) === 'undefined') {
|
6944
7144
|
return NaN;
|
@@ -6952,7 +7152,7 @@ module.exports = function(Chart) {
|
|
6952
7152
|
if ((rawValue instanceof Date) || (rawValue.isValid)) {
|
6953
7153
|
return rawValue;
|
6954
7154
|
} else {
|
6955
|
-
return getRightValue(this.isHorizontal() ? rawValue.x : rawValue.y);
|
7155
|
+
return this.getRightValue(this.isHorizontal() ? rawValue.x : rawValue.y);
|
6956
7156
|
}
|
6957
7157
|
}
|
6958
7158
|
|
@@ -7059,9 +7259,7 @@ module.exports = function(Chart) {
|
|
7059
7259
|
|
7060
7260
|
var labelRotationRadians = helpers.toRadians(me.labelRotation);
|
7061
7261
|
var cosRotation = Math.cos(labelRotationRadians);
|
7062
|
-
var sinRotation = Math.sin(labelRotationRadians);
|
7063
7262
|
var longestRotatedLabel = me.longestLabelWidth * cosRotation;
|
7064
|
-
var rotatedLabelHeight = tickFontSize * sinRotation;
|
7065
7263
|
|
7066
7264
|
// Make sure we draw text in the correct color and font
|
7067
7265
|
context.fillStyle = tickFontColor;
|
@@ -7071,11 +7269,11 @@ module.exports = function(Chart) {
|
|
7071
7269
|
if (isHorizontal) {
|
7072
7270
|
skipRatio = false;
|
7073
7271
|
|
7074
|
-
|
7075
|
-
|
7076
|
-
|
7077
|
-
|
7078
|
-
|
7272
|
+
// Only calculate the skip ratio with the half width of longestRotateLabel if we got an actual rotation
|
7273
|
+
// See #2584
|
7274
|
+
if (isRotated) {
|
7275
|
+
longestRotatedLabel /= 2;
|
7276
|
+
}
|
7079
7277
|
|
7080
7278
|
if ((longestRotatedLabel + optionTicks.autoSkipPadding) * me.ticks.length > (me.width - (me.paddingLeft + me.paddingRight))) {
|
7081
7279
|
skipRatio = 1 + Math.floor(((longestRotatedLabel + optionTicks.autoSkipPadding) * me.ticks.length) / (me.width - (me.paddingLeft + me.paddingRight)));
|
@@ -7298,7 +7496,7 @@ module.exports = function(Chart) {
|
|
7298
7496
|
});
|
7299
7497
|
};
|
7300
7498
|
|
7301
|
-
},{}],
|
7499
|
+
},{}],32:[function(require,module,exports){
|
7302
7500
|
"use strict";
|
7303
7501
|
|
7304
7502
|
module.exports = function(Chart) {
|
@@ -7339,7 +7537,7 @@ module.exports = function(Chart) {
|
|
7339
7537
|
}
|
7340
7538
|
};
|
7341
7539
|
};
|
7342
|
-
},{}],
|
7540
|
+
},{}],33:[function(require,module,exports){
|
7343
7541
|
"use strict";
|
7344
7542
|
|
7345
7543
|
module.exports = function(Chart) {
|
@@ -7453,9 +7651,7 @@ module.exports = function(Chart) {
|
|
7453
7651
|
|
7454
7652
|
beforeFit: noop,
|
7455
7653
|
fit: function() {
|
7456
|
-
|
7457
7654
|
var me = this,
|
7458
|
-
ctx = me.ctx,
|
7459
7655
|
valueOrDefault = helpers.getValueOrDefault,
|
7460
7656
|
opts = me.options,
|
7461
7657
|
globalDefaults = Chart.defaults.global,
|
@@ -7547,7 +7743,7 @@ module.exports = function(Chart) {
|
|
7547
7743
|
});
|
7548
7744
|
};
|
7549
7745
|
|
7550
|
-
},{}],
|
7746
|
+
},{}],34:[function(require,module,exports){
|
7551
7747
|
"use strict";
|
7552
7748
|
|
7553
7749
|
module.exports = function(Chart) {
|
@@ -7666,9 +7862,11 @@ module.exports = function(Chart) {
|
|
7666
7862
|
|
7667
7863
|
var x = 0,
|
7668
7864
|
y = 0;
|
7669
|
-
for (i = 0
|
7670
|
-
|
7671
|
-
|
7865
|
+
for (i = 0; i < xPositions.length; ++i) {
|
7866
|
+
if (xPositions[ i ]) {
|
7867
|
+
x += xPositions[i];
|
7868
|
+
y += yPositions[i];
|
7869
|
+
}
|
7672
7870
|
}
|
7673
7871
|
|
7674
7872
|
return {
|
@@ -7706,8 +7904,8 @@ module.exports = function(Chart) {
|
|
7706
7904
|
// Positioning
|
7707
7905
|
xPadding: tooltipOpts.xPadding,
|
7708
7906
|
yPadding: tooltipOpts.yPadding,
|
7709
|
-
xAlign : tooltipOpts.
|
7710
|
-
yAlign : tooltipOpts.
|
7907
|
+
xAlign : tooltipOpts.xAlign,
|
7908
|
+
yAlign : tooltipOpts.yAlign,
|
7711
7909
|
|
7712
7910
|
// Body
|
7713
7911
|
bodyFontColor: tooltipOpts.bodyFontColor,
|
@@ -7878,7 +8076,7 @@ module.exports = function(Chart) {
|
|
7878
8076
|
|
7879
8077
|
return me;
|
7880
8078
|
},
|
7881
|
-
getTooltipSize: function
|
8079
|
+
getTooltipSize: function(vm) {
|
7882
8080
|
var ctx = this._chart.ctx;
|
7883
8081
|
|
7884
8082
|
var size = {
|
@@ -7941,7 +8139,7 @@ module.exports = function(Chart) {
|
|
7941
8139
|
|
7942
8140
|
return size;
|
7943
8141
|
},
|
7944
|
-
determineAlignment: function
|
8142
|
+
determineAlignment: function(size) {
|
7945
8143
|
var me = this;
|
7946
8144
|
var model = me._model;
|
7947
8145
|
var chart = me._chart;
|
@@ -8003,7 +8201,7 @@ module.exports = function(Chart) {
|
|
8003
8201
|
}
|
8004
8202
|
}
|
8005
8203
|
},
|
8006
|
-
getBackgroundPoint: function
|
8204
|
+
getBackgroundPoint: function(vm, size) {
|
8007
8205
|
// Background Position
|
8008
8206
|
var pt = {
|
8009
8207
|
x: vm.x,
|
@@ -8048,7 +8246,7 @@ module.exports = function(Chart) {
|
|
8048
8246
|
|
8049
8247
|
return pt;
|
8050
8248
|
},
|
8051
|
-
drawCaret: function
|
8249
|
+
drawCaret: function(tooltipPoint, size, opacity) {
|
8052
8250
|
var vm = this._view;
|
8053
8251
|
var ctx = this._chart.ctx;
|
8054
8252
|
var x1, x2, x3;
|
@@ -8112,7 +8310,7 @@ module.exports = function(Chart) {
|
|
8112
8310
|
ctx.closePath();
|
8113
8311
|
ctx.fill();
|
8114
8312
|
},
|
8115
|
-
drawTitle: function
|
8313
|
+
drawTitle: function(pt, vm, ctx, opacity) {
|
8116
8314
|
var title = vm.title;
|
8117
8315
|
|
8118
8316
|
if (title.length) {
|
@@ -8137,7 +8335,7 @@ module.exports = function(Chart) {
|
|
8137
8335
|
}
|
8138
8336
|
}
|
8139
8337
|
},
|
8140
|
-
drawBody: function
|
8338
|
+
drawBody: function(pt, vm, ctx, opacity) {
|
8141
8339
|
var bodyFontSize = vm.bodyFontSize;
|
8142
8340
|
var bodySpacing = vm.bodySpacing;
|
8143
8341
|
var body = vm.body;
|
@@ -8198,7 +8396,7 @@ module.exports = function(Chart) {
|
|
8198
8396
|
helpers.each(vm.afterBody, fillLineOfText);
|
8199
8397
|
pt.y -= bodySpacing; // Remove last body spacing
|
8200
8398
|
},
|
8201
|
-
drawFooter: function
|
8399
|
+
drawFooter: function(pt, vm, ctx, opacity) {
|
8202
8400
|
var footer = vm.footer;
|
8203
8401
|
|
8204
8402
|
if (footer.length) {
|
@@ -8217,7 +8415,7 @@ module.exports = function(Chart) {
|
|
8217
8415
|
});
|
8218
8416
|
}
|
8219
8417
|
},
|
8220
|
-
draw: function
|
8418
|
+
draw: function() {
|
8221
8419
|
var ctx = this._chart.ctx;
|
8222
8420
|
var vm = this._view;
|
8223
8421
|
|
@@ -8242,7 +8440,7 @@ module.exports = function(Chart) {
|
|
8242
8440
|
ctx.fill();
|
8243
8441
|
|
8244
8442
|
// Draw Caret
|
8245
|
-
this.drawCaret(pt, tooltipSize, opacity
|
8443
|
+
this.drawCaret(pt, tooltipSize, opacity);
|
8246
8444
|
|
8247
8445
|
// Draw Title, Body, and Footer
|
8248
8446
|
pt.x += vm.xPadding;
|
@@ -8261,10 +8459,10 @@ module.exports = function(Chart) {
|
|
8261
8459
|
});
|
8262
8460
|
};
|
8263
8461
|
|
8264
|
-
},{}],
|
8462
|
+
},{}],35:[function(require,module,exports){
|
8265
8463
|
"use strict";
|
8266
8464
|
|
8267
|
-
module.exports = function(Chart
|
8465
|
+
module.exports = function(Chart) {
|
8268
8466
|
|
8269
8467
|
var helpers = Chart.helpers,
|
8270
8468
|
globalOpts = Chart.defaults.global;
|
@@ -8356,7 +8554,7 @@ module.exports = function(Chart, moment) {
|
|
8356
8554
|
});
|
8357
8555
|
};
|
8358
8556
|
|
8359
|
-
},{}],
|
8557
|
+
},{}],36:[function(require,module,exports){
|
8360
8558
|
"use strict";
|
8361
8559
|
|
8362
8560
|
module.exports = function(Chart) {
|
@@ -8373,108 +8571,110 @@ module.exports = function(Chart) {
|
|
8373
8571
|
borderDash: [],
|
8374
8572
|
borderDashOffset: 0.0,
|
8375
8573
|
borderJoinStyle: 'miter',
|
8574
|
+
capBezierPoints: true,
|
8376
8575
|
fill: true // do we fill in the area between the line and its base axis
|
8377
8576
|
};
|
8378
8577
|
|
8379
8578
|
Chart.elements.Line = Chart.Element.extend({
|
8380
|
-
lineToNextPoint: function(previousPoint, point, nextPoint, skipHandler, previousSkipHandler) {
|
8381
|
-
var me = this;
|
8382
|
-
var ctx = me._chart.ctx;
|
8383
|
-
var spanGaps = me._view ? me._view.spanGaps : false;
|
8384
|
-
|
8385
|
-
if (point._view.skip && !spanGaps) {
|
8386
|
-
skipHandler.call(me, previousPoint, point, nextPoint);
|
8387
|
-
} else if (previousPoint._view.skip && !spanGaps) {
|
8388
|
-
previousSkipHandler.call(me, previousPoint, point, nextPoint);
|
8389
|
-
} else if (point._view.tension === 0) {
|
8390
|
-
ctx.lineTo(point._view.x, point._view.y);
|
8391
|
-
} else {
|
8392
|
-
// Line between points
|
8393
|
-
ctx.bezierCurveTo(
|
8394
|
-
previousPoint._view.controlPointNextX,
|
8395
|
-
previousPoint._view.controlPointNextY,
|
8396
|
-
point._view.controlPointPreviousX,
|
8397
|
-
point._view.controlPointPreviousY,
|
8398
|
-
point._view.x,
|
8399
|
-
point._view.y
|
8400
|
-
);
|
8401
|
-
}
|
8402
|
-
},
|
8403
|
-
|
8404
8579
|
draw: function() {
|
8405
8580
|
var me = this;
|
8406
|
-
|
8407
8581
|
var vm = me._view;
|
8582
|
+
var spanGaps = vm.spanGaps;
|
8583
|
+
var scaleZero = vm.scaleZero;
|
8584
|
+
var loop = me._loop;
|
8585
|
+
|
8408
8586
|
var ctx = me._chart.ctx;
|
8409
|
-
|
8410
|
-
var last = me._children[me._children.length - 1];
|
8587
|
+
ctx.save();
|
8411
8588
|
|
8412
|
-
function
|
8413
|
-
|
8414
|
-
|
8589
|
+
// Helper function to draw a line to a point
|
8590
|
+
function lineToPoint(previousPoint, point) {
|
8591
|
+
var vm = point._view;
|
8592
|
+
if (point._view.steppedLine === true) {
|
8593
|
+
ctx.lineTo(point._view.x, previousPoint._view.y);
|
8594
|
+
ctx.lineTo(point._view.x, point._view.y);
|
8595
|
+
} else if (point._view.tension === 0) {
|
8596
|
+
ctx.lineTo(vm.x, vm.y);
|
8597
|
+
} else {
|
8415
8598
|
ctx.bezierCurveTo(
|
8416
|
-
|
8417
|
-
|
8418
|
-
|
8419
|
-
|
8420
|
-
|
8421
|
-
|
8599
|
+
previousPoint._view.controlPointNextX,
|
8600
|
+
previousPoint._view.controlPointNextY,
|
8601
|
+
vm.controlPointPreviousX,
|
8602
|
+
vm.controlPointPreviousY,
|
8603
|
+
vm.x,
|
8604
|
+
vm.y
|
8422
8605
|
);
|
8423
|
-
} else if (drawLineToCenter) {
|
8424
|
-
// Go to center
|
8425
|
-
ctx.lineTo(me._view.scaleZero.x, me._view.scaleZero.y);
|
8426
8606
|
}
|
8427
8607
|
}
|
8428
8608
|
|
8429
|
-
|
8609
|
+
var points = me._children.slice(); // clone array
|
8610
|
+
var lastDrawnIndex = -1;
|
8611
|
+
|
8612
|
+
// If we are looping, adding the first point again
|
8613
|
+
if (loop && points.length) {
|
8614
|
+
points.push(points[0]);
|
8615
|
+
}
|
8430
8616
|
|
8431
|
-
|
8432
|
-
|
8433
|
-
|
8617
|
+
var index, current, previous, currentVM;
|
8618
|
+
|
8619
|
+
// Fill Line
|
8620
|
+
if (points.length && vm.fill) {
|
8434
8621
|
ctx.beginPath();
|
8435
8622
|
|
8436
|
-
|
8437
|
-
|
8438
|
-
|
8623
|
+
for (index = 0; index < points.length; ++index) {
|
8624
|
+
current = points[index];
|
8625
|
+
previous = helpers.previousItem(points, index);
|
8626
|
+
currentVM = current._view;
|
8439
8627
|
|
8440
8628
|
// First point moves to it's starting position no matter what
|
8441
8629
|
if (index === 0) {
|
8442
|
-
if (
|
8443
|
-
ctx.moveTo(
|
8630
|
+
if (loop) {
|
8631
|
+
ctx.moveTo(scaleZero.x, scaleZero.y);
|
8444
8632
|
} else {
|
8445
|
-
ctx.moveTo(
|
8633
|
+
ctx.moveTo(currentVM.x, scaleZero);
|
8446
8634
|
}
|
8447
8635
|
|
8448
|
-
if (
|
8449
|
-
|
8450
|
-
|
8451
|
-
}
|
8452
|
-
} else {
|
8453
|
-
ctx.lineTo(point._view.x, point._view.y);
|
8636
|
+
if (!currentVM.skip) {
|
8637
|
+
lastDrawnIndex = index;
|
8638
|
+
ctx.lineTo(currentVM.x, currentVM.y);
|
8454
8639
|
}
|
8455
8640
|
} else {
|
8456
|
-
|
8457
|
-
|
8458
|
-
|
8459
|
-
|
8641
|
+
previous = lastDrawnIndex === -1 ? previous : points[lastDrawnIndex];
|
8642
|
+
|
8643
|
+
if (currentVM.skip) {
|
8644
|
+
// Only do this if this is the first point that is skipped
|
8645
|
+
if (!spanGaps && lastDrawnIndex === (index - 1)) {
|
8646
|
+
if (loop) {
|
8647
|
+
ctx.lineTo(scaleZero.x, scaleZero.y);
|
8648
|
+
} else {
|
8649
|
+
ctx.lineTo(previous._view.x, scaleZero);
|
8650
|
+
}
|
8651
|
+
}
|
8652
|
+
} else {
|
8653
|
+
if (lastDrawnIndex !== (index - 1)) {
|
8654
|
+
// There was a gap and this is the first point after the gap. If we've never drawn a point, this is a special case.
|
8655
|
+
// If the first data point is NaN, then there is no real gap to skip
|
8656
|
+
if (spanGaps && lastDrawnIndex !== -1) {
|
8657
|
+
// We are spanning the gap, so simple draw a line to this point
|
8658
|
+
lineToPoint(previous, current);
|
8659
|
+
} else {
|
8660
|
+
if (loop) {
|
8661
|
+
ctx.lineTo(currentVM.x, currentVM.y);
|
8662
|
+
} else {
|
8663
|
+
ctx.lineTo(currentVM.x, scaleZero);
|
8664
|
+
ctx.lineTo(currentVM.x, currentVM.y);
|
8665
|
+
}
|
8666
|
+
}
|
8460
8667
|
} else {
|
8461
|
-
|
8462
|
-
|
8668
|
+
// Line to next point
|
8669
|
+
lineToPoint(previous, current);
|
8463
8670
|
}
|
8464
|
-
|
8465
|
-
|
8466
|
-
ctx.lineTo(point._view.x, point._view.y);
|
8467
|
-
});
|
8671
|
+
lastDrawnIndex = index;
|
8672
|
+
}
|
8468
8673
|
}
|
8469
|
-
}
|
8674
|
+
}
|
8470
8675
|
|
8471
|
-
|
8472
|
-
|
8473
|
-
loopBackToStart(true);
|
8474
|
-
} else {
|
8475
|
-
//Round off the line by going to the base of the chart, back to the start, then fill.
|
8476
|
-
ctx.lineTo(me._children[me._children.length - 1]._view.x, vm.scaleZero);
|
8477
|
-
ctx.lineTo(me._children[0]._view.x, vm.scaleZero);
|
8676
|
+
if (!loop) {
|
8677
|
+
ctx.lineTo(points[lastDrawnIndex]._view.x, scaleZero);
|
8478
8678
|
}
|
8479
8679
|
|
8480
8680
|
ctx.fillStyle = vm.backgroundColor || globalDefaults.defaultColor;
|
@@ -8482,8 +8682,8 @@ module.exports = function(Chart) {
|
|
8482
8682
|
ctx.fill();
|
8483
8683
|
}
|
8484
8684
|
|
8685
|
+
// Stroke Line Options
|
8485
8686
|
var globalOptionLineElements = globalDefaults.elements.line;
|
8486
|
-
// Now draw the line between all the points with any borders
|
8487
8687
|
ctx.lineCap = vm.borderCapStyle || globalOptionLineElements.borderCapStyle;
|
8488
8688
|
|
8489
8689
|
// IE 9 and 10 do not support line dash
|
@@ -8495,26 +8695,38 @@ module.exports = function(Chart) {
|
|
8495
8695
|
ctx.lineJoin = vm.borderJoinStyle || globalOptionLineElements.borderJoinStyle;
|
8496
8696
|
ctx.lineWidth = vm.borderWidth || globalOptionLineElements.borderWidth;
|
8497
8697
|
ctx.strokeStyle = vm.borderColor || globalDefaults.defaultColor;
|
8698
|
+
|
8699
|
+
// Stroke Line
|
8498
8700
|
ctx.beginPath();
|
8701
|
+
lastDrawnIndex = -1;
|
8499
8702
|
|
8500
|
-
|
8501
|
-
|
8502
|
-
|
8703
|
+
for (index = 0; index < points.length; ++index) {
|
8704
|
+
current = points[index];
|
8705
|
+
previous = helpers.previousItem(points, index);
|
8706
|
+
currentVM = current._view;
|
8503
8707
|
|
8708
|
+
// First point moves to it's starting position no matter what
|
8504
8709
|
if (index === 0) {
|
8505
|
-
|
8710
|
+
if (currentVM.skip) {
|
8711
|
+
|
8712
|
+
} else {
|
8713
|
+
ctx.moveTo(currentVM.x, currentVM.y);
|
8714
|
+
lastDrawnIndex = index;
|
8715
|
+
}
|
8506
8716
|
} else {
|
8507
|
-
|
8508
|
-
ctx.moveTo(nextPoint._view.x, nextPoint._view.y);
|
8509
|
-
}, function(previousPoint, point) {
|
8510
|
-
// If we skipped the last point, move up to our point preventing a line from being drawn
|
8511
|
-
ctx.moveTo(point._view.x, point._view.y);
|
8512
|
-
});
|
8513
|
-
}
|
8514
|
-
}, me);
|
8717
|
+
previous = lastDrawnIndex === -1 ? previous : points[lastDrawnIndex];
|
8515
8718
|
|
8516
|
-
|
8517
|
-
|
8719
|
+
if (!currentVM.skip) {
|
8720
|
+
if ((lastDrawnIndex !== (index - 1) && !spanGaps) || lastDrawnIndex === -1) {
|
8721
|
+
// There was a gap and this is the first point after the gap
|
8722
|
+
ctx.moveTo(currentVM.x, currentVM.y);
|
8723
|
+
} else {
|
8724
|
+
// Line to next point
|
8725
|
+
lineToPoint(previous, current);
|
8726
|
+
}
|
8727
|
+
lastDrawnIndex = index;
|
8728
|
+
}
|
8729
|
+
}
|
8518
8730
|
}
|
8519
8731
|
|
8520
8732
|
ctx.stroke();
|
@@ -8522,7 +8734,7 @@ module.exports = function(Chart) {
|
|
8522
8734
|
}
|
8523
8735
|
});
|
8524
8736
|
};
|
8525
|
-
},{}],
|
8737
|
+
},{}],37:[function(require,module,exports){
|
8526
8738
|
"use strict";
|
8527
8739
|
|
8528
8740
|
module.exports = function(Chart) {
|
@@ -8567,119 +8779,26 @@ module.exports = function(Chart) {
|
|
8567
8779
|
var radius = vm.radius;
|
8568
8780
|
var x = vm.x;
|
8569
8781
|
var y = vm.y;
|
8570
|
-
var type, edgeLength, xOffset, yOffset, height, size;
|
8571
8782
|
|
8572
8783
|
if (vm.skip) {
|
8573
8784
|
return;
|
8574
8785
|
}
|
8575
8786
|
|
8576
|
-
if (typeof pointStyle === 'object') {
|
8577
|
-
type = pointStyle.toString();
|
8578
|
-
if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {
|
8579
|
-
ctx.drawImage(pointStyle, x - pointStyle.width / 2, y - pointStyle.height / 2);
|
8580
|
-
return;
|
8581
|
-
}
|
8582
|
-
}
|
8583
|
-
|
8584
|
-
if (isNaN(radius) || radius <= 0) {
|
8585
|
-
return;
|
8586
|
-
}
|
8587
|
-
|
8588
8787
|
ctx.strokeStyle = vm.borderColor || defaultColor;
|
8589
8788
|
ctx.lineWidth = helpers.getValueOrDefault(vm.borderWidth, globalOpts.elements.point.borderWidth);
|
8590
8789
|
ctx.fillStyle = vm.backgroundColor || defaultColor;
|
8591
8790
|
|
8592
|
-
|
8593
|
-
// Default includes circle
|
8594
|
-
default:
|
8595
|
-
ctx.beginPath();
|
8596
|
-
ctx.arc(x, y, radius, 0, Math.PI * 2);
|
8597
|
-
ctx.closePath();
|
8598
|
-
ctx.fill();
|
8599
|
-
break;
|
8600
|
-
case 'triangle':
|
8601
|
-
ctx.beginPath();
|
8602
|
-
edgeLength = 3 * radius / Math.sqrt(3);
|
8603
|
-
height = edgeLength * Math.sqrt(3) / 2;
|
8604
|
-
ctx.moveTo(x - edgeLength / 2, y + height / 3);
|
8605
|
-
ctx.lineTo(x + edgeLength / 2, y + height / 3);
|
8606
|
-
ctx.lineTo(x, y - 2 * height / 3);
|
8607
|
-
ctx.closePath();
|
8608
|
-
ctx.fill();
|
8609
|
-
break;
|
8610
|
-
case 'rect':
|
8611
|
-
size = 1 / Math.SQRT2 * radius;
|
8612
|
-
ctx.fillRect(x - size, y - size, 2 * size, 2 * size);
|
8613
|
-
ctx.strokeRect(x - size, y - size, 2 * size, 2 * size);
|
8614
|
-
break;
|
8615
|
-
case 'rectRot':
|
8616
|
-
size = 1 / Math.SQRT2 * radius;
|
8617
|
-
ctx.beginPath();
|
8618
|
-
ctx.moveTo(x - size, y);
|
8619
|
-
ctx.lineTo(x, y + size);
|
8620
|
-
ctx.lineTo(x + size, y);
|
8621
|
-
ctx.lineTo(x, y - size);
|
8622
|
-
ctx.closePath();
|
8623
|
-
ctx.fill();
|
8624
|
-
break;
|
8625
|
-
case 'cross':
|
8626
|
-
ctx.beginPath();
|
8627
|
-
ctx.moveTo(x, y + radius);
|
8628
|
-
ctx.lineTo(x, y - radius);
|
8629
|
-
ctx.moveTo(x - radius, y);
|
8630
|
-
ctx.lineTo(x + radius, y);
|
8631
|
-
ctx.closePath();
|
8632
|
-
break;
|
8633
|
-
case 'crossRot':
|
8634
|
-
ctx.beginPath();
|
8635
|
-
xOffset = Math.cos(Math.PI / 4) * radius;
|
8636
|
-
yOffset = Math.sin(Math.PI / 4) * radius;
|
8637
|
-
ctx.moveTo(x - xOffset, y - yOffset);
|
8638
|
-
ctx.lineTo(x + xOffset, y + yOffset);
|
8639
|
-
ctx.moveTo(x - xOffset, y + yOffset);
|
8640
|
-
ctx.lineTo(x + xOffset, y - yOffset);
|
8641
|
-
ctx.closePath();
|
8642
|
-
break;
|
8643
|
-
case 'star':
|
8644
|
-
ctx.beginPath();
|
8645
|
-
ctx.moveTo(x, y + radius);
|
8646
|
-
ctx.lineTo(x, y - radius);
|
8647
|
-
ctx.moveTo(x - radius, y);
|
8648
|
-
ctx.lineTo(x + radius, y);
|
8649
|
-
xOffset = Math.cos(Math.PI / 4) * radius;
|
8650
|
-
yOffset = Math.sin(Math.PI / 4) * radius;
|
8651
|
-
ctx.moveTo(x - xOffset, y - yOffset);
|
8652
|
-
ctx.lineTo(x + xOffset, y + yOffset);
|
8653
|
-
ctx.moveTo(x - xOffset, y + yOffset);
|
8654
|
-
ctx.lineTo(x + xOffset, y - yOffset);
|
8655
|
-
ctx.closePath();
|
8656
|
-
break;
|
8657
|
-
case 'line':
|
8658
|
-
ctx.beginPath();
|
8659
|
-
ctx.moveTo(x - radius, y);
|
8660
|
-
ctx.lineTo(x + radius, y);
|
8661
|
-
ctx.closePath();
|
8662
|
-
break;
|
8663
|
-
case 'dash':
|
8664
|
-
ctx.beginPath();
|
8665
|
-
ctx.moveTo(x, y);
|
8666
|
-
ctx.lineTo(x + radius, y);
|
8667
|
-
ctx.closePath();
|
8668
|
-
break;
|
8669
|
-
}
|
8670
|
-
|
8671
|
-
ctx.stroke();
|
8791
|
+
Chart.canvasHelpers.drawPoint(ctx, pointStyle, radius, x, y);
|
8672
8792
|
}
|
8673
8793
|
});
|
8674
8794
|
};
|
8675
8795
|
|
8676
|
-
},{}],
|
8796
|
+
},{}],38:[function(require,module,exports){
|
8677
8797
|
"use strict";
|
8678
8798
|
|
8679
8799
|
module.exports = function(Chart) {
|
8680
8800
|
|
8681
|
-
var
|
8682
|
-
globalOpts = Chart.defaults.global;
|
8801
|
+
var globalOpts = Chart.defaults.global;
|
8683
8802
|
|
8684
8803
|
globalOpts.elements.rectangle = {
|
8685
8804
|
backgroundColor: globalOpts.defaultColor,
|
@@ -8768,7 +8887,7 @@ module.exports = function(Chart) {
|
|
8768
8887
|
});
|
8769
8888
|
|
8770
8889
|
};
|
8771
|
-
},{}],
|
8890
|
+
},{}],39:[function(require,module,exports){
|
8772
8891
|
"use strict";
|
8773
8892
|
|
8774
8893
|
module.exports = function(Chart) {
|
@@ -8780,36 +8899,47 @@ module.exports = function(Chart) {
|
|
8780
8899
|
};
|
8781
8900
|
|
8782
8901
|
var DatasetScale = Chart.Scale.extend({
|
8902
|
+
/**
|
8903
|
+
* Internal function to get the correct labels. If data.xLabels or data.yLabels are defined, use tose
|
8904
|
+
* else fall back to data.labels
|
8905
|
+
* @private
|
8906
|
+
*/
|
8907
|
+
getLabels: function() {
|
8908
|
+
var data = this.chart.data;
|
8909
|
+
return (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels;
|
8910
|
+
},
|
8783
8911
|
// Implement this so that
|
8784
8912
|
determineDataLimits: function() {
|
8785
8913
|
var me = this;
|
8914
|
+
var labels = me.getLabels();
|
8786
8915
|
me.minIndex = 0;
|
8787
|
-
me.maxIndex =
|
8916
|
+
me.maxIndex = labels.length - 1;
|
8788
8917
|
var findIndex;
|
8789
8918
|
|
8790
8919
|
if (me.options.ticks.min !== undefined) {
|
8791
8920
|
// user specified min value
|
8792
|
-
findIndex = helpers.indexOf(
|
8921
|
+
findIndex = helpers.indexOf(labels, me.options.ticks.min);
|
8793
8922
|
me.minIndex = findIndex !== -1 ? findIndex : me.minIndex;
|
8794
8923
|
}
|
8795
8924
|
|
8796
8925
|
if (me.options.ticks.max !== undefined) {
|
8797
8926
|
// user specified max value
|
8798
|
-
findIndex = helpers.indexOf(
|
8927
|
+
findIndex = helpers.indexOf(labels, me.options.ticks.max);
|
8799
8928
|
me.maxIndex = findIndex !== -1 ? findIndex : me.maxIndex;
|
8800
8929
|
}
|
8801
8930
|
|
8802
|
-
me.min =
|
8803
|
-
me.max =
|
8931
|
+
me.min = labels[me.minIndex];
|
8932
|
+
me.max = labels[me.maxIndex];
|
8804
8933
|
},
|
8805
8934
|
|
8806
|
-
buildTicks: function(
|
8935
|
+
buildTicks: function() {
|
8807
8936
|
var me = this;
|
8937
|
+
var labels = me.getLabels();
|
8808
8938
|
// If we are viewing some subset of labels, slice the original array
|
8809
|
-
me.ticks = (me.minIndex === 0 && me.maxIndex ===
|
8939
|
+
me.ticks = (me.minIndex === 0 && me.maxIndex === labels.length - 1) ? labels : labels.slice(me.minIndex, me.maxIndex + 1);
|
8810
8940
|
},
|
8811
8941
|
|
8812
|
-
getLabelForIndex: function(index
|
8942
|
+
getLabelForIndex: function(index) {
|
8813
8943
|
return this.ticks[index];
|
8814
8944
|
},
|
8815
8945
|
|
@@ -8819,6 +8949,12 @@ module.exports = function(Chart) {
|
|
8819
8949
|
// 1 is added because we need the length but we have the indexes
|
8820
8950
|
var offsetAmt = Math.max((me.maxIndex + 1 - me.minIndex - ((me.options.gridLines.offsetGridLines) ? 0 : 1)), 1);
|
8821
8951
|
|
8952
|
+
if (value !== undefined) {
|
8953
|
+
var labels = me.getLabels();
|
8954
|
+
var idx = labels.indexOf(value);
|
8955
|
+
index = idx !== -1 ? idx : index;
|
8956
|
+
}
|
8957
|
+
|
8822
8958
|
if (me.isHorizontal()) {
|
8823
8959
|
var innerWidth = me.width - (me.paddingLeft + me.paddingRight);
|
8824
8960
|
var valueWidth = innerWidth / offsetAmt;
|
@@ -8852,6 +8988,8 @@ module.exports = function(Chart) {
|
|
8852
8988
|
var innerDimension = horz ? me.width - (me.paddingLeft + me.paddingRight) : me.height - (me.paddingTop + me.paddingBottom);
|
8853
8989
|
var valueDimension = innerDimension / offsetAmt;
|
8854
8990
|
|
8991
|
+
pixel -= horz ? me.left : me.top;
|
8992
|
+
|
8855
8993
|
if (me.options.gridLines.offsetGridLines) {
|
8856
8994
|
pixel -= (valueDimension / 2);
|
8857
8995
|
}
|
@@ -8864,13 +9002,16 @@ module.exports = function(Chart) {
|
|
8864
9002
|
}
|
8865
9003
|
|
8866
9004
|
return value;
|
9005
|
+
},
|
9006
|
+
getBasePixel: function() {
|
9007
|
+
return this.bottom;
|
8867
9008
|
}
|
8868
9009
|
});
|
8869
9010
|
|
8870
9011
|
Chart.scaleService.registerScaleType("category", DatasetScale, defaultConfig);
|
8871
9012
|
|
8872
9013
|
};
|
8873
|
-
},{}],
|
9014
|
+
},{}],40:[function(require,module,exports){
|
8874
9015
|
"use strict";
|
8875
9016
|
|
8876
9017
|
module.exports = function(Chart) {
|
@@ -8912,7 +9053,6 @@ module.exports = function(Chart) {
|
|
8912
9053
|
determineDataLimits: function() {
|
8913
9054
|
var me = this;
|
8914
9055
|
var opts = me.options;
|
8915
|
-
var tickOpts = opts.ticks;
|
8916
9056
|
var chart = me.chart;
|
8917
9057
|
var data = chart.data;
|
8918
9058
|
var datasets = data.datasets;
|
@@ -9032,9 +9172,9 @@ module.exports = function(Chart) {
|
|
9032
9172
|
return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);
|
9033
9173
|
},
|
9034
9174
|
// Utils
|
9035
|
-
getPixelForValue: function(value
|
9175
|
+
getPixelForValue: function(value) {
|
9036
9176
|
// This must be called after fit has been run so that
|
9037
|
-
//
|
9177
|
+
// this.left, this.top, this.right, and this.bottom have been defined
|
9038
9178
|
var me = this;
|
9039
9179
|
var paddingLeft = me.paddingLeft;
|
9040
9180
|
var paddingBottom = me.paddingBottom;
|
@@ -9064,14 +9204,14 @@ module.exports = function(Chart) {
|
|
9064
9204
|
var offset = (isHorizontal ? pixel - me.left - paddingLeft : me.bottom - paddingBottom - pixel) / innerDimension;
|
9065
9205
|
return me.start + ((me.end - me.start) * offset);
|
9066
9206
|
},
|
9067
|
-
getPixelForTick: function(index
|
9068
|
-
return this.getPixelForValue(this.ticksAsNumbers[index]
|
9207
|
+
getPixelForTick: function(index) {
|
9208
|
+
return this.getPixelForValue(this.ticksAsNumbers[index]);
|
9069
9209
|
}
|
9070
9210
|
});
|
9071
9211
|
Chart.scaleService.registerScaleType("linear", LinearScale, defaultConfig);
|
9072
9212
|
|
9073
9213
|
};
|
9074
|
-
},{}],
|
9214
|
+
},{}],41:[function(require,module,exports){
|
9075
9215
|
"use strict";
|
9076
9216
|
|
9077
9217
|
module.exports = function(Chart) {
|
@@ -9127,11 +9267,9 @@ module.exports = function(Chart) {
|
|
9127
9267
|
buildTicks: function() {
|
9128
9268
|
var me = this;
|
9129
9269
|
var opts = me.options;
|
9270
|
+
var ticks = me.ticks = [];
|
9130
9271
|
var tickOpts = opts.ticks;
|
9131
9272
|
var getValueOrDefault = helpers.getValueOrDefault;
|
9132
|
-
var isHorizontal = me.isHorizontal();
|
9133
|
-
|
9134
|
-
var ticks = me.ticks = [];
|
9135
9273
|
|
9136
9274
|
// Figure out what the max number of ticks we can support it is based on the size of
|
9137
9275
|
// the axis area. For now, we say that the minimum tick spacing in pixels must be 50
|
@@ -9199,7 +9337,7 @@ module.exports = function(Chart) {
|
|
9199
9337
|
},
|
9200
9338
|
});
|
9201
9339
|
};
|
9202
|
-
},{}],
|
9340
|
+
},{}],42:[function(require,module,exports){
|
9203
9341
|
"use strict";
|
9204
9342
|
|
9205
9343
|
module.exports = function(Chart) {
|
@@ -9379,10 +9517,10 @@ module.exports = function(Chart) {
|
|
9379
9517
|
getLabelForIndex: function(index, datasetIndex) {
|
9380
9518
|
return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);
|
9381
9519
|
},
|
9382
|
-
getPixelForTick: function(index
|
9383
|
-
return this.getPixelForValue(this.tickValues[index]
|
9520
|
+
getPixelForTick: function(index) {
|
9521
|
+
return this.getPixelForValue(this.tickValues[index]);
|
9384
9522
|
},
|
9385
|
-
getPixelForValue: function(value
|
9523
|
+
getPixelForValue: function(value) {
|
9386
9524
|
var me = this;
|
9387
9525
|
var innerDimension;
|
9388
9526
|
var pixel;
|
@@ -9417,10 +9555,8 @@ module.exports = function(Chart) {
|
|
9417
9555
|
},
|
9418
9556
|
getValueForPixel: function(pixel) {
|
9419
9557
|
var me = this;
|
9420
|
-
var offset;
|
9421
9558
|
var range = helpers.log10(me.end) - helpers.log10(me.start);
|
9422
|
-
var value;
|
9423
|
-
var innerDimension;
|
9559
|
+
var value, innerDimension;
|
9424
9560
|
|
9425
9561
|
if (me.isHorizontal()) {
|
9426
9562
|
innerDimension = me.width - (me.paddingLeft + me.paddingRight);
|
@@ -9436,7 +9572,7 @@ module.exports = function(Chart) {
|
|
9436
9572
|
Chart.scaleService.registerScaleType("logarithmic", LogarithmicScale, defaultConfig);
|
9437
9573
|
|
9438
9574
|
};
|
9439
|
-
},{}],
|
9575
|
+
},{}],43:[function(require,module,exports){
|
9440
9576
|
"use strict";
|
9441
9577
|
|
9442
9578
|
module.exports = function(Chart) {
|
@@ -9603,16 +9739,20 @@ module.exports = function(Chart) {
|
|
9603
9739
|
xProtrusionLeft,
|
9604
9740
|
xProtrusionRight,
|
9605
9741
|
radiusReductionRight,
|
9606
|
-
radiusReductionLeft
|
9607
|
-
maxWidthRadius;
|
9742
|
+
radiusReductionLeft;
|
9608
9743
|
this.ctx.font = pointLabeFont;
|
9609
9744
|
|
9610
9745
|
for (i = 0; i < this.getValueCount(); i++) {
|
9611
9746
|
// 5px to space the text slightly out - similar to what we do in the draw function.
|
9612
9747
|
pointPosition = this.getPointPosition(i, largestPossibleRadius);
|
9613
9748
|
textWidth = this.ctx.measureText(this.pointLabels[i] ? this.pointLabels[i] : '').width + 5;
|
9614
|
-
|
9615
|
-
|
9749
|
+
|
9750
|
+
// Add quarter circle to make degree 0 mean top of circle
|
9751
|
+
var angleRadians = this.getIndexAngle(i) + (Math.PI / 2);
|
9752
|
+
var angle = (angleRadians * 360 / (2 * Math.PI)) % 360;
|
9753
|
+
|
9754
|
+
if (angle === 0 || angle === 180) {
|
9755
|
+
// At angle 0 and 180, we're at exactly the top/bottom
|
9616
9756
|
// of the radar chart, so text will be aligned centrally, so we'll half it and compare
|
9617
9757
|
// w/left and right text sizes
|
9618
9758
|
halfTextWidth = textWidth / 2;
|
@@ -9624,13 +9764,13 @@ module.exports = function(Chart) {
|
|
9624
9764
|
furthestLeft = pointPosition.x - halfTextWidth;
|
9625
9765
|
furthestLeftIndex = i;
|
9626
9766
|
}
|
9627
|
-
} else if (
|
9767
|
+
} else if (angle < 180) {
|
9628
9768
|
// Less than half the values means we'll left align the text
|
9629
9769
|
if (pointPosition.x + textWidth > furthestRight) {
|
9630
9770
|
furthestRight = pointPosition.x + textWidth;
|
9631
9771
|
furthestRightIndex = i;
|
9632
9772
|
}
|
9633
|
-
} else
|
9773
|
+
} else {
|
9634
9774
|
// More than half the values means we'll right align the text
|
9635
9775
|
if (pointPosition.x - textWidth < furthestLeft) {
|
9636
9776
|
furthestLeft = pointPosition.x - textWidth;
|
@@ -9667,9 +9807,14 @@ module.exports = function(Chart) {
|
|
9667
9807
|
|
9668
9808
|
getIndexAngle: function(index) {
|
9669
9809
|
var angleMultiplier = (Math.PI * 2) / this.getValueCount();
|
9670
|
-
|
9810
|
+
var startAngle = this.chart.options && this.chart.options.startAngle ?
|
9811
|
+
this.chart.options.startAngle :
|
9812
|
+
0;
|
9671
9813
|
|
9672
|
-
|
9814
|
+
var startAngleRadians = startAngle * Math.PI * 2 / 360;
|
9815
|
+
|
9816
|
+
// Start from the top instead of right, so remove a quarter of the circle
|
9817
|
+
return index * angleMultiplier - (Math.PI / 2) + startAngleRadians;
|
9673
9818
|
},
|
9674
9819
|
getDistanceFromCenterForValue: function(value) {
|
9675
9820
|
var me = this;
|
@@ -9813,26 +9958,24 @@ module.exports = function(Chart) {
|
|
9813
9958
|
ctx.font = pointLabeFont;
|
9814
9959
|
ctx.fillStyle = pointLabelFontColor;
|
9815
9960
|
|
9816
|
-
var pointLabels = me.pointLabels
|
9817
|
-
|
9818
|
-
|
9819
|
-
|
9820
|
-
|
9821
|
-
|
9822
|
-
if (
|
9823
|
-
ctx.textAlign = 'center';
|
9824
|
-
} else if (i === halfLabelsCount) {
|
9961
|
+
var pointLabels = me.pointLabels;
|
9962
|
+
|
9963
|
+
// Add quarter circle to make degree 0 mean top of circle
|
9964
|
+
var angleRadians = this.getIndexAngle(i) + (Math.PI / 2);
|
9965
|
+
var angle = (angleRadians * 360 / (2 * Math.PI)) % 360;
|
9966
|
+
|
9967
|
+
if (angle === 0 || angle === 180) {
|
9825
9968
|
ctx.textAlign = 'center';
|
9826
|
-
} else if (
|
9969
|
+
} else if (angle < 180) {
|
9827
9970
|
ctx.textAlign = 'left';
|
9828
9971
|
} else {
|
9829
9972
|
ctx.textAlign = 'right';
|
9830
9973
|
}
|
9831
9974
|
|
9832
9975
|
// Set the correct text baseline based on outer positioning
|
9833
|
-
if (
|
9976
|
+
if (angle === 90 || angle === 270) {
|
9834
9977
|
ctx.textBaseline = 'middle';
|
9835
|
-
} else if (
|
9978
|
+
} else if (angle > 270 || angle < 90) {
|
9836
9979
|
ctx.textBaseline = 'bottom';
|
9837
9980
|
} else {
|
9838
9981
|
ctx.textBaseline = 'top';
|
@@ -9848,7 +9991,7 @@ module.exports = function(Chart) {
|
|
9848
9991
|
|
9849
9992
|
};
|
9850
9993
|
|
9851
|
-
},{}],
|
9994
|
+
},{}],44:[function(require,module,exports){
|
9852
9995
|
/*global window: false */
|
9853
9996
|
"use strict";
|
9854
9997
|
|
@@ -9927,7 +10070,11 @@ module.exports = function(Chart) {
|
|
9927
10070
|
Chart.Scale.prototype.initialize.call(this);
|
9928
10071
|
},
|
9929
10072
|
getLabelMoment: function(datasetIndex, index) {
|
9930
|
-
|
10073
|
+
if (typeof this.labelMoments[datasetIndex] != 'undefined') {
|
10074
|
+
return this.labelMoments[datasetIndex][index];
|
10075
|
+
}
|
10076
|
+
|
10077
|
+
return null;
|
9931
10078
|
},
|
9932
10079
|
getMomentStartOf: function(tick) {
|
9933
10080
|
var me = this;
|
@@ -9945,7 +10092,7 @@ module.exports = function(Chart) {
|
|
9945
10092
|
// these
|
9946
10093
|
var scaleLabelMoments = [];
|
9947
10094
|
if (me.chart.data.labels && me.chart.data.labels.length > 0) {
|
9948
|
-
helpers.each(me.chart.data.labels, function(label
|
10095
|
+
helpers.each(me.chart.data.labels, function(label) {
|
9949
10096
|
var labelMoment = me.parseTime(label);
|
9950
10097
|
|
9951
10098
|
if (labelMoment.isValid()) {
|
@@ -9968,7 +10115,7 @@ module.exports = function(Chart) {
|
|
9968
10115
|
var datasetVisible = me.chart.isDatasetVisible(datasetIndex);
|
9969
10116
|
|
9970
10117
|
if (typeof dataset.data[0] === 'object' && dataset.data[0] !== null) {
|
9971
|
-
helpers.each(dataset.data, function(value
|
10118
|
+
helpers.each(dataset.data, function(value) {
|
9972
10119
|
var labelMoment = me.parseTime(me.getRightValue(value));
|
9973
10120
|
|
9974
10121
|
if (labelMoment.isValid()) {
|
@@ -10005,7 +10152,7 @@ module.exports = function(Chart) {
|
|
10005
10152
|
me.firstTick = (me.firstTick || moment()).clone();
|
10006
10153
|
me.lastTick = (me.lastTick || moment()).clone();
|
10007
10154
|
},
|
10008
|
-
buildTicks: function(
|
10155
|
+
buildTicks: function() {
|
10009
10156
|
var me = this;
|
10010
10157
|
|
10011
10158
|
me.ctx.save();
|
@@ -10091,10 +10238,15 @@ module.exports = function(Chart) {
|
|
10091
10238
|
// Only round the last tick if we have no hard maximum
|
10092
10239
|
if (!me.options.time.max) {
|
10093
10240
|
var roundedEnd = me.getMomentStartOf(me.lastTick);
|
10094
|
-
|
10241
|
+
var delta = roundedEnd.diff(me.lastTick, me.tickUnit, true);
|
10242
|
+
if (delta < 0) {
|
10095
10243
|
// Do not use end of because we need me to be in the next time unit
|
10096
10244
|
me.lastTick = me.getMomentStartOf(me.lastTick.add(1, me.tickUnit));
|
10245
|
+
} else if (delta >= 0) {
|
10246
|
+
me.lastTick = roundedEnd;
|
10097
10247
|
}
|
10248
|
+
|
10249
|
+
me.scaleSizeInUnits = me.lastTick.diff(me.firstTick, me.tickUnit, true);
|
10098
10250
|
}
|
10099
10251
|
|
10100
10252
|
me.smallestLabelSeparation = me.width;
|
@@ -10160,7 +10312,7 @@ module.exports = function(Chart) {
|
|
10160
10312
|
return label;
|
10161
10313
|
},
|
10162
10314
|
// Function to format an individual tick mark
|
10163
|
-
tickFormatFunction: function
|
10315
|
+
tickFormatFunction: function(tick, index, ticks) {
|
10164
10316
|
var formattedTick = tick.format(this.displayFormat);
|
10165
10317
|
var tickOpts = this.options.ticks;
|
10166
10318
|
var callback = helpers.getValueOrDefault(tickOpts.callback, tickOpts.userCallback);
|
@@ -10176,32 +10328,34 @@ module.exports = function(Chart) {
|
|
10176
10328
|
me.tickMoments = me.ticks;
|
10177
10329
|
me.ticks = me.ticks.map(me.tickFormatFunction, me);
|
10178
10330
|
},
|
10179
|
-
getPixelForValue: function(value, index, datasetIndex
|
10331
|
+
getPixelForValue: function(value, index, datasetIndex) {
|
10180
10332
|
var me = this;
|
10333
|
+
if (!value || !value.isValid) {
|
10334
|
+
// not already a moment object
|
10335
|
+
value = moment(me.getRightValue(value));
|
10336
|
+
}
|
10181
10337
|
var labelMoment = value && value.isValid && value.isValid() ? value : me.getLabelMoment(datasetIndex, index);
|
10182
10338
|
|
10183
10339
|
if (labelMoment) {
|
10184
10340
|
var offset = labelMoment.diff(me.firstTick, me.tickUnit, true);
|
10185
10341
|
|
10186
|
-
var decimal = offset / me.scaleSizeInUnits;
|
10342
|
+
var decimal = offset !== 0 ? offset / me.scaleSizeInUnits : offset;
|
10187
10343
|
|
10188
10344
|
if (me.isHorizontal()) {
|
10189
10345
|
var innerWidth = me.width - (me.paddingLeft + me.paddingRight);
|
10190
|
-
var valueWidth = innerWidth / Math.max(me.ticks.length - 1, 1);
|
10191
10346
|
var valueOffset = (innerWidth * decimal) + me.paddingLeft;
|
10192
10347
|
|
10193
10348
|
return me.left + Math.round(valueOffset);
|
10194
10349
|
} else {
|
10195
10350
|
var innerHeight = me.height - (me.paddingTop + me.paddingBottom);
|
10196
|
-
var valueHeight = innerHeight / Math.max(me.ticks.length - 1, 1);
|
10197
10351
|
var heightOffset = (innerHeight * decimal) + me.paddingTop;
|
10198
10352
|
|
10199
10353
|
return me.top + Math.round(heightOffset);
|
10200
10354
|
}
|
10201
10355
|
}
|
10202
10356
|
},
|
10203
|
-
getPixelForTick: function(index
|
10204
|
-
return this.getPixelForValue(this.tickMoments[index], null, null
|
10357
|
+
getPixelForTick: function(index) {
|
10358
|
+
return this.getPixelForValue(this.tickMoments[index], null, null);
|
10205
10359
|
},
|
10206
10360
|
getValueForPixel: function(pixel) {
|
10207
10361
|
var me = this;
|