@datarailsshared/dr_renderer 1.4.89 → 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,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
|
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
|
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
|
-
|
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:
|
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 :
|
3328
|
-
formatter:
|
3329
|
-
|
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
|
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
|
-
|
5210
|
-
|
5211
|
-
|
5212
|
-
|
5213
|
-
|
5214
|
-
|
5215
|
-
|
5216
|
-
|
5217
|
-
|
5218
|
-
|
5219
|
-
|
5220
|
-
|
5221
|
-
|
5222
|
-
|
5223
|
-
|
5224
|
-
|
5225
|
-
|
5226
|
-
|
5227
|
-
|
5228
|
-
|
5229
|
-
|
5230
|
-
|
5231
|
-
|
5232
|
-
|
5233
|
-
|
5234
|
-
|
5235
|
-
|
5236
|
-
|
5237
|
-
|
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
|
|
@@ -7367,6 +7438,12 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
7367
7438
|
value_name: 'formula',
|
7368
7439
|
element_label: 'Formula',
|
7369
7440
|
default_value: 'x2-x1'
|
7441
|
+
},
|
7442
|
+
{
|
7443
|
+
element_type: 'input',
|
7444
|
+
value_name: 'color',
|
7445
|
+
element_label: 'Color',
|
7446
|
+
default_value: ''
|
7370
7447
|
}, {
|
7371
7448
|
element_type: 'radio',
|
7372
7449
|
value_name: 'chart',
|
@@ -10157,4 +10234,5 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
10157
10234
|
return highchartsRenderer;
|
10158
10235
|
};
|
10159
10236
|
|
10237
|
+
|
10160
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('
|
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
|
+
});
|