@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.
- package/package.json +1 -1
- package/src/charts/dr_chart.js +34 -0
- package/src/charts/dr_gauge_chart.js +550 -0
- package/src/dr-renderer-helpers.js +45 -0
- package/src/dr_chart_tooltip.js +279 -0
- package/src/highcharts_renderer.js +213 -6
- package/tests/dr-renderer-helpers.test.js +98 -0
- package/tests/dr_chart_tooltip.test.js +739 -0
- package/tests/dr_gauge_chart.test.js +1932 -0
- package/tests/highcharts_renderer.test.js +195 -0
@@ -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
|
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': '
|
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': '
|
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
|
});
|