@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 +1 -1
- package/src/highcharts_renderer.js +38 -11
- package/tests/highcharts_renderer.test.js +192 -0
package/package.json
CHANGED
@@ -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: () => '< 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
|
-
|
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')
|
8528
|
-
range.val.todate = lodash.cloneDeep(utcDate).endOf(timeframe).add(fiscalYearMonthsModifier, 'M').endOf('M')
|
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
|
-
|
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
|
});
|