From be3d88ed45c53ab007b176ac4cfe04f20643f767 Mon Sep 17 00:00:00 2001 From: tristan Date: Fri, 19 Jun 2026 13:04:11 +0000 Subject: [PATCH] =?UTF-8?q?fix(date)=20:=20borne=20la=20saisie=20clavier?= =?UTF-8?q?=20pour=20emp=C3=AAcher=20les=20dates=20absurdes=20(99/99/9999)?= =?UTF-8?q?=20(#79)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Problème Sur la famille Date editable, le masque maska n'imposait que la *forme* (`##/##/####`). Une valeur structurellement absurde comme `99/99/9999` était donc **saisissable**, puis rejetée *a posteriori* par la validation. Le métier veut que ce soit **impossible à taper**. ## Solution (masque borné + validation en filet) - `composables/maskTemplate.ts` — `buildBoundedMask(template)` : borne le **premier chiffre de chaque champ** (jour `0-3`, mois `0-1`, heure `0-2`, minute `0-5`). Distingue le mois des minutes (même lettre `M`) selon la présence d'heures dans le gabarit, pour ne pas brider la saisie des minutes du DateTime. - `internal/CalendarField.vue` — branche le builder dans `maskaOptions` (remplace le `replace(/[A-Za-z]/g, '#')`). Les impossibilités plus fines (`31/02`, 29/02 non bissextile, hors `min`/`max`) restent captées par la **validation** (`invalidMessage` + `update:valid=false`). ## Tests - `maskTemplate.test.ts` (5) — bornes par champ, structure du masque, non-confusion mois/minutes. - `Date.test.ts` — test `invalidMessage` adapté (`32/13/2026`, typable→invalide) + garde de non-régression : `99/99/9999` ne s'inscrit jamais et n'émet aucune date. - Suite complète : **1004/1004 verte** (DateTime 36 incluse → saisie d'heure intacte). Doc : `COMPONENTS.md` (MalioDate) + `CHANGELOG.md` (Fixed) à jour. Reviewed-on: https://gitea.malio.fr/MALIO-DEV/malio-layer-ui/pulls/79 Co-authored-by: tristan Co-committed-by: tristan --- .../pages/composant/divers/disabled.vue | 294 ++++++++++++++++++ .playground/pages/composant/tab/tabList.vue | 90 +++++- .playground/playground.nav.ts | 1 + CHANGELOG.md | 6 + COMPONENTS.md | 7 +- app/components/malio/date/Date.test.ts | 79 ++++- app/components/malio/date/DateTime.test.ts | 34 +- .../date/composables/maskTemplate.test.ts | 44 +++ .../malio/date/composables/maskTemplate.ts | 91 ++++++ .../malio/date/internal/CalendarField.vue | 32 +- .../malio/input/InputAutocomplete.test.ts | 6 + .../malio/input/InputAutocomplete.vue | 2 +- app/components/malio/input/InputEmail.test.ts | 12 +- app/components/malio/input/InputEmail.vue | 3 +- app/components/malio/input/InputNumber.vue | 2 +- .../malio/input/InputPassword.test.ts | 6 + app/components/malio/input/InputPassword.vue | 2 +- app/components/malio/input/InputPhone.test.ts | 12 +- app/components/malio/input/InputPhone.vue | 3 +- app/components/malio/select/Select.test.ts | 13 +- app/components/malio/select/Select.vue | 21 +- .../malio/select/SelectCheckbox.test.ts | 15 +- .../malio/select/SelectCheckbox.vue | 24 +- app/components/malio/sidebar/Sidebar.test.ts | 25 +- app/components/malio/sidebar/Sidebar.vue | 7 +- app/components/malio/tab/TabList.test.ts | 22 +- app/components/malio/tab/TabList.vue | 98 +++++- app/components/malio/tab/tabFit.test.ts | 43 +++ app/components/malio/tab/tabFit.ts | 49 +++ app/components/malio/time/TimePicker.test.ts | 8 + app/components/malio/time/TimePicker.vue | 13 +- 31 files changed, 939 insertions(+), 125 deletions(-) create mode 100644 .playground/pages/composant/divers/disabled.vue create mode 100644 app/components/malio/date/composables/maskTemplate.test.ts create mode 100644 app/components/malio/date/composables/maskTemplate.ts create mode 100644 app/components/malio/tab/tabFit.test.ts create mode 100644 app/components/malio/tab/tabFit.ts diff --git a/.playground/pages/composant/divers/disabled.vue b/.playground/pages/composant/divers/disabled.vue new file mode 100644 index 0000000..47c2896 --- /dev/null +++ b/.playground/pages/composant/divers/disabled.vue @@ -0,0 +1,294 @@ + + + diff --git a/.playground/pages/composant/tab/tabList.vue b/.playground/pages/composant/tab/tabList.vue index ae19ca7..9ecd87e 100644 --- a/.playground/pages/composant/tab/tabList.vue +++ b/.playground/pages/composant/tab/tabList.vue @@ -1,5 +1,65 @@