Backend: - Enrich machine snapshot with componentLinks/pieceLinks/productLinks - Detect link add/remove in MachineAuditSubscriber onFlush - Add link diff comparison in restore preview - Add link restoration in applyRestore for machines - Add integrity warnings for missing linked entities Frontend (submodule update): - Single save button replacing auto-save-on-blur - Link versioning display in version list and restore modal Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
5.0 KiB
Machine : Bouton Save Unique + Versioning des Liens
Date : 2026-03-26 Statut : Approuvé
Contexte
La page machine utilise actuellement un auto-save au blur pour chaque champ (info, custom fields, constructeurs). Les pages composant/pièce/produit utilisent un bouton unique "Enregistrer les modifications" en bas du formulaire. L'objectif est d'aligner la page machine sur ce pattern.
De plus, les ajouts/suppressions de liens composant/pièce/produit sur une machine ne sont pas tracés dans le versioning. Ils doivent l'être.
Volet 1 : Bouton Save Unique
Comportement cible
- En mode édition, tous les champs (info machine, custom field values, custom field definitions, constructeurs) sont modifiés localement sans appel API.
- Un bouton "Enregistrer les modifications" en bas du formulaire sauvegarde tout d'un coup.
- Un bouton "Annuler" réinitialise l'état local et sort du mode édition.
- Les documents restent en upload/suppression immédiate (inchangé).
- Les ajouts/suppressions de liens composant/pièce/produit restent immédiats via modales (inchangé).
Changements frontend
MachineInfoCard.vue
- Supprimer les
@blur→$emit('blur-field')sur les inputs (nom, référence) - Supprimer le
@changequi émetblur-fieldsur le select site - Supprimer les
@blur→$emit('update-custom-field', field)sur tous les champs custom - Conserver
@input/@update:*/set-custom-field-valuepour la mise à jour de l'état local - Le
MachineCustomFieldDefEditorperd son bouton save propre : l'état est collecté au submit global
machine/[id].vue
- Supprimer le handler
@blur-field - Supprimer le handler
@update-custom-field @update:constructeur-idsmet à jour l'état local sans save- Ajouter le bloc boutons en bas (pattern identique à component/[id]/index.vue) :
- "Annuler" (btn-ghost) →
cancelEdition(): réinitialise depuismachine.value+ sort du mode édition - "Enregistrer les modifications" (btn-primary, disabled si
!canSubmit) →submitEdition()
- "Annuler" (btn-ghost) →
useMachineDetailData.ts
- Exposer
savingref - Exposer
submitEdition():updateMachineInfo()— PATCH machine (nom, ref, site, constructeurs)- Batch save custom field values (tous les
visibleMachineCustomFieldsavec valeur) - Save custom field definitions si modifiées (
fieldDefs.saveDefinitions()) loadMachineData()pour recharger- Sortie du mode édition + toast succès
- Exposer
cancelEdition():initMachineFields()— réinitialise nom, ref, site, constructeurs depuismachine.valuesyncMachineCustomFields()— réinitialise les custom fields- Sort du mode édition
useMachineDetailUpdates.ts
handleMachineConstructeurChangene déclenche plusupdateMachineInfo(), met juste à jour le ref local
useMachineDetailCustomFields.ts
updateMachineCustomFieldn'est plus appelé au blur — sera appelé en batch parsubmitEdition()- Ajouter méthode
saveAllMachineCustomFields()qui itère sur les champs visibles et sauvegarde ceux avec valeur
Validation (canSubmit)
- Machine existe
- Nom non vide
- Pas en cours de sauvegarde (
!saving.value) canEditest true
Volet 2 : Versioning des Liens Machine
Comportement cible
Quand un composant, pièce ou produit est ajouté ou supprimé d'une machine, cela doit :
- Incrémenter la
versionde la Machine - Créer une entrée
AuditLogavec diff et snapshot
Changements backend
MachineAuditSubscriber — enrichir le snapshot
Ajouter au snapshot machine les liens :
'componentLinks' => array_map(fn($link) => [
'id' => $link->getId(),
'composantId' => $link->getComposant()->getId(),
'composantName' => $link->getComposant()->getName(),
], $entity->getComponentLinks()->toArray()),
'pieceLinks' => [...],
'productLinks' => [...],
Nouveau subscriber ou service : MachineLinkAuditService
Écouter les événements Doctrine postPersist et postRemove sur les 3 entités link.
Quand un lien est créé/supprimé :
- Récupérer la Machine parente
- Incrémenter
$machine->incrementVersion() - Créer un
AuditLog:entityType: 'machine'entityId: $machine->getId()action: 'update'diff: { addedComponent: {id, name} }ou{ removedPiece: {id, name} }snapshot:snapshot complet de la machine (avec liens mis à jour)version:nouvelle version
Labels pour le diff (frontend)
Ajouter au historyFieldLabels de la page machine :
addedComponent: 'Composant ajouté',
removedComponent: 'Composant supprimé',
addedPiece: 'Pièce ajoutée',
removedPiece: 'Pièce supprimée',
addedProduct: 'Produit ajouté',
removedProduct: 'Produit supprimé',
Ce qui ne change PAS
- Upload/suppression de documents (immédiat)
- Pattern read/edit toggle dans le header
- L'affichage des sections composants/pièces/produits
- Les modales d'ajout/suppression de liens (restent immédiates)
- Le versioning des autres entités (composant, pièce, produit)