@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.
- package/package.json +1 -1
- package/src/charts/dr_gauge_chart.js +563 -0
- package/src/dr-renderer-helpers.js +45 -0
- package/src/dr_chart_tooltip.js +277 -0
- package/src/highcharts_renderer.js +210 -4
- 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 +1931 -0
- package/tests/highcharts_renderer.test.js +195 -0
@@ -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
|
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
|
});
|