From d04452a5f5c45a6248e4877b24efb3ac84f495e2 Mon Sep 17 00:00:00 2001 From: Robin Lopez Date: Mon, 26 Oct 2026 11:44:08 +0100 Subject: [PATCH] FSHSP-259 fix(forms): sync the model with browser autofill --- CHANGELOG.md | 29 +++++ docs/ROADMAP.md | 32 ++++++ .../src/core/forms/browser-fill.test.tsx | 31 ++++++ .../src/core/forms/browser-fill.ts | 26 +++++ packages/ui-kit-react/src/core/forms/index.ts | 1 + .../forms/ui-autocomplete/ui-autocomplete.mdx | 10 ++ .../ui-autocomplete/ui-autocomplete.test.tsx | 87 +++++++++++++++ .../forms/ui-autocomplete/ui-autocomplete.tsx | 59 ++++++++-- .../src/forms/ui-datepicker/ui-datepicker.mdx | 8 +- .../ui-datepicker/ui-datepicker.test.tsx | 46 ++++++++ .../src/forms/ui-datepicker/ui-datepicker.tsx | 101 ++++++++++------- .../src/forms/ui-input-mask/ui-input-mask.mdx | 3 + .../ui-input-mask/ui-input-mask.test.tsx | 43 ++++++++ .../src/forms/ui-input-mask/ui-input-mask.tsx | 23 +++- .../forms/ui-input-number/ui-input-number.mdx | 4 + .../ui-input-number/ui-input-number.test.tsx | 41 +++++++ .../forms/ui-input-number/ui-input-number.tsx | 27 ++++- .../src/forms/ui-input-otp/ui-input-otp.mdx | 7 +- .../forms/ui-input-otp/ui-input-otp.test.tsx | 64 +++++++++++ .../src/forms/ui-input-otp/ui-input-otp.tsx | 32 ++++-- .../src/forms/ui-input/ui-input.mdx | 104 ++++++++++++++++++ .../src/forms/ui-input/ui-input.test.tsx | 68 ++++++++++++ .../src/forms/ui-input/ui-input.tsx | 14 ++- .../src/forms/ui-textarea/ui-textarea.mdx | 5 + .../forms/ui-textarea/ui-textarea.test.tsx | 20 ++++ .../src/forms/ui-textarea/ui-textarea.tsx | 7 ++ .../src/styles/base/_browser-fill.scss | 15 +++ packages/ui-kit-react/src/styles/index.scss | 1 + 28 files changed, 836 insertions(+), 72 deletions(-) create mode 100644 packages/ui-kit-react/src/core/forms/browser-fill.test.tsx create mode 100644 packages/ui-kit-react/src/core/forms/browser-fill.ts create mode 100644 packages/ui-kit-react/src/styles/base/_browser-fill.scss diff --git a/CHANGELOG.md b/CHANGELOG.md index 23d77aa..d3fed0e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,35 @@ Le format suit [Keep a Changelog](https://keepachangelog.com/fr/1.1.0/), et le p ## [Unreleased] +### Added + +- **`BROWSER_FILL_CLASS`, `announceBrowserFill` et `hasFocus`** dans `@4sh/ui-kit-react/forms` + (FSHSP-259), pour un champ maison : la classe et le gestionnaire `onAnimationStart` font + suivre au champ une valeur que le navigateur préremplit sans aucun événement. Une case sur + mesure de `ui-input-otp` reçoit `onAnimationStart` dans le contexte de `renderCell`. + +### Fixed + +- **Une valeur préremplie par le navigateur est prise en compte sans clic dans le champ** + (FSHSP-259). Quand le navigateur n'émettait aucun événement, la valeur s'affichait sans que + React la connaisse, et le rendu suivant l'écrasait, dans tous les champs. `styles.css` lance + désormais une animation sur `:-webkit-autofill`, qui fait recevoir au champ l'`input` + manquant : `ui-input`, `ui-textarea`, `ui-input-number`, `ui-input-mask`, `ui-input-otp`, + `ui-autocomplete` et `ui-datepicker` appellent `onValueChange` une seule fois, en mode + contrôlé comme non contrôlé. Une valeur écrite sans focus est traitée comme telle : + `ui-input-number` la formate aussitôt, `ui-datepicker` la valide sans attendre la sortie du + champ (et revient à la valeur précédente si ce n'est pas une date), `ui-input-otp` la + répartit sans prendre le focus, `ui-input-mask` ne place pas de curseur, `ui-autocomplete` + appelle `onComplete` sans ouvrir son panneau et, avec `forceSelection`, retient la + suggestion qui porte ce libellé dès qu'elle arrive, même après le flou que Chrome envoie au + champ rempli. Le `focus` que Chrome envoie à chaque + champ qu'il remplit n'ouvre plus le calendrier en `showOnFocus`, ne lance plus la recherche + en `completeOnFocus` et ne focalise plus une case de code. Dans les tests d'une application, + un `input` envoyé sans focus à `ui-datepicker` ou `ui-autocomplete` vaut désormais + remplissage : focaliser le champ pour simuler une frappe. Hors de portée : une valeur que + Chrome préremplit au chargement de la page reste illisible par JavaScript jusqu'à une + interaction. + ## [0.3.0] - 2026-10-23 ### Added diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index 315381b..25c77fa 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -686,6 +686,21 @@ Ne pas les repayer. Chacun est documenté sur place, dans le fichier concerné. frappe directe d'un déclencheur `