@flowselections/mailbox-orders 1.0.3 → 1.0.5

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 (30) hide show
  1. package/dist-lib/components/CartAssignmentWizard.d.ts +6 -0
  2. package/dist-lib/components/CartAssignmentWizard.d.ts.map +1 -0
  3. package/dist-lib/components/CartAssignmentWizard.js +199 -0
  4. package/dist-lib/components/MailboxProcessedPage.d.ts.map +1 -1
  5. package/dist-lib/components/MailboxProcessedPage.js +25 -4
  6. package/dist-lib/components/MailboxProposalsPage.d.ts.map +1 -1
  7. package/dist-lib/components/MailboxProposalsPage.js +325 -60
  8. package/dist-lib/components/SearchableSelect.d.ts +2 -1
  9. package/dist-lib/components/SearchableSelect.d.ts.map +1 -1
  10. package/dist-lib/components/SearchableSelect.js +4 -3
  11. package/dist-lib/index.d.ts +0 -1
  12. package/dist-lib/index.d.ts.map +1 -1
  13. package/dist-lib/index.js +2 -4
  14. package/dist-lib/integrations/supabase/auth-attacher.d.ts.map +1 -1
  15. package/dist-lib/integrations/supabase/auth-attacher.js +37 -3
  16. package/dist-lib/integrations/supabase/auth-middleware.d.ts +3460 -157
  17. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  18. package/dist-lib/integrations/supabase/client.d.ts +3460 -157
  19. package/dist-lib/integrations/supabase/client.d.ts.map +1 -1
  20. package/dist-lib/integrations/supabase/client.server.d.ts +3460 -157
  21. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  22. package/dist-lib/integrations/supabase/types.d.ts +3553 -157
  23. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  24. package/dist-lib/integrations/supabase/types.js +2 -0
  25. package/dist-lib/lib/mailbox-template.functions.d.ts +43350 -23532
  26. package/dist-lib/lib/mailbox-template.functions.d.ts.map +1 -1
  27. package/dist-lib/lib/mailbox.functions.d.ts +142263 -33138
  28. package/dist-lib/lib/mailbox.functions.d.ts.map +1 -1
  29. package/dist-lib/lib/mailbox.functions.js +392 -18
  30. package/package.json +2 -7
@@ -0,0 +1,6 @@
1
+ export declare function CartAssignmentWizard({ orderId, open, onClose, }: {
2
+ orderId: string | null;
3
+ open: boolean;
4
+ onClose: () => void;
5
+ }): import("react").JSX.Element;
6
+ //# sourceMappingURL=CartAssignmentWizard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CartAssignmentWizard.d.ts","sourceRoot":"","sources":["../../src/components/CartAssignmentWizard.tsx"],"names":[],"mappings":"AA2CA,wBAAgB,oBAAoB,CAAC,EACnC,OAAO,EAAE,IAAI,EAAE,OAAO,GACvB,EAAE;IAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,IAAI,CAAA;CAAE,+BAsUhE"}
@@ -0,0 +1,199 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useMemo, useState } from "react";
3
+ import { useQuery } from "@tanstack/react-query";
4
+ import { useServerFn } from "@tanstack/react-start";
5
+ import { Button, Badge, Card, CardContent, CardHeader, CardTitle, Input, Label, Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, toast, } from "@flowselections/core";
6
+ import { Plus, Trash2, AlertTriangle, CheckCircle2 } from "lucide-react";
7
+ import { planAndSaveAutoCarts, saveManualCarts } from "../lib/mailbox.functions";
8
+ export function CartAssignmentWizard({ orderId, open, onClose, }) {
9
+ const fetchPlan = useServerFn(planAndSaveAutoCarts);
10
+ const fetchSave = useServerFn(saveManualCarts);
11
+ const { data, isLoading, refetch } = useQuery({
12
+ queryKey: ["cart-plan", orderId],
13
+ enabled: !!orderId && open,
14
+ queryFn: async () => {
15
+ try {
16
+ return await fetchPlan({ data: { orderId: orderId } });
17
+ }
18
+ catch (e) {
19
+ toast.error(e?.message ?? "Indelen mislukt");
20
+ return { autoCarts: [], remainders: [], existingManualCarts: [], nextCartNumber: 1 };
21
+ }
22
+ },
23
+ });
24
+ const autoCarts = Array.isArray(data?.autoCarts) ? data.autoCarts : [];
25
+ const remainders = Array.isArray(data?.remainders) ? data.remainders : [];
26
+ const existingManualCarts = Array.isArray(data?.existingManualCarts) ? data.existingManualCarts : [];
27
+ // Pool met nog in te delen fusten per orderregel
28
+ const [pool, setPool] = useState({});
29
+ const [manual, setManual] = useState([]);
30
+ useEffect(() => {
31
+ const p = {};
32
+ remainders.forEach((r) => { p[r.order_item_id] = r.crates_remaining; });
33
+ setPool(p);
34
+ // Bestaande handmatige karren herstellen — capaciteitsmeta uit remainders aanvullen.
35
+ const remMeta = {};
36
+ remainders.forEach((r) => { remMeta[r.order_item_id] = r; });
37
+ setManual(existingManualCarts.map((c) => ({
38
+ id: crypto.randomUUID(),
39
+ items: c.items.map((i) => {
40
+ const meta = i.order_item_id ? remMeta[i.order_item_id] : null;
41
+ return {
42
+ ...i,
43
+ crates_per_layer: meta?.crates_per_layer ?? i.crates_per_layer ?? 1,
44
+ layers_per_cart: meta?.layers_per_cart ?? i.layers_per_cart ?? 1,
45
+ };
46
+ }),
47
+ })));
48
+ }, [data]);
49
+ const remByItem = useMemo(() => {
50
+ const m = {};
51
+ remainders.forEach((r) => { m[r.order_item_id] = r; });
52
+ return m;
53
+ }, [remainders]);
54
+ const addCart = () => setManual((m) => [...m, { id: crypto.randomUUID(), items: [] }]);
55
+ const addItemToCart = (cartId, orderItemId, crates) => {
56
+ const rem = remByItem[orderItemId];
57
+ if (!rem)
58
+ return;
59
+ const available = pool[orderItemId] ?? 0;
60
+ const take = Math.max(0, Math.min(crates, available));
61
+ if (take === 0)
62
+ return;
63
+ setPool((p) => ({ ...p, [orderItemId]: available - take }));
64
+ setManual((carts) => carts.map((c) => {
65
+ if (c.id !== cartId)
66
+ return c;
67
+ // merge in plaats van duplicate regel
68
+ const existingIdx = c.items.findIndex((i) => i.order_item_id === orderItemId);
69
+ if (existingIdx >= 0) {
70
+ const next = [...c.items];
71
+ next[existingIdx] = { ...next[existingIdx], crates: next[existingIdx].crates + take };
72
+ return { ...c, items: next };
73
+ }
74
+ return {
75
+ ...c,
76
+ items: [...c.items, {
77
+ order_item_id: orderItemId,
78
+ product_id: rem.product_id,
79
+ product_name: rem.product_name,
80
+ crates: take,
81
+ plants_per_crate: rem.plants_per_crate,
82
+ crates_per_layer: rem.crates_per_layer,
83
+ layers_per_cart: rem.layers_per_cart,
84
+ }],
85
+ };
86
+ }));
87
+ };
88
+ const removeItem = (cartId, orderItemId) => {
89
+ setManual((carts) => carts.map((c) => {
90
+ if (c.id !== cartId)
91
+ return c;
92
+ const item = c.items.find((i) => i.order_item_id === orderItemId);
93
+ if (!item)
94
+ return c;
95
+ setPool((p) => ({ ...p, [orderItemId]: (p[orderItemId] ?? 0) + item.crates }));
96
+ return { ...c, items: c.items.filter((i) => i.order_item_id !== orderItemId) };
97
+ }));
98
+ };
99
+ const removeCart = (cartId) => {
100
+ setManual((carts) => {
101
+ const c = carts.find((x) => x.id === cartId);
102
+ if (c) {
103
+ setPool((p) => {
104
+ const np = { ...p };
105
+ c.items.forEach((i) => {
106
+ if (!i.order_item_id)
107
+ return;
108
+ np[i.order_item_id] = (np[i.order_item_id] ?? 0) + i.crates;
109
+ });
110
+ return np;
111
+ });
112
+ }
113
+ return carts.filter((x) => x.id !== cartId);
114
+ });
115
+ };
116
+ // Capaciteit per kar = max van betrokken artikelen (gemengde karren toegestaan,
117
+ // pakken we de hoogste cratesPerCart als bovengrens; waarschuwing toont per item).
118
+ const cartCapacity = (cart) => cart.items.length === 0
119
+ ? 0
120
+ : Math.max(...cart.items.map((i) => i.crates_per_layer * i.layers_per_cart));
121
+ const cartUsed = (cart) => cart.items.reduce((s, i) => s + i.crates, 0);
122
+ const totalRemainingInPool = Object.values(pool).reduce((s, n) => s + n, 0);
123
+ const handleSave = async () => {
124
+ if (totalRemainingInPool > 0) {
125
+ toast.error(`Nog ${totalRemainingInPool} fust niet ingedeeld — verdeel alles over een kar voordat je opslaat`);
126
+ return;
127
+ }
128
+ if (manual.some((c) => c.items.length === 0)) {
129
+ toast.error("Lege karren niet toegestaan");
130
+ return;
131
+ }
132
+ const overfull = manual.find((c) => cartUsed(c) > cartCapacity(c));
133
+ if (overfull) {
134
+ toast.error("Een kar overschrijdt de capaciteit");
135
+ return;
136
+ }
137
+ try {
138
+ await fetchSave({
139
+ data: {
140
+ orderId: orderId,
141
+ carts: manual.map((c) => ({
142
+ is_complete: cartUsed(c) >= cartCapacity(c),
143
+ items: c.items.map((i) => ({
144
+ order_item_id: i.order_item_id,
145
+ product_id: i.product_id,
146
+ product_name: i.product_name,
147
+ crates: Math.max(1, Math.trunc(i.crates)),
148
+ plants_per_crate: Math.max(1, Math.trunc(i.plants_per_crate || 1)),
149
+ crates_per_layer: Math.max(1, Math.trunc(i.crates_per_layer || 1)),
150
+ })),
151
+ })),
152
+ },
153
+ });
154
+ toast.success("Karindeling opgeslagen");
155
+ onClose();
156
+ }
157
+ catch (e) {
158
+ // requireSupabaseAuth en input-validatie gooien een Response; toString
159
+ // daarvan is "[object Response]" — zet om in leesbare melding zodat
160
+ // de React error-overlay niet wordt getriggerd.
161
+ let msg = "Opslaan mislukt";
162
+ if (e instanceof Response) {
163
+ try {
164
+ msg = (await e.text()) || `HTTP ${e.status}`;
165
+ }
166
+ catch {
167
+ msg = `HTTP ${e.status}`;
168
+ }
169
+ if (e.status === 401)
170
+ msg = "Sessie verlopen — log opnieuw in";
171
+ }
172
+ else if (e?.message) {
173
+ msg = e.message;
174
+ }
175
+ toast.error(msg);
176
+ console.error("saveManualCarts failed:", e);
177
+ }
178
+ };
179
+ return (_jsx(Dialog, { open: open, onOpenChange: (o) => { if (!o)
180
+ onClose(); }, children: _jsxs(DialogContent, { className: "max-w-[95vw] w-[95vw] h-[92vh] max-h-[92vh] overflow-y-auto p-6", children: [_jsx(DialogHeader, { children: _jsx(DialogTitle, { children: "Karindeling" }) }), isLoading ? (_jsx("div", { className: "text-muted-foreground", children: "Karren worden berekend..." })) : (_jsxs("div", { className: "space-y-6", children: [_jsxs(Card, { children: [_jsxs(CardHeader, { className: "flex flex-row items-center justify-between", children: [_jsx(CardTitle, { className: "text-base", children: "Automatisch ingedeelde karren" }), _jsxs(Badge, { variant: "secondary", children: [autoCarts.length, " kar(ren)"] })] }), _jsx(CardContent, { children: autoCarts.length === 0 ? (_jsx("p", { className: "text-sm text-muted-foreground", children: "Geen volledige karren mogelijk." })) : (_jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: "Kar #" }), _jsx(TableHead, { children: "Artikel" }), _jsx(TableHead, { className: "text-right", children: "Fusten" }), _jsx(TableHead, { className: "text-right", children: "Planten" }), _jsx(TableHead, { className: "text-right", children: "Bezetting" }), _jsx(TableHead, { children: "Status" })] }) }), _jsx(TableBody, { children: autoCarts.map((c) => (_jsxs(TableRow, { children: [_jsx(TableCell, { className: "font-mono", children: c.cart_number }), _jsx(TableCell, { children: c.product_name }), _jsx(TableCell, { className: "text-right", children: c.crates }), _jsx(TableCell, { className: "text-right", children: c.plants }), _jsx(TableCell, { className: "text-right", children: "100%" }), _jsx(TableCell, { children: _jsxs(Badge, { className: "gap-1", children: [_jsx(CheckCircle2, { className: "h-3 w-3" }), " Volledig"] }) })] }, c.cart_number))) })] })) })] }), _jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx(CardTitle, { className: "text-base", children: "Handmatig in te delen fusten" }) }), _jsx(CardContent, { className: "space-y-3", children: remainders.length === 0 ? (_jsx("p", { className: "text-sm text-muted-foreground", children: "Geen restant \u2014 alles past volledig op karren." })) : (_jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: "Artikel" }), _jsx(TableHead, { className: "text-right", children: "Beschikbaar (fusten)" }), _jsx(TableHead, { className: "text-right", children: "Planten/fust" }), _jsx(TableHead, { className: "text-right", children: "Capaciteit/kar" })] }) }), _jsx(TableBody, { children: remainders.map((r) => (_jsxs(TableRow, { children: [_jsx(TableCell, { children: r.product_name }), _jsxs(TableCell, { className: "text-right font-mono", children: [pool[r.order_item_id] ?? 0, " / ", r.crates_remaining] }), _jsx(TableCell, { className: "text-right", children: r.plants_per_crate }), _jsx(TableCell, { className: "text-right", children: r.crates_per_layer * r.layers_per_cart })] }, r.order_item_id))) })] })) })] }), remainders.length > 0 && (_jsxs(Card, { children: [_jsxs(CardHeader, { className: "flex flex-row items-center justify-between", children: [_jsx(CardTitle, { className: "text-base", children: "Restant-karren samenstellen" }), _jsxs(Button, { size: "sm", onClick: addCart, children: [_jsx(Plus, { className: "h-3 w-3 mr-1" }), " Kar toevoegen"] })] }), _jsxs(CardContent, { className: "space-y-3", children: [manual.length === 0 && (_jsx("p", { className: "text-sm text-muted-foreground", children: "Voeg een kar toe om restant-fusten in te delen." })), manual.map((cart, idx) => {
181
+ const used = cartUsed(cart);
182
+ const cap = cartCapacity(cart);
183
+ const pct = cap > 0 ? Math.round((used / cap) * 100) : 0;
184
+ const over = cap > 0 && used > cap;
185
+ return (_jsxs(Card, { className: over ? "border-destructive" : "", children: [_jsxs(CardHeader, { className: "flex flex-row items-center justify-between py-3", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsxs("span", { className: "font-medium", children: ["Restant-kar ", idx + 1] }), _jsxs(Badge, { variant: over ? "destructive" : "secondary", children: [used, " / ", cap || "?", " fusten (", pct, "%)"] }), over && (_jsxs("span", { className: "text-xs text-destructive flex items-center gap-1", children: [_jsx(AlertTriangle, { className: "h-3 w-3" }), " Capaciteit overschreden"] }))] }), _jsx(Button, { variant: "ghost", size: "icon", onClick: () => removeCart(cart.id), children: _jsx(Trash2, { className: "h-4 w-4" }) })] }), _jsxs(CardContent, { className: "space-y-2", children: [cart.items.map((i) => (_jsxs("div", { className: "flex items-center justify-between text-sm", children: [_jsxs("div", { children: [_jsx("span", { className: "font-medium", children: i.product_name }), _jsxs("span", { className: "text-muted-foreground", children: [" \u00B7 ", i.crates, " fust (", i.crates * i.plants_per_crate, " planten)"] })] }), _jsx(Button, { variant: "ghost", size: "sm", onClick: () => removeItem(cart.id, i.order_item_id), children: _jsx(Trash2, { className: "h-3 w-3" }) })] }, i.order_item_id))), _jsx(AddItemRow, { remainders: remainders, pool: pool, onAdd: (itemId, crates) => addItemToCart(cart.id, itemId, crates) })] })] }, cart.id));
186
+ })] })] }))] })), _jsxs(DialogFooter, { className: "gap-2", children: [_jsx(Button, { variant: "outline", onClick: onClose, children: "Annuleren" }), _jsxs(Button, { onClick: handleSave, disabled: isLoading || totalRemainingInPool > 0, children: ["Karindeling opslaan", totalRemainingInPool > 0 && (_jsxs(Badge, { variant: "destructive", className: "ml-2", children: ["Nog ", totalRemainingInPool, " fust in te delen"] }))] })] })] }) }));
187
+ }
188
+ function AddItemRow({ remainders, pool, onAdd, }) {
189
+ const available = remainders.filter((r) => (pool[r.order_item_id] ?? 0) > 0);
190
+ const [sel, setSel] = useState("");
191
+ const [qty, setQty] = useState(1);
192
+ if (available.length === 0)
193
+ return null;
194
+ return (_jsxs("div", { className: "flex items-end gap-2 pt-2 border-t", children: [_jsxs("div", { className: "flex-1", children: [_jsx(Label, { className: "text-xs", children: "Artikel" }), _jsxs(Select, { value: sel, onValueChange: setSel, children: [_jsx(SelectTrigger, { children: _jsx(SelectValue, { placeholder: "Kies restant-artikel..." }) }), _jsx(SelectContent, { children: available.map((r) => (_jsxs(SelectItem, { value: r.order_item_id, children: [r.product_name, " (", pool[r.order_item_id], " fust beschikbaar)"] }, r.order_item_id))) })] })] }), _jsxs("div", { className: "w-24", children: [_jsx(Label, { className: "text-xs", children: "Fusten" }), _jsx(Input, { type: "number", min: 1, value: qty, onChange: (e) => setQty(Math.max(1, Number(e.target.value) || 1)) })] }), _jsxs(Button, { size: "sm", disabled: !sel, onClick: () => { if (sel) {
195
+ onAdd(sel, qty);
196
+ setSel("");
197
+ setQty(1);
198
+ } }, children: [_jsx(Plus, { className: "h-3 w-3 mr-1" }), " Toevoegen"] })] }));
199
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"MailboxProcessedPage.d.ts","sourceRoot":"","sources":["../../src/components/MailboxProcessedPage.tsx"],"names":[],"mappings":"AAQA,wBAAgB,oBAAoB,gCAuDnC"}
1
+ {"version":3,"file":"MailboxProcessedPage.d.ts","sourceRoot":"","sources":["../../src/components/MailboxProcessedPage.tsx"],"names":[],"mappings":"AAWA,wBAAgB,oBAAoB,gCAiGnC"}
@@ -1,10 +1,15 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useQuery } from "@tanstack/react-query";
2
+ import { useState } from "react";
3
+ import { useQuery, useQueryClient } from "@tanstack/react-query";
3
4
  import { useServerFn } from "@tanstack/react-start";
4
- import { Badge, Card, CardContent, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@flowselections/core";
5
- import { listProposals } from "../lib/mailbox.functions";
5
+ import { toast } from "sonner";
6
+ import { Badge, Button, Card, CardContent, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@flowselections/core";
7
+ import { listProposals, reopenProposal } from "../lib/mailbox.functions";
8
+ import { CartAssignmentWizard } from "./CartAssignmentWizard";
6
9
  export function MailboxProcessedPage() {
7
10
  const fetchList = useServerFn(listProposals);
11
+ const reopen = useServerFn(reopenProposal);
12
+ const qc = useQueryClient();
8
13
  const approved = useQuery({
9
14
  queryKey: ["mailbox-proposals", "approved"],
10
15
  queryFn: () => fetchList({ data: { status: "approved" } }),
@@ -17,5 +22,21 @@ export function MailboxProcessedPage() {
17
22
  ...(Array.isArray(approved.data?.items) ? approved.data.items : []),
18
23
  ...(Array.isArray(rejected.data?.items) ? rejected.data.items : []),
19
24
  ].sort((a, b) => (b.reviewed_at ?? "").localeCompare(a.reviewed_at ?? ""));
20
- return (_jsxs("div", { className: "p-6 space-y-4", children: [_jsx("h1", { className: "text-2xl font-semibold", children: "Verwerkt" }), _jsx(Card, { children: _jsx(CardContent, { className: "p-0", children: items.length === 0 ? (_jsx("div", { className: "p-8 text-center text-muted-foreground", children: "Nog geen verwerkte voorstellen." })) : (_jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: "Status" }), _jsx(TableHead, { children: "Afzender" }), _jsx(TableHead, { children: "Onderwerp" }), _jsx(TableHead, { children: "Verwerkt op" })] }) }), _jsx(TableBody, { children: items.map((p) => (_jsxs(TableRow, { children: [_jsx(TableCell, { children: _jsx(Badge, { variant: p.status === "approved" ? "default" : "destructive", children: p.status === "approved" ? "Goedgekeurd" : "Afgewezen" }) }), _jsx(TableCell, { children: p.mailbox_messages?.from_email ?? "-" }), _jsx(TableCell, { className: "max-w-md truncate", children: p.mailbox_messages?.subject ?? "-" }), _jsx(TableCell, { className: "text-sm text-muted-foreground", children: p.reviewed_at ? new Date(p.reviewed_at).toLocaleString("nl-NL") : "-" })] }, p.id))) })] })) }) })] }));
25
+ const [cartOrderId, setCartOrderId] = useState(null);
26
+ const [busyId, setBusyId] = useState(null);
27
+ const handleReopen = async (proposalId) => {
28
+ setBusyId(proposalId);
29
+ try {
30
+ await reopen({ data: { proposalId } });
31
+ toast.success("Voorstel teruggezet naar 'Te controleren'.");
32
+ await qc.invalidateQueries({ queryKey: ["mailbox-proposals"] });
33
+ }
34
+ catch (e) {
35
+ toast.error(e?.message ?? "Terugzetten mislukt.");
36
+ }
37
+ finally {
38
+ setBusyId(null);
39
+ }
40
+ };
41
+ return (_jsxs("div", { className: "p-6 space-y-4", children: [_jsx("h1", { className: "text-2xl font-semibold", children: "Verwerkt" }), _jsx(Card, { children: _jsx(CardContent, { className: "p-0", children: items.length === 0 ? (_jsx("div", { className: "p-8 text-center text-muted-foreground", children: "Nog geen verwerkte voorstellen." })) : (_jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: "Status" }), _jsx(TableHead, { children: "Afzender" }), _jsx(TableHead, { children: "Onderwerp" }), _jsx(TableHead, { children: "Verwerkt op" }), _jsx(TableHead, { className: "text-right", children: "Acties" })] }) }), _jsx(TableBody, { children: items.map((p) => (_jsxs(TableRow, { children: [_jsx(TableCell, { children: _jsx(Badge, { variant: p.status === "approved" ? "default" : "destructive", children: p.status === "approved" ? "Goedgekeurd" : "Afgewezen" }) }), _jsx(TableCell, { children: p.mailbox_messages?.from_email ?? "-" }), _jsx(TableCell, { className: "max-w-md truncate", children: p.mailbox_messages?.subject ?? "-" }), _jsx(TableCell, { className: "text-sm text-muted-foreground", children: p.reviewed_at ? new Date(p.reviewed_at).toLocaleString("nl-NL") : "-" }), _jsxs(TableCell, { className: "text-right space-x-2", children: [p.status === "approved" && p.created_order_id && (_jsx(Button, { size: "sm", variant: "outline", onClick: () => setCartOrderId(p.created_order_id), children: "Karindeling aanpassen" })), p.status === "rejected" && (_jsx(Button, { size: "sm", variant: "outline", disabled: busyId === p.id, onClick: () => handleReopen(p.id), children: busyId === p.id ? "Bezig..." : "Terugzetten" }))] })] }, p.id))) })] })) }) }), _jsx(CartAssignmentWizard, { orderId: cartOrderId, open: !!cartOrderId, onClose: () => setCartOrderId(null) })] }));
21
42
  }
@@ -1 +1 @@
1
- {"version":3,"file":"MailboxProposalsPage.d.ts","sourceRoot":"","sources":["../../src/components/MailboxProposalsPage.tsx"],"names":[],"mappings":"AA+BA,wBAAgB,oBAAoB,gCAqKnC"}
1
+ {"version":3,"file":"MailboxProposalsPage.d.ts","sourceRoot":"","sources":["../../src/components/MailboxProposalsPage.tsx"],"names":[],"mappings":"AAmCA,wBAAgB,oBAAoB,gCAiQnC"}