@datarailsshared/dr_renderer 1.2.178 → 1.2.180

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.180",
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,11 +3183,110 @@ 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 = '';
3283
+ let format = field.format;
3046
3284
  switch (field.type) {
3047
3285
  case 'Date':
3048
3286
  currentType = 'd';
3287
+ if (!format) {
3288
+ format = 'MM/DD/YYYY'
3289
+ }
3049
3290
  break;
3050
3291
  case 'Float':
3051
3292
  case 'Integer':
@@ -3054,7 +3295,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
3054
3295
  default:
3055
3296
  return value;
3056
3297
  }
3057
- const formattedValue = highchartsRenderer.formatValue(currentType, field.format, value, null);
3298
+ const formattedValue = highchartsRenderer.formatValue(currentType, format, value, null);
3058
3299
  if (formattedValue && formattedValue.value === 'Invalid Date') {
3059
3300
  formattedValue.value = value;
3060
3301
  }
@@ -4105,7 +4346,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
4105
4346
  }
4106
4347
  };
4107
4348
 
4108
- highchartsRenderer.rhPivotView = function (rowData, options, isTable = false) {
4349
+ highchartsRenderer.rhPivotView = function (rowData, options, isTable = false, widget = null) {
4109
4350
  if (!rowData || !rowData) {
4110
4351
  if (options.onlyOptions) {
4111
4352
  return {};
@@ -4113,6 +4354,32 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
4113
4354
  return null;
4114
4355
  }
4115
4356
 
4357
+ if (widget && widget.chart_type === highchartsRenderer.CHART_TYPES.WATERFALL_BREAKDOWN) {
4358
+ const breakdownSettings = widget.options.breakdown_options.settings;
4359
+ const maxCategories = breakdownSettings.maxCategoriesCount;
4360
+ const minCategories = breakdownSettings.minCategoriesCount;
4361
+ const uniqueCategories = lodash.filter(
4362
+ lodash.uniq(
4363
+ lodash.map(rowData, row => row[widget.cols[0].name])
4364
+ ),
4365
+ value => !!value
4366
+ );
4367
+
4368
+ if (uniqueCategories && (uniqueCategories.length > maxCategories || uniqueCategories.length < minCategories )) {
4369
+ const commonErrorSentence = `Please choose ${ minCategories }-${ maxCategories } items in the Category section.`
4370
+ options.error_has_occurred = true;
4371
+ options.error_params = {
4372
+ title: uniqueCategories.length > maxCategories
4373
+ ? `There is too much data. ${ commonErrorSentence }`
4374
+ : `Not enough data. ${ commonErrorSentence }`,
4375
+ text: '',
4376
+ btnText: 'Edit Widget',
4377
+ class: 'too-much-data',
4378
+ }
4379
+ return highchartsRenderer.getNoDataResult(options.rendererOptions, true);
4380
+ }
4381
+ }
4382
+
4116
4383
  if (rowData.length == 0) {
4117
4384
  if (options.onlyOptions) {
4118
4385
  return {};
@@ -6521,6 +6788,17 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
6521
6788
  };
6522
6789
 
6523
6790
  highchartsRenderer.chartsTypesInfo = {
6791
+ [highchartsRenderer.CHART_TYPES.WATERFALL_BREAKDOWN]: {
6792
+ name: 'Waterfall Breakdown Chart ',
6793
+ label: 'Waterfall Breakdown Chart ',
6794
+ title: 'TODO: add text',
6795
+ description: 'TODO: add text',
6796
+ axisName: 'Category',
6797
+ legendName: 'Breakdown',
6798
+ startedMessage: 'To get started, drag one field to the Category and one field to the Value section.',
6799
+ axisTooltipTitle: 'TODO: add text',
6800
+ legendTooltipTitle: 'TODO: add text',
6801
+ },
6524
6802
  'combo-chart': {
6525
6803
  name: 'Combo Chart ',
6526
6804
  label: 'Combo Chart ',
@@ -7153,6 +7431,32 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
7153
7431
  }
7154
7432
  ]
7155
7433
  },
7434
+ {
7435
+ type: 'waterfall-chart',
7436
+ name: 'Waterfall',
7437
+ hidden: true,
7438
+ class: 'google-visualization-charteditor-mini-column',
7439
+ subtypes: [
7440
+ {
7441
+ type: highchartsRenderer.CHART_TYPES.WATERFALL_BREAKDOWN,
7442
+ name: highchartsRenderer.chartsTypesInfo[highchartsRenderer.CHART_TYPES.WATERFALL_BREAKDOWN].name,
7443
+ class: 'google-visualization-charteditor-thumbs-columnchart',
7444
+ render: highchartsRenderer.ptRenderWaterfallBreakdown,
7445
+ suboptions: [
7446
+ highchartsRenderer.suboptions["axisY"],
7447
+ highchartsRenderer.suboptions["axisX"],
7448
+ highchartsRenderer.suboptions["tooltips"],
7449
+ highchartsRenderer.suboptions["label"],
7450
+ highchartsRenderer.suboptions["subtitle"],
7451
+ highchartsRenderer.suboptions["widget_library"],
7452
+ highchartsRenderer.suboptions["chart"],
7453
+ highchartsRenderer.suboptions["negative_number_format"],
7454
+ highchartsRenderer.suboptions["advanced"],
7455
+ highchartsRenderer.suboptions["legends"],
7456
+ ]
7457
+ },
7458
+ ]
7459
+ },
7156
7460
  ];
7157
7461
 
7158
7462
  highchartsRenderer.richTextSubType = {
@@ -7602,6 +7906,16 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
7602
7906
 
7603
7907
  };
7604
7908
 
7909
+ highchartsRenderer.createDateFromString = function (dateString, format) {
7910
+ if ((format && !highchartsRenderer.isDateFormat(dateString, format)) || !highchartsRenderer.isDate(dateString)) {
7911
+ return null;
7912
+ }
7913
+ const utcDate = format
7914
+ ? moment_lib.utc(dateString, format, true)
7915
+ : moment_lib.utc(dateString);
7916
+ return utcDate.startOf('day').unix();
7917
+ }
7918
+
7605
7919
  highchartsRenderer.prepareDrillDownFilters = function (r_keys, c_keys, widget) {
7606
7920
  let row_key = r_keys;
7607
7921
  let col_key = c_keys;
@@ -7615,26 +7929,46 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
7615
7929
 
7616
7930
  let filters = [];
7617
7931
 
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(
7932
+ if (widget.chart_type === highchartsRenderer.CHART_TYPES.WATERFALL_BREAKDOWN) {
7933
+ const colFilter = highchartsRenderer.createFilterObject(widget.cols[0]);
7934
+ const labels = [];
7935
+ colFilter.values = [];
7936
+ lodash.forEach(col_key, function (col_value) {
7937
+ if (widget.cols[0].type === 'Date') {
7938
+ let date = highchartsRenderer.createDateFromString(
7623
7939
  col_value,
7624
- highchartsRenderer.getDateFieldFormat(widget, widget.cols[index])
7940
+ highchartsRenderer.getDateFieldFormat(widget, widget.cols[0])
7625
7941
  );
7626
-
7627
- if ($.isEmptyObject(datetrange)) {
7628
- return;
7629
- }
7630
- temp.values = datetrange;
7631
- temp.values.label = col_value;
7942
+ colFilter.values.push(date);
7632
7943
  } else {
7633
- temp.values = [col_value];
7944
+ colFilter.values.push(col_value);
7634
7945
  }
7635
- filters.push(temp);
7636
- }
7637
- });
7946
+ labels.push(col_value);
7947
+ });
7948
+ colFilter.value_to_show = labels.join(', ');
7949
+ filters.push(colFilter);
7950
+ } else {
7951
+ lodash.forEach(col_key, function (col_value, index) {
7952
+ if (widget && widget.cols[index]) {
7953
+ let temp = highchartsRenderer.createFilterObject(widget.cols[index]);
7954
+ if (widget.cols[index].type === 'Date') {
7955
+ let datetrange = highchartsRenderer.createDateTypeFromValue(
7956
+ col_value,
7957
+ highchartsRenderer.getDateFieldFormat(widget, widget.cols[index])
7958
+ );
7959
+
7960
+ if ($.isEmptyObject(datetrange)) {
7961
+ return;
7962
+ }
7963
+ temp.values = datetrange;
7964
+ temp.values.label = col_value;
7965
+ } else {
7966
+ temp.values = [col_value];
7967
+ }
7968
+ filters.push(temp);
7969
+ }
7970
+ });
7971
+ }
7638
7972
 
7639
7973
  lodash.forEach(row_key, function (row_value, index) {
7640
7974
  if (widget && widget.rows[index]) {
@@ -7679,6 +8013,9 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
7679
8013
  });
7680
8014
 
7681
8015
  lodash.forEach(filters, function (filter) {
8016
+ if (filter.value_to_show) {
8017
+ return;
8018
+ }
7682
8019
  if (Array.isArray(filter.values)) {
7683
8020
  if (filter.type) {
7684
8021
  for (let i = 0; i < filter.values.length; i++) {
@@ -7717,15 +8054,36 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
7717
8054
  filters.push(highchartsRenderer.createDrillDownFilterObject(widget, widget.rows[i], rowKey[i]))
7718
8055
  }
7719
8056
  }
7720
- for (let i = 0; i < colKey.length; i++) {
7721
- let filter = lodash.find(filters, {name: widget.cols[i].name});
8057
+
8058
+ if (widget.chart_type === highchartsRenderer.CHART_TYPES.WATERFALL_BREAKDOWN) {
8059
+ let filter = lodash.find(filters, {name: widget.cols[0].name});
7722
8060
  if (filter) {
7723
8061
  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
8062
  } else {
7728
- filters.push(highchartsRenderer.createDrillDownFilterObject(widget, widget.cols[i], colKey[i]))
8063
+ filter = highchartsRenderer.createDrillDownFilterObject(widget, widget.cols[0], colKey[0]);
8064
+ }
8065
+ filter.values = [];
8066
+ for (let i = 0; i < colKey.length; i++) {
8067
+ filter.values.push(
8068
+ widget.cols[0].type === 'Date'
8069
+ ? highchartsRenderer.createDateFromString(
8070
+ colKey[i],
8071
+ highchartsRenderer.getDateFieldFormat(widget, widget.cols[0])
8072
+ )
8073
+ : colKey[i]
8074
+ );
8075
+ }
8076
+ } else {
8077
+ for (let i = 0; i < colKey.length; i++) {
8078
+ let filter = lodash.find(filters, {name: widget.cols[i].name});
8079
+ if (filter) {
8080
+ filter.is_excluded = false;
8081
+ filter.values = widget.cols[i].type === 'Date' ?
8082
+ highchartsRenderer.createDateTypeFromValue(colKey[i], highchartsRenderer.getDateFieldFormat(widget, widget.cols[i])) :
8083
+ [colKey[i]];
8084
+ } else {
8085
+ filters.push(highchartsRenderer.createDrillDownFilterObject(widget, widget.cols[i], colKey[i]))
8086
+ }
7729
8087
  }
7730
8088
  }
7731
8089
  return filters;
@@ -7817,7 +8175,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
7817
8175
  if ($.pivotUtilities && !$.pivotUtilities.additionalFieldsList) {
7818
8176
  $.pivotUtilities.additionalFieldsList = [
7819
8177
  {key: 'DR_Average', name: 'DR_Average'},
7820
- {key: 'DR_Others', name: _.get(widget.options, "total_value_options.filter_options.filteredOutFieldName") || 'Others'}
8178
+ {key: 'DR_Others', name: highchartsRenderer.getOthersName(widget.options)}
7821
8179
  ];
7822
8180
  }
7823
8181
 
@@ -7866,9 +8224,16 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
7866
8224
  lodash.forEach(datesFields, function (row) {
7867
8225
  row.values = lodash.uniq(row.values);
7868
8226
 
7869
- const isTimestampDateField = row.type === 'Date' && typeof row.values[0] === 'number';
8227
+ const isTimestampDateField = row.type === 'Date' && lodash.some(row.values, value => typeof value ==='number');
7870
8228
  if (isTimestampDateField) {
8229
+ const nullValueIndex = row.values.indexOf(NULL_VALUE);
8230
+ if (~nullValueIndex) {
8231
+ row.values.splice(nullValueIndex, 1);
8232
+ }
7871
8233
  row.values = row.values.sort((a, b) => a - b);
8234
+ if (~nullValueIndex) {
8235
+ row.values.push(NULL_VALUE);
8236
+ }
7872
8237
  } else {
7873
8238
  row.values = row.values.sort();
7874
8239
  }
@@ -8058,7 +8423,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
8058
8423
  subopts.onlyOptions = true;
8059
8424
  }
8060
8425
 
8061
- let hc_options = highchartsRenderer.rhPivotView(res, subopts, is_table);
8426
+ let hc_options = highchartsRenderer.rhPivotView(res, subopts, is_table, widget_obj);
8062
8427
 
8063
8428
  return hc_options;
8064
8429
  }
@@ -8285,6 +8650,24 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
8285
8650
  }
8286
8651
  }
8287
8652
 
8653
+ highchartsRenderer.getOthersName = function(opts) {
8654
+ return lodash.get(opts, "total_value_options.filter_options.filteredOutFieldName") || 'Others';
8655
+ }
8656
+
8657
+ highchartsRenderer.transformRowsAndColsForBreakdown = function(rows, cols, point, opts) {
8658
+ const othersIndex = cols.indexOf(highchartsRenderer.getOthersName(opts));
8659
+ if (othersIndex !== -1) {
8660
+ cols[othersIndex] = 'DR_Others';
8661
+ }
8662
+ if (point.options.isTotal) {
8663
+ rows = [];
8664
+ } else {
8665
+ rows = cols;
8666
+ cols = [];
8667
+ }
8668
+ return { rows, cols };
8669
+ }
8670
+
8288
8671
  return highchartsRenderer;
8289
8672
  };
8290
8673