# Système d'Édition Inline avec Verrouillage ## Vue d'ensemble Ce système permet l'édition directe des données dans les listes avec un mécanisme de verrouillage pour éviter les modifications concurrentes. ## Fonctionnalités ### ✅ Édition Inline - **Clic pour éditer** : Cliquez sur une cellule éditables pour la modifier - **Sauvegarde automatique** : Les modifications sont sauvegardées après 2 secondes d'inactivité - **Validation en temps réel** : Vérification des données avant sauvegarde - **Raccourcis clavier** : - `Entrée` : Sauvegarder - `Échap` : Annuler ### ✅ Système de Verrouillage - **Verrous automatiques** : Acquisition automatique lors de l'édition - **Expiration** : Les verrous expirent après 30 minutes - **Prolongation** : Les verrous sont automatiquement prolongés - **Protection concurrente** : Empêche les modifications simultanées ### ✅ Interface Utilisateur - **Indicateurs visuels** : Cellules verrouillées avec icône 🔒 - **Messages d'état** : Notifications de succès/erreur - **Styles adaptatifs** : Couleurs différentes selon l'état ## Architecture ### Entités - **Lock** : Gestion des verrous avec expiration - **Membre** : Entité principale avec édition inline ### Services - **LockService** : Gestion des verrous (création, suppression, vérification) - **MembreApiController** : API REST pour l'édition inline ### JavaScript - **InlineEditing** : Classe principale pour l'édition inline - **Gestion des verrous** : Acquisition, prolongation, libération - **Interface utilisateur** : Création d'inputs, validation, sauvegarde ## Utilisation ### 1. Édition d'un Membre ```javascript // Clic sur une cellule éditables // → Acquisition automatique du verrou // → Création d'un input // → Sauvegarde automatique après 2s ``` ### 2. Gestion des Verrous ```bash # Nettoyer les verrous expirés php bin/console app:cleanup-locks # Voir les statistiques /lock/stats ``` ### 3. API Endpoints ``` POST /api/membre/{id}/lock # Acquérir un verrou POST /api/membre/{id}/unlock # Libérer un verrou POST /api/membre/{id}/extend-lock # Prolonger un verrou POST /api/membre/{id}/update-field # Mettre à jour un champ GET /api/membre/{id}/lock-status # Statut du verrou ``` ## Configuration ### Durée des Verrous ```php // Dans Lock.php $this->expiresAt = new \DateTime('+30 minutes'); ``` ### Vérification des Verrous ```javascript // Dans inline-editing.js this.lockCheckInterval = setInterval(() => { this.checkLocks(); }, 30000); // Toutes les 30 secondes ``` ### Sauvegarde Automatique ```javascript // Dans inline-editing.js input.addEventListener('input', () => { clearTimeout(saveTimeout); saveTimeout = setTimeout(() => { this.saveField(entityType, entityId, field, input.value); }, 2000); // 2 secondes }); ``` ## Sécurité ### Protection des Données - **Validation côté serveur** : Vérification des données avant sauvegarde - **Vérification des verrous** : Contrôle d'accès basé sur les verrous - **Nettoyage automatique** : Suppression des verrous expirés ### Gestion des Conflits - **Détection de verrous** : Vérification avant édition - **Messages d'erreur** : Notification si élément verrouillé - **Libération automatique** : Nettoyage à la fermeture de page ## Monitoring ### Statistiques - **Verrous actifs** : Nombre de verrous en cours - **Verrous expirés** : Éléments à nettoyer - **Utilisateurs** : Qui modifie quoi ### Commandes de Maintenance ```bash # Nettoyer les verrous expirés php bin/console app:cleanup-locks # Voir les statistiques curl /lock/stats ``` ## Extension ### Ajouter l'Édition Inline à d'Autres Entités 1. **Créer l'API Controller** : ```php // src/Controller/Api/ProjetApiController.php #[Route('/api/projet')] class ProjetApiController extends AbstractController { // Implémenter les mêmes méthodes que MembreApiController } ``` 2. **Mettre à jour le Template** : ```html