highcharts_rails 0.1.0

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.
Files changed (76) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +5 -0
  5. data/CODE_OF_CONDUCT.md +74 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +106 -0
  9. data/Rakefile +6 -0
  10. data/highcharts_rails.gemspec +27 -0
  11. data/lib/highcharts_rails/version.rb +3 -0
  12. data/lib/highcharts_rails.rb +8 -0
  13. data/vendor/assets/javascripts/highcharts-3d.src.js +2139 -0
  14. data/vendor/assets/javascripts/highcharts-more.src.js +2982 -0
  15. data/vendor/assets/javascripts/highcharts.src.js +22947 -0
  16. data/vendor/assets/javascripts/js/highcharts-3d.src.js +2085 -0
  17. data/vendor/assets/javascripts/js/highcharts-more.src.js +2820 -0
  18. data/vendor/assets/javascripts/js/highcharts.src.js +20917 -0
  19. data/vendor/assets/javascripts/js/modules/accessibility.src.js +1072 -0
  20. data/vendor/assets/javascripts/js/modules/annotations.src.js +408 -0
  21. data/vendor/assets/javascripts/js/modules/boost.src.js +652 -0
  22. data/vendor/assets/javascripts/js/modules/broken-axis.src.js +338 -0
  23. data/vendor/assets/javascripts/js/modules/data.src.js +981 -0
  24. data/vendor/assets/javascripts/js/modules/drilldown.src.js +756 -0
  25. data/vendor/assets/javascripts/js/modules/exporting.src.js +953 -0
  26. data/vendor/assets/javascripts/js/modules/funnel.src.js +290 -0
  27. data/vendor/assets/javascripts/js/modules/gantt.src.js +791 -0
  28. data/vendor/assets/javascripts/js/modules/grid-axis.src.js +545 -0
  29. data/vendor/assets/javascripts/js/modules/heatmap.src.js +798 -0
  30. data/vendor/assets/javascripts/js/modules/no-data-to-display.src.js +150 -0
  31. data/vendor/assets/javascripts/js/modules/offline-exporting.src.js +492 -0
  32. data/vendor/assets/javascripts/js/modules/overlapping-datalabels.src.js +164 -0
  33. data/vendor/assets/javascripts/js/modules/series-label.src.js +606 -0
  34. data/vendor/assets/javascripts/js/modules/solid-gauge.src.js +305 -0
  35. data/vendor/assets/javascripts/js/modules/treemap.src.js +881 -0
  36. data/vendor/assets/javascripts/js/modules/xrange-series.src.js +254 -0
  37. data/vendor/assets/javascripts/js/themes/dark-blue.js +317 -0
  38. data/vendor/assets/javascripts/js/themes/dark-green.js +314 -0
  39. data/vendor/assets/javascripts/js/themes/dark-unica.js +243 -0
  40. data/vendor/assets/javascripts/js/themes/gray.js +326 -0
  41. data/vendor/assets/javascripts/js/themes/grid-light.js +99 -0
  42. data/vendor/assets/javascripts/js/themes/grid.js +131 -0
  43. data/vendor/assets/javascripts/js/themes/sand-signika.js +129 -0
  44. data/vendor/assets/javascripts/js/themes/skies.js +112 -0
  45. data/vendor/assets/javascripts/lib/canvg.src.js +3073 -0
  46. data/vendor/assets/javascripts/lib/jspdf.src.js +3031 -0
  47. data/vendor/assets/javascripts/lib/rgbcolor.src.js +299 -0
  48. data/vendor/assets/javascripts/lib/svg2pdf.src.js +1451 -0
  49. data/vendor/assets/javascripts/modules/accessibility.src.js +1072 -0
  50. data/vendor/assets/javascripts/modules/annotations.src.js +408 -0
  51. data/vendor/assets/javascripts/modules/boost.src.js +652 -0
  52. data/vendor/assets/javascripts/modules/broken-axis.src.js +338 -0
  53. data/vendor/assets/javascripts/modules/data.src.js +981 -0
  54. data/vendor/assets/javascripts/modules/drilldown.src.js +797 -0
  55. data/vendor/assets/javascripts/modules/exporting.src.js +882 -0
  56. data/vendor/assets/javascripts/modules/funnel.src.js +304 -0
  57. data/vendor/assets/javascripts/modules/gantt.src.js +815 -0
  58. data/vendor/assets/javascripts/modules/grid-axis.src.js +547 -0
  59. data/vendor/assets/javascripts/modules/heatmap.src.js +810 -0
  60. data/vendor/assets/javascripts/modules/no-data-to-display.src.js +161 -0
  61. data/vendor/assets/javascripts/modules/offline-exporting.src.js +492 -0
  62. data/vendor/assets/javascripts/modules/overlapping-datalabels.src.js +164 -0
  63. data/vendor/assets/javascripts/modules/series-label.src.js +606 -0
  64. data/vendor/assets/javascripts/modules/solid-gauge.src.js +316 -0
  65. data/vendor/assets/javascripts/modules/treemap.src.js +935 -0
  66. data/vendor/assets/javascripts/modules/xrange-series.src.js +276 -0
  67. data/vendor/assets/javascripts/themes/dark-blue.js +317 -0
  68. data/vendor/assets/javascripts/themes/dark-green.js +314 -0
  69. data/vendor/assets/javascripts/themes/dark-unica.js +243 -0
  70. data/vendor/assets/javascripts/themes/gray.js +326 -0
  71. data/vendor/assets/javascripts/themes/grid-light.js +99 -0
  72. data/vendor/assets/javascripts/themes/grid.js +131 -0
  73. data/vendor/assets/javascripts/themes/sand-signika.js +129 -0
  74. data/vendor/assets/javascripts/themes/skies.js +112 -0
  75. data/vendor/assets/stylesheets/highcharts.scss +610 -0
  76. metadata +161 -0
@@ -0,0 +1,798 @@
1
+ /**
2
+ * @license Highcharts JS v5.0.6 (2016-12-07)
3
+ *
4
+ * (c) 2009-2016 Torstein Honsi
5
+ *
6
+ * License: www.highcharts.com/license
7
+ */
8
+ (function(factory) {
9
+ if (typeof module === 'object' && module.exports) {
10
+ module.exports = factory;
11
+ } else {
12
+ factory(Highcharts);
13
+ }
14
+ }(function(Highcharts) {
15
+ (function(H) {
16
+ /**
17
+ * (c) 2010-2016 Torstein Honsi
18
+ *
19
+ * License: www.highcharts.com/license
20
+ */
21
+ 'use strict';
22
+ var Axis = H.Axis,
23
+ Chart = H.Chart,
24
+ color = H.color,
25
+ ColorAxis,
26
+ each = H.each,
27
+ extend = H.extend,
28
+ isNumber = H.isNumber,
29
+ Legend = H.Legend,
30
+ LegendSymbolMixin = H.LegendSymbolMixin,
31
+ noop = H.noop,
32
+ merge = H.merge,
33
+ pick = H.pick,
34
+ wrap = H.wrap;
35
+
36
+ /**
37
+ * The ColorAxis object for inclusion in gradient legends
38
+ */
39
+ ColorAxis = H.ColorAxis = function() {
40
+ this.init.apply(this, arguments);
41
+ };
42
+ extend(ColorAxis.prototype, Axis.prototype);
43
+ extend(ColorAxis.prototype, {
44
+ defaultColorAxisOptions: {
45
+ lineWidth: 0,
46
+ minPadding: 0,
47
+ maxPadding: 0,
48
+ gridLineWidth: 1,
49
+ tickPixelInterval: 72,
50
+ startOnTick: true,
51
+ endOnTick: true,
52
+ offset: 0,
53
+ marker: {
54
+ animation: {
55
+ duration: 50
56
+ },
57
+ width: 0.01
58
+
59
+ },
60
+ labels: {
61
+ overflow: 'justify'
62
+ },
63
+ minColor: '#e6ebf5',
64
+ maxColor: '#003399',
65
+ tickLength: 5,
66
+ showInLegend: true
67
+ },
68
+
69
+ // Properties to preserve after destroy, for Axis.update (#5881)
70
+ keepProps: ['legendGroup', 'legendItem', 'legendSymbol']
71
+ .concat(Axis.prototype.keepProps),
72
+
73
+ /**
74
+ * Initialize the color axis
75
+ */
76
+ init: function(chart, userOptions) {
77
+ var horiz = chart.options.legend.layout !== 'vertical',
78
+ options;
79
+
80
+ this.coll = 'colorAxis';
81
+
82
+ // Build the options
83
+ options = merge(this.defaultColorAxisOptions, {
84
+ side: horiz ? 2 : 1,
85
+ reversed: !horiz
86
+ }, userOptions, {
87
+ opposite: !horiz,
88
+ showEmpty: false,
89
+ title: null
90
+ });
91
+
92
+ Axis.prototype.init.call(this, chart, options);
93
+
94
+ // Base init() pushes it to the xAxis array, now pop it again
95
+ //chart[this.isXAxis ? 'xAxis' : 'yAxis'].pop();
96
+
97
+ // Prepare data classes
98
+ if (userOptions.dataClasses) {
99
+ this.initDataClasses(userOptions);
100
+ }
101
+ this.initStops(userOptions);
102
+
103
+ // Override original axis properties
104
+ this.horiz = horiz;
105
+ this.zoomEnabled = false;
106
+
107
+ // Add default values
108
+ this.defaultLegendLength = 200;
109
+ },
110
+
111
+ /*
112
+ * Return an intermediate color between two colors, according to pos where 0
113
+ * is the from color and 1 is the to color.
114
+ * NOTE: Changes here should be copied
115
+ * to the same function in drilldown.src.js and solid-gauge-src.js.
116
+ */
117
+ tweenColors: function(from, to, pos) {
118
+ // Check for has alpha, because rgba colors perform worse due to lack of
119
+ // support in WebKit.
120
+ var hasAlpha,
121
+ ret;
122
+
123
+ // Unsupported color, return to-color (#3920)
124
+ if (!to.rgba.length || !from.rgba.length) {
125
+ ret = to.input || 'none';
126
+
127
+ // Interpolate
128
+ } else {
129
+ from = from.rgba;
130
+ to = to.rgba;
131
+ hasAlpha = (to[3] !== 1 || from[3] !== 1);
132
+ ret = (hasAlpha ? 'rgba(' : 'rgb(') +
133
+ Math.round(to[0] + (from[0] - to[0]) * (1 - pos)) + ',' +
134
+ Math.round(to[1] + (from[1] - to[1]) * (1 - pos)) + ',' +
135
+ Math.round(to[2] + (from[2] - to[2]) * (1 - pos)) +
136
+ (hasAlpha ? (',' + (to[3] + (from[3] - to[3]) * (1 - pos))) : '') + ')';
137
+ }
138
+ return ret;
139
+ },
140
+
141
+ initDataClasses: function(userOptions) {
142
+ var axis = this,
143
+ chart = this.chart,
144
+ dataClasses,
145
+ colorCounter = 0,
146
+ colorCount = chart.options.chart.colorCount,
147
+ options = this.options,
148
+ len = userOptions.dataClasses.length;
149
+ this.dataClasses = dataClasses = [];
150
+ this.legendItems = [];
151
+
152
+ each(userOptions.dataClasses, function(dataClass, i) {
153
+ var colors;
154
+
155
+ dataClass = merge(dataClass);
156
+ dataClasses.push(dataClass);
157
+ if (!dataClass.color) {
158
+ if (options.dataClassColor === 'category') {
159
+
160
+ dataClass.colorIndex = colorCounter;
161
+
162
+ // increase and loop back to zero
163
+ colorCounter++;
164
+ if (colorCounter === colorCount) {
165
+ colorCounter = 0;
166
+ }
167
+ } else {
168
+ dataClass.color = axis.tweenColors(
169
+ color(options.minColor),
170
+ color(options.maxColor),
171
+ len < 2 ? 0.5 : i / (len - 1) // #3219
172
+ );
173
+ }
174
+ }
175
+ });
176
+ },
177
+
178
+ initStops: function(userOptions) {
179
+ this.stops = userOptions.stops || [
180
+ [0, this.options.minColor],
181
+ [1, this.options.maxColor]
182
+ ];
183
+ each(this.stops, function(stop) {
184
+ stop.color = color(stop[1]);
185
+ });
186
+ },
187
+
188
+ /**
189
+ * Extend the setOptions method to process extreme colors and color
190
+ * stops.
191
+ */
192
+ setOptions: function(userOptions) {
193
+ Axis.prototype.setOptions.call(this, userOptions);
194
+
195
+ this.options.crosshair = this.options.marker;
196
+ },
197
+
198
+ setAxisSize: function() {
199
+ var symbol = this.legendSymbol,
200
+ chart = this.chart,
201
+ legendOptions = chart.options.legend || {},
202
+ x,
203
+ y,
204
+ width,
205
+ height;
206
+
207
+ if (symbol) {
208
+ this.left = x = symbol.attr('x');
209
+ this.top = y = symbol.attr('y');
210
+ this.width = width = symbol.attr('width');
211
+ this.height = height = symbol.attr('height');
212
+ this.right = chart.chartWidth - x - width;
213
+ this.bottom = chart.chartHeight - y - height;
214
+
215
+ this.len = this.horiz ? width : height;
216
+ this.pos = this.horiz ? x : y;
217
+ } else {
218
+ // Fake length for disabled legend to avoid tick issues and such (#5205)
219
+ this.len = (this.horiz ? legendOptions.symbolWidth : legendOptions.symbolHeight) || this.defaultLegendLength;
220
+ }
221
+ },
222
+
223
+ /**
224
+ * Translate from a value to a color
225
+ */
226
+ toColor: function(value, point) {
227
+ var pos,
228
+ stops = this.stops,
229
+ from,
230
+ to,
231
+ color,
232
+ dataClasses = this.dataClasses,
233
+ dataClass,
234
+ i;
235
+
236
+ if (dataClasses) {
237
+ i = dataClasses.length;
238
+ while (i--) {
239
+ dataClass = dataClasses[i];
240
+ from = dataClass.from;
241
+ to = dataClass.to;
242
+ if ((from === undefined || value >= from) && (to === undefined || value <= to)) {
243
+ color = dataClass.color;
244
+ if (point) {
245
+ point.dataClass = i;
246
+ point.colorIndex = dataClass.colorIndex;
247
+ }
248
+ break;
249
+ }
250
+ }
251
+
252
+ } else {
253
+
254
+ if (this.isLog) {
255
+ value = this.val2lin(value);
256
+ }
257
+ pos = 1 - ((this.max - value) / ((this.max - this.min) || 1));
258
+ i = stops.length;
259
+ while (i--) {
260
+ if (pos > stops[i][0]) {
261
+ break;
262
+ }
263
+ }
264
+ from = stops[i] || stops[i + 1];
265
+ to = stops[i + 1] || from;
266
+
267
+ // The position within the gradient
268
+ pos = 1 - (to[0] - pos) / ((to[0] - from[0]) || 1);
269
+
270
+ color = this.tweenColors(
271
+ from.color,
272
+ to.color,
273
+ pos
274
+ );
275
+ }
276
+ return color;
277
+ },
278
+
279
+ /**
280
+ * Override the getOffset method to add the whole axis groups inside the legend.
281
+ */
282
+ getOffset: function() {
283
+ var group = this.legendGroup,
284
+ sideOffset = this.chart.axisOffset[this.side];
285
+
286
+ if (group) {
287
+
288
+ // Hook for the getOffset method to add groups to this parent group
289
+ this.axisParent = group;
290
+
291
+ // Call the base
292
+ Axis.prototype.getOffset.call(this);
293
+
294
+ // First time only
295
+ if (!this.added) {
296
+
297
+ this.added = true;
298
+
299
+ this.labelLeft = 0;
300
+ this.labelRight = this.width;
301
+ }
302
+ // Reset it to avoid color axis reserving space
303
+ this.chart.axisOffset[this.side] = sideOffset;
304
+ }
305
+ },
306
+
307
+ /**
308
+ * Create the color gradient
309
+ */
310
+ setLegendColor: function() {
311
+ var grad,
312
+ horiz = this.horiz,
313
+ options = this.options,
314
+ reversed = this.reversed,
315
+ one = reversed ? 1 : 0,
316
+ zero = reversed ? 0 : 1;
317
+
318
+ grad = horiz ? [one, 0, zero, 0] : [0, zero, 0, one]; // #3190
319
+ this.legendColor = {
320
+ linearGradient: {
321
+ x1: grad[0],
322
+ y1: grad[1],
323
+ x2: grad[2],
324
+ y2: grad[3]
325
+ },
326
+ stops: options.stops || [
327
+ [0, options.minColor],
328
+ [1, options.maxColor]
329
+ ]
330
+ };
331
+ },
332
+
333
+ /**
334
+ * The color axis appears inside the legend and has its own legend symbol
335
+ */
336
+ drawLegendSymbol: function(legend, item) {
337
+ var padding = legend.padding,
338
+ legendOptions = legend.options,
339
+ horiz = this.horiz,
340
+ width = pick(legendOptions.symbolWidth, horiz ? this.defaultLegendLength : 12),
341
+ height = pick(legendOptions.symbolHeight, horiz ? 12 : this.defaultLegendLength),
342
+ labelPadding = pick(legendOptions.labelPadding, horiz ? 16 : 30),
343
+ itemDistance = pick(legendOptions.itemDistance, 10);
344
+
345
+ this.setLegendColor();
346
+
347
+ // Create the gradient
348
+ item.legendSymbol = this.chart.renderer.rect(
349
+ 0,
350
+ legend.baseline - 11,
351
+ width,
352
+ height
353
+ ).attr({
354
+ zIndex: 1
355
+ }).add(item.legendGroup);
356
+
357
+ // Set how much space this legend item takes up
358
+ this.legendItemWidth = width + padding + (horiz ? itemDistance : labelPadding);
359
+ this.legendItemHeight = height + padding + (horiz ? labelPadding : 0);
360
+ },
361
+ /**
362
+ * Fool the legend
363
+ */
364
+ setState: noop,
365
+ visible: true,
366
+ setVisible: noop,
367
+ getSeriesExtremes: function() {
368
+ var series;
369
+ if (this.series.length) {
370
+ series = this.series[0];
371
+ this.dataMin = series.valueMin;
372
+ this.dataMax = series.valueMax;
373
+ }
374
+ },
375
+ drawCrosshair: function(e, point) {
376
+ var plotX = point && point.plotX,
377
+ plotY = point && point.plotY,
378
+ crossPos,
379
+ axisPos = this.pos,
380
+ axisLen = this.len;
381
+
382
+ if (point) {
383
+ crossPos = this.toPixels(point[point.series.colorKey]);
384
+ if (crossPos < axisPos) {
385
+ crossPos = axisPos - 2;
386
+ } else if (crossPos > axisPos + axisLen) {
387
+ crossPos = axisPos + axisLen + 2;
388
+ }
389
+
390
+ point.plotX = crossPos;
391
+ point.plotY = this.len - crossPos;
392
+ Axis.prototype.drawCrosshair.call(this, e, point);
393
+ point.plotX = plotX;
394
+ point.plotY = plotY;
395
+
396
+ if (this.cross) {
397
+ this.cross
398
+ .addClass('highcharts-coloraxis-marker')
399
+ .add(this.legendGroup);
400
+
401
+
402
+
403
+ }
404
+ }
405
+ },
406
+ getPlotLinePath: function(a, b, c, d, pos) {
407
+ return isNumber(pos) ? // crosshairs only // #3969 pos can be 0 !!
408
+ (this.horiz ? ['M', pos - 4, this.top - 6, 'L', pos + 4, this.top - 6, pos, this.top, 'Z'] : ['M', this.left, pos, 'L', this.left - 6, pos + 6, this.left - 6, pos - 6, 'Z']) :
409
+ Axis.prototype.getPlotLinePath.call(this, a, b, c, d);
410
+ },
411
+
412
+ update: function(newOptions, redraw) {
413
+ var chart = this.chart,
414
+ legend = chart.legend;
415
+
416
+ each(this.series, function(series) {
417
+ series.isDirtyData = true; // Needed for Axis.update when choropleth colors change
418
+ });
419
+
420
+ // When updating data classes, destroy old items and make sure new ones are created (#3207)
421
+ if (newOptions.dataClasses && legend.allItems) {
422
+ each(legend.allItems, function(item) {
423
+ if (item.isDataClass) {
424
+ item.legendGroup.destroy();
425
+ }
426
+ });
427
+ chart.isDirtyLegend = true;
428
+ }
429
+
430
+ // Keep the options structure updated for export. Unlike xAxis and yAxis, the colorAxis is
431
+ // not an array. (#3207)
432
+ chart.options[this.coll] = merge(this.userOptions, newOptions);
433
+
434
+ Axis.prototype.update.call(this, newOptions, redraw);
435
+ if (this.legendItem) {
436
+ this.setLegendColor();
437
+ legend.colorizeItem(this, true);
438
+ }
439
+ },
440
+
441
+ /**
442
+ * Get the legend item symbols for data classes
443
+ */
444
+ getDataClassLegendSymbols: function() {
445
+ var axis = this,
446
+ chart = this.chart,
447
+ legendItems = this.legendItems,
448
+ legendOptions = chart.options.legend,
449
+ valueDecimals = legendOptions.valueDecimals,
450
+ valueSuffix = legendOptions.valueSuffix || '',
451
+ name;
452
+
453
+ if (!legendItems.length) {
454
+ each(this.dataClasses, function(dataClass, i) {
455
+ var vis = true,
456
+ from = dataClass.from,
457
+ to = dataClass.to;
458
+
459
+ // Assemble the default name. This can be overridden by legend.options.labelFormatter
460
+ name = '';
461
+ if (from === undefined) {
462
+ name = '< ';
463
+ } else if (to === undefined) {
464
+ name = '> ';
465
+ }
466
+ if (from !== undefined) {
467
+ name += H.numberFormat(from, valueDecimals) + valueSuffix;
468
+ }
469
+ if (from !== undefined && to !== undefined) {
470
+ name += ' - ';
471
+ }
472
+ if (to !== undefined) {
473
+ name += H.numberFormat(to, valueDecimals) + valueSuffix;
474
+ }
475
+ // Add a mock object to the legend items
476
+ legendItems.push(extend({
477
+ chart: chart,
478
+ name: name,
479
+ options: {},
480
+ drawLegendSymbol: LegendSymbolMixin.drawRectangle,
481
+ visible: true,
482
+ setState: noop,
483
+ isDataClass: true,
484
+ setVisible: function() {
485
+ vis = this.visible = !vis;
486
+ each(axis.series, function(series) {
487
+ each(series.points, function(point) {
488
+ if (point.dataClass === i) {
489
+ point.setVisible(vis);
490
+ }
491
+ });
492
+ });
493
+
494
+ chart.legend.colorizeItem(this, vis);
495
+ }
496
+ }, dataClass));
497
+ });
498
+ }
499
+ return legendItems;
500
+ },
501
+ name: '' // Prevents 'undefined' in legend in IE8
502
+ });
503
+
504
+ /**
505
+ * Handle animation of the color attributes directly
506
+ */
507
+ each(['fill', 'stroke'], function(prop) {
508
+ H.Fx.prototype[prop + 'Setter'] = function() {
509
+ this.elem.attr(
510
+ prop,
511
+ ColorAxis.prototype.tweenColors(
512
+ color(this.start),
513
+ color(this.end),
514
+ this.pos
515
+ ),
516
+ null,
517
+ true
518
+ );
519
+ };
520
+ });
521
+
522
+ /**
523
+ * Extend the chart getAxes method to also get the color axis
524
+ */
525
+ wrap(Chart.prototype, 'getAxes', function(proceed) {
526
+
527
+ var options = this.options,
528
+ colorAxisOptions = options.colorAxis;
529
+
530
+ proceed.call(this);
531
+
532
+ this.colorAxis = [];
533
+ if (colorAxisOptions) {
534
+ new ColorAxis(this, colorAxisOptions); // eslint-disable-line no-new
535
+ }
536
+ });
537
+
538
+
539
+ /**
540
+ * Wrap the legend getAllItems method to add the color axis. This also removes the
541
+ * axis' own series to prevent them from showing up individually.
542
+ */
543
+ wrap(Legend.prototype, 'getAllItems', function(proceed) {
544
+ var allItems = [],
545
+ colorAxis = this.chart.colorAxis[0];
546
+
547
+ if (colorAxis && colorAxis.options) {
548
+ if (colorAxis.options.showInLegend) {
549
+ // Data classes
550
+ if (colorAxis.options.dataClasses) {
551
+ allItems = allItems.concat(colorAxis.getDataClassLegendSymbols());
552
+ // Gradient legend
553
+ } else {
554
+ // Add this axis on top
555
+ allItems.push(colorAxis);
556
+ }
557
+ }
558
+
559
+ // Don't add the color axis' series
560
+ each(colorAxis.series, function(series) {
561
+ series.options.showInLegend = false;
562
+ });
563
+ }
564
+
565
+ return allItems.concat(proceed.call(this));
566
+ });
567
+
568
+ wrap(Legend.prototype, 'colorizeItem', function(proceed, item, visible) {
569
+ proceed.call(this, item, visible);
570
+ if (visible && item.legendColor) {
571
+ item.legendSymbol.attr({
572
+ fill: item.legendColor
573
+ });
574
+ }
575
+ });
576
+
577
+ }(Highcharts));
578
+ (function(H) {
579
+ /**
580
+ * (c) 2010-2016 Torstein Honsi
581
+ *
582
+ * License: www.highcharts.com/license
583
+ */
584
+ 'use strict';
585
+ var defined = H.defined,
586
+ each = H.each,
587
+ noop = H.noop,
588
+ seriesTypes = H.seriesTypes;
589
+
590
+ /**
591
+ * Mixin for maps and heatmaps
592
+ */
593
+ H.colorPointMixin = {
594
+ /**
595
+ * Color points have a value option that determines whether or not it is a null point
596
+ */
597
+ isValid: function() {
598
+ return this.value !== null;
599
+ },
600
+
601
+ /**
602
+ * Set the visibility of a single point
603
+ */
604
+ setVisible: function(vis) {
605
+ var point = this,
606
+ method = vis ? 'show' : 'hide';
607
+
608
+ // Show and hide associated elements
609
+ each(['graphic', 'dataLabel'], function(key) {
610
+ if (point[key]) {
611
+ point[key][method]();
612
+ }
613
+ });
614
+ },
615
+ setState: function(state) {
616
+ H.Point.prototype.setState.call(this, state);
617
+ if (this.graphic) {
618
+ this.graphic.attr({
619
+ zIndex: state === 'hover' ? 1 : 0
620
+ });
621
+ }
622
+ }
623
+ };
624
+
625
+ H.colorSeriesMixin = {
626
+ pointArrayMap: ['value'],
627
+ axisTypes: ['xAxis', 'yAxis', 'colorAxis'],
628
+ optionalAxis: 'colorAxis',
629
+ trackerGroups: ['group', 'markerGroup', 'dataLabelsGroup'],
630
+ getSymbol: noop,
631
+ parallelArrays: ['x', 'y', 'value'],
632
+ colorKey: 'value',
633
+
634
+
635
+
636
+ /**
637
+ * In choropleth maps, the color is a result of the value, so this needs translation too
638
+ */
639
+ translateColors: function() {
640
+ var series = this,
641
+ nullColor = this.options.nullColor,
642
+ colorAxis = this.colorAxis,
643
+ colorKey = this.colorKey;
644
+
645
+ each(this.data, function(point) {
646
+ var value = point[colorKey],
647
+ color;
648
+
649
+ color = point.options.color ||
650
+ (point.isNull ? nullColor : (colorAxis && value !== undefined) ? colorAxis.toColor(value, point) : point.color || series.color);
651
+
652
+ if (color) {
653
+ point.color = color;
654
+ }
655
+ });
656
+ },
657
+
658
+ /**
659
+ * Get the color attibutes to apply on the graphic
660
+ */
661
+ colorAttribs: function(point) {
662
+ var ret = {};
663
+ if (defined(point.color)) {
664
+ ret[this.colorProp || 'fill'] = point.color;
665
+ }
666
+ return ret;
667
+ }
668
+ };
669
+
670
+ }(Highcharts));
671
+ (function(H) {
672
+ /**
673
+ * (c) 2010-2016 Torstein Honsi
674
+ *
675
+ * License: www.highcharts.com/license
676
+ */
677
+ 'use strict';
678
+ var colorPointMixin = H.colorPointMixin,
679
+ colorSeriesMixin = H.colorSeriesMixin,
680
+ each = H.each,
681
+ LegendSymbolMixin = H.LegendSymbolMixin,
682
+ merge = H.merge,
683
+ noop = H.noop,
684
+ pick = H.pick,
685
+ Series = H.Series,
686
+ seriesType = H.seriesType,
687
+ seriesTypes = H.seriesTypes;
688
+
689
+ // The Heatmap series type
690
+ seriesType('heatmap', 'scatter', {
691
+ animation: false,
692
+ borderWidth: 0,
693
+
694
+ dataLabels: {
695
+ formatter: function() { // #2945
696
+ return this.point.value;
697
+ },
698
+ inside: true,
699
+ verticalAlign: 'middle',
700
+ crop: false,
701
+ overflow: false,
702
+ padding: 0 // #3837
703
+ },
704
+ marker: null,
705
+ pointRange: null, // dynamically set to colsize by default
706
+ tooltip: {
707
+ pointFormat: '{point.x}, {point.y}: {point.value}<br/>'
708
+ },
709
+ states: {
710
+ normal: {
711
+ animation: true
712
+ },
713
+ hover: {
714
+ halo: false, // #3406, halo is not required on heatmaps
715
+ brightness: 0.2
716
+ }
717
+ }
718
+ }, merge(colorSeriesMixin, {
719
+ pointArrayMap: ['y', 'value'],
720
+ hasPointSpecificOptions: true,
721
+ supportsDrilldown: true,
722
+ getExtremesFromAll: true,
723
+ directTouch: true,
724
+
725
+ /**
726
+ * Override the init method to add point ranges on both axes.
727
+ */
728
+ init: function() {
729
+ var options;
730
+ seriesTypes.scatter.prototype.init.apply(this, arguments);
731
+
732
+ options = this.options;
733
+ options.pointRange = pick(options.pointRange, options.colsize || 1); // #3758, prevent resetting in setData
734
+ this.yAxis.axisPointRange = options.rowsize || 1; // general point range
735
+ },
736
+ translate: function() {
737
+ var series = this,
738
+ options = series.options,
739
+ xAxis = series.xAxis,
740
+ yAxis = series.yAxis,
741
+ between = function(x, a, b) {
742
+ return Math.min(Math.max(a, x), b);
743
+ };
744
+
745
+ series.generatePoints();
746
+
747
+ each(series.points, function(point) {
748
+ var xPad = (options.colsize || 1) / 2,
749
+ yPad = (options.rowsize || 1) / 2,
750
+ x1 = between(Math.round(xAxis.len - xAxis.translate(point.x - xPad, 0, 1, 0, 1)), -xAxis.len, 2 * xAxis.len),
751
+ x2 = between(Math.round(xAxis.len - xAxis.translate(point.x + xPad, 0, 1, 0, 1)), -xAxis.len, 2 * xAxis.len),
752
+ y1 = between(Math.round(yAxis.translate(point.y - yPad, 0, 1, 0, 1)), -yAxis.len, 2 * yAxis.len),
753
+ y2 = between(Math.round(yAxis.translate(point.y + yPad, 0, 1, 0, 1)), -yAxis.len, 2 * yAxis.len);
754
+
755
+ // Set plotX and plotY for use in K-D-Tree and more
756
+ point.plotX = point.clientX = (x1 + x2) / 2;
757
+ point.plotY = (y1 + y2) / 2;
758
+
759
+ point.shapeType = 'rect';
760
+ point.shapeArgs = {
761
+ x: Math.min(x1, x2),
762
+ y: Math.min(y1, y2),
763
+ width: Math.abs(x2 - x1),
764
+ height: Math.abs(y2 - y1)
765
+ };
766
+ });
767
+
768
+ series.translateColors();
769
+ },
770
+ drawPoints: function() {
771
+ seriesTypes.column.prototype.drawPoints.call(this);
772
+
773
+ each(this.points, function(point) {
774
+
775
+ // In styled mode, use CSS, otherwise the fill used in the style
776
+ // sheet will take precesence over the fill attribute.
777
+ point.graphic.css(this.colorAttribs(point));
778
+
779
+ }, this);
780
+ },
781
+ animate: noop,
782
+ getBox: noop,
783
+ drawLegendSymbol: LegendSymbolMixin.drawRectangle,
784
+ alignDataLabel: seriesTypes.column.prototype.alignDataLabel,
785
+ getExtremes: function() {
786
+ // Get the extremes from the value data
787
+ Series.prototype.getExtremes.call(this, this.valueData);
788
+ this.valueMin = this.dataMin;
789
+ this.valueMax = this.dataMax;
790
+
791
+ // Get the extremes from the y data
792
+ Series.prototype.getExtremes.call(this);
793
+ }
794
+
795
+ }), colorPointMixin);
796
+
797
+ }(Highcharts));
798
+ }));