@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.
- package/package.json +1 -1
- package/src/highcharts_renderer.js +143 -70
- package/src/pivottable.js +456 -453
- package/src/value.formatter.js +30 -0
- package/tests/highcharts_renderer.test.js +33 -1
- package/tests/value.formatter.test.js +79 -0
@@ -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('
|
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
|
+
});
|