@flowselections/floriday-afhandeling-module 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.
@@ -0,0 +1,2 @@
1
+ export declare function LeveringenPage(): import("react").JSX.Element;
2
+ //# sourceMappingURL=LeveringenPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LeveringenPage.d.ts","sourceRoot":"","sources":["../../../src/components/afhandeling/LeveringenPage.tsx"],"names":[],"mappings":"AA2DA,wBAAgB,cAAc,gCAoL7B"}
@@ -0,0 +1,68 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Link } from "@tanstack/react-router";
3
+ import { useServerFn } from "@tanstack/react-start";
4
+ import { useQuery } from "@tanstack/react-query";
5
+ import { useMemo, useState } from "react";
6
+ import { Button, Badge, Input, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Tabs, TabsContent, TabsList, TabsTrigger, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@flowselections/core";
7
+ import { Plus } from "lucide-react";
8
+ import { getFloridayOrders } from "../../lib/floriday.functions";
9
+ const ALL = "__all__";
10
+ function formatDate(iso) {
11
+ if (!iso)
12
+ return "—";
13
+ const d = new Date(iso);
14
+ if (Number.isNaN(d.getTime()))
15
+ return iso;
16
+ return d.toLocaleDateString("nl-NL", { day: "2-digit", month: "2-digit", year: "numeric" });
17
+ }
18
+ function formatMoney(amount, currency) {
19
+ if (amount == null)
20
+ return "—";
21
+ try {
22
+ return new Intl.NumberFormat("nl-NL", {
23
+ style: "currency",
24
+ currency: currency ?? "EUR",
25
+ }).format(amount);
26
+ }
27
+ catch {
28
+ return `${amount.toFixed(2)} ${currency ?? ""}`.trim();
29
+ }
30
+ }
31
+ function statusVariant(status) {
32
+ const s = status.toLowerCase();
33
+ if (s.includes("delivered") || s.includes("completed") || s.includes("afgerond"))
34
+ return "bg-green-500/10 text-green-600";
35
+ if (s.includes("cancel") || s.includes("annul") || s.includes("reject"))
36
+ return "bg-red-500/10 text-red-600";
37
+ if (s.includes("pending") || s.includes("open") || s.includes("nieuw"))
38
+ return "bg-blue-500/10 text-blue-600";
39
+ return "bg-amber-500/10 text-amber-600";
40
+ }
41
+ export function LeveringenPage() {
42
+ const fetchOrders = useServerFn(getFloridayOrders);
43
+ const { data, isLoading, error, refetch, isFetching } = useQuery({
44
+ queryKey: ["floriday", "orders"],
45
+ queryFn: () => fetchOrders(),
46
+ });
47
+ const orders = data?.orders ?? [];
48
+ const [customer, setCustomer] = useState(ALL);
49
+ const [deliveryType, setDeliveryType] = useState(ALL);
50
+ const [dateFrom, setDateFrom] = useState("");
51
+ const [dateTo, setDateTo] = useState("");
52
+ const customers = useMemo(() => Array.from(new Set(orders.map((o) => o.customerName).filter(Boolean))).sort(), [orders]);
53
+ const deliveryTypes = useMemo(() => Array.from(new Set(orders.map((o) => o.deliveryType).filter(Boolean))).sort(), [orders]);
54
+ const filtered = useMemo(() => {
55
+ return orders.filter((o) => {
56
+ if (customer !== ALL && o.customerName !== customer)
57
+ return false;
58
+ if (deliveryType !== ALL && o.deliveryType !== deliveryType)
59
+ return false;
60
+ if (dateFrom && (!o.deliveryDate || o.deliveryDate < dateFrom))
61
+ return false;
62
+ if (dateTo && (!o.deliveryDate || o.deliveryDate > dateTo + "T23:59:59"))
63
+ return false;
64
+ return true;
65
+ });
66
+ }, [orders, customer, deliveryType, dateFrom, dateTo]);
67
+ return (_jsx("main", { className: "p-6 space-y-6", children: _jsxs(Tabs, { defaultValue: "overzicht", className: "space-y-6", children: [_jsxs(TabsList, { children: [_jsx(TabsTrigger, { value: "overzicht", children: "Overzicht" }), _jsx(TabsTrigger, { value: "veilbrieven", children: "Veilbrieven" })] }), _jsxs("div", { className: "flex flex-wrap items-end justify-between gap-3", children: [_jsxs("div", { className: "flex flex-wrap items-end gap-3", children: [_jsxs("div", { className: "space-y-1", children: [_jsx("label", { className: "text-xs text-muted-foreground", children: "Datum vanaf" }), _jsx(Input, { type: "date", value: dateFrom, onChange: (e) => setDateFrom(e.target.value), className: "w-40" })] }), _jsxs("div", { className: "space-y-1", children: [_jsx("label", { className: "text-xs text-muted-foreground", children: "Datum t/m" }), _jsx(Input, { type: "date", value: dateTo, onChange: (e) => setDateTo(e.target.value), className: "w-40" })] }), _jsxs("div", { className: "space-y-1", children: [_jsx("label", { className: "text-xs text-muted-foreground", children: "Klant" }), _jsxs(Select, { value: customer, onValueChange: setCustomer, children: [_jsx(SelectTrigger, { className: "w-56", children: _jsx(SelectValue, { placeholder: "Alle klanten" }) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: ALL, children: "Alle klanten" }), customers.map((c) => (_jsx(SelectItem, { value: c, children: c }, c)))] })] })] }), _jsxs("div", { className: "space-y-1", children: [_jsx("label", { className: "text-xs text-muted-foreground", children: "Type levering" }), _jsxs(Select, { value: deliveryType, onValueChange: setDeliveryType, children: [_jsx(SelectTrigger, { className: "w-56", children: _jsx(SelectValue, { placeholder: "Alle types" }) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: ALL, children: "Alle types" }), deliveryTypes.map((t) => (_jsx(SelectItem, { value: t, children: t }, t)))] })] })] })] }), _jsx(Button, { asChild: true, children: _jsxs(Link, { to: "/afhandeling/leveringen/nieuw", children: [_jsx(Plus, { className: "mr-2 h-4 w-4" }), "Levering aanmaken"] }) })] }), _jsxs(TabsContent, { value: "overzicht", className: "space-y-3", children: [error ? (_jsxs("div", { className: "rounded-md border border-destructive/30 bg-destructive/5 p-4 text-sm text-destructive", children: [error.message, _jsx(Button, { size: "sm", variant: "outline", className: "ml-3", onClick: () => refetch(), children: "Opnieuw proberen" })] })) : (_jsx("div", { className: "rounded-md border", children: _jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: "Ordernummer" }), _jsx(TableHead, { children: "Klant" }), _jsx(TableHead, { children: "Leverdatum" }), _jsx(TableHead, { children: "Type" }), _jsx(TableHead, { children: "Status" }), _jsx(TableHead, { className: "text-right", children: "Regels" }), _jsx(TableHead, { className: "text-right", children: "Totaal" })] }) }), _jsx(TableBody, { children: isLoading ? (_jsx(TableRow, { children: _jsx(TableCell, { colSpan: 7, className: "text-center text-muted-foreground", children: "Leveringen laden\u2026" }) })) : filtered.length === 0 ? (_jsx(TableRow, { children: _jsx(TableCell, { colSpan: 7, className: "text-center text-muted-foreground", children: "Geen leveringen gevonden." }) })) : (filtered.map((o) => (_jsxs(TableRow, { children: [_jsx(TableCell, { className: "font-medium", children: o.orderNumber }), _jsx(TableCell, { children: o.customerName }), _jsx(TableCell, { children: formatDate(o.deliveryDate) }), _jsx(TableCell, { children: o.deliveryType }), _jsx(TableCell, { children: _jsx(Badge, { className: statusVariant(o.status), variant: "secondary", children: o.status }) }), _jsx(TableCell, { className: "text-right", children: o.lineCount }), _jsx(TableCell, { className: "text-right", children: formatMoney(o.totalAmount, o.currency) })] }, o.id)))) })] }) })), _jsx("div", { className: "text-xs text-muted-foreground", children: isFetching ? "Bijwerken…" : `${filtered.length} van ${orders.length} leveringen` })] }), _jsx(TabsContent, { value: "veilbrieven", children: _jsx("div", { className: "rounded-md border border-dashed p-10 text-center text-sm text-muted-foreground", children: "Veilbrieven volgen in een volgende iteratie." }) })] }) }));
68
+ }
@@ -1,5 +1,5 @@
1
1
  import type { FlowModule } from "@flowselections/core";
2
2
  export * from "./_core-safelist";
3
- export * from "./components/TemplatePage";
3
+ export { LeveringenPage } from "./components/afhandeling/LeveringenPage";
4
4
  export declare const myModule: FlowModule;
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAE1C,eAAO,MAAM,QAAQ,EAAE,UAatB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAEzE,eAAO,MAAM,QAAQ,EAAE,UAatB,CAAC"}
package/dist-lib/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { PackageCheck, Truck } from "lucide-react";
2
2
  export * from "./_core-safelist";
3
- export * from "./components/TemplatePage";
3
+ export { LeveringenPage } from "./components/afhandeling/LeveringenPage";
4
4
  export const myModule = {
5
5
  id: "afhandeling",
6
6
  name: "Afhandeling",