@datarailsshared/dr_renderer 1.2.420 → 1.2.422

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.420",
3
+ "version": "1.2.422",
4
4
  "description": "DataRails charts and tables renderer",
5
5
  "keywords": [
6
6
  "datarails",
@@ -379,6 +379,31 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
379
379
 
380
380
  /** End of 'Highcharts initial configuration section' **/
381
381
 
382
+ const chartDataLabelsVerticalOptions = function (chartOptions) {
383
+ const vertical = lodash.get(chartOptions, 'label.vertical', false);
384
+ if (vertical) {
385
+ return {
386
+ rotation: 270,
387
+ y: -25,
388
+ padding: 10,
389
+ crop: false,
390
+ };
391
+ }
392
+
393
+ return {};
394
+ };
395
+
396
+ const chartHasVerticalDataLabelsOption = (type) => {
397
+ return ![
398
+ highchartsRenderer.CHART_TYPES.LINE_CHART,
399
+ highchartsRenderer.CHART_TYPES.LINE_CHART_SMOOTH,
400
+ highchartsRenderer.CHART_TYPES.AREA_CHART,
401
+ highchartsRenderer.CHART_TYPES.AREA_CHART_SMOOTH,
402
+ highchartsRenderer.CHART_TYPES.BAR_CHART,
403
+ highchartsRenderer.CHART_TYPES.BAR_CHART_STACKED,
404
+ ].includes(type);
405
+ };
406
+
382
407
  highchartsRenderer.filterFloat = function (value) {
383
408
  if (/^(\-|\+)?([0-9]+(\.[0-9]+)?|Infinity)$/.test(value))
384
409
  return Number(value);
@@ -1041,8 +1066,8 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
1041
1066
  };
1042
1067
  if (isNewAngular) {
1043
1068
  const isPieChart = chartOptions.chart && chartOptions.chart.type === 'pie';
1044
- const x = isPieChart ? 13 : 12
1045
- const y = isPieChart ? -9 : 6
1069
+ const x = isPieChart ? 13 : 12;
1070
+ const y = isPieChart ? -9 : 6;
1046
1071
  chartOptions.chart.spacingBottom = lodash.get(chartOptions, 'xAxis.title') ? 34 : 30;
1047
1072
  chartOptions.drilldown.breadcrumbs = {
1048
1073
  formatter: () => '< &nbsp;Back',
@@ -1848,7 +1873,6 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
1848
1873
  var col_n_keys = pivotData.getColKeys();
1849
1874
  var row_n_keys = pivotData.getRowKeys();
1850
1875
 
1851
- var num_cols = col_n_keys.length;
1852
1876
  var num_rows = row_n_keys.length;
1853
1877
 
1854
1878
  const isOthersIncludedInRow = num_rows === 1 && lodash.includes(row_n_keys[0], highchartsRenderer.DR_OTHERS_KEY);
@@ -1867,9 +1891,6 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
1867
1891
  var ob = {};
1868
1892
  // check string contains hebrew
1869
1893
  ob.initialName = (/[\u0590-\u05FF]/).test(key) ? ('\u200E' + key) : key;
1870
- if (lodash.isEmpty(String(ob.name))) {
1871
- ob.initialName = "[blank]";
1872
- }
1873
1894
 
1874
1895
  if (ob.initialName === highchartsRenderer.DR_OTHERS_KEY) {
1875
1896
  ob.initialName = othersName;
@@ -1898,8 +1919,8 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
1898
1919
  highchartsRenderer.ptCreateDrillDownSeriesToDrilldownChart = function (pivotData, chartOptions, additionOptions, opts) {
1899
1920
 
1900
1921
  var pie_drill_down_series = [],
1901
- row_n_keys = pivotData.getRowKeys(),
1902
- col_n_keys = pivotData.getColKeys();
1922
+ row_n_keys = pivotData.getRowKeys(),
1923
+ col_n_keys = pivotData.getColKeys();
1903
1924
 
1904
1925
  var num_cols = col_n_keys.length;
1905
1926
  var num_rows = row_n_keys.length;
@@ -3044,11 +3065,10 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
3044
3065
  }
3045
3066
  };
3046
3067
  }
3047
-
3068
+ chartOptions.plotOptions.series = highchartsRenderer.getDataLabelsOptions(additionOptions, chartOptions.plotOptions.series);
3048
3069
  chartOptions.legend = highchartsRenderer.getOptionsForLegends(additionOptions, rowAttrs.length, false);
3049
3070
 
3050
3071
  chartOptions.drilldown = highchartsRenderer.getDataLabelsStylesForDrillDown(additionOptions);
3051
-
3052
3072
  return highchartsRenderer.ptCreateElementAndDraw(chartOptions, opts);
3053
3073
  };
3054
3074
 
@@ -5084,10 +5104,28 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
5084
5104
 
5085
5105
  const timeframe = highchartsRenderer.getTimeframeByFormat(format);
5086
5106
  const fiscalYearMonthsModifier = highchartsRenderer.getFiscalYearMonthModifier();
5107
+ const isFiscalYearBackEnabled = highchartsRenderer.isFiscalYearBackEnabled();
5087
5108
 
5088
5109
  let date = moment_lib(tryParse).utcOffset(0);
5089
- if (lodash.includes(['quarter', 'year'], timeframe)) {
5110
+ const originalDateYear = date.year()
5111
+ const originalDateMonth = date.month();
5112
+
5113
+ if (lodash.includes(['quarter'], timeframe)){
5090
5114
  date = date.subtract(fiscalYearMonthsModifier, 'M');
5115
+ if (fiscalYearMonthsModifier > 0 && !isFiscalYearBackEnabled) {
5116
+ let fiscalYear = originalDateYear;
5117
+ if ((originalDateMonth - fiscalYearMonthsModifier) >= 0) {
5118
+ fiscalYear += 1;
5119
+ }
5120
+ date = date.set('year', fiscalYear);
5121
+ }
5122
+ }
5123
+
5124
+ if (lodash.includes(['year'], timeframe)) {
5125
+ if (fiscalYearMonthsModifier > 0 && isFiscalYearBackEnabled) {
5126
+ let fiscalYear = originalDateYear - 1;
5127
+ date = date.set('year', fiscalYear);
5128
+ }
5091
5129
  }
5092
5130
 
5093
5131
  return date.format(format) + "";
@@ -6017,7 +6055,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
6017
6055
  let valToReturn = {};
6018
6056
  if (chartOpt) {
6019
6057
  lodash.forEach(chartOpt.suboptions, (suboption) => {
6020
- valToReturn[suboption.category_type] = highchartsRenderer.getDefaultValueForSubOptions(suboption, existing_options);
6058
+ valToReturn[suboption.category_type] = highchartsRenderer.getDefaultValueForSubOptions(suboption, existing_options, type);
6021
6059
  });
6022
6060
  }
6023
6061
 
@@ -6087,6 +6125,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
6087
6125
  };
6088
6126
  result = lodash.merge(result, options);
6089
6127
  result = lodash.merge(result, chartOptions.dataLabels);
6128
+ result = lodash.merge(result, chartDataLabelsVerticalOptions(additionalOptions, chartOptions));
6090
6129
  chartOptions.dataLabels = result;
6091
6130
 
6092
6131
  return chartOptions;
@@ -6098,7 +6137,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
6098
6137
  return key
6099
6138
  };
6100
6139
 
6101
- highchartsRenderer.getDefaultValueForSubOptions = function (option, existing_options) {
6140
+ highchartsRenderer.getDefaultValueForSubOptions = function (option, existing_options, chartType) {
6102
6141
  const valToReturn = {};
6103
6142
 
6104
6143
  if (option) {
@@ -6106,6 +6145,10 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
6106
6145
  lodash.forEach(option.elements, function (elem) {
6107
6146
  if (existing_options && lodash.has(existing_options, type + '.' + elem.value_name)) {
6108
6147
  valToReturn[elem.value_name] = lodash.get(existing_options, type + '.' + elem.value_name);
6148
+
6149
+ if (elem.showFn && typeof elem.showFn === 'function' && !elem.showFn(chartType)) {
6150
+ valToReturn[elem.value_name] = undefined;
6151
+ }
6109
6152
  }
6110
6153
  if (valToReturn[elem.value_name] == undefined && elem.element_type !== 'devider') {
6111
6154
  if (typeof elem.default_value === 'object') {
@@ -6652,6 +6695,13 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
6652
6695
  value_name: 'overlap',
6653
6696
  default_value: false
6654
6697
  },
6698
+ {
6699
+ element_type: 'toggle',
6700
+ element_label: 'Vertical',
6701
+ value_name: 'vertical',
6702
+ default_value: false,
6703
+ showFn: chartHasVerticalDataLabelsOption,
6704
+ },
6655
6705
  {
6656
6706
  element_type: 'devider',
6657
6707
  },
@@ -6795,6 +6845,13 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
6795
6845
  value_name: 'overlap',
6796
6846
  default_value: false
6797
6847
  },
6848
+ {
6849
+ element_type: 'toggle',
6850
+ element_label: 'Vertical',
6851
+ value_name: 'vertical',
6852
+ default_value: false,
6853
+ showFn: chartHasVerticalDataLabelsOption,
6854
+ },
6798
6855
  {
6799
6856
  element_type: 'toggle',
6800
6857
  element_label: 'Shadow',
@@ -8520,18 +8577,27 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
8520
8577
  lastDay2.getMonth(),
8521
8578
  lastDay2.getDate(),
8522
8579
  23, 59, 59
8523
- ) / 1000)
8580
+ ) / 1000);
8524
8581
  return range;
8525
8582
  case 'quarter':
8526
8583
  const utcDate = moment_lib.utc(initialDateString, format, true);
8527
- range.val.fromdate = lodash.cloneDeep(utcDate).startOf(timeframe).add(fiscalYearMonthsModifier, 'M').unix();
8528
- range.val.todate = lodash.cloneDeep(utcDate).endOf(timeframe).add(fiscalYearMonthsModifier, 'M').endOf('M').unix();
8584
+ range.val.fromdate = lodash.cloneDeep(utcDate).startOf(timeframe).add(fiscalYearMonthsModifier, 'M');
8585
+ range.val.todate = lodash.cloneDeep(utcDate).endOf(timeframe).add(fiscalYearMonthsModifier, 'M').endOf('M');
8586
+ if (fiscalYearMonthsModifier > 0 && !highchartsRenderer.isFiscalYearBackEnabled()) {
8587
+ range.val.fromdate = moment_lib(range.val.fromdate.subtract(1, 'Y'));
8588
+ range.val.todate = moment_lib(range.val.todate.subtract(1, 'Y'));
8589
+ }
8590
+ range.val.fromdate = range.val.fromdate.unix();
8591
+ range.val.todate = range.val.todate.unix();
8529
8592
  return range;
8530
8593
  default:
8531
8594
  return "";
8532
8595
  }
8533
8596
  } else if (!lodash.isNaN(fieldnametoFilter)) {
8534
- const utcDate = moment_lib.unix(fieldnametoFilter).utc();
8597
+ let utcDate = moment_lib.unix(fieldnametoFilter).utc();
8598
+ if (lodash.includes(['year', 'quarter'], timeframe)) {
8599
+ utcDate = moment_lib(utcDate).subtract(fiscalYearMonthsModifier, 'M');
8600
+ }
8535
8601
  const fromDateMoment = lodash.cloneDeep(utcDate).startOf(timeframe);
8536
8602
  const toDateMoment = lodash.cloneDeep(utcDate).endOf(timeframe);
8537
8603
 
@@ -9497,6 +9563,10 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
9497
9563
  return lodash.get(document, 'ReportHippo.user.organization.fiscal_year_starts_from', 1) - 1;
9498
9564
  }
9499
9565
 
9566
+ highchartsRenderer.isFiscalYearBackEnabled = function() {
9567
+ return lodash.get(document, 'ReportHippo.user.organization.fiscal_year_back');
9568
+ }
9569
+
9500
9570
  highchartsRenderer.getTimeframeByFormat = function(format) {
9501
9571
  if (format && highchartsRenderer.containsIgnoreCase(format, 'q'))
9502
9572
  return 'quarter';
@@ -39,6 +39,7 @@ describe('highcharts_renderer', () => {
39
39
  getOptions: function() { return Highcharts.opt; },
40
40
  Tooltip: {},
41
41
  wrap: () => {},
42
+ chart: () => {},
42
43
  };
43
44
  _window.DataFormatter = DataFormatter;
44
45
  initPivotTable($, _window, _document);
@@ -7375,6 +7376,124 @@ describe('highcharts_renderer', () => {
7375
7376
  })
7376
7377
  });
7377
7378
 
7379
+ describe('Function ptCreateElementAndDraw', () => {
7380
+ beforeEach(() => {
7381
+ jest.clearAllMocks();
7382
+ });
7383
+
7384
+ afterAll(() => {
7385
+ jest.restoreAllMocks();
7386
+ });
7387
+
7388
+ it('should set chart colors palette using widget or dashboard colors palette', () => {
7389
+ const chartOptions = {
7390
+ colors: [],
7391
+ chart: {
7392
+ },
7393
+ };
7394
+ const optionsWidgetPalette = {
7395
+ paletteOptions: {
7396
+ widgetPalette: ['#ff0202', '#b3060e', '#70000a'],
7397
+ dashboardPalette: {
7398
+ colors: ['#ffffff', '#000000']
7399
+ },
7400
+ },
7401
+ onlyOptions: true,
7402
+ };
7403
+
7404
+ const res = highchartsRenderer.ptCreateElementAndDraw(chartOptions, optionsWidgetPalette);
7405
+ expect(res.colors).toEqual(optionsWidgetPalette.paletteOptions.widgetPalette);
7406
+
7407
+ const optionsDashboardPalette = {
7408
+ paletteOptions: {
7409
+ dashboardPalette: {
7410
+ colors: ['#ffffff', '#000000']
7411
+ },
7412
+ },
7413
+ onlyOptions: true,
7414
+ };
7415
+
7416
+ const res2 = highchartsRenderer.ptCreateElementAndDraw(chartOptions, optionsDashboardPalette);
7417
+ expect(res2.colors).toEqual(optionsDashboardPalette.paletteOptions.dashboardPalette.colors);
7418
+ });
7419
+
7420
+ it('should set drilldown options on drilldown chart', () => {
7421
+ jest.useFakeTimers();
7422
+ highchartsRenderer.isNewAngular = true;
7423
+ const chartSpy = jest.spyOn(Highcharts, 'chart').mockImplementation(() => {});
7424
+
7425
+ const chartOptions = {
7426
+ colors: [],
7427
+ chart: {
7428
+ },
7429
+ onlyText: true,
7430
+ drilldown: {
7431
+ },
7432
+ };
7433
+ const options = {};
7434
+
7435
+ highchartsRenderer.ptCreateElementAndDraw(chartOptions, options);
7436
+
7437
+ jest.runAllTimers();
7438
+
7439
+ expect(chartSpy).toHaveBeenCalledWith(
7440
+ expect.any(Object),
7441
+ expect.objectContaining({
7442
+ drilldown: expect.objectContaining({
7443
+ drillUpButton: expect.any(Object),
7444
+ breadcrumbs: expect.any(Object),
7445
+ }),
7446
+ }),
7447
+ );
7448
+ });
7449
+
7450
+ it('should return no data result if series is empty', () => {
7451
+ const chartOptions = {
7452
+ chart: {},
7453
+ series: [{ data: [] }, { data: [] }, {}],
7454
+ };
7455
+ const options = {};
7456
+ const noDataFnSpy = jest.spyOn(highchartsRenderer, 'getNoDataResult').mockImplementation(() => {});
7457
+
7458
+ highchartsRenderer.ptCreateElementAndDraw(chartOptions, options);
7459
+
7460
+ expect(noDataFnSpy).toHaveBeenCalled();
7461
+ expect(options.error_has_occurred).toBeTruthy();
7462
+ expect(options.error_params).toBe(highchartsRenderer.widgetPlaceholders.nodata);
7463
+ });
7464
+
7465
+ it('should return too much data result if series is too long', () => {
7466
+ const chartOptions = {
7467
+ chart: {},
7468
+ series: [{ data: new Array(1000) }, { data: new Array(1000) }, {}],
7469
+ };
7470
+ const options = {};
7471
+ const noDataFnSpy = jest.spyOn(highchartsRenderer, 'getNoDataResult').mockImplementation(() => {});
7472
+
7473
+ highchartsRenderer.ptCreateElementAndDraw(chartOptions, options);
7474
+
7475
+ expect(noDataFnSpy).toHaveBeenCalled();
7476
+ expect(options.error_has_occurred).toBeTruthy();
7477
+ expect(options.error_params).toBe(highchartsRenderer.widgetPlaceholders.tooMuchData);
7478
+ });
7479
+
7480
+ it('should set hcInstance on options with chart object for graph table renderer to use', () => {
7481
+ jest.useFakeTimers();
7482
+ jest.spyOn(Highcharts, 'chart').mockImplementation(() => ({ chart: true }));
7483
+
7484
+ const chartOptions = {
7485
+ chart: {},
7486
+ onlyText: true,
7487
+ };
7488
+ const options = {};
7489
+
7490
+ highchartsRenderer.ptCreateElementAndDraw(chartOptions, options);
7491
+ jest.runAllTimers();
7492
+
7493
+ expect(options.hcInstance).toBeDefined();
7494
+ });
7495
+ });
7496
+
7378
7497
  describe('Function getNoDataResult', () => {
7379
7498
  const container = $('<div class="noData-box"></div>');
7380
7499
 
@@ -8739,4 +8858,77 @@ describe('highcharts_renderer', () => {
8739
8858
  });
8740
8859
  });
8741
8860
 
8861
+
8862
+ describe('Function ptCreateSeriesToDrillDownChart', () => {
8863
+ let pivotData, chartOptions, additionOptions, opts;
8864
+
8865
+ beforeEach(() => {
8866
+ pivotData = {
8867
+ getColKeys: jest.fn(),
8868
+ getRowKeys: jest.fn(),
8869
+ getAggregator: jest.fn().mockReturnValue({
8870
+ value: jest.fn()
8871
+ })
8872
+ };
8873
+
8874
+ chartOptions = {
8875
+ chart: {
8876
+ type: 'pie'
8877
+ }
8878
+ };
8879
+
8880
+ additionOptions = {};
8881
+ opts = {};
8882
+
8883
+ highchartsRenderer.getOthersName = jest.fn();
8884
+ highchartsRenderer.getFormattedColKey = jest.fn();
8885
+ highchartsRenderer.moveSeriesToSecondYAxisIfNeeded = jest.fn();
8886
+ });
8887
+
8888
+ it('should handle Hebrew characters in key', () => {
8889
+ pivotData.getColKeys.mockReturnValue(['שלום']);
8890
+ pivotData.getRowKeys.mockReturnValue(['row1']);
8891
+ pivotData.getAggregator().value.mockReturnValue(10);
8892
+ highchartsRenderer.getOthersName.mockReturnValue('Others');
8893
+ highchartsRenderer.getFormattedColKey.mockReturnValue('FormattedKey');
8894
+
8895
+ const result = highchartsRenderer.ptCreateSeriesToDrillDownChart(pivotData, chartOptions, additionOptions, opts);
8896
+ expect(result[0].data[0].initialName).toEqual('\u200Eשלום');
8897
+ });
8898
+
8899
+ it('should handle DR_OTHERS_KEY', () => {
8900
+ pivotData.getColKeys.mockReturnValue([highchartsRenderer.DR_OTHERS_KEY]);
8901
+ pivotData.getRowKeys.mockReturnValue(['row1']);
8902
+ pivotData.getAggregator().value.mockReturnValue(10);
8903
+ highchartsRenderer.getOthersName.mockReturnValue('Others');
8904
+ highchartsRenderer.getFormattedColKey.mockReturnValue('FormattedKey');
8905
+
8906
+ const result = highchartsRenderer.ptCreateSeriesToDrillDownChart(pivotData, chartOptions, additionOptions, opts);
8907
+ expect(result[0].data[0].initialName).toEqual('Others');
8908
+ });
8909
+
8910
+ it('should handle negative values when chart type is not pie', () => {
8911
+ chartOptions.chart.type = 'notPie';
8912
+ pivotData.getColKeys.mockReturnValue(['key1']);
8913
+ pivotData.getRowKeys.mockReturnValue(['row1']);
8914
+ pivotData.getAggregator().value.mockReturnValue(-10);
8915
+ highchartsRenderer.getOthersName.mockReturnValue('Others');
8916
+ highchartsRenderer.getFormattedColKey.mockReturnValue('FormattedKey');
8917
+
8918
+ const result = highchartsRenderer.ptCreateSeriesToDrillDownChart(pivotData, chartOptions, additionOptions, opts);
8919
+ expect(result[0].data[0].y).toEqual(-10);
8920
+ });
8921
+
8922
+ it('should handle numeric keys', () => {
8923
+ pivotData.getColKeys.mockReturnValue(['123']);
8924
+ pivotData.getRowKeys.mockReturnValue(['row1']);
8925
+ pivotData.getAggregator().value.mockReturnValue(10);
8926
+ highchartsRenderer.getOthersName.mockReturnValue('Others');
8927
+ highchartsRenderer.getFormattedColKey.mockReturnValue('FormattedKey');
8928
+
8929
+ const result = highchartsRenderer.ptCreateSeriesToDrillDownChart(pivotData, chartOptions, additionOptions, opts);
8930
+ expect(result[0].data[0].drilldown).toEqual(123);
8931
+ });
8932
+ });
8933
+
8742
8934
  });