@eclipse-scout/chart 22.0.41 → 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-e25b5923d4dba5f5ca7e.min.css +1 -0
- package/dist/eclipse-scout-chart-theme.css +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 +641 -15109
- 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} +151 -61
- package/src/chart/ChartAdapter.ts +27 -0
- package/src/chart/ChartEventMap.ts +27 -0
- package/src/chart/{ChartJsRenderer.js → ChartJsRenderer.ts} +356 -350
- 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} +50 -36
- 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-8eb9461c14872058f638.min.js +0 -3
- package/dist/eclipse-scout-chart-8eb9461c14872058f638.min.js.LICENSE.txt +0 -6
- package/dist/eclipse-scout-chart-8eb9461c14872058f638.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
|
@@ -8,13 +8,28 @@
|
|
|
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;
|
|
@@ -113,19 +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
|
-
_getValuePercentage(value, minValue, maxValue) {
|
|
135
|
+
protected _getValuePercentage(value: number, minValue: number, maxValue: number): number {
|
|
121
136
|
return this._limitValue((value - minValue) / (maxValue - minValue), 1);
|
|
122
137
|
}
|
|
123
138
|
|
|
124
|
-
_getSegmentToPointAt(valuePercentage, numTotalSegments) {
|
|
139
|
+
protected _getSegmentToPointAt(valuePercentage: number, numTotalSegments: number): number {
|
|
125
140
|
return this._limitValue(Math.floor(valuePercentage * numTotalSegments), numTotalSegments - 1);
|
|
126
141
|
}
|
|
127
142
|
|
|
128
|
-
_limitValue(value, maxValue) {
|
|
143
|
+
protected _limitValue(value: number, maxValue: number): number {
|
|
129
144
|
value = Math.max(value, 0); // cannot be < 0
|
|
130
145
|
value = Math.min(value, maxValue); // cannot be > maxValue
|
|
131
146
|
return value;
|
|
@@ -134,7 +149,7 @@ export default class SpeedoChartRenderer extends AbstractSvgChartRenderer {
|
|
|
134
149
|
/**
|
|
135
150
|
* Gets the percentage value in range [0,1] of the specified segment.
|
|
136
151
|
*/
|
|
137
|
-
_getPercentageValueOfSegment(segmentIndexInPart, part) {
|
|
152
|
+
protected _getPercentageValueOfSegment(segmentIndexInPart: number, part: number): number {
|
|
138
153
|
// get the segment position
|
|
139
154
|
let pointerRange = this._calcSegmentPos(segmentIndexInPart, part);
|
|
140
155
|
|
|
@@ -148,7 +163,7 @@ export default class SpeedoChartRenderer extends AbstractSvgChartRenderer {
|
|
|
148
163
|
/**
|
|
149
164
|
* Renders the pointer line and registers animation to move the pointer and the corresponding filling of the segments
|
|
150
165
|
*/
|
|
151
|
-
_renderPointer(valuePercentage) {
|
|
166
|
+
protected _renderPointer(valuePercentage: number) {
|
|
152
167
|
this.$pointer = this.$svg.appendSVG('path', 'pointer')
|
|
153
168
|
.attr('d', this._pathPointer(0))
|
|
154
169
|
.attr('data-end', valuePercentage)
|
|
@@ -176,7 +191,7 @@ export default class SpeedoChartRenderer extends AbstractSvgChartRenderer {
|
|
|
176
191
|
/**
|
|
177
192
|
* renders a single segment line.
|
|
178
193
|
*/
|
|
179
|
-
_renderSegment(from, to, colorClass) {
|
|
194
|
+
protected _renderSegment(from: number, to: number, colorClass: string): JQuery<SVGElement> {
|
|
180
195
|
return this.$svg.appendSVG('path', 'speedo-chart-arc ' + colorClass)
|
|
181
196
|
.attr('id', 'ArcAxisWide' + this.chart.id)
|
|
182
197
|
.attr('fill', 'none')
|
|
@@ -184,7 +199,7 @@ export default class SpeedoChartRenderer extends AbstractSvgChartRenderer {
|
|
|
184
199
|
.attr('d', this._pathSegment(from, to));
|
|
185
200
|
}
|
|
186
201
|
|
|
187
|
-
_renderCirclePart(part) {
|
|
202
|
+
protected _renderCirclePart(part: number) {
|
|
188
203
|
let colorClass = this._getColorForPart(part);
|
|
189
204
|
// render 'empty' segments
|
|
190
205
|
for (let i = 0; i < this.numSegmentsPerPart; i++) {
|
|
@@ -196,7 +211,7 @@ export default class SpeedoChartRenderer extends AbstractSvgChartRenderer {
|
|
|
196
211
|
this.$filledParts.push(this._renderSegment(SpeedoChartRenderer.ARC_MIN, SpeedoChartRenderer.ARC_MIN, colorClass)); // 'filled' segments. invisible by default
|
|
197
212
|
}
|
|
198
213
|
|
|
199
|
-
_renderLegend(minValue, value, maxValue, groupName) {
|
|
214
|
+
protected _renderLegend(minValue: number, value: number, maxValue: number, groupName: string) {
|
|
200
215
|
let minMaxLegendFontSize = this.scaleWeight * 0.8,
|
|
201
216
|
padding = 5, // same as in AbstractChartRenderer#_renderWireLegend
|
|
202
217
|
labelYPos = this.my + padding,
|
|
@@ -210,7 +225,7 @@ export default class SpeedoChartRenderer extends AbstractSvgChartRenderer {
|
|
|
210
225
|
h: 1
|
|
211
226
|
},
|
|
212
227
|
minLegendValue = minValue ? this._formatValue(minValue) : 0,
|
|
213
|
-
legendValue = value ? this._formatValue(value) : 0,
|
|
228
|
+
legendValue = value ? this._formatValue(value) : '' + 0,
|
|
214
229
|
maxLegendValue = maxValue ? this._formatValue(maxValue) : 0;
|
|
215
230
|
|
|
216
231
|
// tooltip for min/max value
|
|
@@ -239,8 +254,8 @@ export default class SpeedoChartRenderer extends AbstractSvgChartRenderer {
|
|
|
239
254
|
};
|
|
240
255
|
mouseOut();
|
|
241
256
|
this.$svg
|
|
242
|
-
.mouseenter
|
|
243
|
-
.mouseleave
|
|
257
|
+
.on('mouseenter', mouseIn)
|
|
258
|
+
.on('mouseleave', mouseOut);
|
|
244
259
|
}
|
|
245
260
|
|
|
246
261
|
// actual value
|
|
@@ -254,7 +269,7 @@ export default class SpeedoChartRenderer extends AbstractSvgChartRenderer {
|
|
|
254
269
|
/**
|
|
255
270
|
* returns the part index for the specified valuePercentage. The valuePercentage must be in the range [0,1].
|
|
256
271
|
*/
|
|
257
|
-
_getPartForValue(valuePercentage) {
|
|
272
|
+
protected _getPartForValue(valuePercentage: number): number {
|
|
258
273
|
let part = Math.floor(valuePercentage * this.parts);
|
|
259
274
|
return this._limitValue(part, this.parts - 1);
|
|
260
275
|
}
|
|
@@ -266,7 +281,7 @@ export default class SpeedoChartRenderer extends AbstractSvgChartRenderer {
|
|
|
266
281
|
* 10 to 999 thousand: 123k
|
|
267
282
|
* >= 1 million: millions with max. two fraction digits -> 1.23M
|
|
268
283
|
*/
|
|
269
|
-
_formatValue(value) {
|
|
284
|
+
protected _formatValue(value: number): string {
|
|
270
285
|
if (value < SpeedoChartRenderer.TEN_THOUSAND) {
|
|
271
286
|
return this.session.locale.decimalFormat.format(value);
|
|
272
287
|
}
|
|
@@ -281,7 +296,7 @@ export default class SpeedoChartRenderer extends AbstractSvgChartRenderer {
|
|
|
281
296
|
/**
|
|
282
297
|
* Updates the pointer position to point to the specified valuePercentage in range [0,1].
|
|
283
298
|
*/
|
|
284
|
-
_updatePointer(valuePercentage) {
|
|
299
|
+
protected _updatePointer(valuePercentage: number) {
|
|
285
300
|
this.$pointer
|
|
286
301
|
.attr('d', this._pathPointer(valuePercentage))
|
|
287
302
|
.removeClass('red yellow light-green dark-green')
|
|
@@ -291,13 +306,13 @@ export default class SpeedoChartRenderer extends AbstractSvgChartRenderer {
|
|
|
291
306
|
/**
|
|
292
307
|
* Updates the filling of the 'filled' segments to be filled up to the specified valuePercentage in range [0,1].
|
|
293
308
|
*/
|
|
294
|
-
_updatePartsFill(valuePercentage) {
|
|
309
|
+
protected _updatePartsFill(valuePercentage: number) {
|
|
295
310
|
let from, to;
|
|
296
311
|
for (let part = 0; part < this.$filledParts.length; part++) {
|
|
297
|
-
from = this._calcSegmentPos(0, part
|
|
312
|
+
from = this._calcSegmentPos(0, part).from;
|
|
298
313
|
if ((part + 1) / this.parts < valuePercentage) {
|
|
299
314
|
// the current part is smaller than the value: completely filled part
|
|
300
|
-
to = this._calcSegmentPos(this.numSegmentsPerPart - 1, part
|
|
315
|
+
to = this._calcSegmentPos(this.numSegmentsPerPart - 1, part).to;
|
|
301
316
|
} else if (part / this.parts > valuePercentage) {
|
|
302
317
|
// the current part is bigger than the speedo-value: hide element
|
|
303
318
|
from = SpeedoChartRenderer.ARC_MIN;
|
|
@@ -315,7 +330,7 @@ export default class SpeedoChartRenderer extends AbstractSvgChartRenderer {
|
|
|
315
330
|
* @param segmentIndexInPart the index of the segment line within the part.
|
|
316
331
|
* @param part the part index.
|
|
317
332
|
*/
|
|
318
|
-
_calcSegmentPos(segmentIndexInPart, part) {
|
|
333
|
+
protected _calcSegmentPos(segmentIndexInPart: number, part: number): { from: number; to: number } {
|
|
319
334
|
let result = {
|
|
320
335
|
from: 0,
|
|
321
336
|
to: 0
|
|
@@ -326,7 +341,7 @@ export default class SpeedoChartRenderer extends AbstractSvgChartRenderer {
|
|
|
326
341
|
return result;
|
|
327
342
|
}
|
|
328
343
|
|
|
329
|
-
_getColorForPart(part) {
|
|
344
|
+
protected _getColorForPart(part: number): string {
|
|
330
345
|
let position = this.chart.config.options.speedo.greenAreaPosition;
|
|
331
346
|
switch (position) {
|
|
332
347
|
case SpeedoChartRenderer.Position.LEFT:
|
|
@@ -378,7 +393,7 @@ export default class SpeedoChartRenderer extends AbstractSvgChartRenderer {
|
|
|
378
393
|
/**
|
|
379
394
|
* calculates the path-values to be used in the 'd' attribute of the path tag for a segment.
|
|
380
395
|
*/
|
|
381
|
-
_pathSegment(start, end) {
|
|
396
|
+
protected _pathSegment(start: number, end: number): string {
|
|
382
397
|
let s = start * 2 * Math.PI,
|
|
383
398
|
e = end * 2 * Math.PI,
|
|
384
399
|
pathString = '';
|
|
@@ -398,7 +413,7 @@ export default class SpeedoChartRenderer extends AbstractSvgChartRenderer {
|
|
|
398
413
|
/**
|
|
399
414
|
* calculates the path-values to be used in the 'd' attribute of the path tag for the pointer
|
|
400
415
|
*/
|
|
401
|
-
_pathPointer(valuePercentage) {
|
|
416
|
+
protected _pathPointer(valuePercentage: number): string {
|
|
402
417
|
let point = SpeedoChartRenderer.ARC_RANGE * valuePercentage - SpeedoChartRenderer.ARC_MAX;
|
|
403
418
|
let s = point * 2 * Math.PI,
|
|
404
419
|
pointerOuterR = this.r - (1.4 * this.scaleWeight),
|
|
@@ -411,10 +426,7 @@ export default class SpeedoChartRenderer extends AbstractSvgChartRenderer {
|
|
|
411
426
|
return pathString;
|
|
412
427
|
}
|
|
413
428
|
|
|
414
|
-
|
|
415
|
-
* @override
|
|
416
|
-
*/
|
|
417
|
-
_removeAnimated(afterRemoveFunc) {
|
|
429
|
+
protected override _removeAnimated(afterRemoveFunc: (chartAnimationStopping?: boolean) => void) {
|
|
418
430
|
if (this.animationTriggered) {
|
|
419
431
|
return;
|
|
420
432
|
}
|
|
@@ -437,3 +449,5 @@ export default class SpeedoChartRenderer extends AbstractSvgChartRenderer {
|
|
|
437
449
|
});
|
|
438
450
|
}
|
|
439
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
|
+
|