@massimo-cassandro/minimo 1.41.5 → 1.41.7

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.
@@ -45,6 +45,10 @@
45
45
  {
46
46
  "filePath": "node_modules/@massimo-cassandro/minimo/src/css",
47
47
  "group": "Default"
48
+ },
49
+ {
50
+ "filePath": "node_modules/@massimo-cassandro/minimo/src/web-components/json-table/jt-docs.md",
51
+ "group": "Default"
48
52
  }
49
53
  ],
50
54
 
@@ -23,7 +23,7 @@
23
23
  "symfony server": "symfony serve --port=[[port8000]] --listen-ip=0.0.0.0 # http://192.168.1.135:[[port8000]] # -d (deamon): rimane aperto anche dopo la chiusura del terminale, terminare con `symfony server:stop`",
24
24
  "launchChrome": "open -n -a 'Google Chrome' --args --profile-directory='Profile 3' # mbn: 1 / mg2: 3",
25
25
  "webpack PROD": "npm run 'UPD-version' && NODE_ENV=production webpack --config ./webpack.config.mjs --stats minimal",
26
- "UPD-version": "npx update-version --no-log-v0 --log-file=./changelog.md # --log-patch --pkg=alt/path/to/package.json",
26
+ "UPD-version": "npx update-version --no-log-v0 --log-file=./changelog.md # --log-patch --pkg=alt/path/to/package.json --default-patch-log=__log_text__",
27
27
  "email sass": "npx sass ./app/email:./templates/email/css --no-source-map --style=compressed --watch",
28
28
  "postcss email": "postcss ./app/email/[!_]*.css --dir ./templates/email/css --no-map --verbose --config ./app/email --watch",
29
29
  "eslint-check": "npx eslint app/",
@@ -161,6 +161,9 @@ const { CustomPropsPurgeCssPlugin } = runCustomPropsPlugin
161
161
  // - `enforce: true` garantisce che `shared.js` e `shared.css` siano sempre
162
162
  // generati (senza, splitChunks non crea il chunk se i moduli sono sotto la
163
163
  // soglia `minSize`, e il link nel template punterebbe a un file inesistente)
164
+ // - i moduli di `unsplash-page` (js e css module) e la sua dipendenza `blurhash`
165
+ // sono esclusi dal chunk condiviso (`excluded_paths` in `shared_chunk_paths`):
166
+ // restano nel js/css della entry che li importa
164
167
  // - i template (twig/altro) devono linkare (preload + link) sia `shared.css` che il
165
168
  // css della propria entry, con `shared.css` PRIMA del css della entry per
166
169
  // rispettare l'ordine della cascata (vedi _sf/templates/_main-tpl.html.twig)
@@ -181,7 +184,18 @@ const shared_chunk_paths = (module) => {
181
184
  'app/src/components',
182
185
  ].map(p => `${sep}${p.replace(/\//g, sep)}${sep}`).join('|'));
183
186
 
184
- return pathsRegexp.test(module.nameForCondition?.() ?? '');
187
+ // path dei moduli esclusi dal chunk `shared` (restano nella entry che li importa)
188
+ const excluded_paths = [
189
+ 'minimo/src/components/unsplash-page',
190
+ 'node_modules/blurhash', // peer dep usata solo da unsplash-page
191
+ ];
192
+ const excludedRegexp = new RegExp(
193
+ excluded_paths.map(p => `${sep}${p.replace(/\//g, sep)}${sep}`).join('|')
194
+ );
195
+
196
+ const modulePath = module.nameForCondition?.() ?? '';
197
+
198
+ return !excludedRegexp.test(modulePath) && pathsRegexp.test(modulePath);
185
199
  };
186
200
 
187
201
 
@@ -10,6 +10,18 @@ Le versioni precedenti sono conservate in `archived/webpack-config-v2/` del repo
10
10
 
11
11
  ## Fix e upg da verificare e applicare a tutte le versioni
12
12
  * WebpackManifestPlugin: impostare `removeKeyHash: /\?.*$/, // /([a-f0-9]{32}\.?)/gi, // /(\?as_asset)$/,`, sostituendo eventuali impostazione `removeKeyHash: true` se presente
13
+ * cacheGroup `shared` (solo con `useSharedChunk: true`): escludere `unsplash-page` e `blurhash` dal chunk condiviso, in modo che js e css restino nella entry che li importa. In `webpack.config.mjs`, nella funzione `shared_chunk_paths`, prima del `return` aggiungere:
14
+ ```js
15
+ const excluded_paths = [
16
+ 'minimo/src/components/unsplash-page',
17
+ 'node_modules/blurhash', // peer dep usata solo da unsplash-page
18
+ ];
19
+ const excludedRegexp = new RegExp(
20
+ excluded_paths.map(p => `${sep}${p.replace(/\//g, sep)}${sep}`).join('|')
21
+ );
22
+ const modulePath = module.nameForCondition?.() ?? '';
23
+ ```
24
+ e sostituire il `return` con `return !excludedRegexp.test(modulePath) && pathsRegexp.test(modulePath);`. Aggiungere anche al commento sopra il cacheGroup la nota sull'esclusione.
13
25
 
14
26
 
15
27
  ## Da v2 a v3
@@ -17,4 +17,5 @@ Opzioni:
17
17
  * `--pkg`: Percorso del file `package.json` relativo alla directory corrente (default: `./package.json`)
18
18
  * `--log-file`: Percorso del file di log relativo alla directory corrente (default: `./changelog.md`). Se il nome del file termina con `.txt`, si assume il formato di log della versione precedente di `update-version`, in cui ogni riga ha la forma `timestamp | version | description`
19
19
  * `--log-patch`: Se presente, vengono registrate nel log anche le modifiche di tipo patch.
20
+ * `--default-patch-log="testo"`: Testo di default usato per il log delle patch (default: `Fix / Upd`).
20
21
  * `--no-log-v0`: Se `true` (default), il log non viene scritto quando la versione major è `0`, tranne per la voce iniziale creata alla prima inizializzazione del file changelog. Passare `--no-log-v0` per abilitarlo esplicitamente, oppure `--no-log-v0=false` per disabilitarlo da riga di comando.
@@ -79,7 +79,7 @@ async function run() {
79
79
  (params.logRow.descr
80
80
  ? ' - ' + params.logRow.descr
81
81
  : params.updateMode === 'patch' && !(params.noLogV0 && params.semverArray[0] === 0)
82
- ? ' - Fix / Dependencies upd'
82
+ ? ` - ${params.defaultPatchLog}`
83
83
  : '')
84
84
  );
85
85
 
@@ -39,7 +39,7 @@ export async function chooser() {
39
39
  default: answer === 'init'
40
40
  ? 'Setup'
41
41
  : answer === 'patch'
42
- ? 'Fix / Dependencies upd'
42
+ ? params.defaultPatchLog
43
43
  : ''
44
44
  });
45
45
  params.logRow.descr = descr.trim() || null;
@@ -24,6 +24,13 @@ export function getCliParams() {
24
24
  if (!params.toLog.includes('patch')) params.toLog.push('patch');
25
25
  }
26
26
 
27
+ // testo default per i log patch
28
+ if (arg.startsWith('--default-patch-log=')) {
29
+ // slice, non split: il testo può contenere a sua volta il carattere '='
30
+ const value = arg.slice('--default-patch-log='.length).trim();
31
+ if (value) params.defaultPatchLog = value;
32
+ }
33
+
27
34
  // Disabilita il log per major version 0
28
35
  if (arg === '--no-log-v0') {
29
36
  params.noLogV0 = true;
@@ -1,16 +1,29 @@
1
1
  export const params = {
2
2
  // Valori di default
3
3
 
4
+ // percorso package.json
5
+ // corrisponde al parametro cli `--pkg`
4
6
  packageJsonFile: './package.json',
7
+
8
+ // percorso log file
9
+ // corrisponde al parametro cli `--log-file`
5
10
  logFile: './changelog.md',
11
+
6
12
  markdownLog: true,
7
13
  toLog: ['major', 'minor'], // opzionale 'patch'
8
14
  locale: 'it-IT',
9
15
 
10
16
  debug: false, // solo sviluppo, non aggiorna nulla ma mostra l'output finale
11
17
 
12
- addLog: true, // modificato in base alla scelta del tipo di aggironamento e del valore di toLog
13
- noLogV0: true, // se true e la major version è 0 il log non viene registrato (ad esclusione dell'inizializzazione del file)
18
+ addLog: true, // modificato in base alla scelta del tipo di aggiornamento e del valore di toLog
19
+
20
+ // se true e la major version è 0 il log non viene registrato (ad esclusione dell'inizializzazione del file)
21
+ // corrisponde al parametro cli `--no-log-v0`
22
+ noLogV0: true,
23
+
24
+ // testo di default per il log delle patch
25
+ // corrisponde al parametro cli `--default-patch-log`
26
+ defaultPatchLog: 'Fix / Upd',
14
27
 
15
28
  // preRealeaseTags: ['alpha', 'beta', 'rc'],
16
29
  logRow: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@massimo-cassandro/minimo",
3
- "version": "1.41.5",
3
+ "version": "1.41.7",
4
4
  "description": "Light css framework & utilities",
5
5
  "type": "module",
6
6
  "main": "./index.js",
@@ -0,0 +1,124 @@
1
+ # Parametri
2
+
3
+ [Torna alla pagina iniziale](../jt-docs.md)
4
+
5
+ Tutti i parametri sono impostabili sia da attributo HTML che come oggetto in `init({...})`. I valori di tipo funzione solo da `init()`.
6
+
7
+ | Parametro | Tipo / default | Descrizione |
8
+ |---|---|---|
9
+ | `debug` | boolean (`false`) | Log in console di parametri, colonne, dati, stato ed elementi generati |
10
+ | `jsonUrl` | string (`null`) | URL del JSON da caricare. Ignorato se `data` è presente |
11
+ | `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 |
12
+ | `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 |
13
+ | `totRecField` | string (`'totRec'`) | Chiave del JSON con il totale dei record (numerico); se assente o non numerico il totale è la lunghezza dell'array |
14
+ | `filteredRecField` | string (`'filteredRec'`) | Solo server-side: chiave del JSON con il numero di record che soddisfano la ricerca corrente; se assente vale `totRecField` |
15
+ | `data` | Array<Object> (`null`) | Righe inline; prevale su `jsonUrl`. Da attributo va passato come stringa JSON ed è sempre inteso come array delle righe (`jsonDataField` ignorato) |
16
+ | `cols` | ColDefinition[] | **OBBLIGATORIO**: definizione delle colonne (vedi sotto). Se assente o vuoto viene segnalato un errore in console e la tabella non viene generata |
17
+ | `dataTypes` | Object (`{}`) | Tipi di dato personalizzati, uniti a quelli predefiniti (vedi sotto) |
18
+ | `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") |
19
+ | `search` | boolean (`true`) | Genera l'input di ricerca |
20
+ | `searchDebounce` | number (`300`) | Millisecondi di attesa dopo l'ultimo tasto prima di eseguire la ricerca |
21
+ | `perPage` | number (`25`) | Righe per pagina; `0` = nessuna paginazione (tutte le righe, nessuna navigazione) |
22
+ | `paginationDelta` | number (`2`) | Pulsanti pagina mostrati a ciascun lato della pagina corrente |
23
+ | `serverSide` | boolean (`false`) | Paginazione, ordinamento e ricerca delegati al server (vedi "Modalità server-side"). Richiede `jsonUrl` |
24
+ | `serverParams` | Object | Nomi dei parametri di query string in modalità server-side, uniti ai default (vedi sotto) |
25
+ | `initialSort` | { key, dir } o null (`null`) | Ordinamento applicato al caricamento, es. `{ key: 'name', dir: 'asc' }` |
26
+ | `tfoot` | boolean (`false`) | Genera il tfoot (vedi `tfootRender` delle colonne). Non disponibile in modalità server-side |
27
+ | `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 |
28
+ | `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` |
29
+ | `template` | Array (`[{ slot: 'infoSection' }, { slot: 'table' }]`) | Layout del contenitore principale (vedi "Template") |
30
+ | `locale` | string (`'it-IT'`) | Locale per numeri, date e confronto stringhe nell'ordinamento |
31
+ | `currency` | string (`'EUR'`) | Codice ISO 4217 usato dal tipo `currency` |
32
+ | `datesLocaleOpts` | Intl.DateTimeFormatOptions (`{ year: 'numeric', month: 'short', day: 'numeric' }`) | Parte data dei tipi date/datetime |
33
+ | `timesLocaleOpts` | Intl.DateTimeFormatOptions (`{ hour12: false, hour: '2-digit', minute: '2-digit' }`) | Parte ora del tipo datetime |
34
+ | `numbersLocaleOpts` | Intl.NumberFormatOptions (`{ maximumFractionDigits: 2 }`) | Tipo `num` |
35
+ | `currPercLocaleOpts` | Intl.NumberFormatOptions (`{ minimumFractionDigits: 2, maximumFractionDigits: 2 }`) | Tipi currency/euro/perc/percDecimal |
36
+ | `renderNullAs` | string o null (`'—'`) | Contenuto per i valori null/undefined |
37
+ | `renderZeroAs` | string o null (`null`) | Se non null, contenuto per i valori numerici pari a zero |
38
+ | `renderNaNAs` | string o null (`'—'`) | Contenuto per i valori non numerici nei tipi numerici |
39
+ | `boolTrueIcon` | icona, vedi nota (icona `check-bold` di minimo (Phosphor)) | Icona per i valori `true` (tipo bool) |
40
+ | `boolFalseIcon` | icona, vedi nota (icona `x-bold`) | Icona per i valori `false` |
41
+ | `sortAscArrowIcon` | icona, vedi nota (icona `arrow-up`) | Icona del pulsante di ordinamento, ordinamento asc attivo |
42
+ | `sortDescArrowIcon` | icona, vedi nota (icona `arrow-down`) | Icona del pulsante di ordinamento, ordinamento desc attivo |
43
+ | `sortNoneArrowIcon` | icona, vedi nota (icona `arrows-down-up`) | Icona del pulsante di ordinamento, nessun ordinamento |
44
+ | `paginationPrevIcon` | icona, vedi nota (icona `caret-left`) | Icona del pulsante "pagina precedente" |
45
+ | `paginationNextIcon` | icona, vedi nota (icona `caret-right`) | Icona del pulsante "pagina successiva" |
46
+ | `trCallback` | (tr, row, params) => void (`null`) | Callback invocata dopo il rendering di ogni riga del body |
47
+ | `tableId` | string (`null`) | Id del tag `<table>` |
48
+ | `classes` | Object | Classi consumer (vedi sotto), unite ai default |
49
+ | `labels` | Object | Testi (vedi sotto), uniti ai default |
50
+
51
+ **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.
52
+
53
+ ## `classes`
54
+
55
+ Nomi delle classi assegnate agli elementi generati. Le classi interne di layout (CSS module)
56
+ vengono **sempre** applicate in aggiunta a queste; ogni valore sostituisce interamente il
57
+ default della stessa chiave.
58
+
59
+ ```javascript
60
+ classes: {
61
+ wrapper: null, // contenitore principale (<section>: info + tabella)
62
+ infoOuter: null, // contenitore esterno della sezione info
63
+ info: null, // sezione info (testo + ricerca)
64
+ resultInfo: null, // contenitore del testo info
65
+ search: null, // wrapper dell'input di ricerca
66
+ searchInput: 'form-control form-control-sm', // input di ricerca
67
+ tableWrapper: 'table-responsive', // div che racchiude la tabella
68
+ table: 'table table-bordered', // tag <table>
69
+ tableFooter: null, // barra sotto la tabella (caption + paginazione)
70
+ caption: null, // contenitore della caption
71
+ pagination: null, // <nav> della paginazione
72
+ paginationBtn: 'btn-reset', // pulsanti della paginazione
73
+ sortBtn: 'btn-reset', // pulsanti di ordinamento nei <th>
74
+ empty: null, // cella unica mostrata in assenza di righe
75
+ textStart: null, // allineamento inline-start (le celle minimo lo sono già)
76
+ textCenter: 'text-center', // allineamento al centro
77
+ textEnd: 'text-end', // allineamento inline-end
78
+ nowrap: 'text-nowrap', // no-wrap
79
+ numeric: 'text-numeric', // cifre tabulari (tipi numerici)
80
+ boolCell: null, // classe aggiuntiva per tutte le celle di tipo bool
81
+ boolTrue: null, // classe aggiuntiva per le celle bool con valore true
82
+ boolFalse: null // classe aggiuntiva per le celle bool con valore false
83
+ }
84
+ ```
85
+
86
+ Le classi di allineamento (`textEnd`, `textCenter`, `nowrap`, `numeric`) sono quelle usate dai
87
+ tipi di dato predefiniti: modificandole si cambiano le classi di tutte le colonne di quel tipo.
88
+
89
+ ## `labels`
90
+
91
+ ```javascript
92
+ labels: {
93
+ loading: 'Caricamento dati…', // segnaposto di caricamento (visually hidden)
94
+ searchPlaceholder: 'Cerca...', // placeholder dell'input di ricerca
95
+ searchTitle: 'Cerca nella tabella', // attributo title dell'input
96
+ searchAriaLabel: 'Filtra risultati', // aria-label dell'input
97
+ info: 'Stai visualizzando le righe da {start} a {end}, su un totale di {filteredRec} record trovati',
98
+ // template del testo info (vedi `infoText`)
99
+ noRows: 'Nessun record trovato', // testo info e cella unica con set di dati vuoto
100
+ noResults: 'Nessun risultato per la ricerca', // idem, con ricerca senza risultati
101
+ sortAsc: 'Ordina questa colonna in senso ascendente (A → Z)', // title/aria-label del
102
+ sortDesc: 'Ordina questa colonna in senso discendente (Z → A)', // pulsante di ordinamento:
103
+ sortNone: 'Rimuovi l’ordinamento a questa colonna', // descrivono l'azione del
104
+ // prossimo click
105
+ paginationAriaLabel: 'Navigazione pagine', // aria-label del <nav>
106
+ prevPage: 'Pagina precedente', // title/aria-label del pulsante precedente
107
+ nextPage: 'Pagina successiva', // idem, successivo
108
+ pageTitle: 'Vai a pagina {page}', // idem, pulsanti pagina
109
+ currentPage: 'Pagina {page}, corrente' // idem, pagina corrente
110
+ }
111
+ ```
112
+
113
+ I segnaposto di `labels.info` / `infoText`:
114
+
115
+ | Segnaposto | Valore |
116
+ |---|---|
117
+ | `{start}` | indice (da 1) del primo record della pagina corrente, nel set filtrato |
118
+ | `{end}` | indice dell'ultimo record della pagina corrente |
119
+ | `{totRec}` | totale dei record non filtrati (dal JSON, vedi `totRecField`, o lunghezza dei dati) |
120
+ | `{filteredRec}` | totale dei record dopo il filtro |
121
+ | `{page}` | pagina corrente |
122
+ | `{totPages}` | numero di pagine |
123
+
124
+ I numeri vengono formattati secondo `locale`.