---
suivi: 1456
date: 2026-09-04
sujet: Juridique — aperçu pièce jointe en modale (œil)
chantier: juridique
type: feature
statut: poussé
hash: 4a5b260e
fichiers:
  - resources/js/Pages/Juridique/Show.vue
  - resources/js/utils/juridiquePieceJointeApercu.js
  - tests/Unit/JuridiquePieceJointeApercu1456SourceTest.php
  - tests/Unit/DemandeJuridiqueDemandeurGraph1379SourceTest.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - public/build/
  - docs/suivi/SUIVI_1456_juridique_apercu_piece_jointe.md
---

# SUIVI #1456 — Aperçu pièce jointe juridique

## PROMPT ENVOYÉ

Fiche demande juridique, bloc Pièces jointes : le nom de fichier devient inerte ;
icône œil (pi-eye) avant Télécharger ; Dialog unique iframe `?inline=1` pour
PDF/images ; autres types : l’œil télécharge. Lot purement front. Ne pas
modifier DemandeJuridiqueController (#1455). Pas de nouvelle route.

## FICHES LUES

- **#1455** — import `PieceJointeMimeSupport` ; branche `boolean('inline')`
  conservée telle quelle. Contrôleur non retouché.
- **#1379 LEÇON** — réutiliser `DocumentPreviewDialog`. **Non suivi ici** :
  le composant est mutualisé (Marchés, Appels d’offres). Dimensions et
  iframe unique demandées par Robin ≠ contrat actuel du Dialog partagé
  (img pour les images, 80vh, message « aperçu indisponible »). Dialog
  local dans `Juridique/Show.vue` uniquement.
- **#1451** — suiveurs M365 ; non touché.
- **#1454** — HelpHint `panelClass` ; hors périmètre.
- **#1271 / #1444** — pas d’`overflow-x-hidden`.

Base : `origin/main` `55f38e37` (chore #1455). Pas de rebase (HEAD déjà dessus).

## MESURES ÉTAPE 1

1. Route : `GET juridique/demandes/{demandeJuridique}/pieces/{pieceJointe}/download`
   nom Ziggy/Laravel `juridique.demandes.pieces.download`.
2. Bloc dans `resources/js/Pages/Juridique/Show.vue` (page juridique, pas
   un composant partagé dépôt/foncier). Clause d’arrêt non déclenchée.
3. Front : pas de `route()` Ziggy dans le .vue ; URL = prop `download_url`
   produite par `DemandeJuridiquePresenter::serializePiece` via
   `route('juridique.demandes.pieces.download', …)`. Aperçu :
   `urlApercuPieceJointe(download_url)` → `?inline=1`.
4. Props déjà exposées : `id`, `nom_original`, `mime`, `preview_kind`,
   `est_visualisable`, `depose_par_nom`, `peut_supprimer`, `created_at`,
   `download_url`, `preview_url`. MIME est exposé. **Décision d’aperçu
   côté front** depuis l’extension de `nom_original` (helper unique), pas
   depuis `est_visualisable`.

Branche `$request->boolean('inline')` toujours présente (~L484).

## SYNTHÈSE

Nom de fichier = `<p class="truncate">` inerte. Œil toujours visible.
Un Dialog PrimeVue, iframe 85vh / largeur 90vw. Fermeture : `pieceApercu`
et `apercuSrc` vidés (`v-if="apercuSrc"`). Helper
`resources/js/utils/juridiquePieceJointeApercu.js`.
`DocumentPreviewDialog.vue` non modifié.

Aucun PHP applicatif. Test 1379 `DocumentPreviewDialog` dans Show.vue
aligné sur le Dialog local.

## DÉPLOIEMENT-TEST

git pull origin main
php artisan optimize:clear
php artisan view:clear
php artisan journal:sync
Pas de migrate. Pas de npm sur OVH.

Vérifier sur une fiche demande : PDF → œil ouvre la modale ; docx → œil
télécharge ; nom de fichier non cliquable ; Télécharger et corbeille OK.

## LEÇON

Un aperçu « déjà là » (#1379 : nom cliquable + Dialog partagé + fetch
préalable + bandeau d’erreur) n’est pas l’aperçu demandé. Mesurer le
template actuel. Ne pas modifier un Dialog mutualisé pour un contrat
page-spécifique. `overflow-x-hidden` reste interdit.
