feat(custom-fields) : autocomplete des noms + corrections formule de référence auto #3

Merged
matthieu merged 12 commits from feat/custom-field-name-autocomplete into develop 2026-05-11 14:25:15 +00:00
Owner
Numéro du ticket Titre du ticket

Description de la PR

Cette PR regroupe plusieurs améliorations autour des champs personnalisés et de la référence auto.

Autocomplete des noms de champs perso (machines)

  • Nouvel endpoint GET /api/custom-fields/names qui renvoie la liste distincte des noms déjà utilisés (avec compteur d'usage et flag lastUsed).
  • Composable useCustomFieldNameSuggestions avec cache 5 min, invalidation après save.
  • Composant CustomFieldNameInput (wrapper autour de SearchSelect) avec suggestions live + saisie libre (prop creatable).
  • Intégration dans MachineCustomFieldDefEditor.

Référence auto — propagation du renommage de champ

  • Quand un CustomField est renommé via SkeletonStructureService, met aussi à jour la referenceFormula et requiredFieldsForReference du ModelType parent ({oldName}{newName}).
  • Évite que la formule pointe vers un placeholder devenu inexistant après rename.

Référence auto — support des caractères accentués

  • La regex \{(\w+)\} ne capturait pas les caractères accentués (ex. {Diamètre} avec è), le placeholder restait littéral dans la référence générée.
  • Remplacée par \{([^}]+)\} avec flag /u (PHP) et /gu (JS) dans :
    • ReferenceAutoGenerator (backend)
    • ReferenceFormulaBuilder (preview frontend)
    • ModelTypeForm (extraction des required fields)

Refresh après save ModelType

  • Sur les pages d'édition de catégorie composant et pièce, ajout d'un loadCategory() après updateModelType + syncExecute pour que la formule mise à jour côté BE soit reflétée dans le form sans rechargement manuel.

Modification du .env

Aucune.

Check list

  • Pas de régression
  • TU/TI/TF rédigée (ReferenceAutoGeneratorTest, SkeletonStructureServiceTest)
  • TU/TI/TF OK (353 tests, 880 assertions, 0 échec)
  • CHANGELOG modifié
| Numéro du ticket | Titre du ticket | |------------------|-----------------| | | | ## Description de la PR Cette PR regroupe plusieurs améliorations autour des champs personnalisés et de la référence auto. ### Autocomplete des noms de champs perso (machines) - Nouvel endpoint `GET /api/custom-fields/names` qui renvoie la liste distincte des noms déjà utilisés (avec compteur d'usage et flag `lastUsed`). - Composable `useCustomFieldNameSuggestions` avec cache 5 min, invalidation après save. - Composant `CustomFieldNameInput` (wrapper autour de `SearchSelect`) avec suggestions live + saisie libre (prop `creatable`). - Intégration dans `MachineCustomFieldDefEditor`. ### Référence auto — propagation du renommage de champ - Quand un `CustomField` est renommé via `SkeletonStructureService`, met aussi à jour la `referenceFormula` et `requiredFieldsForReference` du `ModelType` parent (`{oldName}` → `{newName}`). - Évite que la formule pointe vers un placeholder devenu inexistant après rename. ### Référence auto — support des caractères accentués - La regex `\{(\w+)\}` ne capturait pas les caractères accentués (ex. `{Diamètre}` avec `è`), le placeholder restait littéral dans la référence générée. - Remplacée par `\{([^}]+)\}` avec flag `/u` (PHP) et `/gu` (JS) dans : - `ReferenceAutoGenerator` (backend) - `ReferenceFormulaBuilder` (preview frontend) - `ModelTypeForm` (extraction des required fields) ### Refresh après save ModelType - Sur les pages d'édition de catégorie composant et pièce, ajout d'un `loadCategory()` après `updateModelType` + `syncExecute` pour que la formule mise à jour côté BE soit reflétée dans le form sans rechargement manuel. ## Modification du .env Aucune. ## Check list - [x] Pas de régression - [x] TU/TI/TF rédigée (`ReferenceAutoGeneratorTest`, `SkeletonStructureServiceTest`) - [x] TU/TI/TF OK (353 tests, 880 assertions, 0 échec) - [ ] CHANGELOG modifié
matthieu added 9 commits 2026-05-11 14:13:56 +00:00
Spec validee : endpoint backend qui agrege les noms existants (table
custom_fields + JSON dans skeleton requirements), composant
CustomFieldNameInput qui wrap SearchSelect en mode creatable, cache
module-level partage entre toutes les instances, invalidation apres save.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
L'investigation initiale supposait des customFields JSON dans les
skeleton_*_requirements ; en realite SkeletonStructureService traduit
les customFields du payload ModelType en entites CustomField stockees
dans la table custom_fields. Le SQL est donc un simple SELECT DISTINCT.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Retourne la liste plate des noms de champs perso distincts (table
custom_fields), pour alimenter une autocompletion cote frontend.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
En mode creatable=true, le composant emit le texte tape en temps reel
et ne reset plus au blur. Une ligne 'Creer XYZ' apparait quand le texte
ne matche aucune option. Mode strict (defaut) inchange. Le composant
emit aussi 'focus' pour permettre au parent de charger les donnees au
premier focus.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Cache module-level partage entre toutes les instances. Lazy load au
premier appel a load(). invalidate() permet de forcer un refresh apres
creation/modification d'un champ perso.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Encapsule SearchSelect en mode creatable, branche useCustomFieldName-
Suggestions, charge la liste au focus. Permet de remplacer un simple
<input v-model='field.name'> par <CustomFieldNameInput v-model='field.name'>
dans les editeurs de champs perso.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Apres chaque save reussi de champs perso (machine via
useMachineCustomFieldDefs, ModelType via useEntityTypes), on invalide
le cache useCustomFieldNameSuggestions pour que les noms nouvellement
crees apparaissent dans les futures autocomplete.

Note : le plan mentionnait ModelTypeForm.vue, mais le save reel se
fait dans useEntityTypes (le composant ne fait qu'emit 'submit').

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
useApi() prepend deja apiBaseUrl (= /api), donc l'appel doit etre
/custom-fields/names et non /api/custom-fields/names (sinon 404 sur
/api/api/custom-fields/names).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
matthieu added 3 commits 2026-05-11 14:23:06 +00:00
La regex \w+ ne capturait pas les caracteres accentues (ex. {Diametre}
avec 'è'), le placeholder restait litteral dans la reference auto.
Remplace par [^}]+ avec le flag u/gu cote PHP et JS pour matcher
n'importe quel caractere entre les accolades.
Sur les pages d'edition de categorie composant/piece, ajoute un
loadCategory() apres updateModelType + syncExecute pour que la formule
mise a jour par propagateCustomFieldRename soit refletee dans le form
sans avoir a recharger la page.
matthieu changed title from [#NUMERO_TICKET] TITRE TICKET to feat(custom-fields) : autocomplete des noms + corrections formule de référence auto 2026-05-11 14:23:46 +00:00
matthieu merged commit 1e2a1dae62 into develop 2026-05-11 14:25:15 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: MALIO-DEV/Inventory#3