From e9ac5bc0a5bfbc769aeec605dc0d3a73e7a9d2fa Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 21 Jul 2026 15:00:40 +0000 Subject: [PATCH] =?UTF-8?q?fix(grille):=20la=20grille=20refl=C3=A8te=20l'?= =?UTF-8?q?=C3=A9tat=20serveur=20courant=20des=20gammes=20(INIT=20recharg?= =?UTF-8?q?=C3=A9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit La grille rechargeait bien le gamme INIT depuis l'état live du serveur à chaque chargement (Phase 6), mais la Phase 9 réappliquait ensuite AVEUGLÉMENT le 'after' du dernier snapshot sur codeGamme — même quand la modification avait déjà été appliquée sur le serveur (ou que la gamme serveur avait évolué depuis). Résultat : la grille affichait l'ancienne cible du snapshot au lieu de l'état serveur réel, et une modif 'en attente' fantôme. Désormais on ne réapplique une modif du snapshot QUE si elle est encore réellement en attente côté serveur (change.before === gamme live). Sinon on garde l'état serveur courant. La grille montre donc toujours où en sont les gammes sur le serveur, et une modif disparaît du 'en attente' dès qu'elle est appliquée côté serveur — le suivi reste juste. Note : les brouillons locaux (localStorage) restent gérés côté client comme du travail non sauvegardé. --- src/features/grid/api/get-product-rows.ts | 29 +++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/src/features/grid/api/get-product-rows.ts b/src/features/grid/api/get-product-rows.ts index 725257f..1ae30c2 100644 --- a/src/features/grid/api/get-product-rows.ts +++ b/src/features/grid/api/get-product-rows.ts @@ -313,7 +313,15 @@ async function buildProductRows(input: GetProductRowsInput): Promise 0) { const changes = snaps[0].changes as Record; + let enAttente = 0; + let obsoletes = 0; for (const [codein, change] of Object.entries(changes)) { const product = productMap.get(codein); - if (product && change.after) { - // codeGammeInit reste figé — seulement codeGamme est overridé + if (!product || !change.after) continue; + + const gammeLive = product.codeGammeInit; // état serveur courant + const before = change.before ?? null; + const stillPending = before === (gammeLive ?? null) && change.after !== gammeLive; + + if (stillPending) { + // Modification pas encore appliquée sur le serveur → on la remonte product.codeGamme = change.after as GammeCode; + enAttente++; + } else { + // Déjà appliquée côté serveur (ou serveur divergent) → on garde le LIVE + product.codeGamme = gammeLive; + obsoletes++; } } - console.log(`[getProductRows] Gammes restaurées depuis snapshot`); + console.log(`[getProductRows] Snapshot: ${enAttente} modif(s) en attente réappliquée(s), ${obsoletes} déjà appliquée(s)/obsolète(s) ignorée(s)`); } } catch (snapErr) { console.error("[getProductRows] Snapshot restore error:", snapErr);