@datarailsshared/dr_renderer 1.2.236 → 1.2.237
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 +402 -65
package/package.json
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
const SERIES_CLASSNAMES = {
|
|
2
2
|
WATERFALL_BREAKDOWN: 'waterfallBreakdown',
|
|
3
|
+
WATERFALL_WALKTHROUGH: 'waterfallWalkthrough',
|
|
3
4
|
TOTAL_SERIES: 'totalSeries',
|
|
4
5
|
TREND_SERIES: 'trendSeries',
|
|
5
6
|
};
|
|
@@ -82,6 +83,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
82
83
|
KPI_WIDGET: 'kpi-widget',
|
|
83
84
|
TEXT_WIDGET: 'text-widget',
|
|
84
85
|
WATERFALL_BREAKDOWN: 'waterfall-chart-breakdown',
|
|
86
|
+
WATERFALL_WALKTHROUGH: 'waterfall-chart-walkthrough',
|
|
85
87
|
PUBLISHED_ITEM: 'published_item',
|
|
86
88
|
RICH_TEXT: 'rich_text',
|
|
87
89
|
EXCEL_VIEWER: 'excel_viewer',
|
|
@@ -486,7 +488,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
486
488
|
rows = [];
|
|
487
489
|
}
|
|
488
490
|
|
|
489
|
-
var cols = this.key;
|
|
491
|
+
var cols = lodash.get(this, 'point.options.colsForTotal') || this.key;
|
|
490
492
|
if (typeof (cols) == 'object' && cols.name) {
|
|
491
493
|
cols = cols.name;
|
|
492
494
|
}
|
|
@@ -619,6 +621,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
619
621
|
|
|
620
622
|
var func = function () {
|
|
621
623
|
const isWaterfallBreakdown = this.series.options.className === SERIES_CLASSNAMES.WATERFALL_BREAKDOWN;
|
|
624
|
+
const isWaterfallWalkthrough = this.series.options.className === SERIES_CLASSNAMES.WATERFALL_WALKTHROUGH;
|
|
622
625
|
const isTrendSeries = this.series.options.className === SERIES_CLASSNAMES.TREND_SERIES;
|
|
623
626
|
|
|
624
627
|
var y = parseFloat(this.y);
|
|
@@ -633,7 +636,8 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
633
636
|
|| isTrendSeries) {
|
|
634
637
|
rows = [];
|
|
635
638
|
}
|
|
636
|
-
|
|
639
|
+
|
|
640
|
+
var cols = lodash.get(this, 'point.options.colsForTotal') || this.key;
|
|
637
641
|
if (!cols && is_drill_down_pie) {
|
|
638
642
|
cols = this.name;
|
|
639
643
|
}
|
|
@@ -648,7 +652,6 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
648
652
|
if (variant_name && rows && rows[0] && variant_name == rows[0]) {
|
|
649
653
|
rows[0] = variant_name_default_name;
|
|
650
654
|
}
|
|
651
|
-
|
|
652
655
|
try {
|
|
653
656
|
if (is_drill_down_pie && !highchartsRenderer.selfStartsWith(series_name,"Series ")) {
|
|
654
657
|
let temp = cols;
|
|
@@ -656,7 +659,9 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
656
659
|
rows = temp;
|
|
657
660
|
}
|
|
658
661
|
|
|
659
|
-
var category_text = `<span style="font-weight: bold;"
|
|
662
|
+
var category_text = `<span style="font-weight: bold;">
|
|
663
|
+
${ lodash.get(this, 'point.options.colsForTotal') ? isWaterfallWalkthrough ? this.key : cols[0] : cols } ${ isWaterfallBreakdown ? ': ' : ' ' }
|
|
664
|
+
</span>`;
|
|
660
665
|
if (this.category) {
|
|
661
666
|
category_text = '';
|
|
662
667
|
}
|
|
@@ -680,7 +685,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
680
685
|
let formatted_value_to_return = $.pivotUtilities.getFormattedNumber(y, null, opts);
|
|
681
686
|
if (aggr.value() || isWaterfallBreakdown) {
|
|
682
687
|
formatted_value_to_return = $.pivotUtilities.getFormattedNumber(
|
|
683
|
-
isWaterfallBreakdown || isTrendSeries ? y : aggr.value(), aggr, opts
|
|
688
|
+
isWaterfallBreakdown || isWaterfallWalkthrough || isTrendSeries ? y : aggr.value(), aggr, opts
|
|
684
689
|
);
|
|
685
690
|
}
|
|
686
691
|
|
|
@@ -1413,6 +1418,86 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
1413
1418
|
return chart_series;
|
|
1414
1419
|
}
|
|
1415
1420
|
|
|
1421
|
+
highchartsRenderer.ptCreateWaterfallWalkthroughSeries = function (pivotData, onlyNumbers, additionOptions, opts) {
|
|
1422
|
+
const waterfallOptions = opts.walkthrough_options;
|
|
1423
|
+
const chart_series = [];
|
|
1424
|
+
let resultObject = {
|
|
1425
|
+
data: [],
|
|
1426
|
+
dataLabels: {
|
|
1427
|
+
allowOverlap: additionOptions && additionOptions.label ? additionOptions.label.overlap : false,
|
|
1428
|
+
enabled: additionOptions && additionOptions.label ? additionOptions.label.show : true,
|
|
1429
|
+
formatter: highchartsRenderer.defaultDataLabelFormatter(pivotData, {'chartOptions': additionOptions, total_value_options: opts.total_value_options}),
|
|
1430
|
+
style: highchartsRenderer.getDataLabelsStyle(additionOptions),
|
|
1431
|
+
},
|
|
1432
|
+
upColor: waterfallOptions.colors.increase,
|
|
1433
|
+
color: waterfallOptions.colors.decrease,
|
|
1434
|
+
className: SERIES_CLASSNAMES.WATERFALL_WALKTHROUGH
|
|
1435
|
+
};
|
|
1436
|
+
resultObject = highchartsRenderer.getDataLabelsOptions(additionOptions, resultObject);
|
|
1437
|
+
lodash.forEach(waterfallOptions.values.walkthrough, function(value, index) {
|
|
1438
|
+
|
|
1439
|
+
let keys = [];
|
|
1440
|
+
if (value.trend === 'total') {
|
|
1441
|
+
keys = ['Total'];
|
|
1442
|
+
} else {
|
|
1443
|
+
_.forEach(value.key, (item) => {
|
|
1444
|
+
const findKeyByValue = Object.keys(pivotData.dateValuesDictionary || {}).find(key => pivotData.dateValuesDictionary[key] === item);
|
|
1445
|
+
keys.push(findKeyByValue ? findKeyByValue : item);
|
|
1446
|
+
})
|
|
1447
|
+
}
|
|
1448
|
+
|
|
1449
|
+
const agg = pivotData.getAggregator([], keys);
|
|
1450
|
+
let val = agg.value();
|
|
1451
|
+
|
|
1452
|
+
if (val != null && $.isNumeric(val)) {
|
|
1453
|
+
val = parseFloat(val);
|
|
1454
|
+
} else if (onlyNumbers) {
|
|
1455
|
+
val = NaN;
|
|
1456
|
+
} else {
|
|
1457
|
+
val = 0;
|
|
1458
|
+
}
|
|
1459
|
+
|
|
1460
|
+
if (value.trend === 'decrease') {
|
|
1461
|
+
val = val * -1;
|
|
1462
|
+
}
|
|
1463
|
+
|
|
1464
|
+
const name = value.trend === 'total' ? value.formattedKey || value.key[0] : keys.join(highchartsRenderer.delimer);
|
|
1465
|
+
let color = '';
|
|
1466
|
+
if (value.color) {
|
|
1467
|
+
color = value.color;
|
|
1468
|
+
} else {
|
|
1469
|
+
if (value.trend === 'total') color = waterfallOptions.colors.total;
|
|
1470
|
+
if (value.trend === 'decrease') color = waterfallOptions.colors.decrease;
|
|
1471
|
+
if (value.trend === 'increase') color = waterfallOptions.colors.increase;
|
|
1472
|
+
}
|
|
1473
|
+
|
|
1474
|
+
resultObject.data.push({
|
|
1475
|
+
y: val,
|
|
1476
|
+
name: lodash.unescape(name).replace('DR_Others', highchartsRenderer.getOthersName(opts)),
|
|
1477
|
+
isSum: value.trend === 'total',
|
|
1478
|
+
isTotal: value.trend === 'total',
|
|
1479
|
+
color,
|
|
1480
|
+
colsForTotal: value.trend === 'total' ? keys : null,
|
|
1481
|
+
});
|
|
1482
|
+
});
|
|
1483
|
+
chart_series.push(resultObject);
|
|
1484
|
+
chart_series.push(
|
|
1485
|
+
{
|
|
1486
|
+
name: 'Positive',
|
|
1487
|
+
visible: false,
|
|
1488
|
+
color: waterfallOptions.colors.increase
|
|
1489
|
+
});
|
|
1490
|
+
|
|
1491
|
+
chart_series.push(
|
|
1492
|
+
{
|
|
1493
|
+
name: 'Negative',
|
|
1494
|
+
visible: false,
|
|
1495
|
+
color: waterfallOptions.colors.decrease
|
|
1496
|
+
});
|
|
1497
|
+
|
|
1498
|
+
return chart_series;
|
|
1499
|
+
}
|
|
1500
|
+
|
|
1416
1501
|
highchartsRenderer.setChartTypeBySeriesType = function (type, series) {
|
|
1417
1502
|
const types = {
|
|
1418
1503
|
'line-chart': 'line',
|
|
@@ -3271,6 +3356,121 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
3271
3356
|
return highchartsRenderer.ptCreateElementAndDraw(chartOptions, opts);
|
|
3272
3357
|
};
|
|
3273
3358
|
|
|
3359
|
+
highchartsRenderer.ptRenderWaterfallWalkthrough = function (pivotData, opts) {
|
|
3360
|
+
let chartOptions = {};
|
|
3361
|
+
const waterfallOptions = opts?.walkthrough_options;
|
|
3362
|
+
const additionOptions = opts.chartOptions
|
|
3363
|
+
? opts.chartOptions
|
|
3364
|
+
: highchartsRenderer.getDefaultValueForChart(highchartsRenderer.CHART_TYPES.WATERFALL_WALKTHROUGH);
|
|
3365
|
+
|
|
3366
|
+
chartOptions.chart = {
|
|
3367
|
+
type: 'waterfall',
|
|
3368
|
+
zoomType: additionOptions && additionOptions.chart && additionOptions.chart.zoom_type ? additionOptions.chart.zoom_type : 'None',
|
|
3369
|
+
};
|
|
3370
|
+
if (disableAnimation) {
|
|
3371
|
+
chartOptions.chart.animation = false;
|
|
3372
|
+
}
|
|
3373
|
+
|
|
3374
|
+
chartOptions.xAxis = {
|
|
3375
|
+
type: 'category',
|
|
3376
|
+
crosshair: true,
|
|
3377
|
+
min: 0,
|
|
3378
|
+
title: {
|
|
3379
|
+
text : additionOptions && additionOptions.axisX ? additionOptions.axisX.name : '',
|
|
3380
|
+
},
|
|
3381
|
+
uniqueNames: false,
|
|
3382
|
+
};
|
|
3383
|
+
|
|
3384
|
+
highchartsRenderer.setTitleAndSubTitle(chartOptions, opts, additionOptions);
|
|
3385
|
+
|
|
3386
|
+
chartOptions.yAxis = {
|
|
3387
|
+
min: null,
|
|
3388
|
+
max: null,
|
|
3389
|
+
title: {
|
|
3390
|
+
text: additionOptions && additionOptions.axisY ? additionOptions.axisY.name : '',
|
|
3391
|
+
autoylabel: additionOptions && additionOptions.axisY ? additionOptions.axisY.autoylabel : ''
|
|
3392
|
+
},
|
|
3393
|
+
labels: {
|
|
3394
|
+
formatter: highchartsRenderer.defaultValueLabelsFormatter(pivotData, opts)
|
|
3395
|
+
},
|
|
3396
|
+
};
|
|
3397
|
+
if (additionOptions) {
|
|
3398
|
+
highchartsRenderer.setYAxisMinMax(chartOptions.yAxis, additionOptions.axisY);
|
|
3399
|
+
}
|
|
3400
|
+
|
|
3401
|
+
chartOptions.tooltip = {
|
|
3402
|
+
formatter: highchartsRenderer.defaultFormatterToTooltip(pivotData, opts),
|
|
3403
|
+
valueDecimals: 2,
|
|
3404
|
+
};
|
|
3405
|
+
|
|
3406
|
+
highchartsRenderer.handleGridLines(additionOptions, chartOptions);
|
|
3407
|
+
|
|
3408
|
+
if (lodash.get(opts, 'paletteOptions.widgetPalette', null)) {
|
|
3409
|
+
const mc_palette = lodash.find(lodash.get(opts.paletteOptions, 'monochromePalettes', []), { selected: true });
|
|
3410
|
+
chartOptions.colors = mc_palette ? mc_palette.colors : opts.paletteOptions.widgetPalette;
|
|
3411
|
+
} else if (lodash.get(opts, 'paletteOptions.dashboardPalette.colors', null)) {
|
|
3412
|
+
chartOptions.colors = opts.paletteOptions.dashboardPalette.colors;
|
|
3413
|
+
}
|
|
3414
|
+
chartOptions.series = highchartsRenderer
|
|
3415
|
+
.ptCreateWaterfallWalkthroughSeries(pivotData, null, additionOptions, opts);
|
|
3416
|
+
|
|
3417
|
+
chartOptions = highchartsRenderer.prepareAxisX(chartOptions, additionOptions, pivotData.getColKeys());
|
|
3418
|
+
chartOptions.plotOptions = {
|
|
3419
|
+
waterfall: {
|
|
3420
|
+
pointPadding: 0.2,
|
|
3421
|
+
borderWidth: 0,
|
|
3422
|
+
borderRadius: 1,
|
|
3423
|
+
lineWidth: 0,
|
|
3424
|
+
},
|
|
3425
|
+
series: {
|
|
3426
|
+
animation: !disableAnimation,
|
|
3427
|
+
cropThreshold: 1000,
|
|
3428
|
+
dataLabels: {
|
|
3429
|
+
allowOverlap: additionOptions && additionOptions.label ? additionOptions.label.overlap : false,
|
|
3430
|
+
enabled: additionOptions && additionOptions.label ? additionOptions.label.show : true,
|
|
3431
|
+
formatter: highchartsRenderer.defaultDataLabelFormatter(pivotData, opts),
|
|
3432
|
+
style: highchartsRenderer.getDataLabelsStyle(additionOptions),
|
|
3433
|
+
inside: false
|
|
3434
|
+
},
|
|
3435
|
+
events: {
|
|
3436
|
+
legendItemClick: () => {
|
|
3437
|
+
return false;
|
|
3438
|
+
}
|
|
3439
|
+
}
|
|
3440
|
+
}
|
|
3441
|
+
};
|
|
3442
|
+
|
|
3443
|
+
if (opts.drillDownListFunc) {
|
|
3444
|
+
chartOptions.plotOptions.series.cursor = 'pointer';
|
|
3445
|
+
chartOptions.plotOptions.series.point = {
|
|
3446
|
+
events: {
|
|
3447
|
+
click: opts.drillDownListFunc
|
|
3448
|
+
}
|
|
3449
|
+
};
|
|
3450
|
+
}
|
|
3451
|
+
if (waterfallOptions.colors) {
|
|
3452
|
+
chartOptions.legend = highchartsRenderer.getOptionsForLegends(additionOptions, 3, false);
|
|
3453
|
+
chartOptions.legend.useHTML = true;
|
|
3454
|
+
chartOptions.legend.labelFormatter = function() {
|
|
3455
|
+
const name = this.options.className ? 'Total': this.name;
|
|
3456
|
+
const findTotal = _.find(this.options.data, {isTotal: true});
|
|
3457
|
+
const color = findTotal?.color ? findTotal.color : this.color;
|
|
3458
|
+
return '<span style="margin: 5px; vertical-align: middle; display:inline-block; background-color: '+ color + '; width: 12px; height: 12px; border-radius: 50%"></span><span style="color: #000; display: inline-block; margin: 5px; vertical-align: middle;">' + name + '</span>';
|
|
3459
|
+
}
|
|
3460
|
+
|
|
3461
|
+
chartOptions.legend.symbolPadding = 0;
|
|
3462
|
+
chartOptions.legend.symbolWidth = 0;
|
|
3463
|
+
chartOptions.legend.symbolHeight = 0;
|
|
3464
|
+
chartOptions.legend.squareSymbol = false;
|
|
3465
|
+
} else {
|
|
3466
|
+
chartOptions.legend = {
|
|
3467
|
+
enabled: false
|
|
3468
|
+
}
|
|
3469
|
+
}
|
|
3470
|
+
|
|
3471
|
+
return highchartsRenderer.ptCreateElementAndDraw(chartOptions, opts);
|
|
3472
|
+
}
|
|
3473
|
+
|
|
3274
3474
|
highchartsRenderer.formatFieldValue = function (field, value) {
|
|
3275
3475
|
let currentType = '';
|
|
3276
3476
|
let format = field.format;
|
|
@@ -4339,6 +4539,17 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
4339
4539
|
}
|
|
4340
4540
|
};
|
|
4341
4541
|
|
|
4542
|
+
highchartsRenderer.waterfallConstants = {
|
|
4543
|
+
[highchartsRenderer.CHART_TYPES.WATERFALL_BREAKDOWN]: {
|
|
4544
|
+
minCategoriesCount: 2,
|
|
4545
|
+
maxCategoriesCount: 5,
|
|
4546
|
+
},
|
|
4547
|
+
[highchartsRenderer.CHART_TYPES.WATERFALL_WALKTHROUGH]: {
|
|
4548
|
+
minCategoriesCount: 2,
|
|
4549
|
+
maxCategoriesCount: 10,
|
|
4550
|
+
}
|
|
4551
|
+
};
|
|
4552
|
+
|
|
4342
4553
|
highchartsRenderer.rhPivotView = function (rowData, options, isTable = false, widget = null) {
|
|
4343
4554
|
if (!rowData || !rowData) {
|
|
4344
4555
|
if (options.onlyOptions) {
|
|
@@ -4347,16 +4558,28 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
4347
4558
|
return null;
|
|
4348
4559
|
}
|
|
4349
4560
|
|
|
4350
|
-
|
|
4351
|
-
|
|
4352
|
-
|
|
4353
|
-
|
|
4354
|
-
|
|
4355
|
-
|
|
4356
|
-
|
|
4357
|
-
|
|
4358
|
-
|
|
4359
|
-
)
|
|
4561
|
+
const isWalktrough = lodash.get(widget, 'chart_type') === highchartsRenderer.CHART_TYPES.WATERFALL_WALKTHROUGH;
|
|
4562
|
+
const isBreakdown = lodash.get(widget, 'chart_type')=== highchartsRenderer.CHART_TYPES.WATERFALL_BREAKDOWN;
|
|
4563
|
+
const isWaterfall = isWalktrough || isBreakdown;
|
|
4564
|
+
|
|
4565
|
+
if (isWaterfall) {
|
|
4566
|
+
const maxCategories = highchartsRenderer.waterfallConstants[widget.chart_type].maxCategoriesCount;
|
|
4567
|
+
const minCategories = highchartsRenderer.waterfallConstants[widget.chart_type].minCategoriesCount;
|
|
4568
|
+
let uniqueCategories = [];
|
|
4569
|
+
|
|
4570
|
+
if (isBreakdown) {
|
|
4571
|
+
uniqueCategories = lodash.filter(
|
|
4572
|
+
lodash.uniq(
|
|
4573
|
+
lodash.map(rowData, row => row[widget.cols[0].name])
|
|
4574
|
+
),
|
|
4575
|
+
value => !!value
|
|
4576
|
+
);
|
|
4577
|
+
} else {
|
|
4578
|
+
uniqueCategories = lodash.filter(
|
|
4579
|
+
lodash.get(widget, 'options.walkthrough_options.values.walkthrough'),
|
|
4580
|
+
(category) => category.trend !== 'total'
|
|
4581
|
+
);
|
|
4582
|
+
}
|
|
4360
4583
|
|
|
4361
4584
|
if (uniqueCategories && (uniqueCategories.length > maxCategories || uniqueCategories.length < minCategories )) {
|
|
4362
4585
|
options.error_has_occurred = true;
|
|
@@ -4608,19 +4831,25 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
4608
4831
|
return highchartsRenderer.getWeekNumber(dateObj);
|
|
4609
4832
|
};
|
|
4610
4833
|
|
|
4611
|
-
highchartsRenderer.
|
|
4612
|
-
let
|
|
4834
|
+
highchartsRenderer.check_values_not_for_convert = function (currentgraph, field_name) {
|
|
4835
|
+
let vals_not_convert = [];
|
|
4613
4836
|
if (lodash.has(currentgraph, "options.chartOptions.delta_column") && currentgraph.options.chartOptions.delta_column) {
|
|
4614
4837
|
let delta_options = currentgraph.options.chartOptions.delta_column;
|
|
4615
4838
|
if (delta_options.field == 'series' && currentgraph.rows && currentgraph.rows[0] &&
|
|
4616
4839
|
currentgraph.rows[0].name == field_name) {
|
|
4617
|
-
|
|
4840
|
+
vals_not_convert = [delta_options.name];
|
|
4618
4841
|
} else if (delta_options.field == 'category' && currentgraph.rows && currentgraph.cols[0] &&
|
|
4619
4842
|
currentgraph.cols[0].name == field_name) {
|
|
4620
|
-
|
|
4843
|
+
vals_not_convert = [delta_options.name];
|
|
4621
4844
|
}
|
|
4845
|
+
} else if (currentgraph.chart_type === highchartsRenderer.CHART_TYPES.WATERFALL_WALKTHROUGH) {
|
|
4846
|
+
lodash.forEach(currentgraph.options.walkthrough_options.values.walkthrough, value => {
|
|
4847
|
+
if (value.trend === 'total') {
|
|
4848
|
+
vals_not_convert.push(value.key[0]);
|
|
4849
|
+
}
|
|
4850
|
+
});
|
|
4622
4851
|
}
|
|
4623
|
-
return
|
|
4852
|
+
return vals_not_convert;
|
|
4624
4853
|
};
|
|
4625
4854
|
|
|
4626
4855
|
highchartsRenderer.updateFiltersShowNames = function (filters) {
|
|
@@ -4640,8 +4869,8 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
4640
4869
|
})
|
|
4641
4870
|
};
|
|
4642
4871
|
|
|
4643
|
-
highchartsRenderer.returnRawDataValue = function (type, value, format, field_name,
|
|
4644
|
-
if (
|
|
4872
|
+
highchartsRenderer.returnRawDataValue = function (type, value, format, field_name, vals_not_for_convert) {
|
|
4873
|
+
if (vals_not_for_convert && vals_not_for_convert.length && lodash.includes(vals_not_for_convert, value)) {
|
|
4645
4874
|
return value;
|
|
4646
4875
|
}
|
|
4647
4876
|
|
|
@@ -5100,34 +5329,104 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
5100
5329
|
|
|
5101
5330
|
highchartsRenderer.addTemplateDataToCalcModel = function (selectedTemplate, calcModelOptions) {
|
|
5102
5331
|
highchartsRenderer.setWidgetFieldsToTemplate(selectedTemplate);
|
|
5103
|
-
|
|
5104
|
-
const scenarioName = 'scenario';
|
|
5105
5332
|
const fields = highchartsRenderer.objectCopyJsonMethod(selectedTemplate.fields);
|
|
5106
|
-
const fieldScenarioAlias = _.find(fields, field => (field.alias || '').toLowerCase() === scenarioName)
|
|
5107
|
-
const fieldScenario = _.find(fields, field => (field.name || '').toLowerCase() === scenarioName)
|
|
5108
|
-
const filters = calcModelOptions.config && calcModelOptions.config.filters;
|
|
5109
5333
|
|
|
5110
|
-
const
|
|
5111
|
-
|
|
5112
|
-
const dateFields = [];
|
|
5113
|
-
const dataTypeFields = [];
|
|
5114
|
-
const dataSeriesFields = [];
|
|
5115
|
-
|
|
5116
|
-
let scenarioField = lodash.get(calcModelOptions, 'config.scenario', undefined) || fieldScenarioAlias || fieldScenario;
|
|
5117
|
-
let fieldOb;
|
|
5118
|
-
|
|
5119
|
-
const fillData = (fieldsArr, destinationArr) => {
|
|
5334
|
+
const fillData = (fieldsArr, ignoreFieldsIdToRemove = []) => {
|
|
5335
|
+
const destinationArr = [];
|
|
5120
5336
|
lodash.forEach(fieldsArr, function (valObj) {
|
|
5121
|
-
fieldOb = lodash.find(fields, { id: valObj.id });
|
|
5337
|
+
const fieldOb = lodash.find(fields, { id: valObj.id });
|
|
5122
5338
|
if (fieldOb) {
|
|
5123
5339
|
destinationArr.push(fieldOb);
|
|
5124
|
-
lodash.remove(fields, { id: fieldOb.id });
|
|
5340
|
+
!lodash.includes(ignoreFieldsIdToRemove, fieldOb.id) && lodash.remove(fields, { id: fieldOb.id });
|
|
5125
5341
|
}
|
|
5126
5342
|
});
|
|
5343
|
+
|
|
5344
|
+
return destinationArr;
|
|
5127
5345
|
}
|
|
5128
5346
|
|
|
5347
|
+
const canAssignPredefinedField = (() => {
|
|
5348
|
+
const assignedFields = {};
|
|
5349
|
+
|
|
5350
|
+
return function (predefinedData, type, field, bindValue, oppositeValue) {
|
|
5351
|
+
if (!assignedFields[type]) {
|
|
5352
|
+
assignedFields[type] = [];
|
|
5353
|
+
}
|
|
5354
|
+
|
|
5355
|
+
const isFieldMatch = predefinedData.regex.test(field[bindValue] || '');
|
|
5356
|
+
|
|
5357
|
+
const isFieldTypeCorrect = predefinedData.allowedFieldTypes
|
|
5358
|
+
? lodash.includes(predefinedData.allowedFieldTypes, field.type) : true;
|
|
5359
|
+
|
|
5360
|
+
const isFieldAssigned = assignedFields[type].includes(field[bindValue].toLowerCase())
|
|
5361
|
+
|| assignedFields[type].includes(field[oppositeValue].toLowerCase());
|
|
5362
|
+
|
|
5363
|
+
if (!(isFieldMatch && isFieldTypeCorrect)) return false;
|
|
5364
|
+
|
|
5365
|
+
const loweredFieldValue = field[bindValue].toLowerCase();
|
|
5366
|
+
assignedFields[type].push(loweredFieldValue, loweredFieldValue.replaceAll('_', ' '));
|
|
5367
|
+
|
|
5368
|
+
return !isFieldAssigned;
|
|
5369
|
+
}
|
|
5370
|
+
})();
|
|
5371
|
+
|
|
5372
|
+
const reportingMonthRegex = /reporting[_\s]month/i;
|
|
5373
|
+
|
|
5374
|
+
const predefinedField = {
|
|
5375
|
+
value: {
|
|
5376
|
+
regex: /posting[_\s]amount/i,
|
|
5377
|
+
allowedFieldTypes: ['Float', 'Integer'],
|
|
5378
|
+
fields: [],
|
|
5379
|
+
},
|
|
5380
|
+
dataType: {
|
|
5381
|
+
regex: /data[_\s]type[_\s]by/i,
|
|
5382
|
+
allowedFieldTypes: ['Text'],
|
|
5383
|
+
fields: [],
|
|
5384
|
+
},
|
|
5385
|
+
date: {
|
|
5386
|
+
regex: reportingMonthRegex,
|
|
5387
|
+
allowedFieldTypes: ['Date'],
|
|
5388
|
+
fields: [],
|
|
5389
|
+
},
|
|
5390
|
+
filters: {
|
|
5391
|
+
isMultipleFields: true,
|
|
5392
|
+
regex: /^(scenario|DR_ACC_L0)$/i,
|
|
5393
|
+
fields: [],
|
|
5394
|
+
},
|
|
5395
|
+
dataSeries: {
|
|
5396
|
+
isMultipleFields: true,
|
|
5397
|
+
regex: /^(scenario|account[_\s]full|entity|intercompany|posting[_\s]currency|reporting[_\s]currency|report[_\s]field|USER_TO_DR_ACC_KEY|USER_TO_DR_KPI_KEY)$/i,
|
|
5398
|
+
fields: [],
|
|
5399
|
+
},
|
|
5400
|
+
};
|
|
5401
|
+
|
|
5402
|
+
if (!lodash.get(calcModelOptions, 'config', false)) {
|
|
5403
|
+
/**
|
|
5404
|
+
* alias stronger than name (order in array is important)
|
|
5405
|
+
* Firstly we try to get predefined field by aliases and then fill in by names
|
|
5406
|
+
* */
|
|
5407
|
+
const fieldsDataQueueConfig = [
|
|
5408
|
+
{ value: 'alias', opposite: 'name' },
|
|
5409
|
+
{ value: 'name', opposite: 'alias' }
|
|
5410
|
+
];
|
|
5411
|
+
|
|
5412
|
+
for (const key in predefinedField) {
|
|
5413
|
+
lodash.forEach(fieldsDataQueueConfig, ({value, opposite}) => {
|
|
5414
|
+
const ignoredFields = predefinedField[key].ignoreAssignedFields;
|
|
5415
|
+
const result = predefinedField[key].isMultipleFields
|
|
5416
|
+
? lodash.filter(fields, field => canAssignPredefinedField(predefinedField[key], key, field, value, opposite, ignoredFields))
|
|
5417
|
+
: [lodash.find(fields, field => canAssignPredefinedField(predefinedField[key], key, field, value, opposite, ignoredFields))].filter(f => !!f);
|
|
5418
|
+
|
|
5419
|
+
if (result && result.length) {
|
|
5420
|
+
predefinedField[key].fields.push(...result);
|
|
5421
|
+
}
|
|
5422
|
+
});
|
|
5423
|
+
}
|
|
5424
|
+
}
|
|
5425
|
+
|
|
5426
|
+
const filters = lodash.get(calcModelOptions, 'config.filters', predefinedField.filters.fields);
|
|
5427
|
+
|
|
5129
5428
|
lodash.forEach(filters, function (filterObj) {
|
|
5130
|
-
fieldOb = lodash.find(fields, { id: filterObj.id });
|
|
5429
|
+
const fieldOb = lodash.find(fields, { id: filterObj.id });
|
|
5131
5430
|
if (!fieldOb) return;
|
|
5132
5431
|
|
|
5133
5432
|
filterObj.values = filterObj.values && lodash.map(filterObj.values, highchartsRenderer.decodeFunc);
|
|
@@ -5145,22 +5444,32 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
5145
5444
|
}
|
|
5146
5445
|
});
|
|
5147
5446
|
|
|
5148
|
-
const storedGroupByFields = lodash.get(calcModelOptions, 'config.group_by',
|
|
5149
|
-
const storedDateFields = [lodash.get(calcModelOptions, 'config.date_field',
|
|
5150
|
-
const storedAggFields = [lodash.get(calcModelOptions, 'config.agg_field',
|
|
5151
|
-
const storedDataTypeFields = [lodash.get(calcModelOptions, 'config.data_type_field',
|
|
5152
|
-
|
|
5153
|
-
|
|
5154
|
-
|
|
5155
|
-
|
|
5156
|
-
|
|
5157
|
-
|
|
5447
|
+
const storedGroupByFields = lodash.get(calcModelOptions, 'config.group_by', predefinedField.dataSeries.fields);
|
|
5448
|
+
const storedDateFields = [lodash.get(calcModelOptions, 'config.date_field', predefinedField.date.fields[0])].filter(f => !!f);
|
|
5449
|
+
const storedAggFields = [lodash.get(calcModelOptions, 'config.agg_field', predefinedField.value.fields[0])].filter(f => !!f);
|
|
5450
|
+
const storedDataTypeFields = [lodash.get(calcModelOptions, 'config.data_type_field', predefinedField.dataType.fields[0])].filter(f => !!f);
|
|
5451
|
+
const scenarioField = lodash.get(calcModelOptions, 'config.scenario', lodash.find(predefinedField.filters.fields, filter => [filter.name, filter.alias].includes('scenario')));
|
|
5452
|
+
const reportingMonthFieldWithAlias = lodash.find(fields, _field => reportingMonthRegex.test(_field.alias));
|
|
5453
|
+
const reportingMonthFieldWithName = lodash.find(fields, _field => reportingMonthRegex.test(_field.name));
|
|
5454
|
+
|
|
5455
|
+
/**
|
|
5456
|
+
* We can have several common fields, so we should ignore deleting during fillData
|
|
5457
|
+
* */
|
|
5458
|
+
const commonFieldsId = [scenarioField && scenarioField.id];
|
|
5459
|
+
const filterFields = fillData(filters, commonFieldsId);
|
|
5460
|
+
const valueFields = fillData(storedAggFields, commonFieldsId);
|
|
5461
|
+
const dateFields = fillData(storedDateFields, commonFieldsId);
|
|
5462
|
+
const dataTypeFields = fillData(storedDataTypeFields, commonFieldsId);
|
|
5463
|
+
const dataSeriesFields = fillData(storedGroupByFields, commonFieldsId);
|
|
5464
|
+
|
|
5465
|
+
lodash.remove(fields, _field => lodash.includes(commonFieldsId, _field.id));
|
|
5158
5466
|
|
|
5159
5467
|
calcModelOptions.pivot = {
|
|
5160
5468
|
fieldsArray: fields,
|
|
5161
5469
|
selectedFieldsArray: dataSeriesFields,
|
|
5162
5470
|
filtersArray: filterFields,
|
|
5163
5471
|
scenarioField,
|
|
5472
|
+
reportingMonthField: reportingMonthFieldWithAlias || reportingMonthFieldWithName,
|
|
5164
5473
|
dateFields,
|
|
5165
5474
|
dataTypeFields,
|
|
5166
5475
|
valueFields
|
|
@@ -6749,16 +7058,16 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
6749
7058
|
value_name: 'name',
|
|
6750
7059
|
element_label: 'Name',
|
|
6751
7060
|
default_value: '_Variance'
|
|
6752
|
-
}, {
|
|
6753
|
-
element_type: 'input',
|
|
6754
|
-
value_name: 'formula',
|
|
6755
|
-
element_label: 'Formula',
|
|
6756
|
-
default_value: 'x2-x1'
|
|
6757
7061
|
}, {
|
|
6758
7062
|
element_type: 'input',
|
|
6759
|
-
value_name: '
|
|
6760
|
-
element_label: '
|
|
6761
|
-
default_value: ''
|
|
7063
|
+
value_name: 'formula',
|
|
7064
|
+
element_label: 'Formula',
|
|
7065
|
+
default_value: 'x2-x1'
|
|
7066
|
+
}, {
|
|
7067
|
+
element_type: 'input',
|
|
7068
|
+
value_name: 'color',
|
|
7069
|
+
element_label: 'Color',
|
|
7070
|
+
default_value: ''
|
|
6762
7071
|
}, {
|
|
6763
7072
|
element_type: 'radio',
|
|
6764
7073
|
value_name: 'chart',
|
|
@@ -6882,6 +7191,16 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
6882
7191
|
legendTooltipTitle: 'Drag one field to further configure your x-axis.',
|
|
6883
7192
|
legendTooltipDescription: 'The breakdown subdivides the chart by a category field for further analysis of what’s contributing to the increase or decrease.',
|
|
6884
7193
|
},
|
|
7194
|
+
[highchartsRenderer.CHART_TYPES.WATERFALL_WALKTHROUGH]: {
|
|
7195
|
+
name: 'Waterfall Walkthrough Chart ',
|
|
7196
|
+
label: 'Waterfall Walkthrough Chart ',
|
|
7197
|
+
title: 'TODO: add text',
|
|
7198
|
+
description: 'TODO: add text',
|
|
7199
|
+
axisName: 'Category',
|
|
7200
|
+
startedMessage: 'TODO: add text',
|
|
7201
|
+
axisTooltipTitle: 'TODO: add text',
|
|
7202
|
+
legendTooltipTitle: 'TODO: add text',
|
|
7203
|
+
},
|
|
6885
7204
|
'combo-chart': {
|
|
6886
7205
|
name: 'Combo Chart ',
|
|
6887
7206
|
label: 'Combo Chart ',
|
|
@@ -7537,6 +7856,24 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
7537
7856
|
highchartsRenderer.suboptions["legends"],
|
|
7538
7857
|
]
|
|
7539
7858
|
},
|
|
7859
|
+
{
|
|
7860
|
+
type: highchartsRenderer.CHART_TYPES.WATERFALL_WALKTHROUGH,
|
|
7861
|
+
name: highchartsRenderer.chartsTypesInfo[highchartsRenderer.CHART_TYPES.WATERFALL_WALKTHROUGH].name,
|
|
7862
|
+
class: 'google-visualization-charteditor-thumbs-columnchart',
|
|
7863
|
+
render: highchartsRenderer.ptRenderWaterfallWalkthrough,
|
|
7864
|
+
suboptions: [
|
|
7865
|
+
highchartsRenderer.suboptions["axisX"],
|
|
7866
|
+
highchartsRenderer.suboptions["tooltips"],
|
|
7867
|
+
highchartsRenderer.suboptions["label"],
|
|
7868
|
+
highchartsRenderer.suboptions["subtitle"],
|
|
7869
|
+
highchartsRenderer.suboptions["widget_library"],
|
|
7870
|
+
highchartsRenderer.suboptions["chart"],
|
|
7871
|
+
highchartsRenderer.suboptions["negative_number_format"],
|
|
7872
|
+
highchartsRenderer.suboptions["advanced"],
|
|
7873
|
+
highchartsRenderer.suboptions["legends"],
|
|
7874
|
+
],
|
|
7875
|
+
hidden: true,
|
|
7876
|
+
},
|
|
7540
7877
|
]
|
|
7541
7878
|
},
|
|
7542
7879
|
];
|
|
@@ -8281,7 +8618,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
8281
8618
|
var data = res;
|
|
8282
8619
|
|
|
8283
8620
|
lodash.forEach(datesFields, function (row) {
|
|
8284
|
-
row.val_not_convert = highchartsRenderer.
|
|
8621
|
+
row.val_not_convert = highchartsRenderer.check_values_not_for_convert(widget, row.name);
|
|
8285
8622
|
});
|
|
8286
8623
|
|
|
8287
8624
|
if (datesFields.length > 0) {
|
|
@@ -8687,14 +9024,14 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
|
|
|
8687
9024
|
return rightPosition;
|
|
8688
9025
|
case 'none':
|
|
8689
9026
|
return none;
|
|
9027
|
+
}
|
|
9028
|
+
} else if (isLine) {
|
|
9029
|
+
return useNewUx ? leftPosition : rightPosition;
|
|
9030
|
+
} else if (isPie) {
|
|
9031
|
+
return useNewUx ? rightPosition : topPosition;
|
|
8690
9032
|
}
|
|
8691
|
-
} else if (isLine) {
|
|
8692
|
-
return useNewUx ? leftPosition : rightPosition;
|
|
8693
|
-
} else if (isPie) {
|
|
8694
|
-
return useNewUx ? rightPosition : topPosition;
|
|
8695
|
-
}
|
|
8696
9033
|
|
|
8697
|
-
|
|
9034
|
+
return useNewUx ? topPosition : bottomPosition;
|
|
8698
9035
|
}
|
|
8699
9036
|
|
|
8700
9037
|
highchartsRenderer.setYAxisMinMax = function (yAxis, axisYOptions) {
|