@datarailsshared/dr_renderer 1.2.228-rocket → 1.2.229-dragons

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.
@@ -31,6 +31,12 @@ jobs:
31
31
  - run:
32
32
  name: Authenticate with registry
33
33
  command: echo "//registry.npmjs.org/:_authToken=$npm_TOKEN" > ~/repo/.npmrc
34
+ - run:
35
+ name: Install dependencies
36
+ command: npm install
37
+ - run:
38
+ name: Run npm test
39
+ command: npm test
34
40
  - run:
35
41
  name: Publish package
36
42
  command: npm publish . --access=public
@@ -0,0 +1,3 @@
1
+ module.exports = {
2
+ presets: [['@babel/preset-env', {targets: {node: 'current'}}]],
3
+ };
package/jest.config.js ADDED
@@ -0,0 +1,27 @@
1
+ module.exports = {
2
+ clearMocks: true,
3
+ setupFilesAfterEnv: ['regenerator-runtime/runtime'],
4
+ testPathIgnorePatterns: [
5
+ "/node_modules/",
6
+ ],
7
+ transformIgnorePatterns: [
8
+ "<rootDir>/node_modules/(?!jquery|lodash|moment/)",
9
+ ],
10
+ collectCoverage: true,
11
+ collectCoverageFrom: [
12
+ '**/*.js',
13
+ '!**/*.config.js',
14
+ '!**/build/**',
15
+ '!**/coverage/**',
16
+ '!**/node_modules/**',
17
+ '!**/vendor/**'
18
+ ],
19
+ // coverageThreshold: {
20
+ // "global": {
21
+ // "branches": 100,
22
+ // "functions": 100,
23
+ // "lines": 100,
24
+ // "statements": 100
25
+ // }
26
+ // },
27
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@datarailsshared/dr_renderer",
3
- "version": "1.2.228-rocket",
3
+ "version": "1.2.229-dragons",
4
4
  "description": "DataRails charts and tables renderer",
5
5
  "keywords": [
6
6
  "datarails",
@@ -9,7 +9,8 @@
9
9
  "tables"
10
10
  ],
11
11
  "scripts": {
12
- "login": "npm login"
12
+ "login": "npm login",
13
+ "test": "jest --coverage"
13
14
  },
14
15
  "author": "Sergey Spivakov",
15
16
  "repository": {
@@ -17,6 +18,21 @@
17
18
  "url": "git+https://bitbucket.org/datarails/dr_renderer.git"
18
19
  },
19
20
  "license": "",
21
+ "dependencies": {
22
+ "jquery": "^3.6.0",
23
+ "lodash": "^4.17.20",
24
+ "regenerator-runtime": "^0.13.5"
25
+ },
26
+ "devDependencies": {
27
+ "@babel/core": "^7.20.12",
28
+ "@babel/preset-env": "^7.20.2",
29
+ "@testing-library/dom": "^7.2.1",
30
+ "@testing-library/jest-dom": "^5.5.0",
31
+ "babel-jest": "^25.5.1",
32
+ "jest": "^25.3.0",
33
+ "moment": "^2.29.1",
34
+ "serve": "^11.3.0"
35
+ },
20
36
  "bugs": {
21
37
  "url": ""
22
38
  },
@@ -24,5 +40,10 @@
24
40
  "whitelistedNonPeerDependencies": [],
25
41
  "main": "src/index.js",
26
42
  "module": "src/index.js",
27
- "sideEffects": false
43
+ "sideEffects": false,
44
+ "jest": {
45
+ "setupFiles": [
46
+ "./setup-jest.js"
47
+ ]
48
+ }
28
49
  }
@@ -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
  };
@@ -25,6 +26,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
25
26
  const textColor = "#151a41";
26
27
  const chartLabelColor = "#cfd7dd";
27
28
  const HIGHCHARTS_FONT_FAMILY = 'Poppins';
29
+ let firstBarColor = null;
28
30
 
29
31
  if(!Highcharts){
30
32
  Highcharts = {
@@ -82,6 +84,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
82
84
  KPI_WIDGET: 'kpi-widget',
83
85
  TEXT_WIDGET: 'text-widget',
84
86
  WATERFALL_BREAKDOWN: 'waterfall-chart-breakdown',
87
+ WATERFALL_WALKTHROUGH: 'waterfall-chart-walkthrough',
85
88
  PUBLISHED_ITEM: 'published_item',
86
89
  RICH_TEXT: 'rich_text',
87
90
  EXCEL_VIEWER: 'excel_viewer',
@@ -466,7 +469,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
466
469
  highchartsRenderer.getOthersName(opts) :
467
470
  undefined;
468
471
  var drOthersInColumn = lodash.find(
469
- pivotData.getColKeys(),
472
+ pivotData.getColKeys(),
470
473
  keys => keys.length && (lodash.includes(keys, 'DR_Others') || lodash.includes(keys, othersName))
471
474
  );
472
475
 
@@ -486,7 +489,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
486
489
  rows = [];
487
490
  }
488
491
 
489
- var cols = this.key;
492
+ var cols = lodash.get(this, 'point.options.colsForTotal') || this.key;
490
493
  if (typeof (cols) == 'object' && cols.name) {
491
494
  cols = cols.name;
492
495
  }
@@ -494,7 +497,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
494
497
  if (!cols && is_drill_down_pie) {
495
498
  cols = this.point.name;
496
499
  }
497
-
500
+
498
501
  if (drOthersInColumn) {
499
502
  if (!lodash.isArray(cols) && othersName === cols) {
500
503
  cols = ['DR_Others'];
@@ -619,7 +622,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
619
622
 
620
623
  var func = function () {
621
624
  const isWaterfallBreakdown = this.series.options.className === SERIES_CLASSNAMES.WATERFALL_BREAKDOWN;
622
-
625
+ const isWaterfallWalkthrough = this.series.options.className === SERIES_CLASSNAMES.WATERFALL_WALKTHROUGH;
623
626
  var y = parseFloat(this.y);
624
627
  if (pivotData) {
625
628
  let series_name = (this.series.name || '') + "";
@@ -632,7 +635,8 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
632
635
  || this.series.options.className === 'trendSeries') {
633
636
  rows = [];
634
637
  }
635
- var cols = this.key;
638
+
639
+ var cols = lodash.get(this, 'point.options.colsForTotal') || this.key;
636
640
  if (!cols && is_drill_down_pie) {
637
641
  cols = this.name;
638
642
  }
@@ -647,7 +651,9 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
647
651
  if (variant_name && rows && rows[0] && variant_name == rows[0]) {
648
652
  rows[0] = variant_name_default_name;
649
653
  }
650
-
654
+ if (isWaterfallWalkthrough) {
655
+ cols = [this.key]
656
+ }
651
657
  try {
652
658
  if (is_drill_down_pie && !highchartsRenderer.selfStartsWith(series_name,"Series ")) {
653
659
  let temp = cols;
@@ -655,7 +661,9 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
655
661
  rows = temp;
656
662
  }
657
663
 
658
- var category_text = `<span style="font-weight: bold;">${ cols }${ isWaterfallBreakdown ? ': ' : ' ' }</span>`;
664
+ var category_text = `<span style="font-weight: bold;">
665
+ ${ lodash.get(this, 'point.options.colsForTotal') ? cols[0] : cols } ${ isWaterfallBreakdown ? ': ' : ' ' }
666
+ </span>`;
659
667
  if (this.category) {
660
668
  category_text = '';
661
669
  }
@@ -672,7 +680,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
672
680
  const modifiedRowsAndCols = highchartsRenderer.transformRowsAndColsForBreakdown(rows, cols, this.point, opts);
673
681
  rows = modifiedRowsAndCols.rows;
674
682
  cols = modifiedRowsAndCols.cols;
675
- }
683
+ }
676
684
 
677
685
  var aggr = pivotData.getAggregator(rows, cols);
678
686
 
@@ -1414,6 +1422,89 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
1414
1422
  return chart_series;
1415
1423
  }
1416
1424
 
1425
+ highchartsRenderer.ptCreateWaterfallWalkthroughSeries = function (pivotData, onlyNumbers, additionOptions, opts) {
1426
+ const waterfallOptions = opts.walkthrough_options;
1427
+ const chart_series = [];
1428
+ let resultObject = {
1429
+ data: [],
1430
+ dataLabels: {
1431
+ allowOverlap: additionOptions && additionOptions.label ? additionOptions.label.overlap : false,
1432
+ enabled: additionOptions && additionOptions.label ? additionOptions.label.show : true,
1433
+ formatter: highchartsRenderer.defaultDataLabelFormatter(pivotData, {'chartOptions': additionOptions, total_value_options: opts.total_value_options}),
1434
+ style: highchartsRenderer.getDataLabelsStyle(additionOptions),
1435
+ },
1436
+ upColor: waterfallOptions.colors.increase,
1437
+ color: waterfallOptions.colors.decrease,
1438
+ className: SERIES_CLASSNAMES.WATERFALL_WALKTHROUGH
1439
+ };
1440
+ resultObject = highchartsRenderer.getDataLabelsOptions(additionOptions, resultObject);
1441
+ lodash.forEach(waterfallOptions.values.walkthrough, function(value, index) {
1442
+
1443
+ let keys = [];
1444
+ if (value.trend === 'total') {
1445
+ keys = ['Total'];
1446
+ } else {
1447
+ _.forEach(value.key, (item) => {
1448
+ const findKeyByValue = Object.keys(pivotData.dateValuesDictionary || {}).find(key => pivotData.dateValuesDictionary[key] === item);
1449
+ keys.push(findKeyByValue ? findKeyByValue : item);
1450
+ })
1451
+ }
1452
+
1453
+ const agg = pivotData.getAggregator([], keys);
1454
+ let val = agg.value();
1455
+
1456
+ if (val != null && $.isNumeric(val)) {
1457
+ val = parseFloat(val);
1458
+ } else if (onlyNumbers) {
1459
+ val = NaN;
1460
+ } else {
1461
+ val = 0;
1462
+ }
1463
+
1464
+ if (value.trend === 'decrease') {
1465
+ val = val * -1;
1466
+ }
1467
+
1468
+ const name = value.trend === 'total' ? value.formattedKey || value.key[0] : keys.join(highchartsRenderer.delimer);
1469
+ let color = '';
1470
+ if (value.trend !== 'total') {
1471
+ if (index === 0 && !firstBarColor) {
1472
+ color = waterfallOptions.colors.total;
1473
+ firstBarColor = waterfallOptions.colors.total;
1474
+ } else {
1475
+ color = value.color
1476
+ }
1477
+ } else {
1478
+ color = waterfallOptions.colors.total;
1479
+ }
1480
+
1481
+ resultObject.data.push({
1482
+ y: val,
1483
+ name: lodash.unescape(name).replace('DR_Others', highchartsRenderer.getOthersName(opts)),
1484
+ isSum: value.trend === 'total',
1485
+ isTotal: value.trend === 'total',
1486
+ color,
1487
+ colsForTotal: value.trend === 'total' ? keys : null,
1488
+ });
1489
+ });
1490
+ chart_series.push(resultObject);
1491
+ chart_series.push(
1492
+ {
1493
+ name: 'Positive',
1494
+ visible: false,
1495
+ color: waterfallOptions.colors.increase
1496
+ });
1497
+
1498
+ chart_series.push(
1499
+ {
1500
+ name: 'Negative',
1501
+ visible: false,
1502
+ color: waterfallOptions.colors.decrease
1503
+ });
1504
+
1505
+ return chart_series;
1506
+ }
1507
+
1417
1508
  highchartsRenderer.setChartTypeBySeriesType = function (type, series) {
1418
1509
  const types = {
1419
1510
  'line-chart': 'line',
@@ -1617,7 +1708,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
1617
1708
  highchartsRenderer.getDataLabelsStylesForDrillDown = function(additionOptions) {
1618
1709
  let result = highchartsRenderer.getDataLabelsOptions(additionOptions, { dataLabels: {} });
1619
1710
 
1620
- if (!result.dataLabels) return {};
1711
+ if (!result.dataLabels) return {};
1621
1712
  return {
1622
1713
  activeDataLabelStyle: {
1623
1714
  color: result.dataLabels.color,
@@ -3173,7 +3264,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
3173
3264
 
3174
3265
  highchartsRenderer.ptRenderWaterfallBreakdown = function (pivotData, opts, drilldownFunc, chartType) {
3175
3266
  let chartOptions = {};
3176
- const additionOptions = opts.chartOptions
3267
+ const additionOptions = opts.chartOptions
3177
3268
  ? opts.chartOptions
3178
3269
  : highchartsRenderer.getDefaultValueForChart(highchartsRenderer.CHART_TYPES.WATERFALL_BREAKDOWN);
3179
3270
 
@@ -3272,6 +3363,121 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
3272
3363
  return highchartsRenderer.ptCreateElementAndDraw(chartOptions, opts);
3273
3364
  };
3274
3365
 
3366
+ highchartsRenderer.ptRenderWaterfallWalkthrough = function (pivotData, opts) {
3367
+ let chartOptions = {};
3368
+ const waterfallOptions = opts?.walkthrough_options;
3369
+ const additionOptions = opts.chartOptions
3370
+ ? opts.chartOptions
3371
+ : highchartsRenderer.getDefaultValueForChart(highchartsRenderer.CHART_TYPES.WATERFALL_WALKTHROUGH);
3372
+
3373
+ chartOptions.chart = {
3374
+ type: 'waterfall',
3375
+ zoomType: additionOptions && additionOptions.chart && additionOptions.chart.zoom_type ? additionOptions.chart.zoom_type : 'None',
3376
+ };
3377
+ if (disableAnimation) {
3378
+ chartOptions.chart.animation = false;
3379
+ }
3380
+
3381
+ chartOptions.xAxis = {
3382
+ type: 'category',
3383
+ crosshair: true,
3384
+ min: 0,
3385
+ title: {
3386
+ text : additionOptions && additionOptions.axisX ? additionOptions.axisX.name : '',
3387
+ },
3388
+ uniqueNames: false,
3389
+ };
3390
+
3391
+ highchartsRenderer.setTitleAndSubTitle(chartOptions, opts, additionOptions);
3392
+
3393
+ chartOptions.yAxis = {
3394
+ min: null,
3395
+ max: null,
3396
+ title: {
3397
+ text: additionOptions && additionOptions.axisY ? additionOptions.axisY.name : '',
3398
+ autoylabel: additionOptions && additionOptions.axisY ? additionOptions.axisY.autoylabel : ''
3399
+ },
3400
+ labels: {
3401
+ formatter: highchartsRenderer.defaultValueLabelsFormatter(pivotData, opts)
3402
+ },
3403
+ };
3404
+ if (additionOptions) {
3405
+ highchartsRenderer.setYAxisMinMax(chartOptions.yAxis, additionOptions.axisY);
3406
+ }
3407
+
3408
+ chartOptions.tooltip = {
3409
+ formatter: highchartsRenderer.defaultFormatterToTooltip(pivotData, opts),
3410
+ valueDecimals: 2,
3411
+ };
3412
+
3413
+ highchartsRenderer.handleGridLines(additionOptions, chartOptions);
3414
+
3415
+ if (lodash.get(opts, 'paletteOptions.widgetPalette', null)) {
3416
+ const mc_palette = lodash.find(lodash.get(opts.paletteOptions, 'monochromePalettes', []), { selected: true });
3417
+ chartOptions.colors = mc_palette ? mc_palette.colors : opts.paletteOptions.widgetPalette;
3418
+ } else if (lodash.get(opts, 'paletteOptions.dashboardPalette.colors', null)) {
3419
+ chartOptions.colors = opts.paletteOptions.dashboardPalette.colors;
3420
+ }
3421
+ chartOptions.series = highchartsRenderer
3422
+ .ptCreateWaterfallWalkthroughSeries(pivotData, null, additionOptions, opts);
3423
+
3424
+ chartOptions = highchartsRenderer.prepareAxisX(chartOptions, additionOptions, pivotData.getColKeys());
3425
+ chartOptions.plotOptions = {
3426
+ waterfall: {
3427
+ pointPadding: 0.2,
3428
+ borderWidth: 0,
3429
+ borderRadius: 1,
3430
+ lineWidth: 0,
3431
+ },
3432
+ series: {
3433
+ animation: !disableAnimation,
3434
+ cropThreshold: 1000,
3435
+ dataLabels: {
3436
+ allowOverlap: additionOptions && additionOptions.label ? additionOptions.label.overlap : false,
3437
+ enabled: additionOptions && additionOptions.label ? additionOptions.label.show : true,
3438
+ formatter: highchartsRenderer.defaultDataLabelFormatter(pivotData, opts),
3439
+ style: highchartsRenderer.getDataLabelsStyle(additionOptions),
3440
+ inside: false
3441
+ },
3442
+ events: {
3443
+ legendItemClick: () => {
3444
+ return false;
3445
+ }
3446
+ }
3447
+ }
3448
+ };
3449
+
3450
+ if (opts.drillDownListFunc) {
3451
+ chartOptions.plotOptions.series.cursor = 'pointer';
3452
+ chartOptions.plotOptions.series.point = {
3453
+ events: {
3454
+ click: opts.drillDownListFunc
3455
+ }
3456
+ };
3457
+ }
3458
+ if (waterfallOptions.colors) {
3459
+ chartOptions.legend = highchartsRenderer.getOptionsForLegends(additionOptions, 3, false);
3460
+ chartOptions.legend.useHTML = true;
3461
+ chartOptions.legend.labelFormatter = function() {
3462
+ const name = this.options.className ? 'Total': this.name;
3463
+ const findTotal = _.find(this.options.data, {isTotal: true});
3464
+ const color = findTotal?.color ? findTotal.color : this.color;
3465
+ 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>';
3466
+ }
3467
+
3468
+ chartOptions.legend.symbolPadding = 0;
3469
+ chartOptions.legend.symbolWidth = 0;
3470
+ chartOptions.legend.symbolHeight = 0;
3471
+ chartOptions.legend.squareSymbol = false;
3472
+ } else {
3473
+ chartOptions.legend = {
3474
+ enabled: false
3475
+ }
3476
+ }
3477
+
3478
+ return highchartsRenderer.ptCreateElementAndDraw(chartOptions, opts);
3479
+ }
3480
+
3275
3481
  highchartsRenderer.formatFieldValue = function (field, value) {
3276
3482
  let currentType = '';
3277
3483
  let format = field.format;
@@ -4340,6 +4546,17 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
4340
4546
  }
4341
4547
  };
4342
4548
 
4549
+ highchartsRenderer.waterfallConstants = {
4550
+ [highchartsRenderer.CHART_TYPES.WATERFALL_BREAKDOWN]: {
4551
+ minCategoriesCount: 2,
4552
+ maxCategoriesCount: 5,
4553
+ },
4554
+ [highchartsRenderer.CHART_TYPES.WATERFALL_WALKTHROUGH]: {
4555
+ minCategoriesCount: 2,
4556
+ maxCategoriesCount: 10,
4557
+ }
4558
+ };
4559
+
4343
4560
  highchartsRenderer.rhPivotView = function (rowData, options, isTable = false, widget = null) {
4344
4561
  if (!rowData || !rowData) {
4345
4562
  if (options.onlyOptions) {
@@ -4348,10 +4565,15 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
4348
4565
  return null;
4349
4566
  }
4350
4567
 
4351
- if (widget && widget.chart_type === highchartsRenderer.CHART_TYPES.WATERFALL_BREAKDOWN) {
4352
- const breakdownSettings = widget.options.breakdown_options.settings;
4353
- const maxCategories = breakdownSettings.maxCategoriesCount;
4354
- const minCategories = breakdownSettings.minCategoriesCount;
4568
+ const isWaterfall = widget
4569
+ && (
4570
+ widget.chart_type === highchartsRenderer.CHART_TYPES.WATERFALL_BREAKDOWN
4571
+ || widget.chart_type === highchartsRenderer.CHART_TYPES.WATERFALL_WALKTHROUGH
4572
+ );
4573
+
4574
+ if (isWaterfall) {
4575
+ const maxCategories = highchartsRenderer.waterfallConstants[widget.chart_type].maxCategoriesCount;
4576
+ const minCategories = highchartsRenderer.waterfallConstants[widget.chart_type].minCategoriesCount;
4355
4577
  const uniqueCategories = lodash.filter(
4356
4578
  lodash.uniq(
4357
4579
  lodash.map(rowData, row => row[widget.cols[0].name])
@@ -4361,6 +4583,8 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
4361
4583
 
4362
4584
  if (uniqueCategories && (uniqueCategories.length > maxCategories || uniqueCategories.length < minCategories )) {
4363
4585
  options.error_has_occurred = true;
4586
+ const isDateField = widget.cols[0].type === 'Date';
4587
+ const commonMessagePart = `This chart support a selection of ${minCategories}-${maxCategories} items from the category section. `;
4364
4588
  options.error_params = {
4365
4589
  title: 'Data Conflict',
4366
4590
  text: `Please adjust your dashboard's reference date and filter selections as \
@@ -4609,19 +4833,25 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
4609
4833
  return highchartsRenderer.getWeekNumber(dateObj);
4610
4834
  };
4611
4835
 
4612
- highchartsRenderer.check_value_not_for_convert = function (currentgraph, field_name) {
4613
- let val_not_convert = null;
4836
+ highchartsRenderer.check_values_not_for_convert = function (currentgraph, field_name) {
4837
+ let vals_not_convert = [];
4614
4838
  if (lodash.has(currentgraph, "options.chartOptions.delta_column") && currentgraph.options.chartOptions.delta_column) {
4615
4839
  let delta_options = currentgraph.options.chartOptions.delta_column;
4616
4840
  if (delta_options.field == 'series' && currentgraph.rows && currentgraph.rows[0] &&
4617
4841
  currentgraph.rows[0].name == field_name) {
4618
- val_not_convert = delta_options.name;
4842
+ vals_not_convert = [delta_options.name];
4619
4843
  } else if (delta_options.field == 'category' && currentgraph.rows && currentgraph.cols[0] &&
4620
4844
  currentgraph.cols[0].name == field_name) {
4621
- val_not_convert = delta_options.name;
4845
+ vals_not_convert = [delta_options.name];
4622
4846
  }
4847
+ } else if (currentgraph.chart_type === highchartsRenderer.CHART_TYPES.WATERFALL_WALKTHROUGH) {
4848
+ lodash.forEach(currentgraph.options.walkthrough_options.values.walkthrough, value => {
4849
+ if (value.trend === 'total') {
4850
+ vals_not_convert.push(value.key[0]);
4851
+ }
4852
+ });
4623
4853
  }
4624
- return val_not_convert;
4854
+ return vals_not_convert;
4625
4855
  };
4626
4856
 
4627
4857
  highchartsRenderer.updateFiltersShowNames = function (filters) {
@@ -4641,8 +4871,8 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
4641
4871
  })
4642
4872
  };
4643
4873
 
4644
- highchartsRenderer.returnRawDataValue = function (type, value, format, field_name, val_not_for_convert) {
4645
- if (val_not_for_convert && val_not_for_convert == value) {
4874
+ highchartsRenderer.returnRawDataValue = function (type, value, format, field_name, vals_not_for_convert) {
4875
+ if (vals_not_for_convert && vals_not_for_convert.length && lodash.includes(vals_not_for_convert, value)) {
4646
4876
  return value;
4647
4877
  }
4648
4878
 
@@ -4738,7 +4968,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
4738
4968
  };
4739
4969
 
4740
4970
  highchartsRenderer.isSystemField = function (field) {
4741
- var regex = new RegExp("^(Calc_Model_Name|Calc_Model_ID|Parent_Name|Parent_Id|FileBox_ID|FileBox_Name|DataMapper_Name|Doc_ID|Doc_version|Label|Submission_Date|User|table_id|Latest_In_Dim|Tab_name|CP_Name|DT_.+|VT_.+|System_.+)$", "m");
4971
+ var regex = new RegExp("^(Parent_Name|Parent_Id|FileBox_ID|FileBox_Name|DataMapper_Name|Doc_ID|Doc_version|Label|Submission_Date|User|table_id|Latest_In_Dim|Tab_name|CP_Name|DT_.+|VT_.+|System_.+)$", "m");
4742
4972
 
4743
4973
  return (field.category && field.category.includes("")) || regex.test(field.name)
4744
4974
  };
@@ -5101,55 +5331,34 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
5101
5331
 
5102
5332
  highchartsRenderer.addTemplateDataToCalcModel = function (selectedTemplate, calcModelOptions) {
5103
5333
  highchartsRenderer.setWidgetFieldsToTemplate(selectedTemplate);
5334
+
5335
+ const scenarioName = 'scenario';
5104
5336
  const fields = highchartsRenderer.objectCopyJsonMethod(selectedTemplate.fields);
5105
- const filters = (calcModelOptions.config && calcModelOptions.config.filters) || [];
5337
+ const fieldScenarioAlias = _.find(fields, field => (field.alias || '').toLowerCase() === scenarioName)
5338
+ const fieldScenario = _.find(fields, field => (field.name || '').toLowerCase() === scenarioName)
5339
+ const filters = calcModelOptions.config && calcModelOptions.config.filters;
5340
+
5341
+ const filterFields = [];
5342
+ const valueFields = [];
5343
+ const dateFields = [];
5344
+ const dataTypeFields = [];
5345
+ const dataSeriesFields = [];
5346
+
5347
+ let scenarioField = lodash.get(calcModelOptions, 'config.scenario', undefined) || fieldScenarioAlias || fieldScenario;
5348
+ let fieldOb;
5106
5349
 
5107
- const fillData = (fieldsArr) => {
5108
- const destinationArr = [];
5350
+ const fillData = (fieldsArr, destinationArr) => {
5109
5351
  lodash.forEach(fieldsArr, function (valObj) {
5110
- const fieldOb = lodash.find(fields, { id: valObj.id });
5352
+ fieldOb = lodash.find(fields, { id: valObj.id });
5111
5353
  if (fieldOb) {
5112
5354
  destinationArr.push(fieldOb);
5113
5355
  lodash.remove(fields, { id: fieldOb.id });
5114
5356
  }
5115
5357
  });
5116
-
5117
- return destinationArr;
5118
- }
5119
-
5120
- const predefinedField = {
5121
- value: {
5122
- regex: /posting[_\s]?amount/i,
5123
- fieldWithAlias: undefined,
5124
- fieldWithName: undefined
5125
- },
5126
- dataType: {
5127
- regex: /data[_\s]?type/i,
5128
- fieldWithAlias: undefined,
5129
- fieldWithName: undefined
5130
- },
5131
- date: {
5132
- regex: /reporting[_\s]?month/i,
5133
- fieldWithAlias: undefined,
5134
- fieldWithName: undefined
5135
- },
5136
- filters: {
5137
- regex: /scenario/i,
5138
- fieldWithAlias: undefined,
5139
- fieldWithName: undefined
5140
- },
5141
- };
5142
-
5143
- for (const key in predefinedField) {
5144
- predefinedField[key].fieldWithAlias = _.find(fields, field => predefinedField[key].regex.test((field.alias || '').toLowerCase()));
5145
-
5146
- if (!predefinedField[key].fieldWithAlias) {
5147
- predefinedField[key].fieldWithName = _.find(fields, field => predefinedField[key].regex.test((field.name || '').toLowerCase()));
5148
- }
5149
5358
  }
5150
5359
 
5151
5360
  lodash.forEach(filters, function (filterObj) {
5152
- const fieldOb = lodash.find(fields, { id: filterObj.id });
5361
+ fieldOb = lodash.find(fields, { id: filterObj.id });
5153
5362
  if (!fieldOb) return;
5154
5363
 
5155
5364
  filterObj.values = filterObj.values && lodash.map(filterObj.values, highchartsRenderer.decodeFunc);
@@ -5168,16 +5377,15 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
5168
5377
  });
5169
5378
 
5170
5379
  const storedGroupByFields = lodash.get(calcModelOptions, 'config.group_by', []);
5171
- const storedDateFields = [lodash.get(calcModelOptions, 'config.date_field', predefinedField.date.fieldWithAlias || predefinedField.date.fieldWithName)].filter(f => !!f);
5172
- const storedAggFields = [lodash.get(calcModelOptions, 'config.agg_field', predefinedField.value.fieldWithAlias || predefinedField.value.fieldWithName)].filter(f => !!f);
5173
- const storedDataTypeFields = [lodash.get(calcModelOptions, 'config.data_type_field', predefinedField.dataType.fieldWithAlias || predefinedField.dataType.fieldWithName)].filter(f => !!f);
5174
- const scenarioField = lodash.get(calcModelOptions, 'config.scenario', predefinedField.filters.fieldWithAlias || predefinedField.filters.fieldWithName);
5380
+ const storedDateFields = [lodash.get(calcModelOptions, 'config.date_field', undefined)].filter(f => !!f);
5381
+ const storedAggFields = [lodash.get(calcModelOptions, 'config.agg_field', undefined)].filter(f => !!f);
5382
+ const storedDataTypeFields = [lodash.get(calcModelOptions, 'config.data_type_field', undefined)].filter(f => !!f);
5175
5383
 
5176
- const filterFields = fillData(filters);
5177
- const valueFields = fillData(storedAggFields);
5178
- const dateFields = fillData(storedDateFields);
5179
- const dataTypeFields = fillData(storedDataTypeFields);
5180
- const dataSeriesFields = fillData(storedGroupByFields);
5384
+ fillData(storedGroupByFields, dataSeriesFields);
5385
+ fillData(storedDateFields, dateFields);
5386
+ fillData(storedAggFields, valueFields);
5387
+ fillData(storedDataTypeFields, dataTypeFields);
5388
+ fillData(filters, filterFields);
5181
5389
 
5182
5390
  calcModelOptions.pivot = {
5183
5391
  fieldsArray: fields,
@@ -5685,7 +5893,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
5685
5893
  return valToReturn;
5686
5894
  };
5687
5895
 
5688
-
5896
+
5689
5897
  highchartsRenderer.getChartAxisLabel = function(type) {
5690
5898
  return highchartsRenderer.chartsTypesInfo[type] ? highchartsRenderer.chartsTypesInfo[type].axisName : CHART_AXIS_DEFAULT_LABEL;
5691
5899
  };
@@ -6520,7 +6728,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
6520
6728
  value_name: 'show',
6521
6729
  default_value: true,
6522
6730
  disabled_str: '!{var}.show_out_of_x_axis && !{var}.show_out_of_data_series && !{var}.show_value && !{var}.show_x_axis && !{var}.show_data_series',
6523
- disabled_fn: (value) => !value.show_out_of_x_axis
6731
+ disabled_fn: (value) => !value.show_out_of_x_axis
6524
6732
  && !value.show_out_of_data_series
6525
6733
  && !value.show_value
6526
6734
  && !value.show_x_axis
@@ -6561,8 +6769,8 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
6561
6769
  element_label: '[X Axis]',
6562
6770
  value_name: 'show_x_axis',
6563
6771
  default_value: true,
6564
- clickFn: (value) => value.show = value.show
6565
- ? value.show_out_of_x_axis || value.show_out_of_data_series || value.show_value || value.show_x_axis || value.show_data_series
6772
+ clickFn: (value) => value.show = value.show
6773
+ ? value.show_out_of_x_axis || value.show_out_of_data_series || value.show_value || value.show_x_axis || value.show_data_series
6566
6774
  : value.show,
6567
6775
  },
6568
6776
  {
@@ -6570,8 +6778,8 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
6570
6778
  element_label: '[Data Series]',
6571
6779
  value_name: 'show_data_series',
6572
6780
  default_value: true,
6573
- clickFn: (value) => value.show = value.show
6574
- ? value.show_out_of_x_axis || value.show_out_of_data_series || value.show_value || value.show_x_axis || value.show_data_series
6781
+ clickFn: (value) => value.show = value.show
6782
+ ? value.show_out_of_x_axis || value.show_out_of_data_series || value.show_value || value.show_x_axis || value.show_data_series
6575
6783
  : value.show,
6576
6784
  },
6577
6785
  {
@@ -6579,8 +6787,8 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
6579
6787
  element_label: 'Value',
6580
6788
  value_name: 'show_value',
6581
6789
  default_value: true,
6582
- clickFn: (value) => value.show = value.show
6583
- ? value.show_out_of_x_axis || value.show_out_of_data_series || value.show_value || value.show_x_axis || value.show_data_series
6790
+ clickFn: (value) => value.show = value.show
6791
+ ? value.show_out_of_x_axis || value.show_out_of_data_series || value.show_value || value.show_x_axis || value.show_data_series
6584
6792
  : value.show,
6585
6793
  },
6586
6794
  {
@@ -6588,8 +6796,8 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
6588
6796
  element_label: '% Out of [X Axis]',
6589
6797
  value_name: 'show_out_of_x_axis',
6590
6798
  default_value: false,
6591
- clickFn: (value) => value.show = value.show
6592
- ? value.show_out_of_x_axis || value.show_out_of_data_series || value.show_value || value.show_x_axis || value.show_data_series
6799
+ clickFn: (value) => value.show = value.show
6800
+ ? value.show_out_of_x_axis || value.show_out_of_data_series || value.show_value || value.show_x_axis || value.show_data_series
6593
6801
  : value.show,
6594
6802
  },
6595
6803
  {
@@ -6597,8 +6805,8 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
6597
6805
  element_label: '% Out of [Data Series]',
6598
6806
  value_name: 'show_out_of_data_series',
6599
6807
  default_value: false,
6600
- clickFn: (value) => value.show = value.show
6601
- ? value.show_out_of_x_axis || value.show_out_of_data_series || value.show_value || value.show_x_axis || value.show_data_series
6808
+ clickFn: (value) => value.show = value.show
6809
+ ? value.show_out_of_x_axis || value.show_out_of_data_series || value.show_value || value.show_x_axis || value.show_data_series
6602
6810
  : value.show,
6603
6811
  },
6604
6812
  ]
@@ -6772,16 +6980,16 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
6772
6980
  value_name: 'name',
6773
6981
  element_label: 'Name',
6774
6982
  default_value: '_Variance'
6775
- }, {
6776
- element_type: 'input',
6777
- value_name: 'formula',
6778
- element_label: 'Formula',
6779
- default_value: 'x2-x1'
6780
6983
  }, {
6781
6984
  element_type: 'input',
6782
- value_name: 'color',
6783
- element_label: 'Color',
6784
- default_value: ''
6985
+ value_name: 'formula',
6986
+ element_label: 'Formula',
6987
+ default_value: 'x2-x1'
6988
+ }, {
6989
+ element_type: 'input',
6990
+ value_name: 'color',
6991
+ element_label: 'Color',
6992
+ default_value: ''
6785
6993
  }, {
6786
6994
  element_type: 'radio',
6787
6995
  value_name: 'chart',
@@ -6904,7 +7112,17 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
6904
7112
  axisTooltipDescription: 'The category (usually an independent variable) is shown on the x-axis and should be between 2 to 5 total columns. ',
6905
7113
  legendTooltipTitle: 'Drag one field to further configure your x-axis.',
6906
7114
  legendTooltipDescription: 'The breakdown subdivides the chart by a category field for further analysis of what’s contributing to the increase or decrease.',
6907
- },
7115
+ },
7116
+ [highchartsRenderer.CHART_TYPES.WATERFALL_WALKTHROUGH]: {
7117
+ name: 'Waterfall Walkthrough Chart ',
7118
+ label: 'Waterfall Walkthrough Chart ',
7119
+ title: 'TODO: add text',
7120
+ description: 'TODO: add text',
7121
+ axisName: 'Category',
7122
+ startedMessage: 'TODO: add text',
7123
+ axisTooltipTitle: 'TODO: add text',
7124
+ legendTooltipTitle: 'TODO: add text',
7125
+ },
6908
7126
  'combo-chart': {
6909
7127
  name: 'Combo Chart ',
6910
7128
  label: 'Combo Chart ',
@@ -7560,6 +7778,24 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
7560
7778
  highchartsRenderer.suboptions["legends"],
7561
7779
  ]
7562
7780
  },
7781
+ {
7782
+ type: highchartsRenderer.CHART_TYPES.WATERFALL_WALKTHROUGH,
7783
+ name: highchartsRenderer.chartsTypesInfo[highchartsRenderer.CHART_TYPES.WATERFALL_WALKTHROUGH].name,
7784
+ class: 'google-visualization-charteditor-thumbs-columnchart',
7785
+ render: highchartsRenderer.ptRenderWaterfallWalkthrough,
7786
+ suboptions: [
7787
+ highchartsRenderer.suboptions["axisX"],
7788
+ highchartsRenderer.suboptions["tooltips"],
7789
+ highchartsRenderer.suboptions["label"],
7790
+ highchartsRenderer.suboptions["subtitle"],
7791
+ highchartsRenderer.suboptions["widget_library"],
7792
+ highchartsRenderer.suboptions["chart"],
7793
+ highchartsRenderer.suboptions["negative_number_format"],
7794
+ highchartsRenderer.suboptions["advanced"],
7795
+ highchartsRenderer.suboptions["legends"],
7796
+ ],
7797
+ hidden: true,
7798
+ },
7563
7799
  ]
7564
7800
  },
7565
7801
  ];
@@ -7716,7 +7952,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
7716
7952
  _.forEach(Object.keys(dates), key => {
7717
7953
  const dateConfiguration = dates[key];
7718
7954
  const timestamp = dateConfiguration.timestamp;
7719
- if (timestamp) {
7955
+ if (timestamp) {
7720
7956
  const dateTzOffsetInSeconds = new Date(timestamp * 1000).getTimezoneOffset() * 60;
7721
7957
  dateConfiguration.displayedValue = new Date((timestamp + dateTzOffsetInSeconds) * 1000)
7722
7958
  .toLocaleDateString();
@@ -8015,7 +8251,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
8015
8251
  if (!(format && highchartsRenderer.isDateFormat(dateString, format) || highchartsRenderer.isDate(dateString))) {
8016
8252
  return null;
8017
8253
  }
8018
- const utcDate = format
8254
+ const utcDate = format
8019
8255
  ? moment_lib.utc(dateString, format, true)
8020
8256
  : moment_lib.utc(dateString);
8021
8257
  return utcDate.startOf('day').unix();
@@ -8033,7 +8269,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
8033
8269
  }
8034
8270
 
8035
8271
  let filters = [];
8036
-
8272
+
8037
8273
  if (widget.chart_type === highchartsRenderer.CHART_TYPES.WATERFALL_BREAKDOWN) {
8038
8274
  const colFilter = highchartsRenderer.createFilterObject(widget.cols[0]);
8039
8275
  const labels = [];
@@ -8061,7 +8297,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
8061
8297
  col_value,
8062
8298
  highchartsRenderer.getDateFieldFormat(widget, widget.cols[index])
8063
8299
  );
8064
-
8300
+
8065
8301
  if ($.isEmptyObject(datetrange)) {
8066
8302
  return;
8067
8303
  }
@@ -8304,7 +8540,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
8304
8540
  var data = res;
8305
8541
 
8306
8542
  lodash.forEach(datesFields, function (row) {
8307
- row.val_not_convert = highchartsRenderer.check_value_not_for_convert(widget, row.name);
8543
+ row.val_not_convert = highchartsRenderer.check_values_not_for_convert(widget, row.name);
8308
8544
  });
8309
8545
 
8310
8546
  if (datesFields.length > 0) {
@@ -8710,14 +8946,14 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
8710
8946
  return rightPosition;
8711
8947
  case 'none':
8712
8948
  return none;
8949
+ }
8950
+ } else if (isLine) {
8951
+ return useNewUx ? leftPosition : rightPosition;
8952
+ } else if (isPie) {
8953
+ return useNewUx ? rightPosition : topPosition;
8713
8954
  }
8714
- } else if (isLine) {
8715
- return useNewUx ? leftPosition : rightPosition;
8716
- } else if (isPie) {
8717
- return useNewUx ? rightPosition : topPosition;
8718
- }
8719
8955
 
8720
- return useNewUx ? topPosition : bottomPosition;
8956
+ return useNewUx ? topPosition : bottomPosition;
8721
8957
  }
8722
8958
 
8723
8959
  highchartsRenderer.setYAxisMinMax = function (yAxis, axisYOptions) {
@@ -8732,7 +8968,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
8732
8968
  }
8733
8969
 
8734
8970
  highchartsRenderer.getDateFieldFormat = function(widget, dateField) {
8735
- const aggregationConfig = widget.options && widget.options.date_aggregation_configs
8971
+ const aggregationConfig = widget.options && widget.options.date_aggregation_configs
8736
8972
  ? _.find(widget.options.date_aggregation_configs, { field_id: dateField.id })
8737
8973
  : null;
8738
8974
 
@@ -0,0 +1,48 @@
1
+ import * as $ from 'jquery';
2
+ import * as lodash from 'lodash';
3
+ import * as moment from 'moment';
4
+ import initPivotTable from "../src/pivottable";
5
+ import initDRPivotTable from "../src/dr_pivottable";
6
+
7
+ const getHighchartsRenderer = require('../src/highcharts_renderer');
8
+ const DataFormatter = require('../src/dataformatter');
9
+ const DEFAULT_USER_COLORS = {
10
+ colors: ['#008aff', '#91e7e7', '#f37789', '#ffdc65', '#0e569d', '#bbe0ff', '#57b2ff', '#5ecfb9', '#c7ffda', '#179ab9'],
11
+ variance_color: null
12
+ };
13
+
14
+ let highchartsRenderer = {};
15
+ let _window = window;
16
+ let _document = document;
17
+
18
+ describe('highcharts_renderer', () => {
19
+ beforeAll(() => {
20
+ const Highcharts = {
21
+ opt: {},
22
+ setOptions: function(value) {Highcharts.opt = value;},
23
+ numberFormat: function(value) { return value ;},
24
+ getOptions: function() { return Highcharts.opt; }
25
+ };
26
+ _window.DataFormatter = DataFormatter;
27
+ initPivotTable($, _window, _document);
28
+ initDRPivotTable($, _window, _document);
29
+
30
+ highchartsRenderer = getHighchartsRenderer($, _document, Highcharts, DEFAULT_USER_COLORS, highchartsRenderer,
31
+ DataFormatter, lodash, moment, true)
32
+ })
33
+
34
+ describe('function isSystemField', () => {
35
+ it('system name', () => {
36
+ const field = {
37
+ name: 'Doc_ID'
38
+ };
39
+ expect(highchartsRenderer.isSystemField(field)).toBe(true)
40
+ });
41
+ it('not system name', () => {
42
+ const field = {
43
+ name: 'field name'
44
+ };
45
+ expect(highchartsRenderer.isSystemField(field)).toBe(false)
46
+ });
47
+ });
48
+ });