@datarailsshared/dr_renderer 1.2.452 → 1.2.454

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