@datarailsshared/dr_renderer 1.2.420 → 1.2.421

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.421",
4
4
  "description": "DataRails charts and tables renderer",
5
5
  "keywords": [
6
6
  "datarails",
@@ -1041,8 +1041,8 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
1041
1041
  };
1042
1042
  if (isNewAngular) {
1043
1043
  const isPieChart = chartOptions.chart && chartOptions.chart.type === 'pie';
1044
- const x = isPieChart ? 13 : 12
1045
- const y = isPieChart ? -9 : 6
1044
+ const x = isPieChart ? 13 : 12;
1045
+ const y = isPieChart ? -9 : 6;
1046
1046
  chartOptions.chart.spacingBottom = lodash.get(chartOptions, 'xAxis.title') ? 34 : 30;
1047
1047
  chartOptions.drilldown.breadcrumbs = {
1048
1048
  formatter: () => '< &nbsp;Back',
@@ -1848,7 +1848,6 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
1848
1848
  var col_n_keys = pivotData.getColKeys();
1849
1849
  var row_n_keys = pivotData.getRowKeys();
1850
1850
 
1851
- var num_cols = col_n_keys.length;
1852
1851
  var num_rows = row_n_keys.length;
1853
1852
 
1854
1853
  const isOthersIncludedInRow = num_rows === 1 && lodash.includes(row_n_keys[0], highchartsRenderer.DR_OTHERS_KEY);
@@ -1867,9 +1866,6 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
1867
1866
  var ob = {};
1868
1867
  // check string contains hebrew
1869
1868
  ob.initialName = (/[\u0590-\u05FF]/).test(key) ? ('\u200E' + key) : key;
1870
- if (lodash.isEmpty(String(ob.name))) {
1871
- ob.initialName = "[blank]";
1872
- }
1873
1869
 
1874
1870
  if (ob.initialName === highchartsRenderer.DR_OTHERS_KEY) {
1875
1871
  ob.initialName = othersName;
@@ -5084,10 +5080,28 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
5084
5080
 
5085
5081
  const timeframe = highchartsRenderer.getTimeframeByFormat(format);
5086
5082
  const fiscalYearMonthsModifier = highchartsRenderer.getFiscalYearMonthModifier();
5083
+ const isFiscalYearBackEnabled = highchartsRenderer.isFiscalYearBackEnabled();
5087
5084
 
5088
5085
  let date = moment_lib(tryParse).utcOffset(0);
5089
- if (lodash.includes(['quarter', 'year'], timeframe)) {
5086
+ const originalDateYear = date.year()
5087
+ const originalDateMonth = date.month();
5088
+
5089
+ if (lodash.includes(['quarter'], timeframe)){
5090
5090
  date = date.subtract(fiscalYearMonthsModifier, 'M');
5091
+ if (fiscalYearMonthsModifier > 0 && !isFiscalYearBackEnabled) {
5092
+ let fiscalYear = originalDateYear;
5093
+ if ((originalDateMonth - fiscalYearMonthsModifier) >= 0) {
5094
+ fiscalYear += 1;
5095
+ }
5096
+ date = date.set('year', fiscalYear);
5097
+ }
5098
+ }
5099
+
5100
+ if (lodash.includes(['year'], timeframe)) {
5101
+ if (fiscalYearMonthsModifier > 0 && isFiscalYearBackEnabled) {
5102
+ let fiscalYear = originalDateYear - 1;
5103
+ date = date.set('year', fiscalYear);
5104
+ }
5091
5105
  }
5092
5106
 
5093
5107
  return date.format(format) + "";
@@ -8520,18 +8534,27 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
8520
8534
  lastDay2.getMonth(),
8521
8535
  lastDay2.getDate(),
8522
8536
  23, 59, 59
8523
- ) / 1000)
8537
+ ) / 1000);
8524
8538
  return range;
8525
8539
  case 'quarter':
8526
8540
  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();
8541
+ range.val.fromdate = lodash.cloneDeep(utcDate).startOf(timeframe).add(fiscalYearMonthsModifier, 'M');
8542
+ range.val.todate = lodash.cloneDeep(utcDate).endOf(timeframe).add(fiscalYearMonthsModifier, 'M').endOf('M');
8543
+ if (fiscalYearMonthsModifier > 0 && !highchartsRenderer.isFiscalYearBackEnabled()) {
8544
+ range.val.fromdate = moment_lib(range.val.fromdate.subtract(1, 'Y'));
8545
+ range.val.todate = moment_lib(range.val.todate.subtract(1, 'Y'));
8546
+ }
8547
+ range.val.fromdate = range.val.fromdate.unix();
8548
+ range.val.todate = range.val.todate.unix();
8529
8549
  return range;
8530
8550
  default:
8531
8551
  return "";
8532
8552
  }
8533
8553
  } else if (!lodash.isNaN(fieldnametoFilter)) {
8534
- const utcDate = moment_lib.unix(fieldnametoFilter).utc();
8554
+ let utcDate = moment_lib.unix(fieldnametoFilter).utc();
8555
+ if (lodash.includes(['year', 'quarter'], timeframe)) {
8556
+ utcDate = moment_lib(utcDate).subtract(fiscalYearMonthsModifier, 'M');
8557
+ }
8535
8558
  const fromDateMoment = lodash.cloneDeep(utcDate).startOf(timeframe);
8536
8559
  const toDateMoment = lodash.cloneDeep(utcDate).endOf(timeframe);
8537
8560
 
@@ -9497,6 +9520,10 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
9497
9520
  return lodash.get(document, 'ReportHippo.user.organization.fiscal_year_starts_from', 1) - 1;
9498
9521
  }
9499
9522
 
9523
+ highchartsRenderer.isFiscalYearBackEnabled = function() {
9524
+ return lodash.get(document, 'ReportHippo.user.organization.fiscal_year_back');
9525
+ }
9526
+
9500
9527
  highchartsRenderer.getTimeframeByFormat = function(format) {
9501
9528
  if (format && highchartsRenderer.containsIgnoreCase(format, 'q'))
9502
9529
  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
  });