---
suivi: 1438
date: 2026-09-04
sujet: Avis d'imposition — scroll horizontal, lignes compactes, droit de suppression
chantier: foncier
type: fix
statut: poussé
hash: db6d1853
fichiers:
  - app/Http/Controllers/Foncier/AvisImpositionController.php
  - resources/js/Pages/Foncier/Patrimoine/AvisImposition/Index.vue
  - resources/js/Components/Foncier/InlineEditableField.vue
  - tests/Unit/AvisImposition1438SourceTest.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - public/build/
---

# SUIVI #1438 — Scroll horizontal, hauteur de lignes, droit de suppression

## PROMPT ENVOYÉ

Trois défauts après déploiement #1435 : barre H du tableau toujours absente (seule
celle de la fenêtre) ; lignes trop hautes (Ajouter + corbeille empilés) ; corbeille
à réserver à GS_GEMME_PDG / GS_DIRECTION_GENERALE / GS_ADMIN_ERP (GS_COMPTABILITE
exclu, contrôle serveur via m365GroupNames brut). Ne pas défaire #1435. #1437 pas
encore lancé côté métier — déjà sur origin/main : ce lot s’empile dessus, ne le
défait pas.

## FICHES LUES

- `SUIVI_1435` LEÇON : `validated()` Laravel 13 ; scroll `100dvh-11.5rem` annoncé
  mais échoué à l’écran — ne pas répéter la même recette. Contrat PATCH `{champ,valeur}`
  à conserver.
- `SUIVI_1271` LEÇON : jamais `overflow-x-hidden`.
- `SUIVI_1422` — Adresse sticky `left:0`, pièces jointes : ne toucher que la disposition.
- `SUIVI_1420` / `SUIVI_1434` — GROUPES_AUTORISES inchangés (accès page).
- `SUIVI_1411` / FactureVerrou — modèle `array_intersect(..., m365GroupNames())`.
- `SUIVI_1387` — registres : 12 px, `truncate` + `title`, wrap `overflow-auto`.
- `SUIVI_1437` — déjà sur main (2026 + TLVH) : ne pas revert.

## SYNTHÈSE

### Prérequis

`origin/main` contient `317a10c3` / `6ac70a36` (#1435). `git merge-base --is-ancestor`
OK. #1437 (`a30389cb`) est aussi sur main : pas de rebase en arrière.

### Volet 1 — cause établie du scroll #1435

Trois causes cumulées, pas PrimeVue « qui écrase » une règle auteur au sens cascade
classique, mais un overflow **ailleurs** :

1. PrimeVue DataTable pose `overflow: auto` **en style inline** sur
   `.p-datatable-table-container` (`node_modules/primevue/datatable/style/index.mjs`,
   `inlineStyles.tableContainer`). Sans `scrollHeight`, height:auto = 311 lignes :
   la barre H de **ce** nœud est sous le pli. `.avis-imposition-scroll` ne déborde
   pas en X (enfant à 100 % de largeur).
2. Item flex `min-width: auto` (défaut) : `.avis-imposition-scroll` n’avait pas
   `min-w-0`. Le tableau `width: max-content` élargit la carte puis la page.
   `main` (`AppShell.vue` L2139, `overflow-y-auto`) calcule `overflow-x: auto`
   (spec CSS si overflow-y ≠ visible) → barre H de la **fenêtre de contenu**.
3. `h-[calc(100dvh-11.5rem)]` sous-estime nav + fil d’Ariane + `p-8` + bandeau
   d’impersonation → page plus haute que `main`, barre interne hors écran.
   `100dvh` est supporté ; ce n’est pas le bug.

Solution : `min-w-0 max-w-full` sur la chaîne ; `max-height: calc(100dvh - 18rem)`
sur `.avis-imposition-scroll` (offset conservative, impersonation) ; override
`overflow: visible !important` sur `.p-datatable-table-container` pour que **un
seul** scrollport (`.avis-imposition-scroll`) porte `overflow-x: scroll`. Pas de
`overflow-x-hidden`. Adresse toujours `position: sticky; left: 0`.

Rendu non vérifiable ici (pas de session ERP). Mesure inspecteur pour Robin :
voir LEÇON / livrable.

### Volet 2 — hauteur des lignes

Corbeille extraite de la colonne Commentaire (`mt-1` sous le champ). Avec
« Ajouter… », elle est dans `.avis-imposition-actions` en `flex-nowrap` (une
ligne horizontale). Padding cellules `py-1 px-2`, police 12 px (registres #1387).

Textes longs : **une ligne, ellipse, infobulle `title`** (même schéma que les
registres `truncate` + title). Clic → édition, texte entier dans le champ.
Les documents multiples peuvent encore allonger **cette** ligne ; Add + corbeille
ne s’empilent plus.

### Volet 3 — suppression

`GROUPES_SUPPRESSION` = GEMME_PDG, DIRECTION_GENERALE, ADMIN_ERP.
`peutSupprimer()` = `array_intersect(..., $user->m365GroupNames())`. Pas de
`hasAnyM365Group`, pas de Gate. `destroy()` JSON 403 si hors liste.
Pièces jointes : croix document reste sur `peut_modifier` (compta conserve
l’ajout / retrait de fichiers). Accès page inchangé.

Comptes de test refus : Sabrina BARTOLI ou Rudy BENOR (GS_COMPTABILITE).
Sandrine PORTALES (GS_GEMME_PDG) : accès + suppression.

## DÉPLOIEMENT-TEST

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

Pas de migration.

## LEÇON

Un `overflow-x: scroll` sur un wrapper ne crée une barre H **atteignable** que si
(1) ce wrapper a une largeur bornée (`min-w-0`, pas `min-width: auto` flex),
(2) l’enfant PrimeVue `.p-datatable-table-container` n’avale pas le overflow
(inline `overflow:auto` + height auto = barre sous 311 lignes),
(3) la hauteur du scrollport tient dans le viewport visible (`100dvh - 11.5rem`
était trop optimiste avec impersonation). Inspecteur : `scrollWidth > clientWidth`
sur `.avis-imposition-scroll`, et `scrollWidth === clientWidth` sur `main`.
