@massimo-cassandro/minimo 1.18.1 → 1.18.3
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/README.md +2 -1
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/index.js +92 -0
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/src/charts/hbars.js +356 -0
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/src/charts/pie.js +245 -0
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/src/charts/radial-bars.js +177 -0
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/src/charts/rating-display.js +835 -0
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/src/charts/settimanale-mensile-src/costruzione-assi.js +212 -0
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/src/charts/settimanale-mensile-src/costruzione-linee.js +101 -0
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/src/charts/settimanale-mensile-src/defaults.js +185 -0
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/src/charts/settimanale-mensile-src/display-current.js +27 -0
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/src/charts/settimanale-mensile-src/grid-areas.js +129 -0
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/src/charts/settimanale-mensile-src/parse-opts.js +64 -0
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/src/charts/settimanale-mensile-src/paths-setup.js +73 -0
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/src/charts/settimanale-mensile.js +126 -0
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/src/charts/signal-bars.js +290 -0
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/src/week-utils.js +122 -0
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/browser-test/src/hbars-test.js +52 -0
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/browser-test/src/mcn-test.js +74 -0
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/browser-test/src/pie-test.js +16 -0
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/browser-test/src/radial-bars-test.js +48 -0
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/browser-test/src/settimanale-mensile-dati-settimanale.js +426 -0
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/browser-test/src/settimanale-mensile-test.js +260 -0
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/browser-test/src/signal-bars-test.js +64 -0
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/node-test/node-test.mjs +86 -0
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/node-test/src/hBars-node-test.mjs +40 -0
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/node-test/src/lines-node-test.mjs +73 -0
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/node-test/src/mcn-node-test.mjs +64 -0
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/node-test/src/pie-node-test.mjs +12 -0
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/node-test/src/radialsBar-node-test.mjs +44 -0
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/node-test/src/settimanale-mensile-node-test.mjs +258 -0
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/node-test/src/signalBars-node-test.mjs +36 -0
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/test-readme.md +24 -0
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/textToPath-test.mjs +14 -0
- package/charts/TODO charts/???/InfoBox.js +456 -0
- package/charts/TODO charts/???/README-upg OLD/342/206/222NEW.md" +53 -0
- package/charts/TODO charts/???/README.md +1 -0
- package/charts/TODO charts/???/TODO.md +39 -0
- package/charts/TODO charts/???/base-cfg.js +66 -0
- package/charts/TODO charts/???/rating-displayOLD.js +837 -0
- package/charts/TODO charts/docs/TODO.md +1 -0
- package/charts/TODO charts/docs/costruzione display rating.md +145 -0
- package/charts/TODO charts/test/node-test.mjs +92 -0
- package/charts/TODO charts/test/test-readme.md +23 -0
- package/charts/TODO charts/test/test-src/rating-display-extra-test.js +132 -0
- package/charts/TODO charts/test/test-src/rating-display-test.js +155 -0
- package/charts/TODO charts/test/textToPath-test.mjs +14 -0
- package/charts/TODO.md +1 -1
- package/design-tokens/tokens/{design-tokens/_src → src/components/modal-popup}/modal-popup.minimo.tokens.jsonc +48 -2
- package/design-tokens/utilities/build-tokens-src/config.mjs +5 -2
- package/design-tokens/utilities/build-tokens-src/formats/penpot.mjs +1 -1
- package/design-tokens/utilities/build-tokens-src/platforms.mjs +4 -1
- package/design-tokens/utilities/build-tokens.mjs +5 -3
- package/design-tokens/utilities/check-unresolved-custom-props.mjs +5 -2
- package/dev-tools/starter-kit/webpack.config.mjs +6 -6
- package/package.json +17 -10
- package/snippets/flash-messages.html.twig +34 -0
- package/src/components/modal-alert/modal-alert.js +3 -1
- package/src/components/modal-popup/modal-popup.js +68 -4
- package/{design-tokens/_src → src/components/modal-popup}/modal-popup.minimo.tokens.mjs +51 -2
- package/src/components/modal-popup/modal-popup.module.css +24 -32
- package/src/components/unsplash-page/unsplash-page.js +3 -6
- package/src/components/unsplash-page/unsplash-page.module.css +11 -6
- package/src/custom-properties.css +21 -12
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
// costruisce un sistema di assi cartesiani
|
|
2
|
+
// TODO da unificare con ada-frontend/ada-charts/src/components/cartesian-axis.js
|
|
3
|
+
|
|
4
|
+
export async function costruzioneAssi({
|
|
5
|
+
cfg, // oggetto cfg come quello indicato in `charts/andamento-annuale-src/defaults.js`
|
|
6
|
+
xLabels, // array con le etichette dell'asseX
|
|
7
|
+
adaChartIstance // istanza classe
|
|
8
|
+
}) {
|
|
9
|
+
|
|
10
|
+
try {
|
|
11
|
+
|
|
12
|
+
// =>> ASSE Y
|
|
13
|
+
// *****************************************
|
|
14
|
+
const yAxisGroup = cfg.svgCanvas.group();
|
|
15
|
+
yAxisGroup
|
|
16
|
+
.attr({ 'data-cfg.debug-info': cfg.debug? 'Gruppo Asse Y' : null })
|
|
17
|
+
.line(
|
|
18
|
+
cfg.chart_area.left, cfg.chart_area.top,
|
|
19
|
+
cfg.chart_area.left, cfg.chart_area.bottom
|
|
20
|
+
)
|
|
21
|
+
.attr({
|
|
22
|
+
'data-cfg.debug-info': cfg.debug? 'Asse Y' : null,
|
|
23
|
+
class: cfg.axisClassName, // se il valore è null l'attributo viene ignorato
|
|
24
|
+
...cfg.axisAttrs
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
// =>> ticks ed etichette asse Y (dal basso verso l'alto)
|
|
29
|
+
const ticksYGroup = yAxisGroup.group().attr({
|
|
30
|
+
'data-cfg.debug-info': cfg.debug? 'Gruppo ticks Asse Y' : null,
|
|
31
|
+
class: cfg.ticksClassName, // se il valore è null l'attributo viene ignorato
|
|
32
|
+
});
|
|
33
|
+
const labelsYGroup = yAxisGroup.group().attr({
|
|
34
|
+
'data-cfg.debug-info': cfg.debug? 'Gruppo etichette Asse Y' : null,
|
|
35
|
+
class: cfg.labelYClassName,
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
cfg.gridGroup = null; // inserita in cfg per poter essere riposizionata
|
|
39
|
+
if(cfg.horizGrid) {
|
|
40
|
+
cfg.gridGroup = cfg.svgCanvas.group().attr({
|
|
41
|
+
'data-cfg.debug-info': cfg.debug? 'Gruppo griglia' : null
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
for await (const stepIdx of Array.from(Array(cfg.stepY_count + 1).keys())) {
|
|
46
|
+
|
|
47
|
+
const y = cfg.chart_area.bottom - (cfg.stepY_size * stepIdx)
|
|
48
|
+
,label = cfg.labelYFormatter(cfg.stepY_value * stepIdx);
|
|
49
|
+
|
|
50
|
+
// =>> ticks Y
|
|
51
|
+
ticksYGroup
|
|
52
|
+
.line(
|
|
53
|
+
cfg.chart_area.left - cfg.ticksLength, y,
|
|
54
|
+
cfg.chart_area.left, y
|
|
55
|
+
)
|
|
56
|
+
.attr({
|
|
57
|
+
'data-cfg.debug-info': cfg.debug? 'Ticks asse X' : null,
|
|
58
|
+
...cfg.ticksAttrs
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
// =>> etichette Y
|
|
62
|
+
const [label_bbox, labelEl] = await adaChartIstance.createTextEl ({
|
|
63
|
+
text: label,
|
|
64
|
+
textFill: cfg.labelYAttrs.fill?? '#000',
|
|
65
|
+
fontAttr: cfg.labelYAttrs,
|
|
66
|
+
fontFilePath: cfg.labelYFontFilePath,
|
|
67
|
+
parentElement: labelsYGroup
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
labelEl.move(
|
|
71
|
+
cfg.chart_area.left - cfg.ticksLength - 2 - label_bbox.width, // 2 è un distanziatore tra l'etichetta e la linea
|
|
72
|
+
y - label_bbox.height / 2
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
// =>> griglia orizzontale
|
|
76
|
+
if(cfg.horizGrid && stepIdx > 0) { // la prima linea coincide con l'asse X
|
|
77
|
+
cfg.gridGroup.line(
|
|
78
|
+
cfg.chart_area.left, y,
|
|
79
|
+
cfg.chart_area.right, y
|
|
80
|
+
)
|
|
81
|
+
.attr(cfg.horizGridAttrs);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
} // end for await stepIdx
|
|
85
|
+
|
|
86
|
+
// =>> titolo asse Y
|
|
87
|
+
if(cfg.asseYTitle) {
|
|
88
|
+
const [title_bbox, titleEl] = await adaChartIstance.createTextEl ({
|
|
89
|
+
text: cfg.asseYTitle,
|
|
90
|
+
textFill: cfg.asseYTitleAttrs.fill?? '#000',
|
|
91
|
+
fontAttr: cfg.asseYTitleAttrs,
|
|
92
|
+
fontFilePath: cfg.asseYTitleFontFilePath,
|
|
93
|
+
parentElement: yAxisGroup
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
titleEl.move(
|
|
97
|
+
cfg.padding - (title_bbox.width / 2) + (title_bbox.height / 2),
|
|
98
|
+
(cfg.chart_area.bottom - title_bbox.height) / 2
|
|
99
|
+
)
|
|
100
|
+
.rotate(-90)
|
|
101
|
+
;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
// =>> ASSE X
|
|
107
|
+
// *****************************************
|
|
108
|
+
const xAxisGroup = cfg.svgCanvas.group();
|
|
109
|
+
xAxisGroup
|
|
110
|
+
.attr({ 'data-cfg.debug-info': cfg.debug? 'Gruppo Asse X' : null })
|
|
111
|
+
.line(
|
|
112
|
+
cfg.chart_area.left, cfg.chart_area.bottom,
|
|
113
|
+
cfg.chart_area.right, cfg.chart_area.bottom
|
|
114
|
+
)
|
|
115
|
+
.attr({
|
|
116
|
+
'data-cfg.debug-info': cfg.debug? 'Asse X' : null,
|
|
117
|
+
class: cfg.axisClassName,
|
|
118
|
+
...cfg.axisAttrs
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
// =>> ticks, etichette ecc asse X (da sinistra a destra)
|
|
122
|
+
const ticksXGroup = xAxisGroup.group().attr({
|
|
123
|
+
'data-cfg.debug-info': cfg.debug? 'Gruppo ticks Asse X' : null,
|
|
124
|
+
class: cfg.ticksClassName,
|
|
125
|
+
});
|
|
126
|
+
const labelsXGroup = xAxisGroup.group().attr({
|
|
127
|
+
'data-cfg.debug-info': cfg.debug? 'Gruppo etichette Asse X' : null,
|
|
128
|
+
class: cfg.labelXClassName,
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
let labelIdx = 0;
|
|
133
|
+
|
|
134
|
+
// coordinata y per il posizionamentoi delle etichette
|
|
135
|
+
const labelY = cfg.chart_area.bottom + cfg.ticksLength + 2;
|
|
136
|
+
|
|
137
|
+
// Y del blocco etichette (comprese le etichette stesse) per utilizzo in altre parti dello script
|
|
138
|
+
cfg.xLabelsEndY = 0;
|
|
139
|
+
|
|
140
|
+
for await (const thisLabel of xLabels) {
|
|
141
|
+
const x = cfg.chart_area.left + (cfg.stepX_size * labelIdx);
|
|
142
|
+
|
|
143
|
+
// =>> ticks X
|
|
144
|
+
ticksXGroup
|
|
145
|
+
.line(
|
|
146
|
+
x, cfg.chart_area.bottom + cfg.ticksLength,
|
|
147
|
+
x, cfg.chart_area.bottom
|
|
148
|
+
)
|
|
149
|
+
.attr({
|
|
150
|
+
'data-cfg.debug-info': cfg.debug? 'Ticks asse X' : null,
|
|
151
|
+
...cfg.ticksAttrs
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
// =>> etichette X
|
|
155
|
+
if(!cfg.labelXShowEvensOnly || thisLabel % 2 === 0 ) {
|
|
156
|
+
const [label_bbox, labelEl] = await adaChartIstance.createTextEl ({
|
|
157
|
+
text: thisLabel,
|
|
158
|
+
textFill: cfg.labelXAttrs.fill?? '#000',
|
|
159
|
+
fontAttr: cfg.labelXAttrs,
|
|
160
|
+
fontFilePath: cfg.labelXFontFilePath,
|
|
161
|
+
parentElement: labelsXGroup
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
labelEl.move(
|
|
165
|
+
x - label_bbox.width / 2,
|
|
166
|
+
labelY
|
|
167
|
+
);
|
|
168
|
+
|
|
169
|
+
// per la seconda riga di etichette
|
|
170
|
+
cfg.xLabelsEndY = Math.max(cfg.xLabelsEndY, labelY + label_bbox.height);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// TODO sotto griglia verticale
|
|
174
|
+
|
|
175
|
+
// =>> griglia verticale
|
|
176
|
+
if(cfg.vertGrid && labelIdx > 0) { // la prima linea coincide con l'asse Y
|
|
177
|
+
cfg.gridGroup.line(
|
|
178
|
+
x, cfg.chart_area.bottom,
|
|
179
|
+
x, cfg.chart_area.top
|
|
180
|
+
)
|
|
181
|
+
.attr(cfg.vertGridAttrs);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
labelIdx++;
|
|
186
|
+
|
|
187
|
+
} // end for await thisLabel
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
// =>> titolo asse X
|
|
191
|
+
if(cfg.asseXTitle) {
|
|
192
|
+
const [title_bbox, titleEl] = await adaChartIstance.createTextEl ({
|
|
193
|
+
text: cfg.asseXTitle,
|
|
194
|
+
textFill: cfg.asseXTitleAttrs.fill?? '#000',
|
|
195
|
+
fontAttr: cfg.asseXTitleAttrs,
|
|
196
|
+
fontFilePath: cfg.asseXTitleFontFilePath,
|
|
197
|
+
parentElement: xAxisGroup
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
titleEl.move(
|
|
201
|
+
cfg.chart_area.left + (cfg.chart_area.width - title_bbox.width) / 2,
|
|
202
|
+
cfg.height - cfg.padding - title_bbox.height
|
|
203
|
+
);
|
|
204
|
+
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
return cfg;
|
|
208
|
+
|
|
209
|
+
} catch(e) {
|
|
210
|
+
console.error( 'AdaCharts → costruzioneAssi', e ); // eslint-disable-line
|
|
211
|
+
}
|
|
212
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
export function costruzioneLinee(cfg) {
|
|
2
|
+
|
|
3
|
+
// area range positivo negativo
|
|
4
|
+
const rangeScenari = cfg.svgCanvas.group().attr({
|
|
5
|
+
'data-cfg.debug-info': cfg.debug? 'Range positivo-negativo' : null
|
|
6
|
+
});
|
|
7
|
+
if(cfg.mostraRangeScenari) {
|
|
8
|
+
rangeScenari
|
|
9
|
+
.path(
|
|
10
|
+
'M ' +
|
|
11
|
+
cfg.coords.budget_positivo.map(item => `${item.join(',')}`).join(' L') +
|
|
12
|
+
cfg.coords.budget_negativo.toReversed().map(item => `L${item.join(',')}`).join(' ') +
|
|
13
|
+
' Z'
|
|
14
|
+
)
|
|
15
|
+
.attr({
|
|
16
|
+
...cfg.rangeScenariAttrs
|
|
17
|
+
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
// linee (opzionali) bordi negativo e positivo
|
|
21
|
+
if(Object.keys(cfg.lineeRangeScenari).length) {
|
|
22
|
+
rangeScenari
|
|
23
|
+
.polyline(cfg.coords.budget_positivo)
|
|
24
|
+
.attr(cfg.lineeRangeScenari);
|
|
25
|
+
|
|
26
|
+
rangeScenari
|
|
27
|
+
.polyline(cfg.coords.budget_negativo)
|
|
28
|
+
.attr(cfg.lineeRangeScenari);
|
|
29
|
+
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// spostamento in primo piano della griglia, sopra il range
|
|
33
|
+
cfg.gridGroup.front();
|
|
34
|
+
|
|
35
|
+
cfg.lineeGroup = cfg.svgCanvas.group()
|
|
36
|
+
.attr({
|
|
37
|
+
'data-cfg.debug-info': cfg.debug? 'Linee' : null
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
// linee
|
|
42
|
+
[
|
|
43
|
+
{
|
|
44
|
+
data : cfg.coords.budget_standard,
|
|
45
|
+
attrs : cfg.budget_standard_line_attrs,
|
|
46
|
+
points_attrs : cfg.budget_standard_points_attrs,
|
|
47
|
+
debug_info : 'Budget standard'
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
data : cfg.coords.consolidato_prec,
|
|
51
|
+
attrs : cfg.consolidato_prec_line_attrs,
|
|
52
|
+
points_attrs : cfg.consolidato_prec_point_attrs,
|
|
53
|
+
debug_info : 'consolidato anno prec.'
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
data : cfg.coords.consolidato,
|
|
57
|
+
attrs : cfg.consolidato_line_attrs,
|
|
58
|
+
points_attrs : cfg.consolidato_points_attrs,
|
|
59
|
+
debug_info : 'consolidato'
|
|
60
|
+
},
|
|
61
|
+
|
|
62
|
+
...(
|
|
63
|
+
cfg.showConsolidatoForecast
|
|
64
|
+
? [{
|
|
65
|
+
data : cfg.coords.consolidato_forecast,
|
|
66
|
+
attrs : cfg.consolidato_forecast_line_attrs,
|
|
67
|
+
points_attrs : cfg.consolidato_forecast_point_attrs,
|
|
68
|
+
debug_info : 'consolidato forecast'
|
|
69
|
+
}]
|
|
70
|
+
: []
|
|
71
|
+
)
|
|
72
|
+
].forEach(line => {
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
cfg.lineeGroup
|
|
76
|
+
.polyline(line.data)
|
|
77
|
+
.attr({...line.attrs, fill: 'none'});
|
|
78
|
+
|
|
79
|
+
if(Object.keys(line.points_attrs??{}).length) {
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
const thisPointsGroup = cfg.lineeGroup.group()
|
|
83
|
+
.attr({
|
|
84
|
+
'data-cfg.debug-info': cfg.debug? `Punti ${line.debug_info}` : null,
|
|
85
|
+
...{...line.points_attrs, r: null, cx: null, cy: null},
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
line.data.forEach(point => {
|
|
89
|
+
thisPointsGroup.circle({
|
|
90
|
+
r: line.points_attrs.r,
|
|
91
|
+
cx: point[0],
|
|
92
|
+
cy: point[1]
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
return cfg;
|
|
101
|
+
}
|
package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/src/charts/settimanale-mensile-src/defaults.js
ADDED
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
export const default_opts = {
|
|
2
|
+
/** mostra info utile per il debug */
|
|
3
|
+
debug: false,
|
|
4
|
+
|
|
5
|
+
/** container (selettore o elemento DOM), se null viene restituito il codice SVG */
|
|
6
|
+
container: null,
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
larghezza e altezza del grafico (px),
|
|
10
|
+
Se il container è presente e i parametro `width` o `height` sono `null`,
|
|
11
|
+
quelli mancanti vengono ricavati dallaìe dimensioni del container
|
|
12
|
+
*/
|
|
13
|
+
width: null,
|
|
14
|
+
height: null,
|
|
15
|
+
|
|
16
|
+
/** TODO resizeObserver
|
|
17
|
+
Se true, il grafico viene ricalcolato al variare delle dimensioni del container (richiesto)
|
|
18
|
+
il parametro `width` anche se impostato, viene ignorato
|
|
19
|
+
*/
|
|
20
|
+
resizeObserver: false,
|
|
21
|
+
|
|
22
|
+
/** attributi facoltativi per l'svg */
|
|
23
|
+
svgAttrs: {},
|
|
24
|
+
|
|
25
|
+
/** griglia orizzontale e verticale */
|
|
26
|
+
horizGrid: true,
|
|
27
|
+
horizGridAttrs: {},
|
|
28
|
+
|
|
29
|
+
vertGrid: true,
|
|
30
|
+
vertGridAttrs: {},
|
|
31
|
+
|
|
32
|
+
/** settimanale o mensile */
|
|
33
|
+
modo: 'settimanale',
|
|
34
|
+
|
|
35
|
+
/** spazio extra attorno al bordo */
|
|
36
|
+
padding: 10,
|
|
37
|
+
|
|
38
|
+
/** suddivisioni asse Y */
|
|
39
|
+
stepY_count: 4,
|
|
40
|
+
|
|
41
|
+
/** px, altezza o larghezza ticks (secondo l'orientamento) */
|
|
42
|
+
ticksLength: 5,
|
|
43
|
+
|
|
44
|
+
/** parametri legenda (vedi componente ada-charts/src/components/legenda.js) */
|
|
45
|
+
legenda: {},
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
larghezza area etichette asse y
|
|
49
|
+
*/
|
|
50
|
+
eti_asseY_width: 60,
|
|
51
|
+
|
|
52
|
+
/** altezza area etichette asse x */
|
|
53
|
+
eti_asseX_height: 30,
|
|
54
|
+
|
|
55
|
+
/** titoli assi */
|
|
56
|
+
asseYTitle: null,
|
|
57
|
+
asseYTitleAttrs: null,
|
|
58
|
+
asseYTitleFontFilePath: null,
|
|
59
|
+
|
|
60
|
+
asseXTitle: null,
|
|
61
|
+
asseXTitleAttrs: null,
|
|
62
|
+
asseXTitleFontFilePath: null,
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
solo settimanale.
|
|
66
|
+
la settimana zero corrisponde ai dati al 31/12 dell'anno precedente a quello in esame
|
|
67
|
+
se true la settimana zero non viene rappresentata nel grafico
|
|
68
|
+
e l'origine x del grafico corrisponde alla settimana 1
|
|
69
|
+
(il motivo è che la settimana 0 ha generalmente un valore molto più elevato
|
|
70
|
+
degli altri e rende il grafico illeggibile)
|
|
71
|
+
*/
|
|
72
|
+
skipWeek0: true,
|
|
73
|
+
|
|
74
|
+
/** evidenzia la griglia verticale corrispondente alla settimana / mese correnti */
|
|
75
|
+
showCurrent: true,
|
|
76
|
+
currentWeekAttrs: {},
|
|
77
|
+
currentMonthAttrs: {},
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
Aree di evidenziazione dei mesi (settimanale)
|
|
81
|
+
*/
|
|
82
|
+
monthsAreasAttrs: {},
|
|
83
|
+
|
|
84
|
+
/** se true mostra un area di relativa ai valori min/max degli scenari */
|
|
85
|
+
mostraRangeScenari: true,
|
|
86
|
+
rangeScenariAttrs: {},
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
se `lineeRangeScenari` non è un oggetto vuoto, vengono mostrate
|
|
90
|
+
le linee positive/negativo secondo gli attributi svg.js indicati.
|
|
91
|
+
Questa opzione è indipendente da `mostraRangeScenari`
|
|
92
|
+
*/
|
|
93
|
+
lineeRangeScenari: {},
|
|
94
|
+
|
|
95
|
+
/** anno esaminato */
|
|
96
|
+
anno: new Date().getFullYear(),
|
|
97
|
+
|
|
98
|
+
/** parametri infoBox (vedi componente) */
|
|
99
|
+
infoBoxItems: null,
|
|
100
|
+
infoBoxPositionRefs: null,
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
array dati
|
|
104
|
+
|
|
105
|
+
Ogni elemento deve avere questa struttura
|
|
106
|
+
{
|
|
107
|
+
w: <num>, // numero settimana (se settimanale)
|
|
108
|
+
m: <num>, // numero mese (se mensile)
|
|
109
|
+
|
|
110
|
+
s: <num>, // valore scenario standard
|
|
111
|
+
p: <num>, // valore scenario positivo
|
|
112
|
+
n: <num>, // valore scenario negativo
|
|
113
|
+
c: <num>, // valore consolidato anno corrente (può essere null)
|
|
114
|
+
cp: <num>, // valore consolidato anno precedente
|
|
115
|
+
cf: <num> // valore consolidato forecast (può non essere presente o null)
|
|
116
|
+
}
|
|
117
|
+
*/
|
|
118
|
+
chartData: [],
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
classi e attributi dei vari elementi.
|
|
122
|
+
Per gli attributi, ogni variabile è un oggetto di attributi svg.js, es:
|
|
123
|
+
|
|
124
|
+
{
|
|
125
|
+
stroke: '#414141',
|
|
126
|
+
'stroke-width': 1,
|
|
127
|
+
'shape-rendering': 'crispEdges',
|
|
128
|
+
|
|
129
|
+
// oppure
|
|
130
|
+
class: 'xxxx'
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
*/
|
|
134
|
+
axisAttrs: {},
|
|
135
|
+
|
|
136
|
+
ticksAttrs: {},
|
|
137
|
+
|
|
138
|
+
labelXAttrs: {}, // contiene gli attributi fonts (come in AdaCharts.defaults.font) e l'attributo `fill`
|
|
139
|
+
labelXFontFilePath: null, // percorso font per textToPath
|
|
140
|
+
labelXShowEvensOnly: false,
|
|
141
|
+
|
|
142
|
+
// attributi per la seconda riga di etichette X, in sua assenza il default è dati dagli attributi della prima riga
|
|
143
|
+
label2XAttrs: null,
|
|
144
|
+
labelX2FontFilePath: null, // percorso font per textToPath
|
|
145
|
+
label2TopGap: 2, // spazio aggiuntivo tra la prima e lasecondas riga di etichette
|
|
146
|
+
|
|
147
|
+
labelYAttrs: {}, // contiene gli attributi fonts (come in AdaCharts.defaults.font) e l'attributo `fill`
|
|
148
|
+
labelYFontFilePath: null, // percorso font per textToPath
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
attributi delle varie linee
|
|
152
|
+
se l'oggetto `line***PointsAttrs`, dove presente, non è vuoto,
|
|
153
|
+
viene aggiunto un cerchio ad ogni punto della linea
|
|
154
|
+
(NB: non aggiungere `cx` o cy`)
|
|
155
|
+
*/
|
|
156
|
+
budget_standard_line_attrs: {},
|
|
157
|
+
budget_standard_points_attrs: {},
|
|
158
|
+
|
|
159
|
+
budget_positivo_line_attrs: {},
|
|
160
|
+
budget_negativo_line_attrs: {},
|
|
161
|
+
|
|
162
|
+
consolidato_line_attrs: {},
|
|
163
|
+
consolidato_points_attrs: {},
|
|
164
|
+
|
|
165
|
+
consolidato_prec_line_attrs: {},
|
|
166
|
+
consolidato_prec_point_attrs: {},
|
|
167
|
+
|
|
168
|
+
// TODO verificare
|
|
169
|
+
showConsolidatoForecast: false, // porzione di consolidato nomn ancora maturato (si usa il budget)
|
|
170
|
+
consolidato_forecast_line_attrs: {},
|
|
171
|
+
consolidato_forecast_point_attrs: {},
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
Funzione per formattare le etichette dei valori dell'asse Y.
|
|
176
|
+
Null per nessuna eleborazione.
|
|
177
|
+
La funzione di default assume che il valore sia di tipo numerico
|
|
178
|
+
*/
|
|
179
|
+
labelYFormatter: labelValue => Math.ceil(labelValue / 1e3)
|
|
180
|
+
.toLocaleString('it-IT', {
|
|
181
|
+
minimumFractionDigits: 0,
|
|
182
|
+
maximumFractionDigits: 0
|
|
183
|
+
}) +
|
|
184
|
+
(labelValue > 0? '\u2009K' : ''), // \u2009 = thin space (https://www.compart.com/en/unicode/U+2009)
|
|
185
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// evidenziazione settiman / mese correnti (solo per anno in corso)
|
|
2
|
+
|
|
3
|
+
export function displayCurrent(cfg) {
|
|
4
|
+
|
|
5
|
+
if(cfg.showCurrent && cfg.anno === new Date().getFullYear()) {
|
|
6
|
+
|
|
7
|
+
if(cfg.isSettimanale) {
|
|
8
|
+
|
|
9
|
+
const x = cfg.chart_area.left + (cfg.currentWeek - 1) * cfg.stepX_size;
|
|
10
|
+
cfg.svgCanvas
|
|
11
|
+
.line(
|
|
12
|
+
x, cfg.chart_area.top,
|
|
13
|
+
x, cfg.chart_area.bottom
|
|
14
|
+
)
|
|
15
|
+
.attr({
|
|
16
|
+
'data-cfg.debug-info': cfg.debug? 'Settimana corrente' : null,
|
|
17
|
+
...cfg.currentWeekAttrs
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
} else {
|
|
21
|
+
|
|
22
|
+
// TODO showCurrent per mese
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return cfg;
|
|
27
|
+
}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
// aree e ed etichette mesi
|
|
2
|
+
import { getWeekOfDate } from '../../week-utils.js';
|
|
3
|
+
|
|
4
|
+
export async function gridAreas(cfg, adaChartIstance) {
|
|
5
|
+
|
|
6
|
+
// =>> settimane di inizio e fine, numero settimane, coordinata x e larghezza dei mesi aull'asse X,
|
|
7
|
+
//
|
|
8
|
+
cfg.months_weeks = [];
|
|
9
|
+
for(let i = 0; i < 12; i++) {
|
|
10
|
+
|
|
11
|
+
// NB: i (mese) è base 0, start_week e end_week sono base 1
|
|
12
|
+
|
|
13
|
+
let start_week = i === 0 ? (cfg.skipWeek0? 1 : 0) : getWeekOfDate({date: new Date(cfg.anno, i, 1)}),
|
|
14
|
+
end_week = i=== 11? cfg.weeks : getWeekOfDate({date: new Date(cfg.anno, i+1, 0)});
|
|
15
|
+
|
|
16
|
+
// se due mesi adiacenti hanno settimane di fine e inizio diverse
|
|
17
|
+
// la settimana intermedia viene suddivisa a metà
|
|
18
|
+
|
|
19
|
+
if(i > 0 && start_week > cfg.months_weeks[i-1].end_week) {
|
|
20
|
+
cfg.months_weeks[i-1].end_week += .5;
|
|
21
|
+
start_week -= .5;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
cfg.months_weeks.push({
|
|
25
|
+
// mese: i,
|
|
26
|
+
start_week: start_week,
|
|
27
|
+
end_week: end_week,
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// post elaborazione, aggiunta elementi calcolati
|
|
33
|
+
// viene eseguita in modo differito per evitare disallineamenti nella correzione
|
|
34
|
+
// dei mesi con inizio e fine a metà settimana
|
|
35
|
+
cfg.months_weeks = cfg.months_weeks.map(mese => {
|
|
36
|
+
|
|
37
|
+
const weeks_count = mese.end_week - mese.start_week;
|
|
38
|
+
return {
|
|
39
|
+
...mese,
|
|
40
|
+
weeks_count: weeks_count,
|
|
41
|
+
|
|
42
|
+
// coordinata x iniziale della porzione mese dell'asse X
|
|
43
|
+
x: cfg.chart_area.left + ((mese.start_week - 1) * cfg.stepX_size),
|
|
44
|
+
width:weeks_count * cfg.stepX_size
|
|
45
|
+
};
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
// if(cfg.debug) {
|
|
50
|
+
// const lineeControlloMesi = cfg.svgCanvas.group().attr({
|
|
51
|
+
// 'data-cfg.debug-info': cfg.debug? 'Linee controllo' : null,
|
|
52
|
+
// stroke: '#c00',
|
|
53
|
+
// 'stroke-width': 2
|
|
54
|
+
// }),
|
|
55
|
+
// y1 = cfg.chart_area.bottom - 30,
|
|
56
|
+
// y2 = cfg.chart_area.bottom + 50;
|
|
57
|
+
|
|
58
|
+
// cfg.months_weeks.forEach((mese, idx) => {
|
|
59
|
+
|
|
60
|
+
// lineeControlloMesi.line(
|
|
61
|
+
// mese.x,
|
|
62
|
+
// y1,
|
|
63
|
+
// mese.x,
|
|
64
|
+
// y2
|
|
65
|
+
// );
|
|
66
|
+
|
|
67
|
+
// if(idx === 11) {
|
|
68
|
+
// lineeControlloMesi.line(
|
|
69
|
+
// mese.x + mese.width ,
|
|
70
|
+
// y1,
|
|
71
|
+
// mese.x + mese.width ,
|
|
72
|
+
// y2
|
|
73
|
+
// );
|
|
74
|
+
// }
|
|
75
|
+
// });
|
|
76
|
+
// }
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
// =>> etichette mesi (in mancanza di `label2XAttrs` usano le stesse impostazioni delle altre etichette asse X, `labelXAttrs`)
|
|
81
|
+
const etiMesiGroup = cfg.svgCanvas.group().attr({
|
|
82
|
+
'data-cfg.debug-info': cfg.debug? 'Gruppo etichette mesi asse X' : null,
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
if(cfg.label2XAttrs == null || !Object.keys(cfg.label2XAttrs).length) {
|
|
86
|
+
cfg.label2XAttrs = cfg.labelXAttrs;
|
|
87
|
+
}
|
|
88
|
+
if(!cfg.labelX2FontFilePath) {
|
|
89
|
+
cfg.labelX2FontFilePath = cfg.labelXFontFilePath;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
let meseIdx = 0;
|
|
94
|
+
for await (const thisMonth of cfg.months_weeks) {
|
|
95
|
+
|
|
96
|
+
const [label_bbox, labelEl] = await adaChartIstance.createTextEl ({
|
|
97
|
+
text: cfg.mesi[meseIdx],
|
|
98
|
+
textFill: cfg.label2XAttrs.fill?? '#000',
|
|
99
|
+
fontAttr: cfg.label2XAttrs,
|
|
100
|
+
fontFilePath: cfg.labelX2FontFilePath,
|
|
101
|
+
parentElement: etiMesiGroup
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
labelEl.move(
|
|
105
|
+
thisMonth.x + (thisMonth.width / 2) - (label_bbox.width / 2),
|
|
106
|
+
cfg.xLabelsEndY + cfg.label2TopGap// il numero è un distanziatore extra tra le due righe di etichette
|
|
107
|
+
);
|
|
108
|
+
meseIdx++;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// =>> aree colorate mesi
|
|
112
|
+
const areeMesiGroup = cfg.svgCanvas.group().attr({
|
|
113
|
+
'data-cfg.debug-info': cfg.debug? 'Gruppo aree mesi' : null,
|
|
114
|
+
...cfg.monthsAreasAttrs
|
|
115
|
+
})
|
|
116
|
+
.back(); // mette dietro al resto
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
cfg.months_weeks
|
|
120
|
+
.filter((mese, idx) => idx % 2)
|
|
121
|
+
.forEach(mese => {
|
|
122
|
+
areeMesiGroup
|
|
123
|
+
.rect(mese.width, cfg.chart_area.height)
|
|
124
|
+
.move(mese.x, cfg.chart_area.top);
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
return cfg;
|
|
129
|
+
}
|