Réalisation finale

This commit is contained in:
Logshiro
2025-10-24 16:13:37 +02:00
parent 6585fef404
commit 7e4cdedf3d
73 changed files with 6154 additions and 14 deletions

205
INLINE_EDITING.md Normal file
View File

@@ -0,0 +1,205 @@
# 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
<td class="editable-cell"
data-entity-type="Projet"
data-entity-id="{{ projet.id }}"
data-field="nom">
{{ projet.nom }}
</td>
```
3. **Ajouter les Styles** :
```css
.editable-cell {
cursor: pointer;
transition: background-color 0.2s;
}
```
## Dépannage
### Problèmes Courants
1. **Verrous non libérés** :
- Vérifier la console JavaScript
- Utiliser `/lock/stats` pour voir les verrous actifs
- Exécuter `php bin/console app:cleanup-locks`
2. **Édition ne fonctionne pas** :
- Vérifier que le JavaScript est chargé
- Contrôler les erreurs dans la console
- Vérifier les routes API
3. **Conflits de verrous** :
- Attendre l'expiration (30 minutes)
- Utiliser "Libérer tous mes verrous" dans `/lock/stats`
### Logs
```bash
# Voir les logs Symfony
tail -f var/log/dev.log
# Voir les erreurs JavaScript
# Ouvrir la console du navigateur (F12)
```
## Performance
### Optimisations
- **Vérification périodique** : Toutes les 30 secondes
- **Nettoyage automatique** : Commande cron recommandée
- **Cache des verrous** : Éviter les requêtes répétées
### Recommandations
```bash
# Ajouter au crontab
*/5 * * * * php /path/to/project/bin/console app:cleanup-locks
```
## Support
Pour toute question ou problème :
1. Vérifier les logs Symfony
2. Contrôler la console JavaScript
3. Utiliser les outils de diagnostic dans `/lock/stats`