@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@datarailsshared/dr_renderer",
3
- "version": "1.2.178",
3
+ "version": "1.2.179",
4
4
  "description": "DataRails charts and tables renderer",
5
5
  "keywords": [
6
6
  "datarails",
@@ -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
- lodash.get(opts, "total_value_options.filter_options.filteredOutFieldName") || 'Others' :
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
- var aggr = pivotData.getAggregator(rows, cols);
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 = lodash.get(opts, "total_value_options.filter_options.filteredOutFieldName") || 'Others';
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 = lodash.get(opts, "total_value_options.filter_options.filteredOutFieldName") || 'Others';
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 = lodash.get(opts, "total_value_options.filter_options.filteredOutFieldName") || 'Others';
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 = lodash.get(opts, "total_value_options.filter_options.filteredOutFieldName") || 'Others';
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
- lodash.forEach(col_key, function (col_value, index) {
7619
- if (widget && widget.cols[index]) {
7620
- let temp = highchartsRenderer.createFilterObject(widget.cols[index]);
7621
- if (widget.cols[index].type === 'Date') {
7622
- let datetrange = highchartsRenderer.createDateTypeFromValue(
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[index])
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
- temp.values = [col_value];
7940
+ colFilter.values.push(col_value);
7634
7941
  }
7635
- filters.push(temp);
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
- for (let i = 0; i < colKey.length; i++) {
7721
- let filter = lodash.find(filters, {name: widget.cols[i].name});
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
- filters.push(highchartsRenderer.createDrillDownFilterObject(widget, widget.cols[i], colKey[i]))
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: _.get(widget.options, "total_value_options.filter_options.filteredOutFieldName") || 'Others'}
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' && typeof row.values[0] === 'number';
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