@datarailsshared/dr_renderer 1.4.94 → 1.4.99

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.
@@ -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
+ });