@datarailsshared/dr_renderer 1.4.94 → 1.4.97

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.4.94",
3
+ "version": "1.4.97",
4
4
  "description": "DataRails charts and tables renderer",
5
5
  "keywords": [
6
6
  "datarails",
@@ -1,9 +1,10 @@
1
1
  const helpers = require('./dr-renderer-helpers');
2
2
  const { DrGaugeChart, GAUGE_OPTIONS_DEFAULT } = require('./charts/dr_gauge_chart');
3
3
  const { DrDonutChart } = require('./charts/dr_donut_chart');
4
- const seriesPointStylesHelper= require('./seriesPointStyles-helper');
4
+ const seriesPointStylesHelper = require('./seriesPointStyles-helper');
5
5
  const smartQueriesHelper = require('./smart_queries_helper');
6
- const {DrGaugeCategoriesSummaryChart} = require("./charts/dr_gauge_categories_summary_chart");
6
+ const valueFormatter = require('./value.formatter');
7
+ const { DrGaugeCategoriesSummaryChart } = require("./charts/dr_gauge_categories_summary_chart");
7
8
  const {
8
9
  TooMuchDataError,
9
10
  NoDataError,
@@ -611,7 +612,14 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
611
612
  };
612
613
 
613
614
  //TODO No totals formatts
614
- highchartsRenderer.defaultValueLabelsFormatter = function (pivotData, opts) {
615
+ highchartsRenderer.defaultValueLabelsFormatter = function (pivotData, opts, forcePercentage = false) {
616
+ const deltaColumn = lodash.get(opts, 'chartOptions.delta_column', null);
617
+ const isPercentage = deltaColumn && deltaColumn.is_percentage && deltaColumn.only_variant || forcePercentage;
618
+
619
+ if (isPercentage) {
620
+ return highchartsRenderer.persantageValueLabelsFormatter(pivotData, opts);
621
+ }
622
+
615
623
  const labelOptions = lodash.get(opts.chartOptions, 'label') || lodash.get(opts.chartOptions, 'label_pie');
616
624
 
617
625
  return function () {
@@ -633,7 +641,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
633
641
  highchartsRenderer.persantageValueLabelsFormatter = function (pivotData, opts) {
634
642
  var func = function () {
635
643
  var value = parseFloat(this.value);
636
- return $.pivotUtilities.getFormattedNumber(value * 100, null, null) + "%";
644
+ return $.pivotUtilities.getFormattedNumber(value, null, null) + "%";
637
645
  };
638
646
  return func;
639
647
  };
@@ -692,6 +700,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
692
700
 
693
701
  var func = function () {
694
702
  var value = parseFloat(this.y);
703
+
695
704
  if (pivotData) {
696
705
  let series_name = highchartsRenderer.getSeriesNameInFormatterContext(this);
697
706
  var rows = series_name.split(highchartsRenderer.delimer);
@@ -852,6 +861,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
852
861
  const isTrendSeries = this.series.options.className === SERIES_CLASSNAMES.TREND_SERIES;
853
862
 
854
863
  var y = parseFloat(this.y);
864
+
855
865
  if (pivotData) {
856
866
  let series_name = highchartsRenderer.getSeriesNameInFormatterContext(this);
857
867
  var rows = series_name.split(highchartsRenderer.delimer);
@@ -879,6 +889,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
879
889
  if (variant_name && rows && rows[0] && variant_name == rows[0]) {
880
890
  rows[0] = variant_name_default_name;
881
891
  }
892
+
882
893
  try {
883
894
  if (is_drill_down_pie && !highchartsRenderer.selfStartsWith(series_name,"Series ")) {
884
895
  let temp = cols;
@@ -919,7 +930,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
919
930
  }
920
931
 
921
932
  var aggr = pivotData.getAggregator(rows, cols);
922
-
933
+
923
934
  let formatted_value_to_return = $.pivotUtilities.getFormattedNumber(y, null, opts);
924
935
  if (aggr.value() || isWaterfallBreakdown) {
925
936
  formatted_value_to_return = $.pivotUtilities.getFormattedNumber(
@@ -1346,7 +1357,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
1346
1357
  }
1347
1358
 
1348
1359
  if (has_delta && additionOptions && ob.name == additionOptions.delta_column.name) {
1349
- ob = highchartsRenderer.getVariantSeries(ob, additionOptions.delta_column);
1360
+ ob = highchartsRenderer.getVariantSeries(ob, additionOptions.delta_column, pivotData);
1350
1361
  variat_serias = ob;
1351
1362
  }
1352
1363
 
@@ -1554,7 +1565,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
1554
1565
  }
1555
1566
 
1556
1567
  if (has_delta && row_n_value && row_n_value.some(val => val === additionOptions.delta_column.name)) {
1557
- ob = highchartsRenderer.getVariantSeries(ob, additionOptions.delta_column);
1568
+ ob = highchartsRenderer.getVariantSeries(ob, additionOptions.delta_column, pivotData);
1558
1569
  variat_serias = ob;
1559
1570
  }
1560
1571
 
@@ -1876,7 +1887,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
1876
1887
  }
1877
1888
  }
1878
1889
 
1879
- highchartsRenderer.getVariantSeries = function (series, delta_column_options) {
1890
+ highchartsRenderer.getVariantSeries = function (series, delta_column_options, pivotData) {
1880
1891
  const varianceColor = delta_column_options.color || highchartsRenderer.variance_color || Highcharts.getOptions().colors[7];
1881
1892
  series.name = delta_column_options.name.replace('_', '');
1882
1893
  series.initialName = series.name;
@@ -1903,6 +1914,18 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
1903
1914
  }
1904
1915
  }
1905
1916
 
1917
+ if (delta_column_options.is_percentage) {
1918
+ lodash.forEach(series.data, function (it, index) {
1919
+ if (pivotData.rowKeys && pivotData.rowKeys.length && pivotData.colKeys && pivotData.colKeys.length) {
1920
+ const agg = pivotData.getAggregator([pivotData.rowKeys[0]], pivotData.colKeys[index]);
1921
+ if (agg) {
1922
+ const baseValue = pivotData.getAggregator([pivotData.rowKeys[0]], pivotData.colKeys[index]).value();
1923
+ it.y = valueFormatter.getPercentageValue(it.y, baseValue);
1924
+ }
1925
+ }
1926
+ });
1927
+ }
1928
+
1906
1929
  if (delta_column_options.chart == 'line') {
1907
1930
  series.type = 'line';
1908
1931
  series.lineColor = varianceColor;
@@ -1949,7 +1972,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
1949
1972
  } else if (delta_column_options.chart == 'spline') {
1950
1973
  series.color = varianceColor;
1951
1974
  series.type = 'spline'
1952
- }
1975
+ }
1953
1976
  return series;
1954
1977
  }
1955
1978
 
@@ -2107,9 +2130,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
2107
2130
 
2108
2131
  highchartsRenderer.addSecondYAxis = function (pivotData, chartOptions, additionOptions, opts) {
2109
2132
  const varianceColor = (additionOptions && additionOptions.delta_column.color) || (highchartsRenderer && highchartsRenderer.variance_color) || Highcharts.getOptions().colors[7];
2110
- let labels_formatter = opts.comboOptions.secondaryAxisSettings.is_percentage ?
2111
- highchartsRenderer.persantageValueLabelsFormatter(pivotData, opts) :
2112
- highchartsRenderer.defaultValueLabelsFormatter(pivotData, opts);
2133
+ const forcePercentage = lodash.get(opts, 'comboOptions.secondaryAxisSettings.is_percentage', false);
2113
2134
 
2114
2135
  chartOptions.yAxis = [chartOptions.yAxis];
2115
2136
  chartOptions.yAxis[1] = {
@@ -2122,7 +2143,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
2122
2143
  }
2123
2144
  },
2124
2145
  labels: {
2125
- formatter: labels_formatter,
2146
+ formatter: highchartsRenderer.defaultValueLabelsFormatter(pivotData, opts, forcePercentage),
2126
2147
  style: {
2127
2148
  color: varianceColor
2128
2149
  }
@@ -2518,7 +2539,6 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
2518
2539
  var chartOptions = {};
2519
2540
  var rowAttrs = pivotData.rowAttrs;
2520
2541
  var colAttrs = pivotData.colAttrs;
2521
-
2522
2542
  var additionOptions = opts.chartOptions ? opts.chartOptions : highchartsRenderer.getDefaultValueForChart('line-chart');
2523
2543
 
2524
2544
  chartOptions.chart = {
@@ -3309,6 +3329,37 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
3309
3329
  var rowAttrs = pivotData.rowAttrs;
3310
3330
  var additionOptions = opts.chartOptions ? opts.chartOptions : highchartsRenderer.getDefaultValueForChart('bar-chart-stacked');
3311
3331
 
3332
+ const isVarianceOnly = lodash.get(additionOptions, 'delta_column.only_variant', false);
3333
+ const labelStyle = lodash.merge(
3334
+ LABEL_DEFAULT_OPTIONS.style,
3335
+ { color: lodash.get(additionOptions, `${ highchartsRenderer.getLabelOptionKey(additionOptions) }.font_color`) || LABEL_DEFAULT_OPTIONS.color },
3336
+ highchartsRenderer.getDataLabelsStyle(additionOptions)
3337
+ );
3338
+
3339
+ const stackLabelsFormatter = function() {
3340
+ return function() {
3341
+ if (this.total) {
3342
+ var total = parseFloat(this.total);
3343
+ var agg = pivotData.getAggregator([], []);
3344
+ if (agg) {
3345
+ return agg.format(total, true);
3346
+ } else {
3347
+ return total.toLocaleString();
3348
+ }
3349
+ }
3350
+ return '';
3351
+ }
3352
+ }
3353
+
3354
+ const dataLabelsFormatter = function() {
3355
+ return function() {
3356
+ const deltaColumnName = lodash.get(opts, 'chartOptions.delta_column.name', '');
3357
+ const currentRowName = this.series && this.series.name ? String(this.series.name) : '';
3358
+ const isVariance = currentRowName.replace('_', '').toLowerCase() === deltaColumnName.replace('_', '').toLowerCase();
3359
+ return isVariance ? highchartsRenderer.defaultDataLabelFormatter(pivotData, opts).call(this) : '';
3360
+ }
3361
+ }
3362
+
3312
3363
  chartOptions.chart = {
3313
3364
  type: 'bar',
3314
3365
  zoomType: 'x'
@@ -3324,27 +3375,9 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
3324
3375
  text: additionOptions && additionOptions.axisY ? additionOptions.axisY.name : ''
3325
3376
  },
3326
3377
  stackLabels: {
3327
- enabled: additionOptions && additionOptions.label ? additionOptions.label.show : true,
3328
- formatter: function () {
3329
- if (this.total) {
3330
- var total = parseFloat(this.total);
3331
- var agg = pivotData.getAggregator([], []);
3332
- if (agg) {
3333
- return agg.format(total, true);
3334
- } else {
3335
- return total.toLocaleString();
3336
- }
3337
- }
3338
- return "";
3339
- },
3340
- style: lodash.merge(
3341
- LABEL_DEFAULT_OPTIONS.style,
3342
- {
3343
- color: lodash.get(additionOptions, `${ highchartsRenderer.getLabelOptionKey(additionOptions) }.font_color`)
3344
- || LABEL_DEFAULT_OPTIONS.color,
3345
- },
3346
- highchartsRenderer.getDataLabelsStyle(additionOptions)
3347
- ),
3378
+ enabled: additionOptions && additionOptions.label && !isVarianceOnly ? additionOptions.label.show : false,
3379
+ formatter: stackLabelsFormatter.call(this),
3380
+ style: labelStyle
3348
3381
  },
3349
3382
  labels: {
3350
3383
  formatter: highchartsRenderer.defaultValueLabelsFormatter(pivotData, opts)
@@ -3368,7 +3401,13 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
3368
3401
  chartOptions.plotOptions = {
3369
3402
  series: {
3370
3403
  animation: !disableAnimation,
3371
- stacking: 'normal'
3404
+ stacking: 'normal',
3405
+ dataLabels: {
3406
+ allowOverlap: additionOptions && additionOptions.label ? additionOptions.label.overlap : false,
3407
+ enabled: additionOptions && additionOptions.label ? additionOptions.label.show : false,
3408
+ formatter: dataLabelsFormatter.call(this),
3409
+ style: labelStyle
3410
+ }
3372
3411
  }
3373
3412
  };
3374
3413
 
@@ -3405,7 +3444,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
3405
3444
  const additionOptions = opts.chartOptions
3406
3445
  ? opts.chartOptions
3407
3446
  : highchartsRenderer.getDefaultValueForChart(highchartsRenderer.CHART_TYPES.WATERFALL_BREAKDOWN);
3408
-
3447
+
3409
3448
  if (!highchartsRenderer.isSortingOnBackendEnabled) {
3410
3449
  pivotData.colKeys = lodash.map(lodash.keys(pivotData.colTotals), key => [key]);
3411
3450
  }
@@ -3801,12 +3840,18 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
3801
3840
  number_format = this.widget_values_format;
3802
3841
  }
3803
3842
 
3843
+ const aggregatorPercentageValue = valueFormatter.getAggregatorPercentageValueIfRequired(this.sum, render_options, data, rowKey, colKey);
3844
+ if (aggregatorPercentageValue) {
3845
+ return aggregatorPercentageValue;
3846
+ }
3847
+
3804
3848
  number_format = highchartsRenderer.getCalculatedValueFormat(this.calculated_formats, rowKey, colKey) || number_format;
3805
3849
 
3806
3850
  var formated_value = highchartsRenderer.formatValue('n', number_format, x);
3807
3851
 
3808
- return formated_value && formated_value.hasOwnProperty('value') && formated_value.value != null ?
3809
- formated_value.value : x.toLocaleString();
3852
+ return formated_value && formated_value.hasOwnProperty('value') && formated_value.value != null
3853
+ ? formated_value.value
3854
+ : x.toLocaleString();
3810
3855
  },
3811
3856
  numInputs: attr != null ? 0 : 1
3812
3857
  };
@@ -3869,6 +3914,11 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
3869
3914
  return ''
3870
3915
  }
3871
3916
 
3917
+ const aggregatorPercentageValue = valueFormatter.getAggregatorPercentageValueIfRequired(this.uniq, render_options, data, rowKey, colKey);
3918
+ if (aggregatorPercentageValue) {
3919
+ return aggregatorPercentageValue;
3920
+ }
3921
+
3872
3922
  if (is_graph == true || only_formats == true) {
3873
3923
  let number_format = this.widget_values_format || null;
3874
3924
  let formated_value = highchartsRenderer.formatValue('n', number_format, x);
@@ -3956,6 +4006,11 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
3956
4006
  number_format = this.widget_values_format;
3957
4007
  }
3958
4008
 
4009
+ const aggregatorPercentageValue = valueFormatter.getAggregatorPercentageValueIfRequired(this.sum, render_options, data, rowKey, colKey);
4010
+ if (aggregatorPercentageValue) {
4011
+ return aggregatorPercentageValue;
4012
+ }
4013
+
3959
4014
  number_format = highchartsRenderer.getCalculatedValueFormat(this.calculated_formats, rowKey, colKey) || number_format;
3960
4015
  var formated_value = highchartsRenderer.formatValue('n', number_format, x)
3961
4016
 
@@ -4043,6 +4098,11 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
4043
4098
  number_format = this.widget_values_format;
4044
4099
  }
4045
4100
 
4101
+ const aggregatorPercentageValue = valueFormatter.getAggregatorPercentageValueIfRequired(this.val, render_options, data, rowKey, colKey);
4102
+ if (aggregatorPercentageValue) {
4103
+ return aggregatorPercentageValue;
4104
+ }
4105
+
4046
4106
  number_format = highchartsRenderer.getCalculatedValueFormat(this.calculated_formats, rowKey, colKey) || number_format;
4047
4107
 
4048
4108
  var formated_value = highchartsRenderer.formatValue('n', number_format, x)
@@ -4130,6 +4190,11 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
4130
4190
  number_format = this.widget_values_format;
4131
4191
  }
4132
4192
 
4193
+ const aggregatorPercentageValue = valueFormatter.getAggregatorPercentageValueIfRequired(this.val, render_options, data, rowKey, colKey);
4194
+ if (aggregatorPercentageValue) {
4195
+ return aggregatorPercentageValue;
4196
+ }
4197
+
4133
4198
  number_format = highchartsRenderer.getCalculatedValueFormat(this.calculated_formats, rowKey, colKey) || number_format;
4134
4199
 
4135
4200
  var formated_value = highchartsRenderer.formatValue('n', number_format, x)
@@ -4220,6 +4285,11 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
4220
4285
  number_format = this.widget_values_format;
4221
4286
  }
4222
4287
 
4288
+ const aggregatorPercentageValue = valueFormatter.getAggregatorPercentageValueIfRequired(this.sum, render_options, data, rowKey, colKey);
4289
+ if (aggregatorPercentageValue) {
4290
+ return aggregatorPercentageValue;
4291
+ }
4292
+
4223
4293
  number_format = highchartsRenderer.getCalculatedValueFormat(this.calculated_formats, rowKey, colKey) || number_format;
4224
4294
 
4225
4295
  var formated_value = highchartsRenderer.formatValue('n', number_format, x)
@@ -5206,38 +5276,39 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
5206
5276
  },
5207
5277
  seriesOptions: []
5208
5278
  }
5209
- if (options.chartOptions && options.chartOptions.delta_column && options.chartOptions.delta_column.field === 'series') {
5210
- let deltaColumnSeries = {
5211
- series: options.chartOptions.delta_column.name,
5212
- secondaryAxis: !options.chartOptions.delta_column.same_yaxis,
5213
- };
5214
- switch (options.chartOptions.delta_column.chart) {
5215
- case 'line':
5216
- deltaColumnSeries.chartType = 'line-chart';
5217
- break;
5218
- case 'spline':
5219
- deltaColumnSeries.chartType = 'line-chart-smooth';
5220
- break;
5221
- case 'area':
5222
- deltaColumnSeries.chartType = 'area-chart';
5223
- break;
5224
- case 'areaspline':
5225
- deltaColumnSeries.chartType = 'area-chart-smooth';
5226
- break;
5227
- case 'scatter':
5228
- deltaColumnSeries.chartType = 'scatter-chart';
5229
- break;
5230
- case 'column':
5231
- deltaColumnSeries.chartType = 'column-chart';
5232
- break;
5233
- default:
5234
- deltaColumnSeries.chartType = 'scatter-chart';
5235
- break;
5236
- }
5237
- options.comboOptions.seriesOptions.push(deltaColumnSeries);
5238
- options.comboOptions.secondaryAxisSettings.name = options.chartOptions.delta_column.name.replace('_', '');
5239
- options.comboOptions.secondaryAxisSettings.is_percentage = options.chartOptions.delta_column.is_percentage;
5279
+ }
5280
+
5281
+ if (options.chartOptions && options.chartOptions.delta_column && options.chartOptions.delta_column.field === 'series') {
5282
+ let deltaColumnSeries = {
5283
+ series: options.chartOptions.delta_column.name,
5284
+ secondaryAxis: !options.chartOptions.delta_column.same_yaxis,
5285
+ };
5286
+ switch (options.chartOptions.delta_column.chart) {
5287
+ case 'line':
5288
+ deltaColumnSeries.chartType = 'line-chart';
5289
+ break;
5290
+ case 'spline':
5291
+ deltaColumnSeries.chartType = 'line-chart-smooth';
5292
+ break;
5293
+ case 'area':
5294
+ deltaColumnSeries.chartType = 'area-chart';
5295
+ break;
5296
+ case 'areaspline':
5297
+ deltaColumnSeries.chartType = 'area-chart-smooth';
5298
+ break;
5299
+ case 'scatter':
5300
+ deltaColumnSeries.chartType = 'scatter-chart';
5301
+ break;
5302
+ case 'column':
5303
+ deltaColumnSeries.chartType = 'column-chart';
5304
+ break;
5305
+ default:
5306
+ deltaColumnSeries.chartType = 'scatter-chart';
5307
+ break;
5240
5308
  }
5309
+ options.comboOptions.seriesOptions.push(deltaColumnSeries);
5310
+ options.comboOptions.secondaryAxisSettings.name = options.chartOptions.delta_column.name.replace('_', '');
5311
+ options.comboOptions.secondaryAxisSettings.is_percentage = options.chartOptions.delta_column.is_percentage;
5241
5312
  }
5242
5313
  };
5243
5314
 
@@ -10163,4 +10234,5 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
10163
10234
  return highchartsRenderer;
10164
10235
  };
10165
10236
 
10237
+
10166
10238
  module.exports = getHighchartsRenderer;
@@ -0,0 +1,30 @@
1
+ const lodash = require('lodash');
2
+
3
+ function getAggregatorPercentageValueIfRequired(value, render_options, data, rowKey, colKey) {
4
+ const isPercentage = lodash.get(render_options, 'comboOptions.secondaryAxisSettings.is_percentage', false);
5
+ const deltaColumnName = lodash.get(render_options, 'chartOptions.delta_column.name', '');
6
+ const currentRowName = rowKey && rowKey.length ? String(rowKey[0]) : '';
7
+ const isVariance = currentRowName.replace('_', '').toLowerCase() === deltaColumnName.replace('_', '').toLowerCase();
8
+ const baseRowKey = data && data.rowKeys && data.rowKeys.length ? data.rowKeys[0] : null;
9
+ const currentColKey = colKey ? colKey : [];
10
+ const agg = data ? data.getAggregator(baseRowKey, currentColKey) : null;
11
+
12
+ if (isPercentage && isVariance && baseRowKey && agg) {
13
+ const baseValue = agg.value();
14
+ return getPercentageValue(value, baseValue) + '%';
15
+ }
16
+
17
+ return null;
18
+ };
19
+
20
+ function getPercentageValue(value, baseValue) {
21
+ if (!baseValue)
22
+ return value < 0 ? -100 : 100;
23
+
24
+ return Math.round(value / baseValue * 100);
25
+ };
26
+
27
+ module.exports = {
28
+ getAggregatorPercentageValueIfRequired,
29
+ getPercentageValue
30
+ };
@@ -8,6 +8,7 @@ import addInDynamicRanges from './mock/add-in-dynamic-ranges.json';
8
8
  import widgets from './mock/widgets.json';
9
9
  import initPivotTable from "../src/pivottable";
10
10
  import initDRPivotTable from "../src/dr_pivottable";
11
+ import valueFormatter from "../src/value.formatter";
11
12
  import { DrGaugeChart, GAUGE_OPTIONS_DEFAULT } from "../src/charts/dr_gauge_chart";
12
13
 
13
14
  const mockDrChartRender = jest.fn();
@@ -68,6 +69,8 @@ let _document = document;
68
69
  let Highcharts;
69
70
 
70
71
  describe('highcharts_renderer', () => {
72
+ let getAggregatorPercentageValueIfRequiredMock;
73
+
71
74
  beforeAll(() => {
72
75
  Highcharts = {
73
76
  charts: [{
@@ -92,6 +95,12 @@ describe('highcharts_renderer', () => {
92
95
 
93
96
  highchartsRenderer = getHighchartsRenderer($, _document, Highcharts, lodash.cloneDeep(DEFAULT_USER_COLORS), highchartsRenderer,
94
97
  DataFormatter, lodash, moment, true);
98
+
99
+ getAggregatorPercentageValueIfRequiredMock = jest.spyOn(valueFormatter, 'getAggregatorPercentageValueIfRequired').mockImplementation(() => null);
100
+ });
101
+
102
+ afterAll(() => {
103
+ getAggregatorPercentageValueIfRequiredMock.mockRestore();
95
104
  });
96
105
 
97
106
  describe('Function filterFloat', () => {
@@ -444,7 +453,7 @@ describe('highcharts_renderer', () => {
444
453
  let funcContext = { value: '12345.678' };
445
454
  let persantageValueLabelsFormatterFn = highchartsRenderer.persantageValueLabelsFormatter(null, {})
446
455
  let result = persantageValueLabelsFormatterFn.call(funcContext)
447
- expect(result).toBe('1,234,567.8%');
456
+ expect(result).toBe('12,345.678%');
448
457
  });
449
458
  });
450
459
 
@@ -2604,17 +2613,20 @@ describe('highcharts_renderer', () => {
2604
2613
  it('Should return General format if there are no widget_values_format', () => {
2605
2614
  aggregatorObject.widget_values_format = null;
2606
2615
  expect(aggregatorObject.format(123.4567, false)).toBe('123.46');
2616
+ expect(getAggregatorPercentageValueIfRequiredMock).toHaveBeenCalled();
2607
2617
  });
2608
2618
 
2609
2619
  it('Should return widget format if it\'s not calculated value', () => {
2610
2620
  aggregatorObject.widget_values_format = '\"$\"#,###.###';
2611
2621
  expect(aggregatorObject.format(1123.4567, false)).toBe('$1,123.457');
2622
+ expect(getAggregatorPercentageValueIfRequiredMock).toHaveBeenCalled();
2612
2623
  });
2613
2624
 
2614
2625
  it('Should return calculated value format if it\'s calculated value', () => {
2615
2626
  aggregator = highchartsRenderer.rhPivotAggregatorSum(arg, widget_values_format, is_graph, render_options, calculated_info);
2616
2627
  aggregatorObject = aggregator({}, ['Region average'], '');
2617
2628
  expect(aggregatorObject.format(1123.45678, false)).toBe('112345.68%');
2629
+ expect(getAggregatorPercentageValueIfRequiredMock).toHaveBeenCalled();
2618
2630
  });
2619
2631
 
2620
2632
  it('if FF enabledNewWidgetValueFormatting is and some of secondaryAxis is true widget values format must be from seriesOptions and widget_value_format to equal first seriesOptions format', () => {
@@ -2631,6 +2643,7 @@ describe('highcharts_renderer', () => {
2631
2643
  aggregatorObject = aggregator({}, ['Profit'], '');
2632
2644
  aggregatorObject.push({ DR_Values: 'Profit', Profit: 123 });
2633
2645
  expect(aggregatorObject.format(1123.45678, false)).toBe('$1,123.457');
2646
+ expect(getAggregatorPercentageValueIfRequiredMock).toHaveBeenCalled();
2634
2647
  });
2635
2648
  });
2636
2649
  });
@@ -2805,17 +2818,20 @@ describe('highcharts_renderer', () => {
2805
2818
  it('Should return General format if there are no widget_values_format', () => {
2806
2819
  aggregatorObject.widget_values_format = null;
2807
2820
  expect(aggregatorObject.format(123.4567, false)).toBe('123.46');
2821
+ expect(getAggregatorPercentageValueIfRequiredMock).toHaveBeenCalled();
2808
2822
  });
2809
2823
 
2810
2824
  it('Should return widget format if it\'s not calculated value', () => {
2811
2825
  aggregatorObject.widget_values_format = '\"$\"#,###.###';
2812
2826
  expect(aggregatorObject.format(1123.4567, false)).toBe('$1,123.457');
2827
+ expect(getAggregatorPercentageValueIfRequiredMock).toHaveBeenCalled();
2813
2828
  });
2814
2829
 
2815
2830
  it('Should return calculated value format if it\'s calculated value', () => {
2816
2831
  aggregator = highchartsRenderer.rhPivotCount(arg, widget_values_format, is_graph, render_options, calculated_info);
2817
2832
  aggregatorObject = aggregator({}, ['Region average'], '');
2818
2833
  expect(aggregatorObject.format(1123.45678, false)).toBe('112345.68%');
2834
+ expect(getAggregatorPercentageValueIfRequiredMock).toHaveBeenCalled();
2819
2835
  });
2820
2836
 
2821
2837
  it('if FF enabledNewWidgetValueFormatting is and some of secondaryAxis is true widget values format must be from seriesOptions and widget_value_format to equal first seriesOptions format', () => {
@@ -2832,6 +2848,7 @@ describe('highcharts_renderer', () => {
2832
2848
  aggregatorObject = aggregator({}, ['Profit'], '');
2833
2849
  aggregatorObject.push({ DR_Values: 'Profit', Profit: 123 });
2834
2850
  expect(aggregatorObject.format(1123.45678, false)).toBe('$1,123.457');
2851
+ expect(getAggregatorPercentageValueIfRequiredMock).toHaveBeenCalled();
2835
2852
  });
2836
2853
  });
2837
2854
  });
@@ -2964,6 +2981,7 @@ describe('highcharts_renderer', () => {
2964
2981
  it('Should return widget format if it\'s graph', () => {
2965
2982
  aggregatorObject.widget_values_format = '\"$\"#,###.###';
2966
2983
  expect(aggregatorObject.format(2, false)).toBe('$2.000');
2984
+ expect(getAggregatorPercentageValueIfRequiredMock).toHaveBeenCalled();
2967
2985
  });
2968
2986
 
2969
2987
  it('Should return widget format if it\'s only_formats', () => {
@@ -2971,6 +2989,7 @@ describe('highcharts_renderer', () => {
2971
2989
  aggregatorObject = aggregator({}, '', '');
2972
2990
  aggregatorObject.widget_values_format = '\"$\"#,###.###';
2973
2991
  expect(aggregatorObject.format(2, true)).toBe('$2.000');
2992
+ expect(getAggregatorPercentageValueIfRequiredMock).toHaveBeenCalled();
2974
2993
  });
2975
2994
 
2976
2995
  it('Should return uniq values if it\'s table and not only_formats', () => {
@@ -2978,6 +2997,7 @@ describe('highcharts_renderer', () => {
2978
2997
  aggregatorObject = aggregator({}, '', '');
2979
2998
  aggregatorObject.formated_values = ['val1', 'val2'];
2980
2999
  expect(aggregatorObject.format(aggregatorObject.formated_values, false)).toBe('val1<br>val2');
3000
+ expect(getAggregatorPercentageValueIfRequiredMock).toHaveBeenCalled();
2981
3001
  });
2982
3002
  });
2983
3003
  });
@@ -3156,17 +3176,20 @@ describe('highcharts_renderer', () => {
3156
3176
  it('Should return General format if there are no widget_values_format', () => {
3157
3177
  aggregatorObject.widget_values_format = null;
3158
3178
  expect(aggregatorObject.format(123.4567, false)).toBe('123.46');
3179
+ expect(getAggregatorPercentageValueIfRequiredMock).toHaveBeenCalled();
3159
3180
  });
3160
3181
 
3161
3182
  it('Should return widget format if it\'s not calculated value', () => {
3162
3183
  aggregatorObject.widget_values_format = '\"$\"#,###.###';
3163
3184
  expect(aggregatorObject.format(1123.4567, false)).toBe('$1,123.457');
3185
+ expect(getAggregatorPercentageValueIfRequiredMock).toHaveBeenCalled();
3164
3186
  });
3165
3187
 
3166
3188
  it('Should return calculated value format if it\'s calculated value', () => {
3167
3189
  aggregator = highchartsRenderer.rhPivotAggregatorAverage(arg, widget_values_format, is_graph, render_options, calculated_info);
3168
3190
  aggregatorObject = aggregator({}, ['Region average'], '');
3169
3191
  expect(aggregatorObject.format(1123.45678, false)).toBe('112345.68%');
3192
+ expect(getAggregatorPercentageValueIfRequiredMock).toHaveBeenCalled();
3170
3193
  });
3171
3194
 
3172
3195
  it('if FF enabledNewWidgetValueFormatting is and some of secondaryAxis is true widget values format must be from seriesOptions and widget_value_format to equal first seriesOptions format', () => {
@@ -3183,6 +3206,7 @@ describe('highcharts_renderer', () => {
3183
3206
  aggregatorObject = aggregator({}, ['Profit'], '');
3184
3207
  aggregatorObject.push({ DR_Values: 'Profit', Profit: 123 });
3185
3208
  expect(aggregatorObject.format(1123.45678, false)).toBe('$1,123.457');
3209
+ expect(getAggregatorPercentageValueIfRequiredMock).toHaveBeenCalled();
3186
3210
  });
3187
3211
  });
3188
3212
  });
@@ -3358,17 +3382,20 @@ describe('highcharts_renderer', () => {
3358
3382
  it('Should return General format if there are no widget_values_format', () => {
3359
3383
  aggregatorObject.widget_values_format = null;
3360
3384
  expect(aggregatorObject.format(123.4567, false)).toBe('123.46');
3385
+ expect(getAggregatorPercentageValueIfRequiredMock).toHaveBeenCalled();
3361
3386
  });
3362
3387
 
3363
3388
  it('Should return widget format if it\'s not calculated value', () => {
3364
3389
  aggregatorObject.widget_values_format = '\"$\"#,###.###';
3365
3390
  expect(aggregatorObject.format(1123.4567, false)).toBe('$1,123.457');
3391
+ expect(getAggregatorPercentageValueIfRequiredMock).toHaveBeenCalled();
3366
3392
  });
3367
3393
 
3368
3394
  it('Should return calculated value format if it\'s calculated value', () => {
3369
3395
  aggregator = highchartsRenderer.rhPivotAggregatorMin(arg, widget_values_format, is_graph, render_options, calculated_info);
3370
3396
  aggregatorObject = aggregator({}, ['Region average'], '');
3371
3397
  expect(aggregatorObject.format(1123.45678, false)).toBe('112345.68%');
3398
+ expect(getAggregatorPercentageValueIfRequiredMock).toHaveBeenCalled();
3372
3399
  });
3373
3400
 
3374
3401
  it('if FF enabledNewWidgetValueFormatting is and some of secondaryAxis is true widget values format must be from seriesOptions and widget_value_format to equal first seriesOptions format', () => {
@@ -3385,6 +3412,7 @@ describe('highcharts_renderer', () => {
3385
3412
  aggregatorObject = aggregator({}, ['Profit'], '');
3386
3413
  aggregatorObject.push({ DR_Values: 'Profit', Profit: 123 });
3387
3414
  expect(aggregatorObject.format(1123.45678, false)).toBe('$1,123.457');
3415
+ expect(getAggregatorPercentageValueIfRequiredMock).toHaveBeenCalled();
3388
3416
  });
3389
3417
  });
3390
3418
  });
@@ -3560,17 +3588,20 @@ describe('highcharts_renderer', () => {
3560
3588
  it('Should return General format if there are no widget_values_format', () => {
3561
3589
  aggregatorObject.widget_values_format = null;
3562
3590
  expect(aggregatorObject.format(123.4567, false)).toBe('123.46');
3591
+ expect(getAggregatorPercentageValueIfRequiredMock).toHaveBeenCalled();
3563
3592
  });
3564
3593
 
3565
3594
  it('Should return widget format if it\'s not calculated value', () => {
3566
3595
  aggregatorObject.widget_values_format = '\"$\"#,###.###';
3567
3596
  expect(aggregatorObject.format(1123.4567, false)).toBe('$1,123.457');
3597
+ expect(getAggregatorPercentageValueIfRequiredMock).toHaveBeenCalled();
3568
3598
  });
3569
3599
 
3570
3600
  it('Should return calculated value format if it\'s calculated value', () => {
3571
3601
  aggregator = highchartsRenderer.rhPivotAggregatorMax(arg, widget_values_format, is_graph, render_options, calculated_info);
3572
3602
  aggregatorObject = aggregator({}, ['Region average'], '');
3573
3603
  expect(aggregatorObject.format(1123.45678, false)).toBe('112345.68%');
3604
+ expect(getAggregatorPercentageValueIfRequiredMock).toHaveBeenCalled();
3574
3605
  });
3575
3606
 
3576
3607
  it('if FF enabledNewWidgetValueFormatting is and some of secondaryAxis is true widget values format must be from seriesOptions and widget_value_format to equal first seriesOptions format', () => {
@@ -3587,6 +3618,7 @@ describe('highcharts_renderer', () => {
3587
3618
  aggregatorObject = aggregator({}, ['Profit'], '');
3588
3619
  aggregatorObject.push({ DR_Values: 'Profit', Profit: 123 });
3589
3620
  expect(aggregatorObject.format(1123.45678, false)).toBe('$1,123.457');
3621
+ expect(getAggregatorPercentageValueIfRequiredMock).toHaveBeenCalled();
3590
3622
  });
3591
3623
  });
3592
3624
  });
@@ -0,0 +1,79 @@
1
+ const { getAggregatorPercentageValueIfRequired, getPercentageValue } = require('../src/value.formatter');
2
+
3
+ describe('Function getAggregatorPercentageValueIfRequired', () => {
4
+ let render_options, rowKey, colKey;
5
+
6
+ beforeEach(() => {
7
+ render_options = {
8
+ comboOptions: { secondaryAxisSettings: { is_percentage: true } },
9
+ chartOptions: { delta_column: { name: 'Variance' } }
10
+ };
11
+ rowKey = ['Variance'];
12
+ colKey = ['SomeCol'];
13
+ });
14
+
15
+ it('should return percentage string when all conditions are met', () => {
16
+ const data = {
17
+ rowKeys: ['Variance'],
18
+ getAggregator: jest.fn(() => ({
19
+ value: () => 200
20
+ }))
21
+ };
22
+ const result = getAggregatorPercentageValueIfRequired(50, render_options, data, rowKey, colKey);
23
+ expect(result).toBe('25%');
24
+ });
25
+
26
+ it('should return null if is_percentage is false', () => {
27
+ const data = {
28
+ rowKeys: ['Variance'],
29
+ getAggregator: jest.fn()
30
+ };
31
+ render_options.comboOptions.secondaryAxisSettings.is_percentage = false;
32
+ const result = getAggregatorPercentageValueIfRequired(50, render_options, data, rowKey, colKey);
33
+ expect(result).toBeNull();
34
+ });
35
+
36
+ it('should return null if isVariance is false', () => {
37
+ const data = {
38
+ rowKeys: ['NotVariance'],
39
+ getAggregator: jest.fn()
40
+ };
41
+ rowKey = ['NotVariance'];
42
+ const result = getAggregatorPercentageValueIfRequired(50, render_options, data, rowKey, colKey);
43
+ expect(result).toBeNull();
44
+ });
45
+
46
+ it('should return null if baseRowKey is missing', () => {
47
+ const data = {
48
+ rowKeys: [],
49
+ getAggregator: jest.fn()
50
+ };
51
+ const result = getAggregatorPercentageValueIfRequired(50, render_options, data, rowKey, colKey);
52
+ expect(result).toBeNull();
53
+ });
54
+
55
+ it('should return null if agg is missing', () => {
56
+ const data = {
57
+ rowKeys: ['Variance'],
58
+ getAggregator: jest.fn(() => null)
59
+ };
60
+ const result = getAggregatorPercentageValueIfRequired(50, render_options, data, rowKey, colKey);
61
+ expect(result).toBeNull();
62
+ });
63
+ });
64
+
65
+ describe('Function getPercentageValue', () => {
66
+ it('should return -100 when baseValue is falsy and value < 0', () => {
67
+ expect(getPercentageValue(-50, 0)).toBe(-100);
68
+ });
69
+
70
+ it('should return 100 when baseValue is falsy and value >= 0', () => {
71
+ expect(getPercentageValue(50, null)).toBe(100);
72
+ });
73
+
74
+ it('should return rounded percentage when baseValue is truthy', () => {
75
+ expect(getPercentageValue(25, 200)).toBe(13);
76
+ expect(getPercentageValue(50, 200)).toBe(25);
77
+ expect(getPercentageValue(200, 200)).toBe(100);
78
+ });
79
+ });