@flowselections/logistiek-engine 1.0.24 → 1.0.26

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 (56) hide show
  1. package/README.md +24 -24
  2. package/dist-lib/components/ConsistentieCard.d.ts +2 -0
  3. package/dist-lib/components/ConsistentieCard.d.ts.map +1 -0
  4. package/dist-lib/components/ConsistentieCard.js +38 -0
  5. package/dist-lib/components/LogistiekEnginePage.d.ts.map +1 -1
  6. package/dist-lib/components/LogistiekEnginePage.js +8 -2
  7. package/dist-lib/components/ModulePromptsPage.d.ts.map +1 -1
  8. package/dist-lib/components/ModulePromptsPage.js +11 -3
  9. package/dist-lib/components/RegiePage.d.ts.map +1 -1
  10. package/dist-lib/components/RegiePage.js +3 -2
  11. package/dist-lib/index.d.ts +1 -0
  12. package/dist-lib/index.d.ts.map +1 -1
  13. package/dist-lib/index.js +1 -0
  14. package/dist-lib/integrations/supabase/auth-middleware.d.ts +1333 -775
  15. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  16. package/dist-lib/integrations/supabase/client.server.d.ts +1333 -775
  17. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  18. package/dist-lib/integrations/supabase/client.server.js +1 -1
  19. package/dist-lib/integrations/supabase/moduleClient.d.ts +1333 -775
  20. package/dist-lib/integrations/supabase/moduleClient.d.ts.map +1 -1
  21. package/dist-lib/integrations/supabase/types.d.ts +1346 -806
  22. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  23. package/dist-lib/lib/floridayDocuments.functions.d.ts +3510 -1836
  24. package/dist-lib/lib/floridayDocuments.functions.d.ts.map +1 -1
  25. package/dist-lib/lib/floridayPush.functions.d.ts +1333 -775
  26. package/dist-lib/lib/floridayPush.functions.d.ts.map +1 -1
  27. package/dist-lib/lib/handlers/logistics-tick.server.d.ts.map +1 -1
  28. package/dist-lib/lib/handlers/logistics-tick.server.js +11 -0
  29. package/dist-lib/lib/loadCarrierPlanner.d.ts +6 -0
  30. package/dist-lib/lib/loadCarrierPlanner.d.ts.map +1 -1
  31. package/dist-lib/lib/loadCarrierPlanner.js +3 -0
  32. package/dist-lib/lib/loadCarrierPlanning.functions.d.ts +5855 -3090
  33. package/dist-lib/lib/loadCarrierPlanning.functions.d.ts.map +1 -1
  34. package/dist-lib/lib/loadCarrierPlanning.server.d.ts.map +1 -1
  35. package/dist-lib/lib/loadCarrierPlanning.server.js +3 -0
  36. package/dist-lib/lib/logisticsPlanner.d.ts +2 -0
  37. package/dist-lib/lib/logisticsPlanner.d.ts.map +1 -1
  38. package/dist-lib/lib/logisticsPlanner.js +52 -13
  39. package/dist-lib/lib/logisticsRecalcJob.functions.d.ts +2340 -1224
  40. package/dist-lib/lib/logisticsRecalcJob.functions.d.ts.map +1 -1
  41. package/dist-lib/lib/logisticsRecalculate.functions.d.ts +1333 -775
  42. package/dist-lib/lib/logisticsRecalculate.functions.d.ts.map +1 -1
  43. package/dist-lib/lib/modulePrompts.d.ts +19 -3
  44. package/dist-lib/lib/modulePrompts.d.ts.map +1 -1
  45. package/dist-lib/lib/modulePrompts.js +1664 -1141
  46. package/dist-lib/lib/ruleEngineSchema.d.ts.map +1 -1
  47. package/dist-lib/lib/ruleEngineSchema.js +21 -4
  48. package/dist-lib/lib/ruleEngineWizard.d.ts.map +1 -1
  49. package/dist-lib/lib/ruleEngineWizard.js +3 -1
  50. package/package.json +1 -1
  51. package/dist-lib/components/rule-engine/FloridayConnectionBanner.d.ts +0 -2
  52. package/dist-lib/components/rule-engine/FloridayConnectionBanner.d.ts.map +0 -1
  53. package/dist-lib/components/rule-engine/FloridayConnectionBanner.js +0 -41
  54. package/dist-lib/integrations/supabase/client.d.ts +0 -20293
  55. package/dist-lib/integrations/supabase/client.d.ts.map +0 -1
  56. package/dist-lib/integrations/supabase/client.js +0 -13
package/README.md CHANGED
@@ -1,24 +1,24 @@
1
- # logistiek Engine
2
-
3
- blank project start
4
-
5
- This project was built with [Lovable](https://lovable.dev).
6
-
7
- ## Build with Lovable
8
-
9
- Continue developing this project in the [Lovable editor](https://lovable.dev/projects/316ec9c5-0f01-408a-b7ec-3d4dccf9b65d).
10
-
11
- - **Ship faster**: describe what you want to build and Lovable handles the code.
12
- - **Stay in sync**: every change made in Lovable is committed straight to this repository.
13
- - **Full ownership**: this code is yours. Push to `main` on GitHub and your changes sync back into Lovable, ready for your next prompt.
14
-
15
- ## Development
16
-
17
- Prefer working locally? You need Node.js and npm — [install with nvm](https://github.com/nvm-sh/nvm#installing-and-updating).
18
-
19
- ```sh
20
- git clone <this-repository-url>
21
- cd <repository-name>
22
- npm i
23
- npm run dev
24
- ```
1
+ # logistiek Engine
2
+
3
+ blank project start
4
+
5
+ This project was built with [Lovable](https://lovable.dev).
6
+
7
+ ## Build with Lovable
8
+
9
+ Continue developing this project in the [Lovable editor](https://lovable.dev/projects/316ec9c5-0f01-408a-b7ec-3d4dccf9b65d).
10
+
11
+ - **Ship faster**: describe what you want to build and Lovable handles the code.
12
+ - **Stay in sync**: every change made in Lovable is committed straight to this repository.
13
+ - **Full ownership**: this code is yours. Push to `main` on GitHub and your changes sync back into Lovable, ready for your next prompt.
14
+
15
+ ## Development
16
+
17
+ Prefer working locally? You need Node.js and npm — [install with nvm](https://github.com/nvm-sh/nvm#installing-and-updating).
18
+
19
+ ```sh
20
+ git clone <this-repository-url>
21
+ cd <repository-name>
22
+ npm i
23
+ npm run dev
24
+ ```
@@ -0,0 +1,2 @@
1
+ export declare function ConsistentieCard(): import("react").JSX.Element;
2
+ //# sourceMappingURL=ConsistentieCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConsistentieCard.d.ts","sourceRoot":"","sources":["../../src/components/ConsistentieCard.tsx"],"names":[],"mappings":"AAoCA,wBAAgB,gBAAgB,gCAgF/B"}
@@ -0,0 +1,38 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ // ============================================================================
3
+ // src/components/ConsistentieCard.tsx — één waarheid bewaken
4
+ // ============================================================================
5
+ // Zet de karrentelling van elk venster naast elkaar: pick agenda, lever agenda,
6
+ // controle, picking station en verkoop. Wijkt er één af, dan is dat hier meteen
7
+ // zichtbaar. Alles komt uit public.logistics_consistency_check().
8
+ // GEEN <Header /> hier — die levert de shell.
9
+ // ============================================================================
10
+ import { useCallback, useEffect, useState } from "react";
11
+ import { Badge, Button, Card, CardContent, CardDescription, CardHeader, CardTitle, Skeleton, supabase, } from "@flowselections/core";
12
+ import { RefreshCw, Scale } from "lucide-react";
13
+ export function ConsistentieCard() {
14
+ const [check, setCheck] = useState(null);
15
+ const [loading, setLoading] = useState(true);
16
+ const laden = useCallback(async () => {
17
+ setLoading(true);
18
+ const { data } = await supabase.rpc("logistics_consistency_check");
19
+ const rows = Array.isArray(data) ? data : [];
20
+ setCheck(rows[0] ?? null);
21
+ setLoading(false);
22
+ }, []);
23
+ useEffect(() => {
24
+ void laden();
25
+ }, [laden]);
26
+ const vensters = check
27
+ ? [
28
+ { label: "Pick agenda", waarde: check.agenda_carts },
29
+ { label: "Controle karren", waarde: check.control_carts },
30
+ { label: "Picking station", waarde: check.station_carts },
31
+ { label: "Verkoop", waarde: check.sales_carts },
32
+ { label: "Karindex (bron)", waarde: check.raw_carts },
33
+ { label: "Lever agenda (vandaag leveren)", waarde: check.delivery_carts },
34
+ { label: "Aangemeld in pickwachtrij", waarde: check.announced_carts },
35
+ ]
36
+ : [];
37
+ return (_jsxs(Card, { children: [_jsxs(CardHeader, { className: "flex flex-row items-start justify-between gap-4", children: [_jsxs("div", { children: [_jsxs(CardTitle, { className: "flex items-center gap-2", children: [_jsx(Scale, { className: "h-5 w-5 text-primary" }), "Zelfde cijfers in elke module"] }), _jsx(CardDescription, { children: "Karren van vandaag per venster. Alle vensters horen hetzelfde te tellen; de lever agenda telt alleen wat vandaag geleverd wordt." })] }), _jsx(Button, { variant: "outline", size: "sm", onClick: () => void laden(), disabled: loading, children: _jsx(RefreshCw, { className: `h-4 w-4 ${loading ? "animate-spin" : ""}` }) })] }), _jsx(CardContent, { className: "space-y-4", children: loading && !check ? (_jsx(Skeleton, { className: "h-24 w-full" })) : !check ? (_jsx("p", { className: "text-muted-foreground text-sm", children: "Geen meting beschikbaar." })) : (_jsxs(_Fragment, { children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx(Badge, { variant: check.ok ? "default" : "destructive", children: check.ok ? "Alles gelijk" : "Afwijking gevonden" }), check.orphan_tasks > 0 ? (_jsxs(Badge, { variant: "destructive", children: [check.orphan_tasks, " weestaken"] })) : null, _jsxs("span", { className: "text-muted-foreground text-xs", children: ["Peildag ", check.pick_date] })] }), _jsx("div", { className: "grid gap-3 sm:grid-cols-2 lg:grid-cols-4", children: vensters.map((v) => (_jsxs("div", { className: "rounded-lg border p-3", children: [_jsx("div", { className: "text-muted-foreground text-xs", children: v.label }), _jsx("div", { className: "text-2xl font-semibold tabular-nums", children: v.waarde })] }, v.label))) }), !check.ok ? (_jsx("p", { className: "text-muted-foreground text-sm", children: "E\u00E9n of meer modules tellen anders. Controleer of die module de laatste koppelprompt heeft toegepast; de Engine corrigeert niets zelf." })) : null] })) })] }));
38
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"LogistiekEnginePage.d.ts","sourceRoot":"","sources":["../../src/components/LogistiekEnginePage.tsx"],"names":[],"mappings":"AA8DA,wBAAgB,mBAAmB,gCA4OlC"}
1
+ {"version":3,"file":"LogistiekEnginePage.d.ts","sourceRoot":"","sources":["../../src/components/LogistiekEnginePage.tsx"],"names":[],"mappings":"AAoEA,wBAAgB,mBAAmB,gCA4OlC"}
@@ -7,7 +7,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
7
7
  // ============================================================================
8
8
  import { useState } from "react";
9
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
- import { Container, Pencil, Plus, SlidersHorizontal, Trash2, Workflow } from "lucide-react";
10
+ import { Container, Pencil, Plus, Puzzle, SlidersHorizontal, Trash2, Workflow } from "lucide-react";
11
11
  import { Link } from "@tanstack/react-router";
12
12
  import { StrategieDialog } from "./StrategieDialog";
13
13
  import { useLogistiekStrategieen, } from "../hooks/useLogistiekStrategieen";
@@ -30,6 +30,12 @@ const SNELKOPPELINGEN = [
30
30
  titel: "Ladingdragers",
31
31
  uitleg: "Beheer karren, dozen en andere ladingdragers.",
32
32
  },
33
+ {
34
+ to: "/logistiek-engine/modules",
35
+ icon: Puzzle,
36
+ titel: "Modules",
37
+ uitleg: "Koppelprompts voor aangesloten modules bekijken en downloaden.",
38
+ },
33
39
  ];
34
40
  export function LogistiekEnginePage() {
35
41
  const { items, loading, saving, error, create, update, remove, setActive, clearActive } = useLogistiekStrategieen();
@@ -56,7 +62,7 @@ export function LogistiekEnginePage() {
56
62
  setEditing(item);
57
63
  setDialogOpen(true);
58
64
  };
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 () => {
65
+ 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-3 sm:grid-cols-2 lg:grid-cols-4", 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, { className: "p-4", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "flex h-8 w-8 shrink-0 items-center justify-center rounded-md bg-primary/10 text-primary", children: _jsx(Icon, { className: "h-4 w-4" }) }), _jsx(CardTitle, { className: "text-sm font-semibold leading-tight", children: titel })] }), _jsx(CardDescription, { className: "pt-1 text-xs leading-relaxed", 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 () => {
60
66
  if (deleting)
61
67
  await remove(deleting.id);
62
68
  setDeleting(null);
@@ -1 +1 @@
1
- {"version":3,"file":"ModulePromptsPage.d.ts","sourceRoot":"","sources":["../../src/components/ModulePromptsPage.tsx"],"names":[],"mappings":"AAkDA,wBAAgB,iBAAiB,gCAiJhC"}
1
+ {"version":3,"file":"ModulePromptsPage.d.ts","sourceRoot":"","sources":["../../src/components/ModulePromptsPage.tsx"],"names":[],"mappings":"AAkDA,wBAAgB,iBAAiB,gCA0LhC"}
@@ -33,7 +33,9 @@ async function copyText(content) {
33
33
  export function ModulePromptsPage() {
34
34
  const [open, setOpen] = useState(null);
35
35
  const [copied, setCopied] = useState(null);
36
+ const [openModules, setOpenModules] = useState([]);
36
37
  const prompts = Array.isArray(MODULE_PROMPTS) ? MODULE_PROMPTS : [];
38
+ const toggleModule = (key) => setOpenModules((prev) => prev.includes(key) ? prev.filter((k) => k !== key) : [...prev, key]);
37
39
  const handleCopy = async (key, content) => {
38
40
  const ok = await copyText(content);
39
41
  if (ok) {
@@ -45,14 +47,20 @@ export function ModulePromptsPage() {
45
47
  toast.error("Kopiëren mislukt", { description: "Gebruik de downloadknop." });
46
48
  }
47
49
  };
48
- return (_jsxs("div", { className: "space-y-6 p-6", children: [_jsxs("div", { className: "flex flex-wrap items-start justify-between gap-4", children: [_jsxs("div", { children: [_jsxs("h1", { className: "flex items-center gap-2 text-2xl font-semibold tracking-tight", children: [_jsx(Puzzle, { className: "h-6 w-6 text-primary" }), "Modules"] }), _jsx("p", { className: "text-muted-foreground text-sm", children: "Koppelprompts voor de modules die op de Logistics Engine worden aangesloten. Kopieer of download de prompt en plak hem in het betreffende project." })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Button, { variant: "outline", asChild: true, children: _jsx(Link, { to: "/logistiek-engine", children: "Terug naar strategie\u00EBn" }) }), _jsxs(Button, { onClick: () => downloadMarkdown("logistics-engine-module-prompts.md", buildAllModulePrompts()), children: [_jsx(Download, { className: "mr-2 h-4 w-4" }), "Alles downloaden"] })] })] }), _jsx("p", { className: "text-muted-foreground text-sm", children: "Per module staan de prompts op volgorde. Nieuwe eisen komen er altijd als nieuwe prompt bij \u2014 eerdere prompts blijven geldig en worden niet herschreven. Stuur dus alleen de prompt(s) door die je nog niet hebt verstuurd." }), _jsx("div", { className: "space-y-4", children: prompts.map((prompt) => {
50
+ return (_jsxs("div", { className: "space-y-6 p-6", children: [_jsxs("div", { className: "flex flex-wrap items-start justify-between gap-4", children: [_jsxs("div", { children: [_jsxs("h1", { className: "flex items-center gap-2 text-2xl font-semibold tracking-tight", children: [_jsx(Puzzle, { className: "h-6 w-6 text-primary" }), "Modules"] }), _jsx("p", { className: "text-muted-foreground text-sm", children: "Koppelprompts voor de modules die op de Logistics Engine worden aangesloten. Kopieer of download de prompt en plak hem in het betreffende project." })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Button, { variant: "outline", asChild: true, children: _jsx(Link, { to: "/logistiek-engine", children: "Terug naar strategie\u00EBn" }) }), _jsx(Button, { variant: "outline", onClick: () => setOpenModules((prev) => prev.length === prompts.length ? [] : prompts.map((p) => p.moduleKey)), children: openModules.length === prompts.length ? "Alles inklappen" : "Alles uitklappen" }), _jsxs(Button, { onClick: () => downloadMarkdown("logistics-engine-module-prompts.md", buildAllModulePrompts()), children: [_jsx(Download, { className: "mr-2 h-4 w-4" }), "Alles downloaden"] })] })] }), _jsx("p", { className: "text-muted-foreground text-sm", children: "Per module staan de prompts op volgorde. Nieuwe eisen komen er altijd als nieuwe prompt bij \u2014 eerdere prompts blijven geldig en worden niet herschreven. Stuur dus alleen de prompt(s) door die je nog niet hebt verstuurd." }), _jsx("div", { className: "space-y-4", children: prompts.map((prompt) => {
49
51
  const key = prompt.moduleKey;
50
52
  const revisions = Array.isArray(prompt.revisions) ? prompt.revisions : [];
51
- return (_jsxs(Card, { children: [_jsx(CardHeader, { children: _jsxs("div", { className: "space-y-1", children: [_jsxs(CardTitle, { className: "flex items-center gap-2 text-base", children: [_jsxs("span", { className: "text-muted-foreground", children: [prompt.order, "."] }), prompt.label, _jsx(Badge, { variant: "outline", className: "font-mono text-[10px]", children: key }), _jsxs(Badge, { variant: "secondary", className: "text-[10px]", children: [revisions.length, " prompt", revisions.length === 1 ? "" : "s"] })] }), _jsx(CardDescription, { children: prompt.summary })] }) }), _jsx(CardContent, { className: "space-y-3", children: revisions.map((rev) => {
53
+ const moduleOpen = openModules.includes(key);
54
+ return (_jsxs(Card, { children: [_jsx(CardHeader, { role: "button", tabIndex: 0, onClick: () => toggleModule(key), onKeyDown: (e) => {
55
+ if (e.key === "Enter" || e.key === " ") {
56
+ e.preventDefault();
57
+ toggleModule(key);
58
+ }
59
+ }, className: "hover:bg-muted/40 cursor-pointer rounded-t-xl transition-colors", children: _jsxs("div", { className: "flex items-start gap-3", children: [_jsxs("div", { className: "flex-1 space-y-1", children: [_jsxs(CardTitle, { className: "flex flex-wrap items-center gap-2 text-base", children: [_jsxs("span", { className: "text-muted-foreground", children: [prompt.order, "."] }), prompt.label, _jsx(Badge, { variant: "outline", className: "font-mono text-[10px]", children: key }), _jsxs(Badge, { variant: "secondary", className: "text-[10px]", children: [revisions.length, " prompt", revisions.length === 1 ? "" : "s"] })] }), _jsx(CardDescription, { children: prompt.summary })] }), moduleOpen ? (_jsx(ChevronUp, { className: "text-muted-foreground mt-1 h-5 w-5 shrink-0" })) : (_jsx(ChevronDown, { className: "text-muted-foreground mt-1 h-5 w-5 shrink-0" }))] }) }), moduleOpen && (_jsx(CardContent, { className: "space-y-3", children: revisions.map((rev) => {
52
60
  const revKey = `${key}-${rev.number}`;
53
61
  const full = buildRevisionPrompt(prompt, rev);
54
62
  const isOpen = open === revKey;
55
63
  return (_jsxs("div", { className: "rounded-lg border p-3", children: [_jsxs("div", { className: "flex flex-wrap items-start justify-between gap-3", children: [_jsxs("div", { className: "space-y-1", children: [_jsxs("div", { className: "flex items-center gap-2 text-sm font-medium", children: [_jsxs(Badge, { variant: "outline", className: "text-[10px]", children: ["Prompt ", rev.number] }), rev.title, _jsx("span", { className: "text-muted-foreground text-xs font-normal", children: rev.date })] }), _jsx("p", { className: "text-muted-foreground text-xs", children: rev.summary })] }), _jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsxs(Button, { variant: "ghost", size: "sm", onClick: () => setOpen(isOpen ? null : revKey), children: [isOpen ? (_jsx(ChevronUp, { className: "mr-2 h-4 w-4" })) : (_jsx(ChevronDown, { className: "mr-2 h-4 w-4" })), isOpen ? "Verbergen" : "Bekijken"] }), _jsxs(Button, { variant: "outline", size: "sm", onClick: () => void handleCopy(revKey, full), children: [copied === revKey ? (_jsx(Check, { className: "mr-2 h-4 w-4" })) : (_jsx(Copy, { className: "mr-2 h-4 w-4" })), "Kopi\u00EBren"] }), _jsxs(Button, { variant: "outline", size: "sm", onClick: () => downloadMarkdown(modulePromptFilename(key, rev.number), full), children: [_jsx(Download, { className: "mr-2 h-4 w-4" }), "Download"] })] })] }), isOpen && (_jsx("pre", { className: "bg-muted text-foreground mt-3 max-h-96 overflow-auto rounded-md p-4 text-xs leading-relaxed whitespace-pre-wrap", children: full }))] }, revKey));
56
- }) })] }, key));
64
+ }) }))] }, key));
57
65
  }) })] }));
58
66
  }
@@ -1 +1 @@
1
- {"version":3,"file":"RegiePage.d.ts","sourceRoot":"","sources":["../../src/components/RegiePage.tsx"],"names":[],"mappings":"AAuEA,wBAAgB,SAAS,gCA+WxB"}
1
+ {"version":3,"file":"RegiePage.d.ts","sourceRoot":"","sources":["../../src/components/RegiePage.tsx"],"names":[],"mappings":"AAyEA,wBAAgB,SAAS,gCA4XxB"}
@@ -17,6 +17,7 @@ import { VertragingMeldingenCard } from "./VertragingMeldingenCard";
17
17
  import { CapaciteitMeldingenCard } from "./CapaciteitMeldingenCard";
18
18
  import { FloridayPushCard } from "./FloridayPushCard";
19
19
  import { PrintjobsCard } from "./PrintjobsCard";
20
+ import { ConsistentieCard } from "./ConsistentieCard";
20
21
  import { LOGISTICS_MODULES, TASK_LABEL, TASK_STATUS_LABEL, } from "../lib/logisticsTasks";
21
22
  function tijd(value) {
22
23
  if (!value)
@@ -73,10 +74,10 @@ export function RegiePage() {
73
74
  }
74
75
  return counts;
75
76
  }, [safeTaken]);
76
- return (_jsxs("div", { className: "space-y-6 p-6", children: [_jsxs("div", { className: "flex flex-wrap items-start justify-between gap-4", children: [_jsxs("div", { children: [_jsxs("h1", { className: "flex items-center gap-2 text-2xl font-semibold tracking-tight", children: [_jsx(Workflow, { className: "h-6 w-6 text-primary" }), "Overzicht & meldingen"] }), _jsx("p", { className: "text-muted-foreground text-sm", children: "Wat er vandaag klaarstaat en waar aandacht voor nodig is." })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Button, { variant: "outline", asChild: true, children: _jsx(Link, { to: "/logistiek-engine", children: "Terug naar overzicht" }) }), _jsxs(Button, { variant: "outline", onClick: () => void laden(), disabled: loading, children: [_jsx(RefreshCw, { className: "mr-2 h-4 w-4" }), "Vernieuwen"] })] })] }), _jsx("div", { className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-3", children: Object.keys(LOGISTICS_MODULES).map((key) => (_jsxs(Card, { children: [_jsxs(CardHeader, { className: "pb-2", children: [_jsx(CardDescription, { children: LOGISTICS_MODULES[key] }), _jsx(CardTitle, { className: "text-2xl", children: perModule[key] ?? 0 })] }), _jsx(CardContent, { className: "text-muted-foreground text-xs", children: "openstaande en geplande taken" })] }, key))) }), _jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { children: "Taken per order" }), _jsx(CardDescription, { children: "Elke order krijgt bij binnenkomst meteen de volledige keten aan taken toegewezen." }), _jsxs("div", { className: "pt-2", children: [_jsx(Label, { htmlFor: "regie-filter", className: "sr-only", children: "Zoeken" }), _jsx(Input, { id: "regie-filter", placeholder: "Zoek op ordernummer, taaktype of module\u2026", value: filter, onChange: (e) => setFilter(e.target.value), className: "max-w-sm" })] })] }), _jsx(CardContent, { className: "space-y-6", children: loading ? (_jsxs("div", { className: "space-y-2", children: [_jsx(Skeleton, { className: "h-10 w-full" }), _jsx(Skeleton, { className: "h-10 w-full" }), _jsx(Skeleton, { className: "h-10 w-full" })] })) : perOrder.length === 0 ? (_jsxs("p", { className: "text-muted-foreground py-8 text-center text-sm", children: ["Nog geen taken. Zodra een module een melding wegschrijft in", " ", _jsx("code", { className: "bg-muted rounded px-1", children: "logistics_events" }), " maakt de database de keten meteen aan."] })) : (perOrder.map(([orderRef, orderTaken]) => {
77
+ return (_jsxs("div", { className: "space-y-6 p-6", children: [_jsxs("div", { className: "flex flex-wrap items-start justify-between gap-4", children: [_jsxs("div", { children: [_jsxs("h1", { className: "flex items-center gap-2 text-2xl font-semibold tracking-tight", children: [_jsx(Workflow, { className: "h-6 w-6 text-primary" }), "Overzicht & meldingen"] }), _jsx("p", { className: "text-muted-foreground text-sm", children: "Wat er vandaag klaarstaat en waar aandacht voor nodig is." })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Button, { variant: "outline", asChild: true, children: _jsx(Link, { to: "/logistiek-engine", children: "Terug naar overzicht" }) }), _jsxs(Button, { variant: "outline", onClick: () => void laden(), disabled: loading, children: [_jsx(RefreshCw, { className: "mr-2 h-4 w-4" }), "Vernieuwen"] })] })] }), _jsx(ConsistentieCard, {}), _jsx("div", { className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-3", children: Object.keys(LOGISTICS_MODULES).map((key) => (_jsxs(Card, { children: [_jsxs(CardHeader, { className: "pb-2", children: [_jsx(CardDescription, { children: LOGISTICS_MODULES[key] }), _jsx(CardTitle, { className: "text-2xl", children: perModule[key] ?? 0 })] }), _jsx(CardContent, { className: "text-muted-foreground text-xs", children: "openstaande en geplande taken" })] }, key))) }), _jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { children: "Taken per order" }), _jsx(CardDescription, { children: "Elke order krijgt bij binnenkomst meteen de volledige keten aan taken toegewezen." }), _jsxs("div", { className: "pt-2", children: [_jsx(Label, { htmlFor: "regie-filter", className: "sr-only", children: "Zoeken" }), _jsx(Input, { id: "regie-filter", placeholder: "Zoek op ordernummer, taaktype of module\u2026", value: filter, onChange: (e) => setFilter(e.target.value), className: "max-w-sm" })] })] }), _jsx(CardContent, { className: "space-y-6", children: loading ? (_jsxs("div", { className: "space-y-2", children: [_jsx(Skeleton, { className: "h-10 w-full" }), _jsx(Skeleton, { className: "h-10 w-full" }), _jsx(Skeleton, { className: "h-10 w-full" })] })) : perOrder.length === 0 ? (_jsxs("p", { className: "text-muted-foreground py-8 text-center text-sm", children: ["Nog geen taken. Zodra een module een melding wegschrijft in", " ", _jsx("code", { className: "bg-muted rounded px-1", children: "logistics_events" }), " maakt de database de keten meteen aan."] })) : (perOrder.map(([orderRef, orderTaken]) => {
77
78
  const spoed = orderTaken.some((t) => (t.priority ?? 0) > 0);
78
79
  const actief = orderTaken.some((t) => t.status !== "cancelled" && t.status !== "done" && t.status !== "superseded");
79
- return (_jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-2", children: [_jsxs("h2", { className: "flex items-center gap-2 font-medium", children: ["Order ", orderRef, _jsxs("span", { className: "text-muted-foreground text-xs font-normal", children: [orderTaken.length, " taken"] }), spoed && (_jsx(Badge, { variant: "destructive", className: "text-[10px]", children: "spoed" }))] }), _jsxs("div", { className: "flex items-center gap-1", children: [_jsxs(Button, { variant: "outline", size: "sm", onClick: () => void zetPrioriteit(orderRef, spoed ? 0 : 100), children: [_jsx(ArrowUpCircle, { className: "mr-1 h-4 w-4" }), spoed ? "Normaal" : "Spoed"] }), actief && (_jsxs(Button, { variant: "outline", size: "sm", onClick: () => void annuleerOrder(orderRef), children: [_jsx(Ban, { className: "mr-1 h-4 w-4" }), "Annuleren"] })), _jsx(Button, { variant: "ghost", size: "sm", onClick: () => void verwijderOrder(orderRef), children: _jsx(Trash2, { className: "h-4 w-4" }) })] })] }), _jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { className: "w-12", children: "#" }), _jsx(TableHead, { children: "Taak" }), _jsx(TableHead, { children: "Module" }), _jsx(TableHead, { children: "Start" }), _jsx(TableHead, { children: "Gereed" }), _jsx(TableHead, { children: "Status" }), _jsx(TableHead, { className: "text-right", children: "Actie" })] }) }), _jsx(TableBody, { children: orderTaken.map((t) => (_jsxs(TableRow, { children: [_jsx(TableCell, { className: "text-muted-foreground", children: t.sequence + 1 }), _jsxs(TableCell, { className: "font-medium", children: [TASK_LABEL[t.task_type] ?? t.task_type, t.shadow && (_jsx(Badge, { variant: "outline", className: "ml-2 text-[10px]", children: "schaduw" }))] }), _jsx(TableCell, { className: "text-sm", children: LOGISTICS_MODULES[t.owner_module] ?? t.owner_module }), _jsx(TableCell, { className: "text-sm", children: tijd(t.planned_start) }), _jsx(TableCell, { className: "text-sm", children: tijd(t.planned_end) }), _jsxs(TableCell, { children: [_jsx(Badge, { variant: statusVariant(t.status), children: TASK_STATUS_LABEL[t.status] ?? t.status }), t.claimed_by && (t.status === "claimed" || t.status === "in_progress") && (_jsxs("span", { className: "text-muted-foreground ml-2 text-xs", children: ["door ", t.claimed_by] })), t.error && _jsx("span", { className: "text-destructive ml-2 text-xs", children: t.error })] }), _jsxs(TableCell, { className: "space-x-1 text-right", children: [t.status === "planned" && (_jsx(Button, { variant: "outline", size: "sm", onClick: () => void claimTaak(t.id), children: "Claimen" })), (t.status === "claimed" || t.status === "in_progress") && (_jsxs(_Fragment, { children: [_jsx(Button, { variant: "outline", size: "sm", onClick: () => void rondTaakAf(t.id), children: "Afronden" }), _jsx(Button, { variant: "ghost", size: "sm", onClick: () => void meldTaakMislukt(t.id, "Handmatig gemeld vanuit regieoverzicht"), children: "Mislukt" })] }))] })] }, t.id))) })] })] }, orderRef));
80
+ return (_jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-2", children: [_jsxs("h2", { className: "flex items-center gap-2 font-medium", children: ["Order ", orderRef, _jsxs("span", { className: "text-muted-foreground text-xs font-normal", children: [orderTaken.length, " taken"] }), spoed && (_jsx(Badge, { variant: "destructive", className: "text-[10px]", children: "spoed" }))] }), _jsxs("div", { className: "flex items-center gap-1", children: [_jsxs(Button, { variant: "outline", size: "sm", onClick: () => void zetPrioriteit(orderRef, spoed ? 0 : 100), children: [_jsx(ArrowUpCircle, { className: "mr-1 h-4 w-4" }), spoed ? "Normaal" : "Spoed"] }), actief && (_jsxs(Button, { variant: "outline", size: "sm", onClick: () => void annuleerOrder(orderRef), children: [_jsx(Ban, { className: "mr-1 h-4 w-4" }), "Annuleren"] })), _jsx(Button, { variant: "ghost", size: "sm", onClick: () => void verwijderOrder(orderRef), children: _jsx(Trash2, { className: "h-4 w-4" }) })] })] }), _jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { className: "w-12", children: "#" }), _jsx(TableHead, { children: "Taak" }), _jsx(TableHead, { children: "Module" }), _jsx(TableHead, { children: "Start" }), _jsx(TableHead, { children: "Gereed" }), _jsx(TableHead, { children: "Status" }), _jsx(TableHead, { className: "text-right", children: "Actie" })] }) }), _jsx(TableBody, { children: orderTaken.map((t) => (_jsxs(TableRow, { children: [_jsx(TableCell, { className: "text-muted-foreground", children: t.sequence + 1 }), _jsxs(TableCell, { className: "font-medium", children: [TASK_LABEL[t.task_type] ?? t.task_type, t.shadow && (_jsx(Badge, { variant: "outline", className: "ml-2 text-[10px]", children: "schaduw" }))] }), _jsx(TableCell, { className: "text-sm", children: LOGISTICS_MODULES[t.owner_module] ?? t.owner_module }), _jsxs(TableCell, { className: "text-sm", children: [tijd(t.planned_start), t.payload?.["pickWindowShifted"] === true && (_jsx(Badge, { variant: "outline", className: "ml-2 text-[10px]", title: "Het berekende moment lag in het verleden; deze taak is naar nu verschoven.", children: "te laat aangemeld" }))] }), _jsx(TableCell, { className: "text-sm", children: tijd(t.planned_end) }), _jsxs(TableCell, { children: [_jsx(Badge, { variant: statusVariant(t.status), children: TASK_STATUS_LABEL[t.status] ?? t.status }), t.claimed_by && (t.status === "claimed" || t.status === "in_progress") && (_jsxs("span", { className: "text-muted-foreground ml-2 text-xs", children: ["door ", t.claimed_by] })), t.error && _jsx("span", { className: "text-destructive ml-2 text-xs", children: t.error })] }), _jsxs(TableCell, { className: "space-x-1 text-right", children: [t.status === "planned" && (_jsx(Button, { variant: "outline", size: "sm", onClick: () => void claimTaak(t.id), children: "Claimen" })), (t.status === "claimed" || t.status === "in_progress") && (_jsxs(_Fragment, { children: [_jsx(Button, { variant: "outline", size: "sm", onClick: () => void rondTaakAf(t.id), children: "Afronden" }), _jsx(Button, { variant: "ghost", size: "sm", onClick: () => void meldTaakMislukt(t.id, "Handmatig gemeld vanuit regieoverzicht"), children: "Mislukt" })] }))] })] }, t.id))) })] })] }, orderRef));
80
81
  })) })] }), _jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { children: "Planrondes" }), _jsx(CardDescription, { children: "Elke keer dat de Engine (her)plande, met welke regelversie." })] }), _jsx(CardContent, { children: safeRuns.length === 0 ? (_jsx("p", { className: "text-muted-foreground text-sm", children: "Nog geen planrondes." })) : (_jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: "Moment" }), _jsx(TableHead, { children: "Order" }), _jsx(TableHead, { children: "Aanleiding" }), _jsx(TableHead, { children: "Bron" }), _jsx(TableHead, { children: "Regelversie" }), _jsx(TableHead, { children: "Taken" }), _jsx(TableHead, { children: "Signalen" })] }) }), _jsx(TableBody, { children: safeRuns.map((r) => {
81
82
  const warnings = Array.isArray(r.warnings) ? r.warnings : [];
82
83
  return (_jsxs(TableRow, { children: [_jsx(TableCell, { className: "text-sm", children: tijd(r.created_at) }), _jsx(TableCell, { className: "font-medium", children: r.order_ref }), _jsx(TableCell, { className: "text-sm", children: r.trigger }), _jsx(TableCell, { className: "text-sm", children: r.source_module ?? "—" }), _jsxs(TableCell, { className: "text-sm", children: [r.rule_version ?? "—", r.settings_hash ? (_jsx("span", { className: "text-muted-foreground ml-1 font-mono text-xs", children: r.settings_hash.slice(0, 6) })) : null] }), _jsxs(TableCell, { className: "text-sm", children: [r.tasks_created, " nieuw / ", r.tasks_revised, " herzien"] }), _jsx(TableCell, { className: "text-sm", children: warnings.length === 0 ? (_jsx("span", { className: "text-muted-foreground", children: "\u2014" })) : (_jsx("div", { className: "flex flex-wrap gap-1", children: warnings.map((w, i) => (_jsx(Badge, { variant: "outline", children: WAARSCHUWING_LABEL[String(w.code)] ?? String(w.code) }, i))) })) })] }, r.id));
@@ -9,6 +9,7 @@ export * from './components/BeladingIndelingCard';
9
9
  export * from './components/VoorraadMeldingenCard';
10
10
  export { FloridayPushCard } from './components/FloridayPushCard';
11
11
  export { PrintjobsCard } from './components/PrintjobsCard';
12
+ export { ConsistentieCard } from './components/ConsistentieCard';
12
13
  export * from './hooks/usePrintjobs';
13
14
  export * from './components/VertragingMeldingenCard';
14
15
  export * from './components/CapaciteitMeldingenCard';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,cAAc,kBAAkB,CAAC;AACjC,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,mCAAmC,CAAC;AAClD,cAAc,oCAAoC,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,cAAc,sBAAsB,CAAC;AAErC,cAAc,sCAAsC,CAAC;AACrD,cAAc,sCAAsC,CAAC;AACrD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AAGrC,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAEnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,2BAA2B,EAAE,MAAM,mDAAmD,CAAC;AAChG,cAAc,iCAAiC,CAAC;AAChD,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qCAAqC,CAAC;AAMpD,eAAO,MAAM,qBAAqB,EAAE,UAcnC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,cAAc,kBAAkB,CAAC;AACjC,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,mCAAmC,CAAC;AAClD,cAAc,oCAAoC,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,cAAc,sBAAsB,CAAC;AAErC,cAAc,sCAAsC,CAAC;AACrD,cAAc,sCAAsC,CAAC;AACrD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AAGrC,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAEnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,2BAA2B,EAAE,MAAM,mDAAmD,CAAC;AAChG,cAAc,iCAAiC,CAAC;AAChD,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qCAAqC,CAAC;AAMpD,eAAO,MAAM,qBAAqB,EAAE,UAcnC,CAAC"}
package/dist-lib/index.js CHANGED
@@ -12,6 +12,7 @@ export * from './components/BeladingIndelingCard';
12
12
  export * from './components/VoorraadMeldingenCard';
13
13
  export { FloridayPushCard } from './components/FloridayPushCard';
14
14
  export { PrintjobsCard } from './components/PrintjobsCard';
15
+ export { ConsistentieCard } from './components/ConsistentieCard';
15
16
  export * from './hooks/usePrintjobs';
16
17
  export * from './components/VertragingMeldingenCard';
17
18
  export * from './components/CapaciteitMeldingenCard';