highcharts-rails 4.0.1 → 4.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.markdown +60 -0
- data/app/assets/javascripts/highcharts.js +436 -412
- data/app/assets/javascripts/highcharts/adapters/standalone-framework.js +1 -1
- data/app/assets/javascripts/highcharts/highcharts-3d.js +272 -168
- data/app/assets/javascripts/highcharts/highcharts-more.js +51 -21
- data/app/assets/javascripts/highcharts/modules/canvas-tools.js +1 -1
- data/app/assets/javascripts/highcharts/modules/data.js +27 -12
- data/app/assets/javascripts/highcharts/modules/drilldown.js +2 -1
- data/app/assets/javascripts/highcharts/modules/exporting.js +6 -2
- data/app/assets/javascripts/highcharts/modules/heatmap.js +125 -56
- data/app/assets/javascripts/highcharts/modules/no-data-to-display.js +1 -1
- data/app/assets/javascripts/highcharts/modules/solid-gauge.js +15 -5
- data/app/assets/javascripts/highcharts/themes/sand-signika.js +3 -0
- data/lib/highcharts/version.rb +1 -1
- metadata +3 -3
- checksums.yaml.gz.asc +0 -18
- data.tar.gz.asc +0 -18
- metadata.gz.asc +0 -18
@@ -2,7 +2,7 @@
|
|
2
2
|
// @compilation_level SIMPLE_OPTIMIZATIONS
|
3
3
|
|
4
4
|
/**
|
5
|
-
* @license Highcharts JS v4.0.
|
5
|
+
* @license Highcharts JS v4.0.3 (2014-07-03)
|
6
6
|
*
|
7
7
|
* (c) 2009-2014 Torstein Honsi
|
8
8
|
*
|
@@ -108,7 +108,7 @@ extend(Pane.prototype, {
|
|
108
108
|
[1, '#DDD']
|
109
109
|
]
|
110
110
|
},
|
111
|
-
from: Number.
|
111
|
+
from: -Number.MAX_VALUE, // corrected to axis min
|
112
112
|
innerRadius: 0,
|
113
113
|
to: Number.MAX_VALUE, // corrected to axis max
|
114
114
|
outerRadius: '105%'
|
@@ -658,6 +658,7 @@ defaultPlotOptions.arearange = merge(defaultPlotOptions.area, {
|
|
658
658
|
},
|
659
659
|
trackByArea: true,
|
660
660
|
dataLabels: {
|
661
|
+
align: null,
|
661
662
|
verticalAlign: null,
|
662
663
|
xLow: 0,
|
663
664
|
xHigh: 0,
|
@@ -795,6 +796,7 @@ seriesTypes.arearange = extendClass(seriesTypes.area, {
|
|
795
796
|
originalDataLabels = [],
|
796
797
|
seriesProto = Series.prototype,
|
797
798
|
dataLabelOptions = this.options.dataLabels,
|
799
|
+
align = dataLabelOptions.align,
|
798
800
|
point,
|
799
801
|
inverted = this.chart.inverted;
|
800
802
|
|
@@ -818,7 +820,9 @@ seriesTypes.arearange = extendClass(seriesTypes.area, {
|
|
818
820
|
// Set the default offset
|
819
821
|
point.below = false;
|
820
822
|
if (inverted) {
|
821
|
-
|
823
|
+
if (!align) {
|
824
|
+
dataLabelOptions.align = 'left';
|
825
|
+
}
|
822
826
|
dataLabelOptions.x = dataLabelOptions.xHigh;
|
823
827
|
} else {
|
824
828
|
dataLabelOptions.y = dataLabelOptions.yHigh;
|
@@ -845,7 +849,9 @@ seriesTypes.arearange = extendClass(seriesTypes.area, {
|
|
845
849
|
// Set the default offset
|
846
850
|
point.below = true;
|
847
851
|
if (inverted) {
|
848
|
-
|
852
|
+
if (!align) {
|
853
|
+
dataLabelOptions.align = 'right';
|
854
|
+
}
|
849
855
|
dataLabelOptions.x = dataLabelOptions.xLow;
|
850
856
|
} else {
|
851
857
|
dataLabelOptions.y = dataLabelOptions.yLow;
|
@@ -855,6 +861,8 @@ seriesTypes.arearange = extendClass(seriesTypes.area, {
|
|
855
861
|
seriesProto.drawDataLabels.apply(this, arguments);
|
856
862
|
}
|
857
863
|
}
|
864
|
+
|
865
|
+
dataLabelOptions.align = align;
|
858
866
|
|
859
867
|
},
|
860
868
|
|
@@ -862,7 +870,7 @@ seriesTypes.arearange = extendClass(seriesTypes.area, {
|
|
862
870
|
seriesTypes.column.prototype.alignDataLabel.apply(this, arguments);
|
863
871
|
},
|
864
872
|
|
865
|
-
getSymbol:
|
873
|
+
getSymbol: noop,
|
866
874
|
|
867
875
|
drawPoints: noop
|
868
876
|
});/**
|
@@ -931,7 +939,7 @@ seriesTypes.areasplinerange = extendClass(seriesTypes.arearange, {
|
|
931
939
|
shapeArgs.y = y;
|
932
940
|
});
|
933
941
|
},
|
934
|
-
trackerGroups: ['group', '
|
942
|
+
trackerGroups: ['group', 'dataLabelsGroup'],
|
935
943
|
drawGraph: noop,
|
936
944
|
pointAttrToOptions: colProto.pointAttrToOptions,
|
937
945
|
drawPoints: colProto.drawPoints,
|
@@ -1013,7 +1021,7 @@ var GaugeSeries = {
|
|
1013
1021
|
drawGraph: noop,
|
1014
1022
|
fixedBox: true,
|
1015
1023
|
forceDL: true,
|
1016
|
-
trackerGroups: ['group', '
|
1024
|
+
trackerGroups: ['group', 'dataLabelsGroup'],
|
1017
1025
|
|
1018
1026
|
/**
|
1019
1027
|
* Calculate paths etc
|
@@ -1504,7 +1512,12 @@ defaultPlotOptions.waterfall = merge(defaultPlotOptions.column, {
|
|
1504
1512
|
lineWidth: 1,
|
1505
1513
|
lineColor: '#333',
|
1506
1514
|
dashStyle: 'dot',
|
1507
|
-
borderColor: '#333'
|
1515
|
+
borderColor: '#333',
|
1516
|
+
states: {
|
1517
|
+
hover: {
|
1518
|
+
lineWidthPlus: 0 // #3126
|
1519
|
+
}
|
1520
|
+
}
|
1508
1521
|
});
|
1509
1522
|
|
1510
1523
|
|
@@ -1535,7 +1548,7 @@ seriesTypes.waterfall = extendClass(seriesTypes.column, {
|
|
1535
1548
|
translate: function () {
|
1536
1549
|
var series = this,
|
1537
1550
|
options = series.options,
|
1538
|
-
|
1551
|
+
yAxis = series.yAxis,
|
1539
1552
|
len,
|
1540
1553
|
i,
|
1541
1554
|
points,
|
@@ -1544,13 +1557,15 @@ seriesTypes.waterfall = extendClass(seriesTypes.column, {
|
|
1544
1557
|
stack,
|
1545
1558
|
y,
|
1546
1559
|
previousY,
|
1560
|
+
previousIntermediate,
|
1547
1561
|
stackPoint,
|
1548
|
-
threshold = options.threshold
|
1562
|
+
threshold = options.threshold,
|
1563
|
+
tooltipY;
|
1549
1564
|
|
1550
1565
|
// run column series translate
|
1551
1566
|
seriesTypes.column.prototype.translate.apply(this);
|
1552
1567
|
|
1553
|
-
previousY = threshold;
|
1568
|
+
previousY = previousIntermediate = threshold;
|
1554
1569
|
points = series.points;
|
1555
1570
|
|
1556
1571
|
for (i = 0, len = points.length; i < len; i++) {
|
@@ -1569,13 +1584,18 @@ seriesTypes.waterfall = extendClass(seriesTypes.column, {
|
|
1569
1584
|
|
1570
1585
|
// up points
|
1571
1586
|
y = mathMax(previousY, previousY + point.y) + stackPoint[0];
|
1572
|
-
shapeArgs.y =
|
1587
|
+
shapeArgs.y = yAxis.translate(y, 0, 1);
|
1573
1588
|
|
1574
1589
|
|
1575
1590
|
// sum points
|
1576
|
-
if (point.isSum
|
1577
|
-
shapeArgs.y =
|
1578
|
-
shapeArgs.height =
|
1591
|
+
if (point.isSum) {
|
1592
|
+
shapeArgs.y = yAxis.translate(stackPoint[1], 0, 1);
|
1593
|
+
shapeArgs.height = yAxis.translate(stackPoint[0], 0, 1) - shapeArgs.y;
|
1594
|
+
|
1595
|
+
} else if (point.isIntermediateSum) {
|
1596
|
+
shapeArgs.y = yAxis.translate(stackPoint[1], 0, 1);
|
1597
|
+
shapeArgs.height = yAxis.translate(previousIntermediate, 0, 1) - shapeArgs.y;
|
1598
|
+
previousIntermediate = stackPoint[1];
|
1579
1599
|
|
1580
1600
|
// if it's not the sum point, update previous stack end position
|
1581
1601
|
} else {
|
@@ -1589,8 +1609,17 @@ seriesTypes.waterfall = extendClass(seriesTypes.column, {
|
|
1589
1609
|
}
|
1590
1610
|
|
1591
1611
|
point.plotY = shapeArgs.y = mathRound(shapeArgs.y) - (series.borderWidth % 2) / 2;
|
1592
|
-
shapeArgs.height = mathRound(shapeArgs.height);
|
1612
|
+
shapeArgs.height = mathMax(mathRound(shapeArgs.height), 0.001); // #3151
|
1593
1613
|
point.yBottom = shapeArgs.y + shapeArgs.height;
|
1614
|
+
|
1615
|
+
// Correct tooltip placement (#3014)
|
1616
|
+
tooltipY = point.plotY + (point.negative ? shapeArgs.height : 0);
|
1617
|
+
if (series.chart.inverted) {
|
1618
|
+
point.tooltipPos[0] = yAxis.len - tooltipY;
|
1619
|
+
} else {
|
1620
|
+
point.tooltipPos[1] = tooltipY;
|
1621
|
+
}
|
1622
|
+
|
1594
1623
|
}
|
1595
1624
|
},
|
1596
1625
|
|
@@ -1622,7 +1651,6 @@ seriesTypes.waterfall = extendClass(seriesTypes.column, {
|
|
1622
1651
|
yData[i] = sum;
|
1623
1652
|
} else if (y === "intermediateSum" || point.isIntermediateSum) {
|
1624
1653
|
yData[i] = subSum;
|
1625
|
-
subSum = threshold;
|
1626
1654
|
} else {
|
1627
1655
|
sum += y;
|
1628
1656
|
subSum += y;
|
@@ -1749,7 +1777,9 @@ seriesTypes.waterfall = extendClass(seriesTypes.column, {
|
|
1749
1777
|
// 1 - set default options
|
1750
1778
|
defaultPlotOptions.bubble = merge(defaultPlotOptions.scatter, {
|
1751
1779
|
dataLabels: {
|
1752
|
-
|
1780
|
+
formatter: function () { // #2945
|
1781
|
+
return this.point.z;
|
1782
|
+
},
|
1753
1783
|
inside: true,
|
1754
1784
|
style: {
|
1755
1785
|
color: 'white',
|
@@ -2011,14 +2041,14 @@ Axis.prototype.beforePadding = function () {
|
|
2011
2041
|
// Find the min and max Z
|
2012
2042
|
zData = series.zData;
|
2013
2043
|
if (zData.length) { // #1735
|
2014
|
-
zMin = math.min(
|
2044
|
+
zMin = pick(seriesOptions.zMin, math.min(
|
2015
2045
|
zMin,
|
2016
2046
|
math.max(
|
2017
2047
|
arrayMin(zData),
|
2018
2048
|
seriesOptions.displayNegative === false ? seriesOptions.zThreshold : -Number.MAX_VALUE
|
2019
2049
|
)
|
2020
|
-
);
|
2021
|
-
zMax = math.max(zMax, arrayMax(zData));
|
2050
|
+
));
|
2051
|
+
zMax = pick(seriesOptions.zMax, math.max(zMax, arrayMax(zData)));
|
2022
2052
|
}
|
2023
2053
|
}
|
2024
2054
|
}
|
@@ -2908,7 +2908,7 @@ if (CanvasRenderingContext2D) {
|
|
2908
2908
|
});
|
2909
2909
|
}
|
2910
2910
|
}/**
|
2911
|
-
* @license Highcharts JS v4.0.
|
2911
|
+
* @license Highcharts JS v4.0.3 (2014-07-03)
|
2912
2912
|
* CanVGRenderer Extension module
|
2913
2913
|
*
|
2914
2914
|
* (c) 2011-2012 Torstein Honsi, Erik Olsson
|
@@ -24,8 +24,9 @@
|
|
24
24
|
* - complete : Function(chartOptions)
|
25
25
|
* The callback that is evaluated when the data is finished loading, optionally from an
|
26
26
|
* external source, and parsed. The first argument passed is a finished chart options
|
27
|
-
* object, containing series
|
28
|
-
* can be extended with additional options and passed directly to the chart constructor.
|
27
|
+
* object, containing the series. Thise options
|
28
|
+
* can be extended with additional options and passed directly to the chart constructor. This is
|
29
|
+
* related to the parsed callback, that goes in at an earlier stage.
|
29
30
|
*
|
30
31
|
* - csv : String
|
31
32
|
* A comma delimited string to be parsed. Related options are startRow, endRow, startColumn
|
@@ -57,7 +58,9 @@
|
|
57
58
|
*
|
58
59
|
* - parsed : Function
|
59
60
|
* A callback function to access the parsed columns, the two-dimentional input data
|
60
|
-
* array directly, before they are interpreted into series data and categories.
|
61
|
+
* array directly, before they are interpreted into series data and categories. See also
|
62
|
+
* the complete callback, that goes in on a later stage where the raw columns are interpreted
|
63
|
+
* into a Highcharts option structure.
|
61
64
|
*
|
62
65
|
* - parseDate : Function
|
63
66
|
* A callback function to parse string representations of dates into JavaScript timestamps.
|
@@ -84,7 +87,7 @@
|
|
84
87
|
// JSLint options:
|
85
88
|
/*global jQuery */
|
86
89
|
|
87
|
-
(function (Highcharts) {
|
90
|
+
(function (Highcharts) { // docs
|
88
91
|
|
89
92
|
// Utilities
|
90
93
|
var each = Highcharts.each;
|
@@ -339,7 +342,7 @@
|
|
339
342
|
headerRow = null;
|
340
343
|
}
|
341
344
|
});
|
342
|
-
this.headerRow = 0;
|
345
|
+
this.headerRow = 0;
|
343
346
|
},
|
344
347
|
|
345
348
|
/**
|
@@ -485,10 +488,11 @@
|
|
485
488
|
data,
|
486
489
|
i,
|
487
490
|
j,
|
488
|
-
seriesIndex
|
491
|
+
seriesIndex,
|
492
|
+
chartOptions;
|
489
493
|
|
490
494
|
|
491
|
-
if (options.complete) {
|
495
|
+
if (options.complete || options.afterComplete) {
|
492
496
|
|
493
497
|
this.getColumnDistribution();
|
494
498
|
|
@@ -557,12 +561,20 @@
|
|
557
561
|
}
|
558
562
|
|
559
563
|
// Do the callback
|
560
|
-
|
564
|
+
chartOptions = {
|
561
565
|
xAxis: {
|
562
566
|
type: type
|
563
567
|
},
|
564
568
|
series: series
|
565
|
-
}
|
569
|
+
};
|
570
|
+
if (options.complete) {
|
571
|
+
options.complete(chartOptions);
|
572
|
+
}
|
573
|
+
// The afterComplete hook is used internally to avoid conflict with the externally
|
574
|
+
// available complete option.
|
575
|
+
if (options.afterComplete) {
|
576
|
+
options.afterComplete(chartOptions);
|
577
|
+
}
|
566
578
|
}
|
567
579
|
}
|
568
580
|
});
|
@@ -580,14 +592,17 @@
|
|
580
592
|
|
581
593
|
if (userOptions && userOptions.data) {
|
582
594
|
Highcharts.data(Highcharts.extend(userOptions.data, {
|
583
|
-
|
595
|
+
afterComplete: function (dataOptions) {
|
596
|
+
var i, series;
|
584
597
|
|
585
598
|
// Merge series configs
|
586
599
|
if (userOptions.hasOwnProperty('series')) {
|
587
600
|
if (typeof userOptions.series === 'object') {
|
588
|
-
|
601
|
+
i = Math.max(userOptions.series.length, dataOptions.series.length);
|
602
|
+
while (i--) {
|
603
|
+
series = userOptions.series[i] || {};
|
589
604
|
userOptions.series[i] = Highcharts.merge(series, dataOptions.series[i]);
|
590
|
-
}
|
605
|
+
}
|
591
606
|
} else { // Allow merging in dataOptions.series (#2856)
|
592
607
|
delete userOptions.series;
|
593
608
|
}
|
@@ -17,6 +17,7 @@
|
|
17
17
|
each = H.each,
|
18
18
|
extend = H.extend,
|
19
19
|
format = H.format,
|
20
|
+
pick = H.pick,
|
20
21
|
wrap = H.wrap,
|
21
22
|
Chart = H.Chart,
|
22
23
|
seriesTypes = H.seriesTypes,
|
@@ -77,7 +78,7 @@
|
|
77
78
|
visibility: 'inherit'
|
78
79
|
})
|
79
80
|
.animate({
|
80
|
-
opacity: 1
|
81
|
+
opacity: pick(this.newOpacity, 1) // newOpacity used in maps
|
81
82
|
}, animation || {
|
82
83
|
duration: 250
|
83
84
|
});
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license Highcharts JS v4.0.
|
2
|
+
* @license Highcharts JS v4.0.3 (2014-07-03)
|
3
3
|
* Exporting module
|
4
4
|
*
|
5
5
|
* (c) 2010-2014 Torstein Honsi
|
@@ -250,6 +250,7 @@ extend(Chart.prototype, {
|
|
250
250
|
each(chart.series, function (serie) {
|
251
251
|
seriesOptions = merge(serie.options, {
|
252
252
|
animation: false, // turn off animation
|
253
|
+
enableMouseTracking: false,
|
253
254
|
showCheckbox: false,
|
254
255
|
visible: serie.visible
|
255
256
|
});
|
@@ -294,7 +295,10 @@ extend(Chart.prototype, {
|
|
294
295
|
.replace(/<svg /, '<svg xmlns:xlink="http://www.w3.org/1999/xlink" ')
|
295
296
|
.replace(/ href=/g, ' xlink:href=')
|
296
297
|
.replace(/\n/, ' ')
|
297
|
-
|
298
|
+
// Any HTML added to the container after the SVG (#894)
|
299
|
+
.replace(/<\/svg>.*?$/, '</svg>')
|
300
|
+
// Batik doesn't support rgba fills and strokes (#3095)
|
301
|
+
.replace(/(fill|stroke)="rgba\(([ 0-9]+,[ 0-9]+,[ 0-9]+),([ 0-9\.]+)\)"/g, '$1="rgb($2)" $1-opacity="$3"')
|
298
302
|
/* This fails in IE < 8
|
299
303
|
.replace(/([0-9]+)\.([0-9]+)/g, function(s1, s2, s3) { // round off to save weight
|
300
304
|
return s2 +'.'+ s3[0];
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license Highcharts JS v4.0.
|
2
|
+
* @license Highcharts JS v4.0.3 (2014-07-03)
|
3
3
|
*
|
4
4
|
* (c) 2011-2014 Torstein Honsi
|
5
5
|
*
|
@@ -17,6 +17,7 @@ var UNDEFINED,
|
|
17
17
|
Legend = Highcharts.Legend,
|
18
18
|
LegendSymbolMixin = Highcharts.LegendSymbolMixin,
|
19
19
|
Series = Highcharts.Series,
|
20
|
+
SVGRenderer = Highcharts.SVGRenderer,
|
20
21
|
|
21
22
|
defaultOptions = Highcharts.getOptions(),
|
22
23
|
each = Highcharts.each,
|
@@ -48,7 +49,7 @@ extend(ColorAxis.prototype, {
|
|
48
49
|
startOnTick: true,
|
49
50
|
endOnTick: true,
|
50
51
|
offset: 0,
|
51
|
-
marker: {
|
52
|
+
marker: {
|
52
53
|
animation: {
|
53
54
|
duration: 50
|
54
55
|
},
|
@@ -117,6 +118,7 @@ extend(ColorAxis.prototype, {
|
|
117
118
|
colorCounter = 0,
|
118
119
|
options = this.options;
|
119
120
|
this.dataClasses = dataClasses = [];
|
121
|
+
this.legendItems = [];
|
120
122
|
|
121
123
|
each(userOptions.dataClasses, function (dataClass, i) {
|
122
124
|
var colors;
|
@@ -213,7 +215,7 @@ extend(ColorAxis.prototype, {
|
|
213
215
|
if (this.isLog) {
|
214
216
|
value = this.val2lin(value);
|
215
217
|
}
|
216
|
-
pos = 1 - ((this.max - value) / (this.max - this.min));
|
218
|
+
pos = 1 - ((this.max - value) / ((this.max - this.min) || 1));
|
217
219
|
i = stops.length;
|
218
220
|
while (i--) {
|
219
221
|
if (pos > stops[i][0]) {
|
@@ -225,7 +227,7 @@ extend(ColorAxis.prototype, {
|
|
225
227
|
|
226
228
|
// The position within the gradient
|
227
229
|
pos = 1 - (to[0] - pos) / ((to[0] - from[0]) || 1);
|
228
|
-
|
230
|
+
|
229
231
|
color = this.tweenColors(
|
230
232
|
from.color,
|
231
233
|
to.color,
|
@@ -236,7 +238,9 @@ extend(ColorAxis.prototype, {
|
|
236
238
|
},
|
237
239
|
|
238
240
|
getOffset: function () {
|
239
|
-
var group = this.legendGroup
|
241
|
+
var group = this.legendGroup,
|
242
|
+
sideOffset = this.chart.axisOffset[this.side];
|
243
|
+
|
240
244
|
if (group) {
|
241
245
|
|
242
246
|
Axis.prototype.getOffset.call(this);
|
@@ -250,6 +254,8 @@ extend(ColorAxis.prototype, {
|
|
250
254
|
|
251
255
|
this.added = true;
|
252
256
|
}
|
257
|
+
// Reset it to avoid color axis reserving space
|
258
|
+
this.chart.axisOffset[this.side] = sideOffset;
|
253
259
|
}
|
254
260
|
},
|
255
261
|
|
@@ -281,7 +287,8 @@ extend(ColorAxis.prototype, {
|
|
281
287
|
box,
|
282
288
|
width = pick(legendOptions.symbolWidth, horiz ? 200 : 12),
|
283
289
|
height = pick(legendOptions.symbolHeight, horiz ? 12 : 200),
|
284
|
-
labelPadding = pick(legendOptions.labelPadding, horiz ?
|
290
|
+
labelPadding = pick(legendOptions.labelPadding, horiz ? 16 : 30),
|
291
|
+
itemDistance = pick(legendOptions.itemDistance, 10);
|
285
292
|
|
286
293
|
this.setLegendColor();
|
287
294
|
|
@@ -297,7 +304,7 @@ extend(ColorAxis.prototype, {
|
|
297
304
|
box = item.legendSymbol.getBBox();
|
298
305
|
|
299
306
|
// Set how much space this legend item takes up
|
300
|
-
this.legendItemWidth = width + padding + (horiz ?
|
307
|
+
this.legendItemWidth = width + padding + (horiz ? itemDistance : labelPadding);
|
301
308
|
this.legendItemHeight = height + padding + (horiz ? labelPadding : 0);
|
302
309
|
},
|
303
310
|
/**
|
@@ -372,56 +379,58 @@ extend(ColorAxis.prototype, {
|
|
372
379
|
getDataClassLegendSymbols: function () {
|
373
380
|
var axis = this,
|
374
381
|
chart = this.chart,
|
375
|
-
legendItems =
|
382
|
+
legendItems = this.legendItems,
|
376
383
|
legendOptions = chart.options.legend,
|
377
384
|
valueDecimals = legendOptions.valueDecimals,
|
378
385
|
valueSuffix = legendOptions.valueSuffix || '',
|
379
386
|
name;
|
380
387
|
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
if (from !== UNDEFINED) {
|
394
|
-
name += numberFormat(from, valueDecimals) + valueSuffix;
|
395
|
-
}
|
396
|
-
if (from !== UNDEFINED && to !== UNDEFINED) {
|
397
|
-
name += ' - ';
|
398
|
-
}
|
399
|
-
if (to !== UNDEFINED) {
|
400
|
-
name += numberFormat(to, valueDecimals) + valueSuffix;
|
401
|
-
}
|
402
|
-
|
403
|
-
// Add a mock object to the legend items
|
404
|
-
legendItems.push(extend({
|
405
|
-
chart: chart,
|
406
|
-
name: name,
|
407
|
-
options: {},
|
408
|
-
drawLegendSymbol: LegendSymbolMixin.drawRectangle,
|
409
|
-
visible: true,
|
410
|
-
setState: noop,
|
411
|
-
setVisible: function () {
|
412
|
-
vis = this.visible = !vis;
|
413
|
-
each(axis.series, function (series) {
|
414
|
-
each(series.points, function (point) {
|
415
|
-
if (point.dataClass === i) {
|
416
|
-
point.setVisible(vis);
|
417
|
-
}
|
418
|
-
});
|
419
|
-
});
|
420
|
-
|
421
|
-
chart.legend.colorizeItem(this, vis);
|
388
|
+
if (!legendItems.length) {
|
389
|
+
each(this.dataClasses, function (dataClass, i) {
|
390
|
+
var vis = true,
|
391
|
+
from = dataClass.from,
|
392
|
+
to = dataClass.to;
|
393
|
+
|
394
|
+
// Assemble the default name. This can be overridden by legend.options.labelFormatter
|
395
|
+
name = '';
|
396
|
+
if (from === UNDEFINED) {
|
397
|
+
name = '< ';
|
398
|
+
} else if (to === UNDEFINED) {
|
399
|
+
name = '> ';
|
422
400
|
}
|
423
|
-
|
424
|
-
|
401
|
+
if (from !== UNDEFINED) {
|
402
|
+
name += numberFormat(from, valueDecimals) + valueSuffix;
|
403
|
+
}
|
404
|
+
if (from !== UNDEFINED && to !== UNDEFINED) {
|
405
|
+
name += ' - ';
|
406
|
+
}
|
407
|
+
if (to !== UNDEFINED) {
|
408
|
+
name += numberFormat(to, valueDecimals) + valueSuffix;
|
409
|
+
}
|
410
|
+
|
411
|
+
// Add a mock object to the legend items
|
412
|
+
legendItems.push(extend({
|
413
|
+
chart: chart,
|
414
|
+
name: name,
|
415
|
+
options: {},
|
416
|
+
drawLegendSymbol: LegendSymbolMixin.drawRectangle,
|
417
|
+
visible: true,
|
418
|
+
setState: noop,
|
419
|
+
setVisible: function () {
|
420
|
+
vis = this.visible = !vis;
|
421
|
+
each(axis.series, function (series) {
|
422
|
+
each(series.points, function (point) {
|
423
|
+
if (point.dataClass === i) {
|
424
|
+
point.setVisible(vis);
|
425
|
+
}
|
426
|
+
});
|
427
|
+
});
|
428
|
+
|
429
|
+
chart.legend.colorizeItem(this, vis);
|
430
|
+
}
|
431
|
+
}, dataClass));
|
432
|
+
});
|
433
|
+
}
|
425
434
|
return legendItems;
|
426
435
|
},
|
427
436
|
name: '' // Prevents 'undefined' in legend in IE8
|
@@ -489,6 +498,7 @@ var colorSeriesMixin = {
|
|
489
498
|
trackerGroups: ['group', 'markerGroup', 'dataLabelsGroup'],
|
490
499
|
getSymbol: noop,
|
491
500
|
parallelArrays: ['x', 'y', 'value'],
|
501
|
+
colorKey: 'value',
|
492
502
|
|
493
503
|
/**
|
494
504
|
* In choropleth maps, the color is a result of the value, so this needs translation too
|
@@ -496,13 +506,14 @@ var colorSeriesMixin = {
|
|
496
506
|
translateColors: function () {
|
497
507
|
var series = this,
|
498
508
|
nullColor = this.options.nullColor,
|
499
|
-
colorAxis = this.colorAxis
|
509
|
+
colorAxis = this.colorAxis,
|
510
|
+
colorKey = this.colorKey;
|
500
511
|
|
501
512
|
each(this.data, function (point) {
|
502
|
-
var value = point
|
513
|
+
var value = point[colorKey],
|
503
514
|
color;
|
504
515
|
|
505
|
-
color = value === null ? nullColor : colorAxis ? colorAxis.toColor(value, point) :
|
516
|
+
color = value === null ? nullColor : (colorAxis && value !== undefined) ? colorAxis.toColor(value, point) : point.color || series.color;
|
506
517
|
|
507
518
|
if (color) {
|
508
519
|
point.color = color;
|
@@ -510,6 +521,55 @@ var colorSeriesMixin = {
|
|
510
521
|
});
|
511
522
|
}
|
512
523
|
};
|
524
|
+
|
525
|
+
|
526
|
+
/**
|
527
|
+
* Wrap the buildText method and add the hook for add text stroke
|
528
|
+
*/
|
529
|
+
wrap(SVGRenderer.prototype, 'buildText', function (proceed, wrapper) {
|
530
|
+
|
531
|
+
var textStroke = wrapper.styles && wrapper.styles.HcTextStroke;
|
532
|
+
|
533
|
+
proceed.call(this, wrapper);
|
534
|
+
|
535
|
+
// Apply the text stroke
|
536
|
+
if (textStroke && wrapper.applyTextStroke) {
|
537
|
+
wrapper.applyTextStroke(textStroke);
|
538
|
+
}
|
539
|
+
});
|
540
|
+
|
541
|
+
/**
|
542
|
+
* Apply an outside text stroke to data labels, based on the custom CSS property, HcTextStroke.
|
543
|
+
* Consider moving this to Highcharts core, also makes sense on stacked columns etc.
|
544
|
+
*/
|
545
|
+
SVGRenderer.prototype.Element.prototype.applyTextStroke = function (textStroke) {
|
546
|
+
var elem = this.element,
|
547
|
+
tspans,
|
548
|
+
firstChild;
|
549
|
+
|
550
|
+
textStroke = textStroke.split(' ');
|
551
|
+
tspans = elem.getElementsByTagName('tspan');
|
552
|
+
firstChild = elem.firstChild;
|
553
|
+
|
554
|
+
// In order to get the right y position of the clones,
|
555
|
+
// copy over the y setter
|
556
|
+
this.ySetter = this.xSetter;
|
557
|
+
|
558
|
+
each([].slice.call(tspans), function (tspan, y) {
|
559
|
+
var clone;
|
560
|
+
if (y === 0) {
|
561
|
+
tspan.setAttribute('x', elem.getAttribute('x'));
|
562
|
+
if ((y = elem.getAttribute('y')) !== null) {
|
563
|
+
tspan.setAttribute('y', y);
|
564
|
+
}
|
565
|
+
}
|
566
|
+
clone = tspan.cloneNode(1);
|
567
|
+
clone.setAttribute('stroke', textStroke[1]);
|
568
|
+
clone.setAttribute('stroke-width', textStroke[0]);
|
569
|
+
clone.setAttribute('stroke-linejoin', 'round');
|
570
|
+
elem.insertBefore(clone, firstChild);
|
571
|
+
});
|
572
|
+
};
|
513
573
|
/**
|
514
574
|
* Extend the default options with map options
|
515
575
|
*/
|
@@ -518,14 +578,16 @@ defaultOptions.plotOptions.heatmap = merge(defaultOptions.plotOptions.scatter, {
|
|
518
578
|
borderWidth: 0,
|
519
579
|
nullColor: '#F8F8F8',
|
520
580
|
dataLabels: {
|
521
|
-
|
581
|
+
formatter: function () { // #2945
|
582
|
+
return this.point.value;
|
583
|
+
},
|
522
584
|
verticalAlign: 'middle',
|
523
585
|
crop: false,
|
524
586
|
overflow: false,
|
525
587
|
style: {
|
526
588
|
color: 'white',
|
527
589
|
fontWeight: 'bold',
|
528
|
-
|
590
|
+
HcTextStroke: '1px rgba(0,0,0,0.5)'
|
529
591
|
}
|
530
592
|
},
|
531
593
|
marker: null,
|
@@ -584,6 +646,13 @@ seriesTypes.heatmap = extendClass(seriesTypes.scatter, merge(colorSeriesMixin, {
|
|
584
646
|
});
|
585
647
|
|
586
648
|
series.translateColors();
|
649
|
+
|
650
|
+
// Make sure colors are updated on colorAxis update (#2893)
|
651
|
+
if (this.chart.hasRendered) {
|
652
|
+
each(series.points, function (point) {
|
653
|
+
point.shapeArgs.fill = point.color;
|
654
|
+
});
|
655
|
+
}
|
587
656
|
},
|
588
657
|
drawPoints: seriesTypes.column.prototype.drawPoints,
|
589
658
|
animate: noop,
|