---
suivi: 1196
date: 2026-08-05
sujet: Foncier — ancres URL onglets dossier
chantier: module-foncier
type: feature
statut: poussé
hash: 1a1ef25e
fichiers:
  - app/Support/Foncier/DossierFoncierTabs.php
  - resources/js/Composables/useTabAnchor.js
  - resources/js/Pages/Foncier/Dossiers/Show.vue
  - app/Http/Controllers/Foncier/DossierFoncierController.php
  - app/Http/Controllers/Foncier/OffreFonciereController.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - public/build/
  - docs/suivi/SUIVI_1196_foncier_dossier_ancres_onglets.md
---

## PROMPT ENVOYÉ

SUIVI #1196 — #tag / ancres URL pour onglets dossier (après #1194/#1195).
Choix fragment vs query ; redirects #proprietaires/#parcelles ; replaceState ;
généralisation instruite sans implémenter ailleurs.

## SYNTHÈSE

### Choix retenu : query `?onglet=` + miroir `#…`
- **Query `?onglet=`** : lue serveur (`DossierFoncierTabs::resolve`) → onglet correct
  dès le premier rendu (pas de clignotement) ; liens mail/alerte fiables.
  BC : `?tab=` toujours accepté.
- **Miroir `#slug`** : demandé par Robin ; synchro `history.replaceState`.
- Motif : le paramètre est aussi simple (déjà `?tab=` / flash session) et
  supérieur pour l’usage « lien envoyé ».

### Ancres définitives (figées)
`synthese` · `foncier` · `negociations` · `faisabilite` · `promesses` · `suivi` · `acces`
- PHP : `App\Support\Foncier\DossierFoncierTabs`
- JS : `DOSSIER_FONCIER_TAB_KEYS` + `useTabAnchor`
- Alias : `proprietaires`/`parcelles` → `foncier` ; `offres` → `negociations`
- Absente / inconnue → synthèse silencieuse
- Sans ancre : URL non polluée ; au clic : `?onglet=` + `#`

### Retour navigateur
`replaceState` uniquement → les clics d’onglet **n’empilent pas** l’historique.
Retour = **quitter la page** (pas 10 retours d’onglets).

### Modale #1195
N’écrit pas l’URL ; une ancre n’ouvre pas la modale. Vérifié (état local
`showOffreForm` seulement).

### Habilitation
Ancre après `authorize('view')` — non habilité = refus habituel. Pas d’onglet
conditionnel enseigne sur ce Show (tous visibles si dossier accessible).

### Recensement pages à onglets (instruct, pas codé ailleurs)
| Page | Ancre déjà ? |
|------|----------------|
| Foncier dossier Show | **#1196** (ce lot) |
| Marches/Show | oui `#` (replaceState) |
| Programmes/Edit | oui `#` |
| Programmes/Commercialisation, Tma | oui `#grille` |
| SuiviChantier/Index | oui `#` |
| ProgrammeNav / Dashboard | liens `#grille` |
| Admin/Index TabView | non |
| Factures (query `?tab=`) | query, pas hash fiche |
| Mes tâches `?onglet=suivi` | query |

Mécanisme : **nouveau** `useTabAnchor` générique (réutilisable) ; pas de second
copier-coller marché. Autres pages **non modifiées**.

### Migration / données
Aucune.

## DÉPLOIEMENT-TEST

1. `git pull` ; `optimize:clear` ; `view:clear` ; `route:clear` ; `journal:sync`
2. Tests 1–10 du prompt

## LEÇON

Fragment seul = flash au hard reload ; query serveur + miroir hash = meilleur
des deux. Ancres figées dans une constante, jamais en dur dans le template.
