@datarailsshared/dr_renderer 1.2.169 → 1.2.171-dragons

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.169",
3
+ "version": "1.2.171-dragons",
4
4
  "description": "DataRails charts and tables renderer",
5
5
  "keywords": [
6
6
  "datarails",
@@ -1,3 +1,29 @@
1
+ const CHART_TYPES = {
2
+ LINE_CHART: 'line-chart',
3
+ LINE_CHART_SMOOTH: 'line-chart-smooth',
4
+ COLUMN_CHART: 'column-chart',
5
+ COLUMN_CHART_STACKED: 'column-chart-stacked',
6
+ COMBO_CHART: 'combo-chart',
7
+ COMBO_COLUMN_CHART: 'combo-column-chart',
8
+ COMBO_STACKED_CHART: 'combo-stacked-chart',
9
+ BAR_CHART: 'bar-chart',
10
+ BAR_CHART_STACKED: 'bar-chart-stacked',
11
+ SCATTER_CHART: 'scatter-chart',
12
+ AREA_CHART: 'area-chart',
13
+ AREA_CHART_SMOOTH: 'area-chart-smooth',
14
+ TABLE_ONLY: 'table_only',
15
+ POLYGON_CHART: 'polygon-chart',
16
+ PIE_CHART: 'pie-chart',
17
+ PIE_CHART_DRILLDOWN: 'pie-chart-drilldown',
18
+ GAUGE_SOLID_CHART: 'gauge-solid-chart',
19
+ GAUGE_CHART: 'gauge-chart',
20
+ KPI_WIDGET: 'kpi-widget',
21
+ TEXT_WIDGET: 'text-widget',
22
+ WATERFALL_BREAKDOWN: 'waterfall-chart-breakdown',
23
+ PUBLISHED_ITEM: 'published_item',
24
+ RICH_TEXT: 'rich_text',
25
+ }
26
+
1
27
  let getHighchartsRenderer = function ($, document, Highcharts, default_colors, highchartsRenderer,
2
28
  DataFormatter, lodash, moment_lib, isNewAngular) {
3
29
 
@@ -445,6 +471,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
445
471
  || this.series.options.className === 'trendSeries') {
446
472
  rows = [];
447
473
  }
474
+
448
475
  var cols = this.key;
449
476
  if (typeof (cols) == 'object' && cols.name) {
450
477
  cols = cols.name;
@@ -500,6 +527,13 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
500
527
  }
501
528
 
502
529
  const percentageWrapper = percentageArray.length ? `(${percentageArray.join(', ')})` : '';
530
+
531
+ if (this.series.options.className === 'waterfallBreakdown') {
532
+ const modifiedRowsAndCols = highchartsRenderer.transformRowsAndColsForBreakdown(rows, cols, this.point, opts);
533
+ rows = modifiedRowsAndCols.rows;
534
+ cols = modifiedRowsAndCols.cols;
535
+ }
536
+
503
537
  var aggr = pivotData.getAggregator(rows, cols);
504
538
 
505
539
  const formattedValue = is_drill_down_pie || labelOptions.show_value ? $.pivotUtilities.getFormattedNumber(value, aggr, opts, true) : '';
@@ -570,6 +604,8 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
570
604
  }
571
605
 
572
606
  var func = function () {
607
+ const isWaterfallBreakdown = this.series.options.className === 'waterfallBreakdown';
608
+
573
609
  var y = parseFloat(this.y);
574
610
  if (pivotData) {
575
611
  let series_name = (this.series.name || '') + "";
@@ -604,8 +640,8 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
604
640
  cols = rows;
605
641
  rows = temp;
606
642
  }
607
- var aggr = pivotData.getAggregator(rows, cols);
608
- var category_text = `<span style="font-weight: bold;">${cols} </span>`;
643
+
644
+ var category_text = `<span style="font-weight: bold;">${cols}${isWaterfallBreakdown ? ': ' : ' '}</span>`;
609
645
  if (this.category) {
610
646
  category_text = '';
611
647
  }
@@ -617,9 +653,18 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
617
653
  if (pivotData.rowAttrs.length == 0) {
618
654
  series_text = ': ';
619
655
  }
656
+
657
+ if (isWaterfallBreakdown) {
658
+ const modifiedRowsAndCols = highchartsRenderer.transformRowsAndColsForBreakdown(rows, cols, this.point, opts);
659
+ rows = modifiedRowsAndCols.rows;
660
+ cols = modifiedRowsAndCols.cols;
661
+ }
662
+
663
+ var aggr = pivotData.getAggregator(rows, cols);
664
+
620
665
  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);
666
+ if (aggr.value() || isWaterfallBreakdown) {
667
+ formatted_value_to_return = $.pivotUtilities.getFormattedNumber(isWaterfallBreakdown ? y : aggr.value(), aggr, opts);
623
668
  }
624
669
 
625
670
  let wrappedFormattedValue = highchartsRenderer.getSpanWrapper(formatted_value_to_return);
@@ -628,7 +673,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
628
673
  category_text = tooltipOptions.show_x_axis ? category_text : '';
629
674
  series_text = tooltipOptions.show_data_series ? series_text : '';
630
675
 
631
- let to_return = category_text + series_text + wrappedFormattedValue;
676
+ let to_return = isWaterfallBreakdown ? `${ category_text }${ wrappedFormattedValue }` : category_text + series_text + wrappedFormattedValue;
632
677
 
633
678
  if (is_drill_down_pie) {
634
679
  to_return = wrappedFormattedValue;
@@ -1128,7 +1173,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
1128
1173
  allowOverlap: additionOptions && additionOptions.label ? additionOptions.label.overlap : false,
1129
1174
  enabled: additionOptions && additionOptions.label ? additionOptions.label.show : true,
1130
1175
  formatter: highchartsRenderer.defaultDataLabelFormatter(pivotData, {'chartOptions': additionOptions, total_value_options: opts.total_value_options}),
1131
- style: highchartsRenderer.getDataLabelsStyle(additionOptions)
1176
+ style: highchartsRenderer.getDataLabelsStyle(additionOptions),
1132
1177
  }
1133
1178
 
1134
1179
  ob = highchartsRenderer.getDataLabelsOptions(additionOptions, ob);
@@ -1284,6 +1329,94 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
1284
1329
  return chart_series;
1285
1330
  }
1286
1331
 
1332
+ highchartsRenderer.ptCreateWaterfallBreakdownSeries = function (pivotData, onlyNumbers, additionOptions, opts) {
1333
+
1334
+ const colorOptions = opts.breakdown_options.colors;
1335
+
1336
+ var chart_series = [],
1337
+ row_n_keys = pivotData.getRowKeys(),
1338
+ col_n_keys = pivotData.getColKeys();
1339
+
1340
+ if (row_n_keys.length == 0)
1341
+ row_n_keys.push([]);
1342
+
1343
+ let resultObject = {
1344
+ data: [],
1345
+ dataLabels: {
1346
+ allowOverlap: additionOptions && additionOptions.label ? additionOptions.label.overlap : false,
1347
+ enabled: additionOptions && additionOptions.label ? additionOptions.label.show : true,
1348
+ formatter: highchartsRenderer.defaultDataLabelFormatter(pivotData, {'chartOptions': additionOptions, total_value_options: opts.total_value_options}),
1349
+ style: highchartsRenderer.getDataLabelsStyle(additionOptions),
1350
+ },
1351
+ upColor: colorOptions.increase,
1352
+ color: colorOptions.decrease,
1353
+ className: 'waterfallBreakdown'
1354
+ };
1355
+ resultObject = highchartsRenderer.getDataLabelsOptions(additionOptions, resultObject);
1356
+
1357
+ const breakdownValues = [];
1358
+ lodash.forEach(col_n_keys, function(col_n_value, col_index) {
1359
+ breakdownValues.push([]);
1360
+ lodash.forEach(row_n_keys, function (row_n_value, row_index) {
1361
+ var agg = pivotData.getAggregator(row_n_value, col_n_value);
1362
+ var val = agg.value();
1363
+
1364
+ if (val != null && $.isNumeric(val)) {
1365
+ val = parseFloat(val);
1366
+ } else if (onlyNumbers) {
1367
+ val = NaN;
1368
+ } else {
1369
+ val = 0;
1370
+ }
1371
+
1372
+ breakdownValues[col_index][row_index] = val;
1373
+
1374
+ if (col_index) {
1375
+ const value = val - breakdownValues[col_index - 1][row_index];
1376
+
1377
+ if (value) {
1378
+ var tmoobj = {};
1379
+ var key = row_n_value;
1380
+ if (lodash.isArray(row_n_value)) {
1381
+ key = row_n_value[0];
1382
+ }
1383
+ tmoobj.name = lodash.unescape(key);
1384
+
1385
+ if (tmoobj.name) {
1386
+ tmoobj.name = tmoobj.name.replace('DR_Others', highchartsRenderer.getOthersName(opts));
1387
+ }
1388
+
1389
+ if (lodash.isEmpty(String(tmoobj.name))) {
1390
+ tmoobj.name = lodash.unescape(col_n_value);
1391
+ tmoobj.visible = false;
1392
+ }
1393
+ tmoobj.y = value;
1394
+ resultObject.data.push(tmoobj);
1395
+ }
1396
+ }
1397
+ });
1398
+
1399
+ resultObject.data.push({
1400
+ y: pivotData.colTotals[col_n_value].sum,
1401
+ name: lodash.unescape(col_n_value),
1402
+ isSum: !!col_index,
1403
+ isTotal: true,
1404
+ color: colorOptions.total,
1405
+ });
1406
+ });
1407
+
1408
+ chart_series.push(resultObject);
1409
+
1410
+ opts.chart_series = []
1411
+ if (!lodash.isEqual(row_n_keys, [[]])) {
1412
+ chart_series.forEach(series => {
1413
+ opts.chart_series.push(series.name);
1414
+ })
1415
+ }
1416
+
1417
+ return chart_series;
1418
+ }
1419
+
1287
1420
  highchartsRenderer.setChartTypeBySeriesType = function (type, series) {
1288
1421
  const types = {
1289
1422
  'line-chart': 'line',
@@ -3037,6 +3170,99 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
3037
3170
  return highchartsRenderer.ptCreateElementAndDraw(chartOptions, opts);
3038
3171
  };
3039
3172
 
3173
+ highchartsRenderer.ptRenderWaterfallBreakdown = function (pivotData, opts, drilldownFunc, chartType) {
3174
+ let chartOptions = {};
3175
+ const additionOptions = opts.chartOptions ? opts.chartOptions : highchartsRenderer.getDefaultValueForChart('column-chart');
3176
+
3177
+ chartOptions.chart = {
3178
+ type: 'waterfall',
3179
+ zoomType: additionOptions && additionOptions.chart && additionOptions.chart.zoom_type ? additionOptions.chart.zoom_type : 'None',
3180
+ };
3181
+ if (disableAnimation) {
3182
+ chartOptions.chart.animation = false;
3183
+ }
3184
+
3185
+ const breakdownFieldIsNotSet = lodash.some(pivotData.getRowKeys(), rowKey => !rowKey || lodash.isArray(rowKey) && !rowKey.length);
3186
+ chartOptions.xAxis = {
3187
+ type: 'category',
3188
+ crosshair: true,
3189
+ min: 0,
3190
+ title: {
3191
+ text : additionOptions && additionOptions.axisX ? additionOptions.axisX.name : '',
3192
+ },
3193
+ uniqueNames: breakdownFieldIsNotSet,
3194
+ };
3195
+
3196
+ highchartsRenderer.setTitleAndSubTitle(chartOptions, opts, additionOptions);
3197
+
3198
+ chartOptions.yAxis = {
3199
+ min: null,
3200
+ max: null,
3201
+ title: {
3202
+ text: additionOptions && additionOptions.axisY ? additionOptions.axisY.name : '',
3203
+ autoylabel: additionOptions && additionOptions.axisY ? additionOptions.axisY.autoylabel : ''
3204
+ },
3205
+ labels: {
3206
+ formatter: highchartsRenderer.defaultValueLabelsFormatter(pivotData, opts)
3207
+ },
3208
+ };
3209
+ if (additionOptions) {
3210
+ highchartsRenderer.setYAxisMinMax(chartOptions.yAxis, additionOptions.axisY);
3211
+ }
3212
+
3213
+ chartOptions.tooltip = {
3214
+ formatter: highchartsRenderer.defaultFormatterToTooltip(pivotData, opts),
3215
+ valueDecimals: 2,
3216
+ };
3217
+
3218
+ highchartsRenderer.handleGridLines(additionOptions, chartOptions);
3219
+
3220
+ if (lodash.get(opts, 'paletteOptions.widgetPalette', null)) {
3221
+ const mc_palette = lodash.find(lodash.get(opts.paletteOptions, 'monochromePalettes', []), { selected: true });
3222
+ chartOptions.colors = mc_palette ? mc_palette.colors : opts.paletteOptions.widgetPalette;
3223
+ } else if (lodash.get(opts, 'paletteOptions.dashboardPalette.colors', null)) {
3224
+ chartOptions.colors = opts.paletteOptions.dashboardPalette.colors;
3225
+ }
3226
+ chartOptions.series = highchartsRenderer
3227
+ .ptCreateWaterfallBreakdownSeries(pivotData, null, additionOptions, opts);
3228
+
3229
+ chartOptions = highchartsRenderer.prepareAxisX(chartOptions, additionOptions, pivotData.getColKeys());
3230
+ chartOptions.plotOptions = {
3231
+ waterfall: {
3232
+ pointPadding: 0.2,
3233
+ borderWidth: 0,
3234
+ borderRadius: 1,
3235
+ lineWidth: 0,
3236
+ },
3237
+ series: {
3238
+ animation: !disableAnimation,
3239
+ cropThreshold: 1000,
3240
+ dataLabels: {
3241
+ allowOverlap: additionOptions && additionOptions.label ? additionOptions.label.overlap : false,
3242
+ enabled: additionOptions && additionOptions.label ? additionOptions.label.show : true,
3243
+ formatter: highchartsRenderer.defaultDataLabelFormatter(pivotData, opts),
3244
+ style: highchartsRenderer.getDataLabelsStyle(additionOptions),
3245
+ inside: false
3246
+ }
3247
+ }
3248
+ };
3249
+
3250
+ if (opts.drillDownListFunc) {
3251
+ chartOptions.plotOptions.series.cursor = 'pointer';
3252
+ chartOptions.plotOptions.series.point = {
3253
+ events: {
3254
+ click: opts.drillDownListFunc
3255
+ }
3256
+ };
3257
+ }
3258
+
3259
+ chartOptions.legend = {
3260
+ enabled: false
3261
+ };
3262
+
3263
+ return highchartsRenderer.ptCreateElementAndDraw(chartOptions, opts);
3264
+ };
3265
+
3040
3266
  highchartsRenderer.formatFieldValue = function (field, value) {
3041
3267
  let currentType = '';
3042
3268
  switch (field.type) {
@@ -4101,7 +4327,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
4101
4327
  }
4102
4328
  };
4103
4329
 
4104
- highchartsRenderer.rhPivotView = function (rowData, options, isTable = false) {
4330
+ highchartsRenderer.rhPivotView = function (rowData, options, isTable = false, widget = null) {
4105
4331
  if (!rowData || !rowData) {
4106
4332
  if (options.onlyOptions) {
4107
4333
  return {};
@@ -4109,6 +4335,28 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
4109
4335
  return null;
4110
4336
  }
4111
4337
 
4338
+ if (widget && widget.chart_type === CHART_TYPES.WATERFALL_BREAKDOWN) {
4339
+ const breakdownSettings = widget.options.breakdown_options.settings;
4340
+ const maxCategories = breakdownSettings.maxCategoriesCount;
4341
+ const minCategories = breakdownSettings.minCategoriesCount;
4342
+ const categoryFieldName = widget.cols[0].name;
4343
+ const uniqueCategories = lodash.filter(lodash.uniq(lodash.map(rowData, row => row[categoryFieldName])), value => !!value);
4344
+
4345
+ if (uniqueCategories && (uniqueCategories.length > maxCategories || uniqueCategories.length < minCategories )) {
4346
+ const commonErrorSentence = `Please choose ${minCategories}-${maxCategories} items in the Category section.`
4347
+ options.error_has_occurred = true;
4348
+ options.error_params = {
4349
+ title: uniqueCategories.length > maxCategories
4350
+ ? `There is too much data. ${commonErrorSentence}`
4351
+ : `Not enough data. ${commonErrorSentence}`,
4352
+ text: '',
4353
+ btnText: 'Edit Widget',
4354
+ class: 'too-much-data',
4355
+ }
4356
+ return highchartsRenderer.getNoDataResult(options.rendererOptions, true);
4357
+ }
4358
+ }
4359
+
4112
4360
  if (rowData.length == 0) {
4113
4361
  if (options.onlyOptions) {
4114
4362
  return {};
@@ -6517,6 +6765,17 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
6517
6765
  };
6518
6766
 
6519
6767
  highchartsRenderer.chartsTypesInfo = {
6768
+ [CHART_TYPES.WATERFALL_BREAKDOWN]: {
6769
+ name: 'Waterfall Breakdown Chart ',
6770
+ label: 'Waterfall Breakdown Chart ',
6771
+ title: 'TODO: add text',
6772
+ description: 'TODO: add text',
6773
+ axisName: 'Category',
6774
+ legendName: 'Breakdown',
6775
+ startedMessage: 'To get started, drag one field to the Category and one field to the Value section.',
6776
+ axisTooltipTitle: 'TODO: add text',
6777
+ legendTooltipTitle: 'TODO: add text',
6778
+ },
6520
6779
  'combo-chart': {
6521
6780
  name: 'Combo Chart ',
6522
6781
  label: 'Combo Chart ',
@@ -7149,6 +7408,32 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
7149
7408
  }
7150
7409
  ]
7151
7410
  },
7411
+ {
7412
+ type: 'waterfall-chart',
7413
+ name: 'Waterfall',
7414
+ hidden: true,
7415
+ class: 'google-visualization-charteditor-mini-column',
7416
+ subtypes: [
7417
+ {
7418
+ type: CHART_TYPES.WATERFALL_BREAKDOWN,
7419
+ name: highchartsRenderer.chartsTypesInfo[CHART_TYPES.WATERFALL_BREAKDOWN].name,
7420
+ class: 'google-visualization-charteditor-thumbs-columnchart',
7421
+ render: highchartsRenderer.ptRenderWaterfallBreakdown,
7422
+ suboptions: [
7423
+ highchartsRenderer.suboptions["axisY"],
7424
+ highchartsRenderer.suboptions["axisX"],
7425
+ highchartsRenderer.suboptions["tooltips"],
7426
+ highchartsRenderer.suboptions["label"],
7427
+ highchartsRenderer.suboptions["subtitle"],
7428
+ highchartsRenderer.suboptions["widget_library"],
7429
+ highchartsRenderer.suboptions["chart"],
7430
+ highchartsRenderer.suboptions["negative_number_format"],
7431
+ highchartsRenderer.suboptions["advanced"],
7432
+ highchartsRenderer.suboptions["legends"],
7433
+ ]
7434
+ },
7435
+ ]
7436
+ },
7152
7437
  ];
7153
7438
 
7154
7439
  highchartsRenderer.richTextSubType = {
@@ -8054,7 +8339,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
8054
8339
  subopts.onlyOptions = true;
8055
8340
  }
8056
8341
 
8057
- let hc_options = highchartsRenderer.rhPivotView(res, subopts, is_table);
8342
+ let hc_options = highchartsRenderer.rhPivotView(res, subopts, is_table, widget_obj);
8058
8343
 
8059
8344
  return hc_options;
8060
8345
  }
@@ -8281,6 +8566,24 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
8281
8566
  }
8282
8567
  }
8283
8568
 
8569
+ highchartsRenderer.getOthersName = function(opts) {
8570
+ return lodash.get(opts, "total_value_options.filter_options.filteredOutFieldName") || 'Others';
8571
+ }
8572
+
8573
+ highchartsRenderer.transformRowsAndColsForBreakdown = function(rows, cols, point, opts) {
8574
+ const othersIndex = cols.indexOf(highchartsRenderer.getOthersName(opts));
8575
+ if (othersIndex !== -1) {
8576
+ cols[othersIndex] = 'DR_Others';
8577
+ }
8578
+ if (point.options.isTotal) {
8579
+ rows = [];
8580
+ } else {
8581
+ rows = cols;
8582
+ cols = [];
8583
+ }
8584
+ return { rows: rows, cols: cols };
8585
+ }
8586
+
8284
8587
  return highchartsRenderer;
8285
8588
  };
8286
8589