@flowselections/logistiek-engine 1.0.25 → 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 (46) 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/ModulePromptsPage.d.ts.map +1 -1
  6. package/dist-lib/components/ModulePromptsPage.js +11 -3
  7. package/dist-lib/components/RegiePage.d.ts.map +1 -1
  8. package/dist-lib/components/RegiePage.js +2 -1
  9. package/dist-lib/index.d.ts +1 -0
  10. package/dist-lib/index.d.ts.map +1 -1
  11. package/dist-lib/index.js +1 -0
  12. package/dist-lib/integrations/supabase/auth-middleware.d.ts +1048 -715
  13. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  14. package/dist-lib/integrations/supabase/client.server.d.ts +1048 -715
  15. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  16. package/dist-lib/integrations/supabase/client.server.js +1 -1
  17. package/dist-lib/integrations/supabase/moduleClient.d.ts +1048 -715
  18. package/dist-lib/integrations/supabase/moduleClient.d.ts.map +1 -1
  19. package/dist-lib/integrations/supabase/types.d.ts +1081 -768
  20. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  21. package/dist-lib/lib/floridayDocuments.functions.d.ts +3054 -2055
  22. package/dist-lib/lib/floridayDocuments.functions.d.ts.map +1 -1
  23. package/dist-lib/lib/floridayPush.functions.d.ts +1048 -715
  24. package/dist-lib/lib/floridayPush.functions.d.ts.map +1 -1
  25. package/dist-lib/lib/loadCarrierPlanning.functions.d.ts +5105 -3465
  26. package/dist-lib/lib/loadCarrierPlanning.functions.d.ts.map +1 -1
  27. package/dist-lib/lib/logisticsPlanner.d.ts.map +1 -1
  28. package/dist-lib/lib/logisticsPlanner.js +35 -13
  29. package/dist-lib/lib/logisticsRecalcJob.functions.d.ts +1983 -1317
  30. package/dist-lib/lib/logisticsRecalcJob.functions.d.ts.map +1 -1
  31. package/dist-lib/lib/logisticsRecalculate.functions.d.ts +1048 -715
  32. package/dist-lib/lib/logisticsRecalculate.functions.d.ts.map +1 -1
  33. package/dist-lib/lib/modulePrompts.d.ts +19 -3
  34. package/dist-lib/lib/modulePrompts.d.ts.map +1 -1
  35. package/dist-lib/lib/modulePrompts.js +1636 -1298
  36. package/dist-lib/lib/ruleEngineSchema.d.ts.map +1 -1
  37. package/dist-lib/lib/ruleEngineSchema.js +21 -4
  38. package/dist-lib/lib/ruleEngineWizard.d.ts.map +1 -1
  39. package/dist-lib/lib/ruleEngineWizard.js +3 -1
  40. package/package.json +1 -1
  41. package/dist-lib/components/rule-engine/FloridayConnectionBanner.d.ts +0 -2
  42. package/dist-lib/components/rule-engine/FloridayConnectionBanner.d.ts.map +0 -1
  43. package/dist-lib/components/rule-engine/FloridayConnectionBanner.js +0 -41
  44. package/dist-lib/integrations/supabase/client.d.ts +0 -20293
  45. package/dist-lib/integrations/supabase/client.d.ts.map +0 -1
  46. 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":"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,gCA0XxB"}
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,7 +74,7 @@ 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
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));
@@ -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';