highcharts-rails 5.0.14 → 6.0.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 (63) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.markdown +60 -0
  3. data/Rakefile +54 -5
  4. data/app/assets/images/highcharts/earth.svg +432 -0
  5. data/app/assets/javascripts/highcharts.js +5103 -3147
  6. data/app/assets/javascripts/highcharts/highcharts-3d.js +930 -277
  7. data/app/assets/javascripts/highcharts/highcharts-more.js +1374 -249
  8. data/app/assets/javascripts/highcharts/lib/canvg.js +3073 -0
  9. data/app/assets/javascripts/highcharts/lib/jspdf.js +16624 -0
  10. data/app/assets/javascripts/highcharts/lib/rgbcolor.js +299 -0
  11. data/app/assets/javascripts/highcharts/lib/svg2pdf.js +3488 -0
  12. data/app/assets/javascripts/highcharts/modules/accessibility.js +654 -212
  13. data/app/assets/javascripts/highcharts/modules/annotations.js +1552 -274
  14. data/app/assets/javascripts/highcharts/modules/boost-canvas.js +773 -0
  15. data/app/assets/javascripts/highcharts/modules/boost.js +636 -210
  16. data/app/assets/javascripts/highcharts/modules/broken-axis.js +2 -2
  17. data/app/assets/javascripts/highcharts/modules/bullet.js +364 -0
  18. data/app/assets/javascripts/highcharts/modules/data.js +766 -38
  19. data/app/assets/javascripts/highcharts/modules/drag-panes.js +588 -0
  20. data/app/assets/javascripts/highcharts/modules/drilldown.js +106 -36
  21. data/app/assets/javascripts/highcharts/modules/export-data.js +597 -0
  22. data/app/assets/javascripts/highcharts/modules/exporting.js +424 -162
  23. data/app/assets/javascripts/highcharts/modules/funnel.js +144 -22
  24. data/app/assets/javascripts/highcharts/modules/gantt.js +1154 -0
  25. data/app/assets/javascripts/highcharts/modules/grid-axis.js +1 -1
  26. data/app/assets/javascripts/highcharts/modules/heatmap.js +406 -80
  27. data/app/assets/javascripts/highcharts/modules/histogram-bellcurve.js +513 -0
  28. data/app/assets/javascripts/highcharts/modules/item-series.js +126 -0
  29. data/app/assets/javascripts/highcharts/modules/no-data-to-display.js +31 -13
  30. data/app/assets/javascripts/highcharts/modules/offline-exporting.js +179 -57
  31. data/app/assets/javascripts/highcharts/modules/oldie.js +1378 -0
  32. data/app/assets/javascripts/highcharts/modules/overlapping-datalabels.js +8 -6
  33. data/app/assets/javascripts/highcharts/modules/parallel-coordinates.js +494 -0
  34. data/app/assets/javascripts/highcharts/modules/pareto.js +275 -0
  35. data/app/assets/javascripts/highcharts/modules/sankey.js +641 -0
  36. data/app/assets/javascripts/highcharts/modules/series-label.js +355 -145
  37. data/app/assets/javascripts/highcharts/modules/solid-gauge.js +122 -1
  38. data/app/assets/javascripts/highcharts/modules/static-scale.js +64 -0
  39. data/app/assets/javascripts/highcharts/modules/stock.js +1944 -676
  40. data/app/assets/javascripts/highcharts/modules/streamgraph.js +139 -0
  41. data/app/assets/javascripts/highcharts/modules/sunburst.js +2403 -0
  42. data/app/assets/javascripts/highcharts/modules/tilemap.js +1199 -0
  43. data/app/assets/javascripts/highcharts/modules/treemap.js +538 -134
  44. data/app/assets/javascripts/highcharts/modules/variable-pie.js +490 -0
  45. data/app/assets/javascripts/highcharts/modules/variwide.js +283 -0
  46. data/app/assets/javascripts/highcharts/modules/vector.js +294 -0
  47. data/app/assets/javascripts/highcharts/modules/windbarb.js +490 -0
  48. data/app/assets/javascripts/highcharts/modules/wordcloud.js +681 -0
  49. data/app/assets/javascripts/highcharts/modules/xrange.js +615 -0
  50. data/app/assets/javascripts/highcharts/themes/avocado.js +54 -0
  51. data/app/assets/javascripts/highcharts/themes/dark-blue.js +6 -6
  52. data/app/assets/javascripts/highcharts/themes/dark-green.js +6 -6
  53. data/app/assets/javascripts/highcharts/themes/dark-unica.js +6 -6
  54. data/app/assets/javascripts/highcharts/themes/gray.js +14 -10
  55. data/app/assets/javascripts/highcharts/themes/grid-light.js +6 -6
  56. data/app/assets/javascripts/highcharts/themes/grid.js +7 -5
  57. data/app/assets/javascripts/highcharts/themes/sand-signika.js +8 -7
  58. data/app/assets/javascripts/highcharts/themes/skies.js +15 -9
  59. data/app/assets/javascripts/highcharts/themes/sunset.js +53 -0
  60. data/app/assets/stylesheets/highcharts/highcharts.css +802 -0
  61. data/app/assets/stylesheets/highcharts/highcharts.scss +665 -0
  62. data/lib/highcharts/version.rb +1 -1
  63. metadata +31 -1
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license Highcharts JS v5.0.14 (2017-07-28)
2
+ * @license Highcharts JS v6.0.0 (2017-10-04)
3
3
  * Highcharts Drilldown module
4
4
  *
5
5
  * Author: Torstein Honsi
@@ -44,6 +44,17 @@
44
44
 
45
45
  // Add language
46
46
  extend(defaultOptions.lang, {
47
+ /**
48
+ * The text for the button that appears when drilling down, linking
49
+ * back to the parent series. The parent series' name is inserted for
50
+ * `{series.name}`.
51
+ *
52
+ * @type {String}
53
+ * @default Back to {series.name}
54
+ * @since 3.0.8
55
+ * @product highcharts highmaps
56
+ * @apioption lang.drillUpText
57
+ */
47
58
  drillUpText: '◁ Back to {series.name}'
48
59
  });
49
60
 
@@ -60,6 +71,21 @@
60
71
  */
61
72
  defaultOptions.drilldown = {
62
73
 
74
+ /**
75
+ * When this option is false, clicking a single point will drill down
76
+ * all points in the same category, equivalent to clicking the X axis
77
+ * label.
78
+ *
79
+ * @type {Boolean}
80
+ * @sample {highcharts} highcharts/drilldown/allowpointdrilldown-false/
81
+ * Don't allow point drilldown
82
+ * @default true
83
+ * @since 4.1.7
84
+ * @product highcharts
85
+ * @apioption drilldown.allowPointDrilldown
86
+ */
87
+
88
+
63
89
 
64
90
  /**
65
91
  * Additional styles to apply to the X axis label for a point that
@@ -67,30 +93,16 @@
67
93
  * to interaction.
68
94
  *
69
95
  * @type {CSSObject}
70
- * @see In [styled mode](http://www.highcharts.com/docs/chart-design-and-
71
- * style/style-by-css), active label styles can be set with the `.highcharts-
72
- * drilldown-axis-label` class.
96
+ * @see In styled mode, active label styles can be set with the `.highcharts-drilldown-axis-label` class.
73
97
  * @sample {highcharts} highcharts/drilldown/labels/ Label styles
74
98
  * @default { "cursor": "pointer", "color": "#003399", "fontWeight": "bold", "textDecoration": "underline" }
75
99
  * @since 3.0.8
76
100
  * @product highcharts highmaps
77
101
  */
78
102
  activeAxisLabelStyle: {
79
-
80
- /**
81
- */
82
103
  cursor: 'pointer',
83
-
84
- /**
85
- */
86
104
  color: '#003399',
87
-
88
- /**
89
- */
90
105
  fontWeight: 'bold',
91
-
92
- /**
93
- */
94
106
  textDecoration: 'underline'
95
107
  },
96
108
 
@@ -100,8 +112,7 @@
100
112
  * interaction.
101
113
  *
102
114
  * @type {CSSObject}
103
- * @see In [styled mode](http://www.highcharts.com/docs/chart-design-and-
104
- * style/style-by-css), active data label styles can be applied with
115
+ * @see In styled mode, active data label styles can be applied with
105
116
  * the `.highcharts-drilldown-data-label` class.
106
117
  * @sample {highcharts} highcharts/drilldown/labels/ Label styles
107
118
  * @default { "cursor": "pointer", "color": "#003399", "fontWeight": "bold", "textDecoration": "underline" }
@@ -109,21 +120,9 @@
109
120
  * @product highcharts highmaps
110
121
  */
111
122
  activeDataLabelStyle: {
112
-
113
- /**
114
- */
115
123
  cursor: 'pointer',
116
-
117
- /**
118
- */
119
124
  color: '#003399',
120
-
121
- /**
122
- */
123
125
  fontWeight: 'bold',
124
-
125
- /**
126
- */
127
126
  textDecoration: 'underline'
128
127
  },
129
128
 
@@ -161,6 +160,8 @@
161
160
  animation: {
162
161
 
163
162
  /**
163
+ * Duration for the drilldown animation.
164
+ * @default 500
164
165
  */
165
166
  duration: 500
166
167
  },
@@ -189,20 +190,76 @@
189
190
  position: {
190
191
 
191
192
  /**
193
+ * Horizontal alignment.
194
+ * @type {String}
192
195
  */
193
196
  align: 'right',
194
197
 
195
198
  /**
199
+ * The X offset of the button.
200
+ * @type {Number}
196
201
  */
197
202
  x: -10,
198
203
 
199
204
  /**
205
+ * The Y offset of the button.
206
+ * @type {Number}
200
207
  */
201
208
  y: 10
209
+
210
+ /**
211
+ * Vertical alignment of the button.
212
+ *
213
+ * @type {String}
214
+ * @default top
215
+ * @validvalue ["top", "middle", "bottom"]
216
+ * @product highcharts highmaps
217
+ * @apioption drilldown.drillUpButton.position.verticalAlign
218
+ */
202
219
  }
203
- // relativeTo: 'plotBox'
204
- // theme
220
+ /**
221
+ * What box to align the button to. Can be either `plotBox` or
222
+ * `spacingBox.
223
+ *
224
+ * @type {String}
225
+ * @default plotBox
226
+ * @validvalue ["plotBox", "spacingBox"]
227
+ * @since 3.0.8
228
+ * @product highcharts highmaps
229
+ * @apioption drilldown.drillUpButton.relativeTo
230
+ */
231
+
232
+ /**
233
+ * A collection of attributes for the button. The object takes SVG attributes
234
+ * like `fill`, `stroke`, `stroke-width` or `r`, the border radius.
235
+ * The theme also supports `style`, a collection of CSS properties for
236
+ * the text. Equivalent attributes for the hover state are given in
237
+ * `theme.states.hover`.
238
+ *
239
+ * @type {Object}
240
+ * @see In styled mode, drill-up button styles can be applied with the
241
+ * `.highcharts-drillup-button` class.
242
+ * @sample {highcharts} highcharts/drilldown/drillupbutton/
243
+ * Button theming
244
+ * @sample {highmaps} highcharts/drilldown/drillupbutton/
245
+ * Button theming
246
+ * @since 3.0.8
247
+ * @product highcharts highmaps
248
+ * @apioption drilldown.drillUpButton.theme
249
+ */
205
250
  }
251
+
252
+ /**
253
+ * An array of series configurations for the drill down. Each series
254
+ * configuration uses the same syntax as the [series](#series) option
255
+ * set. These drilldown series are hidden by default. The drilldown
256
+ * series is linked to the parent series' point by its `id`.
257
+ *
258
+ * @type {Array<Object>}
259
+ * @since 3.0.8
260
+ * @product highcharts highmaps
261
+ * @apioption drilldown.series
262
+ */
206
263
  };
207
264
 
208
265
 
@@ -271,6 +328,17 @@
271
328
  * @apioption chart.events.drillupall
272
329
  */
273
330
 
331
+ /**
332
+ * The `id` of a series in the [drilldown.series](#drilldown.series)
333
+ * array to use for a drilldown for this point.
334
+ *
335
+ * @type {String}
336
+ * @sample {highcharts} highcharts/drilldown/basic/ Basic drilldown
337
+ * @since 3.0.8
338
+ * @product highcharts
339
+ * @apioption series.line.data.drilldown
340
+ */
341
+
274
342
  /**
275
343
  * A general fadeIn method
276
344
  */
@@ -422,7 +490,7 @@
422
490
  }
423
491
  });
424
492
  }
425
-
493
+ this.pointer.reset();
426
494
  this.redraw();
427
495
  this.showDrillUpButton();
428
496
  };
@@ -695,7 +763,7 @@
695
763
  group = this.group,
696
764
  // For 3d column series all columns are added to one group
697
765
  // so we should not delete the whole group. #5297
698
- removeGroup = group !== this.chart.seriesGroup,
766
+ removeGroup = group !== this.chart.columnGroup,
699
767
  series = this;
700
768
 
701
769
  // Cancel mouse events on the series group (#2787)
@@ -925,14 +993,16 @@
925
993
  point.doDrilldown(undefined, undefined, e);
926
994
  }
927
995
  });
928
- /*wrap(point, 'importEvents', function (proceed) { // wrapping importEvents makes point.click event work
996
+ /*
997
+ wrap(point, 'importEvents', function (proceed) { // wrapping importEvents makes point.click event work
929
998
  if (!this.hasImportedEvents) {
930
999
  proceed.call(this);
931
1000
  H.addEvent(this, 'click', function () {
932
1001
  this.doDrilldown();
933
1002
  });
934
1003
  }
935
- });*/
1004
+ });
1005
+ */
936
1006
 
937
1007
  }
938
1008
 
@@ -0,0 +1,597 @@
1
+ /**
2
+ * @license Highcharts JS v6.0.0 (2017-10-04)
3
+ * Exporting module
4
+ *
5
+ * (c) 2010-2017 Torstein Honsi
6
+ *
7
+ * License: www.highcharts.com/license
8
+ */
9
+ 'use strict';
10
+ (function(factory) {
11
+ if (typeof module === 'object' && module.exports) {
12
+ module.exports = factory;
13
+ } else {
14
+ factory(Highcharts);
15
+ }
16
+ }(function(Highcharts) {
17
+ (function(Highcharts) {
18
+ /**
19
+ * Experimental data export module for Highcharts
20
+ *
21
+ * (c) 2010-2017 Torstein Honsi
22
+ *
23
+ * License: www.highcharts.com/license
24
+ */
25
+
26
+ // @todo
27
+ // - Deprecate repo and plugins page
28
+ // - Before official release, set up systematic tests for all series types
29
+
30
+ /* eslint max-len: ["warn", 80, 4] */
31
+
32
+ var each = Highcharts.each,
33
+ pick = Highcharts.pick,
34
+ win = Highcharts.win,
35
+ doc = win.document,
36
+ seriesTypes = Highcharts.seriesTypes,
37
+ downloadAttrSupported = doc.createElement('a').download !== undefined;
38
+
39
+ Highcharts.setOptions({
40
+ /**
41
+ * @optionparent exporting
42
+ */
43
+ exporting: {
44
+ /**
45
+ * Options for exporting data to CSV or ExCel, or displaying the data
46
+ * in a HTML table or a JavaScript structure. Requires the
47
+ * `export-data.js` module. This module adds data export options to the
48
+ * export menu and provides functions like `Chart.getCSV`,
49
+ * `Chart.getTable`, `Chart.getDataRows` and `Chart.viewData`.
50
+ *
51
+ * @sample highcharts/export-data/categorized/ Categorized data
52
+ * @sample highcharts/export-data/stock-timeaxis/ Highstock time axis
53
+ *
54
+ * @since 6.0.0
55
+ */
56
+ csv: {
57
+ /**
58
+ * Formatter callback for the column headers. Parameters are:
59
+ * - `item` - The series or axis object)
60
+ * - `key` - The point key, for example y or z
61
+ * - `keyLength` - The amount of value keys for this item, for
62
+ * example a range series has the keys `low` and `high` so the
63
+ * key length is 2.
64
+ *
65
+ * By default it returns the series name, followed by the key if
66
+ * there is more than one key. For the axis it returns the axis
67
+ * title or "Category" or "DateTime" by default.
68
+ *
69
+ * Return `false` to use Highcharts' proposed header.
70
+ *
71
+ * @type {Function|null}
72
+ */
73
+ columnHeaderFormatter: null,
74
+ /**
75
+ * Which date format to use for exported dates on a datetime X axis.
76
+ * See `Highcharts.dateFormat`.
77
+ */
78
+ dateFormat: '%Y-%m-%d %H:%M:%S',
79
+ /**
80
+ * The item delimiter in the exported data. Use `;` for direct
81
+ * exporting to Excel.
82
+ */
83
+ itemDelimiter: ',',
84
+ /**
85
+ * The line delimiter in the exported data, defaults to a newline.
86
+ */
87
+ lineDelimiter: '\n'
88
+ },
89
+ /**
90
+ * Export-data module required. Show a HTML table below the chart with
91
+ * the chart's current data.
92
+ *
93
+ * @sample highcharts/export-data/showtable/ Show the table
94
+ * @since 6.0.0
95
+ */
96
+ showTable: false
97
+ },
98
+ /**
99
+ * @optionparent lang
100
+ */
101
+ lang: {
102
+ /**
103
+ * Export-data module only. The text for the menu item.
104
+ * @since 6.0.0
105
+ */
106
+ downloadCSV: 'Download CSV',
107
+ /**
108
+ * Export-data module only. The text for the menu item.
109
+ * @since 6.0.0
110
+ */
111
+ downloadXLS: 'Download XLS',
112
+ /**
113
+ * Export-data module only. The text for the menu item.
114
+ * @since 6.0.0
115
+ */
116
+ viewData: 'View data table'
117
+ }
118
+ });
119
+
120
+ // Add an event listener to handle the showTable option
121
+ Highcharts.Chart.prototype.callbacks.push(function(chart) {
122
+ Highcharts.addEvent(chart, 'render', function() {
123
+ if (chart.options.exporting.showTable) {
124
+ chart.viewData();
125
+ }
126
+ });
127
+ });
128
+
129
+ // Set up key-to-axis bindings. This is used when the Y axis is datetime or
130
+ // categorized. For example in an arearange series, the low and high values
131
+ // sholud be formatted according to the Y axis type, and in order to link them
132
+ // we need this map.
133
+ Highcharts.Chart.prototype.setUpKeyToAxis = function() {
134
+ if (seriesTypes.arearange) {
135
+ seriesTypes.arearange.prototype.keyToAxis = {
136
+ low: 'y',
137
+ high: 'y'
138
+ };
139
+ }
140
+ };
141
+
142
+ /**
143
+ * Export-data module required. Returns a two-dimensional array containing the
144
+ * current chart data.
145
+ *
146
+ * @returns {Array.<Array>}
147
+ * The current chart data
148
+ */
149
+ Highcharts.Chart.prototype.getDataRows = function() {
150
+ var csvOptions = (this.options.exporting && this.options.exporting.csv) || {},
151
+ xAxis,
152
+ xAxes = this.xAxis,
153
+ rows = {},
154
+ rowArr = [],
155
+ dataRows,
156
+ names = [],
157
+ i,
158
+ x,
159
+ xTitle,
160
+ // Options
161
+ columnHeaderFormatter = function(item, key, keyLength) {
162
+
163
+ if (csvOptions.columnHeaderFormatter) {
164
+ var s = csvOptions.columnHeaderFormatter(item, key, keyLength);
165
+ if (s !== false) {
166
+ return s;
167
+ }
168
+ }
169
+
170
+
171
+ if (item instanceof Highcharts.Axis) {
172
+ return (item.options.title && item.options.title.text) ||
173
+ (item.isDatetimeAxis ? 'DateTime' : 'Category');
174
+ }
175
+ return item ?
176
+ item.name + (keyLength > 1 ? ' (' + key + ')' : '') :
177
+ 'Category';
178
+ },
179
+ xAxisIndices = [];
180
+
181
+ // Loop the series and index values
182
+ i = 0;
183
+
184
+ this.setUpKeyToAxis();
185
+
186
+ each(this.series, function(series) {
187
+ var keys = series.options.keys,
188
+ pointArrayMap = keys || series.pointArrayMap || ['y'],
189
+ valueCount = pointArrayMap.length,
190
+ xTaken = !series.requireSorting && {},
191
+ categoryMap = {},
192
+ datetimeValueAxisMap = {},
193
+ xAxisIndex = Highcharts.inArray(series.xAxis, xAxes),
194
+ j;
195
+
196
+ // Map the categories for value axes
197
+ each(pointArrayMap, function(prop) {
198
+
199
+ var axisName = (
200
+ (series.keyToAxis && series.keyToAxis[prop]) ||
201
+ prop
202
+ ) + 'Axis';
203
+
204
+ categoryMap[prop] = (
205
+ series[axisName] &&
206
+ series[axisName].categories
207
+ ) || [];
208
+ datetimeValueAxisMap[prop] = (
209
+ series[axisName] &&
210
+ series[axisName].isDatetimeAxis
211
+ );
212
+ });
213
+
214
+ if (
215
+ series.options.includeInCSVExport !== false &&
216
+ series.visible !== false // #55
217
+ ) {
218
+
219
+ // Build a lookup for X axis index and the position of the first
220
+ // series that belongs to that X axis. Includes -1 for non-axis
221
+ // series types like pies.
222
+ if (!Highcharts.find(xAxisIndices, function(index) {
223
+ return index[0] === xAxisIndex;
224
+ })) {
225
+ xAxisIndices.push([xAxisIndex, i]);
226
+ }
227
+
228
+ // Add the column headers, usually the same as series names
229
+ j = 0;
230
+ while (j < valueCount) {
231
+ names.push(columnHeaderFormatter(
232
+ series,
233
+ pointArrayMap[j],
234
+ pointArrayMap.length
235
+ ));
236
+ j++;
237
+ }
238
+
239
+ each(series.points, function(point, pIdx) {
240
+ var key = point.x,
241
+ prop,
242
+ val;
243
+
244
+ if (xTaken) {
245
+ if (xTaken[key]) {
246
+ key += '|' + pIdx;
247
+ }
248
+ xTaken[key] = true;
249
+ }
250
+
251
+ j = 0;
252
+
253
+ if (!rows[key]) {
254
+ // Generate the row
255
+ rows[key] = [];
256
+ // Contain the X values from one or more X axes
257
+ rows[key].xValues = [];
258
+ }
259
+ rows[key].x = point.x;
260
+ rows[key].xValues[xAxisIndex] = point.x;
261
+
262
+ // Pies, funnels, geo maps etc. use point name in X row
263
+ if (!series.xAxis || series.exportKey === 'name') {
264
+ rows[key].name = point.name;
265
+ }
266
+
267
+ while (j < valueCount) {
268
+ prop = pointArrayMap[j]; // y, z etc
269
+ val = point[prop];
270
+ rows[key][i + j] = pick(
271
+ categoryMap[prop][val], // Y axis category if present
272
+ datetimeValueAxisMap[prop] ?
273
+ Highcharts.dateFormat(csvOptions.dateFormat, val) :
274
+ null,
275
+ val
276
+ );
277
+ j++;
278
+ }
279
+
280
+ });
281
+ i = i + j;
282
+ }
283
+ });
284
+
285
+ // Make a sortable array
286
+ for (x in rows) {
287
+ if (rows.hasOwnProperty(x)) {
288
+ rowArr.push(rows[x]);
289
+ }
290
+ }
291
+
292
+ var xAxisIndex, column;
293
+ dataRows = [names];
294
+
295
+ i = xAxisIndices.length;
296
+ while (i--) { // Start from end to splice in
297
+ xAxisIndex = xAxisIndices[i][0];
298
+ column = xAxisIndices[i][1];
299
+ xAxis = xAxes[xAxisIndex];
300
+
301
+ // Sort it by X values
302
+ rowArr.sort(function(a, b) { // eslint-disable-line no-loop-func
303
+ return a.xValues[xAxisIndex] - b.xValues[xAxisIndex];
304
+ });
305
+
306
+ // Add header row
307
+ xTitle = columnHeaderFormatter(xAxis);
308
+ dataRows[0].splice(column, 0, xTitle);
309
+
310
+ // Add the category column
311
+ each(rowArr, function(row) { // eslint-disable-line no-loop-func
312
+ var category = row.name;
313
+ if (!category) {
314
+ if (xAxis.isDatetimeAxis) {
315
+ if (row.x instanceof Date) {
316
+ row.x = row.x.getTime();
317
+ }
318
+ category = Highcharts.dateFormat(
319
+ csvOptions.dateFormat,
320
+ row.x
321
+ );
322
+ } else if (xAxis.categories) {
323
+ category = pick(
324
+ xAxis.names[row.x],
325
+ xAxis.categories[row.x],
326
+ row.x
327
+ );
328
+ } else {
329
+ category = row.x;
330
+ }
331
+ }
332
+
333
+ // Add the X/date/category
334
+ row.splice(column, 0, category);
335
+ });
336
+ }
337
+ dataRows = dataRows.concat(rowArr);
338
+
339
+ return dataRows;
340
+ };
341
+
342
+ /**
343
+ * Export-data module required. Returns the current chart data as a CSV string.
344
+ *
345
+ * @param {Boolean} useLocalDecimalPoint
346
+ * Whether to use the local decimal point as detected from the browser.
347
+ * This makes it easier to export data to Excel in the same locale as
348
+ * the user is.
349
+ *
350
+ * @returns {String}
351
+ * CSV representation of the data
352
+ */
353
+ Highcharts.Chart.prototype.getCSV = function(useLocalDecimalPoint) {
354
+ var csv = '',
355
+ rows = this.getDataRows(),
356
+ csvOptions = this.options.exporting.csv,
357
+ // use ';' for direct to Excel
358
+ itemDelimiter = csvOptions.itemDelimiter,
359
+ // '\n' isn't working with the js csv data extraction
360
+ lineDelimiter = csvOptions.lineDelimiter;
361
+
362
+ // Transform the rows to CSV
363
+ each(rows, function(row, i) {
364
+ var val = '',
365
+ j = row.length,
366
+ n = useLocalDecimalPoint ? (1.1).toLocaleString()[1] : '.';
367
+ while (j--) {
368
+ val = row[j];
369
+ if (typeof val === 'string') {
370
+ val = '"' + val + '"';
371
+ }
372
+ if (typeof val === 'number') {
373
+ if (n === ',') {
374
+ val = val.toString().replace('.', ',');
375
+ }
376
+ }
377
+ row[j] = val;
378
+ }
379
+ // Add the values
380
+ csv += row.join(itemDelimiter);
381
+
382
+ // Add the line delimiter
383
+ if (i < rows.length - 1) {
384
+ csv += lineDelimiter;
385
+ }
386
+ });
387
+ return csv;
388
+ };
389
+
390
+ /**
391
+ * Export-data module required. Build a HTML table with the chart's current
392
+ * data.
393
+ *
394
+ * @sample highcharts/export-data/viewdata/
395
+ * View the data from the export menu
396
+ * @returns {String}
397
+ * HTML representation of the data.
398
+ */
399
+ Highcharts.Chart.prototype.getTable = function(useLocalDecimalPoint) {
400
+ var html = '<table><thead>',
401
+ rows = this.getDataRows();
402
+
403
+ // Transform the rows to HTML
404
+ each(rows, function(row, i) {
405
+ var tag = i ? 'td' : 'th',
406
+ val,
407
+ j,
408
+ n = useLocalDecimalPoint ? (1.1).toLocaleString()[1] : '.';
409
+
410
+ html += '<tr>';
411
+ for (j = 0; j < row.length; j = j + 1) {
412
+ val = row[j];
413
+ // Add the cell
414
+ if (typeof val === 'number') {
415
+ val = val.toString();
416
+ if (n === ',') {
417
+ val = val.replace('.', n);
418
+ }
419
+ html += '<' + tag + ' class="number">' + val + '</' + tag + '>';
420
+
421
+ } else {
422
+ html += '<' + tag + ' class="text">' +
423
+ (val === undefined ? '' : val) + '</' + tag + '>';
424
+ }
425
+ }
426
+
427
+ html += '</tr>';
428
+
429
+ // After the first row, end head and start body
430
+ if (!i) {
431
+ html += '</thead><tbody>';
432
+ }
433
+
434
+ });
435
+ html += '</tbody></table>';
436
+
437
+ return html;
438
+ };
439
+
440
+ /**
441
+ * File download using download attribute if supported.
442
+ *
443
+ * @private
444
+ */
445
+ Highcharts.Chart.prototype.fileDownload = function(href, extension, content) {
446
+ var a,
447
+ blobObject,
448
+ name;
449
+
450
+ if (this.options.exporting.filename) {
451
+ name = this.options.exporting.filename;
452
+ } else if (this.title) {
453
+ name = this.title.textStr.replace(/ /g, '-').toLowerCase();
454
+ } else {
455
+ name = 'chart';
456
+ }
457
+
458
+ // MS specific. Check this first because of bug with Edge (#76)
459
+ if (win.Blob && win.navigator.msSaveOrOpenBlob) {
460
+ // Falls to msSaveOrOpenBlob if download attribute is not supported
461
+ blobObject = new win.Blob(
462
+ ['\uFEFF' + content], // #7084
463
+ {
464
+ type: 'text/csv'
465
+ }
466
+ );
467
+ win.navigator.msSaveOrOpenBlob(blobObject, name + '.' + extension);
468
+
469
+ // Download attribute supported
470
+ } else if (downloadAttrSupported) {
471
+ a = doc.createElement('a');
472
+ a.href = href;
473
+ a.download = name + '.' + extension;
474
+ this.container.appendChild(a); // #111
475
+ a.click();
476
+ a.remove();
477
+
478
+ } else {
479
+ Highcharts.error('The browser doesn\'t support downloading files');
480
+ }
481
+ };
482
+
483
+ /**
484
+ * Call this on click of 'Download CSV' button
485
+ *
486
+ * @private
487
+ */
488
+ Highcharts.Chart.prototype.downloadCSV = function() {
489
+ var csv = this.getCSV(true);
490
+ this.fileDownload(
491
+ 'data:text/csv,\uFEFF' + encodeURIComponent(csv),
492
+ 'csv',
493
+ csv,
494
+ 'text/csv'
495
+ );
496
+ };
497
+
498
+ /**
499
+ * Call this on click of 'Download XLS' button
500
+ *
501
+ * @private
502
+ */
503
+ Highcharts.Chart.prototype.downloadXLS = function() {
504
+ var uri = 'data:application/vnd.ms-excel;base64,',
505
+ template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" ' +
506
+ 'xmlns:x="urn:schemas-microsoft-com:office:excel" ' +
507
+ 'xmlns="http://www.w3.org/TR/REC-html40">' +
508
+ '<head><!--[if gte mso 9]><xml><x:ExcelWorkbook>' +
509
+ '<x:ExcelWorksheets><x:ExcelWorksheet>' +
510
+ '<x:Name>Ark1</x:Name>' +
511
+ '<x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions>' +
512
+ '</x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook>' +
513
+ '</xml><![endif]-->' +
514
+ '<style>td{border:none;font-family: Calibri, sans-serif;} ' +
515
+ '.number{mso-number-format:"0.00";} ' +
516
+ '.text{ mso-number-format:"\@";}</style>' +
517
+ '<meta name=ProgId content=Excel.Sheet>' +
518
+ '<meta charset=UTF-8>' +
519
+ '</head><body>' +
520
+ this.getTable(true) +
521
+ '</body></html>',
522
+ base64 = function(s) {
523
+ return win.btoa(unescape(encodeURIComponent(s))); // #50
524
+ };
525
+ this.fileDownload(
526
+ uri + base64(template),
527
+ 'xls',
528
+ template,
529
+ 'application/vnd.ms-excel'
530
+ );
531
+ };
532
+
533
+ /**
534
+ * Export-data module required. View the data in a table below the chart.
535
+ */
536
+ Highcharts.Chart.prototype.viewData = function() {
537
+ if (!this.dataTableDiv) {
538
+ this.dataTableDiv = doc.createElement('div');
539
+ this.dataTableDiv.className = 'highcharts-data-table';
540
+
541
+ // Insert after the chart container
542
+ this.renderTo.parentNode.insertBefore(
543
+ this.dataTableDiv,
544
+ this.renderTo.nextSibling
545
+ );
546
+ }
547
+
548
+ this.dataTableDiv.innerHTML = this.getTable();
549
+ };
550
+
551
+
552
+ // Add "Download CSV" to the exporting menu.
553
+ var exportingOptions = Highcharts.getOptions().exporting;
554
+ if (exportingOptions) {
555
+
556
+ Highcharts.extend(exportingOptions.menuItemDefinitions, {
557
+ downloadCSV: {
558
+ textKey: 'downloadCSV',
559
+ onclick: function() {
560
+ this.downloadCSV();
561
+ }
562
+ },
563
+ downloadXLS: {
564
+ textKey: 'downloadXLS',
565
+ onclick: function() {
566
+ this.downloadXLS();
567
+ }
568
+ },
569
+ viewData: {
570
+ textKey: 'viewData',
571
+ onclick: function() {
572
+ this.viewData();
573
+ }
574
+ }
575
+ });
576
+
577
+ exportingOptions.buttons.contextButton.menuItems.push(
578
+ 'separator',
579
+ 'downloadCSV',
580
+ 'downloadXLS',
581
+ 'viewData'
582
+ );
583
+ }
584
+
585
+ // Series specific
586
+ if (seriesTypes.map) {
587
+ seriesTypes.map.prototype.exportKey = 'name';
588
+ }
589
+ if (seriesTypes.mapbubble) {
590
+ seriesTypes.mapbubble.prototype.exportKey = 'name';
591
+ }
592
+ if (seriesTypes.treemap) {
593
+ seriesTypes.treemap.prototype.exportKey = 'name';
594
+ }
595
+
596
+ }(Highcharts));
597
+ }));