@datarailsshared/dr_renderer 1.2.453 → 1.2.455

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.
@@ -0,0 +1,277 @@
1
+ const helpers = require("./dr-renderer-helpers");
2
+
3
+ const DR_TOOLTIP_OPTIONS_DEFAULT = {
4
+ anchorOffset: 10,
5
+ arrowRadius: 3,
6
+ arrowSize: 10,
7
+ background: "#fff",
8
+ border: 1,
9
+ borderColor: "#DFE0E3",
10
+ borderRadius: 8,
11
+ boxShadow: "0px 4px 8px 1px rgba(0, 0, 0, 0.25)",
12
+ direction: "top",
13
+ followPointer: false,
14
+ outerOffset: 8,
15
+ paddings: [6, 12],
16
+ showArrow: true,
17
+ };
18
+
19
+ function DrChartTooltip(chart, options) {
20
+ this.getOptions = function() {
21
+ return this.options;
22
+ }
23
+
24
+ this.add = function(content, anchor, options = {}) {
25
+ const localOptions = Object.assign({}, this.options, options );
26
+ let tooltip;
27
+
28
+ if (!content || !anchor) {
29
+ return false;
30
+ }
31
+
32
+ anchor.addEventListener("mouseover", (event) => {
33
+ if (tooltip) {
34
+ tooltip.destroy();
35
+ }
36
+ tooltip = this.create(content, localOptions.followPointer ? event : anchor, localOptions);
37
+ tooltip.show();
38
+ });
39
+
40
+ anchor.addEventListener("mouseleave", (event) => {
41
+ if (!tooltip) {
42
+ return;
43
+ }
44
+
45
+ tooltip = tooltip.destroy();
46
+ });
47
+
48
+ if (localOptions.followPointer) {
49
+ anchor.addEventListener("mousemove", (event) => {
50
+ if (!tooltip) {
51
+ return;
52
+ }
53
+
54
+ this.setTooltipPosition(tooltip, event, localOptions);
55
+ });
56
+ }
57
+ }
58
+
59
+ this.create = function(content, anchor, options) {
60
+ const tooltip = this.chart.renderer
61
+ .text(`${content}${options.showArrow ? `<span class="dr-renderer-tooltip_arrow" style="position: absolute"></span>` : ""}`, 0, 0, true)
62
+ .attr({
63
+ class: "dr-renderer-tooltip",
64
+ })
65
+ .css({
66
+ background: options.background,
67
+ border: `${options.border}px solid ${options.borderColor}`,
68
+ borderRadius: options.borderRadius + "px",
69
+ boxShadow: options.boxShadow,
70
+ color: options.color,
71
+ display: "flex",
72
+ alignItems: "center",
73
+ gap: "4px",
74
+ fontFamily: options.fontFamily,
75
+ fontSize: options.fontSize + "px",
76
+ padding: options.paddings.map((p) => `${p}px`).join(" "),
77
+ })
78
+ .add()
79
+ .hide();
80
+
81
+ helpers.removeSVGTextCorrection(tooltip);
82
+
83
+ this.setTooltipPosition(tooltip, anchor, options);
84
+
85
+ return tooltip;
86
+ }
87
+
88
+ this.setTooltipPosition = function(tooltip, anchor, options) {
89
+ const position = this.getPosition(tooltip, anchor, options);
90
+
91
+ tooltip.attr({
92
+ x: position.x,
93
+ y: position.y,
94
+ class: `dr-renderer-tooltip ${position.direction}`,
95
+ });
96
+
97
+ if (options.showArrow) {
98
+ this.setArrowPosition(tooltip, position, anchor, options);
99
+ }
100
+ }
101
+
102
+ this.setArrowPosition = function(tooltip, position, anchor, options) {
103
+ const arrowEl = tooltip.element.querySelector(".dr-renderer-tooltip_arrow");
104
+ const anchorBox = this.getAnchorBox(anchor);
105
+ const tooltipBox = tooltip.getBBox();
106
+ arrowEl.removeAttribute("style");
107
+ const styles = {
108
+ position: "absolute",
109
+ display: "block",
110
+ width: `${options.arrowSize}px`,
111
+ height: `${options.arrowSize}px`,
112
+ transform: "rotate(-45deg)",
113
+ "border-style": "solid",
114
+ "border-width": `${options.border}px`,
115
+ background: options.background,
116
+ };
117
+
118
+ switch (position.direction) {
119
+ case "top":
120
+ Object.assign(styles, {
121
+ "border-color": `transparent transparent ${options.borderColor} ${options.borderColor}`,
122
+ "border-bottom-left-radius": `${options.arrowRadius}px`,
123
+ bottom: `-${options.arrowSize / 2}px`,
124
+ left: `${helpers.clamp(
125
+ options.borderRadius,
126
+ Math.max(anchorBox.x - position.x, 0) +
127
+ Math.min(anchorBox.width, tooltipBox.width) / 2 -
128
+ options.arrowSize / 2,
129
+ tooltipBox.width - options.arrowSize - options.borderRadius
130
+ )}px`,
131
+ });
132
+ break;
133
+ case "bottom":
134
+ Object.assign(styles, {
135
+ "border-color": `${options.borderColor} ${options.borderColor} transparent transparent`,
136
+ "border-top-right-radius": `${options.arrowRadius}px`,
137
+ top: `-${options.arrowSize / 2}px`,
138
+ left: `${helpers.clamp(
139
+ options.borderRadius,
140
+ Math.max(anchorBox.x - position.x, 0) +
141
+ Math.min(anchorBox.width, tooltipBox.width) / 2 -
142
+ options.arrowSize / 2,
143
+ tooltipBox.width - options.arrowSize - options.borderRadius
144
+ )}px`,
145
+ });
146
+ break;
147
+ case "left":
148
+ Object.assign(styles, {
149
+ "border-color": `transparent ${options.borderColor} ${options.borderColor} transparent`,
150
+ "border-bottom-right-radius": `${options.arrowRadius}px`,
151
+ right: `-${options.arrowSize / 2}px`,
152
+ top: `${helpers.clamp(
153
+ options.borderRadius,
154
+ Math.max(anchorBox.y - position.y, 0) +
155
+ Math.min(anchorBox.height, tooltipBox.height) / 2 -
156
+ options.arrowSize / 2,
157
+ tooltipBox.height - options.arrowSize - options.borderRadius
158
+ )}px`,
159
+ });
160
+ break;
161
+ case "right":
162
+ Object.assign(styles, {
163
+ "border-color": `${options.borderColor} transparent transparent ${options.borderColor}`,
164
+ "border-top-left-radius": `${options.arrowRadius}px`,
165
+ left: `-${options.arrowSize / 2}px`,
166
+ top: `${helpers.clamp(
167
+ options.borderRadius,
168
+ Math.max(anchorBox.y - position.y, 0) +
169
+ Math.min(anchorBox.height, tooltipBox.height) / 2 -
170
+ options.arrowSize / 2,
171
+ tooltipBox.height - options.arrowSize - options.borderRadius
172
+ )}px`,
173
+ });
174
+ break;
175
+ }
176
+
177
+ arrowEl.setAttribute(
178
+ "style",
179
+ Object.keys(styles)
180
+ .map((key) => `${key}:${styles[key]}`)
181
+ .join(";")
182
+ );
183
+ }
184
+
185
+ this.getCoords = function(direction, tooltip, anchor, options) {
186
+ const tooltipBox = tooltip.getBBox();
187
+ const anchorBox = this.getAnchorBox(anchor);
188
+ switch (direction) {
189
+ case "top":
190
+ return {
191
+ x: helpers.clamp(
192
+ options.outerOffset,
193
+ anchorBox.x + anchorBox.width / 2 - tooltipBox.width / 2,
194
+ this.chart.chartWidth - tooltipBox.width - options.outerOffset
195
+ ),
196
+ y: anchorBox.y - tooltipBox.height - options.anchorOffset,
197
+ };
198
+ case "bottom":
199
+ return {
200
+ x: helpers.clamp(
201
+ options.outerOffset,
202
+ anchorBox.x + anchorBox.width / 2 - tooltipBox.width / 2,
203
+ this.chart.chartWidth - tooltipBox.width - options.outerOffset
204
+ ),
205
+ y: anchorBox.y + anchorBox.height + options.anchorOffset,
206
+ };
207
+ case "left":
208
+ return {
209
+ x: anchorBox.x - tooltipBox.width - options.anchorOffset,
210
+ y: helpers.clamp(
211
+ options.outerOffset,
212
+ anchorBox.y + anchorBox.height / 2 - tooltipBox.height / 2,
213
+ this.chart.chartHeight - tooltipBox.height - options.outerOffset
214
+ ),
215
+ };
216
+ case "right":
217
+ return {
218
+ x: anchorBox.x + anchorBox.width + options.anchorOffset,
219
+ y: helpers.clamp(
220
+ options.outerOffset,
221
+ anchorBox.y + anchorBox.height / 2 - tooltipBox.height / 2,
222
+ this.chart.chartHeight - tooltipBox.height - options.outerOffset
223
+ ),
224
+ };
225
+ }
226
+ }
227
+
228
+ this.getAnchorBox = function(el) {
229
+ if (el.getBBox) {
230
+ return el.getBBox();
231
+ }
232
+
233
+ const containerRect = this.chart.container.getBoundingClientRect();
234
+
235
+ if (el.getBoundingClientRect) {
236
+ const elRect = el.getBoundingClientRect();
237
+ return {
238
+ x: elRect.x - containerRect.x,
239
+ y: elRect.y - containerRect.y,
240
+ width: elRect.width,
241
+ height: elRect.height,
242
+ };
243
+ }
244
+ return {
245
+ x: el.x - containerRect.x,
246
+ y: el.y - containerRect.y,
247
+ width: 0,
248
+ height: 0,
249
+ };
250
+ }
251
+
252
+ this.getPosition = function(tooltip, anchor, options) {
253
+ const bbox = tooltip.getBBox();
254
+
255
+ for (let direction of [options.direction, ...["top", "right", "bottom", "left"].filter((d) => d !== options.direction)]) {
256
+ const coords = this.getCoords(direction, tooltip, anchor, options);
257
+
258
+ if (
259
+ coords.x >= 0 &&
260
+ coords.x <= this.chart.chartWidth - bbox.width &&
261
+ coords.y >= 0 &&
262
+ coords.y <= this.chart.chartHeight - bbox.height
263
+ ) {
264
+ return {
265
+ x: coords.x,
266
+ y: coords.y,
267
+ direction: direction,
268
+ };
269
+ }
270
+ }
271
+ }
272
+
273
+ this.chart = chart;
274
+ this.options = Object.assign({}, DR_TOOLTIP_OPTIONS_DEFAULT, options);
275
+ }
276
+
277
+ module.exports = { DrChartTooltip, DR_TOOLTIP_OPTIONS_DEFAULT };
@@ -1,5 +1,6 @@
1
1
  const helpers = require('./dr-renderer-helpers');
2
- const seriesPointStylesHelper= require('./seriesPointStyles-helper')
2
+ const { DrGaugeChart, GAUGE_OPTIONS_DEFAULT } = require('./charts/dr_gauge_chart');
3
+ const seriesPointStylesHelper= require('./seriesPointStyles-helper');
3
4
 
4
5
  const mobileBrowserRegex = new RegExp([
5
6
  '(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)',
@@ -56,6 +57,7 @@ const CHART_TYPES = {
56
57
  PIE_CHART_DRILLDOWN: 'pie-chart-drilldown',
57
58
  GAUGE_SOLID_CHART: 'gauge-solid-chart',
58
59
  GAUGE_CHART: 'gauge-chart',
60
+ GAUGE_CHART_ENHANCED: 'gauge-chart-enhanced',
59
61
  KPI_WIDGET: 'kpi-widget',
60
62
  TEXT_WIDGET: 'text-widget',
61
63
  WATERFALL_BREAKDOWN: 'waterfall-chart-breakdown',
@@ -195,6 +197,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
195
197
  if (!highchartsRenderer) {
196
198
  highchartsRenderer = {};
197
199
  }
200
+ DrGaugeChart.highchartsRenderer = highchartsRenderer;
198
201
  lodash.assign(highchartsRenderer, HIGHCHARTS_CONSTANTS);
199
202
 
200
203
  highchartsRenderer.enabledNewWidgetValueFormatting = false;
@@ -2231,6 +2234,41 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
2231
2234
  return highchartsRenderer.ptRenderGauge(pivotData, opts, true);
2232
2235
  };
2233
2236
 
2237
+ highchartsRenderer.transformOldGaugeOptions = (oldOptions) => {
2238
+ const newOptions = highchartsRenderer.objectCopyJsonMethod(oldOptions);
2239
+ const { range, segments } = newOptions;
2240
+
2241
+ if (!segments) {
2242
+ newOptions.segments = highchartsRenderer.objectCopyJsonMethod(GAUGE_OPTIONS_DEFAULT.segments);
2243
+ }
2244
+
2245
+ if (!range) {
2246
+ return newOptions;
2247
+ }
2248
+
2249
+ const rangeArr = [range.low, range.medium, Math.max(range.high || 100, 100)];
2250
+
2251
+ newOptions.segments.forEach((segment, i) => {
2252
+ segment.from = (rangeArr[i - 1] + 1) || segment.from;
2253
+ segment.to = rangeArr[i] || segment.to;
2254
+ });
2255
+
2256
+ if (!newOptions.goal) {
2257
+ newOptions.goal = highchartsRenderer.objectCopyJsonMethod(GAUGE_OPTIONS_DEFAULT.goal);
2258
+ }
2259
+
2260
+ newOptions.goal.value = range.max || newOptions.goal.value;
2261
+
2262
+ delete newOptions.range;
2263
+
2264
+ return newOptions;
2265
+ };
2266
+
2267
+ highchartsRenderer.ptRenderGaugeEnhanced = (pivotData, opts) => {
2268
+ opts.chartOptions = highchartsRenderer.transformOldGaugeOptions(opts.chartOptions);
2269
+ return new DrGaugeChart(pivotData, opts).render();
2270
+ };
2271
+
2234
2272
  highchartsRenderer.ptRenderGauge = (pivotData, opts, isSolidGauge = false) => {
2235
2273
  const gaugeopts = opts.chartOptions
2236
2274
  || highchartsRenderer.getDefaultValueForChart(isSolidGauge ? 'gauge-solid-chart' : 'gauge-chart');
@@ -6073,7 +6111,6 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
6073
6111
  const chartOpt = type === highchartsRenderer.richTextSubType.type
6074
6112
  ? highchartsRenderer.richTextSubType
6075
6113
  : highchartsRenderer.getChartOptionsBySubType(type);
6076
-
6077
6114
  let valToReturn = {};
6078
6115
  if (chartOpt) {
6079
6116
  lodash.forEach(chartOpt.suboptions, (suboption) => {
@@ -6574,6 +6611,25 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
6574
6611
  },
6575
6612
  ]
6576
6613
  },
6614
+ 'table_options_gauge': {
6615
+ category_class: 'google-visualization-charteditor-mini-more',
6616
+ category_label: 'Table',
6617
+ category_type: 'table_options',
6618
+ elements: [
6619
+ {
6620
+ element_type: 'input',
6621
+ value_name: 'table_colors_offset',
6622
+ element_label: 'Colors offset',
6623
+ default_value: 0
6624
+ },
6625
+ {
6626
+ element_type: 'checkbox',
6627
+ element_label: 'Column totals',
6628
+ value_name: 'show_column_total',
6629
+ default_value: true
6630
+ }
6631
+ ]
6632
+ },
6577
6633
  'value': {
6578
6634
  category_class: 'google-visualization-charteditor-mini-more',
6579
6635
  category_label: 'Value',
@@ -6848,6 +6904,67 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
6848
6904
  },
6849
6905
  ]
6850
6906
  },
6907
+ 'label_gauge': {
6908
+ category_class: 'google-visualization-charteditor-mini-more',
6909
+ category_label: 'Label',
6910
+ category_type: 'label',
6911
+ elements: [
6912
+ {
6913
+ element_type: 'toggle',
6914
+ element_label: 'Show',
6915
+ value_name: 'show',
6916
+ default_value: true,
6917
+ },
6918
+ {
6919
+ element_type: 'devider',
6920
+ },
6921
+ {
6922
+ element_type: 'devider',
6923
+ element_label: 'Label Style',
6924
+ },
6925
+ {
6926
+ element_type: 'select',
6927
+ value_name: 'font_style',
6928
+ element_label: 'Font style',
6929
+ element_options: SUBOPTIONS_FONTS,
6930
+ default_value: LABEL_DEFAULT_SETTINGS.FONT_FAMILY,
6931
+ },
6932
+ {
6933
+ element_type: 'select',
6934
+ value_name: 'font_size',
6935
+ element_label: 'Font size',
6936
+ element_options: suboptionsFontSizeValues,
6937
+ default_value: 16,
6938
+ },
6939
+ {
6940
+ element_type: 'color_picker',
6941
+ value_name: 'font_color',
6942
+ element_label: 'Font Color',
6943
+ default_value: '#333'
6944
+ },
6945
+ {
6946
+ element_type: 'devider',
6947
+ },
6948
+ {
6949
+ element_type: 'checkbox',
6950
+ element_label: 'Goal name',
6951
+ value_name: 'show_goal_name',
6952
+ default_value: true,
6953
+ },
6954
+ {
6955
+ element_type: 'checkbox',
6956
+ element_label: 'Value % out of Goal',
6957
+ value_name: 'show_percentage_in_value',
6958
+ default_value: false,
6959
+ },
6960
+ {
6961
+ element_type: 'checkbox',
6962
+ element_label: 'Segment % out Goal',
6963
+ value_name: 'show_percentage_in_segments',
6964
+ default_value: false,
6965
+ },
6966
+ ]
6967
+ },
6851
6968
  'label_with_percentage': {
6852
6969
  category_class: 'google-visualization-charteditor-mini-more',
6853
6970
  category_label: 'Label',
@@ -7191,6 +7308,73 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
7191
7308
  },
7192
7309
  ]
7193
7310
  },
7311
+ 'tooltips_gauge': {
7312
+ category_class: 'google-visualization-charteditor-mini-more',
7313
+ category_label: 'Tooltip',
7314
+ category_type: 'tooltips',
7315
+ elements: [
7316
+ {
7317
+ element_type: 'toggle',
7318
+ element_label: 'Show',
7319
+ value_name: 'show',
7320
+ default_value: true,
7321
+ },
7322
+ {
7323
+ element_type: 'devider',
7324
+ },
7325
+ {
7326
+ element_type: 'devider',
7327
+ element_label: 'Tooltip Style',
7328
+ },
7329
+ {
7330
+ element_type: 'select',
7331
+ value_name: 'font_style',
7332
+ element_label: 'Font style',
7333
+ element_options: SUBOPTIONS_FONTS,
7334
+ default_value: TOOLTIP_DEFAULT_SETTINGS.FONT_FAMILY,
7335
+ },
7336
+ {
7337
+ element_type: 'select',
7338
+ value_name: 'font_size',
7339
+ element_label: 'Font size',
7340
+ element_options: suboptionsFontSizeValues,
7341
+ default_value: TOOLTIP_DEFAULT_SETTINGS.FONT_SIZE,
7342
+ },
7343
+ {
7344
+ element_type: 'color_picker',
7345
+ value_name: 'font_color',
7346
+ element_label: 'Font Color',
7347
+ default_value: TOOLTIP_DEFAULT_SETTINGS.FONT_COLOR
7348
+ },
7349
+ {
7350
+ element_type: 'devider',
7351
+ },
7352
+ {
7353
+ element_type: 'checkbox',
7354
+ element_label: 'Segment name',
7355
+ value_name: 'show_segment_name',
7356
+ default_value: true,
7357
+ },
7358
+ {
7359
+ element_type: 'checkbox',
7360
+ element_label: 'Goal %',
7361
+ value_name: 'show_percentage_in_goal',
7362
+ default_value: true,
7363
+ },
7364
+ {
7365
+ element_type: 'checkbox',
7366
+ element_label: 'Value %',
7367
+ value_name: 'show_percentage_in_value',
7368
+ default_value: true,
7369
+ },
7370
+ {
7371
+ element_type: 'checkbox',
7372
+ element_label: 'Segments %',
7373
+ value_name: 'show_percentage_in_segments',
7374
+ default_value: true,
7375
+ },
7376
+ ]
7377
+ },
7194
7378
  'negative_number_format': {
7195
7379
  is_hidden: true,
7196
7380
  category_class: 'google-visualization-charteditor-mini-more',
@@ -7392,7 +7576,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
7392
7576
  ],
7393
7577
  default_value: ''
7394
7578
  }]
7395
- },
7579
+ }
7396
7580
  };
7397
7581
 
7398
7582
  highchartsRenderer.chartsTypesInfo = {
@@ -7603,6 +7787,14 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
7603
7787
  legendName: 'Data Series',
7604
7788
  startedMessage: 'To get started, drag one field to the value section. Best practice: Drag one field to the filter section, and filter as required.',
7605
7789
  },
7790
+ [highchartsRenderer.CHART_TYPES.GAUGE_CHART_ENHANCED]: {
7791
+ name: 'Gauge chart',
7792
+ label: 'Gauge',
7793
+ title: 'Measures progress toward a goal or a KPI.',
7794
+ axisName: 'X-Axis',
7795
+ legendName: 'Data Series',
7796
+ startedMessage: 'To get started, drag one field to the value section. Best practice: Drag one field to the filter section, and filter as required.',
7797
+ },
7606
7798
  'kpi-widget': {
7607
7799
  name: 'Kpi ',
7608
7800
  label: 'KPI',
@@ -7995,7 +8187,21 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
7995
8187
  highchartsRenderer.suboptions["negative_number_format"],
7996
8188
  highchartsRenderer.suboptions["legends"],
7997
8189
  ]
7998
- }
8190
+ },
8191
+ {
8192
+ type: highchartsRenderer.CHART_TYPES.GAUGE_CHART_ENHANCED,
8193
+ name: highchartsRenderer.chartsTypesInfo[highchartsRenderer.CHART_TYPES.GAUGE_CHART_ENHANCED].name,
8194
+ class: 'google-visualization-charteditor-thumbs-gauge-solid',
8195
+ hidden: true,
8196
+ render: highchartsRenderer.ptRenderGaugeEnhanced,
8197
+ suboptions: [
8198
+ highchartsRenderer.suboptions["label_gauge"],
8199
+ highchartsRenderer.suboptions["tooltips_gauge"],
8200
+ highchartsRenderer.suboptions["subtitle"],
8201
+ highchartsRenderer.suboptions["table_options_gauge"],
8202
+ highchartsRenderer.suboptions["table_design_options"],
8203
+ ]
8204
+ },
7999
8205
  ]
8000
8206
  },
8001
8207
  {
@@ -49,4 +49,102 @@ describe('dr-renderer-helpers', () => {
49
49
  expect(drRendererHelpers.capitalize(string)).toBe('');
50
50
  });
51
51
  });
52
+
53
+ describe('clamp', () => {
54
+ it('should clamp value between teh boundaries', () => {
55
+ expect(drRendererHelpers.clamp(10, 5, 20)).toBe(10);
56
+ expect(drRendererHelpers.clamp(10, 25, 20)).toBe(20);
57
+ expect(drRendererHelpers.clamp(10, 15, 20)).toBe(15);
58
+ });
59
+ });
60
+
61
+ describe('isNumber', () => {
62
+ it('should check whether the value is a finity number', () => {
63
+ expect(drRendererHelpers.isNumber('number')).toBeFalsy();
64
+ expect(drRendererHelpers.isNumber(Infinity)).toBeFalsy();
65
+ expect(drRendererHelpers.isNumber(12)).toBeTruthy();
66
+ });
67
+ });
68
+
69
+ describe('mergeDeep', () => {
70
+ it('should handle the wrong data', () => {
71
+ expect(drRendererHelpers.mergeDeep([1, 2, 3], { a: 1, b: 2})).toEqual([1, 2, 3]);
72
+ expect(drRendererHelpers.mergeDeep('string', { a: 1, b: 2})).toEqual('string');
73
+ expect(drRendererHelpers.mergeDeep({ a: 1 }, 'string')).toEqual({ a: 1 });
74
+ });
75
+
76
+ it('should not merge arrays and replace instead', () => {
77
+ expect(drRendererHelpers.mergeDeep({
78
+ a: [1, 2, 3]
79
+ }, {
80
+ a: [2, 3, 4]
81
+ })).toEqual({
82
+ a: [2, 3, 4]
83
+ });
84
+ });
85
+
86
+ it('should merge nested objects', () => {
87
+ expect(drRendererHelpers.mergeDeep({
88
+ a: 1,
89
+ b: {
90
+ c: 3,
91
+ d: 4
92
+ }
93
+ },
94
+ {
95
+ b: {
96
+ d: 5,
97
+ e: 6
98
+ },
99
+ c: 7
100
+ })).toEqual({
101
+ a: 1,
102
+ b: {
103
+ c: 3,
104
+ d: 5,
105
+ e: 6,
106
+ },
107
+ c: 7,
108
+ });
109
+ });
110
+
111
+ it('should merge more than 2 objects', () => {
112
+ expect(drRendererHelpers.mergeDeep({
113
+ a: 1,
114
+ b: 2
115
+ },
116
+ {
117
+ b: 3,
118
+ c: 4
119
+ },
120
+ {
121
+ a: 5,
122
+ e: 6
123
+ })).toEqual({
124
+ a: 5,
125
+ b: 3,
126
+ c: 4,
127
+ e: 6
128
+ });
129
+ });
130
+ });
131
+
132
+ describe('removeSVGTextCorrection', () => {
133
+ it('should remove yCorr by default', () => {
134
+ const svg = {
135
+ yCorr: -12
136
+ };
137
+ drRendererHelpers.removeSVGTextCorrection(svg);
138
+ expect(svg.yCorr).toBe(0);
139
+ });
140
+
141
+ it('should remove yCorr by default', () => {
142
+ const svg = {
143
+ xCorr: -12
144
+ };
145
+ drRendererHelpers.removeSVGTextCorrection(svg, 'xCorr');
146
+ svg.xCorr = -20;
147
+ expect(svg.xCorr).toBe(0);
148
+ });
149
+ });
52
150
  });