@eclipse-scout/chart 22.0.39 → 23.1.0-beta.4
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/LICENSE +210 -0
- package/dist/d.ts/chart/AbstractChartRenderer.d.ts +48 -0
- package/dist/d.ts/chart/AbstractChartRenderer.d.ts.map +1 -0
- package/dist/d.ts/chart/AbstractSvgChartRenderer.d.ts +65 -0
- package/dist/d.ts/chart/AbstractSvgChartRenderer.d.ts.map +1 -0
- package/dist/d.ts/chart/Chart.d.ts +162 -0
- package/dist/d.ts/chart/Chart.d.ts.map +1 -0
- package/dist/d.ts/chart/ChartAdapter.d.ts +8 -0
- package/dist/d.ts/chart/ChartAdapter.d.ts.map +1 -0
- package/dist/d.ts/chart/ChartEventMap.d.ts +16 -0
- package/dist/d.ts/chart/ChartEventMap.d.ts.map +1 -0
- package/dist/d.ts/chart/ChartJsRenderer.d.ts +300 -0
- package/dist/d.ts/chart/ChartJsRenderer.d.ts.map +1 -0
- package/dist/d.ts/chart/ChartLayout.d.ts +8 -0
- package/dist/d.ts/chart/ChartLayout.d.ts.map +1 -0
- package/dist/d.ts/chart/ChartModel.d.ts +11 -0
- package/dist/d.ts/chart/ChartModel.d.ts.map +1 -0
- package/dist/d.ts/chart/FulfillmentChartRenderer.d.ts +22 -0
- package/dist/d.ts/chart/FulfillmentChartRenderer.d.ts.map +1 -0
- package/dist/d.ts/chart/SalesfunnelChartRenderer.d.ts +61 -0
- package/dist/d.ts/chart/SalesfunnelChartRenderer.d.ts.map +1 -0
- package/dist/d.ts/chart/SpeedoChartRenderer.d.ts +90 -0
- package/dist/d.ts/chart/SpeedoChartRenderer.d.ts.map +1 -0
- package/dist/d.ts/chart/VennAsync3Calculator.d.ts +32 -0
- package/dist/d.ts/chart/VennAsync3Calculator.d.ts.map +1 -0
- package/dist/d.ts/chart/VennChartRenderer.d.ts +36 -0
- package/dist/d.ts/chart/VennChartRenderer.d.ts.map +1 -0
- package/dist/d.ts/chart/VennCircle.d.ts +20 -0
- package/dist/d.ts/chart/VennCircle.d.ts.map +1 -0
- package/dist/d.ts/chart/VennCircleHelper.d.ts +13 -0
- package/dist/d.ts/chart/VennCircleHelper.d.ts.map +1 -0
- package/dist/d.ts/form/fields/chartfield/ChartField.d.ts +11 -0
- package/dist/d.ts/form/fields/chartfield/ChartField.d.ts.map +1 -0
- package/dist/d.ts/form/fields/chartfield/ChartFieldAdapter.d.ts +4 -0
- package/dist/d.ts/form/fields/chartfield/ChartFieldAdapter.d.ts.map +1 -0
- package/dist/d.ts/form/fields/chartfield/ChartFieldModel.d.ts +6 -0
- package/dist/d.ts/form/fields/chartfield/ChartFieldModel.d.ts.map +1 -0
- package/dist/d.ts/index.d.ts +31 -0
- package/dist/d.ts/index.d.ts.map +1 -0
- package/dist/d.ts/table/controls/ChartTableControl.d.ts +136 -0
- package/dist/d.ts/table/controls/ChartTableControl.d.ts.map +1 -0
- package/dist/d.ts/table/controls/ChartTableControlAdapter.d.ts +5 -0
- package/dist/d.ts/table/controls/ChartTableControlAdapter.d.ts.map +1 -0
- package/dist/d.ts/table/controls/ChartTableControlEventMap.d.ts +9 -0
- package/dist/d.ts/table/controls/ChartTableControlEventMap.d.ts.map +1 -0
- package/dist/d.ts/table/controls/ChartTableControlLayout.d.ts +8 -0
- package/dist/d.ts/table/controls/ChartTableControlLayout.d.ts.map +1 -0
- package/dist/d.ts/table/controls/ChartTableControlModel.d.ts +9 -0
- package/dist/d.ts/table/controls/ChartTableControlModel.d.ts.map +1 -0
- package/dist/d.ts/table/controls/ChartTableUserFilter.d.ts +29 -0
- package/dist/d.ts/table/controls/ChartTableUserFilter.d.ts.map +1 -0
- package/dist/d.ts/table/controls/ChartTableUserFilterModel.d.ts +11 -0
- package/dist/d.ts/table/controls/ChartTableUserFilterModel.d.ts.map +1 -0
- package/dist/d.ts/tile/ChartFieldTile.d.ts +14 -0
- package/dist/d.ts/tile/ChartFieldTile.d.ts.map +1 -0
- package/dist/d.ts/tile/ChartFieldTileAdapter.d.ts +4 -0
- package/dist/d.ts/tile/ChartFieldTileAdapter.d.ts.map +1 -0
- package/dist/d.ts/tile/ChartFieldTileModel.d.ts +6 -0
- package/dist/d.ts/tile/ChartFieldTileModel.d.ts.map +1 -0
- package/dist/eclipse-scout-chart-fae6f958a044232e659c.min.js +3 -0
- package/dist/eclipse-scout-chart-fae6f958a044232e659c.min.js.map +1 -0
- package/dist/eclipse-scout-chart-theme-dark-89bcf2022056cbf8e371.min.css +1 -0
- package/dist/eclipse-scout-chart-theme-dark.css +1 -1
- package/dist/eclipse-scout-chart-theme-dark.css.map +1 -1
- package/dist/eclipse-scout-chart-theme-e25b5923d4dba5f5ca7e.min.css +1 -0
- package/dist/eclipse-scout-chart-theme.css +1 -1
- package/dist/eclipse-scout-chart-theme.css.map +1 -1
- package/dist/eclipse-scout-chart.esm-2119cfea86a9d6f34a35.min.js +3 -0
- package/dist/eclipse-scout-chart.esm-2119cfea86a9d6f34a35.min.js.map +1 -0
- package/dist/eclipse-scout-chart.esm.js +6919 -0
- package/dist/eclipse-scout-chart.esm.js.map +1 -0
- package/dist/eclipse-scout-chart.js +683 -15122
- package/dist/eclipse-scout-chart.js.map +1 -1
- package/dist/file-list +8 -5
- package/dist/texts.json +17 -17
- package/package.json +21 -15
- package/src/chart/{AbstractChartRenderer.js → AbstractChartRenderer.ts} +31 -25
- package/src/chart/{AbstractSvgChartRenderer.js → AbstractSvgChartRenderer.ts} +78 -43
- package/src/chart/{Chart.js → Chart.ts} +153 -62
- package/src/chart/ChartAdapter.ts +27 -0
- package/src/chart/ChartEventMap.ts +27 -0
- package/src/chart/{ChartJsRenderer.js → ChartJsRenderer.ts} +367 -351
- package/src/chart/{ChartLayout.js → ChartLayout.ts} +9 -8
- package/src/chart/ChartModel.ts +21 -0
- package/src/chart/{FulfillmentChartRenderer.js → FulfillmentChartRenderer.ts} +21 -18
- package/src/chart/{SalesfunnelChartRenderer.js → SalesfunnelChartRenderer.ts} +96 -59
- package/src/chart/{SpeedoChartRenderer.js → SpeedoChartRenderer.ts} +61 -39
- package/src/chart/{VennAsync3Calculator.js → VennAsync3Calculator.ts} +37 -13
- package/src/chart/{VennChartRenderer.js → VennChartRenderer.ts} +58 -34
- package/src/chart/{VennCircle.js → VennCircle.ts} +22 -15
- package/src/chart/{VennCircleHelper.js → VennCircleHelper.ts} +15 -9
- package/src/form/fields/chartfield/{ChartField.js → ChartField.ts} +11 -5
- package/src/form/fields/chartfield/{ChartFieldAdapter.js → ChartFieldAdapter.ts} +3 -8
- package/src/form/fields/chartfield/ChartFieldModel.ts +16 -0
- package/src/index.ts +46 -0
- package/src/table/controls/{ChartTableControl.js → ChartTableControl.ts} +160 -120
- package/src/table/controls/{ChartTableControlAdapter.js → ChartTableControlAdapter.ts} +3 -4
- package/src/table/controls/ChartTableControlEventMap.ts +19 -0
- package/src/table/controls/{ChartTableControlLayout.js → ChartTableControlLayout.ts} +7 -5
- package/src/table/controls/ChartTableControlModel.ts +19 -0
- package/src/table/controls/{ChartTableUserFilter.js → ChartTableUserFilter.ts} +25 -12
- package/src/table/controls/ChartTableUserFilterModel.ts +19 -0
- package/src/tile/{ChartFieldTile.js → ChartFieldTile.ts} +14 -8
- package/src/tile/{ChartFieldTileAdapter.js → ChartFieldTileAdapter.ts} +3 -7
- package/src/tile/ChartFieldTileModel.ts +16 -0
- package/dist/eclipse-scout-chart-bc08151d11e1909eff6c.min.js +0 -3
- package/dist/eclipse-scout-chart-bc08151d11e1909eff6c.min.js.LICENSE.txt +0 -6
- package/dist/eclipse-scout-chart-bc08151d11e1909eff6c.min.js.map +0 -1
- package/dist/eclipse-scout-chart-theme-79622289bda68b525e3e.min.css +0 -1
- package/dist/eclipse-scout-chart-theme-dark-1de09c03e3dc40a9529a.min.css +0 -1
- package/src/chart/ChartAdapter.js +0 -30
- package/src/index.js +0 -36
|
@@ -1,20 +1,35 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Copyright (c) 2010-
|
|
2
|
+
* Copyright (c) 2010-2022 BSI Business Systems Integration AG.
|
|
3
3
|
* All rights reserved. This program and the accompanying materials
|
|
4
4
|
* are made available under the terms of the Eclipse Public License v1.0
|
|
5
5
|
* which accompanies this distribution, and is available at
|
|
6
|
-
*
|
|
6
|
+
* https://www.eclipse.org/legal/epl-v10.html
|
|
7
7
|
*
|
|
8
8
|
* Contributors:
|
|
9
9
|
* BSI Business Systems Integration AG - initial API and implementation
|
|
10
10
|
*/
|
|
11
|
-
import {numbers, RoundingMode} from '@eclipse-scout/core';
|
|
12
|
-
import {AbstractSvgChartRenderer} from '../index';
|
|
11
|
+
import {EnumObject, numbers, RoundingMode} from '@eclipse-scout/core';
|
|
12
|
+
import {AbstractSvgChartRenderer, Chart} from '../index';
|
|
13
13
|
|
|
14
|
-
export
|
|
14
|
+
export class SpeedoChartRenderer extends AbstractSvgChartRenderer {
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
segmentSelectorForAnimation: string;
|
|
17
|
+
|
|
18
|
+
r: number;
|
|
19
|
+
scaleWeight: number;
|
|
20
|
+
my: number;
|
|
21
|
+
parts: number;
|
|
22
|
+
numSegmentsPerPart: number;
|
|
23
|
+
segmentWidth: number;
|
|
24
|
+
widthOfSegmentWithGap: number;
|
|
25
|
+
animationTriggered: boolean;
|
|
26
|
+
|
|
27
|
+
$filledParts: JQuery<SVGElement>[];
|
|
28
|
+
$pointer: JQuery<SVGElement>;
|
|
29
|
+
|
|
30
|
+
constructor(chart: Chart) {
|
|
17
31
|
super(chart);
|
|
32
|
+
|
|
18
33
|
this.segmentSelectorForAnimation = '.pointer';
|
|
19
34
|
this.suppressLegendBox = true;
|
|
20
35
|
|
|
@@ -32,7 +47,7 @@ export default class SpeedoChartRenderer extends AbstractSvgChartRenderer {
|
|
|
32
47
|
LEFT: 'left',
|
|
33
48
|
CENTER: 'center',
|
|
34
49
|
RIGHT: 'right'
|
|
35
|
-
};
|
|
50
|
+
} as const;
|
|
36
51
|
|
|
37
52
|
static NUM_PARTS_GREEN_CENTER = 7;
|
|
38
53
|
static NUM_PARTS_GREEN_EDGE = 4;
|
|
@@ -47,7 +62,7 @@ export default class SpeedoChartRenderer extends AbstractSvgChartRenderer {
|
|
|
47
62
|
|
|
48
63
|
static SEGMENT_GAP = 0.0103; // space between two segments (lines)
|
|
49
64
|
|
|
50
|
-
_validate() {
|
|
65
|
+
protected override _validate(): boolean {
|
|
51
66
|
let chartData = this.chart.data;
|
|
52
67
|
let chartConfig = this.chart.config;
|
|
53
68
|
if (!chartData ||
|
|
@@ -61,11 +76,11 @@ export default class SpeedoChartRenderer extends AbstractSvgChartRenderer {
|
|
|
61
76
|
return true;
|
|
62
77
|
}
|
|
63
78
|
|
|
64
|
-
_renderInternal() {
|
|
79
|
+
protected override _renderInternal() {
|
|
65
80
|
let chartData = this.chart.data,
|
|
66
|
-
minValue = chartData.chartValueGroups[0].values[0],
|
|
67
|
-
maxValue = chartData.chartValueGroups[0].values[2],
|
|
68
|
-
value = chartData.chartValueGroups[0].values[1];
|
|
81
|
+
minValue = chartData.chartValueGroups[0].values[0] as number,
|
|
82
|
+
maxValue = chartData.chartValueGroups[0].values[2] as number,
|
|
83
|
+
value = chartData.chartValueGroups[0].values[1] as number;
|
|
69
84
|
|
|
70
85
|
// radius of the scale
|
|
71
86
|
this.r = Math.min(this.chartBox.height, this.chartBox.width / 2) * 0.7;
|
|
@@ -95,10 +110,10 @@ export default class SpeedoChartRenderer extends AbstractSvgChartRenderer {
|
|
|
95
110
|
this.widthOfSegmentWithGap = this.segmentWidth + SpeedoChartRenderer.SEGMENT_GAP;
|
|
96
111
|
|
|
97
112
|
// pointer value in range [0,1]
|
|
98
|
-
let valuePercentage = this.
|
|
113
|
+
let valuePercentage = this._getValuePercentage(value, minValue, maxValue);
|
|
99
114
|
|
|
100
|
-
// value in the range [0,1] rounded to one segment
|
|
101
|
-
let segmentToPointAt =
|
|
115
|
+
// value in the range [0,numTotalSegments - 1] rounded to one segment
|
|
116
|
+
let segmentToPointAt = this._getSegmentToPointAt(valuePercentage, numTotalSegments);
|
|
102
117
|
|
|
103
118
|
// value rounded to the closest segment so that the pointer never stays "in between" two segments but always on a segment
|
|
104
119
|
let valuePercentageRounded = this._getPercentageValueOfSegment(segmentToPointAt % this.numSegmentsPerPart,
|
|
@@ -113,11 +128,19 @@ export default class SpeedoChartRenderer extends AbstractSvgChartRenderer {
|
|
|
113
128
|
|
|
114
129
|
this.$svg.addClass('speedo-chart-svg');
|
|
115
130
|
if (this.chart.config.options.clickable) {
|
|
116
|
-
this.$svg.on('click', this._createClickObject(null, null), this.chart.
|
|
131
|
+
this.$svg.on('click', this._createClickObject(null, null), e => this.chart.handleValueClick(e.data));
|
|
117
132
|
}
|
|
118
133
|
}
|
|
119
134
|
|
|
120
|
-
|
|
135
|
+
protected _getValuePercentage(value: number, minValue: number, maxValue: number): number {
|
|
136
|
+
return this._limitValue((value - minValue) / (maxValue - minValue), 1);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
protected _getSegmentToPointAt(valuePercentage: number, numTotalSegments: number): number {
|
|
140
|
+
return this._limitValue(Math.floor(valuePercentage * numTotalSegments), numTotalSegments - 1);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
protected _limitValue(value: number, maxValue: number): number {
|
|
121
144
|
value = Math.max(value, 0); // cannot be < 0
|
|
122
145
|
value = Math.min(value, maxValue); // cannot be > maxValue
|
|
123
146
|
return value;
|
|
@@ -126,7 +149,7 @@ export default class SpeedoChartRenderer extends AbstractSvgChartRenderer {
|
|
|
126
149
|
/**
|
|
127
150
|
* Gets the percentage value in range [0,1] of the specified segment.
|
|
128
151
|
*/
|
|
129
|
-
_getPercentageValueOfSegment(segmentIndexInPart, part) {
|
|
152
|
+
protected _getPercentageValueOfSegment(segmentIndexInPart: number, part: number): number {
|
|
130
153
|
// get the segment position
|
|
131
154
|
let pointerRange = this._calcSegmentPos(segmentIndexInPart, part);
|
|
132
155
|
|
|
@@ -140,7 +163,7 @@ export default class SpeedoChartRenderer extends AbstractSvgChartRenderer {
|
|
|
140
163
|
/**
|
|
141
164
|
* Renders the pointer line and registers animation to move the pointer and the corresponding filling of the segments
|
|
142
165
|
*/
|
|
143
|
-
_renderPointer(valuePercentage) {
|
|
166
|
+
protected _renderPointer(valuePercentage: number) {
|
|
144
167
|
this.$pointer = this.$svg.appendSVG('path', 'pointer')
|
|
145
168
|
.attr('d', this._pathPointer(0))
|
|
146
169
|
.attr('data-end', valuePercentage)
|
|
@@ -168,7 +191,7 @@ export default class SpeedoChartRenderer extends AbstractSvgChartRenderer {
|
|
|
168
191
|
/**
|
|
169
192
|
* renders a single segment line.
|
|
170
193
|
*/
|
|
171
|
-
_renderSegment(from, to, colorClass) {
|
|
194
|
+
protected _renderSegment(from: number, to: number, colorClass: string): JQuery<SVGElement> {
|
|
172
195
|
return this.$svg.appendSVG('path', 'speedo-chart-arc ' + colorClass)
|
|
173
196
|
.attr('id', 'ArcAxisWide' + this.chart.id)
|
|
174
197
|
.attr('fill', 'none')
|
|
@@ -176,7 +199,7 @@ export default class SpeedoChartRenderer extends AbstractSvgChartRenderer {
|
|
|
176
199
|
.attr('d', this._pathSegment(from, to));
|
|
177
200
|
}
|
|
178
201
|
|
|
179
|
-
_renderCirclePart(part) {
|
|
202
|
+
protected _renderCirclePart(part: number) {
|
|
180
203
|
let colorClass = this._getColorForPart(part);
|
|
181
204
|
// render 'empty' segments
|
|
182
205
|
for (let i = 0; i < this.numSegmentsPerPart; i++) {
|
|
@@ -188,7 +211,7 @@ export default class SpeedoChartRenderer extends AbstractSvgChartRenderer {
|
|
|
188
211
|
this.$filledParts.push(this._renderSegment(SpeedoChartRenderer.ARC_MIN, SpeedoChartRenderer.ARC_MIN, colorClass)); // 'filled' segments. invisible by default
|
|
189
212
|
}
|
|
190
213
|
|
|
191
|
-
_renderLegend(minValue, value, maxValue, groupName) {
|
|
214
|
+
protected _renderLegend(minValue: number, value: number, maxValue: number, groupName: string) {
|
|
192
215
|
let minMaxLegendFontSize = this.scaleWeight * 0.8,
|
|
193
216
|
padding = 5, // same as in AbstractChartRenderer#_renderWireLegend
|
|
194
217
|
labelYPos = this.my + padding,
|
|
@@ -202,7 +225,7 @@ export default class SpeedoChartRenderer extends AbstractSvgChartRenderer {
|
|
|
202
225
|
h: 1
|
|
203
226
|
},
|
|
204
227
|
minLegendValue = minValue ? this._formatValue(minValue) : 0,
|
|
205
|
-
legendValue = value ? this._formatValue(value) : 0,
|
|
228
|
+
legendValue = value ? this._formatValue(value) : '' + 0,
|
|
206
229
|
maxLegendValue = maxValue ? this._formatValue(maxValue) : 0;
|
|
207
230
|
|
|
208
231
|
// tooltip for min/max value
|
|
@@ -231,8 +254,8 @@ export default class SpeedoChartRenderer extends AbstractSvgChartRenderer {
|
|
|
231
254
|
};
|
|
232
255
|
mouseOut();
|
|
233
256
|
this.$svg
|
|
234
|
-
.mouseenter
|
|
235
|
-
.mouseleave
|
|
257
|
+
.on('mouseenter', mouseIn)
|
|
258
|
+
.on('mouseleave', mouseOut);
|
|
236
259
|
}
|
|
237
260
|
|
|
238
261
|
// actual value
|
|
@@ -246,7 +269,7 @@ export default class SpeedoChartRenderer extends AbstractSvgChartRenderer {
|
|
|
246
269
|
/**
|
|
247
270
|
* returns the part index for the specified valuePercentage. The valuePercentage must be in the range [0,1].
|
|
248
271
|
*/
|
|
249
|
-
_getPartForValue(valuePercentage) {
|
|
272
|
+
protected _getPartForValue(valuePercentage: number): number {
|
|
250
273
|
let part = Math.floor(valuePercentage * this.parts);
|
|
251
274
|
return this._limitValue(part, this.parts - 1);
|
|
252
275
|
}
|
|
@@ -258,7 +281,7 @@ export default class SpeedoChartRenderer extends AbstractSvgChartRenderer {
|
|
|
258
281
|
* 10 to 999 thousand: 123k
|
|
259
282
|
* >= 1 million: millions with max. two fraction digits -> 1.23M
|
|
260
283
|
*/
|
|
261
|
-
_formatValue(value) {
|
|
284
|
+
protected _formatValue(value: number): string {
|
|
262
285
|
if (value < SpeedoChartRenderer.TEN_THOUSAND) {
|
|
263
286
|
return this.session.locale.decimalFormat.format(value);
|
|
264
287
|
}
|
|
@@ -273,7 +296,7 @@ export default class SpeedoChartRenderer extends AbstractSvgChartRenderer {
|
|
|
273
296
|
/**
|
|
274
297
|
* Updates the pointer position to point to the specified valuePercentage in range [0,1].
|
|
275
298
|
*/
|
|
276
|
-
_updatePointer(valuePercentage) {
|
|
299
|
+
protected _updatePointer(valuePercentage: number) {
|
|
277
300
|
this.$pointer
|
|
278
301
|
.attr('d', this._pathPointer(valuePercentage))
|
|
279
302
|
.removeClass('red yellow light-green dark-green')
|
|
@@ -283,13 +306,13 @@ export default class SpeedoChartRenderer extends AbstractSvgChartRenderer {
|
|
|
283
306
|
/**
|
|
284
307
|
* Updates the filling of the 'filled' segments to be filled up to the specified valuePercentage in range [0,1].
|
|
285
308
|
*/
|
|
286
|
-
_updatePartsFill(valuePercentage) {
|
|
309
|
+
protected _updatePartsFill(valuePercentage: number) {
|
|
287
310
|
let from, to;
|
|
288
311
|
for (let part = 0; part < this.$filledParts.length; part++) {
|
|
289
|
-
from = this._calcSegmentPos(0, part
|
|
312
|
+
from = this._calcSegmentPos(0, part).from;
|
|
290
313
|
if ((part + 1) / this.parts < valuePercentage) {
|
|
291
314
|
// the current part is smaller than the value: completely filled part
|
|
292
|
-
to = this._calcSegmentPos(this.numSegmentsPerPart - 1, part
|
|
315
|
+
to = this._calcSegmentPos(this.numSegmentsPerPart - 1, part).to;
|
|
293
316
|
} else if (part / this.parts > valuePercentage) {
|
|
294
317
|
// the current part is bigger than the speedo-value: hide element
|
|
295
318
|
from = SpeedoChartRenderer.ARC_MIN;
|
|
@@ -307,7 +330,7 @@ export default class SpeedoChartRenderer extends AbstractSvgChartRenderer {
|
|
|
307
330
|
* @param segmentIndexInPart the index of the segment line within the part.
|
|
308
331
|
* @param part the part index.
|
|
309
332
|
*/
|
|
310
|
-
_calcSegmentPos(segmentIndexInPart, part) {
|
|
333
|
+
protected _calcSegmentPos(segmentIndexInPart: number, part: number): { from: number; to: number } {
|
|
311
334
|
let result = {
|
|
312
335
|
from: 0,
|
|
313
336
|
to: 0
|
|
@@ -318,7 +341,7 @@ export default class SpeedoChartRenderer extends AbstractSvgChartRenderer {
|
|
|
318
341
|
return result;
|
|
319
342
|
}
|
|
320
343
|
|
|
321
|
-
_getColorForPart(part) {
|
|
344
|
+
protected _getColorForPart(part: number): string {
|
|
322
345
|
let position = this.chart.config.options.speedo.greenAreaPosition;
|
|
323
346
|
switch (position) {
|
|
324
347
|
case SpeedoChartRenderer.Position.LEFT:
|
|
@@ -370,7 +393,7 @@ export default class SpeedoChartRenderer extends AbstractSvgChartRenderer {
|
|
|
370
393
|
/**
|
|
371
394
|
* calculates the path-values to be used in the 'd' attribute of the path tag for a segment.
|
|
372
395
|
*/
|
|
373
|
-
_pathSegment(start, end) {
|
|
396
|
+
protected _pathSegment(start: number, end: number): string {
|
|
374
397
|
let s = start * 2 * Math.PI,
|
|
375
398
|
e = end * 2 * Math.PI,
|
|
376
399
|
pathString = '';
|
|
@@ -390,7 +413,7 @@ export default class SpeedoChartRenderer extends AbstractSvgChartRenderer {
|
|
|
390
413
|
/**
|
|
391
414
|
* calculates the path-values to be used in the 'd' attribute of the path tag for the pointer
|
|
392
415
|
*/
|
|
393
|
-
_pathPointer(valuePercentage) {
|
|
416
|
+
protected _pathPointer(valuePercentage: number): string {
|
|
394
417
|
let point = SpeedoChartRenderer.ARC_RANGE * valuePercentage - SpeedoChartRenderer.ARC_MAX;
|
|
395
418
|
let s = point * 2 * Math.PI,
|
|
396
419
|
pointerOuterR = this.r - (1.4 * this.scaleWeight),
|
|
@@ -403,10 +426,7 @@ export default class SpeedoChartRenderer extends AbstractSvgChartRenderer {
|
|
|
403
426
|
return pathString;
|
|
404
427
|
}
|
|
405
428
|
|
|
406
|
-
|
|
407
|
-
* @override
|
|
408
|
-
*/
|
|
409
|
-
_removeAnimated(afterRemoveFunc) {
|
|
429
|
+
protected override _removeAnimated(afterRemoveFunc: (chartAnimationStopping?: boolean) => void) {
|
|
410
430
|
if (this.animationTriggered) {
|
|
411
431
|
return;
|
|
412
432
|
}
|
|
@@ -429,3 +449,5 @@ export default class SpeedoChartRenderer extends AbstractSvgChartRenderer {
|
|
|
429
449
|
});
|
|
430
450
|
}
|
|
431
451
|
}
|
|
452
|
+
|
|
453
|
+
export type GreenAreaPosition = EnumObject<typeof SpeedoChartRenderer.Position>;
|
|
@@ -1,20 +1,44 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Copyright (c) 2010-
|
|
2
|
+
* Copyright (c) 2010-2022 BSI Business Systems Integration AG.
|
|
3
3
|
* All rights reserved. This program and the accompanying materials
|
|
4
4
|
* are made available under the terms of the Eclipse Public License v1.0
|
|
5
5
|
* which accompanies this distribution, and is available at
|
|
6
|
-
*
|
|
6
|
+
* https://www.eclipse.org/legal/epl-v10.html
|
|
7
7
|
*
|
|
8
8
|
* Contributors:
|
|
9
9
|
* BSI Business Systems Integration AG - initial API and implementation
|
|
10
10
|
*/
|
|
11
|
-
import {Device} from '@eclipse-scout/core';
|
|
12
11
|
|
|
13
12
|
// place venn 3 by simulation
|
|
14
13
|
// find angle and distance (to a) and radius where "error" is minimal
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
import {VennCircle, VennCircleHelper} from '../index';
|
|
15
|
+
|
|
16
|
+
export class VennAsync3Calculator {
|
|
17
|
+
helper: VennCircleHelper;
|
|
18
|
+
venn1: VennCircle;
|
|
19
|
+
venn2: VennCircle;
|
|
20
|
+
venn3: VennCircle;
|
|
21
|
+
u: number;
|
|
22
|
+
v: number;
|
|
23
|
+
w: number;
|
|
24
|
+
uv: number;
|
|
25
|
+
uw: number;
|
|
26
|
+
vw: number;
|
|
27
|
+
uvw: number;
|
|
28
|
+
|
|
29
|
+
maxD: number;
|
|
30
|
+
dStep: number;
|
|
31
|
+
rStep: number;
|
|
32
|
+
alphaStep: number;
|
|
33
|
+
|
|
34
|
+
alphaBest: number;
|
|
35
|
+
dBest: number;
|
|
36
|
+
rBest: number;
|
|
37
|
+
errorBest: number;
|
|
38
|
+
callback: () => void;
|
|
39
|
+
cancelled: boolean;
|
|
40
|
+
|
|
41
|
+
constructor(helper: VennCircleHelper, venn1: VennCircle, venn2: VennCircle, venn3: VennCircle, u: number, v: number, w: number, uv: number, uw: number, vw: number, uvw: number, d12: number, d13: number, d23: number) {
|
|
18
42
|
// if circles are empty, they are drawn as small circle, so: adjust u v w to find better errors
|
|
19
43
|
if (u === 0 && uv === 0 && uw === 0 && uvw === 0) {
|
|
20
44
|
u = 1;
|
|
@@ -38,13 +62,13 @@ export default class VennAsync3Calculator {
|
|
|
38
62
|
this.vw = vw;
|
|
39
63
|
this.uvw = uvw;
|
|
40
64
|
|
|
41
|
-
|
|
65
|
+
/** step and ranges for loops */
|
|
42
66
|
this.maxD = this.venn1.r + 2 * this.venn2.r + 2 * this.venn1.r + this.helper.distR;
|
|
43
67
|
this.dStep = this.maxD / 30;
|
|
44
68
|
this.rStep = venn3.r / 4;
|
|
45
69
|
this.alphaStep = Math.PI / 30;
|
|
46
70
|
|
|
47
|
-
|
|
71
|
+
/** best vars (initialize with 0 so the optimizer knows that they are numbers) */
|
|
48
72
|
this.alphaBest = 0;
|
|
49
73
|
this.dBest = 0;
|
|
50
74
|
this.rBest = 0;
|
|
@@ -54,7 +78,7 @@ export default class VennAsync3Calculator {
|
|
|
54
78
|
this.cancelled = false;
|
|
55
79
|
}
|
|
56
80
|
|
|
57
|
-
start(callback) {
|
|
81
|
+
start(callback: () => void) {
|
|
58
82
|
this.callback = callback;
|
|
59
83
|
setTimeout(this._next.bind(this, 0));
|
|
60
84
|
}
|
|
@@ -63,7 +87,7 @@ export default class VennAsync3Calculator {
|
|
|
63
87
|
this.cancelled = true;
|
|
64
88
|
}
|
|
65
89
|
|
|
66
|
-
_end() {
|
|
90
|
+
protected _end() {
|
|
67
91
|
// set x and y and r of venn3
|
|
68
92
|
this.venn3.x = this.venn1.x + this.dBest * Math.cos(this.alphaBest);
|
|
69
93
|
this.venn3.y = this.venn1.y - this.dBest * Math.sin(this.alphaBest);
|
|
@@ -72,7 +96,7 @@ export default class VennAsync3Calculator {
|
|
|
72
96
|
this.callback();
|
|
73
97
|
}
|
|
74
98
|
|
|
75
|
-
_next(alpha) {
|
|
99
|
+
protected _next(alpha: number) {
|
|
76
100
|
if (!this.cancelled) {
|
|
77
101
|
// iterate
|
|
78
102
|
this._iteration(alpha);
|
|
@@ -91,7 +115,7 @@ export default class VennAsync3Calculator {
|
|
|
91
115
|
}
|
|
92
116
|
}
|
|
93
117
|
|
|
94
|
-
_iteration(alpha) {
|
|
118
|
+
protected _iteration(alpha: number) {
|
|
95
119
|
// optimize speed: no var lookup (should help the optimizer in general, and IE in particular)
|
|
96
120
|
let maxD = this.maxD,
|
|
97
121
|
dStep = this.dStep,
|
|
@@ -197,7 +221,7 @@ export default class VennAsync3Calculator {
|
|
|
197
221
|
this.errorBest = errorBest;
|
|
198
222
|
}
|
|
199
223
|
|
|
200
|
-
_error(u, total, a, aTotal) {
|
|
224
|
+
protected _error(u: number, total: number, a: number, aTotal: number): number {
|
|
201
225
|
// be brutal if basic error
|
|
202
226
|
if ((u === 0 && a !== 0) || (u !== 0 && a === 0)) {
|
|
203
227
|
return 1000;
|
|
@@ -3,17 +3,41 @@
|
|
|
3
3
|
* All rights reserved. This program and the accompanying materials
|
|
4
4
|
* are made available under the terms of the Eclipse Public License v1.0
|
|
5
5
|
* which accompanies this distribution, and is available at
|
|
6
|
-
*
|
|
6
|
+
* https://www.eclipse.org/legal/epl-v10.html
|
|
7
7
|
*
|
|
8
8
|
* Contributors:
|
|
9
9
|
* BSI Business Systems Integration AG - initial API and implementation
|
|
10
10
|
*/
|
|
11
|
-
import {AbstractSvgChartRenderer, VennAsync3Calculator, VennCircle, VennCircleHelper} from '../index';
|
|
11
|
+
import {AbstractSvgChartRenderer, Chart, VennAsync3Calculator, VennCircle, VennCircleHelper} from '../index';
|
|
12
12
|
import $ from 'jquery';
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
import {ChartValueGroup} from './Chart';
|
|
14
|
+
import {LegendPositions} from './AbstractSvgChartRenderer';
|
|
15
|
+
|
|
16
|
+
export class VennChartRenderer extends AbstractSvgChartRenderer {
|
|
17
|
+
animationTriggered: boolean;
|
|
18
|
+
|
|
19
|
+
data: ChartValueGroup[];
|
|
20
|
+
centerX: number;
|
|
21
|
+
centerY: number;
|
|
22
|
+
numberOfCircles: number;
|
|
23
|
+
readyToDraw: boolean;
|
|
24
|
+
wasCircle: boolean;
|
|
25
|
+
|
|
26
|
+
vennCircleHelper: VennCircleHelper;
|
|
27
|
+
async3Calculator: VennAsync3Calculator;
|
|
28
|
+
|
|
29
|
+
vennNumber1: VennCircle;
|
|
30
|
+
vennReal1: VennCircle;
|
|
31
|
+
vennNumber2: VennCircle;
|
|
32
|
+
vennReal2: VennCircle;
|
|
33
|
+
vennNumber3: VennCircle;
|
|
34
|
+
vennReal3: VennCircle;
|
|
35
|
+
|
|
36
|
+
$v1: JQuery<SVGElement>;
|
|
37
|
+
$v2: JQuery<SVGElement>;
|
|
38
|
+
$v3: JQuery<SVGElement>;
|
|
39
|
+
|
|
40
|
+
constructor(chart: Chart) {
|
|
17
41
|
super(chart);
|
|
18
42
|
this.animationTriggered = false;
|
|
19
43
|
this.suppressLegendBox = true;
|
|
@@ -28,7 +52,7 @@ export default class VennChartRenderer extends AbstractSvgChartRenderer {
|
|
|
28
52
|
chart.config = $.extend(true, {}, defaultConfig, chart.config);
|
|
29
53
|
}
|
|
30
54
|
|
|
31
|
-
_validate() {
|
|
55
|
+
protected override _validate(): boolean {
|
|
32
56
|
let chartData = this.chart.data;
|
|
33
57
|
if (!chartData ||
|
|
34
58
|
chartData.axes.length !== 0 ||
|
|
@@ -39,12 +63,12 @@ export default class VennChartRenderer extends AbstractSvgChartRenderer {
|
|
|
39
63
|
return true;
|
|
40
64
|
}
|
|
41
65
|
|
|
42
|
-
_renderInternal() {
|
|
66
|
+
protected override _renderInternal() {
|
|
43
67
|
this.centerX = this.width / 2;
|
|
44
68
|
this.centerY = this.height / 2;
|
|
45
69
|
|
|
46
70
|
if (this.centerX === 0 || this.centerY === 0) {
|
|
47
|
-
return
|
|
71
|
+
return;
|
|
48
72
|
}
|
|
49
73
|
|
|
50
74
|
// basic values
|
|
@@ -56,7 +80,7 @@ export default class VennChartRenderer extends AbstractSvgChartRenderer {
|
|
|
56
80
|
maxR = Math.min(this.centerX, this.centerY),
|
|
57
81
|
minR = maxR / 15,
|
|
58
82
|
total = this.data.reduce((s, e) => {
|
|
59
|
-
return s +
|
|
83
|
+
return s + (e.values[0] as number);
|
|
60
84
|
}, 1);
|
|
61
85
|
|
|
62
86
|
this.vennCircleHelper = new VennCircleHelper(distR, maxR, minR, total);
|
|
@@ -112,16 +136,16 @@ export default class VennChartRenderer extends AbstractSvgChartRenderer {
|
|
|
112
136
|
}
|
|
113
137
|
}
|
|
114
138
|
|
|
115
|
-
remove(requestAnimation, afterRemoveFunc) {
|
|
139
|
+
override remove(requestAnimation = false, afterRemoveFunc?: (chartAnimationStopping?: boolean) => void) {
|
|
116
140
|
this._cancelAsync3Calculator();
|
|
117
141
|
super.remove(requestAnimation, afterRemoveFunc);
|
|
118
142
|
}
|
|
119
143
|
|
|
120
144
|
// calculation
|
|
121
145
|
|
|
122
|
-
_calc1(v1) {
|
|
146
|
+
protected _calc1(v1: VennCircle) {
|
|
123
147
|
// set basic data
|
|
124
|
-
let a = this.data[0].values[0];
|
|
148
|
+
let a = this.data[0].values[0] as number;
|
|
125
149
|
|
|
126
150
|
// calc sizes
|
|
127
151
|
if (a > 0) {
|
|
@@ -138,11 +162,11 @@ export default class VennChartRenderer extends AbstractSvgChartRenderer {
|
|
|
138
162
|
v1.addLabel(a, v1.x, v1.y);
|
|
139
163
|
}
|
|
140
164
|
|
|
141
|
-
_calc2(v1, v2, real) {
|
|
165
|
+
protected _calc2(v1: VennCircle, v2: VennCircle, real: boolean) {
|
|
142
166
|
// set basic data
|
|
143
|
-
let a = this.data[0].values[0];
|
|
144
|
-
let b = this.data[1].values[0];
|
|
145
|
-
let ab = this.data[2].values[0];
|
|
167
|
+
let a = this.data[0].values[0] as number;
|
|
168
|
+
let b = this.data[1].values[0] as number;
|
|
169
|
+
let ab = this.data[2].values[0] as number;
|
|
146
170
|
let d12;
|
|
147
171
|
|
|
148
172
|
if (real) {
|
|
@@ -199,15 +223,15 @@ export default class VennChartRenderer extends AbstractSvgChartRenderer {
|
|
|
199
223
|
}
|
|
200
224
|
}
|
|
201
225
|
|
|
202
|
-
_calc3(v1, v2, v3, real, callback) {
|
|
226
|
+
protected _calc3(v1: VennCircle, v2: VennCircle, v3: VennCircle, real: boolean, callback: () => void) {
|
|
203
227
|
// set basic data
|
|
204
|
-
let a = this.data[0].values[0];
|
|
205
|
-
let b = this.data[1].values[0];
|
|
206
|
-
let c = this.data[2].values[0];
|
|
207
|
-
let ab = this.data[3].values[0];
|
|
208
|
-
let ac = this.data[4].values[0];
|
|
209
|
-
let bc = this.data[5].values[0];
|
|
210
|
-
let abc = this.data[6].values[0];
|
|
228
|
+
let a = this.data[0].values[0] as number;
|
|
229
|
+
let b = this.data[1].values[0] as number;
|
|
230
|
+
let c = this.data[2].values[0] as number;
|
|
231
|
+
let ab = this.data[3].values[0] as number;
|
|
232
|
+
let ac = this.data[4].values[0] as number;
|
|
233
|
+
let bc = this.data[5].values[0] as number;
|
|
234
|
+
let abc = this.data[6].values[0] as number;
|
|
211
235
|
|
|
212
236
|
let d12, d13, d23;
|
|
213
237
|
|
|
@@ -279,7 +303,7 @@ export default class VennChartRenderer extends AbstractSvgChartRenderer {
|
|
|
279
303
|
}
|
|
280
304
|
}
|
|
281
305
|
|
|
282
|
-
_cancelAsync3Calculator() {
|
|
306
|
+
protected _cancelAsync3Calculator() {
|
|
283
307
|
if (this.async3Calculator) {
|
|
284
308
|
this.async3Calculator.cancel();
|
|
285
309
|
this.async3Calculator = null;
|
|
@@ -288,7 +312,7 @@ export default class VennChartRenderer extends AbstractSvgChartRenderer {
|
|
|
288
312
|
|
|
289
313
|
// drawing
|
|
290
314
|
|
|
291
|
-
_draw(animated, real) {
|
|
315
|
+
protected _draw(animated: boolean, real: boolean) {
|
|
292
316
|
if (!this.rendered && !this.rendering) { // additional check, because this method might be called from a setTimeout()
|
|
293
317
|
return;
|
|
294
318
|
}
|
|
@@ -337,7 +361,7 @@ export default class VennChartRenderer extends AbstractSvgChartRenderer {
|
|
|
337
361
|
}
|
|
338
362
|
|
|
339
363
|
// handling of circles
|
|
340
|
-
_createCircle(circleIndex, color, cssClass) {
|
|
364
|
+
protected _createCircle(circleIndex: number, color: string, cssClass: string): JQuery<SVGElement> {
|
|
341
365
|
let $circle = this.$svg.appendSVG('circle', 'venn-circle')
|
|
342
366
|
.attr('cx', this.centerX)
|
|
343
367
|
.attr('cy', this.centerY)
|
|
@@ -358,14 +382,14 @@ export default class VennChartRenderer extends AbstractSvgChartRenderer {
|
|
|
358
382
|
}
|
|
359
383
|
|
|
360
384
|
if (this.chart.config.options.clickable) {
|
|
361
|
-
$circle.on('click', this._createClickObject(null, circleIndex), this.chart.
|
|
385
|
+
$circle.on('click', this._createClickObject(null, circleIndex), e => this.chart.handleValueClick(e.data));
|
|
362
386
|
}
|
|
363
387
|
|
|
364
388
|
return $circle;
|
|
365
389
|
}
|
|
366
390
|
|
|
367
391
|
// handling of venn, label and legend
|
|
368
|
-
_updateVenn(venn, animated) {
|
|
392
|
+
protected _updateVenn(venn: VennCircle, animated: boolean) {
|
|
369
393
|
// move circle
|
|
370
394
|
venn.$circle
|
|
371
395
|
.animateSVG('cx', this.centerX + venn.x, animated ? this.animationDuration : 0, null, true)
|
|
@@ -386,12 +410,12 @@ export default class VennChartRenderer extends AbstractSvgChartRenderer {
|
|
|
386
410
|
y2: y2,
|
|
387
411
|
v: venn.legendV,
|
|
388
412
|
h: venn.legendH
|
|
389
|
-
};
|
|
413
|
+
} as LegendPositions;
|
|
390
414
|
|
|
391
415
|
this._renderWireLegend(venn.legend, legendPositions, 'venn-legend');
|
|
392
416
|
}
|
|
393
417
|
|
|
394
|
-
_drawLabel(text, dx, dy, animated) {
|
|
418
|
+
protected _drawLabel(text: number, dx: number, dy: number, animated: boolean) {
|
|
395
419
|
// draw label
|
|
396
420
|
let $label = this.$svg.appendSVG('text', 'venn-label')
|
|
397
421
|
.attr('x', this.centerX + dx)
|
|
@@ -407,7 +431,7 @@ export default class VennChartRenderer extends AbstractSvgChartRenderer {
|
|
|
407
431
|
}
|
|
408
432
|
|
|
409
433
|
// handling of show/hide numbers
|
|
410
|
-
_show(event) {
|
|
434
|
+
protected _show(event: JQuery.MouseEventBase) {
|
|
411
435
|
if (this.numberOfCircles === 1) {
|
|
412
436
|
return; // Nothing to do for only one circle
|
|
413
437
|
}
|
|
@@ -418,7 +442,7 @@ export default class VennChartRenderer extends AbstractSvgChartRenderer {
|
|
|
418
442
|
// check if true enter or just from one circle to another
|
|
419
443
|
let isCircle = toElement && $(toElement).hasClass('venn-circle');
|
|
420
444
|
if (this.wasCircle && isCircle) {
|
|
421
|
-
return
|
|
445
|
+
return;
|
|
422
446
|
}
|
|
423
447
|
this.wasCircle = isCircle;
|
|
424
448
|
|
|
@@ -1,37 +1,37 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Copyright (c) 2010-
|
|
2
|
+
* Copyright (c) 2010-2022 BSI Business Systems Integration AG.
|
|
3
3
|
* All rights reserved. This program and the accompanying materials
|
|
4
4
|
* are made available under the terms of the Eclipse Public License v1.0
|
|
5
5
|
* which accompanies this distribution, and is available at
|
|
6
|
-
*
|
|
6
|
+
* https://www.eclipse.org/legal/epl-v10.html
|
|
7
7
|
*
|
|
8
8
|
* Contributors:
|
|
9
9
|
* BSI Business Systems Integration AG - initial API and implementation
|
|
10
10
|
*/
|
|
11
|
-
|
|
11
|
+
export class VennCircle {
|
|
12
|
+
labels: Label[];
|
|
13
|
+
$circle: JQuery<SVGElement>;
|
|
14
|
+
x: number;
|
|
15
|
+
y: number;
|
|
16
|
+
r: number;
|
|
17
|
+
legend: string;
|
|
18
|
+
legendR: number;
|
|
19
|
+
legendH: -1 | 1;
|
|
20
|
+
legendV: -1 | 1;
|
|
12
21
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
constructor($circle) {
|
|
22
|
+
constructor($circle: JQuery<SVGElement>) {
|
|
16
23
|
this.$circle = $circle;
|
|
17
|
-
this.x;
|
|
18
|
-
this.y;
|
|
19
|
-
this.r;
|
|
20
|
-
this.legend;
|
|
21
|
-
this.legendR;
|
|
22
|
-
this.legendH;
|
|
23
|
-
this.legendV;
|
|
24
24
|
this.labels = [];
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
setLegend(legend, horizontal, vertical, r) {
|
|
27
|
+
setLegend(legend: string, horizontal: -1 | 1, vertical: -1 | 1, r?: number) {
|
|
28
28
|
this.legend = legend;
|
|
29
29
|
this.legendH = horizontal;
|
|
30
30
|
this.legendV = vertical;
|
|
31
31
|
this.legendR = r || this.r;
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
addLabel(text, x, y) {
|
|
34
|
+
addLabel(text: number, x: number, y: number) {
|
|
35
35
|
this.labels.push({
|
|
36
36
|
text: text,
|
|
37
37
|
x: x,
|
|
@@ -39,3 +39,10 @@ export default class VennCircle {
|
|
|
39
39
|
});
|
|
40
40
|
}
|
|
41
41
|
}
|
|
42
|
+
|
|
43
|
+
export type Label = {
|
|
44
|
+
text: number;
|
|
45
|
+
x: number;
|
|
46
|
+
y: number;
|
|
47
|
+
};
|
|
48
|
+
|