@flowselections/logistiek-engine 1.0.6 → 1.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/dist-lib/components/LogistiekEnginePage.d.ts.map +1 -1
  2. package/dist-lib/components/LogistiekEnginePage.js +19 -4
  3. package/dist-lib/components/StrategieDialog.d.ts.map +1 -1
  4. package/dist-lib/components/StrategieDialog.js +1 -1
  5. package/dist-lib/hooks/useLogistiekStrategieen.d.ts +2 -1
  6. package/dist-lib/hooks/useLogistiekStrategieen.d.ts.map +1 -1
  7. package/dist-lib/hooks/useLogistiekStrategieen.js +72 -2
  8. package/dist-lib/integrations/supabase/auth-middleware.d.ts +396 -3
  9. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  10. package/dist-lib/integrations/supabase/client.d.ts +396 -3
  11. package/dist-lib/integrations/supabase/client.d.ts.map +1 -1
  12. package/dist-lib/integrations/supabase/client.server.d.ts +396 -3
  13. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  14. package/dist-lib/integrations/supabase/types.d.ts +396 -3
  15. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  16. package/dist-lib/lib/floridayDocuments.functions.d.ts +1188 -9
  17. package/dist-lib/lib/floridayDocuments.functions.d.ts.map +1 -1
  18. package/dist-lib/lib/floridayPush.functions.d.ts +396 -3
  19. package/dist-lib/lib/floridayPush.functions.d.ts.map +1 -1
  20. package/dist-lib/lib/handlers/logistics-tick.server.d.ts.map +1 -1
  21. package/dist-lib/lib/handlers/logistics-tick.server.js +12 -1
  22. package/dist-lib/lib/loadCarrierPlanning.functions.d.ts +1980 -15
  23. package/dist-lib/lib/loadCarrierPlanning.functions.d.ts.map +1 -1
  24. package/dist-lib/lib/logisticsRecalcJob.functions.d.ts +792 -6
  25. package/dist-lib/lib/logisticsRecalcJob.functions.d.ts.map +1 -1
  26. package/dist-lib/lib/logisticsRecalculate.functions.d.ts +396 -3
  27. package/dist-lib/lib/logisticsRecalculate.functions.d.ts.map +1 -1
  28. package/dist-lib/lib/modulePrompts.d.ts.map +1 -1
  29. package/dist-lib/lib/modulePrompts.js +25 -0
  30. package/dist-lib/lib/planQueue.server.d.ts +17 -0
  31. package/dist-lib/lib/planQueue.server.d.ts.map +1 -0
  32. package/dist-lib/lib/planQueue.server.js +124 -0
  33. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"LogistiekEnginePage.d.ts","sourceRoot":"","sources":["../../src/components/LogistiekEnginePage.tsx"],"names":[],"mappings":"AA8DA,wBAAgB,mBAAmB,gCAyLlC"}
1
+ {"version":3,"file":"LogistiekEnginePage.d.ts","sourceRoot":"","sources":["../../src/components/LogistiekEnginePage.tsx"],"names":[],"mappings":"AA8DA,wBAAgB,mBAAmB,gCA4OlC"}
@@ -6,7 +6,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
6
6
  // GEEN <Header /> hier — die levert de shell via staticData.title.
7
7
  // ============================================================================
8
8
  import { useState } from "react";
9
- import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, Button, Card, CardContent, CardDescription, CardHeader, CardTitle, Badge, Switch, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, Skeleton, } from "@flowselections/core";
9
+ import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, Button, Card, CardContent, CardDescription, CardHeader, CardTitle, Badge, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, Skeleton, } from "@flowselections/core";
10
10
  import { Container, Pencil, Plus, SlidersHorizontal, Trash2, Workflow } from "lucide-react";
11
11
  import { Link } from "@tanstack/react-router";
12
12
  import { StrategieDialog } from "./StrategieDialog";
@@ -32,11 +32,22 @@ const SNELKOPPELINGEN = [
32
32
  },
33
33
  ];
34
34
  export function LogistiekEnginePage() {
35
- const { items, loading, saving, error, create, update, remove, toggleActive } = useLogistiekStrategieen();
35
+ const { items, loading, saving, error, create, update, remove, setActive, clearActive } = useLogistiekStrategieen();
36
36
  const [dialogOpen, setDialogOpen] = useState(false);
37
37
  const [editing, setEditing] = useState(null);
38
38
  const [deleting, setDeleting] = useState(null);
39
+ const [switching, setSwitching] = useState(null);
39
40
  const safeItems = Array.isArray(items) ? items : [];
41
+ const actief = safeItems.find((item) => item.is_active) ?? null;
42
+ const kiesWerkwijze = (item) => {
43
+ if (item.is_active)
44
+ return;
45
+ if (actief) {
46
+ setSwitching(item);
47
+ return;
48
+ }
49
+ void setActive(item.id);
50
+ };
40
51
  const openNew = () => {
41
52
  setEditing(null);
42
53
  setDialogOpen(true);
@@ -45,9 +56,13 @@ export function LogistiekEnginePage() {
45
56
  setEditing(item);
46
57
  setDialogOpen(true);
47
58
  };
48
- return (_jsxs("main", { className: "p-6 space-y-6", children: [_jsx("p", { className: "text-sm text-muted-foreground", children: "Hier bepaal je hoe orders in je bedrijf logistiek worden afgehandeld." }), _jsx("div", { className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-3", children: SNELKOPPELINGEN.map(({ to, icon: Icon, titel, uitleg }) => (_jsx(Link, { to: to, className: "group", children: _jsx(Card, { className: "h-full transition-colors group-hover:border-primary", children: _jsxs(CardHeader, { children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsx("span", { className: "flex h-10 w-10 items-center justify-center rounded-lg bg-primary/10 text-primary", children: _jsx(Icon, { className: "h-5 w-5" }) }), _jsx(CardTitle, { className: "text-base", children: titel })] }), _jsx(CardDescription, { className: "pt-1", children: uitleg })] }) }) }, to))) }), _jsxs(Card, { children: [_jsx(CardHeader, { children: _jsxs("div", { className: "flex flex-wrap items-start justify-between gap-3", children: [_jsxs("div", { children: [_jsx(CardTitle, { children: "Werkwijzen" }), _jsx(CardDescription, { children: "Alleen een werkwijze die aan staat wordt op je orders toegepast." })] }), _jsxs(Button, { size: "sm", onClick: openNew, children: [_jsx(Plus, { className: "h-4 w-4" }), "Nieuwe werkwijze"] })] }) }), _jsx(CardContent, { children: loading ? (_jsxs("div", { className: "space-y-2", children: [_jsx(Skeleton, { className: "h-8 w-full" }), _jsx(Skeleton, { className: "h-8 w-full" }), _jsx(Skeleton, { className: "h-8 w-full" })] })) : error ? (_jsx("p", { className: "text-sm text-destructive", children: "Kon de gegevens niet ophalen. Probeer het over een moment opnieuw." })) : safeItems.length === 0 ? (_jsxs("div", { className: "space-y-3", children: [_jsx("p", { className: "text-sm text-muted-foreground", children: "Je hebt nog geen werkwijze ingesteld." }), _jsxs(Button, { variant: "outline", size: "sm", onClick: openNew, children: [_jsx(Plus, { className: "h-4 w-4" }), "Eerste werkwijze aanmaken"] })] })) : (_jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: "Naam" }), _jsx(TableHead, { children: "Status" }), _jsx(TableHead, { className: "w-48 text-right", children: "Acties" })] }) }), _jsx(TableBody, { children: safeItems.map((item) => (_jsxs(TableRow, { children: [_jsx(TableCell, { children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "h-3 w-3 shrink-0 rounded-full border border-border", style: { backgroundColor: item.color ?? "#3b82f6" } }), _jsxs("div", { children: [_jsx("p", { className: "font-medium", children: item.name ?? "—" }), item.description && (_jsx("p", { className: "text-xs text-muted-foreground", children: item.description }))] })] }) }), _jsx(TableCell, { children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Switch, { checked: !!item.is_active, onCheckedChange: () => toggleActive(item), "aria-label": "Aan of uit zetten" }), _jsx(Badge, { variant: item.is_active ? "default" : "secondary", children: item.is_active ? "Aan" : "Uit" })] }) }), _jsx(TableCell, { className: "text-right", children: _jsxs("div", { className: "flex justify-end gap-1", children: [_jsx(Button, { size: "sm", variant: "outline", asChild: true, children: _jsxs(Link, { to: "/logistiek-engine/rule-engine", search: { strategy: String(item.id), naam: item.name ?? "" }, children: [_jsx(SlidersHorizontal, { className: "h-4 w-4" }), "Instellen"] }) }), _jsx(Button, { size: "icon", variant: "ghost", onClick: () => openEdit(item), "aria-label": "Bewerken", children: _jsx(Pencil, { className: "h-4 w-4" }) }), _jsx(Button, { size: "icon", variant: "ghost", onClick: () => setDeleting(item), "aria-label": "Verwijderen", children: _jsx(Trash2, { className: "h-4 w-4" }) })] }) })] }, String(item.id)))) })] })) })] }), _jsx(StrategieDialog, { open: dialogOpen, onOpenChange: setDialogOpen, strategie: editing, saving: saving, onSubmit: (input) => (editing ? update(editing.id, input) : create(input)) }), _jsx(AlertDialog, { open: !!deleting, onOpenChange: (open) => !open && setDeleting(null), children: _jsxs(AlertDialogContent, { children: [_jsxs(AlertDialogHeader, { children: [_jsx(AlertDialogTitle, { children: "Werkwijze verwijderen?" }), _jsxs(AlertDialogDescription, { children: ["\"", deleting?.name, "\" wordt definitief verwijderd. Dit kan niet ongedaan worden gemaakt."] })] }), _jsxs(AlertDialogFooter, { children: [_jsx(AlertDialogCancel, { children: "Annuleren" }), _jsx(AlertDialogAction, { onClick: async () => {
59
+ return (_jsxs("main", { className: "p-6 space-y-6", children: [_jsx("p", { className: "text-sm text-muted-foreground", children: "Hier bepaal je hoe orders in je bedrijf logistiek worden afgehandeld." }), _jsx("div", { className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-3", children: SNELKOPPELINGEN.map(({ to, icon: Icon, titel, uitleg }) => (_jsx(Link, { to: to, className: "group", children: _jsx(Card, { className: "h-full transition-colors group-hover:border-primary", children: _jsxs(CardHeader, { children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsx("span", { className: "flex h-10 w-10 items-center justify-center rounded-lg bg-primary/10 text-primary", children: _jsx(Icon, { className: "h-5 w-5" }) }), _jsx(CardTitle, { className: "text-base", children: titel })] }), _jsx(CardDescription, { className: "pt-1", children: uitleg })] }) }) }, to))) }), _jsxs(Card, { children: [_jsx(CardHeader, { children: _jsxs("div", { className: "flex flex-wrap items-start justify-between gap-3", children: [_jsxs("div", { children: [_jsx(CardTitle, { children: "Werkwijzen" }), _jsx(CardDescription, { children: "Alleen een werkwijze die aan staat wordt op je orders toegepast." })] }), _jsxs(Button, { size: "sm", onClick: openNew, children: [_jsx(Plus, { className: "h-4 w-4" }), "Nieuwe werkwijze"] })] }) }), _jsx(CardContent, { children: loading ? (_jsxs("div", { className: "space-y-2", children: [_jsx(Skeleton, { className: "h-8 w-full" }), _jsx(Skeleton, { className: "h-8 w-full" }), _jsx(Skeleton, { className: "h-8 w-full" })] })) : error ? (_jsx("p", { className: "text-sm text-destructive", children: "Kon de gegevens niet ophalen. Probeer het over een moment opnieuw." })) : safeItems.length === 0 ? (_jsxs("div", { className: "space-y-3", children: [_jsx("p", { className: "text-sm text-muted-foreground", children: "Je hebt nog geen werkwijze ingesteld." }), _jsxs(Button, { variant: "outline", size: "sm", onClick: openNew, children: [_jsx(Plus, { className: "h-4 w-4" }), "Eerste werkwijze aanmaken"] })] })) : (_jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: "Naam" }), _jsx(TableHead, { children: "Status" }), _jsx(TableHead, { className: "w-48 text-right", children: "Acties" })] }) }), _jsx(TableBody, { children: safeItems.map((item) => (_jsxs(TableRow, { children: [_jsx(TableCell, { children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "h-3 w-3 shrink-0 rounded-full border border-border", style: { backgroundColor: item.color ?? "#3b82f6" } }), _jsxs("div", { children: [_jsx("p", { className: "font-medium", children: item.name ?? "—" }), item.description && (_jsx("p", { className: "text-xs text-muted-foreground", children: item.description }))] })] }) }), _jsx(TableCell, { children: _jsxs("div", { className: "flex items-center gap-3", children: [_jsxs("label", { className: "flex items-center gap-2 text-sm", children: [_jsx("input", { type: "radio", name: "actieve-werkwijze", className: "h-4 w-4 accent-primary", checked: !!item.is_active, disabled: saving, onChange: () => kiesWerkwijze(item), "aria-label": `${item.name ?? "Werkwijze"} als actieve werkwijze kiezen` }), _jsx("span", { className: "sr-only", children: "Actief" })] }), _jsx(Badge, { variant: item.is_active ? "default" : "secondary", children: item.is_active ? "Actief" : "Uit" }), item.is_active && (_jsx(Button, { size: "sm", variant: "ghost", disabled: saving, onClick: () => void clearActive(), children: "Uitzetten" }))] }) }), _jsx(TableCell, { className: "text-right", children: _jsxs("div", { className: "flex justify-end gap-1", children: [_jsx(Button, { size: "sm", variant: "outline", asChild: true, children: _jsxs(Link, { to: "/logistiek-engine/rule-engine", search: { strategy: String(item.id), naam: item.name ?? "" }, children: [_jsx(SlidersHorizontal, { className: "h-4 w-4" }), "Instellen"] }) }), _jsx(Button, { size: "icon", variant: "ghost", onClick: () => openEdit(item), "aria-label": "Bewerken", children: _jsx(Pencil, { className: "h-4 w-4" }) }), _jsx(Button, { size: "icon", variant: "ghost", onClick: () => setDeleting(item), "aria-label": "Verwijderen", children: _jsx(Trash2, { className: "h-4 w-4" }) })] }) })] }, String(item.id)))) })] })) })] }), _jsx(StrategieDialog, { open: dialogOpen, onOpenChange: setDialogOpen, strategie: editing, saving: saving, onSubmit: (input) => (editing ? update(editing.id, input) : create(input)) }), _jsx(AlertDialog, { open: !!deleting, onOpenChange: (open) => !open && setDeleting(null), children: _jsxs(AlertDialogContent, { children: [_jsxs(AlertDialogHeader, { children: [_jsx(AlertDialogTitle, { children: "Werkwijze verwijderen?" }), _jsxs(AlertDialogDescription, { children: ["\"", deleting?.name, "\" wordt definitief verwijderd. Dit kan niet ongedaan worden gemaakt."] })] }), _jsxs(AlertDialogFooter, { children: [_jsx(AlertDialogCancel, { children: "Annuleren" }), _jsx(AlertDialogAction, { onClick: async () => {
49
60
  if (deleting)
50
61
  await remove(deleting.id);
51
62
  setDeleting(null);
52
- }, children: "Verwijderen" })] })] }) })] }));
63
+ }, children: "Verwijderen" })] })] }) }), _jsx(AlertDialog, { open: !!switching, onOpenChange: (open) => !open && setSwitching(null), children: _jsxs(AlertDialogContent, { children: [_jsxs(AlertDialogHeader, { children: [_jsx(AlertDialogTitle, { children: "Overschakelen naar een andere werkwijze?" }), _jsxs(AlertDialogDescription, { children: ["\"", actief?.name, "\" staat nu aan. Er kan maar \u00E9\u00E9n werkwijze tegelijk actief zijn. Wil je overschakelen naar \"", switching?.name, "\"?"] })] }), _jsxs(AlertDialogFooter, { children: [_jsx(AlertDialogCancel, { children: "Annuleren" }), _jsx(AlertDialogAction, { onClick: async () => {
64
+ if (switching)
65
+ await setActive(switching.id);
66
+ setSwitching(null);
67
+ }, children: "Overschakelen" })] })] }) })] }));
53
68
  }
@@ -1 +1 @@
1
- {"version":3,"file":"StrategieDialog.d.ts","sourceRoot":"","sources":["../../src/components/StrategieDialog.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAE3F,UAAU,KAAK;IACb,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,SAAS,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACrC,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACvD;AAUD,wBAAgB,eAAe,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,KAAK,+BA4FzF"}
1
+ {"version":3,"file":"StrategieDialog.d.ts","sourceRoot":"","sources":["../../src/components/StrategieDialog.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAE3F,UAAU,KAAK;IACb,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,SAAS,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACrC,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACvD;AAUD,wBAAgB,eAAe,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,KAAK,+BA6FzF"}
@@ -34,5 +34,5 @@ export function StrategieDialog({ open, onOpenChange, strategie, saving, onSubmi
34
34
  if (ok)
35
35
  onOpenChange(false);
36
36
  };
37
- return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(DialogContent, { children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: strategie ? "Werkwijze bewerken" : "Nieuwe werkwijze" }), _jsx(DialogDescription, { children: "Geef de werkwijze een herkenbare naam en kleur." })] }), _jsxs("div", { className: "space-y-4", children: [_jsxs("div", { className: "space-y-2", children: [_jsx(Label, { children: "Naam" }), _jsx(Input, { value: form.name, onChange: (e) => set("name", e.target.value), placeholder: "Bijv. Standaard werkwijze" })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { children: "Omschrijving" }), _jsx(Textarea, { value: form.description, onChange: (e) => set("description", e.target.value), placeholder: "Waarvoor gebruik je deze werkwijze?" })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { children: "Kleur" }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Input, { type: "color", className: "h-10 w-14 p-1", value: form.color, onChange: (e) => set("color", e.target.value) }), _jsx(Input, { value: form.color, onChange: (e) => set("color", e.target.value) })] })] }), _jsxs("div", { className: "flex items-center justify-between rounded-lg border border-border p-3", children: [_jsxs("div", { className: "space-y-0.5", children: [_jsx(Label, { className: "text-sm font-medium", children: "Aan" }), _jsx("p", { className: "text-xs text-muted-foreground", children: "Alleen een werkwijze die aan staat wordt op je orders toegepast." })] }), _jsx(Switch, { checked: form.is_active, onCheckedChange: (checked) => set("is_active", checked) })] })] }), _jsxs(DialogFooter, { children: [_jsx(Button, { variant: "outline", onClick: () => onOpenChange(false), children: "Annuleren" }), _jsx(Button, { onClick: handleSubmit, disabled: saving || !form.name.trim(), children: strategie ? "Opslaan" : "Aanmaken" })] })] }) }));
37
+ return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(DialogContent, { children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: strategie ? "Werkwijze bewerken" : "Nieuwe werkwijze" }), _jsx(DialogDescription, { children: "Geef de werkwijze een herkenbare naam en kleur." })] }), _jsxs("div", { className: "space-y-4", children: [_jsxs("div", { className: "space-y-2", children: [_jsx(Label, { children: "Naam" }), _jsx(Input, { value: form.name, onChange: (e) => set("name", e.target.value), placeholder: "Bijv. Standaard werkwijze" })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { children: "Omschrijving" }), _jsx(Textarea, { value: form.description, onChange: (e) => set("description", e.target.value), placeholder: "Waarvoor gebruik je deze werkwijze?" })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { children: "Kleur" }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Input, { type: "color", className: "h-10 w-14 p-1", value: form.color, onChange: (e) => set("color", e.target.value) }), _jsx(Input, { value: form.color, onChange: (e) => set("color", e.target.value) })] })] }), _jsxs("div", { className: "flex items-center justify-between rounded-lg border border-border p-3", children: [_jsxs("div", { className: "space-y-0.5", children: [_jsx(Label, { className: "text-sm font-medium", children: "Actief" }), _jsx("p", { className: "text-xs text-muted-foreground", children: "Er kan maar \u00E9\u00E9n werkwijze tegelijk actief zijn. Zet je deze aan, dan wordt een andere actieve werkwijze automatisch uitgezet." })] }), _jsx(Switch, { checked: form.is_active, onCheckedChange: (checked) => set("is_active", checked) })] })] }), _jsxs(DialogFooter, { children: [_jsx(Button, { variant: "outline", onClick: () => onOpenChange(false), children: "Annuleren" }), _jsx(Button, { onClick: handleSubmit, disabled: saving || !form.name.trim(), children: strategie ? "Opslaan" : "Aanmaken" })] })] }) }));
38
38
  }
@@ -24,6 +24,7 @@ export declare function useLogistiekStrategieen(): {
24
24
  create: (input: StrategieInput) => Promise<boolean>;
25
25
  update: (id: string, input: Partial<StrategieInput>) => Promise<boolean>;
26
26
  remove: (id: string) => Promise<boolean>;
27
- toggleActive: (item: LogistiekStrategie) => Promise<boolean>;
27
+ setActive: (id: string) => Promise<boolean>;
28
+ clearActive: () => Promise<boolean>;
28
29
  };
29
30
  //# sourceMappingURL=useLogistiekStrategieen.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useLogistiekStrategieen.d.ts","sourceRoot":"","sources":["../../src/hooks/useLogistiekStrategieen.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;CACpB;AAID,wBAAgB,uBAAuB;;;;;;oBA6CI,cAAc;iBA0BjB,MAAM,SAAS,OAAO,CAAC,cAAc,CAAC;iBA2BtC,MAAM;yBAYnC,kBAAkB;EAK5B"}
1
+ {"version":3,"file":"useLogistiekStrategieen.d.ts","sourceRoot":"","sources":["../../src/hooks/useLogistiekStrategieen.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;CACpB;AAID,wBAAgB,uBAAuB;;;;;;oBA6CI,cAAc;iBA6BjB,MAAM,SAAS,OAAO,CAAC,cAAc,CAAC;iBAkCtC,MAAM;oBAmB/B,MAAM;;EAuDpB"}
@@ -49,6 +49,9 @@ export function useLogistiekStrategieen() {
49
49
  toast.error("Je bent niet ingelogd");
50
50
  return false;
51
51
  }
52
+ if (input.is_active) {
53
+ await db().from("logistics_strategies").update({ is_active: false }).eq("is_active", true);
54
+ }
52
55
  const { data, error } = await db()
53
56
  .from("logistics_strategies")
54
57
  .insert({ ...input, description: input.description || null, user_id: userId })
@@ -74,6 +77,13 @@ export function useLogistiekStrategieen() {
74
77
  const payload = { ...input };
75
78
  if ("description" in payload)
76
79
  payload.description = input.description || null;
80
+ if (input.is_active) {
81
+ await db()
82
+ .from("logistics_strategies")
83
+ .update({ is_active: false })
84
+ .eq("is_active", true)
85
+ .neq("id", id);
86
+ }
77
87
  const { data, error } = await db()
78
88
  .from("logistics_strategies")
79
89
  .update(payload)
@@ -106,6 +116,66 @@ export function useLogistiekStrategieen() {
106
116
  toast.success("Strategie verwijderd");
107
117
  return true;
108
118
  }, []);
109
- const toggleActive = useCallback((item) => update(item.id, { is_active: !item.is_active }), [update]);
110
- return { items, loading, saving, error, reload: load, create, update, remove, toggleActive };
119
+ const deactivateOthers = useCallback(async (exceptId) => {
120
+ let query = db().from("logistics_strategies").update({ is_active: false }).eq("is_active", true);
121
+ if (exceptId)
122
+ query = query.neq("id", exceptId);
123
+ const { error } = await query;
124
+ if (error)
125
+ throw error;
126
+ }, []);
127
+ const setActive = useCallback(async (id) => {
128
+ setSaving(true);
129
+ try {
130
+ await deactivateOthers(id);
131
+ const { error } = await db()
132
+ .from("logistics_strategies")
133
+ .update({ is_active: true })
134
+ .eq("id", id);
135
+ if (error)
136
+ throw error;
137
+ setItems((prev) => prev.map((item) => ({ ...item, is_active: item.id === id })));
138
+ toast.success("Werkwijze is nu actief");
139
+ return true;
140
+ }
141
+ catch (e) {
142
+ toast.error(String(e?.message ?? "").includes("one_active_per_user")
143
+ ? "Er kan maar één werkwijze tegelijk actief zijn. Probeer het opnieuw."
144
+ : "Wisselen van werkwijze is niet gelukt");
145
+ await load();
146
+ return false;
147
+ }
148
+ finally {
149
+ setSaving(false);
150
+ }
151
+ }, [deactivateOthers, load]);
152
+ const clearActive = useCallback(async () => {
153
+ setSaving(true);
154
+ try {
155
+ await deactivateOthers();
156
+ setItems((prev) => prev.map((item) => ({ ...item, is_active: false })));
157
+ toast.success("Geen werkwijze meer actief");
158
+ return true;
159
+ }
160
+ catch {
161
+ toast.error("Uitzetten is niet gelukt");
162
+ await load();
163
+ return false;
164
+ }
165
+ finally {
166
+ setSaving(false);
167
+ }
168
+ }, [deactivateOthers, load]);
169
+ return {
170
+ items,
171
+ loading,
172
+ saving,
173
+ error,
174
+ reload: load,
175
+ create,
176
+ update,
177
+ remove,
178
+ setActive,
179
+ clearActive,
180
+ };
111
181
  }