@datarailsshared/dr_renderer 1.2.178 → 1.2.179
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.
- package/package.json +1 -1
- package/src/highcharts_renderer.js +419 -40
package/package.json
CHANGED
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
const SERIES_CLASSNAMES = {
|
|
2
|
+
WATERFALL_BREAKDOWN: 'waterfallBreakdown',
|
|
3
|
+
TOTAL_SERIES: 'totalSeries',
|
|
4
|
+
TREND_SERIES: 'trendSeries',
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
const EMPTY_ROW_N_KEYS = [[]];
|
|
8
|
+
const NULL_VALUE = '[null]';
|
|
9
|
+
|
|
1
10
|
let getHighchartsRenderer = function ($, document, Highcharts, default_colors, highchartsRenderer,
|
|
2
11
|
DataFormatter, lodash, moment_lib, isNewAngular) {
|
|
3
12
|
|
|
@@ -51,6 +60,32 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
51
60
|
].join(''), 'i');
|
|
52
61
|
highchartsRenderer.isMobile = mobileBrowserRegex.test(navigator.userAgent);
|
|
53
62
|
|
|
63
|
+
highchartsRenderer.CHART_TYPES = {
|
|
64
|
+
LINE_CHART: 'line-chart',
|
|
65
|
+
LINE_CHART_SMOOTH: 'line-chart-smooth',
|
|
66
|
+
COLUMN_CHART: 'column-chart',
|
|
67
|
+
COLUMN_CHART_STACKED: 'column-chart-stacked',
|
|
68
|
+
COMBO_CHART: 'combo-chart',
|
|
69
|
+
COMBO_COLUMN_CHART: 'combo-column-chart',
|
|
70
|
+
COMBO_STACKED_CHART: 'combo-stacked-chart',
|
|
71
|
+
BAR_CHART: 'bar-chart',
|
|
72
|
+
BAR_CHART_STACKED: 'bar-chart-stacked',
|
|
73
|
+
SCATTER_CHART: 'scatter-chart',
|
|
74
|
+
AREA_CHART: 'area-chart',
|
|
75
|
+
AREA_CHART_SMOOTH: 'area-chart-smooth',
|
|
76
|
+
TABLE_ONLY: 'table_only',
|
|
77
|
+
POLYGON_CHART: 'polygon-chart',
|
|
78
|
+
PIE_CHART: 'pie-chart',
|
|
79
|
+
PIE_CHART_DRILLDOWN: 'pie-chart-drilldown',
|
|
80
|
+
GAUGE_SOLID_CHART: 'gauge-solid-chart',
|
|
81
|
+
GAUGE_CHART: 'gauge-chart',
|
|
82
|
+
KPI_WIDGET: 'kpi-widget',
|
|
83
|
+
TEXT_WIDGET: 'text-widget',
|
|
84
|
+
WATERFALL_BREAKDOWN: 'waterfall-chart-breakdown',
|
|
85
|
+
PUBLISHED_ITEM: 'published_item',
|
|
86
|
+
RICH_TEXT: 'rich_text',
|
|
87
|
+
};
|
|
88
|
+
|
|
54
89
|
highchartsRenderer.highcharts_theme = {
|
|
55
90
|
"colors": highchartsRenderer.defaults_colors,
|
|
56
91
|
"chart": {
|
|
@@ -423,7 +458,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
423
458
|
|
|
424
459
|
const labelOptions = lodash.get(opts.chartOptions, 'label') || lodash.get(opts.chartOptions, 'label_pie');
|
|
425
460
|
const othersName = opts.total_value_options ?
|
|
426
|
-
|
|
461
|
+
highchartsRenderer.getOthersName(opts) :
|
|
427
462
|
undefined;
|
|
428
463
|
var drOthersInColumn = lodash.find(
|
|
429
464
|
pivotData.getColKeys(),
|
|
@@ -445,6 +480,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
445
480
|
|| this.series.options.className === 'trendSeries') {
|
|
446
481
|
rows = [];
|
|
447
482
|
}
|
|
483
|
+
|
|
448
484
|
var cols = this.key;
|
|
449
485
|
if (typeof (cols) == 'object' && cols.name) {
|
|
450
486
|
cols = cols.name;
|
|
@@ -500,6 +536,13 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
500
536
|
}
|
|
501
537
|
|
|
502
538
|
const percentageWrapper = percentageArray.length ? `(${percentageArray.join(', ')})` : '';
|
|
539
|
+
|
|
540
|
+
if (this.series.options.className === SERIES_CLASSNAMES.WATERFALL_BREAKDOWN) {
|
|
541
|
+
const modifiedRowsAndCols = highchartsRenderer.transformRowsAndColsForBreakdown(rows, cols, this.point, opts);
|
|
542
|
+
rows = modifiedRowsAndCols.rows;
|
|
543
|
+
cols = modifiedRowsAndCols.cols;
|
|
544
|
+
}
|
|
545
|
+
|
|
503
546
|
var aggr = pivotData.getAggregator(rows, cols);
|
|
504
547
|
|
|
505
548
|
const formattedValue = is_drill_down_pie || labelOptions.show_value ? $.pivotUtilities.getFormattedNumber(value, aggr, opts, true) : '';
|
|
@@ -570,6 +613,8 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
570
613
|
}
|
|
571
614
|
|
|
572
615
|
var func = function () {
|
|
616
|
+
const isWaterfallBreakdown = this.series.options.className === SERIES_CLASSNAMES.WATERFALL_BREAKDOWN;
|
|
617
|
+
|
|
573
618
|
var y = parseFloat(this.y);
|
|
574
619
|
if (pivotData) {
|
|
575
620
|
let series_name = (this.series.name || '') + "";
|
|
@@ -604,8 +649,8 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
604
649
|
cols = rows;
|
|
605
650
|
rows = temp;
|
|
606
651
|
}
|
|
607
|
-
|
|
608
|
-
var category_text = `<span style="font-weight: bold;">${cols} </span>`;
|
|
652
|
+
|
|
653
|
+
var category_text = `<span style="font-weight: bold;">${ cols }${ isWaterfallBreakdown ? ': ' : ' ' }</span>`;
|
|
609
654
|
if (this.category) {
|
|
610
655
|
category_text = '';
|
|
611
656
|
}
|
|
@@ -617,9 +662,18 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
617
662
|
if (pivotData.rowAttrs.length == 0) {
|
|
618
663
|
series_text = ': ';
|
|
619
664
|
}
|
|
665
|
+
|
|
666
|
+
if (isWaterfallBreakdown) {
|
|
667
|
+
const modifiedRowsAndCols = highchartsRenderer.transformRowsAndColsForBreakdown(rows, cols, this.point, opts);
|
|
668
|
+
rows = modifiedRowsAndCols.rows;
|
|
669
|
+
cols = modifiedRowsAndCols.cols;
|
|
670
|
+
}
|
|
671
|
+
|
|
672
|
+
var aggr = pivotData.getAggregator(rows, cols);
|
|
673
|
+
|
|
620
674
|
let formatted_value_to_return = $.pivotUtilities.getFormattedNumber(y, null, opts);
|
|
621
|
-
if (aggr.value()) {
|
|
622
|
-
formatted_value_to_return = $.pivotUtilities.getFormattedNumber(aggr.value(), aggr, opts);
|
|
675
|
+
if (aggr.value() || isWaterfallBreakdown) {
|
|
676
|
+
formatted_value_to_return = $.pivotUtilities.getFormattedNumber(isWaterfallBreakdown ? y : aggr.value(), aggr, opts);
|
|
623
677
|
}
|
|
624
678
|
|
|
625
679
|
let wrappedFormattedValue = highchartsRenderer.getSpanWrapper(formatted_value_to_return);
|
|
@@ -628,7 +682,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
628
682
|
category_text = tooltipOptions.show_x_axis ? category_text : '';
|
|
629
683
|
series_text = tooltipOptions.show_data_series ? series_text : '';
|
|
630
684
|
|
|
631
|
-
let to_return = category_text + series_text + wrappedFormattedValue;
|
|
685
|
+
let to_return = isWaterfallBreakdown ? `${ category_text }${ wrappedFormattedValue }` : category_text + series_text + wrappedFormattedValue;
|
|
632
686
|
|
|
633
687
|
if (is_drill_down_pie) {
|
|
634
688
|
to_return = wrappedFormattedValue;
|
|
@@ -964,7 +1018,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
964
1018
|
const n = col_n_keys.length;
|
|
965
1019
|
const xSum = (1 + n) / 2 * n;
|
|
966
1020
|
const trendSerieses = [];
|
|
967
|
-
const othersName =
|
|
1021
|
+
const othersName = highchartsRenderer.getOthersName(opts);
|
|
968
1022
|
|
|
969
1023
|
lodash.forEach(row_n_keys, function (row_n_value) {
|
|
970
1024
|
var ob = {};
|
|
@@ -1061,7 +1115,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
1061
1115
|
|
|
1062
1116
|
opts.chart_series = []
|
|
1063
1117
|
|
|
1064
|
-
if (!lodash.isEqual(row_n_keys,
|
|
1118
|
+
if (!lodash.isEqual(row_n_keys, EMPTY_ROW_N_KEYS)) {
|
|
1065
1119
|
chart_series.forEach(series => {
|
|
1066
1120
|
opts.chart_series.push(series.name);
|
|
1067
1121
|
})
|
|
@@ -1112,7 +1166,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
1112
1166
|
const n = col_n_keys.length;
|
|
1113
1167
|
const xSum = (1 + n) / 2 * n;
|
|
1114
1168
|
const trendSerieses = [];
|
|
1115
|
-
const othersName =
|
|
1169
|
+
const othersName = highchartsRenderer.getOthersName(opts);
|
|
1116
1170
|
|
|
1117
1171
|
lodash.forEach(row_n_keys, function (row_n_value) {
|
|
1118
1172
|
let ySum = 0;
|
|
@@ -1128,7 +1182,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
1128
1182
|
allowOverlap: additionOptions && additionOptions.label ? additionOptions.label.overlap : false,
|
|
1129
1183
|
enabled: additionOptions && additionOptions.label ? additionOptions.label.show : true,
|
|
1130
1184
|
formatter: highchartsRenderer.defaultDataLabelFormatter(pivotData, {'chartOptions': additionOptions, total_value_options: opts.total_value_options}),
|
|
1131
|
-
style: highchartsRenderer.getDataLabelsStyle(additionOptions)
|
|
1185
|
+
style: highchartsRenderer.getDataLabelsStyle(additionOptions),
|
|
1132
1186
|
}
|
|
1133
1187
|
|
|
1134
1188
|
ob = highchartsRenderer.getDataLabelsOptions(additionOptions, ob);
|
|
@@ -1221,7 +1275,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
1221
1275
|
|
|
1222
1276
|
let weights = { line: 2,spline: 3 ,area:-2, areaspline: -1, scatter:4, column: 1 };
|
|
1223
1277
|
|
|
1224
|
-
if (opts.comboOptions && lodash.includes(chartType,'combo') && !lodash.isEqual(row_n_keys,
|
|
1278
|
+
if (opts.comboOptions && lodash.includes(chartType,'combo') && !lodash.isEqual(row_n_keys, EMPTY_ROW_N_KEYS)) {
|
|
1225
1279
|
chart_series.forEach((series, seriesIndex) => {
|
|
1226
1280
|
const savedSeriesOption = lodash.find(opts.comboOptions.seriesOptions, {series: series.name});
|
|
1227
1281
|
if (savedSeriesOption) {
|
|
@@ -1234,7 +1288,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
1234
1288
|
|
|
1235
1289
|
opts.chart_series = []
|
|
1236
1290
|
|
|
1237
|
-
if (!lodash.isEqual(row_n_keys,
|
|
1291
|
+
if (!lodash.isEqual(row_n_keys, EMPTY_ROW_N_KEYS)) {
|
|
1238
1292
|
chart_series.forEach(series => {
|
|
1239
1293
|
opts.chart_series.push(series.name);
|
|
1240
1294
|
})
|
|
@@ -1284,6 +1338,94 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
1284
1338
|
return chart_series;
|
|
1285
1339
|
}
|
|
1286
1340
|
|
|
1341
|
+
highchartsRenderer.ptCreateWaterfallBreakdownSeries = function (pivotData, onlyNumbers, additionOptions, opts) {
|
|
1342
|
+
const colorOptions = opts.breakdown_options.colors;
|
|
1343
|
+
var chart_series = [],
|
|
1344
|
+
row_n_keys = pivotData.getRowKeys(),
|
|
1345
|
+
col_n_keys = pivotData.getColKeys();
|
|
1346
|
+
|
|
1347
|
+
if (row_n_keys.length === 0) {
|
|
1348
|
+
row_n_keys.push([]);
|
|
1349
|
+
}
|
|
1350
|
+
|
|
1351
|
+
let resultObject = {
|
|
1352
|
+
data: [],
|
|
1353
|
+
dataLabels: {
|
|
1354
|
+
allowOverlap: additionOptions && additionOptions.label ? additionOptions.label.overlap : false,
|
|
1355
|
+
enabled: additionOptions && additionOptions.label ? additionOptions.label.show : true,
|
|
1356
|
+
formatter: highchartsRenderer.defaultDataLabelFormatter(pivotData, {'chartOptions': additionOptions, total_value_options: opts.total_value_options}),
|
|
1357
|
+
style: highchartsRenderer.getDataLabelsStyle(additionOptions),
|
|
1358
|
+
},
|
|
1359
|
+
upColor: colorOptions.increase,
|
|
1360
|
+
color: colorOptions.decrease,
|
|
1361
|
+
className: SERIES_CLASSNAMES.WATERFALL_BREAKDOWN
|
|
1362
|
+
};
|
|
1363
|
+
resultObject = highchartsRenderer.getDataLabelsOptions(additionOptions, resultObject);
|
|
1364
|
+
|
|
1365
|
+
const breakdownValues = [];
|
|
1366
|
+
lodash.forEach(col_n_keys, function(col_n_value, col_index) {
|
|
1367
|
+
breakdownValues.push([]);
|
|
1368
|
+
lodash.forEach(row_n_keys, function (row_n_value, row_index) {
|
|
1369
|
+
var agg = pivotData.getAggregator(row_n_value, col_n_value);
|
|
1370
|
+
var val = agg.value();
|
|
1371
|
+
|
|
1372
|
+
if (val != null && $.isNumeric(val)) {
|
|
1373
|
+
val = parseFloat(val);
|
|
1374
|
+
} else if (onlyNumbers) {
|
|
1375
|
+
val = NaN;
|
|
1376
|
+
} else {
|
|
1377
|
+
val = 0;
|
|
1378
|
+
}
|
|
1379
|
+
|
|
1380
|
+
breakdownValues[col_index][row_index] = val;
|
|
1381
|
+
|
|
1382
|
+
if (col_index) {
|
|
1383
|
+
const value = val - breakdownValues[col_index - 1][row_index];
|
|
1384
|
+
|
|
1385
|
+
if (value) {
|
|
1386
|
+
var tmoobj = {};
|
|
1387
|
+
var key = row_n_value;
|
|
1388
|
+
if (lodash.isArray(row_n_value)) {
|
|
1389
|
+
key = row_n_value[0];
|
|
1390
|
+
}
|
|
1391
|
+
tmoobj.name = lodash.unescape(key);
|
|
1392
|
+
|
|
1393
|
+
if (tmoobj.name) {
|
|
1394
|
+
tmoobj.name = tmoobj.name.replace('DR_Others', highchartsRenderer.getOthersName(opts));
|
|
1395
|
+
}
|
|
1396
|
+
|
|
1397
|
+
if (lodash.isEmpty(String(tmoobj.name))) {
|
|
1398
|
+
tmoobj.name = lodash.unescape(col_n_value);
|
|
1399
|
+
tmoobj.visible = false;
|
|
1400
|
+
}
|
|
1401
|
+
tmoobj.y = value;
|
|
1402
|
+
tmoobj.colKeys = [lodash.unescape(col_n_keys[col_index - 1]), lodash.unescape(col_n_value)];
|
|
1403
|
+
resultObject.data.push(tmoobj);
|
|
1404
|
+
}
|
|
1405
|
+
}
|
|
1406
|
+
});
|
|
1407
|
+
|
|
1408
|
+
resultObject.data.push({
|
|
1409
|
+
y: pivotData.colTotals[col_n_value].sum,
|
|
1410
|
+
name: lodash.unescape(col_n_value).replace('DR_Others', highchartsRenderer.getOthersName(opts)),
|
|
1411
|
+
isSum: !!col_index,
|
|
1412
|
+
isTotal: true,
|
|
1413
|
+
color: colorOptions.total,
|
|
1414
|
+
});
|
|
1415
|
+
});
|
|
1416
|
+
|
|
1417
|
+
chart_series.push(resultObject);
|
|
1418
|
+
|
|
1419
|
+
opts.chart_series = [];
|
|
1420
|
+
if (!lodash.isEqual(row_n_keys, EMPTY_ROW_N_KEYS)) {
|
|
1421
|
+
chart_series.forEach(series => {
|
|
1422
|
+
opts.chart_series.push(series.name);
|
|
1423
|
+
});
|
|
1424
|
+
}
|
|
1425
|
+
|
|
1426
|
+
return chart_series;
|
|
1427
|
+
}
|
|
1428
|
+
|
|
1287
1429
|
highchartsRenderer.setChartTypeBySeriesType = function (type, series) {
|
|
1288
1430
|
const types = {
|
|
1289
1431
|
'line-chart': 'line',
|
|
@@ -1397,7 +1539,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
1397
1539
|
var num_rows = row_n_keys.length;
|
|
1398
1540
|
|
|
1399
1541
|
const isOthersIncludedInRow = num_rows === 1 && lodash.includes(row_n_keys[0], 'DR_Others');
|
|
1400
|
-
const othersName =
|
|
1542
|
+
const othersName = highchartsRenderer.getOthersName(opts);
|
|
1401
1543
|
|
|
1402
1544
|
lodash.forEach(col_n_keys, function (col_n_value) {
|
|
1403
1545
|
const row_n_value = isOthersIncludedInRow ? row_n_keys[0] : [];
|
|
@@ -1444,7 +1586,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
1444
1586
|
var num_cols = col_n_keys.length;
|
|
1445
1587
|
var num_rows = row_n_keys.length;
|
|
1446
1588
|
|
|
1447
|
-
const othersName =
|
|
1589
|
+
const othersName = highchartsRenderer.getOthersName(opts);
|
|
1448
1590
|
|
|
1449
1591
|
lodash.forEach(col_n_keys, function (col_n_value) {
|
|
1450
1592
|
var col_ob = {};
|
|
@@ -3041,6 +3183,101 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
3041
3183
|
return highchartsRenderer.ptCreateElementAndDraw(chartOptions, opts);
|
|
3042
3184
|
};
|
|
3043
3185
|
|
|
3186
|
+
highchartsRenderer.ptRenderWaterfallBreakdown = function (pivotData, opts, drilldownFunc, chartType) {
|
|
3187
|
+
let chartOptions = {};
|
|
3188
|
+
const additionOptions = opts.chartOptions
|
|
3189
|
+
? opts.chartOptions
|
|
3190
|
+
: highchartsRenderer.getDefaultValueForChart(highchartsRenderer.CHART_TYPES.WATERFALL_BREAKDOWN);
|
|
3191
|
+
|
|
3192
|
+
chartOptions.chart = {
|
|
3193
|
+
type: 'waterfall',
|
|
3194
|
+
zoomType: additionOptions && additionOptions.chart && additionOptions.chart.zoom_type ? additionOptions.chart.zoom_type : 'None',
|
|
3195
|
+
};
|
|
3196
|
+
if (disableAnimation) {
|
|
3197
|
+
chartOptions.chart.animation = false;
|
|
3198
|
+
}
|
|
3199
|
+
|
|
3200
|
+
const breakdownFieldIsNotSet = lodash.some(pivotData.getRowKeys(), rowKey => !rowKey || lodash.isArray(rowKey) && !rowKey.length);
|
|
3201
|
+
chartOptions.xAxis = {
|
|
3202
|
+
type: 'category',
|
|
3203
|
+
crosshair: true,
|
|
3204
|
+
min: 0,
|
|
3205
|
+
title: {
|
|
3206
|
+
text : additionOptions && additionOptions.axisX ? additionOptions.axisX.name : '',
|
|
3207
|
+
},
|
|
3208
|
+
uniqueNames: breakdownFieldIsNotSet,
|
|
3209
|
+
};
|
|
3210
|
+
|
|
3211
|
+
highchartsRenderer.setTitleAndSubTitle(chartOptions, opts, additionOptions);
|
|
3212
|
+
|
|
3213
|
+
chartOptions.yAxis = {
|
|
3214
|
+
min: null,
|
|
3215
|
+
max: null,
|
|
3216
|
+
title: {
|
|
3217
|
+
text: additionOptions && additionOptions.axisY ? additionOptions.axisY.name : '',
|
|
3218
|
+
autoylabel: additionOptions && additionOptions.axisY ? additionOptions.axisY.autoylabel : ''
|
|
3219
|
+
},
|
|
3220
|
+
labels: {
|
|
3221
|
+
formatter: highchartsRenderer.defaultValueLabelsFormatter(pivotData, opts)
|
|
3222
|
+
},
|
|
3223
|
+
};
|
|
3224
|
+
if (additionOptions) {
|
|
3225
|
+
highchartsRenderer.setYAxisMinMax(chartOptions.yAxis, additionOptions.axisY);
|
|
3226
|
+
}
|
|
3227
|
+
|
|
3228
|
+
chartOptions.tooltip = {
|
|
3229
|
+
formatter: highchartsRenderer.defaultFormatterToTooltip(pivotData, opts),
|
|
3230
|
+
valueDecimals: 2,
|
|
3231
|
+
};
|
|
3232
|
+
|
|
3233
|
+
highchartsRenderer.handleGridLines(additionOptions, chartOptions);
|
|
3234
|
+
|
|
3235
|
+
if (lodash.get(opts, 'paletteOptions.widgetPalette', null)) {
|
|
3236
|
+
const mc_palette = lodash.find(lodash.get(opts.paletteOptions, 'monochromePalettes', []), { selected: true });
|
|
3237
|
+
chartOptions.colors = mc_palette ? mc_palette.colors : opts.paletteOptions.widgetPalette;
|
|
3238
|
+
} else if (lodash.get(opts, 'paletteOptions.dashboardPalette.colors', null)) {
|
|
3239
|
+
chartOptions.colors = opts.paletteOptions.dashboardPalette.colors;
|
|
3240
|
+
}
|
|
3241
|
+
chartOptions.series = highchartsRenderer
|
|
3242
|
+
.ptCreateWaterfallBreakdownSeries(pivotData, null, additionOptions, opts);
|
|
3243
|
+
|
|
3244
|
+
chartOptions = highchartsRenderer.prepareAxisX(chartOptions, additionOptions, pivotData.getColKeys());
|
|
3245
|
+
chartOptions.plotOptions = {
|
|
3246
|
+
waterfall: {
|
|
3247
|
+
pointPadding: 0.2,
|
|
3248
|
+
borderWidth: 0,
|
|
3249
|
+
borderRadius: 1,
|
|
3250
|
+
lineWidth: 0,
|
|
3251
|
+
},
|
|
3252
|
+
series: {
|
|
3253
|
+
animation: !disableAnimation,
|
|
3254
|
+
cropThreshold: 1000,
|
|
3255
|
+
dataLabels: {
|
|
3256
|
+
allowOverlap: additionOptions && additionOptions.label ? additionOptions.label.overlap : false,
|
|
3257
|
+
enabled: additionOptions && additionOptions.label ? additionOptions.label.show : true,
|
|
3258
|
+
formatter: highchartsRenderer.defaultDataLabelFormatter(pivotData, opts),
|
|
3259
|
+
style: highchartsRenderer.getDataLabelsStyle(additionOptions),
|
|
3260
|
+
inside: false
|
|
3261
|
+
}
|
|
3262
|
+
}
|
|
3263
|
+
};
|
|
3264
|
+
|
|
3265
|
+
if (opts.drillDownListFunc) {
|
|
3266
|
+
chartOptions.plotOptions.series.cursor = 'pointer';
|
|
3267
|
+
chartOptions.plotOptions.series.point = {
|
|
3268
|
+
events: {
|
|
3269
|
+
click: opts.drillDownListFunc
|
|
3270
|
+
}
|
|
3271
|
+
};
|
|
3272
|
+
}
|
|
3273
|
+
|
|
3274
|
+
chartOptions.legend = {
|
|
3275
|
+
enabled: false
|
|
3276
|
+
};
|
|
3277
|
+
|
|
3278
|
+
return highchartsRenderer.ptCreateElementAndDraw(chartOptions, opts);
|
|
3279
|
+
};
|
|
3280
|
+
|
|
3044
3281
|
highchartsRenderer.formatFieldValue = function (field, value) {
|
|
3045
3282
|
let currentType = '';
|
|
3046
3283
|
switch (field.type) {
|
|
@@ -4105,7 +4342,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
4105
4342
|
}
|
|
4106
4343
|
};
|
|
4107
4344
|
|
|
4108
|
-
highchartsRenderer.rhPivotView = function (rowData, options, isTable = false) {
|
|
4345
|
+
highchartsRenderer.rhPivotView = function (rowData, options, isTable = false, widget = null) {
|
|
4109
4346
|
if (!rowData || !rowData) {
|
|
4110
4347
|
if (options.onlyOptions) {
|
|
4111
4348
|
return {};
|
|
@@ -4113,6 +4350,32 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
4113
4350
|
return null;
|
|
4114
4351
|
}
|
|
4115
4352
|
|
|
4353
|
+
if (widget && widget.chart_type === highchartsRenderer.CHART_TYPES.WATERFALL_BREAKDOWN) {
|
|
4354
|
+
const breakdownSettings = widget.options.breakdown_options.settings;
|
|
4355
|
+
const maxCategories = breakdownSettings.maxCategoriesCount;
|
|
4356
|
+
const minCategories = breakdownSettings.minCategoriesCount;
|
|
4357
|
+
const uniqueCategories = lodash.filter(
|
|
4358
|
+
lodash.uniq(
|
|
4359
|
+
lodash.map(rowData, row => row[widget.cols[0].name])
|
|
4360
|
+
),
|
|
4361
|
+
value => !!value
|
|
4362
|
+
);
|
|
4363
|
+
|
|
4364
|
+
if (uniqueCategories && (uniqueCategories.length > maxCategories || uniqueCategories.length < minCategories )) {
|
|
4365
|
+
const commonErrorSentence = `Please choose ${ minCategories }-${ maxCategories } items in the Category section.`
|
|
4366
|
+
options.error_has_occurred = true;
|
|
4367
|
+
options.error_params = {
|
|
4368
|
+
title: uniqueCategories.length > maxCategories
|
|
4369
|
+
? `There is too much data. ${ commonErrorSentence }`
|
|
4370
|
+
: `Not enough data. ${ commonErrorSentence }`,
|
|
4371
|
+
text: '',
|
|
4372
|
+
btnText: 'Edit Widget',
|
|
4373
|
+
class: 'too-much-data',
|
|
4374
|
+
}
|
|
4375
|
+
return highchartsRenderer.getNoDataResult(options.rendererOptions, true);
|
|
4376
|
+
}
|
|
4377
|
+
}
|
|
4378
|
+
|
|
4116
4379
|
if (rowData.length == 0) {
|
|
4117
4380
|
if (options.onlyOptions) {
|
|
4118
4381
|
return {};
|
|
@@ -6521,6 +6784,17 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
6521
6784
|
};
|
|
6522
6785
|
|
|
6523
6786
|
highchartsRenderer.chartsTypesInfo = {
|
|
6787
|
+
[highchartsRenderer.CHART_TYPES.WATERFALL_BREAKDOWN]: {
|
|
6788
|
+
name: 'Waterfall Breakdown Chart ',
|
|
6789
|
+
label: 'Waterfall Breakdown Chart ',
|
|
6790
|
+
title: 'TODO: add text',
|
|
6791
|
+
description: 'TODO: add text',
|
|
6792
|
+
axisName: 'Category',
|
|
6793
|
+
legendName: 'Breakdown',
|
|
6794
|
+
startedMessage: 'To get started, drag one field to the Category and one field to the Value section.',
|
|
6795
|
+
axisTooltipTitle: 'TODO: add text',
|
|
6796
|
+
legendTooltipTitle: 'TODO: add text',
|
|
6797
|
+
},
|
|
6524
6798
|
'combo-chart': {
|
|
6525
6799
|
name: 'Combo Chart ',
|
|
6526
6800
|
label: 'Combo Chart ',
|
|
@@ -7153,6 +7427,32 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
7153
7427
|
}
|
|
7154
7428
|
]
|
|
7155
7429
|
},
|
|
7430
|
+
{
|
|
7431
|
+
type: 'waterfall-chart',
|
|
7432
|
+
name: 'Waterfall',
|
|
7433
|
+
hidden: true,
|
|
7434
|
+
class: 'google-visualization-charteditor-mini-column',
|
|
7435
|
+
subtypes: [
|
|
7436
|
+
{
|
|
7437
|
+
type: highchartsRenderer.CHART_TYPES.WATERFALL_BREAKDOWN,
|
|
7438
|
+
name: highchartsRenderer.chartsTypesInfo[highchartsRenderer.CHART_TYPES.WATERFALL_BREAKDOWN].name,
|
|
7439
|
+
class: 'google-visualization-charteditor-thumbs-columnchart',
|
|
7440
|
+
render: highchartsRenderer.ptRenderWaterfallBreakdown,
|
|
7441
|
+
suboptions: [
|
|
7442
|
+
highchartsRenderer.suboptions["axisY"],
|
|
7443
|
+
highchartsRenderer.suboptions["axisX"],
|
|
7444
|
+
highchartsRenderer.suboptions["tooltips"],
|
|
7445
|
+
highchartsRenderer.suboptions["label"],
|
|
7446
|
+
highchartsRenderer.suboptions["subtitle"],
|
|
7447
|
+
highchartsRenderer.suboptions["widget_library"],
|
|
7448
|
+
highchartsRenderer.suboptions["chart"],
|
|
7449
|
+
highchartsRenderer.suboptions["negative_number_format"],
|
|
7450
|
+
highchartsRenderer.suboptions["advanced"],
|
|
7451
|
+
highchartsRenderer.suboptions["legends"],
|
|
7452
|
+
]
|
|
7453
|
+
},
|
|
7454
|
+
]
|
|
7455
|
+
},
|
|
7156
7456
|
];
|
|
7157
7457
|
|
|
7158
7458
|
highchartsRenderer.richTextSubType = {
|
|
@@ -7602,6 +7902,16 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
7602
7902
|
|
|
7603
7903
|
};
|
|
7604
7904
|
|
|
7905
|
+
highchartsRenderer.createDateFromString = function (dateString, format) {
|
|
7906
|
+
if ((format && !highchartsRenderer.isDateFormat(dateString, format)) || !highchartsRenderer.isDate(dateString)) {
|
|
7907
|
+
return null;
|
|
7908
|
+
}
|
|
7909
|
+
const utcDate = format
|
|
7910
|
+
? moment_lib.utc(dateString, format, true)
|
|
7911
|
+
: moment_lib.utc(dateString);
|
|
7912
|
+
return utcDate.startOf('day').unix();
|
|
7913
|
+
}
|
|
7914
|
+
|
|
7605
7915
|
highchartsRenderer.prepareDrillDownFilters = function (r_keys, c_keys, widget) {
|
|
7606
7916
|
let row_key = r_keys;
|
|
7607
7917
|
let col_key = c_keys;
|
|
@@ -7615,26 +7925,46 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
7615
7925
|
|
|
7616
7926
|
let filters = [];
|
|
7617
7927
|
|
|
7618
|
-
|
|
7619
|
-
|
|
7620
|
-
|
|
7621
|
-
|
|
7622
|
-
|
|
7928
|
+
if (widget.chart_type === highchartsRenderer.CHART_TYPES.WATERFALL_BREAKDOWN) {
|
|
7929
|
+
const colFilter = highchartsRenderer.createFilterObject(widget.cols[0]);
|
|
7930
|
+
const labels = [];
|
|
7931
|
+
colFilter.values = [];
|
|
7932
|
+
lodash.forEach(col_key, function (col_value) {
|
|
7933
|
+
if (widget.cols[0].type === 'Date') {
|
|
7934
|
+
let date = highchartsRenderer.createDateFromString(
|
|
7623
7935
|
col_value,
|
|
7624
|
-
highchartsRenderer.getDateFieldFormat(widget, widget.cols[
|
|
7936
|
+
highchartsRenderer.getDateFieldFormat(widget, widget.cols[0])
|
|
7625
7937
|
);
|
|
7626
|
-
|
|
7627
|
-
if ($.isEmptyObject(datetrange)) {
|
|
7628
|
-
return;
|
|
7629
|
-
}
|
|
7630
|
-
temp.values = datetrange;
|
|
7631
|
-
temp.values.label = col_value;
|
|
7938
|
+
colFilter.values.push(date);
|
|
7632
7939
|
} else {
|
|
7633
|
-
|
|
7940
|
+
colFilter.values.push(col_value);
|
|
7634
7941
|
}
|
|
7635
|
-
|
|
7636
|
-
}
|
|
7637
|
-
|
|
7942
|
+
labels.push(col_value);
|
|
7943
|
+
});
|
|
7944
|
+
colFilter.value_to_show = labels.join(', ');
|
|
7945
|
+
filters.push(colFilter);
|
|
7946
|
+
} else {
|
|
7947
|
+
lodash.forEach(col_key, function (col_value, index) {
|
|
7948
|
+
if (widget && widget.cols[index]) {
|
|
7949
|
+
let temp = highchartsRenderer.createFilterObject(widget.cols[index]);
|
|
7950
|
+
if (widget.cols[index].type === 'Date') {
|
|
7951
|
+
let datetrange = highchartsRenderer.createDateTypeFromValue(
|
|
7952
|
+
col_value,
|
|
7953
|
+
highchartsRenderer.getDateFieldFormat(widget, widget.cols[index])
|
|
7954
|
+
);
|
|
7955
|
+
|
|
7956
|
+
if ($.isEmptyObject(datetrange)) {
|
|
7957
|
+
return;
|
|
7958
|
+
}
|
|
7959
|
+
temp.values = datetrange;
|
|
7960
|
+
temp.values.label = col_value;
|
|
7961
|
+
} else {
|
|
7962
|
+
temp.values = [col_value];
|
|
7963
|
+
}
|
|
7964
|
+
filters.push(temp);
|
|
7965
|
+
}
|
|
7966
|
+
});
|
|
7967
|
+
}
|
|
7638
7968
|
|
|
7639
7969
|
lodash.forEach(row_key, function (row_value, index) {
|
|
7640
7970
|
if (widget && widget.rows[index]) {
|
|
@@ -7679,6 +8009,9 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
7679
8009
|
});
|
|
7680
8010
|
|
|
7681
8011
|
lodash.forEach(filters, function (filter) {
|
|
8012
|
+
if (filter.value_to_show) {
|
|
8013
|
+
return;
|
|
8014
|
+
}
|
|
7682
8015
|
if (Array.isArray(filter.values)) {
|
|
7683
8016
|
if (filter.type) {
|
|
7684
8017
|
for (let i = 0; i < filter.values.length; i++) {
|
|
@@ -7717,15 +8050,36 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
7717
8050
|
filters.push(highchartsRenderer.createDrillDownFilterObject(widget, widget.rows[i], rowKey[i]))
|
|
7718
8051
|
}
|
|
7719
8052
|
}
|
|
7720
|
-
|
|
7721
|
-
|
|
8053
|
+
|
|
8054
|
+
if (widget.chart_type === highchartsRenderer.CHART_TYPES.WATERFALL_BREAKDOWN) {
|
|
8055
|
+
let filter = lodash.find(filters, {name: widget.cols[0].name});
|
|
7722
8056
|
if (filter) {
|
|
7723
8057
|
filter.is_excluded = false;
|
|
7724
|
-
filter.values = widget.cols[i].type === 'Date' ?
|
|
7725
|
-
highchartsRenderer.createDateTypeFromValue(colKey[i], highchartsRenderer.getDateFieldFormat(widget, widget.cols[i])) :
|
|
7726
|
-
[colKey[i]];
|
|
7727
8058
|
} else {
|
|
7728
|
-
|
|
8059
|
+
filter = highchartsRenderer.createDrillDownFilterObject(widget, widget.cols[0], colKey[0]);
|
|
8060
|
+
}
|
|
8061
|
+
filter.values = [];
|
|
8062
|
+
for (let i = 0; i < colKey.length; i++) {
|
|
8063
|
+
filter.values.push(
|
|
8064
|
+
widget.cols[0].type === 'Date'
|
|
8065
|
+
? highchartsRenderer.createDateFromString(
|
|
8066
|
+
colKey[i],
|
|
8067
|
+
highchartsRenderer.getDateFieldFormat(widget, widget.cols[0])
|
|
8068
|
+
)
|
|
8069
|
+
: colKey[i]
|
|
8070
|
+
);
|
|
8071
|
+
}
|
|
8072
|
+
} else {
|
|
8073
|
+
for (let i = 0; i < colKey.length; i++) {
|
|
8074
|
+
let filter = lodash.find(filters, {name: widget.cols[i].name});
|
|
8075
|
+
if (filter) {
|
|
8076
|
+
filter.is_excluded = false;
|
|
8077
|
+
filter.values = widget.cols[i].type === 'Date' ?
|
|
8078
|
+
highchartsRenderer.createDateTypeFromValue(colKey[i], highchartsRenderer.getDateFieldFormat(widget, widget.cols[i])) :
|
|
8079
|
+
[colKey[i]];
|
|
8080
|
+
} else {
|
|
8081
|
+
filters.push(highchartsRenderer.createDrillDownFilterObject(widget, widget.cols[i], colKey[i]))
|
|
8082
|
+
}
|
|
7729
8083
|
}
|
|
7730
8084
|
}
|
|
7731
8085
|
return filters;
|
|
@@ -7817,7 +8171,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
7817
8171
|
if ($.pivotUtilities && !$.pivotUtilities.additionalFieldsList) {
|
|
7818
8172
|
$.pivotUtilities.additionalFieldsList = [
|
|
7819
8173
|
{key: 'DR_Average', name: 'DR_Average'},
|
|
7820
|
-
{key: 'DR_Others', name:
|
|
8174
|
+
{key: 'DR_Others', name: highchartsRenderer.getOthersName(widget.options)}
|
|
7821
8175
|
];
|
|
7822
8176
|
}
|
|
7823
8177
|
|
|
@@ -7866,9 +8220,16 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
7866
8220
|
lodash.forEach(datesFields, function (row) {
|
|
7867
8221
|
row.values = lodash.uniq(row.values);
|
|
7868
8222
|
|
|
7869
|
-
const isTimestampDateField = row.type === 'Date' &&
|
|
8223
|
+
const isTimestampDateField = row.type === 'Date' && lodash.some(row.values, value => typeof value ==='number');
|
|
7870
8224
|
if (isTimestampDateField) {
|
|
8225
|
+
const nullValueIndex = row.values.indexOf(NULL_VALUE);
|
|
8226
|
+
if (~nullValueIndex) {
|
|
8227
|
+
row.values.splice(nullValueIndex, 1);
|
|
8228
|
+
}
|
|
7871
8229
|
row.values = row.values.sort((a, b) => a - b);
|
|
8230
|
+
if (~nullValueIndex) {
|
|
8231
|
+
row.values.push(NULL_VALUE);
|
|
8232
|
+
}
|
|
7872
8233
|
} else {
|
|
7873
8234
|
row.values = row.values.sort();
|
|
7874
8235
|
}
|
|
@@ -8058,7 +8419,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
8058
8419
|
subopts.onlyOptions = true;
|
|
8059
8420
|
}
|
|
8060
8421
|
|
|
8061
|
-
let hc_options = highchartsRenderer.rhPivotView(res, subopts, is_table);
|
|
8422
|
+
let hc_options = highchartsRenderer.rhPivotView(res, subopts, is_table, widget_obj);
|
|
8062
8423
|
|
|
8063
8424
|
return hc_options;
|
|
8064
8425
|
}
|
|
@@ -8285,6 +8646,24 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
8285
8646
|
}
|
|
8286
8647
|
}
|
|
8287
8648
|
|
|
8649
|
+
highchartsRenderer.getOthersName = function(opts) {
|
|
8650
|
+
return lodash.get(opts, "total_value_options.filter_options.filteredOutFieldName") || 'Others';
|
|
8651
|
+
}
|
|
8652
|
+
|
|
8653
|
+
highchartsRenderer.transformRowsAndColsForBreakdown = function(rows, cols, point, opts) {
|
|
8654
|
+
const othersIndex = cols.indexOf(highchartsRenderer.getOthersName(opts));
|
|
8655
|
+
if (othersIndex !== -1) {
|
|
8656
|
+
cols[othersIndex] = 'DR_Others';
|
|
8657
|
+
}
|
|
8658
|
+
if (point.options.isTotal) {
|
|
8659
|
+
rows = [];
|
|
8660
|
+
} else {
|
|
8661
|
+
rows = cols;
|
|
8662
|
+
cols = [];
|
|
8663
|
+
}
|
|
8664
|
+
return { rows, cols };
|
|
8665
|
+
}
|
|
8666
|
+
|
|
8288
8667
|
return highchartsRenderer;
|
|
8289
8668
|
};
|
|
8290
8669
|
|