@massimo-cassandro/minimo 1.41.3 → 1.41.5

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 (133) hide show
  1. package/README.md +12 -12
  2. package/charts/src/node-helpers/create-svg-canvas-node.mjs +2 -2
  3. package/charts/src/node-helpers/svg-text-to-path.js +9 -9
  4. package/charts/src/rating-display/index.js +1 -1
  5. package/charts/src/rating-display/ratindDisplayAnimation.js +3 -3
  6. package/design-tokens/README.md +2 -2
  7. package/design-tokens/_src/_readme.md +26 -26
  8. package/dev-tools/README.md +16 -16
  9. package/dev-tools/create-favicons/README.md +31 -31
  10. package/dev-tools/create-favicons/src/create-ico.mjs +2 -2
  11. package/dev-tools/create-favicons/src/default-params.mjs +1 -1
  12. package/dev-tools/create-favicons/src/init.mjs +1 -1
  13. package/dev-tools/design-tokens-builder/README.md +102 -102
  14. package/dev-tools/design-tokens-builder/build-tokens-src/build-source-modes.mjs +85 -73
  15. package/dev-tools/design-tokens-builder/build-tokens-src/config.mjs +109 -85
  16. package/dev-tools/design-tokens-builder/build-tokens-src/formats/css.mjs +113 -90
  17. package/dev-tools/design-tokens-builder/build-tokens-src/formats/json.mjs +107 -95
  18. package/dev-tools/design-tokens-builder/build-tokens-src/legacy-tokens-parser.mjs +71 -64
  19. package/dev-tools/design-tokens-builder/build-tokens-src/light-dark.mjs +75 -65
  20. package/dev-tools/design-tokens-builder/build-tokens-src/merge-css.mjs +113 -102
  21. package/dev-tools/design-tokens-builder/build-tokens-src/platforms.mjs +36 -30
  22. package/dev-tools/design-tokens-builder/build-tokens-src/resolve-source-paths.mjs +15 -13
  23. package/dev-tools/design-tokens-builder/build-tokens-src/source-prefixes.mjs +44 -42
  24. package/dev-tools/design-tokens-builder/build-tokens-src/source-transforms.mjs +89 -83
  25. package/dev-tools/design-tokens-builder/build-tokens-src/token-rename-parser.mjs +99 -86
  26. package/dev-tools/design-tokens-builder/build-tokens-src/transforms.mjs +64 -48
  27. package/dev-tools/design-tokens-builder/build-tokens.mjs +80 -68
  28. package/dev-tools/design-tokens-builder/check-unresolved-custom-props.mjs +103 -77
  29. package/dev-tools/design-tokens-builder/tokens-config-sample.mjs +275 -238
  30. package/dev-tools/find-orphan-css-classes/find-orphan-css-classes.mjs +2 -2
  31. package/dev-tools/starter-kit/source_files/app/CLAUDE.md +4 -2
  32. package/dev-tools/starter-kit/source_files/app/index.css +10 -0
  33. package/dev-tools/starter-kit/source_files/app/index.js +1 -1
  34. package/dev-tools/starter-kit/source_files/root/_sf/controller/ImgViewerController.php +3 -3
  35. package/dev-tools/starter-kit/source_files/root/_sf/controller/ViewerController.php +2 -2
  36. package/dev-tools/starter-kit/source_files/root/stylelint.config.mjs +1 -1
  37. package/dev-tools/starter-kit/source_files/root/webpack-config-modules/css-rules.mjs +1 -1
  38. package/dev-tools/starter-kit/starter-install.sh +2 -2
  39. package/dev-tools/stylelint-config/README.md +7 -7
  40. package/dev-tools/svg-icons-tools/README.md +32 -32
  41. package/dev-tools/svg-icons-tools/src/config-manager.mjs +1 -1
  42. package/dev-tools/svg-icons-tools/src/default-config.mjs +118 -118
  43. package/dev-tools/svg-icons-tools/src/jsx-icon-file-builder.mjs +24 -24
  44. package/dev-tools/svg-icons-tools/src/parse-svg-filename.mjs +3 -3
  45. package/dev-tools/svg-icons-tools/src/parse-svg-files.mjs +1 -1
  46. package/dev-tools/svg-icons-tools/src/parse-svg-markup.mjs +4 -4
  47. package/dev-tools/svg-icons-tools/src/svg-to-jsx.mjs +2 -2
  48. package/dev-tools/svg-icons-tools/src/svg-to-optimized.mjs +2 -2
  49. package/dev-tools/svg-icons-tools/src/svg-to-symbols.mjs +2 -2
  50. package/dev-tools/upd@m/README.md +1 -1
  51. package/dev-tools/upd@m/index.mjs +1 -1
  52. package/dev-tools/update-version/README.md +9 -9
  53. package/index.js +1 -0
  54. package/package.json +3 -1
  55. package/snippets/unsplash-browser-app/README.md +1 -1
  56. package/snippets/unsplash-browser-app/unsplash-utilities.js +9 -9
  57. package/src/components/autocomplete/README.md +3 -3
  58. package/src/components/autocomplete/autocomplete-engine.js +75 -63
  59. package/src/components/autocomplete/check-autocomplete.js +3 -3
  60. package/src/components/dismiss-alerts.js +3 -3
  61. package/src/components/form-reset-submit.js +6 -6
  62. package/src/components/inner-nav/inner-nav.js +2 -2
  63. package/src/components/modal-alert/modal-alert.js +67 -65
  64. package/src/components/modal-alert/modal-alert.minimo.tokens.mjs +1 -1
  65. package/src/components/modal-popup/modal-popup.js +56 -56
  66. package/src/components/overlay/overlay.js +3 -3
  67. package/src/components/sf-macro/readme.md +1 -1
  68. package/src/components/sf-macro/sf-macro.js +27 -23
  69. package/src/components/slide-up-down-toggle/slide-up-down-toggle.js +83 -79
  70. package/src/components/slide-up-down-toggle/slide-up-down-toggle.module.css +44 -44
  71. package/src/components/snackbar/snackbar.js +19 -19
  72. package/src/components/spinner/spinner.js +3 -3
  73. package/src/components/unsplash-page/README.md +8 -8
  74. package/src/components/unsplash-page/fetch-unsplash-data.js +3 -3
  75. package/src/components/unsplash-page/unsplash-page.js +33 -33
  76. package/src/components/unsplash-page/unsplash-page.module.css +1 -1
  77. package/src/css/alerts.css +2 -2
  78. package/src/css/forms/forms.css +4 -4
  79. package/src/css/forms/validation.css +1 -1
  80. package/src/css/margin-padding-media.css +4 -4
  81. package/src/css/margin-padding.css +4 -4
  82. package/src/css/reset.css +11 -11
  83. package/src/icons/read-me.md +1 -1
  84. package/src/minimo.css +3 -9
  85. package/src/utilities/better-text-with-places.js +105 -105
  86. package/src/utilities/better-text.js +42 -35
  87. package/src/utilities/classnames.js +8 -8
  88. package/src/utilities/cookies.js +6 -6
  89. package/src/utilities/create-id.js +3 -3
  90. package/src/utilities/disable-btns-on-submit.js +2 -2
  91. package/src/utilities/dom-builder/dom-builder.js +89 -86
  92. package/src/utilities/dom-builder/domBuilderBasicSetup.js +9 -9
  93. package/src/utilities/dom-builder/parseDomString.js +23 -23
  94. package/src/utilities/dom-builder-helpers/README.md +2 -2
  95. package/src/utilities/dom-builder-helpers/form-tags.js +100 -100
  96. package/src/utilities/dom-builder-helpers/picture-tag.js +39 -39
  97. package/src/utilities/enable-submit-btns.js +1 -1
  98. package/src/utilities/escape-html.js +2 -2
  99. package/src/utilities/generate-pwd.js +4 -4
  100. package/src/utilities/linked-dates.js +13 -13
  101. package/src/utilities/parse-file-size.js +6 -6
  102. package/src/utilities/random-id.js +3 -3
  103. package/src/utilities/relative-date.js +40 -40
  104. package/src/utilities/sentence-case.js +1 -1
  105. package/src/utilities/strip-tags.js +1 -1
  106. package/src/utilities/title-case.js +1 -1
  107. package/src/utilities/truncate-string.js +5 -5
  108. package/src/utilities/validation-error-class.js +12 -12
  109. package/src/web-components/json-table/json-table-component.js +123 -121
  110. package/src/web-components/json-table/json-table-component.module.css +6 -6
  111. package/src/web-components/json-table/json-table.minimo.tokens.mjs +6 -6
  112. package/src/web-components/json-table/readme.md +76 -110
  113. package/src/web-components/json-table/src/cell-content.js +25 -25
  114. package/src/web-components/json-table/src/content-utils.js +21 -21
  115. package/src/web-components/json-table/src/data-types.js +32 -32
  116. package/src/web-components/json-table/src/defaults.js +230 -191
  117. package/src/web-components/json-table/src/get-data.js +55 -38
  118. package/src/web-components/json-table/src/icons.js +17 -17
  119. package/src/web-components/json-table/src/info-section.js +18 -18
  120. package/src/web-components/json-table/src/main-builder.js +45 -45
  121. package/src/web-components/json-table/src/pagination.js +32 -32
  122. package/src/web-components/json-table/src/parse-cols.js +18 -18
  123. package/src/web-components/json-table/src/parse-rows.js +17 -17
  124. package/src/web-components/json-table/src/resolve-params.js +53 -41
  125. package/src/web-components/json-table/src/search.js +13 -13
  126. package/src/web-components/json-table/src/sorting.js +20 -20
  127. package/src/web-components/json-table/src/table-body.js +13 -13
  128. package/src/web-components/json-table/src/table-builder.js +34 -34
  129. package/src/web-components/json-table/src/table-tfoot.js +8 -8
  130. package/src/web-components/json-table/src/table-thead.js +21 -21
  131. package/src/web-components/json-table/src/update-info.js +11 -11
  132. package/types/classes.d.ts +2 -2
  133. package/types/global.d.ts +18 -12
@@ -45,7 +45,7 @@ export default {
45
45
  }
46
46
  },
47
47
 
48
- // sortable columns (thead)
48
+ // colonne ordinabili (thead)
49
49
  thead: {
50
50
  hover: {
51
51
  background: {
@@ -58,7 +58,7 @@ export default {
58
58
  },
59
59
 
60
60
  sort: {
61
- // the sort button fills the whole th: same padding/line-height of minimo table cells
61
+ // il pulsante di ordinamento riempie l'intero th: stesso padding/line-height delle celle tabella di minimo
62
62
  btn: {
63
63
  padding: {
64
64
  block: {
@@ -84,7 +84,7 @@ export default {
84
84
  $type: 'dimension',
85
85
  $value: '.4em'
86
86
  },
87
- // opacity of the icon when no sort is active
87
+ // opacità dell'icona quando non c'è alcun ordinamento attivo
88
88
  none: {
89
89
  opacity: {
90
90
  $type: 'number',
@@ -94,7 +94,7 @@ export default {
94
94
  }
95
95
  },
96
96
 
97
- // boolean cells
97
+ // celle booleane
98
98
  bool: {
99
99
  icon: {
100
100
  size: {
@@ -116,7 +116,7 @@ export default {
116
116
  }
117
117
  },
118
118
 
119
- // opacity of the table while a server-side request is in progress
119
+ // opacità della tabella mentre è in corso una richiesta server-side
120
120
  busy: {
121
121
  opacity: {
122
122
  $type: 'number',
@@ -124,7 +124,7 @@ export default {
124
124
  }
125
125
  },
126
126
 
127
- // footer bar below the table (caption + pagination)
127
+ // barra del footer sotto la tabella (caption + paginazione)
128
128
  'table-footer': {
129
129
  padding: {
130
130
  block: {
@@ -1,20 +1,17 @@
1
1
  # `<json-table>` – datatable da JSON
2
2
 
3
- **json-table** costruisce una tabella HTML da un array di dati JSON (inline o caricato via
4
- fetch), a partire da una definizione delle colonne (`cols`) e da un insieme di tipi di dato
5
- predefiniti ed estendibili, con ordinamento, ricerca e paginazione (lato client oppure, con
6
- `serverSide: true`, delegati al server). È un web component light DOM senza dipendenze esterne:
7
- può quindi essere stilizzato direttamente dal CSS del progetto in cui è utilizzato.
3
+ **json-table** costruisce una tabella HTML da un array di dati JSON (inline o caricato via fetch), a partire da una definizione delle colonne (`cols`) e da un insieme di tipi di dato predefiniti ed estendibili, con ordinamento, ricerca e paginazione (lato client oppure, con `serverSide: true`, delegati al server). È un web component light DOM senza dipendenze esterne: può quindi essere stilizzato direttamente dal CSS del progetto in cui è utilizzato.
8
4
 
9
5
  ## Installazione
10
6
 
11
7
  È sufficiente importare il file del componente (registra il custom element):
12
8
 
13
9
  ```javascript
14
- import '@massimo-cassandro/minimo/src/web-components/json-table/json-table-component.js';
10
+ // solo registrazione del tag
11
+ import '@massimo-cassandro/minimo/json-table';
15
12
 
16
13
  // oppure, se necessario eseguire metodi della classe (es. `setDefaults`):
17
- import { JsonTable } from '@massimo-cassandro/minimo/src/web-components/json-table/json-table-component.js';
14
+ import { JsonTable } from '@massimo-cassandro/minimo/json-table';
18
15
  ```
19
16
 
20
17
  Il CSS (`json-table-component.module.css`) è importato dal componente stesso; le custom
@@ -25,10 +22,7 @@ webpack dello starter-kit).
25
22
 
26
23
  ### Tipi per gli script consumer
27
24
 
28
- Il file `types/global.d.ts` di minimo dichiara il tipo globale `JsonTable` e registra il tag
29
- `json-table` in `HTMLElementTagNameMap`: aggiungendolo all'`include` del proprio
30
- `jsconfig.json`/`tsconfig.json` (`"node_modules/@massimo-cassandro/minimo/types/global.d.ts"`)
31
- si ottiene il completamento dei metodi senza cast né import di tipo:
25
+ Il file `types/global.d.ts` di minimo dichiara il tipo globale `JsonTable` e registra il tag `json-table` in `HTMLElementTagNameMap`: aggiungendolo all'`include` del proprio `jsconfig.json`/`tsconfig.json` (`"node_modules/@massimo-cassandro/minimo/types/global.d.ts"`) si ottiene il completamento dei metodi senza cast né import di tipo:
32
26
 
33
27
  ```javascript
34
28
  const el = document.querySelector('json-table'); // → JsonTable
@@ -52,6 +46,7 @@ const other = document.createElement('json-table');
52
46
  { "key": "active", "title": "Attivo", "dataType": "bool" }
53
47
  ]'
54
48
  tfoot="true"
49
+ serverSide="true"
55
50
  ></json-table>
56
51
 
57
52
  <!-- dati inline (JSON serializzato) al posto di jsonurl -->
@@ -208,106 +203,53 @@ el.init({ jsonUrl: '/api/rows.json', cols: [...] });
208
203
 
209
204
  ## Parametri
210
205
 
211
- Tutti i parametri sono impostabili sia da attributo HTML che da `init()`. I valori di tipo
212
- funzione solo da `init()`.
206
+ Tutti i parametri sono impostabili sia da attributo HTML che come oggetto in `init({...})`. I valori di tipo funzione solo da `init()`.
213
207
 
214
- ```javascript
215
- {
216
- debug, // boolean – log in console di parametri, colonne, dati, stato ed
217
- // elementi generati. Default: false
218
-
219
- jsonUrl, // string – URL del JSON da caricare. Ignorato se `data` è presente.
220
- // Default: null
221
- jsonDataField, // string|null – chiave del JSON che contiene l'array delle righe
222
- // (es. 'data' per { data: [...] }); null o '' = la root del JSON è
223
- // l'array stesso. Default: 'data'
224
- totRecField, // string – chiave del JSON con il totale dei record (numerico); se
225
- // assente o non numerico il totale è la lunghezza dell'array.
226
- // Default: 'totRec'
227
- filteredRecField, // string – solo server-side: chiave del JSON con il numero di record
228
- // che soddisfano la ricerca corrente; se assente vale `totRecField`.
229
- // Default: 'filteredRec'
230
- data, // Array<Object> – righe inline; prevale su `jsonUrl`. Da attributo va
231
- // passato come stringa JSON ed è sempre inteso come array delle righe
232
- // (`jsonDataField` ignorato). Default: null
233
-
234
- cols, // ColDefinition[] – OBBLIGATORIO: definizione delle colonne (vedi
235
- // sotto). Se assente o vuoto viene segnalato un errore in console e
236
- // la tabella non viene generata
237
- dataTypes, // Object – tipi di dato personalizzati, uniti a quelli predefiniti
238
- // (vedi sotto). Default: {}
239
-
240
- caption, // string|Function – caption della tabella (testo o HTML), oppure
241
- // funzione che restituisce stringa o Node. Mostrata sotto la tabella
242
- // (vedi "Caption e paginazione"). Default: null
243
- search, // boolean – genera l'input di ricerca. Default: true
244
- searchDebounce, // number – ms di attesa dopo l'ultimo tasto prima di eseguire la
245
- // ricerca. Default: 300
246
-
247
- perPage, // number – righe per pagina; 0 = nessuna paginazione (tutte le righe,
248
- // nessuna navigazione). Default: 25
249
- paginationDelta, // number – pulsanti pagina mostrati a ciascun lato della pagina
250
- // corrente. Default: 2
251
- serverSide, // boolean – paginazione, ordinamento e ricerca delegati al server
252
- // (vedi "Modalità server-side"). Richiede `jsonUrl`. Default: false
253
- serverParams, // Object – nomi dei parametri di query string in modalità server-side,
254
- // uniti ai default (vedi sotto)
255
- initialSort, // { key, dir }|null – ordinamento applicato al caricamento, es.
256
- // { key: 'name', dir: 'asc' }. Default: null
257
-
258
- tfoot, // boolean – genera il tfoot (vedi `tfootRender` delle colonne).
259
- // Non disponibile in modalità server-side. Default: false
260
- updateFooterOnPageChange, // boolean – se true `tfootRender` riceve solo i record della pagina
261
- // corrente (subtotali di pagina) e il footer si aggiorna a ogni cambio
262
- // pagina; se false riceve l'intero set filtrato e si aggiorna solo al
263
- // cambio filtro. Default: false
264
- infoText, // string|Function|null – contenuto dell'area info: stringa mustache-like
265
- // con i segnaposto {start}, {end}, {totRec}, {filteredRec}, {page},
266
- // {totPages}, oppure funzione
267
- // (start, end, totRec, filteredRec, page, totPages) => string|Node.
268
- // null = viene usato `labels.info`. Default: null
269
- template, // Array – layout del contenitore principale (vedi "Template").
270
- // Default: [{ slot: 'infoSection' }, { slot: 'table' }]
271
-
272
- locale, // string – locale per numeri, date e confronto stringhe
273
- // nell'ordinamento. Default: 'it-IT'
274
- currency, // string – codice ISO 4217 usato dal tipo `currency`. Default: 'EUR'
275
- datesLocaleOpts, // Intl.DateTimeFormatOptions – parte data dei tipi date/datetime.
276
- // Default: { year: 'numeric', month: 'short', day: 'numeric' }
277
- timesLocaleOpts, // Intl.DateTimeFormatOptions – parte ora del tipo datetime.
278
- // Default: { hour12: false, hour: '2-digit', minute: '2-digit' }
279
- numbersLocaleOpts, // Intl.NumberFormatOptions – tipo num.
280
- // Default: { maximumFractionDigits: 2 }
281
- currPercLocaleOpts, // Intl.NumberFormatOptions – tipi currency/euro/perc/percDecimal.
282
- // Default: { minimumFractionDigits: 2, maximumFractionDigits: 2 }
283
-
284
- renderNullAs, // string|null – contenuto per i valori null/undefined. Default: '—'
285
- renderZeroAs, // string|null – se non null, contenuto per i valori numerici pari a
286
- // zero. Default: null
287
- renderNaNAs, // string|null – contenuto per i valori non numerici nei tipi numerici.
288
- // Default: '—'
289
-
290
- boolTrueIcon, // icona per i valori true (tipo bool).
291
- // Default: icona `check-bold` di minimo (Phosphor)
292
- boolFalseIcon, // icona per i valori false. Default: icona `x-bold`
293
- sortAscArrowIcon, // icona del pulsante di ordinamento, ordinamento asc attivo.
294
- // Default: icona `arrow-up`
295
- sortDescArrowIcon, // idem, ordinamento desc attivo. Default: icona `arrow-down`
296
- sortNoneArrowIcon, // idem, nessun ordinamento. Default: icona `arrows-down-up`
297
- paginationPrevIcon, // icona del pulsante "pagina precedente". Default: icona `caret-left`
298
- paginationNextIcon, // icona del pulsante "pagina successiva". Default: icona `caret-right`
299
- // Ogni icona può essere una stringa SVG/HTML (es. import `?inline`),
300
- // un Node, un oggetto domBuilder o una funzione che restituisce uno
301
- // di questi valori
302
-
303
- trCallback, // (tr, row, params) => void – callback invocata dopo il rendering di
304
- // ogni riga del body. Default: null
305
- tableId, // string – id del tag <table>. Default: null
306
-
307
- classes, // Object – classi consumer (vedi sotto), unite ai default
308
- labels // Object – testi (vedi sotto), uniti ai default
309
- }
310
- ```
208
+ | Parametro | Tipo / default | Descrizione |
209
+ |---|---|---|
210
+ | `debug` | boolean (`false`) | Log in console di parametri, colonne, dati, stato ed elementi generati |
211
+ | `jsonUrl` | string (`null`) | URL del JSON da caricare. Ignorato se `data` è presente |
212
+ | `jqDatatableMode` | boolean (`false`) | Se `true` imposta come default i valori compatibili con il formato server-side di jQuery DataTables: `jsonDataField: 'data'`, `totRecField: 'recordsTotal'`, `filteredRecField: 'recordsFiltered'`, `serverSide: true` e i `serverParams` indicati in "Modalità jQuery DataTables". Ogni valore resta sovrascrivibile |
213
+ | `jsonDataField` | string o null (`'data'`) | Chiave del JSON che contiene l'array delle righe (es. `'data'` per `{ data: [...] }`); `null` o `''` = la root del JSON è l'array stesso |
214
+ | `totRecField` | string (`'totRec'`) | Chiave del JSON con il totale dei record (numerico); se assente o non numerico il totale è la lunghezza dell'array |
215
+ | `filteredRecField` | string (`'filteredRec'`) | Solo server-side: chiave del JSON con il numero di record che soddisfano la ricerca corrente; se assente vale `totRecField` |
216
+ | `data` | Array&lt;Object&gt; (`null`) | Righe inline; prevale su `jsonUrl`. Da attributo va passato come stringa JSON ed è sempre inteso come array delle righe (`jsonDataField` ignorato) |
217
+ | `cols` | ColDefinition[] | **OBBLIGATORIO**: definizione delle colonne (vedi sotto). Se assente o vuoto viene segnalato un errore in console e la tabella non viene generata |
218
+ | `dataTypes` | Object (`{}`) | Tipi di dato personalizzati, uniti a quelli predefiniti (vedi sotto) |
219
+ | `caption` | string o Function (`null`) | Caption della tabella (testo o HTML), oppure funzione che restituisce stringa o Node. Mostrata sotto la tabella (vedi "Caption e paginazione") |
220
+ | `search` | boolean (`true`) | Genera l'input di ricerca |
221
+ | `searchDebounce` | number (`300`) | Millisecondi di attesa dopo l'ultimo tasto prima di eseguire la ricerca |
222
+ | `perPage` | number (`25`) | Righe per pagina; `0` = nessuna paginazione (tutte le righe, nessuna navigazione) |
223
+ | `paginationDelta` | number (`2`) | Pulsanti pagina mostrati a ciascun lato della pagina corrente |
224
+ | `serverSide` | boolean (`false`) | Paginazione, ordinamento e ricerca delegati al server (vedi "Modalità server-side"). Richiede `jsonUrl` |
225
+ | `serverParams` | Object | Nomi dei parametri di query string in modalità server-side, uniti ai default (vedi sotto) |
226
+ | `initialSort` | { key, dir } o null (`null`) | Ordinamento applicato al caricamento, es. `{ key: 'name', dir: 'asc' }` |
227
+ | `tfoot` | boolean (`false`) | Genera il tfoot (vedi `tfootRender` delle colonne). Non disponibile in modalità server-side |
228
+ | `updateFooterOnPageChange` | boolean (`false`) | Se `true` `tfootRender` riceve solo i record della pagina corrente (subtotali di pagina) e il footer si aggiorna a ogni cambio pagina; se `false` riceve l'intero set filtrato e si aggiorna solo al cambio filtro |
229
+ | `infoText` | string, Function o null (`null`) | Contenuto dell'area info: stringa mustache-like con i segnaposto `{start}`, `{end}`, `{totRec}`, `{filteredRec}`, `{page}`, `{totPages}`, oppure funzione `(start, end, totRec, filteredRec, page, totPages) => string\|Node`. `null` = viene usato `labels.info` |
230
+ | `template` | Array (`[{ slot: 'infoSection' }, { slot: 'table' }]`) | Layout del contenitore principale (vedi "Template") |
231
+ | `locale` | string (`'it-IT'`) | Locale per numeri, date e confronto stringhe nell'ordinamento |
232
+ | `currency` | string (`'EUR'`) | Codice ISO 4217 usato dal tipo `currency` |
233
+ | `datesLocaleOpts` | Intl.DateTimeFormatOptions (`{ year: 'numeric', month: 'short', day: 'numeric' }`) | Parte data dei tipi date/datetime |
234
+ | `timesLocaleOpts` | Intl.DateTimeFormatOptions (`{ hour12: false, hour: '2-digit', minute: '2-digit' }`) | Parte ora del tipo datetime |
235
+ | `numbersLocaleOpts` | Intl.NumberFormatOptions (`{ maximumFractionDigits: 2 }`) | Tipo `num` |
236
+ | `currPercLocaleOpts` | Intl.NumberFormatOptions (`{ minimumFractionDigits: 2, maximumFractionDigits: 2 }`) | Tipi currency/euro/perc/percDecimal |
237
+ | `renderNullAs` | string o null (`'—'`) | Contenuto per i valori null/undefined |
238
+ | `renderZeroAs` | string o null (`null`) | Se non null, contenuto per i valori numerici pari a zero |
239
+ | `renderNaNAs` | string o null (`'—'`) | Contenuto per i valori non numerici nei tipi numerici |
240
+ | `boolTrueIcon` | icona, vedi nota (icona `check-bold` di minimo (Phosphor)) | Icona per i valori `true` (tipo bool) |
241
+ | `boolFalseIcon` | icona, vedi nota (icona `x-bold`) | Icona per i valori `false` |
242
+ | `sortAscArrowIcon` | icona, vedi nota (icona `arrow-up`) | Icona del pulsante di ordinamento, ordinamento asc attivo |
243
+ | `sortDescArrowIcon` | icona, vedi nota (icona `arrow-down`) | Icona del pulsante di ordinamento, ordinamento desc attivo |
244
+ | `sortNoneArrowIcon` | icona, vedi nota (icona `arrows-down-up`) | Icona del pulsante di ordinamento, nessun ordinamento |
245
+ | `paginationPrevIcon` | icona, vedi nota (icona `caret-left`) | Icona del pulsante "pagina precedente" |
246
+ | `paginationNextIcon` | icona, vedi nota (icona `caret-right`) | Icona del pulsante "pagina successiva" |
247
+ | `trCallback` | (tr, row, params) => void (`null`) | Callback invocata dopo il rendering di ogni riga del body |
248
+ | `tableId` | string (`null`) | Id del tag `<table>` |
249
+ | `classes` | Object | Classi consumer (vedi sotto), unite ai default |
250
+ | `labels` | Object | Testi (vedi sotto), uniti ai default |
251
+
252
+ **Nota sulle icone**: ogni icona può essere una stringa SVG/HTML (es. import `?inline`), un Node, un oggetto domBuilder o una funzione che restituisce uno di questi valori.
311
253
 
312
254
  ### `classes`
313
255
 
@@ -624,6 +566,30 @@ disponibile. In questa modalità `data`, `filtered` e `pageRows` dello stato con
624
566
  pagina corrente e il `tfoot` non è disponibile. `serverSide` richiede `jsonUrl`: con `data` inline
625
567
  viene ignorato con un avviso in console.
626
568
 
569
+ ### Modalità jQuery DataTables
570
+
571
+ Con `jqDatatableMode: true` (o l'attributo `jqdatatablemode="true"`) i default dei parametri server-side diventano quelli del formato di jQuery DataTables, utile per riutilizzare endpoint già esistenti:
572
+
573
+ | Parametro | Default con `jqDatatableMode` |
574
+ |---|---|
575
+ | `jsonDataField` | `'data'` |
576
+ | `totRecField` | `'recordsTotal'` |
577
+ | `filteredRecField` | `'recordsFiltered'` |
578
+ | `serverSide` | `true` |
579
+ | `serverParams` | `{ page: null, start: 'start', perPage: 'length', sort: 'order[0][column]', dir: 'order[0][dir]', search: 'search[value]' }` |
580
+
581
+ Precedenza: `init()` > attributo HTML > `JsonTable.setDefaults()` > modalità jQuery DataTables > default predefiniti. Ogni parametro può quindi essere sovrascritto singolarmente, e `serverParams` viene unito chiave per chiave.
582
+
583
+ Oltre ai `serverParams`, in questa modalità vengono inviati anche `draw=1` e, per ogni colonna visualizzata, `columns[i][name]` (la `key`), `columns[i][searchable]` e `columns[i][orderable]`. `order[0][column]` riceve l'**indice** della colonna ordinata (tra quelle visualizzate), non la chiave. È previsto un solo criterio di ordinamento (`order[0]`).
584
+
585
+ ```html
586
+ <json-table jsonurl="/api/rows" jqdatatablemode="true" cols='[{"key":"id"},{"key":"name"}]'></json-table>
587
+ ```
588
+
589
+ ```
590
+ GET /api/rows?draw=1&columns[0][name]=id&columns[0][searchable]=true&columns[0][orderable]=true&columns[1][name]=name&…&start=25&length=25&order[0][column]=1&order[0][dir]=desc&search[value]=mar
591
+ ```
592
+
627
593
  ## Template
628
594
 
629
595
  `template` definisce il contenuto del contenitore principale come array domBuilder, in cui gli
@@ -8,21 +8,21 @@ import { toNumber } from './data-types.js';
8
8
  /** @typedef {import('./parse-cols.js').ParsedCol} ParsedCol */
9
9
 
10
10
  /**
11
- * Computes the content of a body cell.
11
+ * Calcola il contenuto di una cella del body.
12
12
  *
13
13
  * Pipeline:
14
- * 1. column `render`: function `(row, tr, td)` or mustache-like string (`[[key]]`); a function
15
- * returning `undefined` lets the pipeline go on (useful to only decorate `td`/`tr`), `null`
16
- * gives `renderNullAs`
17
- * 2. `null`/`undefined` raw value → `renderNullAs`
18
- * 3. data type `render(value, row, params)`
19
- * 4. raw value
14
+ * 1. `render` della colonna: funzione `(row, tr, td)` o stringa in stile mustache (`[[key]]`); una funzione
15
+ * che restituisce `undefined` lascia proseguire la pipeline (utile per decorare solo `td`/`tr`), `null`
16
+ * dà `renderNullAs`
17
+ * 2. valore grezzo `null`/`undefined` → `renderNullAs`
18
+ * 3. `render(value, row, params)` del data type
19
+ * 4. valore grezzo
20
20
  *
21
- * @param {ParsedCol} col - Parsed column
22
- * @param {Object} row - Row object
23
- * @param {JsonTableParams} params - Resolved params
24
- * @param {HTMLTableRowElement} [tr] - Row element, passed to the column `render`
25
- * @param {HTMLTableCellElement} [td] - Cell element, passed to the column `render`
21
+ * @param {ParsedCol} col - Colonna analizzata
22
+ * @param {Object} row - Oggetto riga
23
+ * @param {JsonTableParams} params - Parametri risolti
24
+ * @param {HTMLTableRowElement} [tr] - Elemento riga, passato al `render` della colonna
25
+ * @param {HTMLTableCellElement} [td] - Elemento cella, passato al `render` della colonna
26
26
  * @returns {CellContent}
27
27
  *
28
28
  * @example
@@ -30,7 +30,7 @@ import { toNumber } from './data-types.js';
30
30
  * cellContent({ ...col, key: 'amount', _type: types.euro }, { amount: null }, params); // → '—' (renderNullAs)
31
31
  * cellContent({ ...col, render: '<b>[[name]]</b>' }, { name: 'Mario' }, params); // → '<b>Mario</b>'
32
32
  * cellContent({ ...col, render: (row, tr, td) => { td.title = row.name; } }, row, params, tr, td);
33
- * // → data type / raw value (render returned undefined)
33
+ * // → data type / valore grezzo (render ha restituito undefined)
34
34
  */
35
35
  export function cellContent(col, row, params, tr, td) {
36
36
 
@@ -61,8 +61,8 @@ export function cellContent(col, row, params, tr, td) {
61
61
 
62
62
 
63
63
  /**
64
- * Built-in footer aggregates (`tfootRender: '@sum'`, ...), computed on the numeric values
65
- * of the column (non-numeric values are skipped).
64
+ * Aggregati predefiniti del footer (`tfootRender: '@sum'`, ...), calcolati sui valori numerici
65
+ * della colonna (i valori non numerici vengono saltati).
66
66
  * @type {Object<string, (nums: number[]) => number>}
67
67
  */
68
68
  const aggregates = {
@@ -75,17 +75,17 @@ const aggregates = {
75
75
 
76
76
 
77
77
  /**
78
- * Computes the content of a footer cell from the column `tfootRender`:
79
- * - function `(rows, td) => content`
80
- * - built-in aggregate `'@sum'`, `'@avg'`, `'@min'`, `'@max'` (formatted by the column data
81
- * type, e.g. as currency for `euro` columns) or `'@count'` (number of numeric values)
82
- * - any other string: static content (e.g. a "Totale" label)
83
- * - `null`: empty cell
78
+ * Calcola il contenuto di una cella del footer dal `tfootRender` della colonna:
79
+ * - funzione `(rows, td) => content`
80
+ * - aggregato predefinito `'@sum'`, `'@avg'`, `'@min'`, `'@max'` (formattato dal data
81
+ * type della colonna, ad es. come valuta per le colonne `euro`) oppure `'@count'` (numero di valori numerici)
82
+ * - qualsiasi altra stringa: contenuto statico (ad es. un'etichetta "Totale")
83
+ * - `null`: cella vuota
84
84
  *
85
- * @param {ParsedCol} col - Parsed column
86
- * @param {Array<Object>} rows - Rows to aggregate (filtered set or current page, see `updateFooterOnPageChange`)
87
- * @param {JsonTableParams} params - Resolved params
88
- * @param {HTMLTableCellElement} [td] - Footer cell element, passed to the `tfootRender` function
85
+ * @param {ParsedCol} col - Colonna analizzata
86
+ * @param {Array<Object>} rows - Righe da aggregare (insieme filtrato o pagina corrente, vedi `updateFooterOnPageChange`)
87
+ * @param {JsonTableParams} params - Parametri risolti
88
+ * @param {HTMLTableCellElement} [td] - Elemento cella del footer, passato alla funzione `tfootRender`
89
89
  * @returns {CellContent}
90
90
  *
91
91
  * @example
@@ -5,17 +5,17 @@ import { domBuilder } from '../../../utilities/dom-builder/dom-builder.js';
5
5
  /** @typedef {import('./defaults.js').CellContent} CellContent */
6
6
 
7
7
  /**
8
- * Replaces the content of `el` with `content`, accepting every content form used by the
9
- * component (see `CellContent`): a Node is appended as-is, a domBuilder array is built inside
10
- * the element, a string/number is set as text or, when it contains `<`, as sanitized markup
11
- * (`Element.setHTML` where supported, `innerHTML` otherwise, consistently with domBuilder).
12
- * The empty sanitizer config passed to `setHTML` keeps `class`, `id`, `style` and `data-*`
13
- * attributes, which the browser default configuration removes, while unsafe content (scripts,
14
- * event handlers, `javascript:` URLs) is always stripped.
15
- * A function is invoked and its result used. `null`/`undefined` empty the element.
8
+ * Sostituisce il contenuto di `el` con `content`, accettando ogni forma di contenuto usata dal
9
+ * componente (vedi `CellContent`): un Node viene aggiunto così com'è, un array domBuilder viene costruito dentro
10
+ * l'elemento, una stringa/numero viene impostato come testo oppure, se contiene `<`, come markup sanificato
11
+ * (`Element.setHTML` dove supportato, altrimenti `innerHTML`, in modo coerente con domBuilder).
12
+ * La configurazione vuota del sanitizer passata a `setHTML` mantiene gli attributi `class`, `id`, `style` e `data-*`,
13
+ * che la configurazione predefinita del browser rimuove, mentre il contenuto non sicuro (script,
14
+ * gestori di eventi, URL `javascript:`) viene sempre eliminato.
15
+ * Una funzione viene invocata e il suo risultato usato. `null`/`undefined` svuotano l'elemento.
16
16
  *
17
- * @param {HTMLElement} el - Target element (emptied first)
18
- * @param {CellContent|(() => CellContent)} content - Content to set
17
+ * @param {HTMLElement} el - Elemento di destinazione (svuotato prima)
18
+ * @param {CellContent|(() => CellContent)} content - Contenuto da impostare
19
19
  * @returns {void}
20
20
  *
21
21
  * @example
@@ -24,7 +24,7 @@ import { domBuilder } from '../../../utilities/dom-builder/dom-builder.js';
24
24
  * setContent(td, 1234);
25
25
  * setContent(td, document.createElement('span'));
26
26
  * setContent(td, [{ tag: 'a', attrs: { href: '#' }, content: 'link' }]);
27
- * setContent(td, null); // → empty cell
27
+ * setContent(td, null); // → cella vuota
28
28
  */
29
29
  export function setContent(el, content) {
30
30
 
@@ -60,11 +60,11 @@ export function setContent(el, content) {
60
60
 
61
61
 
62
62
  /**
63
- * Reads a value from an object through a dot-separated key path.
64
- * Returns `undefined` when an intermediate key does not exist.
63
+ * Legge un valore da un oggetto tramite un percorso di chiavi separate da punti.
64
+ * Restituisce `undefined` quando una chiave intermedia non esiste.
65
65
  *
66
- * @param {Object|null|undefined} obj - Source object
67
- * @param {string} path - Key or dot-separated path
66
+ * @param {Object|null|undefined} obj - Oggetto sorgente
67
+ * @param {string} path - Chiave o percorso separato da punti
68
68
  * @returns {*}
69
69
  *
70
70
  * @example
@@ -81,13 +81,13 @@ export function getNestedValue(obj, path) {
81
81
 
82
82
 
83
83
  /**
84
- * Resolves a mustache-like template: every `[[key]]` placeholder is replaced with the
85
- * corresponding row value (nested keys allowed); placeholders resolving to `null`/`undefined`
86
- * are replaced with `nullAs`. Useful for the js-free configuration via HTML attributes.
84
+ * Risolve un template in stile mustache: ogni segnaposto `[[key]]` viene sostituito con il
85
+ * corrispondente valore della riga (chiavi annidate ammesse); i segnaposto che risultano `null`/`undefined`
86
+ * vengono sostituiti con `nullAs`. Utile per la configurazione senza JS tramite attributi HTML.
87
87
  *
88
- * @param {string} tpl - Template string
89
- * @param {Object} row - Row object
90
- * @param {string} [nullAs=''] - Replacement of null/undefined values (default: '')
88
+ * @param {string} tpl - Stringa del template
89
+ * @param {Object} row - Oggetto riga
90
+ * @param {string} [nullAs=''] - Sostituto dei valori null/undefined (default: '')
91
91
  * @returns {string}
92
92
  *
93
93
  * @example
@@ -8,7 +8,7 @@ import { iconContent } from './icons.js';
8
8
  /** @typedef {import('./defaults.js').DataTypeDefinition} DataTypeDefinition */
9
9
 
10
10
  /**
11
- * Converts a value to a number; empty strings and nullish values give `NaN`.
11
+ * Converte un valore in numero; le stringhe vuote e i valori nullish danno `NaN`.
12
12
  * @param {*} value
13
13
  * @returns {number}
14
14
  *
@@ -26,8 +26,8 @@ export function toNumber(value) {
26
26
 
27
27
 
28
28
  /**
29
- * Converts a boolean-like value (`true`/`false`, `1`/`0`, `'1'`/`'0'`, `'true'`/`'false'`)
30
- * to a boolean; every other value gives `null`, so that `null` can be told apart from `false`.
29
+ * Converte un valore simile a un booleano (`true`/`false`, `1`/`0`, `'1'`/`'0'`, `'true'`/`'false'`)
30
+ * in booleano; ogni altro valore dà `null`, così che `null` si distingua da `false`.
31
31
  * @param {*} value
32
32
  * @returns {boolean|null}
33
33
  *
@@ -49,11 +49,11 @@ export function toBool(value) {
49
49
 
50
50
 
51
51
  /**
52
- * Parses a date-like value: ISO string, timestamp, `Date` object or a Symfony-like object
52
+ * Analizza un valore simile a una data: stringa ISO, timestamp, oggetto `Date` o un oggetto in stile Symfony
53
53
  * (`{ date: '2022-12-02 06:18:55', timezone_type: 3, timezone: 'Europe/Berlin' }`).
54
54
  * TODO fuso orario degli oggetti Symfony non gestito (la stringa `date` è interpretata come ora locale)
55
55
  * @param {*} value
56
- * @returns {Date|null} `null` for empty or invalid values
56
+ * @returns {Date|null} `null` per i valori vuoti o non validi
57
57
  *
58
58
  * @example
59
59
  * parseDate('2024-01-31'); // → Date
@@ -77,11 +77,11 @@ export function parseDate(value) {
77
77
 
78
78
 
79
79
  /**
80
- * Formats a numeric value, applying `renderNaNAs` and `renderZeroAs`.
81
- * @param {*} value - Raw value
82
- * @param {JsonTableParams} params - Resolved params
83
- * @param {Intl.NumberFormatOptions} formatOpts - `toLocaleString` options
84
- * @param {(formatted: string, num: number) => string} [wrap] - Optional decorator of the formatted string
80
+ * Formatta un valore numerico, applicando `renderNaNAs` e `renderZeroAs`.
81
+ * @param {*} value - Valore grezzo
82
+ * @param {JsonTableParams} params - Parametri risolti
83
+ * @param {Intl.NumberFormatOptions} formatOpts - Opzioni di `toLocaleString`
84
+ * @param {(formatted: string, num: number) => string} [wrap] - Decoratore opzionale della stringa formattata
85
85
  * @returns {string}
86
86
  *
87
87
  * @example
@@ -104,23 +104,23 @@ export function formatNumber(value, params, formatOpts, wrap) {
104
104
 
105
105
 
106
106
  /**
107
- * Built-in data types, built on the resolved params (class names, locale options, icons).
107
+ * Data type predefiniti, costruiti sui parametri risolti (nomi delle classi, opzioni locale, icone).
108
108
  *
109
- * | key | description | cell classes |
109
+ * | chiave | descrizione | classi della cella |
110
110
  * |---------------|-----------------------------------------------------------------|-------------------------|
111
- * | `string` | default type, value as-is | – |
112
- * | `num` | number formatted with `numbersLocaleOpts` | textEnd numeric nowrap |
113
- * | `id` | numeric id: raw value, right aligned, not searchable | textEnd numeric |
114
- * | `perc` | percentage already in 0–100 scale, `currPercLocaleOpts` + " %" | textEnd numeric nowrap |
115
- * | `percDecimal` | percentage in 0–1 scale (multiplied by 100) | textEnd numeric nowrap |
116
- * | `currency` | `Intl` currency format, `params.currency` | textEnd numeric nowrap |
117
- * | `euro` | as `currency`, EUR forced | textEnd numeric nowrap |
118
- * | `date` | `<time>` element, `datesLocaleOpts` | textEnd nowrap |
119
- * | `datetime` | as `date`, plus time part (`timesLocaleOpts`) | textEnd nowrap |
120
- * | `bool` | `boolTrueIcon`/`boolFalseIcon`; not sortable/searchable | (internal icon styles) |
121
- * | `email` | soft line breaks around `@` | – |
111
+ * | `string` | tipo predefinito, valore così com'è | – |
112
+ * | `num` | numero formattato con `numbersLocaleOpts` | textEnd numeric nowrap |
113
+ * | `id` | id numerico: valore grezzo, allineato a destra, non ricercabile | textEnd numeric |
114
+ * | `perc` | percentuale già in scala 0–100, `currPercLocaleOpts` + " %" | textEnd numeric nowrap |
115
+ * | `percDecimal` | percentuale in scala 0–1 (moltiplicata per 100) | textEnd numeric nowrap |
116
+ * | `currency` | formato valuta `Intl`, `params.currency` | textEnd numeric nowrap |
117
+ * | `euro` | come `currency`, EUR forzato | textEnd numeric nowrap |
118
+ * | `date` | elemento `<time>`, `datesLocaleOpts` | textEnd nowrap |
119
+ * | `datetime` | come `date`, più la parte oraria (`timesLocaleOpts`) | textEnd nowrap |
120
+ * | `bool` | `boolTrueIcon`/`boolFalseIcon`; non ordinabile/ricercabile | (stili interni delle icone) |
121
+ * | `email` | a capo morbidi attorno a `@` | – |
122
122
  *
123
- * @param {JsonTableParams} params - Resolved params
123
+ * @param {JsonTableParams} params - Parametri risolti
124
124
  * @returns {Object<string, DataTypeDefinition>}
125
125
  *
126
126
  * @example
@@ -237,21 +237,21 @@ export function builtInDataTypes(params) {
237
237
 
238
238
 
239
239
  /**
240
- * Merges the custom data types (`params.dataTypes`) with the built-in ones.
240
+ * Unisce i data type personalizzati (`params.dataTypes`) a quelli predefiniti.
241
241
  *
242
- * A custom key matching a built-in type overrides only the given properties; a new key can
243
- * extend a built-in type via `inheritsFrom`.
242
+ * Una chiave personalizzata che corrisponde a un tipo predefinito ne sovrascrive solo le proprietà indicate; una nuova chiave può
243
+ * estendere un tipo predefinito tramite `inheritsFrom`.
244
244
  *
245
- * @param {JsonTableParams} params - Resolved params
246
- * @returns {Object<string, DataTypeDefinition>} The complete data types map
247
- * @throws {Error} When `inheritsFrom` refers to an unknown type
245
+ * @param {JsonTableParams} params - Parametri risolti
246
+ * @returns {Object<string, DataTypeDefinition>} La mappa completa dei data type
247
+ * @throws {Error} Quando `inheritsFrom` si riferisce a un tipo sconosciuto
248
248
  *
249
249
  * @example
250
250
  * const types = buildDataTypes({
251
251
  * ...params,
252
252
  * dataTypes: {
253
- * num: { cellClass: 'text-end fw-bold' }, // overrides only `cellClass` of the built-in `num`
254
- * km: { inheritsFrom: 'num', render: v => `${v} km` } // new type based on `num`
253
+ * num: { cellClass: 'text-end fw-bold' }, // sovrascrive solo `cellClass` del `num` predefinito
254
+ * km: { inheritsFrom: 'num', render: v => `${v} km` } // nuovo tipo basato su `num`
255
255
  * }
256
256
  * });
257
257
  */