@esfaenza/es-charts 13.1.2 → 13.1.6
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/esm2020/lib/adapters/BaseAdapter.mjs +50 -0
- package/esm2020/lib/adapters/IBaseAdapter.mjs +2 -0
- package/esm2020/lib/components/base/base-chart.component.mjs +20 -5
- package/esm2020/lib/components/chart-pager/chart-pager.component.mjs +1 -1
- package/esm2020/lib/components/specializations/es-area-chart.component.mjs +11 -10
- package/esm2020/lib/components/specializations/es-chart.component.mjs +24 -11
- package/esm2020/lib/components/specializations/es-line-chart.component.mjs +12 -11
- package/esm2020/lib/components/specializations/es-pie-chart.component.mjs +11 -10
- package/esm2020/lib/components/specializations/es-vertical-2d-chart.component.mjs +11 -10
- package/esm2020/lib/components/specializations/es-vertical-chart.component.mjs +11 -10
- package/esm2020/lib/components/specializations/es-vertical-stacked-chart.component.mjs +11 -10
- package/esm2020/lib/es-charts.module.mjs +13 -5
- package/esm2020/lib/models/core/ChartDispatcher.mjs +91 -0
- package/esm2020/lib/models/core/ChartLoader.mjs +201 -0
- package/esm2020/lib/models/core/ChartThemes.mjs +61 -0
- package/esm2020/lib/models/data/AreaChartData.mjs +16 -0
- package/esm2020/lib/models/data/LineChartData.mjs +16 -0
- package/esm2020/lib/models/data/PagedChartData.mjs +20 -0
- package/esm2020/lib/models/data/PieChartData.mjs +14 -0
- package/esm2020/lib/models/data/Vertical2DChartData.mjs +16 -0
- package/esm2020/lib/models/data/VerticalChartData.mjs +14 -0
- package/esm2020/lib/models/data/VerticalStackedChartData.mjs +14 -0
- package/esm2020/lib/models/data/base/DateValue.mjs +11 -0
- package/esm2020/lib/models/data/base/KeyValue.mjs +11 -0
- package/esm2020/lib/models/data/base/KeyValueColor.mjs +12 -0
- package/esm2020/lib/models/data/base/Limit.mjs +15 -0
- package/esm2020/lib/models/data/base/LineSerie.mjs +24 -0
- package/esm2020/lib/models/settings/AreaChartSettings.mjs +11 -0
- package/esm2020/lib/models/settings/LineChartSettings.mjs +11 -0
- package/esm2020/lib/models/settings/PieChartSettings.mjs +7 -0
- package/esm2020/lib/models/settings/Vertical2DChartSettings.mjs +11 -0
- package/esm2020/lib/models/settings/VerticalChartSettings.mjs +11 -0
- package/esm2020/lib/models/settings/VerticalStackedChartSettings.mjs +11 -0
- package/esm2020/lib/models/settings/base/BaseInterval.mjs +6 -0
- package/esm2020/lib/models/settings/base/BaseSettings.mjs +6 -0
- package/esm2020/lib/models/settings/base/LegendPad.mjs +6 -0
- package/esm2020/lib/services/AreaChartService.mjs +134 -0
- package/esm2020/lib/services/LineChartService.mjs +337 -0
- package/esm2020/lib/services/PieChartService.mjs +111 -0
- package/esm2020/lib/services/Vertical2DChartService.mjs +160 -0
- package/esm2020/lib/services/VerticalChartService.mjs +103 -0
- package/esm2020/lib/services/VerticalStackedChartService.mjs +124 -0
- package/esm2020/lib/services/base/IBaseService.mjs +2 -0
- package/esm2020/public-api.mjs +26 -25
- package/fesm2015/esfaenza-es-charts.mjs +420 -393
- package/fesm2015/esfaenza-es-charts.mjs.map +1 -1
- package/fesm2020/esfaenza-es-charts.mjs +409 -382
- package/fesm2020/esfaenza-es-charts.mjs.map +1 -1
- package/lib/adapters/{classes/BaseAdapter.d.ts → BaseAdapter.d.ts} +6 -1
- package/lib/adapters/{classes/IBaseAdapter.d.ts → IBaseAdapter.d.ts} +6 -1
- package/lib/components/base/base-chart.component.d.ts +20 -5
- package/lib/components/chart-pager/chart-pager.component.d.ts +1 -1
- package/lib/components/specializations/es-area-chart.component.d.ts +6 -4
- package/lib/components/specializations/es-chart.component.d.ts +17 -5
- package/lib/components/specializations/es-line-chart.component.d.ts +6 -4
- package/lib/components/specializations/es-pie-chart.component.d.ts +6 -4
- package/lib/components/specializations/es-vertical-2d-chart.component.d.ts +6 -4
- package/lib/components/specializations/es-vertical-chart.component.d.ts +6 -4
- package/lib/components/specializations/es-vertical-stacked-chart.component.d.ts +6 -4
- package/lib/models/core/{classes/ChartDispatcher.d.ts → ChartDispatcher.d.ts} +0 -0
- package/lib/models/core/{classes/ChartLoader.d.ts → ChartLoader.d.ts} +0 -0
- package/lib/models/core/{classes/ChartThemes.d.ts → ChartThemes.d.ts} +0 -0
- package/lib/models/data/{classes/AreaChartData.d.ts → AreaChartData.d.ts} +1 -1
- package/lib/models/data/{classes/LineChartData.d.ts → LineChartData.d.ts} +0 -0
- package/lib/models/data/{classes/PagedChartData.d.ts → PagedChartData.d.ts} +0 -0
- package/lib/models/data/{classes/PieChartData.d.ts → PieChartData.d.ts} +0 -0
- package/lib/models/data/{classes/Vertical2DChartData.d.ts → Vertical2DChartData.d.ts} +0 -0
- package/lib/models/data/{classes/VerticalChartData.d.ts → VerticalChartData.d.ts} +0 -0
- package/lib/models/data/{classes/VerticalStackedChartData.d.ts → VerticalStackedChartData.d.ts} +0 -0
- package/lib/models/data/{classes/base → base}/DateValue.d.ts +0 -0
- package/lib/models/data/{classes/base → base}/KeyValue.d.ts +0 -0
- package/lib/models/data/{classes/base → base}/KeyValueColor.d.ts +0 -0
- package/lib/models/data/{classes/base → base}/Limit.d.ts +0 -0
- package/lib/models/data/{classes/base → base}/LineSerie.d.ts +1 -1
- package/lib/models/settings/{classes/AreaChartSettings.d.ts → AreaChartSettings.d.ts} +0 -0
- package/lib/models/settings/{classes/LineChartSettings.d.ts → LineChartSettings.d.ts} +0 -0
- package/lib/models/settings/{classes/PieChartSettings.d.ts → PieChartSettings.d.ts} +0 -0
- package/lib/models/settings/{classes/Vertical2DChartSettings.d.ts → Vertical2DChartSettings.d.ts} +0 -0
- package/lib/models/settings/{classes/VerticalChartSettings.d.ts → VerticalChartSettings.d.ts} +0 -0
- package/lib/models/settings/{classes/VerticalStackedChartSettings.d.ts → VerticalStackedChartSettings.d.ts} +0 -0
- package/lib/models/settings/{classes/base → base}/BaseInterval.d.ts +0 -0
- package/lib/models/settings/{classes/base → base}/BaseSettings.d.ts +1 -1
- package/lib/models/settings/{classes/base → base}/LegendPad.d.ts +0 -0
- package/lib/services/{classes/AreaChartService.d.ts → AreaChartService.d.ts} +3 -3
- package/lib/services/{classes/LineChartService.d.ts → LineChartService.d.ts} +7 -3
- package/lib/services/{classes/PieChartService.d.ts → PieChartService.d.ts} +3 -3
- package/lib/services/{classes/Vertical2DChartService.d.ts → Vertical2DChartService.d.ts} +3 -3
- package/lib/services/{classes/VerticalChartService.d.ts → VerticalChartService.d.ts} +3 -3
- package/lib/services/{classes/VerticalStackedChartService.d.ts → VerticalStackedChartService.d.ts} +3 -3
- package/lib/services/{classes/base → base}/IBaseService.d.ts +1 -1
- package/package.json +2 -2
- package/public-api.d.ts +25 -24
- package/esm2020/lib/adapters/classes/BaseAdapter.mjs +0 -50
- package/esm2020/lib/adapters/classes/IBaseAdapter.mjs +0 -2
- package/esm2020/lib/adapters/index.mjs +0 -3
- package/esm2020/lib/components/index.mjs +0 -9
- package/esm2020/lib/models/core/classes/ChartDispatcher.mjs +0 -91
- package/esm2020/lib/models/core/classes/ChartLoader.mjs +0 -201
- package/esm2020/lib/models/core/classes/ChartThemes.mjs +0 -61
- package/esm2020/lib/models/core/index.mjs +0 -4
- package/esm2020/lib/models/data/classes/AreaChartData.mjs +0 -16
- package/esm2020/lib/models/data/classes/LineChartData.mjs +0 -16
- package/esm2020/lib/models/data/classes/PagedChartData.mjs +0 -20
- package/esm2020/lib/models/data/classes/PieChartData.mjs +0 -14
- package/esm2020/lib/models/data/classes/Vertical2DChartData.mjs +0 -16
- package/esm2020/lib/models/data/classes/VerticalChartData.mjs +0 -14
- package/esm2020/lib/models/data/classes/VerticalStackedChartData.mjs +0 -14
- package/esm2020/lib/models/data/classes/base/DateValue.mjs +0 -11
- package/esm2020/lib/models/data/classes/base/KeyValue.mjs +0 -11
- package/esm2020/lib/models/data/classes/base/KeyValueColor.mjs +0 -12
- package/esm2020/lib/models/data/classes/base/Limit.mjs +0 -15
- package/esm2020/lib/models/data/classes/base/LineSerie.mjs +0 -24
- package/esm2020/lib/models/data/index.mjs +0 -13
- package/esm2020/lib/models/settings/classes/AreaChartSettings.mjs +0 -11
- package/esm2020/lib/models/settings/classes/LineChartSettings.mjs +0 -11
- package/esm2020/lib/models/settings/classes/PieChartSettings.mjs +0 -7
- package/esm2020/lib/models/settings/classes/Vertical2DChartSettings.mjs +0 -11
- package/esm2020/lib/models/settings/classes/VerticalChartSettings.mjs +0 -11
- package/esm2020/lib/models/settings/classes/VerticalStackedChartSettings.mjs +0 -11
- package/esm2020/lib/models/settings/classes/base/BaseInterval.mjs +0 -6
- package/esm2020/lib/models/settings/classes/base/BaseSettings.mjs +0 -6
- package/esm2020/lib/models/settings/classes/base/LegendPad.mjs +0 -6
- package/esm2020/lib/models/settings/index.mjs +0 -10
- package/esm2020/lib/services/classes/AreaChartService.mjs +0 -134
- package/esm2020/lib/services/classes/LineChartService.mjs +0 -324
- package/esm2020/lib/services/classes/PieChartService.mjs +0 -111
- package/esm2020/lib/services/classes/Vertical2DChartService.mjs +0 -160
- package/esm2020/lib/services/classes/VerticalChartService.mjs +0 -103
- package/esm2020/lib/services/classes/VerticalStackedChartService.mjs +0 -124
- package/esm2020/lib/services/classes/base/IBaseService.mjs +0 -2
- package/esm2020/lib/services/index.mjs +0 -8
- package/lib/adapters/index.d.ts +0 -2
- package/lib/components/index.d.ts +0 -8
- package/lib/models/core/index.d.ts +0 -3
- package/lib/models/data/index.d.ts +0 -12
- package/lib/models/settings/index.d.ts +0 -9
- package/lib/services/index.d.ts +0 -7
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import * as am4core from "@amcharts/amcharts4/core";
|
|
2
|
+
import * as am4charts from "@amcharts/amcharts4/charts";
|
|
3
|
+
/**
|
|
4
|
+
* Classe il cui unico scopo è gestire il setup e rendering di un PieChart
|
|
5
|
+
*/
|
|
6
|
+
export class PieChartService {
|
|
7
|
+
/** @ignore */
|
|
8
|
+
constructor(Adapter) {
|
|
9
|
+
this.Adapter = Adapter;
|
|
10
|
+
/** @ignore */
|
|
11
|
+
this.ViewAbsoluteValues = true;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Metodo che data una coppia Dati - Impostazioni li utilizza per creare e visualizzare un PieChart
|
|
15
|
+
*/
|
|
16
|
+
graphicate(data, settings) {
|
|
17
|
+
if (settings.Timeline) {
|
|
18
|
+
console.error("Timeline not supported for pie chart");
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
//Per evitare di dimenticarmeli e gestire comunque bene gli ngif ecc...
|
|
22
|
+
am4core.options.autoDispose = true;
|
|
23
|
+
this.ChartInstance = am4core.create(settings.Name, settings.Mode3D ? am4charts.PieChart3D : am4charts.PieChart);
|
|
24
|
+
this.ChartInstance.innerRadius = ((settings.DonutRadiusPercentage || 15) / 100) * settings.ContainerHeight;
|
|
25
|
+
let series = this.ChartInstance.series.push(settings.Mode3D ? new am4charts.PieSeries3D() : new am4charts.PieSeries());
|
|
26
|
+
series.dataFields.value = "v";
|
|
27
|
+
series.dataFields.category = "k";
|
|
28
|
+
//Il default sono valori percentuali
|
|
29
|
+
if (this.ViewAbsoluteValues) {
|
|
30
|
+
series.legendSettings.valueText = "{value}";
|
|
31
|
+
series.labels.template.text = "{category}: [bold]{value}[/]";
|
|
32
|
+
}
|
|
33
|
+
series.slices.template.stroke = am4core.color("#fff");
|
|
34
|
+
series.slices.template.strokeOpacity = 1;
|
|
35
|
+
series.slices.template.togglable = false;
|
|
36
|
+
series.hiddenState.properties.opacity = 1;
|
|
37
|
+
series.hiddenState.properties.endAngle = -90;
|
|
38
|
+
series.hiddenState.properties.startAngle = -90;
|
|
39
|
+
if (settings.HideZeroes == null ? true : settings.HideZeroes) {
|
|
40
|
+
series.ticks.template.events.on("ready", this.hideZeroes);
|
|
41
|
+
series.ticks.template.events.on("visibilitychanged", this.hideZeroes);
|
|
42
|
+
series.labels.template.events.on("ready", this.hideZeroes);
|
|
43
|
+
series.labels.template.events.on("visibilitychanged", this.hideZeroes);
|
|
44
|
+
}
|
|
45
|
+
series.slices.template.events.on("hit", (ev) => {
|
|
46
|
+
if (settings.OnSeriesClickCallback) {
|
|
47
|
+
let clickedSeries = ev.target.dataItem.dataContext.k;
|
|
48
|
+
settings.OnSeriesClickCallback(clickedSeries);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
let dataConverted = this.Adapter ? this.Adapter.adaptDataForPieChart(data) : data;
|
|
52
|
+
let defaultIndex = 0;
|
|
53
|
+
for (let i = 0; i < dataConverted.values.length; i++) {
|
|
54
|
+
if (!dataConverted.values[i].c) {
|
|
55
|
+
dataConverted.values[i].c = this.ChartInstance.colors.list[defaultIndex % this.ChartInstance.colors.list.length];
|
|
56
|
+
defaultIndex++;
|
|
57
|
+
}
|
|
58
|
+
else
|
|
59
|
+
dataConverted.values[i].c = am4core.color(dataConverted.values[i].c);
|
|
60
|
+
}
|
|
61
|
+
series.slices.template.propertyFields.fill = "c";
|
|
62
|
+
this.ChartInstance.data = dataConverted.values;
|
|
63
|
+
if (!settings.LabelsVisible) {
|
|
64
|
+
series.labels.template.disabled = true;
|
|
65
|
+
series.ticks.template.disabled = true;
|
|
66
|
+
}
|
|
67
|
+
else if (settings.LabelsWrap || settings.LabelsTruncate) {
|
|
68
|
+
series.labels.template.maxWidth = settings.LabelsWidth || 100;
|
|
69
|
+
if (settings.LabelsWrap)
|
|
70
|
+
series.labels.template.wrap = true;
|
|
71
|
+
else if (settings.LabelsTruncate)
|
|
72
|
+
series.labels.template.truncate = true;
|
|
73
|
+
}
|
|
74
|
+
if (settings.Legend) {
|
|
75
|
+
let legend = new am4charts.Legend();
|
|
76
|
+
this.ChartInstance.legend = legend;
|
|
77
|
+
legend.position = settings?.LegendPosition || "bottom";
|
|
78
|
+
legend.itemContainers.template.togglable = settings.HideSeriesOnLabelClick === true;
|
|
79
|
+
legend.itemContainers.template.tooltipText = "{category}";
|
|
80
|
+
//Se la legenda non fa il toggle della serie la considero come se fosse un click sulla serie in se
|
|
81
|
+
if (!settings.HideSeriesOnLabelClick) {
|
|
82
|
+
legend.itemContainers.template.events.on("hit", (ev) => {
|
|
83
|
+
if (settings.OnSeriesClickCallback) {
|
|
84
|
+
let clickedSeries = ev.target.dataItem.dataContext.legendDataItem.name;
|
|
85
|
+
settings.OnSeriesClickCallback(clickedSeries);
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
if (settings.LegendPadding) {
|
|
90
|
+
let template = this.ChartInstance.legend.itemContainers.template;
|
|
91
|
+
template.paddingTop = settings.LegendPadding.top ?? 0;
|
|
92
|
+
template.paddingBottom = settings.LegendPadding.bottom ?? 0;
|
|
93
|
+
template.paddingLeft = settings.LegendPadding.left ?? 0;
|
|
94
|
+
template.paddingRight = settings.LegendPadding.right ?? 0;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return this;
|
|
98
|
+
}
|
|
99
|
+
/** @ignore */
|
|
100
|
+
refreshData(data) {
|
|
101
|
+
//TODO:IMPL
|
|
102
|
+
}
|
|
103
|
+
/** @ignore */
|
|
104
|
+
hideZeroes(ev) {
|
|
105
|
+
if (ev.target.dataItem && (ev.target.dataItem.values.value.percent == 0))
|
|
106
|
+
ev.target.hide();
|
|
107
|
+
else
|
|
108
|
+
ev.target.show();
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGllQ2hhcnRTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXMtY2hhcnRzL3NyYy9saWIvc2VydmljZXMvUGllQ2hhcnRTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU1BLE9BQU8sS0FBSyxPQUFPLE1BQU0sMEJBQTBCLENBQUM7QUFDcEQsT0FBTyxLQUFLLFNBQVMsTUFBTSw0QkFBNEIsQ0FBQztBQUV4RDs7R0FFRztBQUNILE1BQU0sT0FBTyxlQUFlO0lBTXhCLGNBQWM7SUFDZCxZQUFtQixPQUFvQjtRQUFwQixZQUFPLEdBQVAsT0FBTyxDQUFhO1FBSnZDLGNBQWM7UUFDTix1QkFBa0IsR0FBWSxJQUFJLENBQUM7SUFHQSxDQUFDO0lBRTVDOztPQUVHO0lBQ0ksVUFBVSxDQUFDLElBQXdCLEVBQUUsUUFBMEI7UUFDbEUsSUFBSSxRQUFRLENBQUMsUUFBUSxFQUFFO1lBQ25CLE9BQU8sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztZQUN0RCxPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsdUVBQXVFO1FBQ3ZFLE9BQU8sQ0FBQyxPQUFPLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUVuQyxJQUFJLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEgsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsSUFBSSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBUyxRQUFTLENBQUMsZUFBZSxDQUFDO1FBRWxILElBQUksTUFBTSxHQUFnRCxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJ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LFFBQVEsQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDO2FBQzdEO1NBQ0o7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsY0FBYztJQUNQLFdBQVcsQ0FBQyxJQUF3QjtRQUN2QyxXQUFXO0lBQ2YsQ0FBQztJQUVELGNBQWM7SUFDTixVQUFVLENBQUMsRUFBRTtRQUNqQixJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDO1lBQ3BFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7O1lBRWpCLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDekIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUJhc2VTZXJ2aWNlIH0gZnJvbSAnLi9iYXNlL0lCYXNlU2VydmljZSc7XHJcbmltcG9ydCB7IEJhc2VBZGFwdGVyIH0gZnJvbSAnLi4vYWRhcHRlcnMvQmFzZUFkYXB0ZXInO1xyXG5pbXBvcnQgeyBQaWVDaGFydERhdGEgfSBmcm9tICcuLi9tb2RlbHMvZGF0YS9QaWVDaGFydERhdGEnO1xyXG5pbXBvcnQgeyBLZXlWYWx1ZUNvbG9yIH0gZnJvbSAnLi4vbW9kZWxzL2RhdGEvYmFzZS9LZXlWYWx1ZUNvbG9yJztcclxuaW1wb3J0IHsgUGllQ2hhcnRTZXR0aW5ncyB9IGZyb20gJy4uL21vZGVscy9zZXR0aW5ncy9QaWVDaGFydFNldHRpbmdzJztcclxuXHJcbmltcG9ydCAqIGFzIGFtNGNvcmUgZnJvbSBcIkBhbWNoYXJ0cy9hbWNoYXJ0czQvY29yZVwiO1xyXG5pbXBvcnQgKiBhcyBhbTRjaGFydHMgZnJvbSBcIkBhbWNoYXJ0cy9hbWNoYXJ0czQvY2hhcnRzXCI7XHJcblxyXG4vKipcclxuICogQ2xhc3NlIGlsIGN1aSB1bmljbyBzY29wbyDDqCBnZXN0aXJlIGlsIHNldHVwIGUgcmVuZGVyaW5nIGRpIHVuIFBpZUNoYXJ0XHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgUGllQ2hhcnRTZXJ2aWNlIGltcGxlbWVudHMgSUJhc2VTZXJ2aWNlPGFtNGNoYXJ0cy5QaWVDaGFydD57XHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcHVibGljIENoYXJ0SW5zdGFuY2U6IGFtNGNoYXJ0cy5QaWVDaGFydDNEIHwgYW00Y2hhcnRzLlBpZUNoYXJ0O1xyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHByaXZhdGUgVmlld0Fic29sdXRlVmFsdWVzOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgY29uc3RydWN0b3IocHVibGljIEFkYXB0ZXI6IEJhc2VBZGFwdGVyKSB7IH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldG9kbyBjaGUgZGF0YSB1bmEgY29wcGlhIERhdGkgLSBJbXBvc3RhemlvbmkgbGkgdXRpbGl6emEgcGVyIGNyZWFyZSBlIHZpc3VhbGl6emFyZSB1biBQaWVDaGFydFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ3JhcGhpY2F0ZShkYXRhOiBQaWVDaGFydERhdGEgfCBhbnksIHNldHRpbmdzOiBQaWVDaGFydFNldHRpbmdzKTogSUJhc2VTZXJ2aWNlPGFtNGNoYXJ0cy5QaWVDaGFydD4ge1xyXG4gICAgICAgIGlmIChzZXR0aW5ncy5UaW1lbGluZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiVGltZWxpbmUgbm90IHN1cHBvcnRlZCBmb3IgcGllIGNoYXJ0XCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vUGVyIGV2aXRhcmUgZGkgZGltZW50aWNhcm1lbGkgZSBnZXN0aXJlIGNvbXVucXVlIGJlbmUgZ2xpIG5naWYgZWNjLi4uXHJcbiAgICAgICAgYW00Y29yZS5vcHRpb25zLmF1dG9EaXNwb3NlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgdGhpcy5DaGFydEluc3RhbmNlID0gYW00Y29yZS5jcmVhdGUoc2V0dGluZ3MuTmFtZSwgc2V0dGluZ3MuTW9kZTNEID8gYW00Y2hhcnRzLlBpZUNoYXJ0M0QgOiBhbTRjaGFydHMuUGllQ2hhcnQpO1xyXG4gICAgICAgIHRoaXMuQ2hhcnRJbnN0YW5jZS5pbm5lclJhZGl1cyA9ICgoc2V0dGluZ3MuRG9udXRSYWRpdXNQZXJjZW50YWdlIHx8IDE1KSAvIDEwMCkgKiAoPGFueT5zZXR0aW5ncykuQ29udGFpbmVySGVpZ2h0O1xyXG5cclxuICAgICAgICBsZXQgc2VyaWVzOiBhbTRjaGFydHMuUGllU2VyaWVzM0QgfCBhbTRjaGFydHMuUGllU2VyaWVzID0gdGhpcy5DaGFydEluc3RhbmNlLnNlcmllcy5wdXNoKHNldHRpbmdzLk1vZGUzRCA/IG5ldyBhbTRjaGFydHMuUGllU2VyaWVzM0QoKSA6IG5ldyBhbTRjaGFydHMuUGllU2VyaWVzKCkpO1xyXG4gICAgICAgIHNlcmllcy5kYXRhRmllbGRzLnZhbHVlID0gXCJ2XCI7XHJcbiAgICAgICAgc2VyaWVzLmRhdGFGaWVsZHMuY2F0ZWdvcnkgPSBcImtcIjtcclxuICAgICAgICAvL0lsIGRlZmF1bHQgc29ubyB2YWxvcmkgcGVyY2VudHVhbGlcclxuICAgICAgICBpZiAodGhpcy5WaWV3QWJzb2x1dGVWYWx1ZXMpIHtcclxuICAgICAgICAgICAgc2VyaWVzLmxlZ2VuZFNldHRpbmdzLnZhbHVlVGV4dCA9IFwie3ZhbHVlfVwiO1xyXG4gICAgICAgICAgICBzZXJpZXMubGFiZWxzLnRlbXBsYXRlLnRleHQgPSBcIntjYXRlZ29yeX06IFtib2xkXXt2YWx1ZX1bL11cIlxyXG4gICAgICAgIH1cclxuICAgICAgICBzZXJpZXMuc2xpY2VzLnRlbXBsYXRlLnN0cm9rZSA9IGFtNGNvcmUuY29sb3IoXCIjZmZmXCIpO1xyXG4gICAgICAgIHNlcmllcy5zbGljZXMudGVtcGxhdGUuc3Ryb2tlT3BhY2l0eSA9IDE7XHJcbiAgICAgICAgc2VyaWVzLnNsaWNlcy50ZW1wbGF0ZS50b2dnbGFibGUgPSBmYWxzZTtcclxuICAgICAgICBzZXJpZXMuaGlkZGVuU3RhdGUucHJvcGVydGllcy5vcGFjaXR5ID0gMTtcclxuICAgICAgICBzZXJpZXMuaGlkZGVuU3RhdGUucHJvcGVydGllcy5lbmRBbmdsZSA9IC05MDtcclxuICAgICAgICBzZXJpZXMuaGlkZGVuU3RhdGUucHJvcGVydGllcy5zdGFydEFuZ2xlID0gLTkwO1xyXG5cclxuICAgICAgICBpZiAoc2V0dGluZ3MuSGlkZVplcm9lcyA9PSBudWxsID8gdHJ1ZSA6IHNldHRpbmdzLkhpZGVaZXJvZXMpIHtcclxuICAgICAgICAgICAgc2VyaWVzLnRpY2tzLnRlbXBsYXRlLmV2ZW50cy5vbihcInJlYWR5XCIsIHRoaXMuaGlkZVplcm9lcyk7XHJcbiAgICAgICAgICAgIHNlcmllcy50aWNrcy50ZW1wbGF0ZS5ldmVudHMub24oXCJ2aXNpYmlsaXR5Y2hhbmdlZFwiLCB0aGlzLmhpZGVaZXJvZXMpO1xyXG4gICAgICAgICAgICBzZXJpZXMubGFiZWxzLnRlbXBsYXRlLmV2ZW50cy5vbihcInJlYWR5XCIsIHRoaXMuaGlkZVplcm9lcyk7XHJcbiAgICAgICAgICAgIHNlcmllcy5sYWJlbHMudGVtcGxhdGUuZXZlbnRzLm9uKFwidmlzaWJpbGl0eWNoYW5nZWRcIiwgdGhpcy5oaWRlWmVyb2VzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNlcmllcy5zbGljZXMudGVtcGxhdGUuZXZlbnRzLm9uKFwiaGl0XCIsIChldikgPT4ge1xyXG4gICAgICAgICAgICBpZiAoKDxhbnk+c2V0dGluZ3MpLk9uU2VyaWVzQ2xpY2tDYWxsYmFjaykge1xyXG4gICAgICAgICAgICAgICAgbGV0IGNsaWNrZWRTZXJpZXMgPSAoPEtleVZhbHVlQ29sb3I+ZXYudGFyZ2V0LmRhdGFJdGVtLmRhdGFDb250ZXh0KS5rO1xyXG4gICAgICAgICAgICAgICAgKDxhbnk+c2V0dGluZ3MpLk9uU2VyaWVzQ2xpY2tDYWxsYmFjayhjbGlja2VkU2VyaWVzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBsZXQgZGF0YUNvbnZlcnRlZDogUGllQ2hhcnREYXRhID0gdGhpcy5BZGFwdGVyID8gdGhpcy5BZGFwdGVyLmFkYXB0RGF0YUZvclBpZUNoYXJ0KGRhdGEpIDogZGF0YTtcclxuXHJcbiAgICAgICAgbGV0IGRlZmF1bHRJbmRleCA9IDA7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhQ29udmVydGVkLnZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoIWRhdGFDb252ZXJ0ZWQudmFsdWVzW2ldLmMpIHtcclxuICAgICAgICAgICAgICAgIGRhdGFDb252ZXJ0ZWQudmFsdWVzW2ldLmMgPSA8YW55PnRoaXMuQ2hhcnRJbnN0YW5jZS5jb2xvcnMubGlzdFtkZWZhdWx0SW5kZXggJSB0aGlzLkNoYXJ0SW5zdGFuY2UuY29sb3JzLmxpc3QubGVuZ3RoXTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHRJbmRleCsrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIGRhdGFDb252ZXJ0ZWQudmFsdWVzW2ldLmMgPSA8YW55PmFtNGNvcmUuY29sb3IoZGF0YUNvbnZlcnRlZC52YWx1ZXNbaV0uYylcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNlcmllcy5zbGljZXMudGVtcGxhdGUucHJvcGVydHlGaWVsZHMuZmlsbCA9IFwiY1wiO1xyXG4gICAgICAgIHRoaXMuQ2hhcnRJbnN0YW5jZS5kYXRhID0gZGF0YUNvbnZlcnRlZC52YWx1ZXM7XHJcblxyXG4gICAgICAgIGlmICghc2V0dGluZ3MuTGFiZWxzVmlzaWJsZSkge1xyXG4gICAgICAgICAgICBzZXJpZXMubGFiZWxzLnRlbXBsYXRlLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgc2VyaWVzLnRpY2tzLnRlbXBsYXRlLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc2V0dGluZ3MuTGFiZWxzV3JhcCB8fCBzZXR0aW5ncy5MYWJlbHNUcnVuY2F0ZSkge1xyXG4gICAgICAgICAgICBzZXJpZXMubGFiZWxzLnRlbXBsYXRlLm1heFdpZHRoID0gc2V0dGluZ3MuTGFiZWxzV2lkdGggfHwgMTAwO1xyXG4gICAgICAgICAgICBpZiAoc2V0dGluZ3MuTGFiZWxzV3JhcClcclxuICAgICAgICAgICAgICAgIHNlcmllcy5sYWJlbHMudGVtcGxhdGUud3JhcCA9IHRydWU7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHNldHRpbmdzLkxhYmVsc1RydW5jYXRlKVxyXG4gICAgICAgICAgICAgICAgc2VyaWVzLmxhYmVscy50ZW1wbGF0ZS50cnVuY2F0ZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2V0dGluZ3MuTGVnZW5kKSB7XHJcbiAgICAgICAgICAgIGxldCBsZWdlbmQgPSBuZXcgYW00Y2hhcnRzLkxlZ2VuZCgpO1xyXG4gICAgICAgICAgICB0aGlzLkNoYXJ0SW5zdGFuY2UubGVnZW5kID0gbGVnZW5kXHJcbiAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IHNldHRpbmdzPy5MZWdlbmRQb3NpdGlvbiB8fCBcImJvdHRvbVwiO1xyXG4gICAgICAgICAgICBsZWdlbmQuaXRlbUNvbnRhaW5lcnMudGVtcGxhdGUudG9nZ2xhYmxlID0gc2V0dGluZ3MuSGlkZVNlcmllc09uTGFiZWxDbGljayA9PT0gdHJ1ZTtcclxuICAgICAgICAgICAgbGVnZW5kLml0ZW1Db250YWluZXJzLnRlbXBsYXRlLnRvb2x0aXBUZXh0ID0gXCJ7Y2F0ZWdvcnl9XCI7XHJcblxyXG4gICAgICAgICAgICAvL1NlIGxhIGxlZ2VuZGEgbm9uIGZhIGlsIHRvZ2dsZSBkZWxsYSBzZXJpZSBsYSBjb25zaWRlcm8gY29tZSBzZSBmb3NzZSB1biBjbGljayBzdWxsYSBzZXJpZSBpbiBzZVxyXG4gICAgICAgICAgICBpZiAoIXNldHRpbmdzLkhpZGVTZXJpZXNPbkxhYmVsQ2xpY2spIHtcclxuICAgICAgICAgICAgICAgIGxlZ2VuZC5pdGVtQ29udGFpbmVycy50ZW1wbGF0ZS5ldmVudHMub24oXCJoaXRcIiwgKGV2KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCg8YW55PnNldHRpbmdzKS5PblNlcmllc0NsaWNrQ2FsbGJhY2spIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNsaWNrZWRTZXJpZXMgPSAoPGFueT5ldi50YXJnZXQuZGF0YUl0ZW0uZGF0YUNvbnRleHQpLmxlZ2VuZERhdGFJdGVtLm5hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICg8YW55PnNldHRpbmdzKS5PblNlcmllc0NsaWNrQ2FsbGJhY2soY2xpY2tlZFNlcmllcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChzZXR0aW5ncy5MZWdlbmRQYWRkaW5nKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdGVtcGxhdGUgPSB0aGlzLkNoYXJ0SW5zdGFuY2UubGVnZW5kLml0ZW1Db250YWluZXJzLnRlbXBsYXRlO1xyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGUucGFkZGluZ1RvcCA9IHNldHRpbmdzLkxlZ2VuZFBhZGRpbmcudG9wID8/IDA7XHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZS5wYWRkaW5nQm90dG9tID0gc2V0dGluZ3MuTGVnZW5kUGFkZGluZy5ib3R0b20gPz8gMDtcclxuICAgICAgICAgICAgICAgIHRlbXBsYXRlLnBhZGRpbmdMZWZ0ID0gc2V0dGluZ3MuTGVnZW5kUGFkZGluZy5sZWZ0ID8/IDA7XHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZS5wYWRkaW5nUmlnaHQgPSBzZXR0aW5ncy5MZWdlbmRQYWRkaW5nLnJpZ2h0ID8/IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwdWJsaWMgcmVmcmVzaERhdGEoZGF0YTogUGllQ2hhcnREYXRhIHwgYW55KXtcclxuICAgICAgICAvL1RPRE86SU1QTFxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwcml2YXRlIGhpZGVaZXJvZXMoZXYpIHtcclxuICAgICAgICBpZiAoZXYudGFyZ2V0LmRhdGFJdGVtICYmIChldi50YXJnZXQuZGF0YUl0ZW0udmFsdWVzLnZhbHVlLnBlcmNlbnQgPT0gMCkpXHJcbiAgICAgICAgICAgIGV2LnRhcmdldC5oaWRlKCk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBldi50YXJnZXQuc2hvdygpO1xyXG4gICAgfVxyXG59Il19
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import * as am4core from "@amcharts/amcharts4/core";
|
|
2
|
+
import * as am4charts from "@amcharts/amcharts4/charts";
|
|
3
|
+
/**
|
|
4
|
+
* Classe il cui unico scopo è gestire il setup e rendering di un Vertical2DChart
|
|
5
|
+
*/
|
|
6
|
+
export class Vertical2DChartService {
|
|
7
|
+
/** @ignore */
|
|
8
|
+
constructor(Adapter) {
|
|
9
|
+
this.Adapter = Adapter;
|
|
10
|
+
/** @ignore */
|
|
11
|
+
this.DefaultGroupPaddingPercentage = 5;
|
|
12
|
+
/** @ignore */
|
|
13
|
+
this.dangerZone = 50;
|
|
14
|
+
/** @ignore */
|
|
15
|
+
this.LabelWidth = 150;
|
|
16
|
+
/** @ignore */
|
|
17
|
+
this.LabelRightWhenCompressed = 20;
|
|
18
|
+
/** @ignore */
|
|
19
|
+
this.LabelTopWhenCompressed = -5;
|
|
20
|
+
/** @ignore */
|
|
21
|
+
this.DefaultColumnWidthPercentage = 85;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Metodo che data una coppia Dati - Impostazioni li utilizza per creare e visualizzare un Vertical2DChart
|
|
25
|
+
*/
|
|
26
|
+
graphicate(data, settings) {
|
|
27
|
+
if (settings.Timeline) {
|
|
28
|
+
console.error("Timeline not supported for vertical chart");
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
//Per evitare di dimenticarmeli e gestire comunque bene gli ngif ecc...
|
|
32
|
+
am4core.options.autoDispose = true;
|
|
33
|
+
this.ChartInstance = am4core.create(settings.Name, am4charts.XYChart);
|
|
34
|
+
let ChartInstanceCasted = this.ChartInstance;
|
|
35
|
+
if (settings.Legend) {
|
|
36
|
+
ChartInstanceCasted.legend = new am4charts.Legend();
|
|
37
|
+
ChartInstanceCasted.legend.position = settings?.LegendPosition ?? 'right';
|
|
38
|
+
ChartInstanceCasted.legend.itemContainers.template.tooltipText = "{category}";
|
|
39
|
+
if (settings.LegendPadding) {
|
|
40
|
+
let template = this.ChartInstance.legend.itemContainers.template;
|
|
41
|
+
template.paddingTop = settings.LegendPadding.top ?? 0;
|
|
42
|
+
template.paddingBottom = settings.LegendPadding.bottom ?? 0;
|
|
43
|
+
template.paddingLeft = settings.LegendPadding.left ?? 0;
|
|
44
|
+
template.paddingRight = settings.LegendPadding.right ?? 0;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
let yAxis = ChartInstanceCasted.yAxes.push(new am4charts.ValueAxis());
|
|
48
|
+
if (settings.YAxisTitle) {
|
|
49
|
+
yAxis.title.text = settings.YAxisTitle;
|
|
50
|
+
yAxis.title.fontWeight = "bold";
|
|
51
|
+
}
|
|
52
|
+
let categoryAxis = ChartInstanceCasted.xAxes.push(new am4charts.CategoryAxis());
|
|
53
|
+
if (settings.XAxisTitle) {
|
|
54
|
+
categoryAxis.title.text = settings.XAxisTitle;
|
|
55
|
+
categoryAxis.title.fontWeight = "bold";
|
|
56
|
+
}
|
|
57
|
+
yAxis.min = 0;
|
|
58
|
+
categoryAxis.dataFields.category = 'key';
|
|
59
|
+
categoryAxis.renderer.cellStartLocation = am4core.percent(settings.GroupPaddingPercentage ?? this.DefaultGroupPaddingPercentage).value;
|
|
60
|
+
categoryAxis.renderer.cellEndLocation = am4core.percent(100 - (settings.GroupPaddingPercentage ?? this.DefaultGroupPaddingPercentage)).value;
|
|
61
|
+
categoryAxis.renderer.grid.template.location = 0;
|
|
62
|
+
categoryAxis.renderer.minGridDistance = settings?.MinGridDistance ?? 30;
|
|
63
|
+
let label = categoryAxis.renderer.labels.template;
|
|
64
|
+
label.truncate = true;
|
|
65
|
+
label.maxWidth = settings.LabelWidth ?? this.LabelWidth;
|
|
66
|
+
label.tooltipText = "{category}";
|
|
67
|
+
if (settings?.AdaptLabelSizeAndOrientation == null ? true : settings?.AdaptLabelSizeAndOrientation) {
|
|
68
|
+
categoryAxis.events.on("sizechanged", (ev) => {
|
|
69
|
+
let axis = ev.target;
|
|
70
|
+
var cellWidth = axis.pixelWidth / (axis.endIndex - axis.startIndex);
|
|
71
|
+
if (cellWidth < axis.renderer.labels.template.maxWidth) {
|
|
72
|
+
let areWeInDangerZone = cellWidth < (settings?.LabelVerticalOrientationCutoffWidth ?? this.dangerZone);
|
|
73
|
+
axis.renderer.labels.template.rotation = areWeInDangerZone ? -90 : -45;
|
|
74
|
+
axis.renderer.labels.template.dx = settings.LabelRightWhenCompressed ?? areWeInDangerZone ? 0 : this.LabelRightWhenCompressed;
|
|
75
|
+
axis.renderer.labels.template.dy = settings.LabelTopWhenCompressed ?? this.LabelTopWhenCompressed;
|
|
76
|
+
axis.renderer.labels.template.horizontalCenter = "right";
|
|
77
|
+
axis.renderer.labels.template.verticalCenter = "middle";
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
axis.renderer.labels.template.rotation = 0;
|
|
81
|
+
axis.renderer.labels.template.dx = 0;
|
|
82
|
+
axis.renderer.labels.template.dy = 0;
|
|
83
|
+
axis.renderer.labels.template.horizontalCenter = "middle";
|
|
84
|
+
axis.renderer.labels.template.verticalCenter = "top";
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
let dataPreConverted = this.Adapter ? this.Adapter.adaptDataForVertical2DChart(data) : data;
|
|
89
|
+
let dataConverted = [];
|
|
90
|
+
for (let i = 0; i < dataPreConverted.groups.length; i++) {
|
|
91
|
+
let item = dataPreConverted.groups[i];
|
|
92
|
+
let obj = { key: item.name };
|
|
93
|
+
for (let p = 0; p < item.values.length; p++) {
|
|
94
|
+
let value = item.values[p];
|
|
95
|
+
obj[value.k] = value.v;
|
|
96
|
+
}
|
|
97
|
+
dataConverted.push(obj);
|
|
98
|
+
}
|
|
99
|
+
ChartInstanceCasted.data = dataConverted;
|
|
100
|
+
if (dataPreConverted.colorInfos)
|
|
101
|
+
ChartInstanceCasted.colors.list = dataPreConverted.colorInfos.map(c => am4core.color(c.color));
|
|
102
|
+
//Prendo la prima categoria e mi baso sulle proprietà per dfeinire le serie
|
|
103
|
+
for (let prop in dataConverted[0])
|
|
104
|
+
if (prop !== "key")
|
|
105
|
+
this.createSeries(ChartInstanceCasted, settings, prop, prop);
|
|
106
|
+
return this;
|
|
107
|
+
}
|
|
108
|
+
/** @ignore */
|
|
109
|
+
refreshData(data) {
|
|
110
|
+
//TODO:IMPL
|
|
111
|
+
}
|
|
112
|
+
/** @ignore */
|
|
113
|
+
createSeries(chart, settings, value, name) {
|
|
114
|
+
let series = chart.series.push(new am4charts.ColumnSeries());
|
|
115
|
+
series.dataFields.valueY = value;
|
|
116
|
+
series.dataFields.categoryX = 'key';
|
|
117
|
+
series.name = name;
|
|
118
|
+
series.columns.template.tooltipText = "{name} {categoryX}: [bold]{valueY}[/]";
|
|
119
|
+
series.columns.template.fillOpacity = .8;
|
|
120
|
+
series.columns.template.width = am4core.percent(settings.ColumnWidthPercentage ?? this.DefaultColumnWidthPercentage);
|
|
121
|
+
series.events.on("hidden", () => this.arrangeColumns);
|
|
122
|
+
series.events.on("shown", () => this.arrangeColumns);
|
|
123
|
+
return series;
|
|
124
|
+
}
|
|
125
|
+
/** @ignore */
|
|
126
|
+
arrangeColumns() {
|
|
127
|
+
let ChartInstanceCasted = this.ChartInstance;
|
|
128
|
+
let series = ChartInstanceCasted.series.getIndex(0);
|
|
129
|
+
let xAxis = ChartInstanceCasted.xAxes.getIndex(0);
|
|
130
|
+
let w = 1 - xAxis.renderer.cellStartLocation - (1 - xAxis.renderer.cellEndLocation);
|
|
131
|
+
if (series.dataItems.length > 1) {
|
|
132
|
+
let x0 = xAxis.getX(series.dataItems.getIndex(0), "categoryX");
|
|
133
|
+
let x1 = xAxis.getX(series.dataItems.getIndex(1), "categoryX");
|
|
134
|
+
let delta = ((x1 - x0) / ChartInstanceCasted.series.length) * w;
|
|
135
|
+
if (am4core.isNumber(delta)) {
|
|
136
|
+
let middle = ChartInstanceCasted.series.length / 2;
|
|
137
|
+
let newIndex = 0;
|
|
138
|
+
ChartInstanceCasted.series.each((series) => {
|
|
139
|
+
if (!series.isHidden && !series.isHiding) {
|
|
140
|
+
series.dummyData = newIndex;
|
|
141
|
+
newIndex++;
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
series.dummyData = ChartInstanceCasted.series.indexOf(series);
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
let visibleCount = newIndex;
|
|
148
|
+
let newMiddle = visibleCount / 2;
|
|
149
|
+
ChartInstanceCasted.series.each((series) => {
|
|
150
|
+
let trueIndex = ChartInstanceCasted.series.indexOf(series);
|
|
151
|
+
let newIndex = series.dummyData;
|
|
152
|
+
let dx = (newIndex - trueIndex + middle - newMiddle) * delta;
|
|
153
|
+
series.animate({ property: "dx", to: dx }, series.interpolationDuration, series.interpolationEasing);
|
|
154
|
+
series.bulletsContainer.animate({ property: "dx", to: dx }, series.interpolationDuration, series.interpolationEasing);
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVmVydGljYWwyRENoYXJ0U2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VzLWNoYXJ0cy9zcmMvbGliL3NlcnZpY2VzL1ZlcnRpY2FsMkRDaGFydFNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsT0FBTyxLQUFLLE9BQU8sTUFBTSwwQkFBMEIsQ0FBQztBQUNwRCxPQUFPLEtBQUssU0FBUyxNQUFNLDRCQUE0QixDQUFDO0FBRXhEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLHNCQUFzQjtJQWdCakMsY0FBYztJQUNkLFlBQW1CLE9BQW9CO1FBQXBCLFlBQU8sR0FBUCxPQUFPLENBQWE7UUFkdkMsY0FBYztRQUNOLGtDQUE2QixHQUFXLENBQUMsQ0FBQztRQUNsRCxjQUFjO1FBQ04sZUFBVSxHQUFXLEVBQUUsQ0FBQztRQUNoQyxjQUFjO1FBQ04sZUFBVSxHQUFXLEdBQUcsQ0FBQztRQUNqQyxjQUFjO1FBQ04sNkJBQXdCLEdBQVcsRUFBRSxDQUFDO1FBQzlDLGNBQWM7UUFDTiwyQkFBc0IsR0FBVyxDQUFDLENBQUMsQ0FBQztRQUM1QyxjQUFjO1FBQ04saUNBQTRCLEdBQVcsRUFBRSxDQUFDO0lBR1AsQ0FBQztJQUU1Qzs7T0FFRztJQUNJLFVBQVUsQ0FBQyxJQUErQixFQUFFLFFBQWlDO1FBRWxGLElBQUksUUFBUSxDQUFDLFFBQVEsRUFBRTtZQUNyQixPQUFPLENBQUMsS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7WUFDM0QsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELHVFQUF1RTtRQUN2RSxPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFFbkMsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3RFLElBQUksbUJBQW1CLEdBQXNCLElB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LE9BQU8sQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztvQkFDckcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztnQkFDeEgsQ0FBQyxDQUFDLENBQUE7YUFDSDtTQUNGO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUJhc2VTZXJ2aWNlIH0gZnJvbSAnLi9iYXNlL0lCYXNlU2VydmljZSc7XHJcbmltcG9ydCB7IEJhc2VBZGFwdGVyIH0gZnJvbSAnLi4vYWRhcHRlcnMvQmFzZUFkYXB0ZXInO1xyXG5pbXBvcnQgeyBWZXJ0aWNhbDJEQ2hhcnREYXRhIH0gZnJvbSAnLi4vbW9kZWxzL2RhdGEvVmVydGljYWwyRENoYXJ0RGF0YSc7XHJcbmltcG9ydCB7IFZlcnRpY2FsMkRDaGFydFNldHRpbmdzIH0gZnJvbSAnLi4vbW9kZWxzL3NldHRpbmdzL1ZlcnRpY2FsMkRDaGFydFNldHRpbmdzJztcclxuXHJcbmltcG9ydCAqIGFzIGFtNGNvcmUgZnJvbSBcIkBhbWNoYXJ0cy9hbWNoYXJ0czQvY29yZVwiO1xyXG5pbXBvcnQgKiBhcyBhbTRjaGFydHMgZnJvbSBcIkBhbWNoYXJ0cy9hbWNoYXJ0czQvY2hhcnRzXCI7XHJcblxyXG4vKipcclxuICogQ2xhc3NlIGlsIGN1aSB1bmljbyBzY29wbyDDqCBnZXN0aXJlIGlsIHNldHVwIGUgcmVuZGVyaW5nIGRpIHVuIFZlcnRpY2FsMkRDaGFydFxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFZlcnRpY2FsMkRDaGFydFNlcnZpY2UgaW1wbGVtZW50cyBJQmFzZVNlcnZpY2U8YW00Y2hhcnRzLlhZQ2hhcnQ+e1xyXG4gIC8qKiBAaWdub3JlICovXHJcbiAgcHVibGljIENoYXJ0SW5zdGFuY2U6IGFtNGNoYXJ0cy5YWUNoYXJ0O1xyXG4gIC8qKiBAaWdub3JlICovXHJcbiAgcHJpdmF0ZSBEZWZhdWx0R3JvdXBQYWRkaW5nUGVyY2VudGFnZTogbnVtYmVyID0gNTtcclxuICAvKiogQGlnbm9yZSAqL1xyXG4gIHByaXZhdGUgZGFuZ2VyWm9uZTogbnVtYmVyID0gNTA7XHJcbiAgLyoqIEBpZ25vcmUgKi9cclxuICBwcml2YXRlIExhYmVsV2lkdGg6IG51bWJlciA9IDE1MDtcclxuICAvKiogQGlnbm9yZSAqL1xyXG4gIHByaXZhdGUgTGFiZWxSaWdodFdoZW5Db21wcmVzc2VkOiBudW1iZXIgPSAyMDtcclxuICAvKiogQGlnbm9yZSAqL1xyXG4gIHByaXZhdGUgTGFiZWxUb3BXaGVuQ29tcHJlc3NlZDogbnVtYmVyID0gLTU7XHJcbiAgLyoqIEBpZ25vcmUgKi9cclxuICBwcml2YXRlIERlZmF1bHRDb2x1bW5XaWR0aFBlcmNlbnRhZ2U6IG51bWJlciA9IDg1O1xyXG5cclxuICAvKiogQGlnbm9yZSAqL1xyXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBBZGFwdGVyOiBCYXNlQWRhcHRlcikgeyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ldG9kbyBjaGUgZGF0YSB1bmEgY29wcGlhIERhdGkgLSBJbXBvc3RhemlvbmkgbGkgdXRpbGl6emEgcGVyIGNyZWFyZSBlIHZpc3VhbGl6emFyZSB1biBWZXJ0aWNhbDJEQ2hhcnRcclxuICAgKi9cclxuICBwdWJsaWMgZ3JhcGhpY2F0ZShkYXRhOiBWZXJ0aWNhbDJEQ2hhcnREYXRhIHwgYW55LCBzZXR0aW5nczogVmVydGljYWwyRENoYXJ0U2V0dGluZ3MpOiBJQmFzZVNlcnZpY2U8YW00Y2hhcnRzLlhZQ2hhcnQ+IHtcclxuXHJcbiAgICBpZiAoc2V0dGluZ3MuVGltZWxpbmUpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihcIlRpbWVsaW5lIG5vdCBzdXBwb3J0ZWQgZm9yIHZlcnRpY2FsIGNoYXJ0XCIpO1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvL1BlciBldml0YXJlIGRpIGRpbWVudGljYXJtZWxpIGUgZ2VzdGlyZSBjb211bnF1ZSBiZW5lIGdsaSBuZ2lmIGVjYy4uLlxyXG4gICAgYW00Y29yZS5vcHRpb25zLmF1dG9EaXNwb3NlID0gdHJ1ZTtcclxuXHJcbiAgICB0aGlzLkNoYXJ0SW5zdGFuY2UgPSBhbTRjb3JlLmNyZWF0ZShzZXR0aW5ncy5OYW1lLCBhbTRjaGFydHMuWFlDaGFydCk7XHJcbiAgICBsZXQgQ2hhcnRJbnN0YW5jZUNhc3RlZCA9IDxhbTRjaGFydHMuWFlDaGFydD50aGlzLkNoYXJ0SW5zdGFuY2U7XHJcblxyXG4gICAgaWYgKHNldHRpbmdzLkxlZ2VuZCkge1xyXG4gICAgICBDaGFydEluc3RhbmNlQ2FzdGVkLmxlZ2VuZCA9IG5ldyBhbTRjaGFydHMuTGVnZW5kKCk7XHJcbiAgICAgIENoYXJ0SW5zdGFuY2VDYXN0ZWQubGVnZW5kLnBvc2l0aW9uID0gc2V0dGluZ3M/LkxlZ2VuZFBvc2l0aW9uID8/ICdyaWdodCc7XHJcbiAgICAgIENoYXJ0SW5zdGFuY2VDYXN0ZWQubGVnZW5kLml0ZW1Db250YWluZXJzLnRlbXBsYXRlLnRvb2x0aXBUZXh0ID0gXCJ7Y2F0ZWdvcnl9XCI7XHJcbiAgICAgIFxyXG4gICAgICBpZiAoc2V0dGluZ3MuTGVnZW5kUGFkZGluZykge1xyXG4gICAgICAgIGxldCB0ZW1wbGF0ZSA9IHRoaXMuQ2hhcnRJbnN0YW5jZS5sZWdlbmQuaXRlbUNvbnRhaW5lcnMudGVtcGxhdGU7XHJcbiAgICAgICAgdGVtcGxhdGUucGFkZGluZ1RvcCA9IHNldHRpbmdzLkxlZ2VuZFBhZGRpbmcudG9wID8/IDA7XHJcbiAgICAgICAgdGVtcGxhdGUucGFkZGluZ0JvdHRvbSA9IHNldHRpbmdzLkxlZ2VuZFBhZGRpbmcuYm90dG9tID8/IDA7XHJcbiAgICAgICAgdGVtcGxhdGUucGFkZGluZ0xlZnQgPSBzZXR0aW5ncy5MZWdlbmRQYWRkaW5nLmxlZnQgPz8gMDtcclxuICAgICAgICB0ZW1wbGF0ZS5wYWRkaW5nUmlnaHQgPSBzZXR0aW5ncy5MZWdlbmRQYWRkaW5nLnJpZ2h0ID8/IDA7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsZXQgeUF4aXMgPSBDaGFydEluc3RhbmNlQ2FzdGVkLnlBeGVzLnB1c2gobmV3IGFtNGNoYXJ0cy5WYWx1ZUF4aXMoKSk7XHJcbiAgICBpZiAoc2V0dGluZ3MuWUF4aXNUaXRsZSkge1xyXG4gICAgICB5QXhpcy50aXRsZS50ZXh0ID0gc2V0dGluZ3MuWUF4aXNUaXRsZVxyXG4gICAgICB5QXhpcy50aXRsZS5mb250V2VpZ2h0ID0gXCJib2xkXCI7XHJcbiAgICB9XHJcbiAgICBsZXQgY2F0ZWdvcnlBeGlzOiBhbTRjaGFydHMuQ2F0ZWdvcnlBeGlzID0gQ2hhcnRJbnN0YW5jZUNhc3RlZC54QXhlcy5wdXNoKG5ldyBhbTRjaGFydHMuQ2F0ZWdvcnlBeGlzKCkpXHJcbiAgICBpZiAoc2V0dGluZ3MuWEF4aXNUaXRsZSkge1xyXG4gICAgICBjYXRlZ29yeUF4aXMudGl0bGUudGV4dCA9IHNldHRpbmdzLlhBeGlzVGl0bGVcclxuICAgICAgY2F0ZWdvcnlBeGlzLnRpdGxlLmZvbnRXZWlnaHQgPSBcImJvbGRcIjtcclxuICAgIH1cclxuXHJcbiAgICB5QXhpcy5taW4gPSAwO1xyXG4gICAgY2F0ZWdvcnlBeGlzLmRhdGFGaWVsZHMuY2F0ZWdvcnkgPSAna2V5J1xyXG4gICAgY2F0ZWdvcnlBeGlzLnJlbmRlcmVyLmNlbGxTdGFydExvY2F0aW9uID0gYW00Y29yZS5wZXJjZW50KHNldHRpbmdzLkdyb3VwUGFkZGluZ1BlcmNlbnRhZ2UgPz8gdGhpcy5EZWZhdWx0R3JvdXBQYWRkaW5nUGVyY2VudGFnZSkudmFsdWVcclxuICAgIGNhdGVnb3J5QXhpcy5yZW5kZXJlci5jZWxsRW5kTG9jYXRpb24gPSBhbTRjb3JlLnBlcmNlbnQoMTAwIC0gKHNldHRpbmdzLkdyb3VwUGFkZGluZ1BlcmNlbnRhZ2UgPz8gdGhpcy5EZWZhdWx0R3JvdXBQYWRkaW5nUGVyY2VudGFnZSkpLnZhbHVlXHJcbiAgICBjYXRlZ29yeUF4aXMucmVuZGVyZXIuZ3JpZC50ZW1wbGF0ZS5sb2NhdGlvbiA9IDA7XHJcbiAgICBjYXRlZ29yeUF4aXMucmVuZGVyZXIubWluR3JpZERpc3RhbmNlID0gc2V0dGluZ3M/Lk1pbkdyaWREaXN0YW5jZSA/PyAzMDtcclxuXHJcbiAgICBsZXQgbGFiZWwgPSBjYXRlZ29yeUF4aXMucmVuZGVyZXIubGFiZWxzLnRlbXBsYXRlO1xyXG4gICAgbGFiZWwudHJ1bmNhdGUgPSB0cnVlO1xyXG4gICAgbGFiZWwubWF4V2lkdGggPSBzZXR0aW5ncy5MYWJlbFdpZHRoID8/IHRoaXMuTGFiZWxXaWR0aDtcclxuICAgIGxhYmVsLnRvb2x0aXBUZXh0ID0gXCJ7Y2F0ZWdvcnl9XCI7XHJcblxyXG4gICAgaWYgKHNldHRpbmdzPy5BZGFwdExhYmVsU2l6ZUFuZE9yaWVudGF0aW9uID09IG51bGwgPyB0cnVlIDogc2V0dGluZ3M/LkFkYXB0TGFiZWxTaXplQW5kT3JpZW50YXRpb24pIHtcclxuICAgICAgY2F0ZWdvcnlBeGlzLmV2ZW50cy5vbihcInNpemVjaGFuZ2VkXCIsIChldikgPT4ge1xyXG4gICAgICAgIGxldCBheGlzID0gZXYudGFyZ2V0O1xyXG4gICAgICAgIHZhciBjZWxsV2lkdGggPSBheGlzLnBpeGVsV2lkdGggLyAoYXhpcy5lbmRJbmRleCAtIGF4aXMuc3RhcnRJbmRleCk7XHJcbiAgICAgICAgaWYgKGNlbGxXaWR0aCA8IGF4aXMucmVuZGVyZXIubGFiZWxzLnRlbXBsYXRlLm1heFdpZHRoKSB7XHJcbiAgICAgICAgICBsZXQgYXJlV2VJbkRhbmdlclpvbmUgPSBjZWxsV2lkdGggPCAoc2V0dGluZ3M/LkxhYmVsVmVydGljYWxPcmllbnRhdGlvbkN1dG9mZldpZHRoID8/IHRoaXMuZGFuZ2VyWm9uZSk7XHJcbiAgICAgICAgICBheGlzLnJlbmRlcmVyLmxhYmVscy50ZW1wbGF0ZS5yb3RhdGlvbiA9IGFyZVdlSW5EYW5nZXJab25lID8gLTkwIDogLTQ1O1xyXG4gICAgICAgICAgYXhpcy5yZW5kZXJlci5sYWJlbHMudGVtcGxhdGUuZHggPSBzZXR0aW5ncy5MYWJlbFJpZ2h0V2hlbkNvbXByZXNzZWQgPz8gYXJlV2VJbkRhbmdlclpvbmUgPyAwIDogdGhpcy5MYWJlbFJpZ2h0V2hlbkNvbXByZXNzZWQ7XHJcbiAgICAgICAgICBheGlzLnJlbmRlcmVyLmxhYmVscy50ZW1wbGF0ZS5keSA9IHNldHRpbmdzLkxhYmVsVG9wV2hlbkNvbXByZXNzZWQgPz8gdGhpcy5MYWJlbFRvcFdoZW5Db21wcmVzc2VkO1xyXG4gICAgICAgICAgYXhpcy5yZW5kZXJlci5sYWJlbHMudGVtcGxhdGUuaG9yaXpvbnRhbENlbnRlciA9IFwicmlnaHRcIjtcclxuICAgICAgICAgIGF4aXMucmVuZGVyZXIubGFiZWxzLnRlbXBsYXRlLnZlcnRpY2FsQ2VudGVyID0gXCJtaWRkbGVcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBheGlzLnJlbmRlcmVyLmxhYmVscy50ZW1wbGF0ZS5yb3RhdGlvbiA9IDA7XHJcbiAgICAgICAgICBheGlzLnJlbmRlcmVyLmxhYmVscy50ZW1wbGF0ZS5keCA9IDA7XHJcbiAgICAgICAgICBheGlzLnJlbmRlcmVyLmxhYmVscy50ZW1wbGF0ZS5keSA9IDA7XHJcbiAgICAgICAgICBheGlzLnJlbmRlcmVyLmxhYmVscy50ZW1wbGF0ZS5ob3Jpem9udGFsQ2VudGVyID0gXCJtaWRkbGVcIjtcclxuICAgICAgICAgIGF4aXMucmVuZGVyZXIubGFiZWxzLnRlbXBsYXRlLnZlcnRpY2FsQ2VudGVyID0gXCJ0b3BcIjtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBkYXRhUHJlQ29udmVydGVkOiBWZXJ0aWNhbDJEQ2hhcnREYXRhID0gdGhpcy5BZGFwdGVyID8gdGhpcy5BZGFwdGVyLmFkYXB0RGF0YUZvclZlcnRpY2FsMkRDaGFydChkYXRhKSA6IGRhdGE7XHJcblxyXG4gICAgbGV0IGRhdGFDb252ZXJ0ZWQgPSBbXTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YVByZUNvbnZlcnRlZC5ncm91cHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGl0ZW0gPSBkYXRhUHJlQ29udmVydGVkLmdyb3Vwc1tpXTtcclxuICAgICAgbGV0IG9iaiA9IHsga2V5OiBpdGVtLm5hbWUgfTtcclxuICAgICAgZm9yIChsZXQgcCA9IDA7IHAgPCBpdGVtLnZhbHVlcy5sZW5ndGg7IHArKykge1xyXG4gICAgICAgIGxldCB2YWx1ZSA9IGl0ZW0udmFsdWVzW3BdO1xyXG4gICAgICAgIG9ialt2YWx1ZS5rXSA9IHZhbHVlLnY7XHJcbiAgICAgIH1cclxuICAgICAgZGF0YUNvbnZlcnRlZC5wdXNoKG9iaik7XHJcbiAgICB9XHJcblxyXG4gICAgQ2hhcnRJbnN0YW5jZUNhc3RlZC5kYXRhID0gZGF0YUNvbnZlcnRlZDtcclxuICAgIGlmIChkYXRhUHJlQ29udmVydGVkLmNvbG9ySW5mb3MpXHJcbiAgICAgIENoYXJ0SW5zdGFuY2VDYXN0ZWQuY29sb3JzLmxpc3QgPSBkYXRhUHJlQ29udmVydGVkLmNvbG9ySW5mb3MubWFwKGMgPT4gYW00Y29yZS5jb2xvcihjLmNvbG9yKSk7XHJcblxyXG4gICAgLy9QcmVuZG8gbGEgcHJpbWEgY2F0ZWdvcmlhIGUgbWkgYmFzbyBzdWxsZSBwcm9wcmlldMOgIHBlciBkZmVpbmlyZSBsZSBzZXJpZVxyXG4gICAgZm9yIChsZXQgcHJvcCBpbiBkYXRhQ29udmVydGVkWzBdKVxyXG4gICAgICBpZiAocHJvcCAhPT0gXCJrZXlcIilcclxuICAgICAgICB0aGlzLmNyZWF0ZVNlcmllcyhDaGFydEluc3RhbmNlQ2FzdGVkLCBzZXR0aW5ncywgcHJvcCwgcHJvcCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvKiogQGlnbm9yZSAqL1xyXG4gIHB1YmxpYyByZWZyZXNoRGF0YShkYXRhOiBWZXJ0aWNhbDJEQ2hhcnREYXRhIHwgYW55KSB7XHJcbiAgICAvL1RPRE86SU1QTFxyXG4gIH1cclxuXHJcbiAgLyoqIEBpZ25vcmUgKi9cclxuICBwcml2YXRlIGNyZWF0ZVNlcmllcyhjaGFydCwgc2V0dGluZ3M6IFZlcnRpY2FsMkRDaGFydFNldHRpbmdzLCB2YWx1ZSwgbmFtZSkge1xyXG4gICAgbGV0IHNlcmllczogYW00Y2hhcnRzLkNvbHVtblNlcmllcyA9IGNoYXJ0LnNlcmllcy5wdXNoKG5ldyBhbTRjaGFydHMuQ29sdW1uU2VyaWVzKCkpXHJcbiAgICBzZXJpZXMuZGF0YUZpZWxkcy52YWx1ZVkgPSB2YWx1ZTtcclxuICAgIHNlcmllcy5kYXRhRmllbGRzLmNhdGVnb3J5WCA9ICdrZXknO1xyXG4gICAgc2VyaWVzLm5hbWUgPSBuYW1lO1xyXG4gICAgc2VyaWVzLmNvbHVtbnMudGVtcGxhdGUudG9vbHRpcFRleHQgPSBcIntuYW1lfSB7Y2F0ZWdvcnlYfTogW2JvbGRde3ZhbHVlWX1bL11cIjtcclxuICAgIHNlcmllcy5jb2x1bW5zLnRlbXBsYXRlLmZpbGxPcGFjaXR5ID0gLjg7XHJcbiAgICBzZXJpZXMuY29sdW1ucy50ZW1wbGF0ZS53aWR0aCA9IGFtNGNvcmUucGVyY2VudChzZXR0aW5ncy5Db2x1bW5XaWR0aFBlcmNlbnRhZ2UgPz8gdGhpcy5EZWZhdWx0Q29sdW1uV2lkdGhQZXJjZW50YWdlKTtcclxuXHJcbiAgICBzZXJpZXMuZXZlbnRzLm9uKFwiaGlkZGVuXCIsICgpID0+IHRoaXMuYXJyYW5nZUNvbHVtbnMpO1xyXG4gICAgc2VyaWVzLmV2ZW50cy5vbihcInNob3duXCIsICgpID0+IHRoaXMuYXJyYW5nZUNvbHVtbnMpO1xyXG5cclxuICAgIHJldHVybiBzZXJpZXM7XHJcbiAgfVxyXG5cclxuICAvKiogQGlnbm9yZSAqL1xyXG4gIHByaXZhdGUgYXJyYW5nZUNvbHVtbnMoKSB7XHJcbiAgICBsZXQgQ2hhcnRJbnN0YW5jZUNhc3RlZCA9IDxhbTRjaGFydHMuWFlDaGFydD50aGlzLkNoYXJ0SW5zdGFuY2U7XHJcbiAgICBsZXQgc2VyaWVzID0gQ2hhcnRJbnN0YW5jZUNhc3RlZC5zZXJpZXMuZ2V0SW5kZXgoMCk7XHJcbiAgICBsZXQgeEF4aXMgPSBDaGFydEluc3RhbmNlQ2FzdGVkLnhBeGVzLmdldEluZGV4KDApO1xyXG5cclxuICAgIGxldCB3ID0gMSAtIHhBeGlzLnJlbmRlcmVyLmNlbGxTdGFydExvY2F0aW9uIC0gKDEgLSB4QXhpcy5yZW5kZXJlci5jZWxsRW5kTG9jYXRpb24pO1xyXG4gICAgaWYgKHNlcmllcy5kYXRhSXRlbXMubGVuZ3RoID4gMSkge1xyXG4gICAgICBsZXQgeDAgPSB4QXhpcy5nZXRYKHNlcmllcy5kYXRhSXRlbXMuZ2V0SW5kZXgoMCksIFwiY2F0ZWdvcnlYXCIpO1xyXG4gICAgICBsZXQgeDEgPSB4QXhpcy5nZXRYKHNlcmllcy5kYXRhSXRlbXMuZ2V0SW5kZXgoMSksIFwiY2F0ZWdvcnlYXCIpO1xyXG4gICAgICBsZXQgZGVsdGEgPSAoKHgxIC0geDApIC8gQ2hhcnRJbnN0YW5jZUNhc3RlZC5zZXJpZXMubGVuZ3RoKSAqIHc7XHJcbiAgICAgIGlmIChhbTRjb3JlLmlzTnVtYmVyKGRlbHRhKSkge1xyXG4gICAgICAgIGxldCBtaWRkbGUgPSBDaGFydEluc3RhbmNlQ2FzdGVkLnNlcmllcy5sZW5ndGggLyAyO1xyXG5cclxuICAgICAgICBsZXQgbmV3SW5kZXggPSAwO1xyXG4gICAgICAgIENoYXJ0SW5zdGFuY2VDYXN0ZWQuc2VyaWVzLmVhY2goKHNlcmllcykgPT4ge1xyXG4gICAgICAgICAgaWYgKCFzZXJpZXMuaXNIaWRkZW4gJiYgIXNlcmllcy5pc0hpZGluZykge1xyXG4gICAgICAgICAgICBzZXJpZXMuZHVtbXlEYXRhID0gbmV3SW5kZXg7XHJcbiAgICAgICAgICAgIG5ld0luZGV4Kys7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgc2VyaWVzLmR1bW15RGF0YSA9IENoYXJ0SW5zdGFuY2VDYXN0ZWQuc2VyaWVzLmluZGV4T2Yoc2VyaWVzKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgIGxldCB2aXNpYmxlQ291bnQgPSBuZXdJbmRleDtcclxuICAgICAgICBsZXQgbmV3TWlkZGxlID0gdmlzaWJsZUNvdW50IC8gMjtcclxuXHJcbiAgICAgICAgQ2hhcnRJbnN0YW5jZUNhc3RlZC5zZXJpZXMuZWFjaCgoc2VyaWVzKSA9PiB7XHJcbiAgICAgICAgICBsZXQgdHJ1ZUluZGV4ID0gQ2hhcnRJbnN0YW5jZUNhc3RlZC5zZXJpZXMuaW5kZXhPZihzZXJpZXMpO1xyXG4gICAgICAgICAgbGV0IG5ld0luZGV4ID0gc2VyaWVzLmR1bW15RGF0YTtcclxuXHJcbiAgICAgICAgICBsZXQgZHggPSAobmV3SW5kZXggLSB0cnVlSW5kZXggKyBtaWRkbGUgLSBuZXdNaWRkbGUpICogZGVsdGFcclxuXHJcbiAgICAgICAgICBzZXJpZXMuYW5pbWF0ZSh7IHByb3BlcnR5OiBcImR4XCIsIHRvOiBkeCB9LCBzZXJpZXMuaW50ZXJwb2xhdGlvbkR1cmF0aW9uLCBzZXJpZXMuaW50ZXJwb2xhdGlvbkVhc2luZyk7XHJcbiAgICAgICAgICBzZXJpZXMuYnVsbGV0c0NvbnRhaW5lci5hbmltYXRlKHsgcHJvcGVydHk6IFwiZHhcIiwgdG86IGR4IH0sIHNlcmllcy5pbnRlcnBvbGF0aW9uRHVyYXRpb24sIHNlcmllcy5pbnRlcnBvbGF0aW9uRWFzaW5nKTtcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59Il19
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import * as am4core from "@amcharts/amcharts4/core";
|
|
2
|
+
import * as am4charts from "@amcharts/amcharts4/charts";
|
|
3
|
+
/**
|
|
4
|
+
* Classe il cui unico scopo è gestire il setup e rendering di un VerticalChart
|
|
5
|
+
*/
|
|
6
|
+
export class VerticalChartService {
|
|
7
|
+
/** @ignore */
|
|
8
|
+
constructor(Adapter) {
|
|
9
|
+
this.Adapter = Adapter;
|
|
10
|
+
/** @ignore */
|
|
11
|
+
this.dangerZone = 50;
|
|
12
|
+
/** @ignore */
|
|
13
|
+
this.LabelWidth = 150;
|
|
14
|
+
/** @ignore */
|
|
15
|
+
this.LabelRightWhenCompressed = 20;
|
|
16
|
+
/** @ignore */
|
|
17
|
+
this.LabelTopWhenCompressed = -5;
|
|
18
|
+
/** @ignore */
|
|
19
|
+
this.DefaultColumnWidthPercentage = 85;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Metodo che data una coppia Dati - Impostazioni li utilizza per creare e visualizzare un VerticalChart
|
|
23
|
+
*/
|
|
24
|
+
graphicate(data, settings) {
|
|
25
|
+
if (settings.Timeline) {
|
|
26
|
+
console.error("Timeline not supported for vertical chart");
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
//Per evitare di dimenticarmeli e gestire comunque bene gli ngif ecc...
|
|
30
|
+
am4core.options.autoDispose = true;
|
|
31
|
+
this.ChartInstance = am4core.create(settings.Name, am4charts.XYChart);
|
|
32
|
+
let ChartInstanceCasted = this.ChartInstance;
|
|
33
|
+
let dataConverted = this.Adapter ? this.Adapter.adaptDataForVerticalChart(data) : data;
|
|
34
|
+
ChartInstanceCasted.data = dataConverted.values;
|
|
35
|
+
if (settings.Legend) {
|
|
36
|
+
ChartInstanceCasted.legend = new am4charts.Legend();
|
|
37
|
+
ChartInstanceCasted.legend.position = settings?.LegendPosition ?? 'right';
|
|
38
|
+
ChartInstanceCasted.legend.itemContainers.template.tooltipText = "{category}";
|
|
39
|
+
if (settings.LegendPadding) {
|
|
40
|
+
let template = this.ChartInstance.legend.itemContainers.template;
|
|
41
|
+
template.paddingTop = settings.LegendPadding.top ?? 0;
|
|
42
|
+
template.paddingBottom = settings.LegendPadding.bottom ?? 0;
|
|
43
|
+
template.paddingLeft = settings.LegendPadding.left ?? 0;
|
|
44
|
+
template.paddingRight = settings.LegendPadding.right ?? 0;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
let yAxis = ChartInstanceCasted.yAxes.push(new am4charts.ValueAxis());
|
|
48
|
+
if (settings.YAxisTitle) {
|
|
49
|
+
yAxis.title.text = settings.YAxisTitle;
|
|
50
|
+
yAxis.title.fontWeight = "bold";
|
|
51
|
+
}
|
|
52
|
+
let categoryAxis = ChartInstanceCasted.xAxes.push(new am4charts.CategoryAxis());
|
|
53
|
+
if (settings.XAxisTitle) {
|
|
54
|
+
categoryAxis.title.text = settings.XAxisTitle;
|
|
55
|
+
categoryAxis.title.fontWeight = "bold";
|
|
56
|
+
}
|
|
57
|
+
categoryAxis.dataFields.category = "k";
|
|
58
|
+
categoryAxis.renderer.grid.template.location = 0;
|
|
59
|
+
categoryAxis.renderer.minGridDistance = settings?.MinGridDistance ?? 30;
|
|
60
|
+
let label = categoryAxis.renderer.labels.template;
|
|
61
|
+
label.truncate = true;
|
|
62
|
+
label.maxWidth = settings.LabelWidth ?? this.LabelWidth;
|
|
63
|
+
label.tooltipText = "{category}";
|
|
64
|
+
if (settings?.AdaptLabelSizeAndOrientation == null ? true : settings?.AdaptLabelSizeAndOrientation) {
|
|
65
|
+
categoryAxis.events.on("sizechanged", (ev) => {
|
|
66
|
+
let axis = ev.target;
|
|
67
|
+
var cellWidth = axis.pixelWidth / (axis.endIndex - axis.startIndex);
|
|
68
|
+
if (cellWidth < axis.renderer.labels.template.maxWidth) {
|
|
69
|
+
let areWeInDangerZone = cellWidth < (settings?.LabelVerticalOrientationCutoffWidth ?? this.dangerZone);
|
|
70
|
+
axis.renderer.labels.template.rotation = areWeInDangerZone ? -90 : -45;
|
|
71
|
+
axis.renderer.labels.template.dx = settings.LabelRightWhenCompressed ?? areWeInDangerZone ? 0 : this.LabelRightWhenCompressed;
|
|
72
|
+
axis.renderer.labels.template.dy = settings.LabelTopWhenCompressed ?? this.LabelTopWhenCompressed;
|
|
73
|
+
axis.renderer.labels.template.horizontalCenter = "right";
|
|
74
|
+
axis.renderer.labels.template.verticalCenter = "middle";
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
axis.renderer.labels.template.rotation = 0;
|
|
78
|
+
axis.renderer.labels.template.dx = 0;
|
|
79
|
+
axis.renderer.labels.template.dy = 0;
|
|
80
|
+
axis.renderer.labels.template.horizontalCenter = "middle";
|
|
81
|
+
axis.renderer.labels.template.verticalCenter = "top";
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
// Create series
|
|
86
|
+
let series = ChartInstanceCasted.series.push(new am4charts.ColumnSeries());
|
|
87
|
+
series.dataFields.valueY = "v";
|
|
88
|
+
series.dataFields.categoryX = "k";
|
|
89
|
+
series.name = "";
|
|
90
|
+
series.columns.template.tooltipText = "{categoryX}: [bold]{valueY}[/]";
|
|
91
|
+
series.columns.template.fillOpacity = .8;
|
|
92
|
+
series.columns.template.width = am4core.percent(settings.ColumnWidthPercentage ?? this.DefaultColumnWidthPercentage);
|
|
93
|
+
let columnTemplate = series.columns.template;
|
|
94
|
+
columnTemplate.strokeWidth = 2;
|
|
95
|
+
columnTemplate.strokeOpacity = 1;
|
|
96
|
+
return this;
|
|
97
|
+
}
|
|
98
|
+
/** @ignore */
|
|
99
|
+
refreshData(data) {
|
|
100
|
+
//TODO:IMPL
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVmVydGljYWxDaGFydFNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lcy1jaGFydHMvc3JjL2xpYi9zZXJ2aWNlcy9WZXJ0aWNhbENoYXJ0U2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFLQSxPQUFPLEtBQUssT0FBTyxNQUFNLDBCQUEwQixDQUFDO0FBQ3BELE9BQU8sS0FBSyxTQUFTLE1BQU0sNEJBQTRCLENBQUM7QUFFeEQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sb0JBQW9CO0lBYzdCLGNBQWM7SUFDZCxZQUFtQixPQUFvQjtRQUFwQixZQUFPLEdBQVAsT0FBTyxDQUFhO1FBWnZDLGNBQWM7UUFDTixlQUFVLEdBQVcsRUFBRSxDQUFDO1FBQ2hDLGNBQWM7UUFDTixlQUFVLEdBQVcsR0FBRyxDQUFDO1FBQ2pDLGNBQWM7UUFDTiw2QkFBd0IsR0FBVyxFQUFFLENBQUM7UUFDOUMsY0FBYztRQUNOLDJCQUFzQixHQUFXLENBQUMsQ0FBQyxDQUFDO1FBQzVDLGNBQWM7UUFDTixpQ0FBNEIsR0FBVyxFQUFFLENBQUM7SUFHUCxDQUFDO0lBRTVDOztPQUVHO0lBQ0ksVUFBVSxDQUFDLElBQTZCLEVBQUUsUUFBK0I7UUFFNUUsSUFBSSxRQUFRLENBQUMsUUFBUSxFQUFFO1lBQ25CLE9BQU8sQ0FBQyxLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQztZQUMzRCxPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsdUVBQXVFO1FBQ3ZFLE9BQU8sQ0FBQyxPQUFPLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUVuQyxJQUFJLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEUsSUFBSSxtQkFBbUIsR0FBc0IsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUVoRSxJQUFJLGFBQWEsR0FBc0IsSUFB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aW1wb3J0IHsgSUJhc2VTZXJ2aWNlIH0gZnJvbSAnLi9iYXNlL0lCYXNlU2VydmljZSc7XHJcbmltcG9ydCB7IEJhc2VBZGFwdGVyIH0gZnJvbSAnLi4vYWRhcHRlcnMvQmFzZUFkYXB0ZXInO1xyXG5pbXBvcnQgeyBWZXJ0aWNhbENoYXJ0RGF0YSB9IGZyb20gJy4uL21vZGVscy9kYXRhL1ZlcnRpY2FsQ2hhcnREYXRhJztcclxuaW1wb3J0IHsgVmVydGljYWxDaGFydFNldHRpbmdzIH0gZnJvbSAnLi4vbW9kZWxzL3NldHRpbmdzL1ZlcnRpY2FsQ2hhcnRTZXR0aW5ncyc7XHJcblxyXG5pbXBvcnQgKiBhcyBhbTRjb3JlIGZyb20gXCJAYW1jaGFydHMvYW1jaGFydHM0L2NvcmVcIjtcclxuaW1wb3J0ICogYXMgYW00Y2hhcnRzIGZyb20gXCJAYW1jaGFydHMvYW1jaGFydHM0L2NoYXJ0c1wiO1xyXG5cclxuLyoqXHJcbiAqIENsYXNzZSBpbCBjdWkgdW5pY28gc2NvcG8gw6ggZ2VzdGlyZSBpbCBzZXR1cCBlIHJlbmRlcmluZyBkaSB1biBWZXJ0aWNhbENoYXJ0XHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgVmVydGljYWxDaGFydFNlcnZpY2UgaW1wbGVtZW50cyBJQmFzZVNlcnZpY2U8YW00Y2hhcnRzLlhZQ2hhcnQ+e1xyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHB1YmxpYyBDaGFydEluc3RhbmNlOiBhbTRjaGFydHMuWFlDaGFydDtcclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwcml2YXRlIGRhbmdlclpvbmU6IG51bWJlciA9IDUwO1xyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHByaXZhdGUgTGFiZWxXaWR0aDogbnVtYmVyID0gMTUwO1xyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHByaXZhdGUgTGFiZWxSaWdodFdoZW5Db21wcmVzc2VkOiBudW1iZXIgPSAyMDtcclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwcml2YXRlIExhYmVsVG9wV2hlbkNvbXByZXNzZWQ6IG51bWJlciA9IC01O1xyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHByaXZhdGUgRGVmYXVsdENvbHVtbldpZHRoUGVyY2VudGFnZTogbnVtYmVyID0gODU7XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBBZGFwdGVyOiBCYXNlQWRhcHRlcikgeyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRvZG8gY2hlIGRhdGEgdW5hIGNvcHBpYSBEYXRpIC0gSW1wb3N0YXppb25pIGxpIHV0aWxpenphIHBlciBjcmVhcmUgZSB2aXN1YWxpenphcmUgdW4gVmVydGljYWxDaGFydFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ3JhcGhpY2F0ZShkYXRhOiBWZXJ0aWNhbENoYXJ0RGF0YSB8IGFueSwgc2V0dGluZ3M6IFZlcnRpY2FsQ2hhcnRTZXR0aW5ncyk6IElCYXNlU2VydmljZTxhbTRjaGFydHMuWFlDaGFydD4ge1xyXG5cclxuICAgICAgICBpZiAoc2V0dGluZ3MuVGltZWxpbmUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlRpbWVsaW5lIG5vdCBzdXBwb3J0ZWQgZm9yIHZlcnRpY2FsIGNoYXJ0XCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vUGVyIGV2aXRhcmUgZGkgZGltZW50aWNhcm1lbGkgZSBnZXN0aXJlIGNvbXVucXVlIGJlbmUgZ2xpIG5naWYgZWNjLi4uXHJcbiAgICAgICAgYW00Y29yZS5vcHRpb25zLmF1dG9EaXNwb3NlID0gdHJ1ZTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLkNoYXJ0SW5zdGFuY2UgPSBhbTRjb3JlLmNyZWF0ZShzZXR0aW5ncy5OYW1lLCBhbTRjaGFydHMuWFlDaGFydCk7XHJcbiAgICAgICAgbGV0IENoYXJ0SW5zdGFuY2VDYXN0ZWQgPSA8YW00Y2hhcnRzLlhZQ2hhcnQ+dGhpcy5DaGFydEluc3RhbmNlO1xyXG5cclxuICAgICAgICBsZXQgZGF0YUNvbnZlcnRlZDogVmVydGljYWxDaGFydERhdGEgPSB0aGlzLkFkYXB0ZXIgPyB0aGlzLkFkYXB0ZXIuYWRhcHREYXRhRm9yVmVydGljYWxDaGFydChkYXRhKSA6IGRhdGE7XHJcbiAgICAgICAgQ2hhcnRJbnN0YW5jZUNhc3RlZC5kYXRhID0gZGF0YUNvbnZlcnRlZC52YWx1ZXM7XHJcblxyXG4gICAgICAgIGlmIChzZXR0aW5ncy5MZWdlbmQpIHtcclxuICAgICAgICAgICAgQ2hhcnRJbnN0YW5jZUNhc3RlZC5sZWdlbmQgPSBuZXcgYW00Y2hhcnRzLkxlZ2VuZCgpO1xyXG4gICAgICAgICAgICBDaGFydEluc3RhbmNlQ2FzdGVkLmxlZ2VuZC5wb3NpdGlvbiA9IHNldHRpbmdzPy5MZWdlbmRQb3NpdGlvbiA/PyAncmlnaHQnO1xyXG4gICAgICAgICAgICBDaGFydEluc3RhbmNlQ2FzdGVkLmxlZ2VuZC5pdGVtQ29udGFpbmVycy50ZW1wbGF0ZS50b29sdGlwVGV4dCA9IFwie2NhdGVnb3J5fVwiO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKHNldHRpbmdzLkxlZ2VuZFBhZGRpbmcpIHtcclxuICAgICAgICAgICAgICAgIGxldCB0ZW1wbGF0ZSA9IHRoaXMuQ2hhcnRJbnN0YW5jZS5sZWdlbmQuaXRlbUNvbnRhaW5lcnMudGVtcGxhdGU7XHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZS5wYWRkaW5nVG9wID0gc2V0dGluZ3MuTGVnZW5kUGFkZGluZy50b3AgPz8gMDtcclxuICAgICAgICAgICAgICAgIHRlbXBsYXRlLnBhZGRpbmdCb3R0b20gPSBzZXR0aW5ncy5MZWdlbmRQYWRkaW5nLmJvdHRvbSA/PyAwO1xyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGUucGFkZGluZ0xlZnQgPSBzZXR0aW5ncy5MZWdlbmRQYWRkaW5nLmxlZnQgPz8gMDtcclxuICAgICAgICAgICAgICAgIHRlbXBsYXRlLnBhZGRpbmdSaWdodCA9IHNldHRpbmdzLkxlZ2VuZFBhZGRpbmcucmlnaHQgPz8gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHlBeGlzID0gQ2hhcnRJbnN0YW5jZUNhc3RlZC55QXhlcy5wdXNoKG5ldyBhbTRjaGFydHMuVmFsdWVBeGlzKCkpO1xyXG4gICAgICAgIGlmIChzZXR0aW5ncy5ZQXhpc1RpdGxlKSB7XHJcbiAgICAgICAgICAgIHlBeGlzLnRpdGxlLnRleHQgPSBzZXR0aW5ncy5ZQXhpc1RpdGxlXHJcbiAgICAgICAgICAgIHlBeGlzLnRpdGxlLmZvbnRXZWlnaHQgPSBcImJvbGRcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGNhdGVnb3J5QXhpczogYW00Y2hhcnRzLkNhdGVnb3J5QXhpcyA9IENoYXJ0SW5zdGFuY2VDYXN0ZWQueEF4ZXMucHVzaChuZXcgYW00Y2hhcnRzLkNhdGVnb3J5QXhpcygpKVxyXG4gICAgICAgIGlmIChzZXR0aW5ncy5YQXhpc1RpdGxlKSB7XHJcbiAgICAgICAgICAgIGNhdGVnb3J5QXhpcy50aXRsZS50ZXh0ID0gc2V0dGluZ3MuWEF4aXNUaXRsZVxyXG4gICAgICAgICAgICBjYXRlZ29yeUF4aXMudGl0bGUuZm9udFdlaWdodCA9IFwiYm9sZFwiO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY2F0ZWdvcnlBeGlzLmRhdGFGaWVsZHMuY2F0ZWdvcnkgPSBcImtcIjtcclxuICAgICAgICBjYXRlZ29yeUF4aXMucmVuZGVyZXIuZ3JpZC50ZW1wbGF0ZS5sb2NhdGlvbiA9IDA7XHJcbiAgICAgICAgY2F0ZWdvcnlBeGlzLnJlbmRlcmVyLm1pbkdyaWREaXN0YW5jZSA9IHNldHRpbmdzPy5NaW5HcmlkRGlzdGFuY2UgPz8gMzA7XHJcblxyXG4gICAgICAgIGxldCBsYWJlbCA9IGNhdGVnb3J5QXhpcy5yZW5kZXJlci5sYWJlbHMudGVtcGxhdGU7XHJcbiAgICAgICAgbGFiZWwudHJ1bmNhdGUgPSB0cnVlO1xyXG4gICAgICAgIGxhYmVsLm1heFdpZHRoID0gc2V0dGluZ3MuTGFiZWxXaWR0aCA/PyB0aGlzLkxhYmVsV2lkdGg7XHJcbiAgICAgICAgbGFiZWwudG9vbHRpcFRleHQgPSBcIntjYXRlZ29yeX1cIjtcclxuXHJcbiAgICAgICAgaWYgKHNldHRpbmdzPy5BZGFwdExhYmVsU2l6ZUFuZE9yaWVudGF0aW9uID09IG51bGwgPyB0cnVlIDogc2V0dGluZ3M/LkFkYXB0TGFiZWxTaXplQW5kT3JpZW50YXRpb24pIHtcclxuICAgICAgICAgICAgY2F0ZWdvcnlBeGlzLmV2ZW50cy5vbihcInNpemVjaGFuZ2VkXCIsIChldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IGF4aXMgPSBldi50YXJnZXQ7XHJcbiAgICAgICAgICAgICAgICB2YXIgY2VsbFdpZHRoID0gYXhpcy5waXhlbFdpZHRoIC8gKGF4aXMuZW5kSW5kZXggLSBheGlzLnN0YXJ0SW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNlbGxXaWR0aCA8IGF4aXMucmVuZGVyZXIubGFiZWxzLnRlbXBsYXRlLm1heFdpZHRoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFyZVdlSW5EYW5nZXJab25lID0gY2VsbFdpZHRoIDwgKHNldHRpbmdzPy5MYWJlbFZlcnRpY2FsT3JpZW50YXRpb25DdXRvZmZXaWR0aCA/PyB0aGlzLmRhbmdlclpvbmUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGF4aXMucmVuZGVyZXIubGFiZWxzLnRlbXBsYXRlLnJvdGF0aW9uID0gYXJlV2VJbkRhbmdlclpvbmUgPyAtOTAgOiAtNDU7XHJcbiAgICAgICAgICAgICAgICAgICAgYXhpcy5yZW5kZXJlci5sYWJlbHMudGVtcGxhdGUuZHggPSBzZXR0aW5ncy5MYWJlbFJpZ2h0V2hlbkNvbXByZXNzZWQgPz8gYXJlV2VJbkRhbmdlclpvbmUgPyAwIDogdGhpcy5MYWJlbFJpZ2h0V2hlbkNvbXByZXNzZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgYXhpcy5yZW5kZXJlci5sYWJlbHMudGVtcGxhdGUuZHkgPSBzZXR0aW5ncy5MYWJlbFRvcFdoZW5Db21wcmVzc2VkID8/IHRoaXMuTGFiZWxUb3BXaGVuQ29tcHJlc3NlZDtcclxuICAgICAgICAgICAgICAgICAgICBheGlzLnJlbmRlcmVyLmxhYmVscy50ZW1wbGF0ZS5ob3Jpem9udGFsQ2VudGVyID0gXCJyaWdodFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIGF4aXMucmVuZGVyZXIubGFiZWxzLnRlbXBsYXRlLnZlcnRpY2FsQ2VudGVyID0gXCJtaWRkbGVcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGF4aXMucmVuZGVyZXIubGFiZWxzLnRlbXBsYXRlLnJvdGF0aW9uID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBheGlzLnJlbmRlcmVyLmxhYmVscy50ZW1wbGF0ZS5keCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgYXhpcy5yZW5kZXJlci5sYWJlbHMudGVtcGxhdGUuZHkgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGF4aXMucmVuZGVyZXIubGFiZWxzLnRlbXBsYXRlLmhvcml6b250YWxDZW50ZXIgPSBcIm1pZGRsZVwiO1xyXG4gICAgICAgICAgICAgICAgICAgIGF4aXMucmVuZGVyZXIubGFiZWxzLnRlbXBsYXRlLnZlcnRpY2FsQ2VudGVyID0gXCJ0b3BcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBDcmVhdGUgc2VyaWVzXHJcbiAgICAgICAgbGV0IHNlcmllcyA9IENoYXJ0SW5zdGFuY2VDYXN0ZWQuc2VyaWVzLnB1c2gobmV3IGFtNGNoYXJ0cy5Db2x1bW5TZXJpZXMoKSk7XHJcbiAgICAgICAgc2VyaWVzLmRhdGFGaWVsZHMudmFsdWVZID0gXCJ2XCI7XHJcbiAgICAgICAgc2VyaWVzLmRhdGFGaWVsZHMuY2F0ZWdvcnlYID0gXCJrXCI7XHJcbiAgICAgICAgc2VyaWVzLm5hbWUgPSBcIlwiO1xyXG4gICAgICAgIHNlcmllcy5jb2x1bW5zLnRlbXBsYXRlLnRvb2x0aXBUZXh0ID0gXCJ7Y2F0ZWdvcnlYfTogW2JvbGRde3ZhbHVlWX1bL11cIjtcclxuICAgICAgICBzZXJpZXMuY29sdW1ucy50ZW1wbGF0ZS5maWxsT3BhY2l0eSA9IC44O1xyXG4gICAgICAgIHNlcmllcy5jb2x1bW5zLnRlbXBsYXRlLndpZHRoID0gYW00Y29yZS5wZXJjZW50KHNldHRpbmdzLkNvbHVtbldpZHRoUGVyY2VudGFnZSA/PyB0aGlzLkRlZmF1bHRDb2x1bW5XaWR0aFBlcmNlbnRhZ2UpO1xyXG5cclxuICAgICAgICBsZXQgY29sdW1uVGVtcGxhdGUgPSBzZXJpZXMuY29sdW1ucy50ZW1wbGF0ZTtcclxuICAgICAgICBjb2x1bW5UZW1wbGF0ZS5zdHJva2VXaWR0aCA9IDI7XHJcbiAgICAgICAgY29sdW1uVGVtcGxhdGUuc3Ryb2tlT3BhY2l0eSA9IDE7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwdWJsaWMgcmVmcmVzaERhdGEoZGF0YTogVmVydGljYWxDaGFydERhdGEgfCBhbnkpIHtcclxuICAgICAgICAvL1RPRE86SU1QTFxyXG4gICAgfVxyXG59Il19
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import * as am4core from "@amcharts/amcharts4/core";
|
|
2
|
+
import * as am4charts from "@amcharts/amcharts4/charts";
|
|
3
|
+
/**
|
|
4
|
+
* Classe il cui unico scopo è gestire il setup e rendering di un VerticalStackedChart
|
|
5
|
+
*/
|
|
6
|
+
export class VerticalStackedChartService {
|
|
7
|
+
/** @ignore */
|
|
8
|
+
constructor(Adapter) {
|
|
9
|
+
this.Adapter = Adapter;
|
|
10
|
+
/** @ignore */
|
|
11
|
+
this.dangerZone = 50;
|
|
12
|
+
/** @ignore */
|
|
13
|
+
this.LabelWidth = 150;
|
|
14
|
+
/** @ignore */
|
|
15
|
+
this.LabelRightWhenCompressed = 20;
|
|
16
|
+
/** @ignore */
|
|
17
|
+
this.LabelTopWhenCompressed = -5;
|
|
18
|
+
/** @ignore */
|
|
19
|
+
this.DefaultColumnWidthPercentage = 85;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Metodo che data una coppia Dati - Impostazioni li utilizza per creare e visualizzare un VerticalStackedChart
|
|
23
|
+
*/
|
|
24
|
+
graphicate(data, settings) {
|
|
25
|
+
if (settings.Timeline) {
|
|
26
|
+
console.error("Timeline not supported for vertical chart");
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
//Per evitare di dimenticarmeli e gestire comunque bene gli ngif ecc...
|
|
30
|
+
am4core.options.autoDispose = true;
|
|
31
|
+
this.ChartInstance = am4core.create(settings.Name, am4charts.XYChart);
|
|
32
|
+
let ChartInstanceCasted = this.ChartInstance;
|
|
33
|
+
// Create axes
|
|
34
|
+
let yAxis = ChartInstanceCasted.yAxes.push(new am4charts.ValueAxis());
|
|
35
|
+
if (settings.YAxisTitle) {
|
|
36
|
+
yAxis.title.text = settings.YAxisTitle;
|
|
37
|
+
yAxis.title.fontWeight = "bold";
|
|
38
|
+
}
|
|
39
|
+
let categoryAxis = ChartInstanceCasted.xAxes.push(new am4charts.CategoryAxis());
|
|
40
|
+
if (settings.XAxisTitle) {
|
|
41
|
+
categoryAxis.title.text = settings.XAxisTitle;
|
|
42
|
+
categoryAxis.title.fontWeight = "bold";
|
|
43
|
+
}
|
|
44
|
+
yAxis.min = 0;
|
|
45
|
+
categoryAxis.dataFields.category = "key";
|
|
46
|
+
categoryAxis.renderer.grid.template.location = 0;
|
|
47
|
+
categoryAxis.renderer.minGridDistance = settings?.MinGridDistance ?? 30;
|
|
48
|
+
let label = categoryAxis.renderer.labels.template;
|
|
49
|
+
label.truncate = true;
|
|
50
|
+
label.maxWidth = settings.LabelWidth ?? this.LabelWidth;
|
|
51
|
+
label.tooltipText = "{category}";
|
|
52
|
+
if (settings?.AdaptLabelSizeAndOrientation == null ? true : settings?.AdaptLabelSizeAndOrientation) {
|
|
53
|
+
categoryAxis.events.on("sizechanged", (ev) => {
|
|
54
|
+
let axis = ev.target;
|
|
55
|
+
var cellWidth = axis.pixelWidth / (axis.endIndex - axis.startIndex);
|
|
56
|
+
if (cellWidth < axis.renderer.labels.template.maxWidth) {
|
|
57
|
+
let areWeInDangerZone = cellWidth < (settings?.LabelVerticalOrientationCutoffWidth ?? this.dangerZone);
|
|
58
|
+
axis.renderer.labels.template.rotation = areWeInDangerZone ? -90 : -45;
|
|
59
|
+
axis.renderer.labels.template.dx = settings.LabelRightWhenCompressed ?? areWeInDangerZone ? 0 : this.LabelRightWhenCompressed;
|
|
60
|
+
axis.renderer.labels.template.dy = settings.LabelTopWhenCompressed ?? this.LabelTopWhenCompressed;
|
|
61
|
+
axis.renderer.labels.template.horizontalCenter = "right";
|
|
62
|
+
axis.renderer.labels.template.verticalCenter = "middle";
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
axis.renderer.labels.template.rotation = 0;
|
|
66
|
+
axis.renderer.labels.template.dx = 0;
|
|
67
|
+
axis.renderer.labels.template.dy = 0;
|
|
68
|
+
axis.renderer.labels.template.horizontalCenter = "middle";
|
|
69
|
+
axis.renderer.labels.template.verticalCenter = "top";
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
let dataPreConverted = this.Adapter ? this.Adapter.adaptDataForVerticalStackedChart(data) : data;
|
|
74
|
+
let dataConverted = [];
|
|
75
|
+
for (let i = 0; i < dataPreConverted.groups.length; i++) {
|
|
76
|
+
let item = dataPreConverted.groups[i];
|
|
77
|
+
let obj = { key: item.name };
|
|
78
|
+
for (let p = 0; p < item.values.length; p++) {
|
|
79
|
+
let value = item.values[p];
|
|
80
|
+
obj[value.k] = value.v;
|
|
81
|
+
}
|
|
82
|
+
dataConverted.push(obj);
|
|
83
|
+
}
|
|
84
|
+
ChartInstanceCasted.data = dataConverted;
|
|
85
|
+
//Prendo la prima categoria e mi baso sulle proprietà per dfeinire le serie
|
|
86
|
+
for (let prop in dataConverted[0]) {
|
|
87
|
+
if (prop !== "key")
|
|
88
|
+
this.createSeriesStacked(ChartInstanceCasted, settings, prop, prop);
|
|
89
|
+
}
|
|
90
|
+
if (settings.Legend) {
|
|
91
|
+
ChartInstanceCasted.legend = new am4charts.Legend();
|
|
92
|
+
ChartInstanceCasted.legend.position = settings?.LegendPosition ?? 'right';
|
|
93
|
+
ChartInstanceCasted.legend.itemContainers.template.tooltipText = "{category}";
|
|
94
|
+
if (settings.LegendPadding) {
|
|
95
|
+
let template = this.ChartInstance.legend.itemContainers.template;
|
|
96
|
+
template.paddingTop = settings.LegendPadding.top ?? 0;
|
|
97
|
+
template.paddingBottom = settings.LegendPadding.bottom ?? 0;
|
|
98
|
+
template.paddingLeft = settings.LegendPadding.left ?? 0;
|
|
99
|
+
template.paddingRight = settings.LegendPadding.right ?? 0;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return this;
|
|
103
|
+
}
|
|
104
|
+
/** @ignore */
|
|
105
|
+
refreshData(data) {
|
|
106
|
+
//TODO:IMPL
|
|
107
|
+
}
|
|
108
|
+
/** @ignore */
|
|
109
|
+
createSeriesStacked(chart, settings, field, name) {
|
|
110
|
+
// Set up series
|
|
111
|
+
let series = chart.series.push(new am4charts.ColumnSeries());
|
|
112
|
+
series.name = name;
|
|
113
|
+
series.dataFields.valueY = field;
|
|
114
|
+
series.dataFields.categoryX = "key";
|
|
115
|
+
series.sequencedInterpolation = true;
|
|
116
|
+
series.columns.template.tooltipText = "{name} {categoryX}: [bold]{valueY}[/]";
|
|
117
|
+
series.columns.template.fillOpacity = .8;
|
|
118
|
+
series.columns.template.width = am4core.percent(settings.ColumnWidthPercentage ?? this.DefaultColumnWidthPercentage);
|
|
119
|
+
// Make it stacked
|
|
120
|
+
series.stacked = true;
|
|
121
|
+
return series;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVmVydGljYWxTdGFja2VkQ2hhcnRTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXMtY2hhcnRzL3NyYy9saWIvc2VydmljZXMvVmVydGljYWxTdGFja2VkQ2hhcnRTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUtBLE9BQU8sS0FBSyxPQUFPLE1BQU0sMEJBQTBCLENBQUM7QUFDcEQsT0FBTyxLQUFLLFNBQVMsTUFBTSw0QkFBNEIsQ0FBQztBQUV4RDs7R0FFRztBQUNILE1BQU0sT0FBTywyQkFBMkI7SUFjdEMsY0FBYztJQUNkLFlBQW1CLE9BQW9CO1FBQXBCLFlBQU8sR0FBUCxPQUFPLENBQWE7UUFadkMsY0FBYztRQUNOLGVBQVUsR0FBVyxFQUFFLENBQUM7UUFDaEMsY0FBYztRQUNOLGVBQVUsR0FBVyxHQUFHLENBQUM7UUFDakMsY0FBYztRQUNOLDZCQUF3QixHQUFXLEVBQUUsQ0FBQztRQUM5QyxjQUFjO1FBQ04sMkJBQXNCLEdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDNUMsY0FBYztRQUNOLGlDQUE0QixHQUFXLEVBQUUsQ0FBQztJQUdQLENBQUM7SUFFNUM7O09BRUc7SUFDSSxVQUFVLENBQUMsSUFBb0MsRUFBRSxRQUFzQztRQUU1RixJQUFJLFFBQVEsQ0FBQyxRQUFRLEVBQUU7WUFDckIsT0FBTyxDQUFDLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1lBQzNELE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCx1RUFBdUU7UUFDdkUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBRW5DLElBQUksQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0RSxJQUFJLG1CQUFtQixHQUFzQixJQUFJLENBQUMsYUFBYSxDQUFDO1FBRWhFLGVBQWU7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Q0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDO2FBQzNEO1NBQ0Y7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxjQUFjO0lBQ1AsV0FBVyxDQUFDLElBQW9DO1FBQ3JELFdBQVc7SUFDYixDQUFDO0lBRUQsY0FBYztJQUNOLG1CQUFtQixDQUFDLEtBQUssRUFBRSxRQUFzQyxFQUFFLEtBQUssRUFBRSxJQUFJO1FBQ3BGLGdCQUFnQjtRQUNoQixJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQzdELE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNqQyxNQUFNLENBQUMsVUFBVSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDcEMsTUFBTSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQztRQUNyQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEdBQUcsdUNBQXVDLENBQUM7UUFDOUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUN6QyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMscUJBQXFCLElBQUksSUFBSSxDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFFckgsa0JBQWtCO1FBQ2xCLE1BQU0sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBRXRCLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElCYXNlU2VydmljZSB9IGZyb20gJy4vYmFzZS9JQmFzZVNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCYXNlQWRhcHRlciB9IGZyb20gJy4uL2FkYXB0ZXJzL0Jhc2VBZGFwdGVyJztcclxuaW1wb3J0IHsgVmVydGljYWxTdGFja2VkQ2hhcnREYXRhIH0gZnJvbSAnLi4vbW9kZWxzL2RhdGEvVmVydGljYWxTdGFja2VkQ2hhcnREYXRhJztcclxuaW1wb3J0IHsgVmVydGljYWxTdGFja2VkQ2hhcnRTZXR0aW5ncyB9IGZyb20gJy4uL21vZGVscy9zZXR0aW5ncy9WZXJ0aWNhbFN0YWNrZWRDaGFydFNldHRpbmdzJztcclxuXHJcbmltcG9ydCAqIGFzIGFtNGNvcmUgZnJvbSBcIkBhbWNoYXJ0cy9hbWNoYXJ0czQvY29yZVwiO1xyXG5pbXBvcnQgKiBhcyBhbTRjaGFydHMgZnJvbSBcIkBhbWNoYXJ0cy9hbWNoYXJ0czQvY2hhcnRzXCI7XHJcblxyXG4vKipcclxuICogQ2xhc3NlIGlsIGN1aSB1bmljbyBzY29wbyDDqCBnZXN0aXJlIGlsIHNldHVwIGUgcmVuZGVyaW5nIGRpIHVuIFZlcnRpY2FsU3RhY2tlZENoYXJ0XHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgVmVydGljYWxTdGFja2VkQ2hhcnRTZXJ2aWNlIGltcGxlbWVudHMgSUJhc2VTZXJ2aWNlPGFtNGNoYXJ0cy5YWUNoYXJ0PntcclxuICAvKiogQGlnbm9yZSAqL1xyXG4gIHB1YmxpYyBDaGFydEluc3RhbmNlOiBhbTRjaGFydHMuWFlDaGFydDtcclxuICAvKiogQGlnbm9yZSAqL1xyXG4gIHByaXZhdGUgZGFuZ2VyWm9uZTogbnVtYmVyID0gNTA7XHJcbiAgLyoqIEBpZ25vcmUgKi9cclxuICBwcml2YXRlIExhYmVsV2lkdGg6IG51bWJlciA9IDE1MDtcclxuICAvKiogQGlnbm9yZSAqL1xyXG4gIHByaXZhdGUgTGFiZWxSaWdodFdoZW5Db21wcmVzc2VkOiBudW1iZXIgPSAyMDtcclxuICAvKiogQGlnbm9yZSAqL1xyXG4gIHByaXZhdGUgTGFiZWxUb3BXaGVuQ29tcHJlc3NlZDogbnVtYmVyID0gLTU7XHJcbiAgLyoqIEBpZ25vcmUgKi9cclxuICBwcml2YXRlIERlZmF1bHRDb2x1bW5XaWR0aFBlcmNlbnRhZ2U6IG51bWJlciA9IDg1O1xyXG5cclxuICAvKiogQGlnbm9yZSAqL1xyXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBBZGFwdGVyOiBCYXNlQWRhcHRlcikgeyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ldG9kbyBjaGUgZGF0YSB1bmEgY29wcGlhIERhdGkgLSBJbXBvc3RhemlvbmkgbGkgdXRpbGl6emEgcGVyIGNyZWFyZSBlIHZpc3VhbGl6emFyZSB1biBWZXJ0aWNhbFN0YWNrZWRDaGFydFxyXG4gICAqL1xyXG4gIHB1YmxpYyBncmFwaGljYXRlKGRhdGE6IFZlcnRpY2FsU3RhY2tlZENoYXJ0RGF0YSB8IGFueSwgc2V0dGluZ3M6IFZlcnRpY2FsU3RhY2tlZENoYXJ0U2V0dGluZ3MpOiBJQmFzZVNlcnZpY2U8YW00Y2hhcnRzLlhZQ2hhcnQ+IHtcclxuICAgIFxyXG4gICAgaWYgKHNldHRpbmdzLlRpbWVsaW5lKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJUaW1lbGluZSBub3Qgc3VwcG9ydGVkIGZvciB2ZXJ0aWNhbCBjaGFydFwiKTtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLy9QZXIgZXZpdGFyZSBkaSBkaW1lbnRpY2FybWVsaSBlIGdlc3RpcmUgY29tdW5xdWUgYmVuZSBnbGkgbmdpZiBlY2MuLi5cclxuICAgIGFtNGNvcmUub3B0aW9ucy5hdXRvRGlzcG9zZSA9IHRydWU7XHJcblxyXG4gICAgdGhpcy5DaGFydEluc3RhbmNlID0gYW00Y29yZS5jcmVhdGUoc2V0dGluZ3MuTmFtZSwgYW00Y2hhcnRzLlhZQ2hhcnQpO1xyXG4gICAgbGV0IENoYXJ0SW5zdGFuY2VDYXN0ZWQgPSA8YW00Y2hhcnRzLlhZQ2hhcnQ+dGhpcy5DaGFydEluc3RhbmNlO1xyXG5cclxuICAgIC8vIENyZWF0ZSBheGVzIFxyXG4gICAgbGV0IHlBeGlzID0gQ2hhcnRJbnN0YW5jZUNhc3RlZC55QXhlcy5wdXNoKG5ldyBhbTRjaGFydHMuVmFsdWVBeGlzKCkpO1xyXG4gICAgaWYgKHNldHRpbmdzLllBeGlzVGl0bGUpIHtcclxuICAgICAgeUF4aXMudGl0bGUudGV4dCA9IHNldHRpbmdzLllBeGlzVGl0bGVcclxuICAgICAgeUF4aXMudGl0bGUuZm9udFdlaWdodCA9IFwiYm9sZFwiO1xyXG4gICAgfVxyXG4gICAgbGV0IGNhdGVnb3J5QXhpcyA9IENoYXJ0SW5zdGFuY2VDYXN0ZWQueEF4ZXMucHVzaChuZXcgYW00Y2hhcnRzLkNhdGVnb3J5QXhpcygpKTtcclxuICAgIGlmIChzZXR0aW5ncy5YQXhpc1RpdGxlKSB7XHJcbiAgICAgIGNhdGVnb3J5QXhpcy50aXRsZS50ZXh0ID0gc2V0dGluZ3MuWEF4aXNUaXRsZVxyXG4gICAgICBjYXRlZ29yeUF4aXMudGl0bGUuZm9udFdlaWdodCA9IFwiYm9sZFwiO1xyXG4gICAgfVxyXG5cclxuICAgIHlBeGlzLm1pbiA9IDA7XHJcblxyXG4gICAgY2F0ZWdvcnlBeGlzLmRhdGFGaWVsZHMuY2F0ZWdvcnkgPSBcImtleVwiO1xyXG4gICAgY2F0ZWdvcnlBeGlzLnJlbmRlcmVyLmdyaWQudGVtcGxhdGUubG9jYXRpb24gPSAwO1xyXG4gICAgY2F0ZWdvcnlBeGlzLnJlbmRlcmVyLm1pbkdyaWREaXN0YW5jZSA9IHNldHRpbmdzPy5NaW5HcmlkRGlzdGFuY2UgPz8gMzA7XHJcblxyXG4gICAgbGV0IGxhYmVsID0gY2F0ZWdvcnlBeGlzLnJlbmRlcmVyLmxhYmVscy50ZW1wbGF0ZTtcclxuICAgIGxhYmVsLnRydW5jYXRlID0gdHJ1ZTtcclxuICAgIGxhYmVsLm1heFdpZHRoID0gc2V0dGluZ3MuTGFiZWxXaWR0aCA/PyB0aGlzLkxhYmVsV2lkdGg7XHJcbiAgICBsYWJlbC50b29sdGlwVGV4dCA9IFwie2NhdGVnb3J5fVwiO1xyXG5cclxuICAgIGlmIChzZXR0aW5ncz8uQWRhcHRMYWJlbFNpemVBbmRPcmllbnRhdGlvbiA9PSBudWxsID8gdHJ1ZSA6IHNldHRpbmdzPy5BZGFwdExhYmVsU2l6ZUFuZE9yaWVudGF0aW9uKSB7XHJcbiAgICAgIGNhdGVnb3J5QXhpcy5ldmVudHMub24oXCJzaXplY2hhbmdlZFwiLCAoZXYpID0+IHtcclxuICAgICAgICBsZXQgYXhpcyA9IGV2LnRhcmdldDtcclxuICAgICAgICB2YXIgY2VsbFdpZHRoID0gYXhpcy5waXhlbFdpZHRoIC8gKGF4aXMuZW5kSW5kZXggLSBheGlzLnN0YXJ0SW5kZXgpO1xyXG4gICAgICAgIGlmIChjZWxsV2lkdGggPCBheGlzLnJlbmRlcmVyLmxhYmVscy50ZW1wbGF0ZS5tYXhXaWR0aCkge1xyXG4gICAgICAgICAgbGV0IGFyZVdlSW5EYW5nZXJab25lID0gY2VsbFdpZHRoIDwgKHNldHRpbmdzPy5MYWJlbFZlcnRpY2FsT3JpZW50YXRpb25DdXRvZmZXaWR0aCA/PyB0aGlzLmRhbmdlclpvbmUpO1xyXG4gICAgICAgICAgYXhpcy5yZW5kZXJlci5sYWJlbHMudGVtcGxhdGUucm90YXRpb24gPSBhcmVXZUluRGFuZ2VyWm9uZSA/IC05MCA6IC00NTtcclxuICAgICAgICAgIGF4aXMucmVuZGVyZXIubGFiZWxzLnRlbXBsYXRlLmR4ID0gc2V0dGluZ3MuTGFiZWxSaWdodFdoZW5Db21wcmVzc2VkID8/IGFyZVdlSW5EYW5nZXJab25lID8gMCA6IHRoaXMuTGFiZWxSaWdodFdoZW5Db21wcmVzc2VkO1xyXG4gICAgICAgICAgYXhpcy5yZW5kZXJlci5sYWJlbHMudGVtcGxhdGUuZHkgPSBzZXR0aW5ncy5MYWJlbFRvcFdoZW5Db21wcmVzc2VkID8/IHRoaXMuTGFiZWxUb3BXaGVuQ29tcHJlc3NlZDtcclxuICAgICAgICAgIGF4aXMucmVuZGVyZXIubGFiZWxzLnRlbXBsYXRlLmhvcml6b250YWxDZW50ZXIgPSBcInJpZ2h0XCI7XHJcbiAgICAgICAgICBheGlzLnJlbmRlcmVyLmxhYmVscy50ZW1wbGF0ZS52ZXJ0aWNhbENlbnRlciA9IFwibWlkZGxlXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgYXhpcy5yZW5kZXJlci5sYWJlbHMudGVtcGxhdGUucm90YXRpb24gPSAwO1xyXG4gICAgICAgICAgYXhpcy5yZW5kZXJlci5sYWJlbHMudGVtcGxhdGUuZHggPSAwO1xyXG4gICAgICAgICAgYXhpcy5yZW5kZXJlci5sYWJlbHMudGVtcGxhdGUuZHkgPSAwO1xyXG4gICAgICAgICAgYXhpcy5yZW5kZXJlci5sYWJlbHMudGVtcGxhdGUuaG9yaXpvbnRhbENlbnRlciA9IFwibWlkZGxlXCI7XHJcbiAgICAgICAgICBheGlzLnJlbmRlcmVyLmxhYmVscy50ZW1wbGF0ZS52ZXJ0aWNhbENlbnRlciA9IFwidG9wXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZGF0YVByZUNvbnZlcnRlZDogVmVydGljYWxTdGFja2VkQ2hhcnREYXRhID0gdGhpcy5BZGFwdGVyID8gdGhpcy5BZGFwdGVyLmFkYXB0RGF0YUZvclZlcnRpY2FsU3RhY2tlZENoYXJ0KGRhdGEpIDogZGF0YTtcclxuXHJcbiAgICBsZXQgZGF0YUNvbnZlcnRlZCA9IFtdO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhUHJlQ29udmVydGVkLmdyb3Vwcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgaXRlbSA9IGRhdGFQcmVDb252ZXJ0ZWQuZ3JvdXBzW2ldO1xyXG4gICAgICBsZXQgb2JqID0geyBrZXk6IGl0ZW0ubmFtZSB9O1xyXG4gICAgICBmb3IgKGxldCBwID0gMDsgcCA8IGl0ZW0udmFsdWVzLmxlbmd0aDsgcCsrKSB7XHJcbiAgICAgICAgbGV0IHZhbHVlID0gaXRlbS52YWx1ZXNbcF07XHJcbiAgICAgICAgb2JqW3ZhbHVlLmtdID0gdmFsdWUudjtcclxuICAgICAgfVxyXG4gICAgICBkYXRhQ29udmVydGVkLnB1c2gob2JqKTtcclxuICAgIH1cclxuXHJcbiAgICBDaGFydEluc3RhbmNlQ2FzdGVkLmRhdGEgPSBkYXRhQ29udmVydGVkO1xyXG5cclxuICAgIC8vUHJlbmRvIGxhIHByaW1hIGNhdGVnb3JpYSBlIG1pIGJhc28gc3VsbGUgcHJvcHJpZXTDoCBwZXIgZGZlaW5pcmUgbGUgc2VyaWVcclxuICAgIGZvciAobGV0IHByb3AgaW4gZGF0YUNvbnZlcnRlZFswXSkge1xyXG4gICAgICBpZiAocHJvcCAhPT0gXCJrZXlcIilcclxuICAgICAgICB0aGlzLmNyZWF0ZVNlcmllc1N0YWNrZWQoQ2hhcnRJbnN0YW5jZUNhc3RlZCwgc2V0dGluZ3MsIHByb3AsIHByb3ApO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzZXR0aW5ncy5MZWdlbmQpIHtcclxuICAgICAgQ2hhcnRJbnN0YW5jZUNhc3RlZC5sZWdlbmQgPSBuZXcgYW00Y2hhcnRzLkxlZ2VuZCgpO1xyXG4gICAgICBDaGFydEluc3RhbmNlQ2FzdGVkLmxlZ2VuZC5wb3NpdGlvbiA9IHNldHRpbmdzPy5MZWdlbmRQb3NpdGlvbiA/PyAncmlnaHQnO1xyXG4gICAgICBDaGFydEluc3RhbmNlQ2FzdGVkLmxlZ2VuZC5pdGVtQ29udGFpbmVycy50ZW1wbGF0ZS50b29sdGlwVGV4dCA9IFwie2NhdGVnb3J5fVwiO1xyXG5cclxuICAgICAgaWYgKHNldHRpbmdzLkxlZ2VuZFBhZGRpbmcpIHtcclxuICAgICAgICBsZXQgdGVtcGxhdGUgPSB0aGlzLkNoYXJ0SW5zdGFuY2UubGVnZW5kLml0ZW1Db250YWluZXJzLnRlbXBsYXRlO1xyXG4gICAgICAgIHRlbXBsYXRlLnBhZGRpbmdUb3AgPSBzZXR0aW5ncy5MZWdlbmRQYWRkaW5nLnRvcCA/PyAwO1xyXG4gICAgICAgIHRlbXBsYXRlLnBhZGRpbmdCb3R0b20gPSBzZXR0aW5ncy5MZWdlbmRQYWRkaW5nLmJvdHRvbSA/PyAwO1xyXG4gICAgICAgIHRlbXBsYXRlLnBhZGRpbmdMZWZ0ID0gc2V0dGluZ3MuTGVnZW5kUGFkZGluZy5sZWZ0ID8/IDA7XHJcbiAgICAgICAgdGVtcGxhdGUucGFkZGluZ1JpZ2h0ID0gc2V0dGluZ3MuTGVnZW5kUGFkZGluZy5yaWdodCA/PyAwO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKiBAaWdub3JlICovXHJcbiAgcHVibGljIHJlZnJlc2hEYXRhKGRhdGE6IFZlcnRpY2FsU3RhY2tlZENoYXJ0RGF0YSB8IGFueSkge1xyXG4gICAgLy9UT0RPOklNUExcclxuICB9XHJcblxyXG4gIC8qKiBAaWdub3JlICovXHJcbiAgcHJpdmF0ZSBjcmVhdGVTZXJpZXNTdGFja2VkKGNoYXJ0LCBzZXR0aW5nczogVmVydGljYWxTdGFja2VkQ2hhcnRTZXR0aW5ncywgZmllbGQsIG5hbWUpIHtcclxuICAgIC8vIFNldCB1cCBzZXJpZXNcclxuICAgIGxldCBzZXJpZXMgPSBjaGFydC5zZXJpZXMucHVzaChuZXcgYW00Y2hhcnRzLkNvbHVtblNlcmllcygpKTtcclxuICAgIHNlcmllcy5uYW1lID0gbmFtZTtcclxuICAgIHNlcmllcy5kYXRhRmllbGRzLnZhbHVlWSA9IGZpZWxkO1xyXG4gICAgc2VyaWVzLmRhdGFGaWVsZHMuY2F0ZWdvcnlYID0gXCJrZXlcIjtcclxuICAgIHNlcmllcy5zZXF1ZW5jZWRJbnRlcnBvbGF0aW9uID0gdHJ1ZTtcclxuICAgIHNlcmllcy5jb2x1bW5zLnRlbXBsYXRlLnRvb2x0aXBUZXh0ID0gXCJ7bmFtZX0ge2NhdGVnb3J5WH06IFtib2xkXXt2YWx1ZVl9Wy9dXCI7XHJcbiAgICBzZXJpZXMuY29sdW1ucy50ZW1wbGF0ZS5maWxsT3BhY2l0eSA9IC44O1xyXG4gICAgc2VyaWVzLmNvbHVtbnMudGVtcGxhdGUud2lkdGggPSBhbTRjb3JlLnBlcmNlbnQoc2V0dGluZ3MuQ29sdW1uV2lkdGhQZXJjZW50YWdlID8/IHRoaXMuRGVmYXVsdENvbHVtbldpZHRoUGVyY2VudGFnZSk7XHJcblxyXG4gICAgLy8gTWFrZSBpdCBzdGFja2VkXHJcbiAgICBzZXJpZXMuc3RhY2tlZCA9IHRydWU7XHJcblxyXG4gICAgcmV0dXJuIHNlcmllcztcclxuICB9XHJcbn0iXX0=
|