---
suivi: 1376
date: 2026-08-31
sujet: demande_juridique_edition_inline
chantier: juridique
type: feature
statut: poussé
hash: 7aa8d661
fichiers:
  - app/Http/Controllers/DemandeJuridiqueController.php
  - app/Http/Requests/Juridique/UpdateDemandeJuridiqueChampRequest.php
  - app/Support/Juridique/DemandeJuridiqueHistoriqueService.php
  - app/Support/Juridique/DemandeJuridiquePresenter.php
  - routes/web.php
  - resources/js/Pages/Juridique/Show.vue
  - tests/Feature/DemandeJuridiqueInlineChamp1376Test.php
  - tests/Unit/DemandeJuridiqueInlineChamp1376SourceTest.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - public/build/
---

## PROMPT ENVOYÉ

SUIVI #1376 — Supprimer modale « Modifier » ; édition inline champ par champ
(InlineEditableField) avec historique ; terminées modifiables par juriste ;
droits inchangés ; 403 serveur.

## FICHES LUES

- Aucune fiche juridique récente dans docs/suivi/ ; pattern inline repris de
  #1197 / #1107 (Foncier + InlineEditableField + PATCH champ).

## SYNTHÈSE

### UI
Modale et bouton « Modifier » supprimés. `InlineEditableField.vue` réutilisé
(text, textarea, select) sur : objet (titre), priorité, type, programme,
description. Statut / juriste / suiveurs inchangés. Rechargement partiel Inertia
(`only: ['demande']`) après chaque save pour rafraîchir l'historique.

### API
Nouvelle route `PATCH juridique/demandes/{id}/champ` (`demandes.champ.update`).
Payload : `{ champ, valeur }`. Whitelist serveur = 5 champs modifiables.
Réponse JSON `{ ok, valeur, unchanged? }`.

### Historique
`logChampModifie` appelé à chaque changement réel. **Description** : extrait
120 caractères + « … » dans l'historique (valeur complète en base) — plus
lisible qu'un pavé ou qu'une simple mention « modifiée ».

### Droits (inchangés, 403 serveur)
| Action | Qui |
|--------|-----|
| Modifier type/objet/description/programme/priorité | `GS_JURIDIQUE` ; ou demandeur **propriétaire** si statut `a_qualifier` |
| Changer statut | `GS_JURIDIQUE`, `GS_DSI`, `GS_ADMIN_ERP` |
| Affecter juriste | `GS_JURIDIQUE` |
| Gérer suiveurs | `GS_JURIDIQUE`, `GS_DSI`, `GS_ADMIN_ERP` |
| Lecture seule | Demandeur, Déposée le, Terminée le |

Demandeur sur demande **terminée** : 403 (test feature). Juriste : OK.

### Mapping sélecteurs
| Champ | Libellé affiché | Valeur postée | Colonne DB |
|-------|-----------------|---------------|------------|
| Type | `DemandeJuridiqueTypeRegistry` | ex. `recherche` | `type_demande` |
| Programme | `programmes.libelle` via presenter | id int ou null | `programme_id` |
| Priorité | Urgent / Élevé / Standard | `urgent` / `eleve` / `standard` | `priorite_ressentie` |

## DÉPLOIEMENT-TEST

```bash
git pull origin main
php artisan optimize:clear
php artisan view:clear
php artisan route:clear
php artisan journal:sync
```

Tests manuels demande #6 (terminée) : objet, description, type, programme,
priorité → F5 + historique.

## LEÇON

Réutiliser `InlineEditableField` + PATCH whitelist évite une 2ᵉ UX d'édition.
Tout champ inline doit prouver l'historique par test DB, pas par lecture du
controller seul (piège des mécanismes vides).
