@flowselections/floriday-afhandeling-module 1.0.9 → 1.0.11
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.
- package/dist-lib/components/afhandeling/ControleLijstPrint.d.ts +7 -0
- package/dist-lib/components/afhandeling/ControleLijstPrint.d.ts.map +1 -0
- package/dist-lib/components/afhandeling/ControleLijstPrint.js +67 -0
- package/dist-lib/components/afhandeling/ControlePage.d.ts +2 -0
- package/dist-lib/components/afhandeling/ControlePage.d.ts.map +1 -0
- package/dist-lib/components/afhandeling/ControlePage.js +456 -0
- package/dist-lib/components/afhandeling/DagDetailDialog.d.ts +9 -0
- package/dist-lib/components/afhandeling/DagDetailDialog.d.ts.map +1 -0
- package/dist-lib/components/afhandeling/DagDetailDialog.js +149 -0
- package/dist-lib/components/afhandeling/LeveringenPage.d.ts.map +1 -1
- package/dist-lib/components/afhandeling/LeveringenPage.js +11 -5
- package/dist-lib/components/afhandeling/PickAgendaView.d.ts.map +1 -1
- package/dist-lib/components/afhandeling/PickAgendaView.js +13 -4
- package/dist-lib/components/afhandeling/PlanningAgendaPage.d.ts.map +1 -1
- package/dist-lib/components/afhandeling/PlanningAgendaPage.js +2 -2
- package/dist-lib/components/afhandeling/ServiceAreaSelect.d.ts +12 -0
- package/dist-lib/components/afhandeling/ServiceAreaSelect.d.ts.map +1 -0
- package/dist-lib/components/afhandeling/ServiceAreaSelect.js +79 -0
- package/dist-lib/components/afhandeling/VervoerderForm.d.ts.map +1 -1
- package/dist-lib/components/afhandeling/VervoerderForm.js +62 -6
- package/dist-lib/components/afhandeling/VervoerdersPage.d.ts.map +1 -1
- package/dist-lib/components/afhandeling/VervoerdersPage.js +25 -6
- package/dist-lib/components/afhandeling/WeekAgendaView.d.ts +2 -1
- package/dist-lib/components/afhandeling/WeekAgendaView.d.ts.map +1 -1
- package/dist-lib/components/afhandeling/WeekAgendaView.js +63 -18
- package/dist-lib/components/afhandeling/WeekdayPicker.d.ts +12 -0
- package/dist-lib/components/afhandeling/WeekdayPicker.d.ts.map +1 -0
- package/dist-lib/components/afhandeling/WeekdayPicker.js +30 -0
- package/dist-lib/components/pickstation/PakbonTemplate.d.ts +6 -2
- package/dist-lib/components/pickstation/PakbonTemplate.d.ts.map +1 -1
- package/dist-lib/components/pickstation/PakbonTemplate.js +37 -12
- package/dist-lib/components/settings/AfhandelingSettingsCard.d.ts.map +1 -1
- package/dist-lib/components/settings/AfhandelingSettingsCard.js +25 -6
- package/dist-lib/components/ui/responsive-dialog.d.ts +20 -0
- package/dist-lib/components/ui/responsive-dialog.d.ts.map +1 -0
- package/dist-lib/components/ui/responsive-dialog.js +44 -0
- package/dist-lib/hooks/useOrderPlanning.d.ts +3 -0
- package/dist-lib/hooks/useOrderPlanning.d.ts.map +1 -1
- package/dist-lib/hooks/useOrderPlanning.js +64 -12
- package/dist-lib/index.d.ts +1 -0
- package/dist-lib/index.d.ts.map +1 -1
- package/dist-lib/index.js +4 -2
- package/dist-lib/integrations/supabase/auth-middleware.d.ts +2898 -147
- package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.d.ts +2898 -147
- package/dist-lib/integrations/supabase/client.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.server.d.ts +2898 -147
- package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/types.d.ts +2986 -155
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/types.js +1 -0
- package/dist-lib/lib/afhandelingSettings.functions.d.ts +10666 -5151
- package/dist-lib/lib/afhandelingSettings.functions.d.ts.map +1 -1
- package/dist-lib/lib/afhandelingSettings.functions.js +42 -2
- package/dist-lib/lib/carrierMatch.server.d.ts +27 -0
- package/dist-lib/lib/carrierMatch.server.d.ts.map +1 -0
- package/dist-lib/lib/carrierMatch.server.js +75 -0
- package/dist-lib/lib/carrierSignupMail.server.d.ts +56 -0
- package/dist-lib/lib/carrierSignupMail.server.d.ts.map +1 -0
- package/dist-lib/lib/carrierSignupMail.server.js +229 -0
- package/dist-lib/lib/carriers.functions.d.ts +36404 -15470
- package/dist-lib/lib/carriers.functions.d.ts.map +1 -1
- package/dist-lib/lib/carriers.functions.js +43 -2
- package/dist-lib/lib/cartAssignments.functions.d.ts +49609 -0
- package/dist-lib/lib/cartAssignments.functions.d.ts.map +1 -0
- package/dist-lib/lib/cartAssignments.functions.js +130 -0
- package/dist-lib/lib/cartControl.functions.d.ts +99259 -0
- package/dist-lib/lib/cartControl.functions.d.ts.map +1 -0
- package/dist-lib/lib/cartControl.functions.js +489 -0
- package/dist-lib/lib/cartMoveImpact.d.ts +8 -0
- package/dist-lib/lib/cartMoveImpact.d.ts.map +1 -0
- package/dist-lib/lib/cartMoveImpact.js +26 -0
- package/dist-lib/lib/cartRescheduling.d.ts +30 -0
- package/dist-lib/lib/cartRescheduling.d.ts.map +1 -0
- package/dist-lib/lib/cartRescheduling.js +71 -0
- package/dist-lib/lib/floriday.functions.d.ts +2902 -147
- package/dist-lib/lib/floriday.functions.d.ts.map +1 -1
- package/dist-lib/lib/floriday.functions.js +178 -98
- package/dist-lib/lib/geo/euServiceAreas.d.ts +30 -0
- package/dist-lib/lib/geo/euServiceAreas.d.ts.map +1 -0
- package/dist-lib/lib/geo/euServiceAreas.js +277 -0
- package/dist-lib/lib/invalidatePlanning.d.ts +11 -0
- package/dist-lib/lib/invalidatePlanning.d.ts.map +1 -0
- package/dist-lib/lib/invalidatePlanning.js +25 -0
- package/dist-lib/lib/pickstationI18n.d.ts +12 -0
- package/dist-lib/lib/pickstationI18n.d.ts.map +1 -1
- package/dist-lib/lib/pickstationI18n.js +72 -0
- package/dist-lib/lib/pickstationOrders.server.d.ts +2 -1
- package/dist-lib/lib/pickstationOrders.server.d.ts.map +1 -1
- package/dist-lib/lib/pickstationOrders.server.js +393 -178
- package/dist-lib/lib/pickstationTypes.d.ts +23 -2
- package/dist-lib/lib/pickstationTypes.d.ts.map +1 -1
- package/dist-lib/lib/planning.d.ts +41 -2
- package/dist-lib/lib/planning.d.ts.map +1 -1
- package/dist-lib/lib/planning.js +159 -36
- package/package.json +2 -2
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useState } from "react";
|
|
3
|
-
import { Button, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, AlertDialog, AlertDialogAction, AlertDialogCancel,
|
|
4
|
-
import { Plus, Pencil, Trash2, Truck } from "lucide-react";
|
|
3
|
+
import { Button, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogDescription, AlertDialogTitle, toast, } from "@flowselections/core";
|
|
4
|
+
import { Plus, Pencil, Trash2, Truck, ArrowUp, ArrowDown } from "lucide-react";
|
|
5
|
+
import { ResponsiveAlertDialogBody, ResponsiveAlertDialogContent, ResponsiveAlertDialogFooter, ResponsiveAlertDialogHeader, } from "../../components/ui/responsive-dialog";
|
|
5
6
|
import { Link } from "@tanstack/react-router";
|
|
6
7
|
import { useServerFn } from "@tanstack/react-start";
|
|
7
8
|
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
|
8
|
-
import { listCarriers, deleteCarrier } from "../../lib/carriers.functions";
|
|
9
|
+
import { listCarriers, deleteCarrier, reorderCarriers } from "../../lib/carriers.functions";
|
|
9
10
|
export function VervoerdersPage() {
|
|
10
11
|
const queryClient = useQueryClient();
|
|
11
12
|
const fetchList = useServerFn(listCarriers);
|
|
12
13
|
const removeCarrier = useServerFn(deleteCarrier);
|
|
14
|
+
const reorder = useServerFn(reorderCarriers);
|
|
13
15
|
const [deletingId, setDeletingId] = useState(null);
|
|
14
16
|
const { data, isLoading, error, refetch } = useQuery({
|
|
15
17
|
queryKey: ["carriers"],
|
|
@@ -29,13 +31,30 @@ export function VervoerdersPage() {
|
|
|
29
31
|
});
|
|
30
32
|
const deleteMutation = useMutation({
|
|
31
33
|
mutationFn: (id) => removeCarrier({ data: { id } }),
|
|
32
|
-
onSuccess: () => {
|
|
34
|
+
onSuccess: async () => {
|
|
33
35
|
toast.success("Vervoerder verwijderd");
|
|
34
|
-
|
|
36
|
+
const { invalidatePlanning } = await import("../../lib/invalidatePlanning");
|
|
37
|
+
await invalidatePlanning(queryClient);
|
|
35
38
|
setDeletingId(null);
|
|
36
39
|
},
|
|
37
40
|
onError: (err) => toast.error(err.message),
|
|
38
41
|
});
|
|
42
|
+
const reorderMutation = useMutation({
|
|
43
|
+
mutationFn: (orderedIds) => reorder({ data: { orderedIds } }),
|
|
44
|
+
onSuccess: async () => {
|
|
45
|
+
const { invalidatePlanning } = await import("../../lib/invalidatePlanning");
|
|
46
|
+
await invalidatePlanning(queryClient);
|
|
47
|
+
},
|
|
48
|
+
onError: (err) => toast.error(err.message),
|
|
49
|
+
});
|
|
39
50
|
const carriers = data?.carriers ?? [];
|
|
40
|
-
|
|
51
|
+
const move = (index, direction) => {
|
|
52
|
+
const target = index + direction;
|
|
53
|
+
if (target < 0 || target >= carriers.length)
|
|
54
|
+
return;
|
|
55
|
+
const ids = carriers.map((c) => c.id);
|
|
56
|
+
[ids[index], ids[target]] = [ids[target], ids[index]];
|
|
57
|
+
reorderMutation.mutate(ids);
|
|
58
|
+
};
|
|
59
|
+
return (_jsxs("div", { className: "p-6 space-y-6", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("div", { children: [_jsx("h1", { className: "text-2xl font-semibold", children: "Vervoerders" }), _jsx("p", { className: "text-sm text-muted-foreground", children: "Beheer vervoerders en hun verzendtarieven per land." })] }), _jsx(Button, { asChild: true, children: _jsxs(Link, { to: "/afhandeling/vervoerders/nieuw", children: [_jsx(Plus, { className: "w-4 h-4 mr-1" }), "Vervoerder toevoegen"] }) })] }), _jsx("div", { className: "border rounded-md bg-card", children: isLoading ? (_jsx("div", { className: "p-12 text-center text-muted-foreground", children: "Laden..." })) : error ? (_jsxs("div", { className: "p-12 text-center space-y-3", children: [_jsxs("div", { className: "text-destructive", children: ["Fout bij laden: ", error.message] }), _jsx(Button, { variant: "outline", onClick: () => refetch(), children: "Opnieuw proberen" })] })) : carriers.length === 0 ? (_jsxs("div", { className: "p-12 text-center space-y-3", children: [_jsx(Truck, { className: "w-10 h-10 mx-auto text-muted-foreground" }), _jsx("div", { className: "font-medium", children: "Nog geen vervoerders" }), _jsx("div", { className: "text-sm text-muted-foreground", children: "Voeg een vervoerder toe om verzendtarieven in te stellen." }), _jsx(Button, { asChild: true, children: _jsxs(Link, { to: "/afhandeling/vervoerders/nieuw", children: [_jsx(Plus, { className: "w-4 h-4 mr-1" }), "Vervoerder toevoegen"] }) })] })) : (_jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { className: "w-32", children: "Prioriteit" }), _jsx(TableHead, { children: "Bedrijfsnaam" }), _jsx(TableHead, { children: "Contactpersoon" }), _jsx(TableHead, { children: "E-mail" }), _jsx(TableHead, { children: "Telefoon" }), _jsx(TableHead, { children: "Levertijd" }), _jsx(TableHead, { children: "Landen" }), _jsx(TableHead, { className: "text-right", children: "Acties" })] }) }), _jsx(TableBody, { children: carriers.map((c, index) => (_jsxs(TableRow, { children: [_jsx(TableCell, { children: _jsxs("div", { className: "flex items-center gap-1", children: [_jsx("span", { className: "w-6 text-sm font-medium tabular-nums text-muted-foreground", children: index + 1 }), _jsx(Button, { variant: "ghost", size: "sm", onClick: () => move(index, -1), disabled: index === 0 || reorderMutation.isPending, "aria-label": "Hoger", children: _jsx(ArrowUp, { className: "w-4 h-4" }) }), _jsx(Button, { variant: "ghost", size: "sm", onClick: () => move(index, 1), disabled: index === carriers.length - 1 || reorderMutation.isPending, "aria-label": "Lager", children: _jsx(ArrowDown, { className: "w-4 h-4" }) })] }) }), _jsx(TableCell, { className: "font-medium", children: c.name }), _jsx(TableCell, { children: c.contact_person ?? "—" }), _jsx(TableCell, { children: c.email ?? "—" }), _jsx(TableCell, { children: c.phone ?? "—" }), _jsx(TableCell, { children: c.delivery_days != null ? `${c.delivery_days} dagen` : "—" }), _jsx(TableCell, { children: c.rate_count }), _jsx(TableCell, { className: "text-right", children: _jsxs("div", { className: "flex justify-end gap-1", children: [_jsx(Button, { asChild: true, variant: "ghost", size: "sm", children: _jsx(Link, { to: "/afhandeling/vervoerders/$id/bewerken", params: { id: c.id }, children: _jsx(Pencil, { className: "w-4 h-4" }) }) }), _jsx(Button, { variant: "ghost", size: "sm", onClick: () => setDeletingId(c.id), className: "text-destructive hover:text-destructive", children: _jsx(Trash2, { className: "w-4 h-4" }) })] }) })] }, c.id))) })] })) }), _jsx(AlertDialog, { open: !!deletingId, onOpenChange: (o) => !o && setDeletingId(null), children: _jsxs(ResponsiveAlertDialogContent, { size: "sm", children: [_jsx(ResponsiveAlertDialogHeader, { children: _jsx(AlertDialogTitle, { children: "Vervoerder verwijderen?" }) }), _jsx(ResponsiveAlertDialogBody, { children: _jsx(AlertDialogDescription, { children: "Deze actie kan niet ongedaan gemaakt worden. Alle verzendtarieven worden ook verwijderd." }) }), _jsxs(ResponsiveAlertDialogFooter, { children: [_jsx(AlertDialogCancel, { children: "Annuleren" }), _jsx(AlertDialogAction, { onClick: () => deletingId && deleteMutation.mutate(deletingId), className: "bg-destructive text-destructive-foreground hover:bg-destructive/90", children: "Verwijderen" })] })] }) })] }));
|
|
41
60
|
}
|
|
@@ -6,7 +6,8 @@ export interface WeekAgendaViewProps {
|
|
|
6
6
|
mode: WeekAgendaMode;
|
|
7
7
|
isLoading?: boolean;
|
|
8
8
|
onOrderClick?: (order: FloridayOrder) => void;
|
|
9
|
+
onDayClick?: (date: Date) => void;
|
|
9
10
|
title?: string;
|
|
10
11
|
}
|
|
11
|
-
export declare function WeekAgendaView({ planned, mode, isLoading, onOrderClick, title, }: WeekAgendaViewProps): import("react").JSX.Element;
|
|
12
|
+
export declare function WeekAgendaView({ planned, mode, isLoading, onOrderClick, onDayClick, title, }: WeekAgendaViewProps): import("react").JSX.Element;
|
|
12
13
|
//# sourceMappingURL=WeekAgendaView.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WeekAgendaView.d.ts","sourceRoot":"","sources":["../../../src/components/afhandeling/WeekAgendaView.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAEjE,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,QAAQ,GAAG,oBAAoB,GAAG,MAAM,CAAC;AAEnF,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;
|
|
1
|
+
{"version":3,"file":"WeekAgendaView.d.ts","sourceRoot":"","sources":["../../../src/components/afhandeling/WeekAgendaView.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAEjE,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,QAAQ,GAAG,oBAAoB,GAAG,MAAM,CAAC;AAEnF,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAC9C,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA8DD,wBAAgB,cAAc,CAAC,EAC7B,OAAO,EACP,IAAI,EACJ,SAAS,EACT,YAAY,EACZ,UAAU,EACV,KAAK,GACN,EAAE,mBAAmB,+BA4HrB"}
|
|
@@ -37,7 +37,7 @@ const MODE_LABELS = {
|
|
|
37
37
|
"transport-register": { summary: "Aanmeldingen deze week" },
|
|
38
38
|
pick: { summary: "Te picken deze week" },
|
|
39
39
|
};
|
|
40
|
-
export function WeekAgendaView({ planned, mode, isLoading, onOrderClick, title, }) {
|
|
40
|
+
export function WeekAgendaView({ planned, mode, isLoading, onOrderClick, onDayClick, title, }) {
|
|
41
41
|
const [cursor, setCursor] = useState(() => {
|
|
42
42
|
const d = new Date();
|
|
43
43
|
d.setHours(0, 0, 0, 0);
|
|
@@ -49,21 +49,55 @@ export function WeekAgendaView({ planned, mode, isLoading, onOrderClick, title,
|
|
|
49
49
|
const days = useMemo(() => {
|
|
50
50
|
return Array.from({ length: 7 }, (_, i) => {
|
|
51
51
|
const date = addDays(weekStart, i);
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
52
|
+
const entries = [];
|
|
53
|
+
for (const p of planned) {
|
|
54
|
+
if (!p.planning)
|
|
55
|
+
continue;
|
|
56
|
+
if (mode === "pick") {
|
|
57
|
+
const assigns = p.planning.pickAssignments ?? [
|
|
58
|
+
{ date: p.planning.scheduledPickDate ?? p.planning.pickStartDate, cartCount: p.order.cartCount ?? 0 },
|
|
59
|
+
];
|
|
60
|
+
const total = assigns.length;
|
|
61
|
+
assigns.forEach((a, idx) => {
|
|
62
|
+
if (!isSameDay(a.date, date))
|
|
63
|
+
return;
|
|
64
|
+
const totalCarts = p.order.cartCount ?? 0;
|
|
65
|
+
const ratio = totalCarts > 0 ? a.cartCount / totalCarts : 1 / Math.max(total, 1);
|
|
66
|
+
entries.push({
|
|
67
|
+
order: p.order,
|
|
68
|
+
cartCount: a.cartCount,
|
|
69
|
+
plantCount: Math.round((p.order.plantCount ?? 0) * ratio),
|
|
70
|
+
movedEarlier: a.date.getTime() !== p.planning.pickStartDate.getTime(),
|
|
71
|
+
splitPart: total > 1 ? { index: idx + 1, total } : undefined,
|
|
72
|
+
reason: p.planning.reason,
|
|
73
|
+
carrierName: p.planning.carrierName,
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
const d = dateForPlanned(p, mode);
|
|
79
|
+
if (!d || !isSameDay(d, date))
|
|
80
|
+
continue;
|
|
81
|
+
entries.push({
|
|
82
|
+
order: p.order,
|
|
83
|
+
cartCount: p.order.cartCount ?? 0,
|
|
84
|
+
plantCount: p.order.plantCount ?? 0,
|
|
85
|
+
movedEarlier: false,
|
|
86
|
+
reason: p.planning.reason,
|
|
87
|
+
carrierName: p.planning.carrierName,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
const karren = entries.reduce((s, e) => s + e.cartCount, 0);
|
|
92
|
+
const planten = entries.reduce((s, e) => s + e.plantCount, 0);
|
|
93
|
+
const verzendklaar = entries.filter((e) => isOrderReady(e.order)).length;
|
|
94
|
+
const voorbereiding = entries.length - verzendklaar;
|
|
95
|
+
const movedEarlierOrderIds = new Set(entries.filter((e) => e.movedEarlier).map((e) => e.order.id));
|
|
62
96
|
return {
|
|
63
97
|
date,
|
|
64
|
-
|
|
98
|
+
entries,
|
|
65
99
|
movedEarlierOrderIds,
|
|
66
|
-
bestellingen:
|
|
100
|
+
bestellingen: entries.length,
|
|
67
101
|
karren,
|
|
68
102
|
planten,
|
|
69
103
|
verzendklaar,
|
|
@@ -86,20 +120,31 @@ export function WeekAgendaView({ planned, mode, isLoading, onOrderClick, title,
|
|
|
86
120
|
d.setHours(0, 0, 0, 0);
|
|
87
121
|
setCursor(startOfWeek(d));
|
|
88
122
|
};
|
|
89
|
-
return (_jsxs("div", { className: "space-y-4", children: [_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-3", children: [_jsx("h2", { className: "text-xl font-semibold tracking-tight", children: title ?? headerLabel }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsxs(Button, { variant: "outline", size: "sm", onClick: goPrev, children: [_jsx(ChevronLeft, { className: "mr-1 h-4 w-4" }), " Vorige week"] }), _jsx(Button, { variant: "outline", size: "sm", onClick: goToday, children: "Deze week" }), _jsxs(Button, { variant: "outline", size: "sm", onClick: goNext, children: ["Volgende week ", _jsx(ChevronRight, { className: "ml-1 h-4 w-4" })] })] })] }), _jsxs("div", { className: "grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-4", children: [_jsx(SummaryCard, { label: MODE_LABELS[mode].summary, value: totals.leveringen, tone: "default" }), _jsx(SummaryCard, { label: "Verzendklaar", value: totals.verzendklaar, tone: "success" }), _jsx(SummaryCard, { label: "In voorbereiding", value: totals.voorbereiding, tone: "muted" }), _jsx(SummaryCard, { label: "Totaal stuks", value: totals.totaalStuks, tone: "default" })] }), _jsx("div", { className: "space-y-2", children: isLoading ? (_jsx("div", { className: "rounded-lg border bg-card p-10 text-center text-sm text-muted-foreground", children: "Laden\u2026" })) : (days.map((day) => _jsx(DayRow, { day: day, onOrderClick: onOrderClick }, day.date.toISOString()))) })] }));
|
|
123
|
+
return (_jsxs("div", { className: "space-y-4", children: [_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-3", children: [_jsx("h2", { className: "text-xl font-semibold tracking-tight", children: title ?? headerLabel }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsxs(Button, { variant: "outline", size: "sm", onClick: goPrev, children: [_jsx(ChevronLeft, { className: "mr-1 h-4 w-4" }), " Vorige week"] }), _jsx(Button, { variant: "outline", size: "sm", onClick: goToday, children: "Deze week" }), _jsxs(Button, { variant: "outline", size: "sm", onClick: goNext, children: ["Volgende week ", _jsx(ChevronRight, { className: "ml-1 h-4 w-4" })] })] })] }), _jsxs("div", { className: "grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-4", children: [_jsx(SummaryCard, { label: MODE_LABELS[mode].summary, value: totals.leveringen, tone: "default" }), _jsx(SummaryCard, { label: "Verzendklaar", value: totals.verzendklaar, tone: "success" }), _jsx(SummaryCard, { label: "In voorbereiding", value: totals.voorbereiding, tone: "muted" }), _jsx(SummaryCard, { label: "Totaal stuks", value: totals.totaalStuks, tone: "default" })] }), _jsx("div", { className: "space-y-2", children: isLoading ? (_jsx("div", { className: "rounded-lg border bg-card p-10 text-center text-sm text-muted-foreground", children: "Laden\u2026" })) : (days.map((day) => _jsx(DayRow, { day: day, onOrderClick: onOrderClick, onDayClick: onDayClick }, day.date.toISOString()))) })] }));
|
|
90
124
|
}
|
|
91
125
|
function SummaryCard({ label, value, tone, }) {
|
|
92
126
|
const valueClass = tone === "success" ? "text-green-600" : "text-foreground";
|
|
93
127
|
return (_jsxs("div", { className: "rounded-lg border bg-card p-4", children: [_jsx("div", { className: `text-3xl font-bold ${valueClass}`, children: value }), _jsx("div", { className: "mt-1 text-sm text-muted-foreground", children: label })] }));
|
|
94
128
|
}
|
|
95
|
-
function DayRow({ day, onOrderClick }) {
|
|
129
|
+
function DayRow({ day, onOrderClick, onDayClick }) {
|
|
96
130
|
const weekdayIdx = (day.date.getDay() + 6) % 7;
|
|
97
131
|
const today = new Date();
|
|
98
132
|
today.setHours(0, 0, 0, 0);
|
|
99
133
|
const isToday = isSameDay(day.date, today);
|
|
100
|
-
return (_jsxs("div", { className: `rounded-lg border bg-card ${isToday ? "ring-1 ring-primary" : ""}`, children: [_jsxs("div", { className: "flex flex-wrap items-center gap-6 px-4 py-4 sm:px-6", children: [_jsxs("div", { className: "w-20 shrink-0", children: [_jsx("div", { className: "text-xs font-medium tracking-wider text-muted-foreground", children: WEEKDAY_LABELS[weekdayIdx] }), _jsx("div", { className: "mt-1 text-3xl font-bold leading-none", children: day.date.getDate() }), _jsxs("div", { className: "text-sm text-muted-foreground", children: [MONTHS_NL_SHORT[day.date.getMonth()], "."] })] }), _jsxs("div", { className: "flex flex-1 flex-wrap items-center gap-6", children: [_jsx(Stat, { icon: _jsx(Package, { className: "h-4 w-4 text-slate-500" }), bg: "bg-slate-100", value: day.bestellingen, label: "bestellingen" }), _jsx(Stat, { icon: _jsx(Truck, { className: "h-4 w-4 text-amber-600" }), bg: "bg-amber-100", value: day.karren, label: "karren" }), _jsx(Stat, { icon: _jsx(Sprout, { className: "h-4 w-4 text-green-600" }), bg: "bg-green-100", value: day.planten, label: "planten" })] }), _jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [day.movedEarlierOrderIds.size > 0 && (_jsxs(Badge, { className: "bg-purple-500/10 text-purple-700 hover:bg-purple-500/10", variant: "secondary", title: "Aantal orders dat vervroegd is ingepland door Pickverdeling.", children: [_jsx(Scale, { className: "mr-1 h-3.5 w-3.5" }), day.movedEarlierOrderIds.size, " vervroegd"] })), day.verzendklaar > 0 && (_jsxs(Badge, { className: "bg-green-500/15 text-green-700 hover:bg-green-500/15", variant: "secondary", children: [_jsx(CheckCircle2, { className: "mr-1 h-3.5 w-3.5" }), day.verzendklaar, " verzendklaar"] })), day.voorbereiding > 0 && (_jsxs(Badge, { className: "bg-blue-500/10 text-blue-700 hover:bg-blue-500/10", variant: "secondary", children: [_jsx(Clock, { className: "mr-1 h-3.5 w-3.5" }), day.voorbereiding, " in voorbereiding"] }))] })] }), onOrderClick && day.
|
|
101
|
-
const moved =
|
|
102
|
-
|
|
134
|
+
return (_jsxs("div", { className: `rounded-lg border bg-card ${isToday ? "ring-1 ring-primary" : ""}`, children: [_jsxs("div", { className: "flex flex-wrap items-center gap-6 px-4 py-4 sm:px-6", children: [_jsxs("div", { className: "w-20 shrink-0", children: [_jsx("div", { className: "text-xs font-medium tracking-wider text-muted-foreground", children: WEEKDAY_LABELS[weekdayIdx] }), _jsx("div", { className: "mt-1 text-3xl font-bold leading-none", children: day.date.getDate() }), _jsxs("div", { className: "text-sm text-muted-foreground", children: [MONTHS_NL_SHORT[day.date.getMonth()], "."] })] }), _jsxs("div", { className: "flex flex-1 flex-wrap items-center gap-6", children: [_jsx(Stat, { icon: _jsx(Package, { className: "h-4 w-4 text-slate-500" }), bg: "bg-slate-100", value: day.bestellingen, label: "bestellingen" }), _jsx(Stat, { icon: _jsx(Truck, { className: "h-4 w-4 text-amber-600" }), bg: "bg-amber-100", value: day.karren, label: "karren" }), _jsx(Stat, { icon: _jsx(Sprout, { className: "h-4 w-4 text-green-600" }), bg: "bg-green-100", value: day.planten, label: "planten" })] }), _jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [day.movedEarlierOrderIds.size > 0 && (_jsxs(Badge, { className: "bg-purple-500/10 text-purple-700 hover:bg-purple-500/10", variant: "secondary", title: "Aantal orders dat vervroegd is ingepland door Pickverdeling.", children: [_jsx(Scale, { className: "mr-1 h-3.5 w-3.5" }), day.movedEarlierOrderIds.size, " vervroegd"] })), day.verzendklaar > 0 && (_jsxs(Badge, { className: "bg-green-500/15 text-green-700 hover:bg-green-500/15", variant: "secondary", children: [_jsx(CheckCircle2, { className: "mr-1 h-3.5 w-3.5" }), day.verzendklaar, " verzendklaar"] })), day.voorbereiding > 0 && (_jsxs(Badge, { className: "bg-blue-500/10 text-blue-700 hover:bg-blue-500/10", variant: "secondary", children: [_jsx(Clock, { className: "mr-1 h-3.5 w-3.5" }), day.voorbereiding, " in voorbereiding"] })), onDayClick && day.bestellingen > 0 && (_jsx(Button, { size: "sm", variant: "outline", onClick: () => onDayClick(day.date), children: "Dagdetails" }))] })] }), onOrderClick && day.entries.length > 0 && (_jsx("div", { className: "border-t px-4 py-2 sm:px-6", children: _jsx("div", { className: "flex flex-wrap gap-2", children: day.entries.map((e, idx) => {
|
|
135
|
+
const moved = e.movedEarlier;
|
|
136
|
+
const split = e.splitPart;
|
|
137
|
+
return (_jsxs("button", { onClick: () => onOrderClick(e.order), title: [
|
|
138
|
+
split
|
|
139
|
+
? `Deel ${split.index}/${split.total} — ${e.cartCount} karren deze dag (verdeeld picken).`
|
|
140
|
+
: moved
|
|
141
|
+
? "Deze order is eerder ingepland vanwege Pickverdeling."
|
|
142
|
+
: null,
|
|
143
|
+
e.carrierName ? `Vervoerder: ${e.carrierName}` : null,
|
|
144
|
+
e.reason ? `Planning: ${e.reason}` : null,
|
|
145
|
+
]
|
|
146
|
+
.filter(Boolean)
|
|
147
|
+
.join("\n") || undefined, className: `flex items-center gap-1 rounded border px-2 py-1 text-xs hover:bg-muted ${moved || split ? "border-purple-300 bg-purple-50" : ""}`, children: [(moved || split) && _jsx(Scale, { className: "h-3 w-3 text-purple-600" }), _jsx("span", { className: "font-medium", children: e.order.orderNumber }), _jsxs("span", { className: "ml-1 text-muted-foreground", children: ["\u00B7 ", e.order.customerName] }), _jsxs("span", { className: "ml-1 text-purple-700", children: ["\u00B7 ", e.cartCount, " karren", split ? ` (deel ${split.index}/${split.total})` : ""] })] }, `${e.order.id}-${idx}`));
|
|
103
148
|
}) }) }))] }));
|
|
104
149
|
}
|
|
105
150
|
function Stat({ icon, bg, value, label, }) {
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
interface WeekdayPickerProps {
|
|
2
|
+
value: number[];
|
|
3
|
+
onChange: (next: number[]) => void;
|
|
4
|
+
disabled?: boolean;
|
|
5
|
+
idPrefix?: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Reusable weekday-picker. Waarden zijn ISO-dagnummers (1=maandag … 7=zondag).
|
|
9
|
+
*/
|
|
10
|
+
export declare function WeekdayPicker({ value, onChange, disabled, idPrefix, }: WeekdayPickerProps): import("react").JSX.Element;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=WeekdayPicker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WeekdayPicker.d.ts","sourceRoot":"","sources":["../../../src/components/afhandeling/WeekdayPicker.tsx"],"names":[],"mappings":"AAYA,UAAU,kBAAkB;IAC1B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,QAAe,GAChB,EAAE,kBAAkB,+BAmCpB"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Checkbox, Label } from "@flowselections/core";
|
|
3
|
+
const DAYS = [
|
|
4
|
+
{ iso: 1, label: "Maandag" },
|
|
5
|
+
{ iso: 2, label: "Dinsdag" },
|
|
6
|
+
{ iso: 3, label: "Woensdag" },
|
|
7
|
+
{ iso: 4, label: "Donderdag" },
|
|
8
|
+
{ iso: 5, label: "Vrijdag" },
|
|
9
|
+
{ iso: 6, label: "Zaterdag" },
|
|
10
|
+
{ iso: 7, label: "Zondag" },
|
|
11
|
+
];
|
|
12
|
+
/**
|
|
13
|
+
* Reusable weekday-picker. Waarden zijn ISO-dagnummers (1=maandag … 7=zondag).
|
|
14
|
+
*/
|
|
15
|
+
export function WeekdayPicker({ value, onChange, disabled, idPrefix = "wd", }) {
|
|
16
|
+
const set = new Set(value ?? []);
|
|
17
|
+
const toggle = (iso, checked) => {
|
|
18
|
+
const next = new Set(set);
|
|
19
|
+
if (checked)
|
|
20
|
+
next.add(iso);
|
|
21
|
+
else
|
|
22
|
+
next.delete(iso);
|
|
23
|
+
onChange(Array.from(next).sort((a, b) => a - b));
|
|
24
|
+
};
|
|
25
|
+
return (_jsx("div", { className: "grid grid-cols-2 gap-2 sm:grid-cols-4", children: DAYS.map((d) => {
|
|
26
|
+
const id = `${idPrefix}-${d.iso}`;
|
|
27
|
+
const checked = set.has(d.iso);
|
|
28
|
+
return (_jsxs("label", { htmlFor: id, className: "flex items-center gap-2 rounded-md border border-input bg-background px-3 py-2 text-sm cursor-pointer hover:bg-accent", children: [_jsx(Checkbox, { id: id, checked: checked, disabled: disabled, onCheckedChange: (v) => toggle(d.iso, v === true) }), _jsx(Label, { htmlFor: id, className: "cursor-pointer select-none", children: d.label })] }, d.iso));
|
|
29
|
+
}) }));
|
|
30
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { PickstationOrder } from "../../lib/pickstationTypes";
|
|
2
|
-
/** Returns a fully self-contained printable HTML document for one packing slip. */
|
|
2
|
+
/** Returns a fully self-contained printable HTML document for one packing slip per cart. */
|
|
3
3
|
export declare function renderPakbonHtml(order: {
|
|
4
4
|
id: string;
|
|
5
5
|
orderNumber: string;
|
|
@@ -7,9 +7,13 @@ export declare function renderPakbonHtml(order: {
|
|
|
7
7
|
country: string | null;
|
|
8
8
|
deliveryDate: string | null;
|
|
9
9
|
pickDate: string;
|
|
10
|
+
cartIndex: number;
|
|
11
|
+
cartTotal: number;
|
|
12
|
+
cratesOnCart: number | null;
|
|
13
|
+
cartNumber: string | null;
|
|
10
14
|
lines: {
|
|
11
15
|
description: string;
|
|
12
|
-
|
|
16
|
+
crates: number | null;
|
|
13
17
|
unit: string | null;
|
|
14
18
|
}[];
|
|
15
19
|
}): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PakbonTemplate.d.ts","sourceRoot":"","sources":["../../../src/components/pickstation/PakbonTemplate.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,
|
|
1
|
+
{"version":3,"file":"PakbonTemplate.d.ts","sourceRoot":"","sources":["../../../src/components/pickstation/PakbonTemplate.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,4FAA4F;AAC5F,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,EAAE,CAAC;CAC9E,GAAG,MAAM,CA4FT;AAWD,YAAY,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** Returns a fully self-contained printable HTML document for one packing slip. */
|
|
1
|
+
/** Returns a fully self-contained printable HTML document for one packing slip per cart. */
|
|
2
2
|
export function renderPakbonHtml(order) {
|
|
3
3
|
const fmt = (d) => {
|
|
4
4
|
if (!d)
|
|
@@ -13,54 +13,79 @@ export function renderPakbonHtml(order) {
|
|
|
13
13
|
.map((l) => `
|
|
14
14
|
<tr>
|
|
15
15
|
<td>${escapeHtml(l.description)}</td>
|
|
16
|
-
<td style="text-align:right">${l.
|
|
16
|
+
<td style="text-align:right">${l.crates ?? ""}</td>
|
|
17
17
|
<td>${escapeHtml(l.unit ?? "")}</td>
|
|
18
18
|
</tr>`)
|
|
19
19
|
.join("")
|
|
20
20
|
: `<tr><td colspan="3" style="text-align:center;color:#666">Geen regels</td></tr>`;
|
|
21
|
+
const cartLabel = `Kar ${order.cartIndex} / ${order.cartTotal}`;
|
|
22
|
+
const fustenLabel = order.cratesOnCart != null ? `${order.cratesOnCart}` : "—";
|
|
23
|
+
const cartNumber = order.cartNumber ?? `${order.orderNumber}-${order.cartIndex}`;
|
|
21
24
|
return `<!doctype html>
|
|
22
25
|
<html lang="nl">
|
|
23
26
|
<head>
|
|
24
27
|
<meta charset="utf-8">
|
|
25
|
-
<title>Pakbon ${escapeHtml(order.orderNumber)}</title>
|
|
28
|
+
<title>Pakbon ${escapeHtml(order.orderNumber)} · ${escapeHtml(cartNumber)}</title>
|
|
26
29
|
<style>
|
|
27
|
-
@page {
|
|
30
|
+
@page {
|
|
31
|
+
size: A4;
|
|
32
|
+
margin: 16mm;
|
|
33
|
+
@top-center { content: element(cartno); }
|
|
34
|
+
}
|
|
28
35
|
body { font-family: -apple-system, "Segoe UI", Helvetica, Arial, sans-serif; color:#111; }
|
|
29
36
|
h1 { margin: 0 0 4px; font-size: 26px; }
|
|
30
|
-
.sub { color:#444; margin-bottom:
|
|
31
|
-
|
|
37
|
+
.sub { color:#444; margin-bottom: 8px; }
|
|
38
|
+
|
|
39
|
+
/* Groot, vetgedrukt karnummer direct onder de titel — ook running header op elke pagina. */
|
|
40
|
+
.cart-number-hero {
|
|
41
|
+
position: running(cartno);
|
|
42
|
+
font-size: 88px;
|
|
43
|
+
font-weight: 900;
|
|
44
|
+
letter-spacing: 4px;
|
|
45
|
+
line-height: 1;
|
|
46
|
+
color: #000;
|
|
47
|
+
background: #fff;
|
|
48
|
+
border: 4px solid #000;
|
|
49
|
+
padding: 12px 20px;
|
|
50
|
+
display: inline-block;
|
|
51
|
+
margin: 6px 0 20px;
|
|
52
|
+
font-family: "Arial Black", "Helvetica Neue", Helvetica, Arial, sans-serif;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px 24px; margin: 8px 0 22px; }
|
|
32
56
|
.grid div { font-size: 14px; }
|
|
33
57
|
.label { color:#666; font-size: 11px; text-transform: uppercase; letter-spacing: .04em; }
|
|
34
58
|
.value { font-size: 16px; font-weight: 600; }
|
|
35
59
|
table { width:100%; border-collapse: collapse; font-size: 14px; }
|
|
36
60
|
th, td { padding: 8px 6px; border-bottom: 1px solid #ddd; vertical-align: top; }
|
|
37
61
|
th { text-align: left; background:#f5f5f5; }
|
|
38
|
-
.barcode {
|
|
39
|
-
.barcode-fallback { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 18px; letter-spacing: 4px; padding: 8px 12px; border: 2px solid #111; display: inline-block; }
|
|
62
|
+
.barcode-fallback { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 18px; letter-spacing: 4px; padding: 8px 12px; border: 2px solid #111; display: inline-block; margin-top: 18px; }
|
|
40
63
|
.footer { margin-top: 28px; font-size: 11px; color:#666; }
|
|
41
64
|
</style>
|
|
42
65
|
</head>
|
|
43
66
|
<body>
|
|
44
67
|
<h1>Pakbon</h1>
|
|
45
|
-
<div class="sub">Order ${escapeHtml(order.orderNumber)}</div>
|
|
68
|
+
<div class="sub">Order ${escapeHtml(order.orderNumber)} · ${escapeHtml(cartLabel)}</div>
|
|
69
|
+
|
|
70
|
+
<div class="cart-number-hero">${escapeHtml(cartNumber)}</div>
|
|
46
71
|
|
|
47
72
|
<div class="grid">
|
|
48
73
|
<div><div class="label">Klant</div><div class="value">${escapeHtml(order.customerName)}</div></div>
|
|
49
74
|
<div><div class="label">Land</div><div class="value">${escapeHtml(order.country ?? "—")}</div></div>
|
|
50
75
|
<div><div class="label">Leverdatum</div><div class="value">${fmt(order.deliveryDate)}</div></div>
|
|
51
76
|
<div><div class="label">Pickdatum</div><div class="value">${fmt(order.pickDate)}</div></div>
|
|
77
|
+
<div><div class="label">Kar</div><div class="value">${escapeHtml(cartLabel)}</div></div>
|
|
78
|
+
<div><div class="label">Fusten op deze kar</div><div class="value">${escapeHtml(fustenLabel)}</div></div>
|
|
52
79
|
</div>
|
|
53
80
|
|
|
54
81
|
<table>
|
|
55
|
-
<thead><tr><th>Omschrijving</th><th style="text-align:right;width:90px">
|
|
82
|
+
<thead><tr><th>Omschrijving</th><th style="text-align:right;width:90px">Fusten</th><th style="width:90px">Eenheid</th></tr></thead>
|
|
56
83
|
<tbody>${rows}</tbody>
|
|
57
84
|
</table>
|
|
58
85
|
|
|
59
86
|
<div class="barcode-fallback">*${escapeHtml(order.orderNumber)}*</div>
|
|
60
87
|
|
|
61
88
|
<div class="footer">Geprint via Pickstation · ${new Date().toLocaleString("nl-NL")}</div>
|
|
62
|
-
|
|
63
|
-
<script>window.addEventListener("load", function(){ setTimeout(function(){ try{ window.focus(); window.print(); }catch(e){} }, 100); });</script>
|
|
64
89
|
</body>
|
|
65
90
|
</html>`;
|
|
66
91
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AfhandelingSettingsCard.d.ts","sourceRoot":"","sources":["../../../src/components/settings/AfhandelingSettingsCard.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AfhandelingSettingsCard.d.ts","sourceRoot":"","sources":["../../../src/components/settings/AfhandelingSettingsCard.tsx"],"names":[],"mappings":"AAsBA,wBAAgB,uBAAuB,gCAmOtC"}
|
|
@@ -3,8 +3,9 @@ import { useEffect, useState } from "react";
|
|
|
3
3
|
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
|
4
4
|
import { useServerFn } from "@tanstack/react-start";
|
|
5
5
|
import { Card, CardContent, CardDescription, CardHeader, CardTitle, Button, Input, Label, Switch, toast, } from "@flowselections/core";
|
|
6
|
-
import { CalendarClock, Scale } from "lucide-react";
|
|
6
|
+
import { CalendarClock, CalendarDays, Mail, Scale } from "lucide-react";
|
|
7
7
|
import { getAfhandelingSettings, updateAfhandelingSettings, } from "../../lib/afhandelingSettings.functions";
|
|
8
|
+
import { WeekdayPicker } from "../afhandeling/WeekdayPicker";
|
|
8
9
|
export function AfhandelingSettingsCard() {
|
|
9
10
|
const qc = useQueryClient();
|
|
10
11
|
const fetchSettings = useServerFn(getAfhandelingSettings);
|
|
@@ -21,6 +22,10 @@ export function AfhandelingSettingsCard() {
|
|
|
21
22
|
transportRegisterDaysBefore: 1,
|
|
22
23
|
pickDistributionEnabled: false,
|
|
23
24
|
maxWorkdaysEarlierPick: 2,
|
|
25
|
+
signupMailEnabled: false,
|
|
26
|
+
signupMailLeadMinutes: 60,
|
|
27
|
+
signupMailPurpose: "afhandeling_carrier_signup",
|
|
28
|
+
pickWeekdays: [1, 2, 3, 4, 5],
|
|
24
29
|
};
|
|
25
30
|
}
|
|
26
31
|
},
|
|
@@ -29,12 +34,22 @@ export function AfhandelingSettingsCard() {
|
|
|
29
34
|
const [registerDays, setRegisterDays] = useState(1);
|
|
30
35
|
const [distributionEnabled, setDistributionEnabled] = useState(false);
|
|
31
36
|
const [maxEarlier, setMaxEarlier] = useState(2);
|
|
37
|
+
const [mailEnabled, setMailEnabled] = useState(false);
|
|
38
|
+
const [mailLead, setMailLead] = useState(60);
|
|
39
|
+
const [mailPurpose, setMailPurpose] = useState("afhandeling_carrier_signup");
|
|
40
|
+
const [pickWeekdays, setPickWeekdays] = useState([1, 2, 3, 4, 5]);
|
|
32
41
|
useEffect(() => {
|
|
33
42
|
if (data) {
|
|
34
43
|
setPickDays(data.pickDaysBeforeTransport);
|
|
35
44
|
setRegisterDays(data.transportRegisterDaysBefore);
|
|
36
45
|
setDistributionEnabled(Boolean(data.pickDistributionEnabled));
|
|
37
46
|
setMaxEarlier(data.maxWorkdaysEarlierPick ?? 2);
|
|
47
|
+
setMailEnabled(Boolean(data.signupMailEnabled));
|
|
48
|
+
setMailLead(data.signupMailLeadMinutes ?? 60);
|
|
49
|
+
setMailPurpose(data.signupMailPurpose ?? "afhandeling_carrier_signup");
|
|
50
|
+
setPickWeekdays(Array.isArray(data.pickWeekdays) && data.pickWeekdays.length > 0
|
|
51
|
+
? data.pickWeekdays
|
|
52
|
+
: [1, 2, 3, 4, 5]);
|
|
38
53
|
}
|
|
39
54
|
}, [data]);
|
|
40
55
|
const mutation = useMutation({
|
|
@@ -44,17 +59,21 @@ export function AfhandelingSettingsCard() {
|
|
|
44
59
|
transportRegisterDaysBefore: registerDays,
|
|
45
60
|
pickDistributionEnabled: distributionEnabled,
|
|
46
61
|
maxWorkdaysEarlierPick: maxEarlier,
|
|
62
|
+
signupMailEnabled: mailEnabled,
|
|
63
|
+
signupMailLeadMinutes: mailLead,
|
|
64
|
+
signupMailPurpose: mailPurpose,
|
|
65
|
+
pickWeekdays,
|
|
47
66
|
},
|
|
48
67
|
}),
|
|
49
|
-
onSuccess: () => {
|
|
50
|
-
|
|
51
|
-
qc
|
|
52
|
-
toast.success("Instellingen opgeslagen");
|
|
68
|
+
onSuccess: async () => {
|
|
69
|
+
const { invalidatePlanning } = await import("../../lib/invalidatePlanning");
|
|
70
|
+
await invalidatePlanning(qc);
|
|
71
|
+
toast.success("Instellingen opgeslagen — planning herberekend");
|
|
53
72
|
},
|
|
54
73
|
onError: (e) => {
|
|
55
74
|
toast.error(e instanceof Error ? e.message : "Opslaan mislukt");
|
|
56
75
|
},
|
|
57
76
|
});
|
|
58
77
|
const clamp = (n) => Math.max(0, Math.min(30, Math.floor(n) || 0));
|
|
59
|
-
return (_jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(CalendarClock, { className: "h-5 w-5 text-primary" }), _jsx(CardTitle, { children: "Afhandeling \u2014 Planning" })] }), _jsx(CardDescription, { children: "Centrale werkdag-instellingen voor de automatische order\u00ADplanning. Alle berekeningen tellen alleen werkdagen (ma\u2013vr)." })] }), _jsxs(CardContent, { className: "space-y-5", children: [_jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: "pickDays", children: "Aantal pickdagen (werkdagen v\u00F3\u00F3r ophaaldag)" }), _jsx(Input, { id: "pickDays", type: "number", min: 0, max: 30, value: pickDays, onChange: (e) => setPickDays(clamp(Number(e.target.value))) }), _jsx("p", { className: "text-xs text-muted-foreground", children: "Wordt vanaf de berekende ophaaldag teruggeteld om de uiterste pickdatum te bepalen." })] }), _jsxs("div", { className: "rounded-md border p-4 space-y-4", children: [_jsxs("div", { className: "flex items-start justify-between gap-4", children: [_jsxs("div", { className: "space-y-1", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Scale, { className: "h-4 w-4 text-primary" }), _jsx(Label, { htmlFor: "pickDistribution", className: "font-semibold", children: "Pickverdeling" })] }), _jsx("p", { className: "text-xs text-muted-foreground max-w-prose", children: "Verdeelt de pickbelasting automatisch over werkdagen. Orders mogen eerder ingepland worden, maar nooit later dan de berekende uiterste pickdatum \u2014 leverbetrouwbaarheid blijft gegarandeerd." })] }), _jsx(Switch, { id: "pickDistribution", checked: distributionEnabled, onCheckedChange: setDistributionEnabled })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: "maxEarlier", children: "Maximaal aantal werkdagen eerder picken" }), _jsx(Input, { id: "maxEarlier", type: "number", min: 0, max: 30, value: maxEarlier, disabled: !distributionEnabled, onChange: (e) => setMaxEarlier(clamp(Number(e.target.value))) }), _jsx("p", { className: "text-xs text-muted-foreground", children: "0 = geen vervroeging. Bijv. 2 = orders mogen maximaal 2 werkdagen voor hun uiterste pickdatum ingepland worden." })] })] }), _jsxs("div", { className: "rounded-md bg-muted/50 p-3 text-xs text-muted-foreground", children: [_jsx("strong", { children: "Ophaaltijd" }), " en ", _jsx("strong", { children: "Aanmeldtijd" }), " stel je per vervoerder in (werkdagen v\u00F3\u00F3r bezorgdag). De vervoerder die als ", _jsx("strong", { children: "standaard" }), " is gemarkeerd, wordt gebruikt voor orders zonder eigen vervoerder."] }), _jsx(Button, { onClick: () => mutation.mutate(), disabled: mutation.isPending, children: mutation.isPending ? "Opslaan…" : "Opslaan" })] })] }));
|
|
78
|
+
return (_jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(CalendarClock, { className: "h-5 w-5 text-primary" }), _jsx(CardTitle, { children: "Afhandeling \u2014 Planning" })] }), _jsx(CardDescription, { children: "Centrale werkdag-instellingen voor de automatische order\u00ADplanning. Alle berekeningen tellen alleen werkdagen (ma\u2013vr)." })] }), _jsxs(CardContent, { className: "space-y-5", children: [_jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: "pickDays", children: "Aantal pickdagen (werkdagen v\u00F3\u00F3r ophaaldag)" }), _jsx(Input, { id: "pickDays", type: "number", min: 0, max: 30, value: pickDays, onChange: (e) => setPickDays(clamp(Number(e.target.value))) }), _jsx("p", { className: "text-xs text-muted-foreground", children: "Wordt vanaf de berekende ophaaldag teruggeteld om de uiterste pickdatum te bepalen." })] }), _jsxs("div", { className: "rounded-md border p-4 space-y-3", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(CalendarDays, { className: "h-4 w-4 text-primary" }), _jsx(Label, { className: "font-semibold", children: "Orderpickdagen" })] }), _jsx("p", { className: "text-xs text-muted-foreground", children: "Selecteer de dagen waarop het systeem orders mag inplannen om te picken. Andere dagen worden automatisch overgeslagen." }), _jsx(WeekdayPicker, { value: pickWeekdays, onChange: setPickWeekdays, idPrefix: "pick-wd" }), pickWeekdays.length === 0 ? (_jsx("p", { className: "text-xs text-destructive", children: "Kies minimaal \u00E9\u00E9n pickdag; anders kan het systeem geen orders inplannen." })) : null] }), _jsxs("div", { className: "rounded-md border p-4 space-y-4", children: [_jsxs("div", { className: "flex items-start justify-between gap-4", children: [_jsxs("div", { className: "space-y-1", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Scale, { className: "h-4 w-4 text-primary" }), _jsx(Label, { htmlFor: "pickDistribution", className: "font-semibold", children: "Pickverdeling" })] }), _jsx("p", { className: "text-xs text-muted-foreground max-w-prose", children: "Verdeelt de pickbelasting automatisch over werkdagen. Orders mogen eerder ingepland worden, maar nooit later dan de berekende uiterste pickdatum \u2014 leverbetrouwbaarheid blijft gegarandeerd." })] }), _jsx(Switch, { id: "pickDistribution", checked: distributionEnabled, onCheckedChange: setDistributionEnabled })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: "maxEarlier", children: "Maximaal aantal werkdagen eerder picken" }), _jsx(Input, { id: "maxEarlier", type: "number", min: 0, max: 30, value: maxEarlier, disabled: !distributionEnabled, onChange: (e) => setMaxEarlier(clamp(Number(e.target.value))) }), _jsx("p", { className: "text-xs text-muted-foreground", children: "0 = geen vervroeging. Bijv. 2 = orders mogen maximaal 2 werkdagen voor hun uiterste pickdatum ingepland worden." })] })] }), _jsxs("div", { className: "rounded-md border p-4 space-y-4", children: [_jsxs("div", { className: "flex items-start justify-between gap-4", children: [_jsxs("div", { className: "space-y-1", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Mail, { className: "h-4 w-4 text-primary" }), _jsx(Label, { htmlFor: "mailEnabled", className: "font-semibold", children: "Aanmeldmail vervoerders" })] }), _jsx("p", { className: "text-xs text-muted-foreground max-w-prose", children: "Verstuurt automatisch een mail met de te verwachten karren naar de vervoerder v\u00F3\u00F3r de aanmelddeadline van het ophaalmoment. E\u00E9n mail per ophaaldag/-moment per vervoerder." })] }), _jsx(Switch, { id: "mailEnabled", checked: mailEnabled, onCheckedChange: setMailEnabled })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: "mailLead", children: "Minuten v\u00F3\u00F3r aanmelddeadline versturen" }), _jsx(Input, { id: "mailLead", type: "number", min: 0, max: 1440, value: mailLead, disabled: !mailEnabled, onChange: (e) => setMailLead(Math.max(0, Math.min(1440, Math.floor(Number(e.target.value)) || 0))) })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: "mailPurpose", children: "E-mail-doeleinde (purpose)" }), _jsx(Input, { id: "mailPurpose", value: mailPurpose, disabled: !mailEnabled, onChange: (e) => setMailPurpose(e.target.value) }), _jsxs("p", { className: "text-xs text-muted-foreground", children: ["Koppel dit doeleinde in de module ", _jsx("strong", { children: "E-mailkoppeling" }), " aan een actief send-adres. Standaard: ", _jsx("code", { children: "afhandeling_carrier_signup" }), "."] })] })] }), _jsxs("div", { className: "rounded-md bg-muted/50 p-3 text-xs text-muted-foreground", children: [_jsx("strong", { children: "Ophaaltijd" }), " en ", _jsx("strong", { children: "Aanmeldtijd" }), " stel je per vervoerder in (werkdagen v\u00F3\u00F3r bezorgdag). De vervoerder die als ", _jsx("strong", { children: "standaard" }), " is gemarkeerd, wordt gebruikt voor orders zonder eigen vervoerder."] }), _jsx(Button, { onClick: () => mutation.mutate(), disabled: mutation.isPending, children: mutation.isPending ? "Opslaan…" : "Opslaan" })] })] }));
|
|
60
79
|
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ComponentProps, HTMLAttributes } from "react";
|
|
2
|
+
import { AlertDialogContent, AlertDialogFooter, AlertDialogHeader, DialogContent, DialogFooter, DialogHeader } from "@flowselections/core";
|
|
3
|
+
type DialogSize = "sm" | "md" | "lg" | "xl";
|
|
4
|
+
type DialogRows = "default" | "with-alert";
|
|
5
|
+
export declare function ResponsiveDialogContent({ className, style, size, rows, ...props }: ComponentProps<typeof DialogContent> & {
|
|
6
|
+
size?: DialogSize;
|
|
7
|
+
rows?: DialogRows;
|
|
8
|
+
}): import("react").JSX.Element;
|
|
9
|
+
export declare function ResponsiveDialogHeader({ className, ...props }: ComponentProps<typeof DialogHeader>): import("react").JSX.Element;
|
|
10
|
+
export declare function ResponsiveDialogBody({ className, ...props }: HTMLAttributes<HTMLDivElement>): import("react").JSX.Element;
|
|
11
|
+
export declare function ResponsiveDialogFooter({ className, ...props }: ComponentProps<typeof DialogFooter>): import("react").JSX.Element;
|
|
12
|
+
export declare function ResponsiveAlertDialogContent({ className, style, size, rows, ...props }: ComponentProps<typeof AlertDialogContent> & {
|
|
13
|
+
size?: DialogSize;
|
|
14
|
+
rows?: DialogRows;
|
|
15
|
+
}): import("react").JSX.Element;
|
|
16
|
+
export declare function ResponsiveAlertDialogHeader({ className, ...props }: ComponentProps<typeof AlertDialogHeader>): import("react").JSX.Element;
|
|
17
|
+
export declare function ResponsiveAlertDialogBody({ className, ...props }: HTMLAttributes<HTMLDivElement>): import("react").JSX.Element;
|
|
18
|
+
export declare function ResponsiveAlertDialogFooter({ className, ...props }: ComponentProps<typeof AlertDialogFooter>): import("react").JSX.Element;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=responsive-dialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"responsive-dialog.d.ts","sourceRoot":"","sources":["../../../src/components/ui/responsive-dialog.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAiB,cAAc,EAAE,MAAM,OAAO,CAAC;AAC3E,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,YAAY,EACb,MAAM,sBAAsB,CAAC;AAG9B,KAAK,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAC5C,KAAK,UAAU,GAAG,SAAS,GAAG,YAAY,CAAC;AAsB3C,wBAAgB,uBAAuB,CAAC,EACtC,SAAS,EACT,KAAK,EACL,IAAW,EACX,IAAgB,EAChB,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,OAAO,aAAa,CAAC,GAAG;IACxC,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB,+BAYA;AAED,wBAAgB,sBAAsB,CAAC,EACrC,SAAS,EACT,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,OAAO,YAAY,CAAC,+BAErC;AAED,wBAAgB,oBAAoB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,cAAc,CAAC,+BAE3F;AAED,wBAAgB,sBAAsB,CAAC,EACrC,SAAS,EACT,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,OAAO,YAAY,CAAC,+BAUrC;AAED,wBAAgB,4BAA4B,CAAC,EAC3C,SAAS,EACT,KAAK,EACL,IAAW,EACX,IAAgB,EAChB,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,OAAO,kBAAkB,CAAC,GAAG;IAC7C,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB,+BAYA;AAED,wBAAgB,2BAA2B,CAAC,EAC1C,SAAS,EACT,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,OAAO,iBAAiB,CAAC,+BAE1C;AAED,wBAAgB,yBAAyB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,cAAc,CAAC,+BAEhG;AAED,wBAAgB,2BAA2B,CAAC,EAC1C,SAAS,EACT,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,OAAO,iBAAiB,CAAC,+BAU1C"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { AlertDialogContent, AlertDialogFooter, AlertDialogHeader, DialogContent, DialogFooter, DialogHeader, } from "@flowselections/core";
|
|
3
|
+
import { cn } from "../../lib/utils";
|
|
4
|
+
const WIDTH_BY_SIZE = {
|
|
5
|
+
sm: "min(40rem, calc(100vw - 2rem))",
|
|
6
|
+
md: "min(48rem, calc(100vw - 2rem))",
|
|
7
|
+
lg: "min(64rem, calc(100vw - 2rem))",
|
|
8
|
+
xl: "min(72rem, calc(100vw - 2rem))",
|
|
9
|
+
};
|
|
10
|
+
const ROWS_BY_TYPE = {
|
|
11
|
+
default: "grid-rows-[auto_minmax(0,1fr)_auto]",
|
|
12
|
+
"with-alert": "grid-rows-[auto_auto_minmax(0,1fr)_auto]",
|
|
13
|
+
};
|
|
14
|
+
function mergedStyle(size, style) {
|
|
15
|
+
return {
|
|
16
|
+
width: WIDTH_BY_SIZE[size],
|
|
17
|
+
maxWidth: "calc(100vw - 2rem)",
|
|
18
|
+
...style,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export function ResponsiveDialogContent({ className, style, size = "lg", rows = "default", ...props }) {
|
|
22
|
+
return (_jsx(DialogContent, { className: cn("grid max-h-[calc(100vh-2rem)] gap-0 overflow-hidden p-0", ROWS_BY_TYPE[rows], className), style: mergedStyle(size, style), ...props }));
|
|
23
|
+
}
|
|
24
|
+
export function ResponsiveDialogHeader({ className, ...props }) {
|
|
25
|
+
return _jsx(DialogHeader, { className: cn("border-b px-6 py-5 pr-12", className), ...props });
|
|
26
|
+
}
|
|
27
|
+
export function ResponsiveDialogBody({ className, ...props }) {
|
|
28
|
+
return _jsx("div", { className: cn("min-h-0 overflow-y-auto px-6 py-4", className), ...props });
|
|
29
|
+
}
|
|
30
|
+
export function ResponsiveDialogFooter({ className, ...props }) {
|
|
31
|
+
return (_jsx(DialogFooter, { className: cn("border-t bg-background px-6 py-4 flex w-full min-w-0 flex-col gap-2 sm:flex-row sm:flex-wrap sm:justify-end [&>*]:w-full sm:[&>*]:w-auto", className), ...props }));
|
|
32
|
+
}
|
|
33
|
+
export function ResponsiveAlertDialogContent({ className, style, size = "md", rows = "default", ...props }) {
|
|
34
|
+
return (_jsx(AlertDialogContent, { className: cn("grid max-h-[calc(100vh-2rem)] gap-0 overflow-hidden p-0", ROWS_BY_TYPE[rows], className), style: mergedStyle(size, style), ...props }));
|
|
35
|
+
}
|
|
36
|
+
export function ResponsiveAlertDialogHeader({ className, ...props }) {
|
|
37
|
+
return _jsx(AlertDialogHeader, { className: cn("border-b px-6 py-5 pr-12", className), ...props });
|
|
38
|
+
}
|
|
39
|
+
export function ResponsiveAlertDialogBody({ className, ...props }) {
|
|
40
|
+
return _jsx("div", { className: cn("min-h-0 overflow-y-auto px-6 py-4", className), ...props });
|
|
41
|
+
}
|
|
42
|
+
export function ResponsiveAlertDialogFooter({ className, ...props }) {
|
|
43
|
+
return (_jsx(AlertDialogFooter, { className: cn("border-t bg-background px-6 py-4 flex w-full min-w-0 flex-col gap-2 sm:flex-row sm:flex-wrap sm:justify-end [&>*]:w-full sm:[&>*]:w-auto", className), ...props }));
|
|
44
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { FloridayOrder } from "../lib/floriday.functions";
|
|
2
|
+
import { type CartOverride } from "../lib/cartAssignments.functions";
|
|
2
3
|
import { type OrderPlanning } from "../lib/planning";
|
|
3
4
|
export interface PlannedOrder {
|
|
4
5
|
order: FloridayOrder;
|
|
@@ -6,8 +7,10 @@ export interface PlannedOrder {
|
|
|
6
7
|
}
|
|
7
8
|
export interface UseOrderPlanningResult {
|
|
8
9
|
planned: PlannedOrder[];
|
|
10
|
+
overrides: CartOverride[];
|
|
9
11
|
isLoading: boolean;
|
|
10
12
|
error?: string;
|
|
13
|
+
warning?: string;
|
|
11
14
|
refetch: () => void;
|
|
12
15
|
}
|
|
13
16
|
export declare function useOrderPlanning(): UseOrderPlanningResult;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useOrderPlanning.d.ts","sourceRoot":"","sources":["../../src/hooks/useOrderPlanning.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAI/D,OAAO,EAIL,KAAK,aAAa,EAEnB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,aAAa,CAAC;IACrB,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,gBAAgB,IAAI,sBAAsB,
|
|
1
|
+
{"version":3,"file":"useOrderPlanning.d.ts","sourceRoot":"","sources":["../../src/hooks/useOrderPlanning.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAI/D,OAAO,EAAqB,KAAK,YAAY,EAAE,MAAM,kCAAkC,CAAC;AACxF,OAAO,EAIL,KAAK,aAAa,EAEnB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,aAAa,CAAC;IACrB,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,gBAAgB,IAAI,sBAAsB,CAoIzD"}
|