@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@datarailsshared/dr_renderer",
3
- "version": "1.2.236",
3
+ "version": "1.2.237",
4
4
  "description": "DataRails charts and tables renderer",
5
5
  "keywords": [
6
6
  "datarails",
@@ -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
- var cols = this.key;
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;">${ cols }${ isWaterfallBreakdown ? ': ' : ' ' }</span>`;
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
- if (widget && widget.chart_type === highchartsRenderer.CHART_TYPES.WATERFALL_BREAKDOWN) {
4351
- const breakdownSettings = widget.options.breakdown_options.settings;
4352
- const maxCategories = breakdownSettings.maxCategoriesCount;
4353
- const minCategories = breakdownSettings.minCategoriesCount;
4354
- const uniqueCategories = lodash.filter(
4355
- lodash.uniq(
4356
- lodash.map(rowData, row => row[widget.cols[0].name])
4357
- ),
4358
- value => !!value
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.check_value_not_for_convert = function (currentgraph, field_name) {
4612
- let val_not_convert = null;
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
- val_not_convert = delta_options.name;
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
- val_not_convert = delta_options.name;
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 val_not_convert;
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, val_not_for_convert) {
4644
- if (val_not_for_convert && val_not_for_convert == value) {
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 filterFields = [];
5111
- const valueFields = [];
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', undefined)].filter(f => !!f);
5150
- const storedAggFields = [lodash.get(calcModelOptions, 'config.agg_field', undefined)].filter(f => !!f);
5151
- const storedDataTypeFields = [lodash.get(calcModelOptions, 'config.data_type_field', undefined)].filter(f => !!f);
5152
-
5153
- fillData(storedGroupByFields, dataSeriesFields);
5154
- fillData(storedDateFields, dateFields);
5155
- fillData(storedAggFields, valueFields);
5156
- fillData(storedDataTypeFields, dataTypeFields);
5157
- fillData(filters, filterFields);
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: 'color',
6760
- element_label: 'Color',
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.check_value_not_for_convert(widget, row.name);
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
- return useNewUx ? topPosition : bottomPosition;
9034
+ return useNewUx ? topPosition : bottomPosition;
8698
9035
  }
8699
9036
 
8700
9037
  highchartsRenderer.setYAxisMinMax = function (yAxis, axisYOptions) {