@zevra/ui 0.43.1 → 0.44.1
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/DECISIONS.md +32 -0
- package/dist/css-inline.d.ts.map +1 -1
- package/dist/css-inline.js +1 -1
- package/dist/css-inline.js.map +1 -1
- package/dist/data-table.d.ts +29 -3
- package/dist/data-table.d.ts.map +1 -1
- package/dist/data-table.js +58 -40
- package/dist/data-table.js.map +1 -1
- package/dist/grille.d.ts +94 -10
- package/dist/grille.d.ts.map +1 -1
- package/dist/grille.js +189 -79
- package/dist/grille.js.map +1 -1
- package/dist/use-persisted-state.d.ts +3 -1
- package/dist/use-persisted-state.d.ts.map +1 -1
- package/dist/use-persisted-state.js +6 -3
- package/dist/use-persisted-state.js.map +1 -1
- package/package.json +1 -1
- package/react/css-inline.ts +1 -1
- package/react/data-table.tsx +76 -5
- package/react/grille.tsx +458 -167
- package/react/use-persisted-state.ts +6 -4
- package/src/data.css +71 -3
|
@@ -27,9 +27,11 @@ import type { Dispatch, SetStateAction } from 'react'
|
|
|
27
27
|
*
|
|
28
28
|
* Rend `[valeur, setValeur, reinitialiser]` : `reinitialiser` vide la clé et
|
|
29
29
|
* revient à `initial`.
|
|
30
|
+
*
|
|
31
|
+
* Une clé `null` : un état ordinaire, qui ne lit ni n'écrit rien.
|
|
30
32
|
*/
|
|
31
33
|
export function usePersistedState<S>(
|
|
32
|
-
key: string,
|
|
34
|
+
key: string | null,
|
|
33
35
|
initial: S,
|
|
34
36
|
reconcilier?: (lu: unknown, initial: S) => S | undefined,
|
|
35
37
|
): [S, Dispatch<SetStateAction<S>>, () => void] {
|
|
@@ -53,7 +55,7 @@ export function usePersistedState<S>(
|
|
|
53
55
|
useEffect(() => {
|
|
54
56
|
let valeur: S | undefined
|
|
55
57
|
try {
|
|
56
|
-
const brut = window.localStorage.getItem(key)
|
|
58
|
+
const brut = key === null ? null : window.localStorage.getItem(key)
|
|
57
59
|
if (brut != null) {
|
|
58
60
|
const parse: unknown = JSON.parse(brut)
|
|
59
61
|
valeur = reconcilierRef.current
|
|
@@ -72,7 +74,7 @@ export function usePersistedState<S>(
|
|
|
72
74
|
useEffect(() => {
|
|
73
75
|
// Avant la lecture, l'état est `initial` : l'écrire écraserait la vue
|
|
74
76
|
// enregistrée par la vue par défaut, au premier rendu de chaque page.
|
|
75
|
-
if (!lu) return
|
|
77
|
+
if (!lu || key === null) return
|
|
76
78
|
const texte = serialiser(etat)
|
|
77
79
|
if (texte === null || texte === enregistre.current) return
|
|
78
80
|
try {
|
|
@@ -85,7 +87,7 @@ export function usePersistedState<S>(
|
|
|
85
87
|
|
|
86
88
|
const reinitialiser = useCallback(() => {
|
|
87
89
|
try {
|
|
88
|
-
window.localStorage.removeItem(key)
|
|
90
|
+
if (key !== null) window.localStorage.removeItem(key)
|
|
89
91
|
} catch {
|
|
90
92
|
// Rien à vider qu'on puisse atteindre : on revient quand même au défaut.
|
|
91
93
|
}
|
package/src/data.css
CHANGED
|
@@ -1039,8 +1039,8 @@
|
|
|
1039
1039
|
* du cadre pendant que les cellules continuent. --zv-cols-somme et
|
|
1040
1040
|
* --zv-cols-n sont posés par le composant (largeurs choisies par
|
|
1041
1041
|
* l'utilisateur, pas des valeurs de charte). */
|
|
1042
|
-
.zv-table--grille
|
|
1043
|
-
.zv-table--grille
|
|
1042
|
+
.zv-table--grille .zv-table__head,
|
|
1043
|
+
.zv-table--grille .zv-row {
|
|
1044
1044
|
min-width: calc(
|
|
1045
1045
|
var(--zv-cols-somme, 0px) + 2 * var(--zv-grille-pad) +
|
|
1046
1046
|
(var(--zv-cols-n, 1) - 1) * var(--zv-grille-gap)
|
|
@@ -1360,6 +1360,74 @@
|
|
|
1360
1360
|
padding-inline: 8px;
|
|
1361
1361
|
}
|
|
1362
1362
|
|
|
1363
|
+
/* ─── Remplir son parent ────────────────────────────────────────────────
|
|
1364
|
+
* La grille prend la hauteur d'une colonne flex bornée : seules les lignes
|
|
1365
|
+
* défilent. Les intitulés et les filtres sont groupés dans un bloc COLLANT
|
|
1366
|
+
* (.zv-table__haut) : collées une à une, les deux rangées se poseraient au
|
|
1367
|
+
* même endroit et la seconde recouvrirait la première. */
|
|
1368
|
+
.zv-grille--remplir {
|
|
1369
|
+
display: flex;
|
|
1370
|
+
flex: 1;
|
|
1371
|
+
flex-direction: column;
|
|
1372
|
+
min-height: 0;
|
|
1373
|
+
}
|
|
1374
|
+
|
|
1375
|
+
.zv-table--remplir {
|
|
1376
|
+
flex: 1;
|
|
1377
|
+
min-height: 0;
|
|
1378
|
+
overflow: auto;
|
|
1379
|
+
}
|
|
1380
|
+
|
|
1381
|
+
.zv-table__haut {
|
|
1382
|
+
position: sticky;
|
|
1383
|
+
top: 0;
|
|
1384
|
+
z-index: 2;
|
|
1385
|
+
}
|
|
1386
|
+
|
|
1387
|
+
/* ─── Densité ───────────────────────────────────────────────────────────
|
|
1388
|
+
* Un tableau secondaire, posé dans une fiche : les rangées se resserrent,
|
|
1389
|
+
* rien d'autre ne change. Dérivé (6 px : la rangée de filtres). */
|
|
1390
|
+
.zv-table--dense .zv-row,
|
|
1391
|
+
.zv-table--dense .zv-table__head {
|
|
1392
|
+
padding-block: 6px;
|
|
1393
|
+
}
|
|
1394
|
+
|
|
1395
|
+
/* ─── Rangées qui ne sont pas des lignes ────────────────────────────────
|
|
1396
|
+
* Un intitulé de groupe, une ligne de saisie, un pied de totaux : sur le
|
|
1397
|
+
* fond du survol, et inertes (ni pointeur ni survol). */
|
|
1398
|
+
.zv-row--groupe,
|
|
1399
|
+
.zv-row--saisie,
|
|
1400
|
+
.zv-row--pied {
|
|
1401
|
+
background: var(--panel);
|
|
1402
|
+
cursor: default;
|
|
1403
|
+
}
|
|
1404
|
+
|
|
1405
|
+
.zv-row--groupe:hover,
|
|
1406
|
+
.zv-row--saisie:hover,
|
|
1407
|
+
.zv-row--pied:hover {
|
|
1408
|
+
background: var(--panel);
|
|
1409
|
+
}
|
|
1410
|
+
|
|
1411
|
+
.zv-row--groupe {
|
|
1412
|
+
display: block;
|
|
1413
|
+
padding-block: 6px;
|
|
1414
|
+
}
|
|
1415
|
+
|
|
1416
|
+
.zv-row--pied {
|
|
1417
|
+
font-weight: 600;
|
|
1418
|
+
}
|
|
1419
|
+
|
|
1420
|
+
/* Des champs à la hauteur d'une ligne, pas d'un formulaire. */
|
|
1421
|
+
.zv-row--saisie .zv-input {
|
|
1422
|
+
padding-block: 5px;
|
|
1423
|
+
}
|
|
1424
|
+
|
|
1425
|
+
/* Le nombre de lignes d'une valeur, au bout de son option. */
|
|
1426
|
+
.zv-grille__compte {
|
|
1427
|
+
margin-left: auto;
|
|
1428
|
+
flex: none;
|
|
1429
|
+
}
|
|
1430
|
+
|
|
1363
1431
|
/* Le pied : compte à gauche, taille de page et sens à droite. */
|
|
1364
1432
|
.zv-grille__pied {
|
|
1365
1433
|
display: flex;
|
|
@@ -1370,7 +1438,7 @@
|
|
|
1370
1438
|
@media (max-width: 767px) {
|
|
1371
1439
|
/* En cartes, l'épinglage, les poignées et la largeur minimale n'ont plus
|
|
1372
1440
|
* de sens : la carte prend la largeur de l'écran. */
|
|
1373
|
-
.zv-table--grille
|
|
1441
|
+
.zv-table--grille .zv-row {
|
|
1374
1442
|
min-width: 0;
|
|
1375
1443
|
}
|
|
1376
1444
|
|