highcharts-rails 4.1.5 → 4.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.markdown +47 -0
- data/Rakefile +0 -34
- data/app/assets/javascripts/highcharts.js +262 -241
- data/app/assets/javascripts/highcharts/adapters/standalone-framework.js +1 -1
- data/app/assets/javascripts/highcharts/highcharts-3d.js +258 -76
- data/app/assets/javascripts/highcharts/highcharts-more.js +19 -10
- data/app/assets/javascripts/highcharts/modules/broken-axis.js +8 -6
- data/app/assets/javascripts/highcharts/modules/canvas-tools.js +4 -4
- data/app/assets/javascripts/highcharts/modules/data.js +1 -1
- data/app/assets/javascripts/highcharts/modules/exporting.js +1 -1
- data/app/assets/javascripts/highcharts/modules/heatmap.js +22 -2
- data/app/assets/javascripts/highcharts/modules/no-data-to-display.js +1 -1
- data/app/assets/javascripts/highcharts/modules/solid-gauge.js +3 -3
- data/app/assets/javascripts/highcharts/modules/treemap.js +137 -132
- data/lib/highcharts/version.rb +1 -1
- metadata +2 -2
@@ -2,7 +2,7 @@
|
|
2
2
|
// @compilation_level SIMPLE_OPTIMIZATIONS
|
3
3
|
|
4
4
|
/**
|
5
|
-
* @license Highcharts JS v4.1.
|
5
|
+
* @license Highcharts JS v4.1.6 (2015-06-12)
|
6
6
|
*
|
7
7
|
* (c) 2009-2014 Torstein Honsi
|
8
8
|
*
|
@@ -832,6 +832,7 @@ seriesTypes.arearange = extendClass(seriesTypes.area, {
|
|
832
832
|
dataLabelOptions = this.options.dataLabels,
|
833
833
|
align = dataLabelOptions.align,
|
834
834
|
point,
|
835
|
+
up,
|
835
836
|
inverted = this.chart.inverted;
|
836
837
|
|
837
838
|
if (dataLabelOptions.enabled || this._hasPointLabels) {
|
@@ -840,6 +841,7 @@ seriesTypes.arearange = extendClass(seriesTypes.area, {
|
|
840
841
|
i = length;
|
841
842
|
while (i--) {
|
842
843
|
point = data[i];
|
844
|
+
up = point.plotHigh > point.plotLow;
|
843
845
|
|
844
846
|
// Set preliminary values
|
845
847
|
point.y = point.high;
|
@@ -852,10 +854,10 @@ seriesTypes.arearange = extendClass(seriesTypes.area, {
|
|
852
854
|
point.dataLabel = point.dataLabelUpper;
|
853
855
|
|
854
856
|
// Set the default offset
|
855
|
-
point.below =
|
857
|
+
point.below = up;
|
856
858
|
if (inverted) {
|
857
859
|
if (!align) {
|
858
|
-
dataLabelOptions.align = 'left';
|
860
|
+
dataLabelOptions.align = up ? 'right' : 'left';
|
859
861
|
}
|
860
862
|
dataLabelOptions.x = dataLabelOptions.xHigh;
|
861
863
|
} else {
|
@@ -871,6 +873,7 @@ seriesTypes.arearange = extendClass(seriesTypes.area, {
|
|
871
873
|
i = length;
|
872
874
|
while (i--) {
|
873
875
|
point = data[i];
|
876
|
+
up = point.plotHigh > point.plotLow;
|
874
877
|
|
875
878
|
// Move the generated labels from step 1, and reassign the original data labels
|
876
879
|
point.dataLabelUpper = point.dataLabel;
|
@@ -881,10 +884,10 @@ seriesTypes.arearange = extendClass(seriesTypes.area, {
|
|
881
884
|
point.plotY = point._plotY;
|
882
885
|
|
883
886
|
// Set the default offset
|
884
|
-
point.below =
|
887
|
+
point.below = !up;
|
885
888
|
if (inverted) {
|
886
889
|
if (!align) {
|
887
|
-
dataLabelOptions.align = 'right';
|
890
|
+
dataLabelOptions.align = up ? 'left' : 'right';
|
888
891
|
}
|
889
892
|
dataLabelOptions.x = dataLabelOptions.xLow;
|
890
893
|
} else {
|
@@ -966,11 +969,18 @@ seriesTypes.areasplinerange = extendClass(seriesTypes.arearange, {
|
|
966
969
|
y = plotHigh;
|
967
970
|
height = point.plotY - plotHigh;
|
968
971
|
|
969
|
-
|
972
|
+
// Adjust for minPointLength
|
973
|
+
if (Math.abs(height) < minPointLength) {
|
970
974
|
heightDifference = (minPointLength - height);
|
971
975
|
height += heightDifference;
|
972
976
|
y -= heightDifference / 2;
|
977
|
+
|
978
|
+
// Adjust for negative ranges or reversed Y axis (#1457)
|
979
|
+
} else if (height < 0) {
|
980
|
+
height *= -1;
|
981
|
+
y -= height;
|
973
982
|
}
|
983
|
+
|
974
984
|
shapeArgs.height = height;
|
975
985
|
shapeArgs.y = y;
|
976
986
|
});
|
@@ -1620,11 +1630,11 @@ seriesTypes.waterfall = extendClass(seriesTypes.column, {
|
|
1620
1630
|
// sum points
|
1621
1631
|
if (point.isSum) {
|
1622
1632
|
shapeArgs.y = yAxis.translate(range[1], 0, 1);
|
1623
|
-
shapeArgs.height = yAxis.translate(range[0], 0, 1) - shapeArgs.y;
|
1633
|
+
shapeArgs.height = Math.min(yAxis.translate(range[0], 0, 1), yAxis.len) - shapeArgs.y; // #4256
|
1624
1634
|
|
1625
1635
|
} else if (point.isIntermediateSum) {
|
1626
1636
|
shapeArgs.y = yAxis.translate(range[1], 0, 1);
|
1627
|
-
shapeArgs.height = yAxis.translate(previousIntermediate, 0, 1) - shapeArgs.y;
|
1637
|
+
shapeArgs.height = Math.min(yAxis.translate(previousIntermediate, 0, 1), yAxis.len) - shapeArgs.y;
|
1628
1638
|
previousIntermediate = range[1];
|
1629
1639
|
|
1630
1640
|
// If it's not the sum point, update previous stack end position and get
|
@@ -2171,7 +2181,6 @@ Axis.prototype.beforePadding = function () {
|
|
2171
2181
|
this.searchPoint = this.searchPointByAngle;
|
2172
2182
|
} else {
|
2173
2183
|
this.kdDimensions = 2;
|
2174
|
-
this.kdComparer = 'distR';
|
2175
2184
|
}
|
2176
2185
|
}
|
2177
2186
|
proceed.apply(this);
|
@@ -2364,7 +2373,7 @@ Axis.prototype.beforePadding = function () {
|
|
2364
2373
|
|
2365
2374
|
// Postprocess plot coordinates
|
2366
2375
|
if (chart.polar) {
|
2367
|
-
this.kdByAngle = chart.tooltip.shared;
|
2376
|
+
this.kdByAngle = chart.tooltip && chart.tooltip.shared;
|
2368
2377
|
|
2369
2378
|
if (!this.preventPostTranslate) {
|
2370
2379
|
points = this.points;
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* Highcharts JS v4.1.
|
2
|
+
* Highcharts JS v4.1.6 (2015-06-12)
|
3
3
|
* Highcharts Broken Axis module
|
4
4
|
*
|
5
5
|
* Author: Stephane Vanraes, Torstein Honsi
|
@@ -168,14 +168,15 @@
|
|
168
168
|
i,
|
169
169
|
j;
|
170
170
|
|
171
|
-
// Min &
|
171
|
+
// Min & max check (#4247)
|
172
172
|
for (i in breaks) {
|
173
173
|
brk = breaks[i];
|
174
|
+
repeat = brk.repeat || Infinity;
|
174
175
|
if (axis.isInBreak(brk, min)) {
|
175
|
-
min += (brk.to %
|
176
|
+
min += (brk.to % repeat) - (min % repeat);
|
176
177
|
}
|
177
178
|
if (axis.isInBreak(brk, max)) {
|
178
|
-
max -= (max %
|
179
|
+
max -= (max % repeat) - (brk.from % repeat);
|
179
180
|
}
|
180
181
|
}
|
181
182
|
|
@@ -242,7 +243,6 @@
|
|
242
243
|
|
243
244
|
axis.min = min;
|
244
245
|
axis.max = max;
|
245
|
-
|
246
246
|
};
|
247
247
|
}
|
248
248
|
});
|
@@ -265,7 +265,9 @@
|
|
265
265
|
|
266
266
|
if (xAxis.isInAnyBreak(point.x, true) || yAxis.isInAnyBreak(point.y, true)) {
|
267
267
|
points.splice(i, 1);
|
268
|
-
this.data[i]
|
268
|
+
if (this.data[i]) {
|
269
|
+
this.data[i].destroyElements(); // removes the graphics for this point if they exist
|
270
|
+
}
|
269
271
|
}
|
270
272
|
}
|
271
273
|
}
|
@@ -422,7 +422,7 @@ if(!Array.prototype.indexOf){
|
|
422
422
|
svg.trim = function(s) { return s.replace(/^\s+|\s+$/g, ''); }
|
423
423
|
|
424
424
|
// compress spaces
|
425
|
-
svg.compressSpaces = function(s) { return s.replace(/[\s\r\t\n]+/gm,' '); }
|
425
|
+
svg.compressSpaces = function(s) { return s ? s.replace(/[\s\r\t\n]+/gm,' ') : ''; }
|
426
426
|
|
427
427
|
// ajax
|
428
428
|
svg.ajax = function(url) {
|
@@ -2132,14 +2132,14 @@ if(!Array.prototype.indexOf){
|
|
2132
2132
|
child.x = x;
|
2133
2133
|
}
|
2134
2134
|
|
2135
|
-
var childLength = child.measureText(ctx);
|
2135
|
+
var childLength = child.measureText ? child.measureText(ctx) : 0;
|
2136
2136
|
if (textAnchor != 'start' && (i==0 || child.attribute('x').hasValue())) { // new group?
|
2137
2137
|
// loop through rest of children
|
2138
2138
|
var groupLength = childLength;
|
2139
2139
|
for (var j=i+1; j<this.children.length; j++) {
|
2140
2140
|
var childInGroup = this.children[j];
|
2141
2141
|
if (childInGroup.attribute('x').hasValue()) break; // new group
|
2142
|
-
groupLength += childInGroup.measureText(ctx);
|
2142
|
+
groupLength += childInGroup.measureText ? childInGroup.measureText(ctx) : 0;
|
2143
2143
|
}
|
2144
2144
|
child.x -= (textAnchor == 'end' ? groupLength : groupLength / 2.0);
|
2145
2145
|
}
|
@@ -2908,7 +2908,7 @@ if (CanvasRenderingContext2D) {
|
|
2908
2908
|
});
|
2909
2909
|
}
|
2910
2910
|
}/**
|
2911
|
-
* @license Highcharts JS v4.1.
|
2911
|
+
* @license Highcharts JS v4.1.6 (2015-06-12)
|
2912
2912
|
* CanVGRenderer Extension module
|
2913
2913
|
*
|
2914
2914
|
* (c) 2011-2012 Torstein Honsi, Erik Olsson
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license Highcharts JS v4.1.
|
2
|
+
* @license Highcharts JS v4.1.6 (2015-06-12)
|
3
3
|
*
|
4
4
|
* (c) 2011-2014 Torstein Honsi
|
5
5
|
*
|
@@ -384,13 +384,31 @@ extend(ColorAxis.prototype, {
|
|
384
384
|
},
|
385
385
|
|
386
386
|
update: function (newOptions, redraw) {
|
387
|
+
var chart = this.chart,
|
388
|
+
legend = chart.legend;
|
389
|
+
|
387
390
|
each(this.series, function (series) {
|
388
391
|
series.isDirtyData = true; // Needed for Axis.update when choropleth colors change
|
389
392
|
});
|
393
|
+
|
394
|
+
// When updating data classes, destroy old items and make sure new ones are created (#3207)
|
395
|
+
if (newOptions.dataClasses) {
|
396
|
+
each(legend.allItems, function (item) {
|
397
|
+
if (item.isDataClass) {
|
398
|
+
item.legendGroup.destroy();
|
399
|
+
}
|
400
|
+
});
|
401
|
+
chart.isDirtyLegend = true;
|
402
|
+
}
|
403
|
+
|
404
|
+
// Keep the options structure updated for export. Unlike xAxis and yAxis, the colorAxis is
|
405
|
+
// not an array. (#3207)
|
406
|
+
chart.options[this.coll] = merge(this.userOptions, newOptions);
|
407
|
+
|
390
408
|
Axis.prototype.update.call(this, newOptions, redraw);
|
391
409
|
if (this.legendItem) {
|
392
410
|
this.setLegendColor();
|
393
|
-
|
411
|
+
legend.colorizeItem(this, true);
|
394
412
|
}
|
395
413
|
},
|
396
414
|
|
@@ -437,6 +455,7 @@ extend(ColorAxis.prototype, {
|
|
437
455
|
drawLegendSymbol: LegendSymbolMixin.drawRectangle,
|
438
456
|
visible: true,
|
439
457
|
setState: noop,
|
458
|
+
isDataClass: true,
|
440
459
|
setVisible: function () {
|
441
460
|
vis = this.visible = !vis;
|
442
461
|
each(axis.series, function (series) {
|
@@ -589,6 +608,7 @@ seriesTypes.heatmap = extendClass(seriesTypes.scatter, merge(colorSeriesMixin, {
|
|
589
608
|
hasPointSpecificOptions: true,
|
590
609
|
supportsDrilldown: true,
|
591
610
|
getExtremesFromAll: true,
|
611
|
+
directTouch: true,
|
592
612
|
|
593
613
|
/**
|
594
614
|
* Override the init method to add point ranges on both axes.
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license Highcharts JS v4.1.
|
2
|
+
* @license Highcharts JS v4.1.6 (2015-06-12)
|
3
3
|
* Solid angular gauge module
|
4
4
|
*
|
5
5
|
* (c) 2010-2014 Torstein Honsi
|
@@ -191,8 +191,8 @@
|
|
191
191
|
H.each(series.points, function (point) {
|
192
192
|
var graphic = point.graphic,
|
193
193
|
rotation = yAxis.startAngleRad + yAxis.translate(point.y, null, null, null, true),
|
194
|
-
radius = (pInt(pick(point.options.radius, options.radius, 100)) * center[2]) / 200,
|
195
|
-
innerRadius = (pInt(pick(point.options.innerRadius, options.innerRadius, 60)) * center[2]) / 200,
|
194
|
+
radius = (pInt(pick(point.options.radius, options.radius, 100)) * center[2]) / 200,
|
195
|
+
innerRadius = (pInt(pick(point.options.innerRadius, options.innerRadius, 60)) * center[2]) / 200,
|
196
196
|
shapeArgs,
|
197
197
|
d,
|
198
198
|
toColor = yAxis.toColor(point.y, point),
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license Highcharts JS v4.1.
|
2
|
+
* @license Highcharts JS v4.1.6 (2015-06-12)
|
3
3
|
*
|
4
4
|
* (c) 2014 Highsoft AS
|
5
5
|
* Authors: Jon Arild Nygard / Oystein Moseng
|
@@ -37,7 +37,7 @@
|
|
37
37
|
},
|
38
38
|
tooltip: {
|
39
39
|
headerFormat: '',
|
40
|
-
pointFormat: '<b>{point.name}</b>: {point.
|
40
|
+
pointFormat: '<b>{point.name}</b>: {point.node.val}</b><br/>'
|
41
41
|
},
|
42
42
|
layoutAlgorithm: 'sliceAndDice',
|
43
43
|
layoutStartingDirection: 'vertical',
|
@@ -93,7 +93,8 @@
|
|
93
93
|
this.dataLabel.attr({ zIndex: (this.pointAttr[''].zIndex + 1) });
|
94
94
|
}
|
95
95
|
}
|
96
|
-
}
|
96
|
+
},
|
97
|
+
setVisible: seriesTypes.pie.prototype.pointClass.prototype.setVisible
|
97
98
|
}),
|
98
99
|
handleLayout: function () {
|
99
100
|
var series = this,
|
@@ -101,13 +102,9 @@
|
|
101
102
|
seriesArea;
|
102
103
|
if (this.points.length) {
|
103
104
|
// Assign variables
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
}
|
108
|
-
if (!this.rootNode) {
|
109
|
-
this.rootNode = "";
|
110
|
-
}
|
105
|
+
this.nodeMap = [];
|
106
|
+
tree = this.tree = this.getTree();
|
107
|
+
this.rootNode = pick(this.rootNode, "");
|
111
108
|
this.levelMap = this.getLevels();
|
112
109
|
each(series.points, function (point) {
|
113
110
|
// Reset visibility
|
@@ -135,55 +132,43 @@
|
|
135
132
|
parentList[""].push(item);
|
136
133
|
});
|
137
134
|
},
|
138
|
-
getNodeTree = function (id, i, level, list, points, parent) {
|
135
|
+
getNodeTree = function (id, i, level, list, points, parent, visible) {
|
139
136
|
var children = [],
|
140
|
-
sortedChildren = [],
|
141
137
|
childrenTotal = 0,
|
142
138
|
val,
|
143
139
|
point = points[i],
|
144
140
|
nodeTree,
|
145
141
|
node,
|
146
|
-
insertNode,
|
147
142
|
name;
|
148
|
-
insertNode = function () {
|
149
|
-
var i = 0,
|
150
|
-
inserted = false;
|
151
|
-
if (sortedChildren.length !== 0) {
|
152
|
-
each(sortedChildren, function (child) {
|
153
|
-
if (node.val > child.val && !inserted) {
|
154
|
-
sortedChildren.splice(i, 0, node);
|
155
|
-
inserted = true;
|
156
|
-
}
|
157
|
-
i = i + 1;
|
158
|
-
});
|
159
|
-
}
|
160
|
-
if (!inserted) {
|
161
|
-
sortedChildren.push(node);
|
162
|
-
}
|
163
|
-
};
|
164
143
|
|
165
144
|
// Actions
|
166
|
-
if (
|
167
|
-
|
145
|
+
if (visible) {
|
146
|
+
visible = pick(point && point.visible, true);
|
168
147
|
}
|
148
|
+
name = pick(point && point.name, "");
|
169
149
|
if (list[id] !== undefined) {
|
170
150
|
each(list[id], function (i) {
|
171
|
-
node = getNodeTree(points[i].id, i, (level + 1), list, points, id);
|
172
|
-
|
173
|
-
|
174
|
-
|
151
|
+
node = getNodeTree(points[i].id, i, (level + 1), list, points, id, visible);
|
152
|
+
if (node.visible || !series.options.ignoreHiddenPoint) {
|
153
|
+
childrenTotal += node.val;
|
154
|
+
series.insertElementSorted(children, node, function (el, el2) {
|
155
|
+
return el.val > el2.val;
|
156
|
+
});
|
157
|
+
}
|
175
158
|
});
|
176
159
|
}
|
177
160
|
val = pick((points[i] && points[i].value), childrenTotal, 0);
|
161
|
+
visible = val > 0 ? visible : false;
|
178
162
|
nodeTree = {
|
179
163
|
id: id,
|
180
164
|
i: i,
|
181
|
-
children:
|
165
|
+
children: children,
|
182
166
|
childrenTotal: childrenTotal,
|
183
167
|
val: val,
|
184
168
|
level: level,
|
185
169
|
parent: parent,
|
186
|
-
name: name
|
170
|
+
name: name,
|
171
|
+
visible: visible
|
187
172
|
};
|
188
173
|
series.nodeMap[nodeTree.id] = nodeTree;
|
189
174
|
return nodeTree;
|
@@ -217,7 +202,7 @@
|
|
217
202
|
}
|
218
203
|
}
|
219
204
|
}
|
220
|
-
tree = getNodeTree("", -1, 0, parentList, this.points, null);
|
205
|
+
tree = getNodeTree("", -1, 0, parentList, this.points, null, true);
|
221
206
|
return tree;
|
222
207
|
},
|
223
208
|
calculateArea: function (node, area) {
|
@@ -232,7 +217,6 @@
|
|
232
217
|
level,
|
233
218
|
levelNr = options.levelIsConstant ? node.level : (node.level - levelRoot),
|
234
219
|
point;
|
235
|
-
node.isVisible = (node.id === this.rootNode) || !!(this.nodeMap[node.parent] && this.nodeMap[node.parent].isVisible);
|
236
220
|
levelNr = (levelNr > 0) ? levelNr : 0;
|
237
221
|
// If layoutAlgorithm is set for the level of the children, then default is overwritten
|
238
222
|
if (this.levelMap[levelNr + 1]) {
|
@@ -256,9 +240,7 @@
|
|
256
240
|
childValues.direction = 1 - childValues.direction;
|
257
241
|
}
|
258
242
|
child.values = childValues;
|
259
|
-
child.isVisible = node.isVisible;
|
260
243
|
point.node = child;
|
261
|
-
point.value = child.val;
|
262
244
|
point.isLeaf = true;
|
263
245
|
// If node has children, then call method recursively
|
264
246
|
if (child.children.length) {
|
@@ -291,7 +273,7 @@
|
|
291
273
|
x2 = Math.round(xAxis.translate(values.x + values.width, 0, 0, 0, 1));
|
292
274
|
y1 = Math.round(yAxis.translate(values.y, 0, 0, 0, 1));
|
293
275
|
y2 = Math.round(yAxis.translate(values.y + values.height, 0, 0, 0, 1));
|
294
|
-
if (
|
276
|
+
if (node.visible || !series.options.ignoreHiddenPoint) {
|
295
277
|
// Set point values
|
296
278
|
point.shapeType = 'rect';
|
297
279
|
point.shapeArgs = {
|
@@ -562,39 +544,43 @@
|
|
562
544
|
}
|
563
545
|
},
|
564
546
|
/**
|
565
|
-
|
566
|
-
|
547
|
+
* Extend drawDataLabels with logic to handle custom options related to the treemap series:
|
548
|
+
* - Points which is not a leaf node, has dataLabels disabled by default.
|
549
|
+
* - Options set on series.levels is merged in.
|
550
|
+
* - Width of the dataLabel is set to match the width of the point shape.
|
551
|
+
*/
|
567
552
|
drawDataLabels: function () {
|
568
553
|
var series = this,
|
554
|
+
dataLabelsGroup = series.dataLabelsGroup,
|
569
555
|
points = series.points,
|
570
556
|
options,
|
571
|
-
level
|
572
|
-
dataLabelsGroup = this.dataLabelsGroup,
|
573
|
-
dataLabels;
|
557
|
+
level;
|
574
558
|
each(points, function (point) {
|
575
|
-
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
|
580
|
-
|
581
|
-
|
582
|
-
|
583
|
-
|
584
|
-
|
585
|
-
|
586
|
-
|
587
|
-
|
588
|
-
|
589
|
-
|
590
|
-
|
591
|
-
|
592
|
-
|
593
|
-
delete point.dlOptions;
|
594
|
-
}
|
559
|
+
level = series.levelMap[point.level];
|
560
|
+
// Set options to new object to problems with scope
|
561
|
+
options = {style: {}};
|
562
|
+
|
563
|
+
// If not a leaf, then label should be disabled as default
|
564
|
+
if (!point.isLeaf) {
|
565
|
+
options.enabled = false;
|
566
|
+
}
|
567
|
+
|
568
|
+
// If options for level exists, include them as well
|
569
|
+
if (level && level.dataLabels) {
|
570
|
+
options = merge(options, level.dataLabels);
|
571
|
+
series._hasPointLabels = true;
|
572
|
+
}
|
573
|
+
|
574
|
+
// Set dataLabel width to the width of the point shape.
|
575
|
+
if (point.shapeArgs) {
|
576
|
+
options.style.width = point.shapeArgs.width;
|
595
577
|
}
|
578
|
+
|
579
|
+
// Merge custom options with point options
|
580
|
+
point.dlOptions = merge(options, point.options.dataLabels);
|
596
581
|
});
|
597
|
-
|
582
|
+
|
583
|
+
this.dataLabelsGroup = this.group; // Draw dataLabels in same group as points, because of z-index on hover
|
598
584
|
Series.prototype.drawDataLabels.call(this);
|
599
585
|
this.dataLabelsGroup = dataLabelsGroup;
|
600
586
|
},
|
@@ -610,52 +596,50 @@
|
|
610
596
|
hover,
|
611
597
|
level;
|
612
598
|
each(points, function (point) {
|
613
|
-
|
614
|
-
|
615
|
-
|
616
|
-
|
617
|
-
|
618
|
-
|
619
|
-
|
620
|
-
|
621
|
-
|
622
|
-
|
623
|
-
|
624
|
-
|
625
|
-
|
626
|
-
|
627
|
-
|
628
|
-
|
629
|
-
|
630
|
-
|
631
|
-
|
632
|
-
attr.zIndex = (1000 - (point.level * 2));
|
599
|
+
level = series.levelMap[point.level];
|
600
|
+
attr = {
|
601
|
+
stroke: seriesOptions.borderColor,
|
602
|
+
'stroke-width': seriesOptions.borderWidth,
|
603
|
+
dashstyle: seriesOptions.borderDashStyle,
|
604
|
+
r: 0, // borderRadius gives wrong size relations and should always be disabled
|
605
|
+
fill: pick(point.color, series.color)
|
606
|
+
};
|
607
|
+
// Overwrite standard series options with level options
|
608
|
+
if (level) {
|
609
|
+
attr.stroke = level.borderColor || attr.stroke;
|
610
|
+
attr['stroke-width'] = level.borderWidth || attr['stroke-width'];
|
611
|
+
attr.dashstyle = level.borderDashStyle || attr.dashstyle;
|
612
|
+
}
|
613
|
+
// Merge with point attributes
|
614
|
+
attr.stroke = point.borderColor || attr.stroke;
|
615
|
+
attr['stroke-width'] = point.borderWidth || attr['stroke-width'];
|
616
|
+
attr.dashstyle = point.borderDashStyle || attr.dashstyle;
|
617
|
+
attr.zIndex = (1000 - (point.level * 2));
|
633
618
|
|
634
|
-
|
635
|
-
|
636
|
-
|
637
|
-
|
638
|
-
|
639
|
-
|
640
|
-
|
641
|
-
|
642
|
-
attr.fill = 'none';
|
643
|
-
delete hover.fill;
|
644
|
-
} else {
|
645
|
-
// TODO: let users set the opacity
|
646
|
-
attr.fill = Color(attr.fill).setOpacity(0.15).get();
|
647
|
-
hover.fill = Color(hover.fill).setOpacity(0.75).get();
|
648
|
-
}
|
649
|
-
}
|
650
|
-
if (point.node.level <= series.nodeMap[series.rootNode].level) {
|
619
|
+
// Make a copy to prevent overwriting individual props
|
620
|
+
point.pointAttr = merge(point.pointAttr);
|
621
|
+
hover = point.pointAttr.hover;
|
622
|
+
hover.zIndex = 1001;
|
623
|
+
hover.fill = Color(attr.fill).brighten(seriesOptions.states.hover.brightness).get();
|
624
|
+
// If not a leaf, then remove fill
|
625
|
+
if (!point.isLeaf) {
|
626
|
+
if (pick(seriesOptions.interactByLeaf, !seriesOptions.allowDrillToNode)) {
|
651
627
|
attr.fill = 'none';
|
652
|
-
attr.zIndex = 0;
|
653
628
|
delete hover.fill;
|
629
|
+
} else {
|
630
|
+
// TODO: let users set the opacity
|
631
|
+
attr.fill = Color(attr.fill).setOpacity(0.15).get();
|
632
|
+
hover.fill = Color(hover.fill).setOpacity(0.75).get();
|
654
633
|
}
|
655
|
-
|
656
|
-
|
657
|
-
|
658
|
-
|
634
|
+
}
|
635
|
+
if (point.node.level <= series.nodeMap[series.rootNode].level) {
|
636
|
+
attr.fill = 'none';
|
637
|
+
attr.zIndex = 0;
|
638
|
+
delete hover.fill;
|
639
|
+
}
|
640
|
+
point.pointAttr[''] = H.extend(point.pointAttr[''], attr);
|
641
|
+
if (point.dataLabel) {
|
642
|
+
point.dataLabel.attr({ zIndex: (point.pointAttr[''].zIndex + 1) });
|
659
643
|
}
|
660
644
|
});
|
661
645
|
// Call standard drawPoints
|
@@ -672,6 +656,29 @@
|
|
672
656
|
series.drillTo();
|
673
657
|
}
|
674
658
|
},
|
659
|
+
/**
|
660
|
+
* Inserts an element into an array, sorted by a condition.
|
661
|
+
* Modifies the referenced array
|
662
|
+
* @param {*[]} arr The array which the element is inserted into.
|
663
|
+
* @param {*} el The element to insert.
|
664
|
+
* @param {function} cond The condition to sort on. First parameter is el, second parameter is array element
|
665
|
+
*/
|
666
|
+
insertElementSorted: function (arr, el, cond) {
|
667
|
+
var i = 0,
|
668
|
+
inserted = false;
|
669
|
+
if (arr.length !== 0) {
|
670
|
+
each(arr, function (arrayElement) {
|
671
|
+
if (cond(el, arrayElement) && !inserted) {
|
672
|
+
arr.splice(i, 0, el);
|
673
|
+
inserted = true;
|
674
|
+
}
|
675
|
+
i = i + 1;
|
676
|
+
});
|
677
|
+
}
|
678
|
+
if (!inserted) {
|
679
|
+
arr.push(el);
|
680
|
+
}
|
681
|
+
},
|
675
682
|
/**
|
676
683
|
* Add drilling on the suitable points
|
677
684
|
*/
|
@@ -681,31 +688,29 @@
|
|
681
688
|
each(points, function (point) {
|
682
689
|
var drillId,
|
683
690
|
drillName;
|
684
|
-
|
685
|
-
|
686
|
-
|
687
|
-
|
688
|
-
}
|
691
|
+
H.removeEvent(point, 'click.drillTo');
|
692
|
+
if (point.graphic) {
|
693
|
+
point.graphic.css({ cursor: 'default' });
|
694
|
+
}
|
689
695
|
|
690
|
-
|
691
|
-
|
692
|
-
|
693
|
-
|
694
|
-
|
695
|
-
|
696
|
+
// Get the drill to id
|
697
|
+
if (series.options.interactByLeaf) {
|
698
|
+
drillId = series.drillToByLeaf(point);
|
699
|
+
} else {
|
700
|
+
drillId = series.drillToByGroup(point);
|
701
|
+
}
|
696
702
|
|
697
|
-
|
698
|
-
|
699
|
-
|
700
|
-
|
701
|
-
|
702
|
-
}
|
703
|
-
H.addEvent(point, 'click', function () {
|
704
|
-
point.setState(''); // Remove hover
|
705
|
-
series.drillToNode(drillId);
|
706
|
-
series.showDrillUpButton(drillName);
|
707
|
-
});
|
703
|
+
// If a drill id is returned, add click event and cursor.
|
704
|
+
if (drillId) {
|
705
|
+
drillName = series.nodeMap[series.rootNode].name || series.rootNode;
|
706
|
+
if (point.graphic) {
|
707
|
+
point.graphic.css({ cursor: 'pointer' });
|
708
708
|
}
|
709
|
+
H.addEvent(point, 'click.drillTo', function () {
|
710
|
+
point.setState(''); // Remove hover
|
711
|
+
series.drillToNode(drillId);
|
712
|
+
series.showDrillUpButton(drillName);
|
713
|
+
});
|
709
714
|
}
|
710
715
|
});
|
711
716
|
},
|