---
suivi: 1327
date: 2026-08-13
sujet: diag_dashboard_widgets_indisponibles
chantier: dashboard
type: diag
statut: poussé
hash: 6b69328a
fichiers:
  - tools/diag/diag_dashboard_widgets_1327.php
  - docs/suivi/SUIVI_1327_diag_dashboard_widgets_indisponibles.md
---

## PROMPT ENVOYÉ

PHASE 1 DIAG #1327 — lecture seule. Quatre widgets `/dashboard` affichent
« Données indisponibles » (prod 13/08, compte robin.portales / GS_ADMIN_ERP).
Établir régression du jour (#1311–#1326) vs défaut ancien ; inventaire mécanisme ;
source du message ; script tools/diag ; mise en page ; reco PHASE 2.
Aucun fix app/resources/routes/database. Script + fiche uniquement.

## SYNTHÈSE

### Fiches / deps lues
- `docs/dashboard-widgets.md` — API async par widget, table `user_dashboard_widgets`.
- `docs/PASSATION.md` — **Ziggy n'est PAS installé** ; `route()` Vue → undefined.
- Commits #576/#577/#651 / `0caf1265` : URLs en dur ailleurs ; widgets oubliés.
- Aucune fiche `docs/suivi/*dashboard*widget*` pertinente sur ce message.

### Régression d'aujourd'hui ? **NON** (prouvé par git log)
- `git log --since=2026-08-12` sur sources Dashboard / Widget* / config = **vide**.
- Dernière modif `WidgetWrapper.vue` : `70a80884` (2026-05-24).
- `catch` HTTP 200 sans Log dans `WidgetController` : `17dfa7f2` (2026-05-24).
- Chunks `Dashboard-*.js` régénérés aujourd'hui = **effet de bord** des builds
  marchés (#1314–#1322) ; sources widgets **inchangées**.

### Cause racine (commune aux 4 widgets)
`WidgetWrapper.vue` appelle `route('api.dashboard.widget.data', …)`. Ziggy absent
→ `ReferenceError` / URL invalide → `catch {}` silencieux → `error=true` →
`WidgetBody` affiche « Données indisponibles. » (cas **b** : requête échouée
côté client, jamais émise correctement).

Même helper dans `Dashboard/Index.vue` (add/save/remove layout).

Filet back : `WidgetController::widgetData` avale toute exception, renvoie
HTTP **200** + `error` **sans** `Log::error` (piège #1043-like) — depuis mai.

### Mise en page
Pas une régression CSS `#1318`/`#1319`. `DashboardDefaultLayoutService` seed
**tous** les widgets à `position_x=0` (empilement), largeurs catalogue 6/4/4/6
→ colonne étroite + vide à droite. Grille 12 cols attendue si positions x
différentes. Triangle : candidat poignée `__resizer` grid-layout-plus (bas-droit
widget en mode édition) ou artefact hors mécanisme données.

### Données prod
Script local sur stub `erp_immo_migrate_1113` : user robin **absent**, compteurs 0
→ **RESULTAT 0 NE VALIDE RIEN**. SSH OVH indisponible depuis cet environnement.
**À rejouer en prod** : `php -d display_errors=1 tools/diag/diag_dashboard_widgets_1327.php`
(section 6 = preuve code déjà vraie sans DB).

### Découpage PHASE 2 recommandé
1. Remplacer `route(...)` par URLs en dur `/api/dashboard/...` (comme AppShell).
2. Messages UI : distinguer chargement échoué (status/message) vs vide métier.
3. `WidgetController` : `Log::error` + HTTP 5xx (ou payload error explicite) — ne plus
   avaler sans journal.
4. (séparé) seed layout : positions x côte-à-côte (ex. 0+6) au lieu de x=0 partout.

### Écrans affectés
Uniquement `/dashboard` (composants `Components/Dashboard/*`). Le switcher
programme (même préfixe API) est **déjà** en URL en dur. `Programmes/Dashboard`
et Meta Dashboard = mécanismes distincts.

## DÉPLOIEMENT-TEST

```bash
git pull origin main
php -d display_errors=1 -l tools/diag/diag_dashboard_widgets_1327.php
php -d display_errors=1 tools/diag/diag_dashboard_widgets_1327.php
```

Coller la sortie brute (jusqu'à `FIN`) dans le lot PHASE 2. Pas de migration.
Pas de rebuild. Network tab `/dashboard` : vérifier que les GET widget data
passent de `route()` cassé à `/api/dashboard/widget/{key}/data`.

## LEÇON

Ziggy absent du projet : tout nouveau `route('…')` côté Vue est une panne
silencieuse si un `catch` avale l'erreur. Le fix du switcher (`0caf1265`) n'a
pas été propagé aux widgets dashboard — greper `route(` dans `resources/js`
après chaque lot qui ajoute un appel API.
