@esfaenza/es-charts 15.2.7 → 16.2.0

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.
Files changed (102) hide show
  1. package/{esm2020 → esm2022}/esfaenza-es-charts.mjs +4 -4
  2. package/{esm2020 → esm2022}/lib/adapters/BaseAdapter.mjs +50 -50
  3. package/{esm2020 → esm2022}/lib/adapters/IBaseAdapter.mjs +1 -1
  4. package/{esm2020 → esm2022}/lib/components/base/base-chart.component.mjs +350 -350
  5. package/{esm2020 → esm2022}/lib/components/chart-pager/chart-pager.component.mjs +89 -89
  6. package/{esm2020 → esm2022}/lib/components/specializations/es-area-chart.component.mjs +77 -77
  7. package/{esm2020 → esm2022}/lib/components/specializations/es-chart.component.mjs +122 -122
  8. package/{esm2020 → esm2022}/lib/components/specializations/es-line-chart.component.mjs +112 -112
  9. package/{esm2020 → esm2022}/lib/components/specializations/es-pie-chart.component.mjs +98 -98
  10. package/{esm2020 → esm2022}/lib/components/specializations/es-vertical-2d-chart.component.mjs +95 -95
  11. package/{esm2020 → esm2022}/lib/components/specializations/es-vertical-chart.component.mjs +92 -92
  12. package/{esm2020 → esm2022}/lib/components/specializations/es-vertical-stacked-chart.component.mjs +92 -92
  13. package/{esm2020 → esm2022}/lib/es-charts.module.mjs +67 -67
  14. package/{esm2020 → esm2022}/lib/models/EsChaartsModuleConfig.mjs +5 -5
  15. package/{esm2020 → esm2022}/lib/models/core/ChartDispatcher.mjs +91 -91
  16. package/{esm2020 → esm2022}/lib/models/core/ChartLoader.mjs +212 -212
  17. package/{esm2020 → esm2022}/lib/models/core/ChartThemes.mjs +60 -60
  18. package/{esm2020 → esm2022}/lib/models/data/AreaChartData.mjs +15 -15
  19. package/{esm2020 → esm2022}/lib/models/data/LineChartData.mjs +15 -15
  20. package/{esm2020 → esm2022}/lib/models/data/PagedChartData.mjs +19 -19
  21. package/{esm2020 → esm2022}/lib/models/data/PieChartData.mjs +13 -13
  22. package/{esm2020 → esm2022}/lib/models/data/Vertical2DChartData.mjs +15 -15
  23. package/{esm2020 → esm2022}/lib/models/data/VerticalChartData.mjs +13 -13
  24. package/{esm2020 → esm2022}/lib/models/data/VerticalStackedChartData.mjs +13 -13
  25. package/{esm2020 → esm2022}/lib/models/data/base/DateValue.mjs +10 -10
  26. package/{esm2020 → esm2022}/lib/models/data/base/KeyValue.mjs +10 -10
  27. package/{esm2020 → esm2022}/lib/models/data/base/KeyValueColor.mjs +12 -12
  28. package/{esm2020 → esm2022}/lib/models/data/base/Limit.mjs +15 -15
  29. package/{esm2020 → esm2022}/lib/models/data/base/LineSerie.mjs +27 -27
  30. package/{esm2020 → esm2022}/lib/models/settings/AreaChartSettings.mjs +10 -10
  31. package/{esm2020 → esm2022}/lib/models/settings/LineChartSettings.mjs +10 -10
  32. package/{esm2020 → esm2022}/lib/models/settings/PieChartSettings.mjs +6 -6
  33. package/{esm2020 → esm2022}/lib/models/settings/Vertical2DChartSettings.mjs +10 -10
  34. package/{esm2020 → esm2022}/lib/models/settings/VerticalChartSettings.mjs +10 -10
  35. package/{esm2020 → esm2022}/lib/models/settings/VerticalStackedChartSettings.mjs +10 -10
  36. package/{esm2020 → esm2022}/lib/models/settings/base/BaseInterval.mjs +5 -5
  37. package/{esm2020 → esm2022}/lib/models/settings/base/BaseSettings.mjs +5 -5
  38. package/{esm2020 → esm2022}/lib/models/settings/base/LegendPad.mjs +5 -5
  39. package/esm2022/lib/services/AreaChartService.mjs +157 -0
  40. package/esm2022/lib/services/LineChartService.mjs +392 -0
  41. package/{esm2020 → esm2022}/lib/services/PieChartService.mjs +113 -113
  42. package/{esm2020 → esm2022}/lib/services/Vertical2DChartService.mjs +162 -162
  43. package/{esm2020 → esm2022}/lib/services/VerticalChartService.mjs +113 -113
  44. package/{esm2020 → esm2022}/lib/services/VerticalStackedChartService.mjs +126 -126
  45. package/{esm2020 → esm2022}/lib/services/base/IBaseService.mjs +1 -1
  46. package/{esm2020 → esm2022}/lib/tokens.mjs +13 -13
  47. package/{esm2020 → esm2022}/public-api.mjs +38 -38
  48. package/{fesm2020 → fesm2022}/esfaenza-es-charts.mjs +2728 -2688
  49. package/fesm2022/esfaenza-es-charts.mjs.map +1 -0
  50. package/index.d.ts +5 -5
  51. package/lib/adapters/BaseAdapter.d.ts +40 -40
  52. package/lib/adapters/IBaseAdapter.d.ts +35 -35
  53. package/lib/components/base/base-chart.component.d.ts +304 -304
  54. package/lib/components/chart-pager/chart-pager.component.d.ts +70 -70
  55. package/lib/components/specializations/es-area-chart.component.d.ts +53 -53
  56. package/lib/components/specializations/es-chart.component.d.ts +71 -71
  57. package/lib/components/specializations/es-line-chart.component.d.ts +112 -112
  58. package/lib/components/specializations/es-pie-chart.component.d.ts +81 -81
  59. package/lib/components/specializations/es-vertical-2d-chart.component.d.ts +79 -79
  60. package/lib/components/specializations/es-vertical-chart.component.d.ts +74 -74
  61. package/lib/components/specializations/es-vertical-stacked-chart.component.d.ts +74 -74
  62. package/lib/es-charts.module.d.ts +18 -18
  63. package/lib/models/EsChaartsModuleConfig.d.ts +24 -24
  64. package/lib/models/core/ChartDispatcher.d.ts +46 -46
  65. package/lib/models/core/ChartLoader.d.ts +92 -92
  66. package/lib/models/core/ChartThemes.d.ts +23 -23
  67. package/lib/models/data/AreaChartData.d.ts +22 -22
  68. package/lib/models/data/LineChartData.d.ts +16 -16
  69. package/lib/models/data/PagedChartData.d.ts +23 -23
  70. package/lib/models/data/PieChartData.d.ts +13 -13
  71. package/lib/models/data/Vertical2DChartData.d.ts +27 -27
  72. package/lib/models/data/VerticalChartData.d.ts +13 -13
  73. package/lib/models/data/VerticalStackedChartData.d.ts +21 -21
  74. package/lib/models/data/base/DateValue.d.ts +9 -9
  75. package/lib/models/data/base/KeyValue.d.ts +9 -9
  76. package/lib/models/data/base/KeyValueColor.d.ts +11 -11
  77. package/lib/models/data/base/Limit.d.ts +14 -14
  78. package/lib/models/data/base/LineSerie.d.ts +28 -28
  79. package/lib/models/settings/AreaChartSettings.d.ts +10 -10
  80. package/lib/models/settings/LineChartSettings.d.ts +67 -67
  81. package/lib/models/settings/PieChartSettings.d.ts +34 -34
  82. package/lib/models/settings/Vertical2DChartSettings.d.ts +36 -36
  83. package/lib/models/settings/VerticalChartSettings.d.ts +31 -31
  84. package/lib/models/settings/VerticalStackedChartSettings.d.ts +31 -31
  85. package/lib/models/settings/base/BaseInterval.d.ts +13 -13
  86. package/lib/models/settings/base/BaseSettings.d.ts +67 -67
  87. package/lib/models/settings/base/LegendPad.d.ts +21 -21
  88. package/lib/services/AreaChartService.d.ts +32 -31
  89. package/lib/services/LineChartService.d.ts +48 -47
  90. package/lib/services/PieChartService.d.ts +27 -27
  91. package/lib/services/Vertical2DChartService.d.ts +39 -39
  92. package/lib/services/VerticalChartService.d.ts +33 -33
  93. package/lib/services/VerticalStackedChartService.d.ts +35 -35
  94. package/lib/services/base/IBaseService.d.ts +38 -38
  95. package/lib/tokens.d.ts +13 -13
  96. package/package.json +11 -17
  97. package/public-api.d.ts +35 -35
  98. package/esm2020/lib/services/AreaChartService.mjs +0 -137
  99. package/esm2020/lib/services/LineChartService.mjs +0 -372
  100. package/fesm2015/esfaenza-es-charts.mjs +0 -2829
  101. package/fesm2015/esfaenza-es-charts.mjs.map +0 -1
  102. package/fesm2020/esfaenza-es-charts.mjs.map +0 -1
@@ -1,114 +1,114 @@
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
- setSelection(from, to) {
101
- }
102
- /** @ignore */
103
- refreshData(data) {
104
- //TODO:IMPL
105
- }
106
- /** @ignore */
107
- hideZeroes(ev) {
108
- if (ev.target.dataItem && (ev.target.dataItem.values.value.percent == 0))
109
- ev.target.hide();
110
- else
111
- ev.target.show();
112
- }
113
- }
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
+ setSelection(from, to) {
101
+ }
102
+ /** @ignore */
103
+ refreshData(data) {
104
+ //TODO:IMPL
105
+ }
106
+ /** @ignore */
107
+ hideZeroes(ev) {
108
+ if (ev.target.dataItem && (ev.target.dataItem.values.value.percent == 0))
109
+ ev.target.hide();
110
+ else
111
+ ev.target.show();
112
+ }
113
+ }
114
114
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGllQ2hhcnRTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXMtY2hhcnRzL3NyYy9saWIvc2VydmljZXMvUGllQ2hhcnRTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU1BLE9BQU8sS0FBSyxPQUFPLE1BQU0sMEJBQTBCLENBQUM7QUFDcEQsT0FBTyxLQUFLLFNBQVMsTUFBTSw0QkFBNEIsQ0FBQztBQUV4RDs7R0FFRztBQUNILE1BQU0sT0FBTyxlQUFlO0lBTXhCLGNBQWM7SUFDZCxZQUFtQixPQUFvQjtRQUFwQixZQUFPLEdBQVAsT0FBTyxDQUFhO1FBSnZDLGNBQWM7UUFDTix1QkFBa0IsR0FBWSxJQUFJLENBQUM7SUFHQSxDQUFDO0lBRTVDOztPQUVHO0lBQ0ksVUFBVSxDQUFDLElBQXdCLEVBQUUsUUFBMEI7UUFDbEUsSUFBSSxRQUFRLENBQUMsUUFBUSxFQUFFO1lBQ25CLE9BQU8sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztZQUN0RCxPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsdUVBQXVFO1FBQ3ZFLE9BQU8sQ0FBQyxPQUFPLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUVuQyxJQUFJLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEgsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsSUFBSSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBUyxRQUFTLENBQUMsZUFBZSxDQUFDO1FBRWxILElBQUksTUFBTSxHQUFnRCxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJ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LFFBQVEsQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDO2FBQzdEO1NBQ0o7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsY0FBYztJQUNkLFlBQVksQ0FBQyxJQUFVLEVBQUUsRUFBUTtJQUVqQyxDQUFDO0lBRUQsY0FBYztJQUNQLFdBQVcsQ0FBQyxJQUF3QjtRQUN2QyxXQUFXO0lBQ2YsQ0FBQztJQUVELGNBQWM7SUFDTixVQUFVLENBQUMsRUFBRTtRQUNqQixJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDO1lBQ3BFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7O1lBRWpCLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDekIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUJhc2VTZXJ2aWNlIH0gZnJvbSAnLi9iYXNlL0lCYXNlU2VydmljZSc7XHJcbmltcG9ydCB7IEJhc2VBZGFwdGVyIH0gZnJvbSAnLi4vYWRhcHRlcnMvQmFzZUFkYXB0ZXInO1xyXG5pbXBvcnQgeyBQaWVDaGFydERhdGEgfSBmcm9tICcuLi9tb2RlbHMvZGF0YS9QaWVDaGFydERhdGEnO1xyXG5pbXBvcnQgeyBLZXlWYWx1ZUNvbG9yIH0gZnJvbSAnLi4vbW9kZWxzL2RhdGEvYmFzZS9LZXlWYWx1ZUNvbG9yJztcclxuaW1wb3J0IHsgUGllQ2hhcnRTZXR0aW5ncyB9IGZyb20gJy4uL21vZGVscy9zZXR0aW5ncy9QaWVDaGFydFNldHRpbmdzJztcclxuXHJcbmltcG9ydCAqIGFzIGFtNGNvcmUgZnJvbSBcIkBhbWNoYXJ0cy9hbWNoYXJ0czQvY29yZVwiO1xyXG5pbXBvcnQgKiBhcyBhbTRjaGFydHMgZnJvbSBcIkBhbWNoYXJ0cy9hbWNoYXJ0czQvY2hhcnRzXCI7XHJcblxyXG4vKipcclxuICogQ2xhc3NlIGlsIGN1aSB1bmljbyBzY29wbyDDqCBnZXN0aXJlIGlsIHNldHVwIGUgcmVuZGVyaW5nIGRpIHVuIFBpZUNoYXJ0XHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgUGllQ2hhcnRTZXJ2aWNlIGltcGxlbWVudHMgSUJhc2VTZXJ2aWNlPGFtNGNoYXJ0cy5QaWVDaGFydD57XHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcHVibGljIENoYXJ0SW5zdGFuY2U6IGFtNGNoYXJ0cy5QaWVDaGFydDNEIHwgYW00Y2hhcnRzLlBpZUNoYXJ0O1xyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHByaXZhdGUgVmlld0Fic29sdXRlVmFsdWVzOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgY29uc3RydWN0b3IocHVibGljIEFkYXB0ZXI6IEJhc2VBZGFwdGVyKSB7IH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldG9kbyBjaGUgZGF0YSB1bmEgY29wcGlhIERhdGkgLSBJbXBvc3RhemlvbmkgbGkgdXRpbGl6emEgcGVyIGNyZWFyZSBlIHZpc3VhbGl6emFyZSB1biBQaWVDaGFydFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ3JhcGhpY2F0ZShkYXRhOiBQaWVDaGFydERhdGEgfCBhbnksIHNldHRpbmdzOiBQaWVDaGFydFNldHRpbmdzKTogSUJhc2VTZXJ2aWNlPGFtNGNoYXJ0cy5QaWVDaGFydD4ge1xyXG4gICAgICAgIGlmIChzZXR0aW5ncy5UaW1lbGluZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiVGltZWxpbmUgbm90IHN1cHBvcnRlZCBmb3IgcGllIGNoYXJ0XCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vUGVyIGV2aXRhcmUgZGkgZGltZW50aWNhcm1lbGkgZSBnZXN0aXJlIGNvbXVucXVlIGJlbmUgZ2xpIG5naWYgZWNjLi4uXHJcbiAgICAgICAgYW00Y29yZS5vcHRpb25zLmF1dG9EaXNwb3NlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgdGhpcy5DaGFydEluc3RhbmNlID0gYW00Y29yZS5jcmVhdGUoc2V0dGluZ3MuTmFtZSwgc2V0dGluZ3MuTW9kZTNEID8gYW00Y2hhcnRzLlBpZUNoYXJ0M0QgOiBhbTRjaGFydHMuUGllQ2hhcnQpO1xyXG4gICAgICAgIHRoaXMuQ2hhcnRJbnN0YW5jZS5pbm5lclJhZGl1cyA9ICgoc2V0dGluZ3MuRG9udXRSYWRpdXNQZXJjZW50YWdlIHx8IDE1KSAvIDEwMCkgKiAoPGFueT5zZXR0aW5ncykuQ29udGFpbmVySGVpZ2h0O1xyXG5cclxuICAgICAgICBsZXQgc2VyaWVzOiBhbTRjaGFydHMuUGllU2VyaWVzM0QgfCBhbTRjaGFydHMuUGllU2VyaWVzID0gdGhpcy5DaGFydEluc3RhbmNlLnNlcmllcy5wdXNoKHNldHRpbmdzLk1vZGUzRCA/IG5ldyBhbTRjaGFydHMuUGllU2VyaWVzM0QoKSA6IG5ldyBhbTRjaGFydHMuUGllU2VyaWVzKCkpO1xyXG4gICAgICAgIHNlcmllcy5kYXRhRmllbGRzLnZhbHVlID0gXCJ2XCI7XHJcbiAgICAgICAgc2VyaWVzLmRhdGFGaWVsZHMuY2F0ZWdvcnkgPSBcImtcIjtcclxuICAgICAgICAvL0lsIGRlZmF1bHQgc29ubyB2YWxvcmkgcGVyY2VudHVhbGlcclxuICAgICAgICBpZiAodGhpcy5WaWV3QWJzb2x1dGVWYWx1ZXMpIHtcclxuICAgICAgICAgICAgc2VyaWVzLmxlZ2VuZFNldHRpbmdzLnZhbHVlVGV4dCA9IFwie3ZhbHVlfVwiO1xyXG4gICAgICAgICAgICBzZXJpZXMubGFiZWxzLnRlbXBsYXRlLnRleHQgPSBcIntjYXRlZ29yeX06IFtib2xkXXt2YWx1ZX1bL11cIlxyXG4gICAgICAgIH1cclxuICAgICAgICBzZXJpZXMuc2xpY2VzLnRlbXBsYXRlLnN0cm9rZSA9IGFtNGNvcmUuY29sb3IoXCIjZmZmXCIpO1xyXG4gICAgICAgIHNlcmllcy5zbGljZXMudGVtcGxhdGUuc3Ryb2tlT3BhY2l0eSA9IDE7XHJcbiAgICAgICAgc2VyaWVzLnNsaWNlcy50ZW1wbGF0ZS50b2dnbGFibGUgPSBmYWxzZTtcclxuICAgICAgICBzZXJpZXMuaGlkZGVuU3RhdGUucHJvcGVydGllcy5vcGFjaXR5ID0gMTtcclxuICAgICAgICBzZXJpZXMuaGlkZGVuU3RhdGUucHJvcGVydGllcy5lbmRBbmdsZSA9IC05MDtcclxuICAgICAgICBzZXJpZXMuaGlkZGVuU3RhdGUucHJvcGVydGllcy5zdGFydEFuZ2xlID0gLTkwO1xyXG5cclxuICAgICAgICBpZiAoc2V0dGluZ3MuSGlkZVplcm9lcyA9PSBudWxsID8gdHJ1ZSA6IHNldHRpbmdzLkhpZGVaZXJvZXMpIHtcclxuICAgICAgICAgICAgc2VyaWVzLnRpY2tzLnRlbXBsYXRlLmV2ZW50cy5vbihcInJlYWR5XCIsIHRoaXMuaGlkZVplcm9lcyk7XHJcbiAgICAgICAgICAgIHNlcmllcy50aWNrcy50ZW1wbGF0ZS5ldmVudHMub24oXCJ2aXNpYmlsaXR5Y2hhbmdlZFwiLCB0aGlzLmhpZGVaZXJvZXMpO1xyXG4gICAgICAgICAgICBzZXJpZXMubGFiZWxzLnRlbXBsYXRlLmV2ZW50cy5vbihcInJlYWR5XCIsIHRoaXMuaGlkZVplcm9lcyk7XHJcbiAgICAgICAgICAgIHNlcmllcy5sYWJlbHMudGVtcGxhdGUuZXZlbnRzLm9uKFwidmlzaWJpbGl0eWNoYW5nZWRcIiwgdGhpcy5oaWRlWmVyb2VzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNlcmllcy5zbGljZXMudGVtcGxhdGUuZXZlbnRzLm9uKFwiaGl0XCIsIChldikgPT4ge1xyXG4gICAgICAgICAgICBpZiAoKDxhbnk+c2V0dGluZ3MpLk9uU2VyaWVzQ2xpY2tDYWxsYmFjaykge1xyXG4gICAgICAgICAgICAgICAgbGV0IGNsaWNrZWRTZXJpZXMgPSAoPEtleVZhbHVlQ29sb3I+ZXYudGFyZ2V0LmRhdGFJdGVtLmRhdGFDb250ZXh0KS5rO1xyXG4gICAgICAgICAgICAgICAgKDxhbnk+c2V0dGluZ3MpLk9uU2VyaWVzQ2xpY2tDYWxsYmFjayhjbGlja2VkU2VyaWVzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBsZXQgZGF0YUNvbnZlcnRlZDogUGllQ2hhcnREYXRhID0gdGhpcy5BZGFwdGVyID8gdGhpcy5BZGFwdGVyLmFkYXB0RGF0YUZvclBpZUNoYXJ0KGRhdGEpIDogZGF0YTtcclxuXHJcbiAgICAgICAgbGV0IGRlZmF1bHRJbmRleCA9IDA7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhQ29udmVydGVkLnZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoIWRhdGFDb252ZXJ0ZWQudmFsdWVzW2ldLmMpIHtcclxuICAgICAgICAgICAgICAgIGRhdGFDb252ZXJ0ZWQudmFsdWVzW2ldLmMgPSA8YW55PnRoaXMuQ2hhcnRJbnN0YW5jZS5jb2xvcnMubGlzdFtkZWZhdWx0SW5kZXggJSB0aGlzLkNoYXJ0SW5zdGFuY2UuY29sb3JzLmxpc3QubGVuZ3RoXTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHRJbmRleCsrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIGRhdGFDb252ZXJ0ZWQudmFsdWVzW2ldLmMgPSA8YW55PmFtNGNvcmUuY29sb3IoZGF0YUNvbnZlcnRlZC52YWx1ZXNbaV0uYylcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNlcmllcy5zbGljZXMudGVtcGxhdGUucHJvcGVydHlGaWVsZHMuZmlsbCA9IFwiY1wiO1xyXG4gICAgICAgIHRoaXMuQ2hhcnRJbnN0YW5jZS5kYXRhID0gZGF0YUNvbnZlcnRlZC52YWx1ZXM7XHJcblxyXG4gICAgICAgIGlmICghc2V0dGluZ3MuTGFiZWxzVmlzaWJsZSkge1xyXG4gICAgICAgICAgICBzZXJpZXMubGFiZWxzLnRlbXBsYXRlLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgc2VyaWVzLnRpY2tzLnRlbXBsYXRlLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc2V0dGluZ3MuTGFiZWxzV3JhcCB8fCBzZXR0aW5ncy5MYWJlbHNUcnVuY2F0ZSkge1xyXG4gICAgICAgICAgICBzZXJpZXMubGFiZWxzLnRlbXBsYXRlLm1heFdpZHRoID0gc2V0dGluZ3MuTGFiZWxzV2lkdGggfHwgMTAwO1xyXG4gICAgICAgICAgICBpZiAoc2V0dGluZ3MuTGFiZWxzV3JhcClcclxuICAgICAgICAgICAgICAgIHNlcmllcy5sYWJlbHMudGVtcGxhdGUud3JhcCA9IHRydWU7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHNldHRpbmdzLkxhYmVsc1RydW5jYXRlKVxyXG4gICAgICAgICAgICAgICAgc2VyaWVzLmxhYmVscy50ZW1wbGF0ZS50cnVuY2F0ZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2V0dGluZ3MuTGVnZW5kKSB7XHJcbiAgICAgICAgICAgIGxldCBsZWdlbmQgPSBuZXcgYW00Y2hhcnRzLkxlZ2VuZCgpO1xyXG4gICAgICAgICAgICB0aGlzLkNoYXJ0SW5zdGFuY2UubGVnZW5kID0gbGVnZW5kXHJcbiAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IHNldHRpbmdzPy5MZWdlbmRQb3NpdGlvbiB8fCBcImJvdHRvbVwiO1xyXG4gICAgICAgICAgICBsZWdlbmQuaXRlbUNvbnRhaW5lcnMudGVtcGxhdGUudG9nZ2xhYmxlID0gc2V0dGluZ3MuSGlkZVNlcmllc09uTGFiZWxDbGljayA9PT0gdHJ1ZTtcclxuICAgICAgICAgICAgbGVnZW5kLml0ZW1Db250YWluZXJzLnRlbXBsYXRlLnRvb2x0aXBUZXh0ID0gXCJ7Y2F0ZWdvcnl9XCI7XHJcblxyXG4gICAgICAgICAgICAvL1NlIGxhIGxlZ2VuZGEgbm9uIGZhIGlsIHRvZ2dsZSBkZWxsYSBzZXJpZSBsYSBjb25zaWRlcm8gY29tZSBzZSBmb3NzZSB1biBjbGljayBzdWxsYSBzZXJpZSBpbiBzZVxyXG4gICAgICAgICAgICBpZiAoIXNldHRpbmdzLkhpZGVTZXJpZXNPbkxhYmVsQ2xpY2spIHtcclxuICAgICAgICAgICAgICAgIGxlZ2VuZC5pdGVtQ29udGFpbmVycy50ZW1wbGF0ZS5ldmVudHMub24oXCJoaXRcIiwgKGV2KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCg8YW55PnNldHRpbmdzKS5PblNlcmllc0NsaWNrQ2FsbGJhY2spIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNsaWNrZWRTZXJpZXMgPSAoPGFueT5ldi50YXJnZXQuZGF0YUl0ZW0uZGF0YUNvbnRleHQpLmxlZ2VuZERhdGFJdGVtLm5hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICg8YW55PnNldHRpbmdzKS5PblNlcmllc0NsaWNrQ2FsbGJhY2soY2xpY2tlZFNlcmllcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChzZXR0aW5ncy5MZWdlbmRQYWRkaW5nKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdGVtcGxhdGUgPSB0aGlzLkNoYXJ0SW5zdGFuY2UubGVnZW5kLml0ZW1Db250YWluZXJzLnRlbXBsYXRlO1xyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGUucGFkZGluZ1RvcCA9IHNldHRpbmdzLkxlZ2VuZFBhZGRpbmcudG9wID8/IDA7XHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZS5wYWRkaW5nQm90dG9tID0gc2V0dGluZ3MuTGVnZW5kUGFkZGluZy5ib3R0b20gPz8gMDtcclxuICAgICAgICAgICAgICAgIHRlbXBsYXRlLnBhZGRpbmdMZWZ0ID0gc2V0dGluZ3MuTGVnZW5kUGFkZGluZy5sZWZ0ID8/IDA7XHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZS5wYWRkaW5nUmlnaHQgPSBzZXR0aW5ncy5MZWdlbmRQYWRkaW5nLnJpZ2h0ID8/IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBzZXRTZWxlY3Rpb24oZnJvbTogRGF0ZSwgdG86IERhdGUpOiB2b2lkIHtcclxuXHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwdWJsaWMgcmVmcmVzaERhdGEoZGF0YTogUGllQ2hhcnREYXRhIHwgYW55KXtcclxuICAgICAgICAvL1RPRE86SU1QTFxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwcml2YXRlIGhpZGVaZXJvZXMoZXYpIHtcclxuICAgICAgICBpZiAoZXYudGFyZ2V0LmRhdGFJdGVtICYmIChldi50YXJnZXQuZGF0YUl0ZW0udmFsdWVzLnZhbHVlLnBlcmNlbnQgPT0gMCkpXHJcbiAgICAgICAgICAgIGV2LnRhcmdldC5oaWRlKCk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBldi50YXJnZXQuc2hvdygpO1xyXG4gICAgfVxyXG59Il19
@@ -1,163 +1,163 @@
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
- setSelection(from, to) {
110
- }
111
- /** @ignore */
112
- refreshData(data) {
113
- //TODO:IMPL
114
- }
115
- /** @ignore */
116
- createSeries(chart, settings, value, name) {
117
- let series = chart.series.push(new am4charts.ColumnSeries());
118
- series.dataFields.valueY = value;
119
- series.dataFields.categoryX = 'key';
120
- series.name = name;
121
- series.columns.template.tooltipText = "{name} {categoryX}: [bold]{valueY}[/]";
122
- series.columns.template.fillOpacity = .8;
123
- series.columns.template.width = am4core.percent(settings.ColumnWidthPercentage ?? this.DefaultColumnWidthPercentage);
124
- series.events.on("hidden", () => this.arrangeColumns);
125
- series.events.on("shown", () => this.arrangeColumns);
126
- return series;
127
- }
128
- /** @ignore */
129
- arrangeColumns() {
130
- let ChartInstanceCasted = this.ChartInstance;
131
- let series = ChartInstanceCasted.series.getIndex(0);
132
- let xAxis = ChartInstanceCasted.xAxes.getIndex(0);
133
- let w = 1 - xAxis.renderer.cellStartLocation - (1 - xAxis.renderer.cellEndLocation);
134
- if (series.dataItems.length > 1) {
135
- let x0 = xAxis.getX(series.dataItems.getIndex(0), "categoryX");
136
- let x1 = xAxis.getX(series.dataItems.getIndex(1), "categoryX");
137
- let delta = ((x1 - x0) / ChartInstanceCasted.series.length) * w;
138
- if (am4core.isNumber(delta)) {
139
- let middle = ChartInstanceCasted.series.length / 2;
140
- let newIndex = 0;
141
- ChartInstanceCasted.series.each((series) => {
142
- if (!series.isHidden && !series.isHiding) {
143
- series.dummyData = newIndex;
144
- newIndex++;
145
- }
146
- else {
147
- series.dummyData = ChartInstanceCasted.series.indexOf(series);
148
- }
149
- });
150
- let visibleCount = newIndex;
151
- let newMiddle = visibleCount / 2;
152
- ChartInstanceCasted.series.each((series) => {
153
- let trueIndex = ChartInstanceCasted.series.indexOf(series);
154
- let newIndex = series.dummyData;
155
- let dx = (newIndex - trueIndex + middle - newMiddle) * delta;
156
- series.animate({ property: "dx", to: dx }, series.interpolationDuration, series.interpolationEasing);
157
- series.bulletsContainer.animate({ property: "dx", to: dx }, series.interpolationDuration, series.interpolationEasing);
158
- });
159
- }
160
- }
161
- }
162
- }
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
+ setSelection(from, to) {
110
+ }
111
+ /** @ignore */
112
+ refreshData(data) {
113
+ //TODO:IMPL
114
+ }
115
+ /** @ignore */
116
+ createSeries(chart, settings, value, name) {
117
+ let series = chart.series.push(new am4charts.ColumnSeries());
118
+ series.dataFields.valueY = value;
119
+ series.dataFields.categoryX = 'key';
120
+ series.name = name;
121
+ series.columns.template.tooltipText = "{name} {categoryX}: [bold]{valueY}[/]";
122
+ series.columns.template.fillOpacity = .8;
123
+ series.columns.template.width = am4core.percent(settings.ColumnWidthPercentage ?? this.DefaultColumnWidthPercentage);
124
+ series.events.on("hidden", () => this.arrangeColumns);
125
+ series.events.on("shown", () => this.arrangeColumns);
126
+ return series;
127
+ }
128
+ /** @ignore */
129
+ arrangeColumns() {
130
+ let ChartInstanceCasted = this.ChartInstance;
131
+ let series = ChartInstanceCasted.series.getIndex(0);
132
+ let xAxis = ChartInstanceCasted.xAxes.getIndex(0);
133
+ let w = 1 - xAxis.renderer.cellStartLocation - (1 - xAxis.renderer.cellEndLocation);
134
+ if (series.dataItems.length > 1) {
135
+ let x0 = xAxis.getX(series.dataItems.getIndex(0), "categoryX");
136
+ let x1 = xAxis.getX(series.dataItems.getIndex(1), "categoryX");
137
+ let delta = ((x1 - x0) / ChartInstanceCasted.series.length) * w;
138
+ if (am4core.isNumber(delta)) {
139
+ let middle = ChartInstanceCasted.series.length / 2;
140
+ let newIndex = 0;
141
+ ChartInstanceCasted.series.each((series) => {
142
+ if (!series.isHidden && !series.isHiding) {
143
+ series.dummyData = newIndex;
144
+ newIndex++;
145
+ }
146
+ else {
147
+ series.dummyData = ChartInstanceCasted.series.indexOf(series);
148
+ }
149
+ });
150
+ let visibleCount = newIndex;
151
+ let newMiddle = visibleCount / 2;
152
+ ChartInstanceCasted.series.each((series) => {
153
+ let trueIndex = ChartInstanceCasted.series.indexOf(series);
154
+ let newIndex = series.dummyData;
155
+ let dx = (newIndex - trueIndex + middle - newMiddle) * delta;
156
+ series.animate({ property: "dx", to: dx }, series.interpolationDuration, series.interpolationEasing);
157
+ series.bulletsContainer.animate({ property: "dx", to: dx }, series.interpolationDuration, series.interpolationEasing);
158
+ });
159
+ }
160
+ }
161
+ }
162
+ }
163
163
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVmVydGljYWwyRENoYXJ0U2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VzLWNoYXJ0cy9zcmMvbGliL3NlcnZpY2VzL1ZlcnRpY2FsMkRDaGFydFNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsT0FBTyxLQUFLLE9BQU8sTUFBTSwwQkFBMEIsQ0FBQztBQUNwRCxPQUFPLEtBQUssU0FBUyxNQUFNLDRCQUE0QixDQUFDO0FBRXhEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLHNCQUFzQjtJQWdCakMsY0FBYztJQUNkLFlBQW1CLE9BQW9CO1FBQXBCLFlBQU8sR0FBUCxPQUFPLENBQWE7UUFkdkMsY0FBYztRQUNOLGtDQUE2QixHQUFXLENBQUMsQ0FBQztRQUNsRCxjQUFjO1FBQ04sZUFBVSxHQUFXLEVBQUUsQ0FBQztRQUNoQyxjQUFjO1FBQ04sZUFBVSxHQUFXLEdBQUcsQ0FBQztRQUNqQyxjQUFjO1FBQ04sNkJBQXdCLEdBQVcsRUFBRSxDQUFDO1FBQzlDLGNBQWM7UUFDTiwyQkFBc0IsR0FBVyxDQUFDLENBQUMsQ0FBQztRQUM1QyxjQUFjO1FBQ04saUNBQTRCLEdBQVcsRUFBRSxDQUFDO0lBR1AsQ0FBQztJQUU1Qzs7T0FFRztJQUNJLFVBQVUsQ0FBQyxJQUErQixFQUFFLFFBQWlDO1FBRWxGLElBQUksUUFBUSxDQUFDLFFBQVEsRUFBRTtZQUNyQixPQUFPLENBQUMsS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7WUFDM0QsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELHVFQUF1RTtRQUN2RSxPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFFbkMsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3RFLElBQUksbUJBQW1CLEdBQXNCLElB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TUFBTSxHQUFHLFNBQVMsQ0FBQyxHQUFHLEtBQUssQ0FBQTtvQkFFNUQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztvQkFDckcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztnQkFDeEgsQ0FBQyxDQUFDLENBQUE7YUFDSDtTQUNGO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUJhc2VTZXJ2aWNlIH0gZnJvbSAnLi9iYXNlL0lCYXNlU2VydmljZSc7XHJcbmltcG9ydCB7IEJhc2VBZGFwdGVyIH0gZnJvbSAnLi4vYWRhcHRlcnMvQmFzZUFkYXB0ZXInO1xyXG5pbXBvcnQgeyBWZXJ0aWNhbDJEQ2hhcnREYXRhIH0gZnJvbSAnLi4vbW9kZWxzL2RhdGEvVmVydGljYWwyRENoYXJ0RGF0YSc7XHJcbmltcG9ydCB7IFZlcnRpY2FsMkRDaGFydFNldHRpbmdzIH0gZnJvbSAnLi4vbW9kZWxzL3NldHRpbmdzL1ZlcnRpY2FsMkRDaGFydFNldHRpbmdzJztcclxuXHJcbmltcG9ydCAqIGFzIGFtNGNvcmUgZnJvbSBcIkBhbWNoYXJ0cy9hbWNoYXJ0czQvY29yZVwiO1xyXG5pbXBvcnQgKiBhcyBhbTRjaGFydHMgZnJvbSBcIkBhbWNoYXJ0cy9hbWNoYXJ0czQvY2hhcnRzXCI7XHJcblxyXG4vKipcclxuICogQ2xhc3NlIGlsIGN1aSB1bmljbyBzY29wbyDDqCBnZXN0aXJlIGlsIHNldHVwIGUgcmVuZGVyaW5nIGRpIHVuIFZlcnRpY2FsMkRDaGFydFxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFZlcnRpY2FsMkRDaGFydFNlcnZpY2UgaW1wbGVtZW50cyBJQmFzZVNlcnZpY2U8YW00Y2hhcnRzLlhZQ2hhcnQ+e1xyXG4gIC8qKiBAaWdub3JlICovXHJcbiAgcHVibGljIENoYXJ0SW5zdGFuY2U6IGFtNGNoYXJ0cy5YWUNoYXJ0O1xyXG4gIC8qKiBAaWdub3JlICovXHJcbiAgcHJpdmF0ZSBEZWZhdWx0R3JvdXBQYWRkaW5nUGVyY2VudGFnZTogbnVtYmVyID0gNTtcclxuICAvKiogQGlnbm9yZSAqL1xyXG4gIHByaXZhdGUgZGFuZ2VyWm9uZTogbnVtYmVyID0gNTA7XHJcbiAgLyoqIEBpZ25vcmUgKi9cclxuICBwcml2YXRlIExhYmVsV2lkdGg6IG51bWJlciA9IDE1MDtcclxuICAvKiogQGlnbm9yZSAqL1xyXG4gIHByaXZhdGUgTGFiZWxSaWdodFdoZW5Db21wcmVzc2VkOiBudW1iZXIgPSAyMDtcclxuICAvKiogQGlnbm9yZSAqL1xyXG4gIHByaXZhdGUgTGFiZWxUb3BXaGVuQ29tcHJlc3NlZDogbnVtYmVyID0gLTU7XHJcbiAgLyoqIEBpZ25vcmUgKi9cclxuICBwcml2YXRlIERlZmF1bHRDb2x1bW5XaWR0aFBlcmNlbnRhZ2U6IG51bWJlciA9IDg1O1xyXG5cclxuICAvKiogQGlnbm9yZSAqL1xyXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBBZGFwdGVyOiBCYXNlQWRhcHRlcikgeyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ldG9kbyBjaGUgZGF0YSB1bmEgY29wcGlhIERhdGkgLSBJbXBvc3RhemlvbmkgbGkgdXRpbGl6emEgcGVyIGNyZWFyZSBlIHZpc3VhbGl6emFyZSB1biBWZXJ0aWNhbDJEQ2hhcnRcclxuICAgKi9cclxuICBwdWJsaWMgZ3JhcGhpY2F0ZShkYXRhOiBWZXJ0aWNhbDJEQ2hhcnREYXRhIHwgYW55LCBzZXR0aW5nczogVmVydGljYWwyRENoYXJ0U2V0dGluZ3MpOiBJQmFzZVNlcnZpY2U8YW00Y2hhcnRzLlhZQ2hhcnQ+IHtcclxuXHJcbiAgICBpZiAoc2V0dGluZ3MuVGltZWxpbmUpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihcIlRpbWVsaW5lIG5vdCBzdXBwb3J0ZWQgZm9yIHZlcnRpY2FsIGNoYXJ0XCIpO1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvL1BlciBldml0YXJlIGRpIGRpbWVudGljYXJtZWxpIGUgZ2VzdGlyZSBjb211bnF1ZSBiZW5lIGdsaSBuZ2lmIGVjYy4uLlxyXG4gICAgYW00Y29yZS5vcHRpb25zLmF1dG9EaXNwb3NlID0gdHJ1ZTtcclxuXHJcbiAgICB0aGlzLkNoYXJ0SW5zdGFuY2UgPSBhbTRjb3JlLmNyZWF0ZShzZXR0aW5ncy5OYW1lLCBhbTRjaGFydHMuWFlDaGFydCk7XHJcbiAgICBsZXQgQ2hhcnRJbnN0YW5jZUNhc3RlZCA9IDxhbTRjaGFydHMuWFlDaGFydD50aGlzLkNoYXJ0SW5zdGFuY2U7XHJcblxyXG4gICAgaWYgKHNldHRpbmdzLkxlZ2VuZCkge1xyXG4gICAgICBDaGFydEluc3RhbmNlQ2FzdGVkLmxlZ2VuZCA9IG5ldyBhbTRjaGFydHMuTGVnZW5kKCk7XHJcbiAgICAgIENoYXJ0SW5zdGFuY2VDYXN0ZWQubGVnZW5kLnBvc2l0aW9uID0gc2V0dGluZ3M/LkxlZ2VuZFBvc2l0aW9uID8/ICdyaWdodCc7XHJcbiAgICAgIENoYXJ0SW5zdGFuY2VDYXN0ZWQubGVnZW5kLml0ZW1Db250YWluZXJzLnRlbXBsYXRlLnRvb2x0aXBUZXh0ID0gXCJ7Y2F0ZWdvcnl9XCI7XHJcbiAgICAgIFxyXG4gICAgICBpZiAoc2V0dGluZ3MuTGVnZW5kUGFkZGluZykge1xyXG4gICAgICAgIGxldCB0ZW1wbGF0ZSA9IHRoaXMuQ2hhcnRJbnN0YW5jZS5sZWdlbmQuaXRlbUNvbnRhaW5lcnMudGVtcGxhdGU7XHJcbiAgICAgICAgdGVtcGxhdGUucGFkZGluZ1RvcCA9IHNldHRpbmdzLkxlZ2VuZFBhZGRpbmcudG9wID8/IDA7XHJcbiAgICAgICAgdGVtcGxhdGUucGFkZGluZ0JvdHRvbSA9IHNldHRpbmdzLkxlZ2VuZFBhZGRpbmcuYm90dG9tID8/IDA7XHJcbiAgICAgICAgdGVtcGxhdGUucGFkZGluZ0xlZnQgPSBzZXR0aW5ncy5MZWdlbmRQYWRkaW5nLmxlZnQgPz8gMDtcclxuICAgICAgICB0ZW1wbGF0ZS5wYWRkaW5nUmlnaHQgPSBzZXR0aW5ncy5MZWdlbmRQYWRkaW5nLnJpZ2h0ID8/IDA7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsZXQgeUF4aXMgPSBDaGFydEluc3RhbmNlQ2FzdGVkLnlBeGVzLnB1c2gobmV3IGFtNGNoYXJ0cy5WYWx1ZUF4aXMoKSk7XHJcbiAgICBpZiAoc2V0dGluZ3MuWUF4aXNUaXRsZSkge1xyXG4gICAgICB5QXhpcy50aXRsZS50ZXh0ID0gc2V0dGluZ3MuWUF4aXNUaXRsZVxyXG4gICAgICB5QXhpcy50aXRsZS5mb250V2VpZ2h0ID0gXCJib2xkXCI7XHJcbiAgICB9XHJcbiAgICBsZXQgY2F0ZWdvcnlBeGlzOiBhbTRjaGFydHMuQ2F0ZWdvcnlBeGlzID0gQ2hhcnRJbnN0YW5jZUNhc3RlZC54QXhlcy5wdXNoKG5ldyBhbTRjaGFydHMuQ2F0ZWdvcnlBeGlzKCkpXHJcbiAgICBpZiAoc2V0dGluZ3MuWEF4aXNUaXRsZSkge1xyXG4gICAgICBjYXRlZ29yeUF4aXMudGl0bGUudGV4dCA9IHNldHRpbmdzLlhBeGlzVGl0bGVcclxuICAgICAgY2F0ZWdvcnlBeGlzLnRpdGxlLmZvbnRXZWlnaHQgPSBcImJvbGRcIjtcclxuICAgIH1cclxuXHJcbiAgICB5QXhpcy5taW4gPSAwO1xyXG4gICAgY2F0ZWdvcnlBeGlzLmRhdGFGaWVsZHMuY2F0ZWdvcnkgPSAna2V5J1xyXG4gICAgY2F0ZWdvcnlBeGlzLnJlbmRlcmVyLmNlbGxTdGFydExvY2F0aW9uID0gYW00Y29yZS5wZXJjZW50KHNldHRpbmdzLkdyb3VwUGFkZGluZ1BlcmNlbnRhZ2UgPz8gdGhpcy5EZWZhdWx0R3JvdXBQYWRkaW5nUGVyY2VudGFnZSkudmFsdWVcclxuICAgIGNhdGVnb3J5QXhpcy5yZW5kZXJlci5jZWxsRW5kTG9jYXRpb24gPSBhbTRjb3JlLnBlcmNlbnQoMTAwIC0gKHNldHRpbmdzLkdyb3VwUGFkZGluZ1BlcmNlbnRhZ2UgPz8gdGhpcy5EZWZhdWx0R3JvdXBQYWRkaW5nUGVyY2VudGFnZSkpLnZhbHVlXHJcbiAgICBjYXRlZ29yeUF4aXMucmVuZGVyZXIuZ3JpZC50ZW1wbGF0ZS5sb2NhdGlvbiA9IDA7XHJcbiAgICBjYXRlZ29yeUF4aXMucmVuZGVyZXIubWluR3JpZERpc3RhbmNlID0gc2V0dGluZ3M/Lk1pbkdyaWREaXN0YW5jZSA/PyAzMDtcclxuXHJcbiAgICBsZXQgbGFiZWwgPSBjYXRlZ29yeUF4aXMucmVuZGVyZXIubGFiZWxzLnRlbXBsYXRlO1xyXG4gICAgbGFiZWwudHJ1bmNhdGUgPSB0cnVlO1xyXG4gICAgbGFiZWwubWF4V2lkdGggPSBzZXR0aW5ncy5MYWJlbFdpZHRoID8/IHRoaXMuTGFiZWxXaWR0aDtcclxuICAgIGxhYmVsLnRvb2x0aXBUZXh0ID0gXCJ7Y2F0ZWdvcnl9XCI7XHJcblxyXG4gICAgaWYgKHNldHRpbmdzPy5BZGFwdExhYmVsU2l6ZUFuZE9yaWVudGF0aW9uID09IG51bGwgPyB0cnVlIDogc2V0dGluZ3M/LkFkYXB0TGFiZWxTaXplQW5kT3JpZW50YXRpb24pIHtcclxuICAgICAgY2F0ZWdvcnlBeGlzLmV2ZW50cy5vbihcInNpemVjaGFuZ2VkXCIsIChldikgPT4ge1xyXG4gICAgICAgIGxldCBheGlzID0gZXYudGFyZ2V0O1xyXG4gICAgICAgIHZhciBjZWxsV2lkdGggPSBheGlzLnBpeGVsV2lkdGggLyAoYXhpcy5lbmRJbmRleCAtIGF4aXMuc3RhcnRJbmRleCk7XHJcbiAgICAgICAgaWYgKGNlbGxXaWR0aCA8IGF4aXMucmVuZGVyZXIubGFiZWxzLnRlbXBsYXRlLm1heFdpZHRoKSB7XHJcbiAgICAgICAgICBsZXQgYXJlV2VJbkRhbmdlclpvbmUgPSBjZWxsV2lkdGggPCAoc2V0dGluZ3M/LkxhYmVsVmVydGljYWxPcmllbnRhdGlvbkN1dG9mZldpZHRoID8/IHRoaXMuZGFuZ2VyWm9uZSk7XHJcbiAgICAgICAgICBheGlzLnJlbmRlcmVyLmxhYmVscy50ZW1wbGF0ZS5yb3RhdGlvbiA9IGFyZVdlSW5EYW5nZXJab25lID8gLTkwIDogLTQ1O1xyXG4gICAgICAgICAgYXhpcy5yZW5kZXJlci5sYWJlbHMudGVtcGxhdGUuZHggPSBzZXR0aW5ncy5MYWJlbFJpZ2h0V2hlbkNvbXByZXNzZWQgPz8gYXJlV2VJbkRhbmdlclpvbmUgPyAwIDogdGhpcy5MYWJlbFJpZ2h0V2hlbkNvbXByZXNzZWQ7XHJcbiAgICAgICAgICBheGlzLnJlbmRlcmVyLmxhYmVscy50ZW1wbGF0ZS5keSA9IHNldHRpbmdzLkxhYmVsVG9wV2hlbkNvbXByZXNzZWQgPz8gdGhpcy5MYWJlbFRvcFdoZW5Db21wcmVzc2VkO1xyXG4gICAgICAgICAgYXhpcy5yZW5kZXJlci5sYWJlbHMudGVtcGxhdGUuaG9yaXpvbnRhbENlbnRlciA9IFwicmlnaHRcIjtcclxuICAgICAgICAgIGF4aXMucmVuZGVyZXIubGFiZWxzLnRlbXBsYXRlLnZlcnRpY2FsQ2VudGVyID0gXCJtaWRkbGVcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBheGlzLnJlbmRlcmVyLmxhYmVscy50ZW1wbGF0ZS5yb3RhdGlvbiA9IDA7XHJcbiAgICAgICAgICBheGlzLnJlbmRlcmVyLmxhYmVscy50ZW1wbGF0ZS5keCA9IDA7XHJcbiAgICAgICAgICBheGlzLnJlbmRlcmVyLmxhYmVscy50ZW1wbGF0ZS5keSA9IDA7XHJcbiAgICAgICAgICBheGlzLnJlbmRlcmVyLmxhYmVscy50ZW1wbGF0ZS5ob3Jpem9udGFsQ2VudGVyID0gXCJtaWRkbGVcIjtcclxuICAgICAgICAgIGF4aXMucmVuZGVyZXIubGFiZWxzLnRlbXBsYXRlLnZlcnRpY2FsQ2VudGVyID0gXCJ0b3BcIjtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBkYXRhUHJlQ29udmVydGVkOiBWZXJ0aWNhbDJEQ2hhcnREYXRhID0gdGhpcy5BZGFwdGVyID8gdGhpcy5BZGFwdGVyLmFkYXB0RGF0YUZvclZlcnRpY2FsMkRDaGFydChkYXRhKSA6IGRhdGE7XHJcblxyXG4gICAgbGV0IGRhdGFDb252ZXJ0ZWQgPSBbXTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YVByZUNvbnZlcnRlZC5ncm91cHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGl0ZW0gPSBkYXRhUHJlQ29udmVydGVkLmdyb3Vwc1tpXTtcclxuICAgICAgbGV0IG9iaiA9IHsga2V5OiBpdGVtLm5hbWUgfTtcclxuICAgICAgZm9yIChsZXQgcCA9IDA7IHAgPCBpdGVtLnZhbHVlcy5sZW5ndGg7IHArKykge1xyXG4gICAgICAgIGxldCB2YWx1ZSA9IGl0ZW0udmFsdWVzW3BdO1xyXG4gICAgICAgIG9ialt2YWx1ZS5rXSA9IHZhbHVlLnY7XHJcbiAgICAgIH1cclxuICAgICAgZGF0YUNvbnZlcnRlZC5wdXNoKG9iaik7XHJcbiAgICB9XHJcblxyXG4gICAgQ2hhcnRJbnN0YW5jZUNhc3RlZC5kYXRhID0gZGF0YUNvbnZlcnRlZDtcclxuICAgIGlmIChkYXRhUHJlQ29udmVydGVkLmNvbG9yaW5mb3MpXHJcbiAgICAgIENoYXJ0SW5zdGFuY2VDYXN0ZWQuY29sb3JzLmxpc3QgPSBkYXRhUHJlQ29udmVydGVkLmNvbG9yaW5mb3MubWFwKGMgPT4gYW00Y29yZS5jb2xvcihjLmNvbG9yKSk7XHJcblxyXG4gICAgLy9QcmVuZG8gbGEgcHJpbWEgY2F0ZWdvcmlhIGUgbWkgYmFzbyBzdWxsZSBwcm9wcmlldMOgIHBlciBkZmVpbmlyZSBsZSBzZXJpZVxyXG4gICAgZm9yIChsZXQgcHJvcCBpbiBkYXRhQ29udmVydGVkWzBdKVxyXG4gICAgICBpZiAocHJvcCAhPT0gXCJrZXlcIilcclxuICAgICAgICB0aGlzLmNyZWF0ZVNlcmllcyhDaGFydEluc3RhbmNlQ2FzdGVkLCBzZXR0aW5ncywgcHJvcCwgcHJvcCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvKiogQGlnbm9yZSAqL1xyXG4gIHNldFNlbGVjdGlvbihmcm9tOiBEYXRlLCB0bzogRGF0ZSk6IHZvaWQge1xyXG5cclxuICB9XHJcblxyXG4gIC8qKiBAaWdub3JlICovXHJcbiAgcHVibGljIHJlZnJlc2hEYXRhKGRhdGE6IFZlcnRpY2FsMkRDaGFydERhdGEgfCBhbnkpIHtcclxuICAgIC8vVE9ETzpJTVBMXHJcbiAgfVxyXG5cclxuICAvKiogQGlnbm9yZSAqL1xyXG4gIHByaXZhdGUgY3JlYXRlU2VyaWVzKGNoYXJ0LCBzZXR0aW5nczogVmVydGljYWwyRENoYXJ0U2V0dGluZ3MsIHZhbHVlLCBuYW1lKSB7XHJcbiAgICBsZXQgc2VyaWVzOiBhbTRjaGFydHMuQ29sdW1uU2VyaWVzID0gY2hhcnQuc2VyaWVzLnB1c2gobmV3IGFtNGNoYXJ0cy5Db2x1bW5TZXJpZXMoKSlcclxuICAgIHNlcmllcy5kYXRhRmllbGRzLnZhbHVlWSA9IHZhbHVlO1xyXG4gICAgc2VyaWVzLmRhdGFGaWVsZHMuY2F0ZWdvcnlYID0gJ2tleSc7XHJcbiAgICBzZXJpZXMubmFtZSA9IG5hbWU7XHJcbiAgICBzZXJpZXMuY29sdW1ucy50ZW1wbGF0ZS50b29sdGlwVGV4dCA9IFwie25hbWV9IHtjYXRlZ29yeVh9OiBbYm9sZF17dmFsdWVZfVsvXVwiO1xyXG4gICAgc2VyaWVzLmNvbHVtbnMudGVtcGxhdGUuZmlsbE9wYWNpdHkgPSAuODtcclxuICAgIHNlcmllcy5jb2x1bW5zLnRlbXBsYXRlLndpZHRoID0gYW00Y29yZS5wZXJjZW50KHNldHRpbmdzLkNvbHVtbldpZHRoUGVyY2VudGFnZSA/PyB0aGlzLkRlZmF1bHRDb2x1bW5XaWR0aFBlcmNlbnRhZ2UpO1xyXG5cclxuICAgIHNlcmllcy5ldmVudHMub24oXCJoaWRkZW5cIiwgKCkgPT4gdGhpcy5hcnJhbmdlQ29sdW1ucyk7XHJcbiAgICBzZXJpZXMuZXZlbnRzLm9uKFwic2hvd25cIiwgKCkgPT4gdGhpcy5hcnJhbmdlQ29sdW1ucyk7XHJcblxyXG4gICAgcmV0dXJuIHNlcmllcztcclxuICB9XHJcblxyXG4gIC8qKiBAaWdub3JlICovXHJcbiAgcHJpdmF0ZSBhcnJhbmdlQ29sdW1ucygpIHtcclxuICAgIGxldCBDaGFydEluc3RhbmNlQ2FzdGVkID0gPGFtNGNoYXJ0cy5YWUNoYXJ0PnRoaXMuQ2hhcnRJbnN0YW5jZTtcclxuICAgIGxldCBzZXJpZXMgPSBDaGFydEluc3RhbmNlQ2FzdGVkLnNlcmllcy5nZXRJbmRleCgwKTtcclxuICAgIGxldCB4QXhpcyA9IENoYXJ0SW5zdGFuY2VDYXN0ZWQueEF4ZXMuZ2V0SW5kZXgoMCk7XHJcblxyXG4gICAgbGV0IHcgPSAxIC0geEF4aXMucmVuZGVyZXIuY2VsbFN0YXJ0TG9jYXRpb24gLSAoMSAtIHhBeGlzLnJlbmRlcmVyLmNlbGxFbmRMb2NhdGlvbik7XHJcbiAgICBpZiAoc2VyaWVzLmRhdGFJdGVtcy5sZW5ndGggPiAxKSB7XHJcbiAgICAgIGxldCB4MCA9IHhBeGlzLmdldFgoc2VyaWVzLmRhdGFJdGVtcy5nZXRJbmRleCgwKSwgXCJjYXRlZ29yeVhcIik7XHJcbiAgICAgIGxldCB4MSA9IHhBeGlzLmdldFgoc2VyaWVzLmRhdGFJdGVtcy5nZXRJbmRleCgxKSwgXCJjYXRlZ29yeVhcIik7XHJcbiAgICAgIGxldCBkZWx0YSA9ICgoeDEgLSB4MCkgLyBDaGFydEluc3RhbmNlQ2FzdGVkLnNlcmllcy5sZW5ndGgpICogdztcclxuICAgICAgaWYgKGFtNGNvcmUuaXNOdW1iZXIoZGVsdGEpKSB7XHJcbiAgICAgICAgbGV0IG1pZGRsZSA9IENoYXJ0SW5zdGFuY2VDYXN0ZWQuc2VyaWVzLmxlbmd0aCAvIDI7XHJcblxyXG4gICAgICAgIGxldCBuZXdJbmRleCA9IDA7XHJcbiAgICAgICAgQ2hhcnRJbnN0YW5jZUNhc3RlZC5zZXJpZXMuZWFjaCgoc2VyaWVzKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIXNlcmllcy5pc0hpZGRlbiAmJiAhc2VyaWVzLmlzSGlkaW5nKSB7XHJcbiAgICAgICAgICAgIHNlcmllcy5kdW1teURhdGEgPSBuZXdJbmRleDtcclxuICAgICAgICAgICAgbmV3SW5kZXgrKztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBzZXJpZXMuZHVtbXlEYXRhID0gQ2hhcnRJbnN0YW5jZUNhc3RlZC5zZXJpZXMuaW5kZXhPZihzZXJpZXMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgbGV0IHZpc2libGVDb3VudCA9IG5ld0luZGV4O1xyXG4gICAgICAgIGxldCBuZXdNaWRkbGUgPSB2aXNpYmxlQ291bnQgLyAyO1xyXG5cclxuICAgICAgICBDaGFydEluc3RhbmNlQ2FzdGVkLnNlcmllcy5lYWNoKChzZXJpZXMpID0+IHtcclxuICAgICAgICAgIGxldCB0cnVlSW5kZXggPSBDaGFydEluc3RhbmNlQ2FzdGVkLnNlcmllcy5pbmRleE9mKHNlcmllcyk7XHJcbiAgICAgICAgICBsZXQgbmV3SW5kZXggPSBzZXJpZXMuZHVtbXlEYXRhO1xyXG5cclxuICAgICAgICAgIGxldCBkeCA9IChuZXdJbmRleCAtIHRydWVJbmRleCArIG1pZGRsZSAtIG5ld01pZGRsZSkgKiBkZWx0YVxyXG5cclxuICAgICAgICAgIHNlcmllcy5hbmltYXRlKHsgcHJvcGVydHk6IFwiZHhcIiwgdG86IGR4IH0sIHNlcmllcy5pbnRlcnBvbGF0aW9uRHVyYXRpb24sIHNlcmllcy5pbnRlcnBvbGF0aW9uRWFzaW5nKTtcclxuICAgICAgICAgIHNlcmllcy5idWxsZXRzQ29udGFpbmVyLmFuaW1hdGUoeyBwcm9wZXJ0eTogXCJkeFwiLCB0bzogZHggfSwgc2VyaWVzLmludGVycG9sYXRpb25EdXJhdGlvbiwgc2VyaWVzLmludGVycG9sYXRpb25FYXNpbmcpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn0iXX0=