mirror of
https://github.com/R0m1k3/CollectFlow.git
synced 2026-10-23 23:18:10 +02:00
fix(grid): contextualize draft changes count and validation to visible products
This commit is contained in:
1 parent
fe8d0f1b32
commit
4dac21dfac
3 files changed
+33
-10
No files matched your search
@@ -35,7 +35,9 @@ export function GridClient({ initialRows, nomFournisseur, fournisseurs, magasins
|
|||||||
const [selectedCodeins, setSelectedCodeins] = useState<string[]>([]);
|
const [selectedCodeins, setSelectedCodeins] = useState<string[]>([]);
|
||||||
const [isPending, startTransition] = useTransition();
|
const [isPending, startTransition] = useTransition();
|
||||||
const [saveStatus, setSaveStatus] = useState<"idle" | "success" | "error">("idle");
|
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);
|
const [isMounted, setIsMounted] = useState(false);
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,20 @@ import { GammeCode } from "@/types/grid";
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Builds the payload from Zustand draftChanges and calls the Server Action.
|
* 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) {
|
export function useSaveDrafts(magasin: string, filterCodeins?: string[]) {
|
||||||
const { draftChanges, resetDrafts } = useGridStore();
|
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 save = useCallback(async () => {
|
||||||
const changes = Object.entries(draftChanges).map(([codein, codeGamme]) => ({
|
const changes = Object.entries(activeDrafts).map(([codein, codeGamme]) => ({
|
||||||
codein,
|
codein,
|
||||||
magasin,
|
magasin,
|
||||||
codeGamme: codeGamme as GammeCode,
|
codeGamme: codeGamme as GammeCode,
|
||||||
@@ -22,9 +29,17 @@ export function useSaveDrafts(magasin: string) {
|
|||||||
if (changes.length === 0) return { success: true, saved: 0 };
|
if (changes.length === 0) return { success: true, saved: 0 };
|
||||||
|
|
||||||
const result = await saveDraftChanges({ changes });
|
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 };
|
||||||
}
|
}
|
||||||
@@ -19,6 +19,8 @@ interface GridState {
|
|||||||
setRows: (rows: ProductRow[]) => void;
|
setRows: (rows: ProductRow[]) => void;
|
||||||
setDraftGamme: (codein: string, gamme: GammeCode) => void;
|
setDraftGamme: (codein: string, gamme: GammeCode) => void;
|
||||||
resetDrafts: () => void;
|
resetDrafts: () => void;
|
||||||
|
/** Clear specific draft changes by codein */
|
||||||
|
clearDrafts: (codeins: string[]) => void;
|
||||||
setFilter: (key: keyof GridFilters, value: string | null) => void;
|
setFilter: (key: keyof GridFilters, value: string | null) => void;
|
||||||
setDisplayDensity: (density: "compact" | "normal" | "comfortable") => void;
|
setDisplayDensity: (density: "compact" | "normal" | "comfortable") => void;
|
||||||
setActiveGridQuery: (query: string) => void;
|
setActiveGridQuery: (query: string) => void;
|
||||||
@@ -76,7 +78,11 @@ export const useGridStore = create<GridState>()(
|
|||||||
resetDrafts: () => {
|
resetDrafts: () => {
|
||||||
set({ draftChanges: {}, summary: computeSummary(get().rows, {}) });
|
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) => {
|
setFilter: (key, value) => {
|
||||||
set((state) => ({ ...state, filters: { ...state.filters, [key]: value } }));
|
set((state) => ({ ...state, filters: { ...state.filters, [key]: value } }));
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in new issue
Block a user