---
suivi: 1433
date: 2026-09-04
sujet: Fix ajout widgets Aktor / Liens rapides invisibles sur la grille
chantier: dashboard
type: fix
statut: poussé
hash: 7516ed43
fichiers:
  - resources/js/Pages/Dashboard/Index.vue
  - resources/js/Components/Dashboard/DashboardGrid.vue
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - public/build/
  - docs/suivi/SUIVI_1433_fix_ajout_widgets.md
---

## PROMPT ENVOYÉ

SUIVI #1433 — widgets Aktor / Liens rapides sélectionnés mais absents de la
grille (mode édition). Prérequis #1432. Mesure prod : `aktor` en base → rendu,
pas droits ni validation saveLayout. Traiter aussi #1430 (ajout hors édition).

## FICHES LUES

- `#1432` sur origin/main — XSS liens ; non touché.
- `#1434` sur origin/main au moment de la reprise (stash après interruption).
- `#1425` / `#1426` — WidgetBody a déjà les branches `aktor` / `liens_rapides`.
- `#1396` LEÇON — pas de plancher hauteur en lecture (respecté).
- `#1430` relevé — `addWidget` ne save que si `editMode`.

## SYNTHÈSE

### Prérequis
`origin/main` contient #1432 (`97ab0b5a`).

### ÉTAPE 0 — cause ÉTABLIE PAR LE CODE

Chemin ajout : `Index.vue` `addWidget` → mutation `localLayout` → (si edit)
`saveLayout` POST `/api/dashboard/layout` → `WidgetController::saveLayout`.

Mesure prod : ligne `aktor` 6×7 en base → **écriture OK** (pistes droits /
validation `widget_key` écartées).

`WidgetBody.vue` résout déjà `aktor` / `liens_rapides` (imports + `v-else-if`).
`WidgetWrapper` monte `WidgetBody` avec `:widget-key="item.i"`.

**Cause :** `DashboardGrid` affiche `gridLayout`, synchronisé depuis
`props.layout` par un `watch` shallow sur la référence. `addWidget` faisait
`localLayout.value.push(...)` → même référence, longueur changée côté Index /
`saveLayout` (persist OK) mais **`syncFromProps` ne tournait pas** → pas de
`GridItem` / pas de montage `AktorWidget`. Symptôme exact.

Choix #1430 : bouton « Ajouter » reste visible ; **`saveLayout` toujours** à
l’ajout. Échec → toast visible (plus silencieux).

### SQL 0.4 (Robin)

```sql
SELECT id, user_id, widget_key, position_x, position_y, width, height, config, updated_at
FROM user_dashboard_widgets
WHERE user_id = <ID_ROBIN>
ORDER BY position_y, position_x;
```

## DÉPLOIEMENT / TEST

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

Pas de migrate. Pas de prune. `route:clear` inutile.

## LEÇON

Une grille qui mime le layout via une copie (`gridLayout`) doit watcher
**longueur + deep** (ou remplacer le tableau à l’ajout). Sinon : persist OK,
UI vide — on croit à un bug de rendu de composant alors que le composant n’est
jamais monté.
