highcharts-rails 4.1.5 → 4.1.6
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
},
|