---
suivi: 1506
date: 2026-09-10
sujet: Fix AutoComplete dossier Projet après frappe
chantier: factures / depot / destination-projet
type: bugfix
statut: poussé
hash: fbbe0566
fichiers:
  - resources/js/Components/DepotFactures/DepotProjetDossierFields.vue
  - tests/Unit/DepotProjetSaisie1506SourceTest.php
  - public/build/
  - docs/suivi/SUIVI_1506_fix_autocomplete_dossier_projet.md
---

# SUIVI #1506 — Fix AutoComplete dossier Projet (sélection après frappe)

## PROMPT ENVOYÉ

Incident prod : champ Dossier foncier, destination Projet. Sans frappe,
choisir dans la liste fonctionne. Avec frappe (`muda`), suggestions OK,
clic → le champ ne se remplit pas. Diagnostic puis fix dans le même lot
si la cause est certaine. Conserver les acquis #1505 (format, cascade,
journalisation à la sélection seule). Push direct `origin/main`.

## BASE GIT

HEAD de départ `168a2b8a` (fiche #1505). origin/main rebasé avant commit.
Aucun lot en cours.

## FICHES LUES

- **#1505 LEÇON** — identifier n’est pas consulter ; journaliser à la
  sélection, jamais à chaque frappe. Impact : le fix ne déplace pas le
  POST `journaliser-selection` vers `@complete`. Format, cascade, poste
  inactif, `border-radius: 0` inchangés.
- **#1504 LEÇON** — un nom dans le sélecteur élargit l’audience ; le
  journal existant ne couvrait que la fiche. Impact : ce lot ne rouvre
  pas le RGPD.
- **#1384 LEÇON** — AutoComplete PV4 + forceSelection + recherche :
  toujours `mousedown.preventDefault` sur les options (portal). Ne jamais
  supposer que `ignoreNextClear` post-`option-select` suffit si
  l’événement ne part pas. Impact : c’est **la** cause de cet incident ;
  le composant #1505 avait `@item-select` + `@option-select` (#1381) et
  `@clear` sans les gardes #1383/#1384.
- **#1383 LEÇON** — `forceSelection` compare le texte tapé au libellé
  complet au blur → `$emit('clear')`. Impact : `@clear="onDossierClear"`
  annulait la sélection si le clic overlay blurait l’input.
- **#1381 LEÇON** — dropdown PV4 émet `@option-select`. Déjà en place
  au #1505 ; n’explique pas la différence frappe / sans frappe.

## SYNTHÈSE

### Cause

PrimeVue 4.5.5 `AutoComplete.vue` : overlay en `<Portal>` (L139),
sélection au `@click` sur `<li>` (L180), input `@change="onChange"`
(L32). `onChange` + `forceSelection` (L477-502) compare la valeur
saisie au **libellé entier** via `isOptionMatched` (L899, égalité
stricte). Échec → `$emit('clear')` + `updateModel(null)` (L499-500).

`DepotProjetDossierFields.vue` écoutait `@clear="onDossierClear"` sans
garde : le clear spurious vidait le champ **avant** que le clic n’émette
`option-select`.

### Pourquoi sans frappe OK / avec frappe KO

L’événement natif `change` ne part que si la valeur a changé depuis le
focus. Sans frappe (chevron, liste complète) : input vide, `change` ne
part pas, le `@click` L180 émet `option-select` → `onDossierSelect`.
Avec frappe (`muda`) : la valeur a changé ; mousedown sur l’option
(portal `body`) blur l’input **avant** le click ; `onChange` ne matche
pas `muda` avec `MUDAISON — … (DF-2026-0003)` → clear → overlay / clic
sans `option-select`. Même race mesurée au #1384.

Hypothèses écartées (n’expliquent pas la différence) : v-model
chaîne vs objet (les deux chemins) ; `@complete` qui invalide la
référence ; événement de forme différente (option-select ne part tout
simplement pas).

### Correctif

Même patron que `ProgrammeSearchSelect.vue` (#1384), dans
`DepotProjetDossierFields.vue` seulement :

- `pt.option.onMousedown` + `preventDefault()` (overlay)
- `commitDossierSelection` unique (dropdown, frappe, `@change` objet)
- `ignoreNextClear` + `selectingFromOverlay` sur `@clear`
- journalisation **dans** `commitDossierSelection` uniquement
- même garde sur le poste (même widget, même race)

Pas de journal. Pas de PHP. Pas de migration. Format inchangé.

## DÉPLOIEMENT-TEST

Après `git pull origin main` :

- `php artisan optimize:clear`
- `php artisan view:clear`

Pas de migrate. Pas de `route:clear`. Pas de `journal:sync`.
Pas de `npm run build` sur OVH.

Vérifier dépôt → destination Projet :

1. Sans frappe : chevron → choisir un dossier → champ rempli, postes
   chargés.
2. Avec frappe : taper `muda` → cliquer une suggestion → **même
   résultat**.
3. Changer de dossier (les deux chemins) → poste réinitialisé.
4. Taper sans sélectionner → **aucune** ligne nouvelle dans
   `proprietaire_access_logs`.
5. Sélectionner → une entrée `depot_select` par propriétaire.

Les tests sqlite sont skipped (`pdo_sqlite` absent) — **aucune valeur
de preuve**. Seule la vérif navigateur / prod tranche.

## LEÇON

Un AutoComplete PV4 + `forceSelection` + `dropdown` + `@clear` recopié
sans les gardes overlay (#1384) reproduit l’incident même si
`@option-select` est branché. Tester le chemin **avec frappe**, pas
seulement `onDossierSelect`. Journaliser reste à la sélection : le
`@change` de frappe (chaîne) ne commit pas.
