From 4dac21dfac55135f8252704ff0e7c2648912275e Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 21 Feb 2026 22:39:00 +0100 Subject: [PATCH] fix(grid): contextualize draft changes count and validation to visible products --- src/features/grid/components/grid-client.tsx | 4 ++- src/features/grid/hooks/use-save-drafts.ts | 31 +++++++++++++++----- src/features/grid/store/use-grid-store.ts | 8 ++++- 3 files changed, 33 insertions(+), 10 deletions(-) diff --git a/src/features/grid/components/grid-client.tsx b/src/features/grid/components/grid-client.tsx index bfe9906..0bab401 100644 --- a/src/features/grid/components/grid-client.tsx +++ b/src/features/grid/components/grid-client.tsx @@ -35,7 +35,9 @@ export function GridClient({ initialRows, nomFournisseur, fournisseurs, magasins const [selectedCodeins, setSelectedCodeins] = useState([]); const [isPending, startTransition] = useTransition(); const [saveStatus, setSaveStatus] = useState<"idle" | "success" | "error">("idle"); - const { save, hasDrafts, count } = useSaveDrafts(magasin); + + const visibleCodeins = initialRows.map(r => r.codein); + const { save, hasDrafts, count } = useSaveDrafts(magasin, visibleCodeins); const [isMounted, setIsMounted] = useState(false); diff --git a/src/features/grid/hooks/use-save-drafts.ts b/src/features/grid/hooks/use-save-drafts.ts index 7e4b814..447ab33 100644 --- a/src/features/grid/hooks/use-save-drafts.ts +++ b/src/features/grid/hooks/use-save-drafts.ts @@ -7,13 +7,20 @@ import { GammeCode } from "@/types/grid"; /** * Builds the payload from Zustand draftChanges and calls the Server Action. - * Returns a cleanup function called after successful save. + * Filters changes to only include those in the provided codeins list (e.g. current supplier). */ -export function useSaveDrafts(magasin: string) { - const { draftChanges, resetDrafts } = useGridStore(); +export function useSaveDrafts(magasin: string, filterCodeins?: string[]) { + const { draftChanges, resetDrafts, clearDrafts } = useGridStore(); + + // Only consider changes that are in the filter list (if provided) + const activeDrafts = filterCodeins + ? Object.fromEntries(Object.entries(draftChanges).filter(([codein]) => filterCodeins.includes(codein))) + : draftChanges; + + const count = Object.keys(activeDrafts).length; const save = useCallback(async () => { - const changes = Object.entries(draftChanges).map(([codein, codeGamme]) => ({ + const changes = Object.entries(activeDrafts).map(([codein, codeGamme]) => ({ codein, magasin, codeGamme: codeGamme as GammeCode, @@ -22,9 +29,17 @@ export function useSaveDrafts(magasin: string) { if (changes.length === 0) return { success: true, saved: 0 }; const result = await saveDraftChanges({ changes }); - if (result.success) resetDrafts(); - return result; - }, [draftChanges, magasin, resetDrafts]); - return { save, hasDrafts: Object.keys(draftChanges).length > 0, count: Object.keys(draftChanges).length }; + if (result.success) { + if (filterCodeins) { + // Clear ONLY the ones we just saved + clearDrafts(Object.keys(activeDrafts)); + } else { + resetDrafts(); + } + } + return result; + }, [activeDrafts, magasin, resetDrafts, clearDrafts, filterCodeins]); + + return { save, hasDrafts: count > 0, count }; } diff --git a/src/features/grid/store/use-grid-store.ts b/src/features/grid/store/use-grid-store.ts index d4e728f..39f80fa 100644 --- a/src/features/grid/store/use-grid-store.ts +++ b/src/features/grid/store/use-grid-store.ts @@ -19,6 +19,8 @@ interface GridState { setRows: (rows: ProductRow[]) => void; setDraftGamme: (codein: string, gamme: GammeCode) => void; resetDrafts: () => void; + /** Clear specific draft changes by codein */ + clearDrafts: (codeins: string[]) => void; setFilter: (key: keyof GridFilters, value: string | null) => void; setDisplayDensity: (density: "compact" | "normal" | "comfortable") => void; setActiveGridQuery: (query: string) => void; @@ -76,7 +78,11 @@ export const useGridStore = create()( resetDrafts: () => { set({ draftChanges: {}, summary: computeSummary(get().rows, {}) }); }, - + clearDrafts: (codeins) => { + const draftChanges = { ...get().draftChanges }; + codeins.forEach((id) => delete draftChanges[id]); + set({ draftChanges, summary: computeSummary(get().rows, draftChanges) }); + }, setFilter: (key, value) => { set((state) => ({ ...state, filters: { ...state.filters, [key]: value } })); },