@flowselections/layout-maker 1.38.4 → 1.45.9
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/AfleverbriefBuilderPage.d.ts +10 -0
- package/dist-lib/components/AfleverbriefBuilderPage.d.ts.map +1 -0
- package/dist-lib/components/AfleverbriefBuilderPage.js +101 -0
- package/dist-lib/components/BlokOntwerperPage.d.ts.map +1 -1
- package/dist-lib/components/BlokOntwerperPage.js +8 -3
- package/dist-lib/components/ComputersLijst.d.ts.map +1 -1
- package/dist-lib/components/ComputersLijst.js +1 -1
- package/dist-lib/components/FustKolomVolgorde.d.ts +11 -0
- package/dist-lib/components/FustKolomVolgorde.d.ts.map +1 -0
- package/dist-lib/components/FustKolomVolgorde.js +52 -0
- package/dist-lib/components/LayoutsPage.d.ts.map +1 -1
- package/dist-lib/components/LayoutsPage.js +10 -9
- package/dist-lib/components/PakbonBuilderPage.d.ts.map +1 -1
- package/dist-lib/components/PakbonBuilderPage.js +32 -14
- package/dist-lib/components/PakbonPreview.d.ts.map +1 -1
- package/dist-lib/components/PakbonPreview.js +21 -14
- package/dist-lib/components/PakbonSectiesPanel.d.ts +4 -2
- package/dist-lib/components/PakbonSectiesPanel.d.ts.map +1 -1
- package/dist-lib/components/PakbonSectiesPanel.js +5 -3
- package/dist-lib/components/PdfMapToestemmingBanner.d.ts +2 -1
- package/dist-lib/components/PdfMapToestemmingBanner.d.ts.map +1 -1
- package/dist-lib/components/PdfMapToestemmingBanner.js +124 -18
- package/dist-lib/components/PdfVoorbeeld.d.ts +20 -0
- package/dist-lib/components/PdfVoorbeeld.d.ts.map +1 -0
- package/dist-lib/components/PdfVoorbeeld.js +95 -0
- package/dist-lib/components/PrintProgrammaUitleg.d.ts.map +1 -1
- package/dist-lib/components/PrintProgrammaUitleg.js +1 -1
- package/dist-lib/components/PrintQueuePage.d.ts.map +1 -1
- package/dist-lib/components/PrintQueuePage.js +81 -43
- package/dist-lib/components/PrintplekDetailPage.d.ts.map +1 -1
- package/dist-lib/components/PrintplekDetailPage.js +2 -2
- package/dist-lib/components/PrintplekWizard.d.ts.map +1 -1
- package/dist-lib/components/PrintplekWizard.js +6 -2
- package/dist-lib/components/ProductiebonBuilderPage.d.ts.map +1 -1
- package/dist-lib/components/ProductiebonBuilderPage.js +13 -7
- package/dist-lib/index.d.ts +13 -5
- package/dist-lib/index.d.ts.map +1 -1
- package/dist-lib/index.js +10 -5
- package/dist-lib/integrations/supabase/auth-middleware.d.ts +2280 -198
- package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.server.d.ts +2280 -198
- package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.server.js +1 -1
- package/dist-lib/integrations/supabase/moduleClient.d.ts +2280 -198
- package/dist-lib/integrations/supabase/moduleClient.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/types.d.ts +2306 -182
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/types.js +1 -0
- package/dist-lib/lib/aiLayout.functions.d.ts +2280 -198
- package/dist-lib/lib/aiLayout.functions.d.ts.map +1 -1
- package/dist-lib/lib/documentVoorbeeld.functions.d.ts +23 -0
- package/dist-lib/lib/documentVoorbeeld.functions.d.ts.map +1 -0
- package/dist-lib/lib/documentVoorbeeld.functions.js +37 -0
- package/dist-lib/lib/fontMetrics.d.ts +15 -0
- package/dist-lib/lib/fontMetrics.d.ts.map +1 -0
- package/dist-lib/lib/fontMetrics.js +118 -0
- package/dist-lib/lib/htmlNaarPdf.server.d.ts +2 -2
- package/dist-lib/lib/htmlNaarPdf.server.d.ts.map +1 -1
- package/dist-lib/lib/htmlNaarPdf.server.js +2 -1
- package/dist-lib/lib/htmlPdf.server.d.ts +11 -0
- package/dist-lib/lib/htmlPdf.server.d.ts.map +1 -1
- package/dist-lib/lib/htmlPdf.server.js +118 -15
- package/dist-lib/lib/orderData.server.d.ts.map +1 -1
- package/dist-lib/lib/orderData.server.js +43 -16
- package/dist-lib/lib/pakbonBarcodeVerzoek.d.ts +39 -0
- package/dist-lib/lib/pakbonBarcodeVerzoek.d.ts.map +1 -0
- package/dist-lib/lib/pakbonBarcodeVerzoek.js +80 -0
- package/dist-lib/lib/pakbonBuilder.d.ts +62 -3
- package/dist-lib/lib/pakbonBuilder.d.ts.map +1 -1
- package/dist-lib/lib/pakbonBuilder.js +386 -50
- package/dist-lib/lib/pakbonContent.d.ts +41 -0
- package/dist-lib/lib/pakbonContent.d.ts.map +1 -0
- package/dist-lib/lib/pakbonContent.js +668 -0
- package/dist-lib/lib/pakbonDocument.d.ts +199 -0
- package/dist-lib/lib/pakbonDocument.d.ts.map +1 -0
- package/dist-lib/lib/pakbonDocument.js +735 -0
- package/dist-lib/lib/pakbonHtml.d.ts +7 -0
- package/dist-lib/lib/pakbonHtml.d.ts.map +1 -1
- package/dist-lib/lib/pakbonHtml.js +89 -73
- package/dist-lib/lib/pakbonPresentation.d.ts +8 -0
- package/dist-lib/lib/pakbonPresentation.d.ts.map +1 -0
- package/dist-lib/lib/pakbonPresentation.js +31 -0
- package/dist-lib/lib/pakbonScan.d.ts.map +1 -1
- package/dist-lib/lib/pakbonScan.js +20 -38
- package/dist-lib/lib/pdfJobSaver.d.ts +10 -6
- package/dist-lib/lib/pdfJobSaver.d.ts.map +1 -1
- package/dist-lib/lib/pdfJobSaver.js +302 -99
- package/dist-lib/lib/pdfMap.d.ts +37 -2
- package/dist-lib/lib/pdfMap.d.ts.map +1 -1
- package/dist-lib/lib/pdfMap.js +120 -7
- package/dist-lib/lib/pdfOpslagStatus.d.ts +23 -0
- package/dist-lib/lib/pdfOpslagStatus.d.ts.map +1 -0
- package/dist-lib/lib/pdfOpslagStatus.js +74 -0
- package/dist-lib/lib/printApi.d.ts +31 -0
- package/dist-lib/lib/printApi.d.ts.map +1 -1
- package/dist-lib/lib/printApi.js +62 -1
- package/dist-lib/lib/printQueue.server.d.ts +6 -0
- package/dist-lib/lib/printQueue.server.d.ts.map +1 -1
- package/dist-lib/lib/printQueue.server.js +450 -94
- package/dist-lib/lib/printService.functions.d.ts +8857 -529
- package/dist-lib/lib/printService.functions.d.ts.map +1 -1
- package/dist-lib/lib/profielHtml.d.ts.map +1 -1
- package/dist-lib/lib/profielHtml.js +8 -1
- package/dist-lib/lib/useDocumentData.d.ts +8 -0
- package/dist-lib/lib/useDocumentData.d.ts.map +1 -1
- package/dist-lib/lib/useDocumentData.js +1 -1
- package/dist-lib/lib/voorbeeldPrint.d.ts +3 -0
- package/dist-lib/lib/voorbeeldPrint.d.ts.map +1 -1
- package/dist-lib/lib/voorbeeldPrint.js +65 -17
- package/package.json +9 -2
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sectiegebaseerde afleverbrief-builder. Deelt het sectiesysteem met de
|
|
3
|
+
* pakbon-opbouw, maar slaat de indeling onder de eigen sleutel "afleverbrief"
|
|
4
|
+
* op en kent geen kar-, laag- of fustvarianten: een afleverbrief geldt altijd
|
|
5
|
+
* voor de hele levering.
|
|
6
|
+
*/
|
|
7
|
+
export declare function AfleverbriefBuilderPage({ layoutId: layoutIdProp }?: {
|
|
8
|
+
layoutId?: string;
|
|
9
|
+
}): import("react").JSX.Element;
|
|
10
|
+
//# sourceMappingURL=AfleverbriefBuilderPage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AfleverbriefBuilderPage.d.ts","sourceRoot":"","sources":["../../src/components/AfleverbriefBuilderPage.tsx"],"names":[],"mappings":"AA8BA;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,+BA+K7F"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useMemo, useState } from "react";
|
|
3
|
+
import { Link } from "@tanstack/react-router";
|
|
4
|
+
import { Badge, Button, Card, CardContent, CardDescription, CardHeader, CardTitle, toast, } from "@flowselections/core";
|
|
5
|
+
import { AlertTriangle, ArrowLeft, CheckCircle2, Loader2, Printer, Save } from "lucide-react";
|
|
6
|
+
import { PakbonSectiesPanel } from "./PakbonSectiesPanel.js";
|
|
7
|
+
import { PdfVoorbeeld } from "./PdfVoorbeeld.js";
|
|
8
|
+
import { FormaatOrientatieBar } from "./FormaatOrientatieBar.js";
|
|
9
|
+
import { FustKolomVolgorde } from "./FustKolomVolgorde.js";
|
|
10
|
+
import { AFLEVERBRIEF_SECTIE_TYPES, leesAfleverbriefConfig, } from "../lib/pakbonBuilder.js";
|
|
11
|
+
import { renderPakbonDocument, voorbeeldPakbonOrder } from "../lib/pakbonHtml.js";
|
|
12
|
+
import { voorbeeldPrint } from "../lib/voorbeeldPrint.js";
|
|
13
|
+
import { haalPrintLogos } from "../lib/logoLibrary.js";
|
|
14
|
+
import { updateLayout, useLayoutDetail } from "../lib/useDocumentData.js";
|
|
15
|
+
import { LayoutPrinterSelect } from "./LayoutPrinterSelect.js";
|
|
16
|
+
import { useLayoutIdParam } from "../lib/useLayoutIdParam.js";
|
|
17
|
+
/**
|
|
18
|
+
* Sectiegebaseerde afleverbrief-builder. Deelt het sectiesysteem met de
|
|
19
|
+
* pakbon-opbouw, maar slaat de indeling onder de eigen sleutel "afleverbrief"
|
|
20
|
+
* op en kent geen kar-, laag- of fustvarianten: een afleverbrief geldt altijd
|
|
21
|
+
* voor de hele levering.
|
|
22
|
+
*/
|
|
23
|
+
export function AfleverbriefBuilderPage({ layoutId: layoutIdProp } = {}) {
|
|
24
|
+
const layoutId = useLayoutIdParam(layoutIdProp);
|
|
25
|
+
const { layout, setLayout, loading } = useLayoutDetail(layoutId ?? "");
|
|
26
|
+
const [config, setConfig] = useState(null);
|
|
27
|
+
const [bezig, setBezig] = useState(false);
|
|
28
|
+
const [printen, setPrinten] = useState(false);
|
|
29
|
+
const [logos, setLogos] = useState([]);
|
|
30
|
+
const [controle, setControle] = useState("controleren");
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
void haalPrintLogos()
|
|
33
|
+
.then((l) => setLogos(Array.isArray(l) ? l : []))
|
|
34
|
+
.catch(() => setLogos([]));
|
|
35
|
+
}, []);
|
|
36
|
+
useEffect(() => {
|
|
37
|
+
if (layout)
|
|
38
|
+
setConfig(leesAfleverbriefConfig(layout.config));
|
|
39
|
+
}, [layout?.id]);
|
|
40
|
+
const breedte = useMemo(() => (layout?.orientatie === "landscape" ? layout?.hoogte_mm : layout?.breedte_mm) ?? 210, [layout]);
|
|
41
|
+
const hoogte = useMemo(() => (layout?.orientatie === "landscape" ? layout?.breedte_mm : layout?.hoogte_mm) ?? 297, [layout]);
|
|
42
|
+
const marge = Number(layout?.marge_boven ?? 10);
|
|
43
|
+
const opslaan = async () => {
|
|
44
|
+
if (!layout || !config || controle !== "gereed")
|
|
45
|
+
return;
|
|
46
|
+
setBezig(true);
|
|
47
|
+
try {
|
|
48
|
+
await updateLayout(layout.id, { config: { ...(layout.config ?? {}), afleverbrief: config } });
|
|
49
|
+
toast.success("Afleverbriefopbouw opgeslagen");
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
toast.error("Opslaan mislukt");
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
setBezig(false);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
// Eén bron voor scherm én print: exact dezelfde HTML gaat naar de
|
|
59
|
+
// server-PDF van het voorbeeld en naar de printopdracht.
|
|
60
|
+
const voorbeeldHtml = useMemo(() => {
|
|
61
|
+
if (!config)
|
|
62
|
+
return "";
|
|
63
|
+
// Een afleverbrief geldt altijd voor één kar: het voorbeeld toont er dus ook maar één.
|
|
64
|
+
const basis = voorbeeldPakbonOrder();
|
|
65
|
+
const order = { ...basis, karren: (basis.karren ?? []).slice(0, 1) };
|
|
66
|
+
return renderPakbonDocument(config, order, {
|
|
67
|
+
logos: logos,
|
|
68
|
+
breedteMm: breedte,
|
|
69
|
+
hoogteMm: hoogte,
|
|
70
|
+
margeMm: marge,
|
|
71
|
+
titel: layout?.naam ?? "Afleverbrief",
|
|
72
|
+
});
|
|
73
|
+
}, [config, logos, breedte, hoogte, marge, layout?.naam]);
|
|
74
|
+
const voorbeeldPrinten = async () => {
|
|
75
|
+
if (!config || controle !== "gereed")
|
|
76
|
+
return;
|
|
77
|
+
setPrinten(true);
|
|
78
|
+
try {
|
|
79
|
+
await voorbeeldPrint({
|
|
80
|
+
...(layout ?? {}),
|
|
81
|
+
id: layout?.id ?? layoutId,
|
|
82
|
+
naam: layout?.naam,
|
|
83
|
+
documenttype: layout?.documenttype ?? "afleverbrief",
|
|
84
|
+
papierformaat: layout?.papierformaat,
|
|
85
|
+
}, voorbeeldHtml);
|
|
86
|
+
}
|
|
87
|
+
catch (e) {
|
|
88
|
+
toast.error(e instanceof Error ? e.message : "Voorbeeld printen mislukt");
|
|
89
|
+
}
|
|
90
|
+
finally {
|
|
91
|
+
setPrinten(false);
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
if (!layoutId)
|
|
95
|
+
return (_jsxs("main", { className: "p-6 text-sm text-muted-foreground", children: ["Kies eerst een layout via ", _jsx(Link, { to: "/layouts-printers", className: "underline", children: "Layouts" }), "."] }));
|
|
96
|
+
if (loading)
|
|
97
|
+
return _jsx("main", { className: "p-6 text-sm text-muted-foreground", children: "Layout laden\u2026" });
|
|
98
|
+
if (!layout || !config)
|
|
99
|
+
return _jsx("main", { className: "p-6 text-sm text-muted-foreground", children: "Layout niet gevonden." });
|
|
100
|
+
return (_jsxs("main", { className: "space-y-4 p-6", children: [_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-3", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsx(Button, { variant: "ghost", size: "sm", asChild: true, children: _jsxs(Link, { to: "/layouts-printers", children: [_jsx(ArrowLeft, { className: "mr-2 h-4 w-4" }), " Layouts"] }) }), _jsxs("div", { children: [_jsx("h1", { className: "text-lg font-semibold", children: layout.naam }), _jsxs("p", { className: "text-xs text-muted-foreground", children: ["Afleverbrief per kar \u00B7 ", config.secties.length, " secties"] })] })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(LayoutPrinterSelect, { layoutId: layoutId }), _jsxs(Button, { size: "sm", variant: "outline", onClick: () => void voorbeeldPrinten(), disabled: printen || controle !== "gereed", children: [printen ? (_jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" })) : (_jsx(Printer, { className: "mr-2 h-4 w-4" })), "Voorbeeld printen"] }), _jsx(Button, { size: "sm", variant: "outline", asChild: true, children: _jsx(Link, { to: "/layouts-printers/blokken/$layoutId", params: { layoutId }, children: "Blokken ontwerpen" }) }), _jsxs(Button, { size: "sm", onClick: opslaan, disabled: bezig || controle !== "gereed", children: [_jsx(Save, { className: "mr-2 h-4 w-4" }), " Opslaan"] })] })] }), _jsx(FormaatOrientatieBar, { layout: layout, onChange: (patch) => setLayout((l) => (l ? { ...l, ...patch } : l)) }), _jsxs("div", { className: "grid items-start gap-4 lg:grid-cols-[400px_1fr]", children: [_jsxs(Card, { className: "flex h-[calc(100vh-14rem)] min-h-[420px] flex-col overflow-hidden lg:sticky lg:top-4", children: [_jsxs(CardHeader, { className: "pb-3", children: [_jsx(CardTitle, { className: "text-base", children: "Secties" }), _jsx(CardDescription, { children: "Voeg blokken toe, wijzig de volgorde en stel elk blok afzonderlijk in." })] }), _jsx(CardContent, { className: "min-h-0 flex-1 overflow-y-auto", children: _jsx(PakbonSectiesPanel, { config: config, onChange: setConfig, beschikbareTypes: AFLEVERBRIEF_SECTIE_TYPES }) })] }), _jsxs(Card, { className: "flex h-[calc(100vh-14rem)] min-h-[420px] flex-col overflow-hidden", children: [_jsxs(CardHeader, { className: "flex-row items-center justify-between space-y-0 pb-3", children: [_jsxs("div", { children: [_jsx(CardTitle, { className: "text-base", children: "Live voorbeeld" }), _jsx(CardDescription, { children: "Voorbeeld van de afleverbrief van \u00E9\u00E9n kar." })] }), _jsxs(Badge, { variant: controle === "afwijking" ? "destructive" : "secondary", children: [controle === "controleren" ? _jsx(Loader2, { className: "mr-1 h-3 w-3 animate-spin" }) : controle === "gereed" ? _jsx(CheckCircle2, { className: "mr-1 h-3 w-3" }) : _jsx(AlertTriangle, { className: "mr-1 h-3 w-3" }), controle === "controleren" ? "Controleren" : controle === "gereed" ? "Afdruk gereed" : "Afwijking gevonden"] })] }), _jsxs(CardContent, { className: "flex min-h-0 flex-1 flex-col overflow-hidden p-0", children: [_jsx(FustKolomVolgorde, { config: config, onChange: setConfig }), _jsx("div", { className: "min-h-0 flex-1 p-4 pt-3", children: _jsx("div", { className: "h-full rounded-md border bg-muted/30 p-2", children: voorbeeldHtml ? (_jsx(PdfVoorbeeld, { html: voorbeeldHtml, breedteMm: breedte, hoogteMm: hoogte, margeMm: marge, onControle: (status) => setControle(status) })) : null }) })] })] })] })] }));
|
|
101
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BlokOntwerperPage.d.ts","sourceRoot":"","sources":["../../src/components/BlokOntwerperPage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"BlokOntwerperPage.d.ts","sourceRoot":"","sources":["../../src/components/BlokOntwerperPage.tsx"],"names":[],"mappings":"AAkCA,yEAAyE;AACzE,wBAAgB,iBAAiB,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,+BAoMvF"}
|
|
@@ -5,7 +5,7 @@ import { Badge, Button, Card, CardContent, CardDescription, CardHeader, CardTitl
|
|
|
5
5
|
import { ArrowLeft, Plus, Save } from "lucide-react";
|
|
6
6
|
import { PakbonSectieEditor, PakbonBlokKaderEditor } from "./PakbonSectiesPanel.js";
|
|
7
7
|
import { PakbonSectiePreview } from "./PakbonPreview.js";
|
|
8
|
-
import { SECTIE_REGISTER, leesPakbonConfig, nieuweSectie, sectieDef, } from "../lib/pakbonBuilder.js";
|
|
8
|
+
import { SECTIE_REGISTER, leesAfleverbriefConfig, leesPakbonConfig, nieuweSectie, sectieDef, } from "../lib/pakbonBuilder.js";
|
|
9
9
|
import { updateLayout, useLayoutDetail } from "../lib/useDocumentData.js";
|
|
10
10
|
import { useLayoutIdParam } from "../lib/useLayoutIdParam.js";
|
|
11
11
|
/** Ontwerp elk pakbon-blok afzonderlijk, los van de volledige pagina. */
|
|
@@ -20,7 +20,9 @@ export function BlokOntwerperPage({ layoutId: layoutIdProp } = {}) {
|
|
|
20
20
|
useEffect(() => {
|
|
21
21
|
if (!layout)
|
|
22
22
|
return;
|
|
23
|
-
const c =
|
|
23
|
+
const c = layout.documenttype === "afleverbrief" || layout.documenttype === "veilingbrief"
|
|
24
|
+
? leesAfleverbriefConfig(layout.config)
|
|
25
|
+
: leesPakbonConfig(layout.config);
|
|
24
26
|
setConfig(c);
|
|
25
27
|
setActief((huidig) => huidig ?? c.secties[0]?.id ?? null);
|
|
26
28
|
}, [layout?.id]);
|
|
@@ -39,7 +41,10 @@ export function BlokOntwerperPage({ layoutId: layoutIdProp } = {}) {
|
|
|
39
41
|
return;
|
|
40
42
|
setBezig(true);
|
|
41
43
|
try {
|
|
42
|
-
|
|
44
|
+
const sleutel = layout.documenttype === "afleverbrief" || layout.documenttype === "veilingbrief"
|
|
45
|
+
? "afleverbrief"
|
|
46
|
+
: "pakbon";
|
|
47
|
+
await updateLayout(layout.id, { config: { ...(layout.config ?? {}), [sleutel]: config } });
|
|
43
48
|
toast.success("Blokontwerp opgeslagen");
|
|
44
49
|
}
|
|
45
50
|
catch {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComputersLijst.d.ts","sourceRoot":"","sources":["../../src/components/ComputersLijst.tsx"],"names":[],"mappings":"AAoBA,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,6DAA6D;IAC7D,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,YAAY;;;;;EA6C3B;AAED,wBAAgB,cAAc,CAAC,EAC7B,SAAS,EACT,OAAO,EACP,IAAI,EACJ,UAAU,EACV,mBAAmB,EACnB,aAAa,EACb,qBAAqB,EACrB,YAAoB,GACrB,EAAE;IACD,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,mBAAmB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,aAAa,EAAE,OAAO,CAAC;IACvB,qBAAqB,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5C,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,+
|
|
1
|
+
{"version":3,"file":"ComputersLijst.d.ts","sourceRoot":"","sources":["../../src/components/ComputersLijst.tsx"],"names":[],"mappings":"AAoBA,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,6DAA6D;IAC7D,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,YAAY;;;;;EA6C3B;AAED,wBAAgB,cAAc,CAAC,EAC7B,SAAS,EACT,OAAO,EACP,IAAI,EACJ,UAAU,EACV,mBAAmB,EACnB,aAAa,EACb,qBAAqB,EACrB,YAAoB,GACrB,EAAE;IACD,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,mBAAmB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,aAAa,EAAE,OAAO,CAAC;IACvB,qBAAqB,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5C,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,+BA0IA"}
|
|
@@ -71,5 +71,5 @@ export function ComputersLijst({ computers, loading, fout, onVernieuw, onPrinter
|
|
|
71
71
|
return (_jsxs("div", { className: alleenDialog ? "" : "space-y-3", children: [!alleenDialog && loading && _jsx("p", { className: "text-muted-foreground text-sm", children: "Laden\u2026" }), !alleenDialog && !loading && fout && (_jsx(Card, { children: _jsxs(CardContent, { className: "space-y-3 py-6", children: [_jsx("p", { className: "font-medium", children: "Geen verbinding" }), _jsx("p", { className: "text-muted-foreground text-sm", children: fout }), _jsxs(Button, { variant: "outline", onClick: onVernieuw, children: [_jsx(RefreshCw, { className: "mr-2 h-4 w-4" }), " Opnieuw proberen"] })] }) })), !alleenDialog && !loading && !fout && computers.length === 0 && (_jsx(Card, { children: _jsxs(CardContent, { className: "space-y-4 py-8", children: [_jsx(PrintProgrammaUitleg, {}), _jsxs(Button, { onClick: () => onToevoegenOpenChange(true), children: [_jsx(Plus, { className: "mr-2 h-4 w-4" }), " Computer toevoegen"] })] }) })), !alleenDialog && computers.map((c) => (_jsxs("div", { className: "bg-card flex items-center gap-4 rounded-xl border p-4", children: [_jsx("div", { className: "bg-muted rounded-lg p-2.5", children: _jsx(Monitor, { className: "text-muted-foreground h-5 w-5" }) }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("p", { className: "truncate font-medium", children: c.naam }), _jsxs("p", { className: "text-muted-foreground text-sm", children: [c.aantalGevonden, " ", c.aantalGevonden === 1 ? "printer gevonden" : "printers gevonden"] })] }), _jsx("span", { className: `rounded-full px-2.5 py-1 text-xs font-medium ${c.online ? "bg-primary/10 text-primary" : "bg-muted text-muted-foreground"}`, children: c.online ? "Aan" : "Uit" }), _jsx(Button, { variant: "ghost", size: "sm", onClick: () => onPrintersToevoegen(c.naam), children: "Printers toevoegen" })] }, c.id))), !alleenDialog && computers.length > 0 && _jsx(WerktHetNiet, {}), _jsx(Dialog, { open: toevoegenOpen, onOpenChange: onToevoegenOpenChange, children: _jsxs(DialogContent, { className: "sm:max-w-lg", children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: "Computer toevoegen" }), _jsx(DialogDescription, { children: "Zet het printprogramma klaar op de computer waar de printers aan hangen." })] }), _jsx(PrintProgrammaUitleg, { compact: true }), _jsx("div", { className: "space-y-2 rounded-lg border p-4 text-sm", children: computers.length === 0 ? (_jsxs("p", { className: "text-muted-foreground flex items-center gap-2", children: [_jsx(Loader2, { className: "h-4 w-4 animate-spin" }), " We wachten tot de computer zich meldt\u2026"] })) : (_jsxs(_Fragment, { children: [_jsx("p", { className: "font-medium", children: nieuw ? `Nieuwe computer gevonden: ${nieuw.naam}` : "Gevonden computers" }), computers.map((c) => (_jsxs("div", { className: "flex items-center gap-3 rounded-md border p-2", children: [_jsx(Monitor, { className: "text-muted-foreground h-4 w-4" }), _jsx("span", { className: "min-w-0 flex-1 truncate", children: c.naam }), _jsx("span", { className: "text-muted-foreground text-xs", children: c.online ? "Aan" : "Uit" }), _jsx(Button, { size: "sm", onClick: () => {
|
|
72
72
|
onToevoegenOpenChange(false);
|
|
73
73
|
onPrintersToevoegen(c.naam);
|
|
74
|
-
}, children: "Printers toevoegen" })] }, c.id))), _jsx("p", { className: "text-muted-foreground text-xs", children: "Staat jouw Mac er niet bij?
|
|
74
|
+
}, children: "Printers toevoegen" })] }, c.id))), _jsx("p", { className: "text-muted-foreground text-xs", children: "Staat jouw Mac er niet bij? Dan kent de printdienst hem nog niet: start het printprogramma op die Mac en log daar in met dezelfde beheerdergegevens (geen eigen PrintNode-account). De naam in de lijst is de macOS-computernaam \u2014 die kan anders heten dan je verwacht." })] })) }), _jsx("div", { className: "flex justify-end", children: _jsx(Button, { variant: "outline", onClick: () => onToevoegenOpenChange(false), children: "Sluiten" }) }), _jsx(WerktHetNiet, {})] }) })] }));
|
|
75
75
|
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type PakbonConfig } from "../lib/pakbonBuilder.js";
|
|
2
|
+
/**
|
|
3
|
+
* Sleepbalk boven het live voorbeeld: elke fustkolom is een chip die je naar
|
|
4
|
+
* voren, naar het midden of naar achteren kunt slepen. De volgorde van de
|
|
5
|
+
* chips is exact de kolomvolgorde op de afdruk.
|
|
6
|
+
*/
|
|
7
|
+
export declare function FustKolomVolgorde({ config, onChange, }: {
|
|
8
|
+
config: PakbonConfig;
|
|
9
|
+
onChange: (c: PakbonConfig) => void;
|
|
10
|
+
}): import("react").JSX.Element | null;
|
|
11
|
+
//# sourceMappingURL=FustKolomVolgorde.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FustKolomVolgorde.d.ts","sourceRoot":"","sources":["../../src/components/FustKolomVolgorde.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAoB,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAE3E;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,MAAM,EACN,QAAQ,GACT,EAAE;IACD,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,IAAI,CAAC;CACrC,sCAoEA"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import { GripVertical } from "lucide-react";
|
|
4
|
+
import { Button } from "@flowselections/core";
|
|
5
|
+
import { FUSTREGEL_LABELS } from "../lib/pakbonBuilder.js";
|
|
6
|
+
/**
|
|
7
|
+
* Sleepbalk boven het live voorbeeld: elke fustkolom is een chip die je naar
|
|
8
|
+
* voren, naar het midden of naar achteren kunt slepen. De volgorde van de
|
|
9
|
+
* chips is exact de kolomvolgorde op de afdruk.
|
|
10
|
+
*/
|
|
11
|
+
export function FustKolomVolgorde({ config, onChange, }) {
|
|
12
|
+
const [sleep, setSleep] = useState(null);
|
|
13
|
+
const [over, setOver] = useState(null);
|
|
14
|
+
const secties = Array.isArray(config?.secties) ? config.secties : [];
|
|
15
|
+
const sectie = secties.find((s) => s.type === "fustregels" && s.zichtbaar !== false);
|
|
16
|
+
const velden = Array.isArray(sectie?.opties?.["velden"])
|
|
17
|
+
? sectie.opties["velden"]
|
|
18
|
+
: [];
|
|
19
|
+
if (!sectie || velden.length < 2)
|
|
20
|
+
return null;
|
|
21
|
+
const zetVolgorde = (nieuw) => {
|
|
22
|
+
onChange({
|
|
23
|
+
...config,
|
|
24
|
+
secties: secties.map((s) => s.id === sectie.id ? { ...s, opties: { ...s.opties, velden: nieuw } } : s),
|
|
25
|
+
});
|
|
26
|
+
};
|
|
27
|
+
const verplaats = (van, naar) => {
|
|
28
|
+
if (van === naar || van < 0 || naar < 0)
|
|
29
|
+
return;
|
|
30
|
+
const nieuw = [...velden];
|
|
31
|
+
const [item] = nieuw.splice(van, 1);
|
|
32
|
+
if (item === undefined)
|
|
33
|
+
return;
|
|
34
|
+
nieuw.splice(naar, 0, item);
|
|
35
|
+
zetVolgorde(nieuw);
|
|
36
|
+
};
|
|
37
|
+
return (_jsxs("div", { className: "flex flex-wrap items-center gap-1.5 border-b px-3 py-2", children: [_jsx("span", { className: "mr-1 text-xs font-medium text-muted-foreground", children: "Fustkolommen:" }), velden.map((veld, i) => (_jsxs(Button, { type: "button", size: "sm", variant: "outline", draggable: true, onDragStart: () => setSleep(i), onDragOver: (e) => {
|
|
38
|
+
e.preventDefault();
|
|
39
|
+
setOver(i);
|
|
40
|
+
}, onDrop: (e) => {
|
|
41
|
+
e.preventDefault();
|
|
42
|
+
if (sleep !== null)
|
|
43
|
+
verplaats(sleep, i);
|
|
44
|
+
setSleep(null);
|
|
45
|
+
setOver(null);
|
|
46
|
+
}, onDragEnd: () => {
|
|
47
|
+
setSleep(null);
|
|
48
|
+
setOver(null);
|
|
49
|
+
}, className: `h-7 cursor-grab gap-1 px-2 text-xs active:cursor-grabbing ${over === i && sleep !== null && sleep !== i
|
|
50
|
+
? "border-primary bg-primary/10"
|
|
51
|
+
: ""} ${sleep === i ? "opacity-50" : ""}`, title: `Sleep ${FUSTREGEL_LABELS[veld] ?? veld} naar de gewenste positie`, children: [_jsx(GripVertical, { className: "h-3 w-3 text-muted-foreground" }), FUSTREGEL_LABELS[veld] ?? veld] }, veld)))] }));
|
|
52
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LayoutsPage.d.ts","sourceRoot":"","sources":["../../src/components/LayoutsPage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"LayoutsPage.d.ts","sourceRoot":"","sources":["../../src/components/LayoutsPage.tsx"],"names":[],"mappings":"AA2EA,wBAAgB,WAAW,CAAC,EAAE,OAAe,EAAE,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,+BAimB1E"}
|
|
@@ -7,6 +7,14 @@ import { Copy, FileText, Pencil, Plus, Search, Settings2, Trash2 } from "lucide-
|
|
|
7
7
|
import { dupliceerLayout, maakLayout, updateLayout, useLayouts, usePrinters, zetLayoutPrinter, verwijderLayout, } from "../lib/useDocumentData.js";
|
|
8
8
|
import { DOCUMENT_TYPES, FLORIDAY_LAYOUT_TOELICHTING, PAPIERFORMATEN, documentTypeLabel, isFloridayLayout, } from "../lib/documentTypes.js";
|
|
9
9
|
import { DOCUMENT_PROFIELEN, documentProfiel, primaireProfielen, standaardConfig, } from "../lib/documentProfiles.js";
|
|
10
|
+
/** Elk documenttype krijgt zijn eigen opbouwpagina. */
|
|
11
|
+
function builderRoute(documenttype, layoutId) {
|
|
12
|
+
if (documenttype === "productiebon")
|
|
13
|
+
return { to: "/layouts-printers/productiebon/$layoutId", params: { layoutId } };
|
|
14
|
+
if (documenttype === "afleverbrief" || documenttype === "veilingbrief")
|
|
15
|
+
return { to: "/layouts-printers/afleverbrief/$layoutId", params: { layoutId } };
|
|
16
|
+
return { to: "/layouts-printers/pakbon/$layoutId", params: { layoutId } };
|
|
17
|
+
}
|
|
10
18
|
function klantOntwerpLayout(l) {
|
|
11
19
|
if (l.documenttype !== "sticker")
|
|
12
20
|
return false;
|
|
@@ -137,9 +145,7 @@ export function LayoutsPage({ ingebed = false } = {}) {
|
|
|
137
145
|
void reload();
|
|
138
146
|
if (wasKlantOntwerp)
|
|
139
147
|
return;
|
|
140
|
-
void navigate(documenttype
|
|
141
|
-
? { to: "/layouts-printers/productiebon/$layoutId", params: { layoutId: id } }
|
|
142
|
-
: { to: "/layouts-printers/pakbon/$layoutId", params: { layoutId: id } });
|
|
148
|
+
void navigate(builderRoute(documenttype, id));
|
|
143
149
|
}
|
|
144
150
|
catch {
|
|
145
151
|
toast.error("Aanmaken mislukt");
|
|
@@ -161,12 +167,7 @@ export function LayoutsPage({ ingebed = false } = {}) {
|
|
|
161
167
|
}, children: [_jsx(SelectTrigger, { "aria-label": `Printer voor ${l.naam}`, children: _jsx(SelectValue, { placeholder: "Geen printer" }) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "geen", children: "Geen printer" }), printers.filter((p) => p.actief).map((printer) => (_jsx(SelectItem, { value: printer.id, children: printer.naam }, printer.id)))] })] }) }), _jsx(TableCell, { children: _jsx(Switch, { checked: l.actief, onCheckedChange: async (v) => {
|
|
162
168
|
await updateLayout(l.id, { actief: v });
|
|
163
169
|
void reload();
|
|
164
|
-
} }) }), _jsx(TableCell, { className: "text-right", children: _jsxs("div", { className: "flex justify-end gap-1", children: [isFloridayLayout(l) ? (_jsx("span", { className: "text-xs text-muted-foreground", children: "Niet aanpasbaar \u2014 komt uit Floriday" })) : klantOntwerpLayout(l) ? (_jsx(Badge, { variant: "outline", children: "Ontwerp van klant" })) : (_jsxs(Button, { variant: "ghost", size: "sm", onClick: () => navigate(l.documenttype
|
|
165
|
-
? {
|
|
166
|
-
to: "/layouts-printers/productiebon/$layoutId",
|
|
167
|
-
params: { layoutId: l.id },
|
|
168
|
-
}
|
|
169
|
-
: { to: "/layouts-printers/pakbon/$layoutId", params: { layoutId: l.id } }), children: [_jsx(Pencil, { className: "mr-2 h-4 w-4" }), " Ontwerpen"] })), !isFloridayLayout(l) && (_jsx(Button, { variant: "ghost", size: "sm", title: "Naam, documenttype en formaat wijzigen", onClick: () => openBewerken(l), children: _jsx(Settings2, { className: "h-4 w-4" }) })), !isFloridayLayout(l) && (_jsx(Button, { variant: "ghost", size: "sm", title: "Kopie maken", onClick: async () => {
|
|
170
|
+
} }) }), _jsx(TableCell, { className: "text-right", children: _jsxs("div", { className: "flex justify-end gap-1", children: [isFloridayLayout(l) ? (_jsx("span", { className: "text-xs text-muted-foreground", children: "Niet aanpasbaar \u2014 komt uit Floriday" })) : klantOntwerpLayout(l) ? (_jsx(Badge, { variant: "outline", children: "Ontwerp van klant" })) : (_jsxs(Button, { variant: "ghost", size: "sm", onClick: () => navigate(builderRoute(l.documenttype, l.id)), children: [_jsx(Pencil, { className: "mr-2 h-4 w-4" }), " Ontwerpen"] })), !isFloridayLayout(l) && (_jsx(Button, { variant: "ghost", size: "sm", title: "Naam, documenttype en formaat wijzigen", onClick: () => openBewerken(l), children: _jsx(Settings2, { className: "h-4 w-4" }) })), !isFloridayLayout(l) && (_jsx(Button, { variant: "ghost", size: "sm", title: "Kopie maken", onClick: async () => {
|
|
170
171
|
try {
|
|
171
172
|
await dupliceerLayout(l.id);
|
|
172
173
|
toast.success("Layout gedupliceerd");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PakbonBuilderPage.d.ts","sourceRoot":"","sources":["../../src/components/PakbonBuilderPage.tsx"],"names":[],"mappings":"AA+BA,iFAAiF;AACjF,wBAAgB,iBAAiB,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,+
|
|
1
|
+
{"version":3,"file":"PakbonBuilderPage.d.ts","sourceRoot":"","sources":["../../src/components/PakbonBuilderPage.tsx"],"names":[],"mappings":"AA+BA,iFAAiF;AACjF,wBAAgB,iBAAiB,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,+BA8LvF"}
|
|
@@ -2,11 +2,11 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { useEffect, useMemo, useState } from "react";
|
|
3
3
|
import { Link } from "@tanstack/react-router";
|
|
4
4
|
import { Badge, Button, Card, CardContent, CardDescription, CardHeader, CardTitle, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, toast, } from "@flowselections/core";
|
|
5
|
-
import { ArrowLeft, Loader2, Printer, Save } from "lucide-react";
|
|
5
|
+
import { AlertTriangle, ArrowLeft, CheckCircle2, Loader2, Printer, Save } from "lucide-react";
|
|
6
6
|
import { PakbonSectiesPanel } from "./PakbonSectiesPanel.js";
|
|
7
|
-
import {
|
|
7
|
+
import { PdfVoorbeeld } from "./PdfVoorbeeld.js";
|
|
8
8
|
import { FormaatOrientatieBar } from "./FormaatOrientatieBar.js";
|
|
9
|
-
import { leesPakbonConfig } from "../lib/pakbonBuilder.js";
|
|
9
|
+
import { leesPakbonConfig, pickMethode } from "../lib/pakbonBuilder.js";
|
|
10
10
|
import { renderPakbonDocument, voorbeeldPakbonOrder } from "../lib/pakbonHtml.js";
|
|
11
11
|
import { voorbeeldPrint } from "../lib/voorbeeldPrint.js";
|
|
12
12
|
import { haalPrintLogos } from "../lib/logoLibrary.js";
|
|
@@ -21,14 +21,22 @@ export function PakbonBuilderPage({ layoutId: layoutIdProp } = {}) {
|
|
|
21
21
|
const [bezig, setBezig] = useState(false);
|
|
22
22
|
const [printen, setPrinten] = useState(false);
|
|
23
23
|
const [voorbeeldVariant, setVoorbeeldVariant] = useState("full_cart");
|
|
24
|
+
const [logos, setLogos] = useState([]);
|
|
25
|
+
const [controle, setControle] = useState("controleren");
|
|
26
|
+
useEffect(() => {
|
|
27
|
+
void haalPrintLogos()
|
|
28
|
+
.then((l) => setLogos(Array.isArray(l) ? l : []))
|
|
29
|
+
.catch(() => setLogos([]));
|
|
30
|
+
}, []);
|
|
24
31
|
useEffect(() => {
|
|
25
32
|
if (layout)
|
|
26
33
|
setConfig(leesPakbonConfig(layout.config));
|
|
27
34
|
}, [layout?.id]);
|
|
28
35
|
const breedte = useMemo(() => (layout?.orientatie === "landscape" ? layout?.hoogte_mm : layout?.breedte_mm) ?? 210, [layout]);
|
|
29
36
|
const hoogte = useMemo(() => (layout?.orientatie === "landscape" ? layout?.breedte_mm : layout?.hoogte_mm) ?? 297, [layout]);
|
|
37
|
+
const marge = Number(layout?.marge_boven ?? 10);
|
|
30
38
|
const opslaan = async () => {
|
|
31
|
-
if (!layout || !config)
|
|
39
|
+
if (!layout || !config || controle !== "gereed")
|
|
32
40
|
return;
|
|
33
41
|
setBezig(true);
|
|
34
42
|
try {
|
|
@@ -42,19 +50,29 @@ export function PakbonBuilderPage({ layoutId: layoutIdProp } = {}) {
|
|
|
42
50
|
setBezig(false);
|
|
43
51
|
}
|
|
44
52
|
};
|
|
45
|
-
|
|
53
|
+
// Eén bron voor scherm én print: exact dezelfde HTML gaat naar de
|
|
54
|
+
// server-PDF van het voorbeeld en naar de printopdracht.
|
|
55
|
+
const voorbeeldHtml = useMemo(() => {
|
|
46
56
|
if (!config)
|
|
57
|
+
return "";
|
|
58
|
+
const beideVarianten = voorbeeldVariant === "full_cart" &&
|
|
59
|
+
pickMethode(Array.isArray(config?.secties) ? config.secties : []) === "beide";
|
|
60
|
+
return renderPakbonDocument(config, voorbeeldPakbonOrder(), {
|
|
61
|
+
logos: logos,
|
|
62
|
+
breedteMm: breedte,
|
|
63
|
+
hoogteMm: hoogte,
|
|
64
|
+
margeMm: marge,
|
|
65
|
+
layoutVariant: voorbeeldVariant,
|
|
66
|
+
voorbeeldBeideVarianten: beideVarianten,
|
|
67
|
+
titel: layout?.naam ?? "Pakbon",
|
|
68
|
+
});
|
|
69
|
+
}, [config, logos, breedte, hoogte, marge, voorbeeldVariant, layout?.naam]);
|
|
70
|
+
const voorbeeldPrinten = async () => {
|
|
71
|
+
if (!config || controle !== "gereed")
|
|
47
72
|
return;
|
|
48
73
|
setPrinten(true);
|
|
49
74
|
try {
|
|
50
|
-
const
|
|
51
|
-
const html = renderPakbonDocument(config, voorbeeldPakbonOrder(), {
|
|
52
|
-
logos,
|
|
53
|
-
breedteMm: breedte,
|
|
54
|
-
hoogteMm: hoogte,
|
|
55
|
-
layoutVariant: voorbeeldVariant,
|
|
56
|
-
titel: layout?.naam ?? "Pakbon",
|
|
57
|
-
});
|
|
75
|
+
const html = voorbeeldHtml;
|
|
58
76
|
await voorbeeldPrint({
|
|
59
77
|
...(layout ?? {}),
|
|
60
78
|
id: layout?.id ?? layoutId,
|
|
@@ -76,5 +94,5 @@ export function PakbonBuilderPage({ layoutId: layoutIdProp } = {}) {
|
|
|
76
94
|
return _jsx("main", { className: "p-6 text-sm text-muted-foreground", children: "Layout laden\u2026" });
|
|
77
95
|
if (!layout || !config)
|
|
78
96
|
return _jsx("main", { className: "p-6 text-sm text-muted-foreground", children: "Layout niet gevonden." });
|
|
79
|
-
return (_jsxs("main", { className: "space-y-4 p-6", children: [_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-3", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsx(Button, { variant: "ghost", size: "sm", asChild: true, children: _jsxs(Link, { to: "/layouts-printers", children: [_jsx(ArrowLeft, { className: "mr-2 h-4 w-4" }), " Layouts"] }) }), _jsxs("div", { children: [_jsx("h1", { className: "text-lg font-semibold", children: layout.naam }), _jsxs("p", { className: "text-xs text-muted-foreground", children: ["Pakbon opbouwen uit secties \u00B7 ", config.secties.length, " secties"] })] })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(LayoutPrinterSelect, { layoutId: layoutId }), _jsxs(Button, { size: "sm", variant: "outline", onClick: () => void voorbeeldPrinten(), disabled: printen, children: [printen ? (_jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" })) : (_jsx(Printer, { className: "mr-2 h-4 w-4" })), "Voorbeeld printen"] }), _jsx(Button, { size: "sm", variant: "outline", asChild: true, children: _jsx(Link, { to: "/layouts-printers/blokken/$layoutId", params: { layoutId }, children: "Blokken ontwerpen" }) }), _jsxs(Button, { size: "sm", onClick: opslaan, disabled: bezig, children: [_jsx(Save, { className: "mr-2 h-4 w-4" }), " Opslaan"] })] })] }), _jsx(FormaatOrientatieBar, { layout: layout, onChange: (patch) => setLayout((l) => (l ? { ...l, ...patch } : l)) }), _jsxs("div", { className: "grid items-start gap-4 lg:grid-cols-[400px_1fr]", children: [_jsxs(Card, { className: "flex h-[calc(100vh-14rem)] min-h-[420px] flex-col overflow-hidden lg:sticky lg:top-4", children: [_jsxs(CardHeader, { className: "pb-3", children: [_jsx(CardTitle, { className: "text-base", children: "Secties" }), _jsx(CardDescription, { children: "Voeg blokken toe, wijzig de volgorde en stel elk blok afzonderlijk in." })] }), _jsx(CardContent, { className: "min-h-0 flex-1 overflow-y-auto", children: _jsx(PakbonSectiesPanel, { config: config, onChange: setConfig }) })] }), _jsxs(Card, { className: "flex h-[calc(100vh-14rem)] min-h-[420px] flex-col overflow-hidden", children: [_jsxs(CardHeader, { className: "flex-row items-center justify-between space-y-0 pb-3", children: [_jsxs("div", { children: [_jsx(CardTitle, { className: "text-base", children: "Live voorbeeld" }), _jsx(CardDescription, { children: "Bekijk een volle kar of een deelkar met alleen de te verzamelen fusten." })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsxs(Select, { value: voorbeeldVariant, onValueChange: (value) => setVoorbeeldVariant(value), children: [_jsx(SelectTrigger, { className: "w-48", "aria-label": "Voorbeeldvariant", children: _jsx(SelectValue, {}) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "full_cart", children: "Volle kar" }), _jsx(SelectItem, { value: "partial_order", children: "Deelkar" })] })] }),
|
|
97
|
+
return (_jsxs("main", { className: "space-y-4 p-6", children: [_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-3", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsx(Button, { variant: "ghost", size: "sm", asChild: true, children: _jsxs(Link, { to: "/layouts-printers", children: [_jsx(ArrowLeft, { className: "mr-2 h-4 w-4" }), " Layouts"] }) }), _jsxs("div", { children: [_jsx("h1", { className: "text-lg font-semibold", children: layout.naam }), _jsxs("p", { className: "text-xs text-muted-foreground", children: ["Pakbon opbouwen uit secties \u00B7 ", config.secties.length, " secties"] })] })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(LayoutPrinterSelect, { layoutId: layoutId }), _jsxs(Button, { size: "sm", variant: "outline", onClick: () => void voorbeeldPrinten(), disabled: printen || controle !== "gereed", children: [printen ? (_jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" })) : (_jsx(Printer, { className: "mr-2 h-4 w-4" })), "Voorbeeld printen"] }), _jsx(Button, { size: "sm", variant: "outline", asChild: true, children: _jsx(Link, { to: "/layouts-printers/blokken/$layoutId", params: { layoutId }, children: "Blokken ontwerpen" }) }), _jsxs(Button, { size: "sm", onClick: opslaan, disabled: bezig || controle !== "gereed", children: [_jsx(Save, { className: "mr-2 h-4 w-4" }), " Opslaan"] })] })] }), _jsx(FormaatOrientatieBar, { layout: layout, onChange: (patch) => setLayout((l) => (l ? { ...l, ...patch } : l)) }), _jsxs("div", { className: "grid items-start gap-4 lg:grid-cols-[400px_1fr]", children: [_jsxs(Card, { className: "flex h-[calc(100vh-14rem)] min-h-[420px] flex-col overflow-hidden lg:sticky lg:top-4", children: [_jsxs(CardHeader, { className: "pb-3", children: [_jsx(CardTitle, { className: "text-base", children: "Secties" }), _jsx(CardDescription, { children: "Voeg blokken toe, wijzig de volgorde en stel elk blok afzonderlijk in." })] }), _jsx(CardContent, { className: "min-h-0 flex-1 overflow-y-auto", children: _jsx(PakbonSectiesPanel, { config: config, onChange: setConfig }) })] }), _jsxs(Card, { className: "flex h-[calc(100vh-14rem)] min-h-[420px] flex-col overflow-hidden", children: [_jsxs(CardHeader, { className: "flex-row items-center justify-between space-y-0 pb-3", children: [_jsxs("div", { children: [_jsx(CardTitle, { className: "text-base", children: "Live voorbeeld" }), _jsx(CardDescription, { children: "Bekijk een volle kar of een deelkar met alleen de te verzamelen fusten." })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsxs(Select, { value: voorbeeldVariant, onValueChange: (value) => setVoorbeeldVariant(value), children: [_jsx(SelectTrigger, { className: "w-48", "aria-label": "Voorbeeldvariant", children: _jsx(SelectValue, {}) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "full_cart", children: "Volle kar" }), _jsx(SelectItem, { value: "partial_order", children: "Deelkar" })] })] }), _jsxs(Badge, { variant: controle === "afwijking" ? "destructive" : "secondary", children: [controle === "controleren" ? _jsx(Loader2, { className: "mr-1 h-3 w-3 animate-spin" }) : controle === "gereed" ? _jsx(CheckCircle2, { className: "mr-1 h-3 w-3" }) : _jsx(AlertTriangle, { className: "mr-1 h-3 w-3" }), controle === "controleren" ? "Controleren" : controle === "gereed" ? "Afdruk gereed" : "Afwijking gevonden"] })] })] }), _jsx(CardContent, { className: "min-h-0 flex-1 overflow-hidden", children: _jsx("div", { className: "h-full rounded-md border bg-muted/30 p-2", children: voorbeeldHtml ? (_jsx(PdfVoorbeeld, { html: voorbeeldHtml, breedteMm: breedte, hoogteMm: hoogte, margeMm: marge, onControle: (status) => setControle(status) })) : null }) })] })] })] }));
|
|
80
98
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PakbonPreview.d.ts","sourceRoot":"","sources":["../../src/components/PakbonPreview.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PakbonPreview.d.ts","sourceRoot":"","sources":["../../src/components/PakbonPreview.tsx"],"names":[],"mappings":"AAKA,OAAO,EAyBL,KAAK,YAAY,EAEjB,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACzB,MAAM,sBAAsB,CAAC;AA6B9B,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,SAAe,EACf,QAAc,EACd,OAAc,GACf,EAAE;IACD,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oFAAoF;IACpF,OAAO,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;CACtC,+BAiJA;AAiLD,oEAAoE;AACpE,wBAAgB,mBAAmB,CAAC,EAClC,MAAM,EACN,MAAM,EACN,SAAS,GACV,EAAE;IACD,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,+BAmCA"}
|
|
@@ -3,7 +3,8 @@ import { useMemo } from "react";
|
|
|
3
3
|
import { PaginaDocument } from "./PaginaDocument.js";
|
|
4
4
|
import { useLogos } from "../lib/logoLibrary.js";
|
|
5
5
|
import { code128Bars } from "../lib/code128.js";
|
|
6
|
-
import {
|
|
6
|
+
import { karMetadata } from "../lib/pakbonPresentation.js";
|
|
7
|
+
import { DEMO_ORDER, deelkarVoorbeeldOrder, conditieContext, groepeerIdentiekeKarren, groepeerIdentiekeLagen, karBundelTekst, fustVerzamellijst, fustRegels, FUSTREGEL_LABELS, FUSTREGEL_RECHTS, pickMethode, pakbonLayoutVariant, productVeldBreedtes, sectieOnderdruktVoorVariant, kolomLabel, laagBundelTekst, sectieZichtbaar, sorteerProducten, totalen, vulVeldcodes, } from "../lib/pakbonBuilder.js";
|
|
7
8
|
/** Voorbeeldbarcode: alleen bedoeld om de plek en hoogte te tonen. */
|
|
8
9
|
function BarcodeStrepen({ waarde, hoogteMm = 15 }) {
|
|
9
10
|
const bars = code128Bars(waarde);
|
|
@@ -146,7 +147,7 @@ function BundelMelding({ tekst }) {
|
|
|
146
147
|
return (_jsx("div", { className: "rounded border border-dashed px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wide", children: tekst }));
|
|
147
148
|
}
|
|
148
149
|
function KarBlok({ sectie, kar, velden, lagen, lagenSectie, productSectie, fustSectie, omkaderd, aantal = 1, }) {
|
|
149
|
-
return (_jsxs("div", { className: `space-y-2 ${omkaderd ? "rounded border p-2" : ""}`, children: [_jsx(KarKop, { sectie: sectie, kar: kar, velden: velden, bundelTekst: karBundelTekst(aantal) }),
|
|
150
|
+
return (_jsxs("div", { className: `space-y-2 ${omkaderd ? "rounded border p-2" : ""}`, children: [_jsx(KarKop, { sectie: sectie, kar: kar, velden: velden, bundelTekst: karBundelTekst(aantal) }), kar.barcode ? (_jsxs("div", { className: "space-y-1 py-1", children: [_jsx(BarcodeStrepen, { waarde: kar.barcode, hoogteMm: Number(opt(sectie, "barcodeHoogte", 15)) }), _jsx("div", { className: "text-[8px] text-muted-foreground", children: "Voorbeeld \u2014 iedere kar krijgt de eigen barcode van de Engine." })] })) : null, lagen.length > 0 && lagenSectie && (_jsx(LagenView, { sectie: lagenSectie, lagen: lagen, productSectie: productSectie, fustSectie: fustSectie })), fustSectie && optS(fustSectie, "modus", "totaal") === "kar" && (_jsx(FustTabel, { velden: lijst(fustSectie, "velden"), fusten: lagen.flatMap((l) => l.fusten), titel: `Fusten kar ${kar.karnummer}` }))] }));
|
|
150
151
|
}
|
|
151
152
|
/** Losse weergave van één blok — gebruikt door de blokontwerper. */
|
|
152
153
|
export function PakbonSectiePreview({ sectie, config, breedteMm, }) {
|
|
@@ -214,6 +215,21 @@ function SectieView({ sectie, order, zoek, }) {
|
|
|
214
215
|
const groepen = groepeer(order, groepering, optS(s, "sortering", "eigen"));
|
|
215
216
|
return (_jsx("div", { className: "space-y-2", children: groepen.map((g) => (_jsxs("div", { className: "space-y-1", children: [g.titel !== "—" && _jsx("div", { className: "font-semibold", children: g.titel }), _jsx(RegelWeergave, { producten: g.producten, kolommen: kolommen, weergave: optS(s, "weergave", "tabel"), toonKoppen: opt(s, "toonKoppen", true), zebra: opt(s, "zebra", false), randen: opt(s, "randen", true) })] }, g.titel))) }));
|
|
216
217
|
}
|
|
218
|
+
case "fustregels": {
|
|
219
|
+
const velden = lijst(s, "velden").filter((v) => FUSTREGEL_LABELS[v]);
|
|
220
|
+
const regels = fustRegels(order.karren, {
|
|
221
|
+
comprimeren: opt(s, "comprimeren", true) !== false,
|
|
222
|
+
sortering: optS(s, "sortering", "fustsoort"),
|
|
223
|
+
});
|
|
224
|
+
if (!velden.length || !regels.length)
|
|
225
|
+
return null;
|
|
226
|
+
const randen = opt(s, "randen", true) !== false;
|
|
227
|
+
const zebra = opt(s, "zebra", false);
|
|
228
|
+
const cel = randen ? "border-b border-neutral-300 px-1 py-0.5" : "px-1 py-0.5";
|
|
229
|
+
const totaalFusten = regels.reduce((n, r) => n + r.fust_aantal, 0);
|
|
230
|
+
const totaalPlanten = regels.reduce((n, r) => n + r.aantal, 0);
|
|
231
|
+
return (_jsxs("div", { className: "space-y-1", children: [_jsxs("table", { className: "w-full border-collapse", children: [opt(s, "toonKoppen", true) !== false && (_jsx("thead", { children: _jsx("tr", { children: velden.map((v) => (_jsx("th", { className: `${cel} font-semibold ${FUSTREGEL_RECHTS.has(v) ? "text-right" : "text-left"}`, children: FUSTREGEL_LABELS[v] }, v))) }) })), _jsx("tbody", { children: regels.map((r, i) => (_jsx("tr", { className: zebra && i % 2 === 1 ? "bg-neutral-100" : undefined, children: velden.map((v) => (_jsx("td", { className: `${cel} ${FUSTREGEL_RECHTS.has(v) ? "text-right" : "text-left"}`, children: String(r[v] ?? "") }, v))) }, i))) })] }), opt(s, "toonTotaal", true) !== false && (_jsxs("div", { className: "flex justify-end gap-3 font-semibold", children: [_jsxs("span", { children: [totaalFusten, " fusten"] }), _jsxs("span", { children: [totaalPlanten, " planten"] })] }))] }));
|
|
232
|
+
}
|
|
217
233
|
case "pickmethode":
|
|
218
234
|
if (optS(s, "methode", "kar") === "kar")
|
|
219
235
|
return null;
|
|
@@ -279,17 +295,7 @@ function KarKop({ sectie, kar, velden, bundelTekst = "" }) {
|
|
|
279
295
|
.replace(/{chauffeur}/g, kar.chauffeur)
|
|
280
296
|
.replace(/{lagen}/g, String(kar.lagen.length))
|
|
281
297
|
.replace(/{producten}/g, String(kar.lagen.reduce((n, l) => n + l.producten.length, 0)));
|
|
282
|
-
const info =
|
|
283
|
-
if (velden.includes("lagen"))
|
|
284
|
-
info.push(`${kar.lagen.length} lagen`);
|
|
285
|
-
if (velden.includes("producten"))
|
|
286
|
-
info.push(`${kar.lagen.reduce((n, l) => n + l.producten.reduce((m, p) => m + p.aantal, 0), 0)} producten`);
|
|
287
|
-
if (velden.includes("gewicht"))
|
|
288
|
-
info.push(kar.gewicht);
|
|
289
|
-
if (velden.includes("chauffeur"))
|
|
290
|
-
info.push(kar.chauffeur);
|
|
291
|
-
if (velden.includes("route"))
|
|
292
|
-
info.push(kar.route);
|
|
298
|
+
const info = karMetadata(kar, velden);
|
|
293
299
|
const groot = scheiding === "kop";
|
|
294
300
|
const gekleurd = scheiding === "kleur" || groot;
|
|
295
301
|
const toonNummer = velden.includes("karnummer");
|
|
@@ -372,9 +378,10 @@ const FUST_KOLOM_LABELS = {
|
|
|
372
378
|
locatie: "Locatie",
|
|
373
379
|
fustsoort: "Tray/fust",
|
|
374
380
|
planten_per_fust: "Pl./fust",
|
|
381
|
+
fust_aantal: "Fusten",
|
|
375
382
|
aantal: "Planten",
|
|
376
383
|
};
|
|
377
|
-
const FUST_RECHTS = new Set(["planten_per_fust", "aantal"]);
|
|
384
|
+
const FUST_RECHTS = new Set(["planten_per_fust", "fust_aantal", "aantal"]);
|
|
378
385
|
/** Verzamellijst met alle te picken fusten per fusttype, incl. producten. */
|
|
379
386
|
function FustVerzamellijst({ order, kop = "Te verzamelen fusten — karindeling zelf bepalen", velden, toonFusthoogte = true, toonTotaal = true, }) {
|
|
380
387
|
const groepen = fustVerzamellijst(order?.karren);
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import { type PakbonConfig, type PakbonSectie, type PickMethode } from "../lib/pakbonBuilder.js";
|
|
1
|
+
import { type PakbonConfig, type PakbonSectie, type PakbonSectieType, type PickMethode } from "../lib/pakbonBuilder.js";
|
|
2
2
|
/** Beheer van de secties waaruit de pakbon is opgebouwd. */
|
|
3
|
-
export declare function PakbonSectiesPanel({ config, onChange, }: {
|
|
3
|
+
export declare function PakbonSectiesPanel({ config, onChange, beschikbareTypes, }: {
|
|
4
4
|
config: PakbonConfig;
|
|
5
5
|
onChange: (c: PakbonConfig) => void;
|
|
6
|
+
/** Beperkt de keuzelijst met blokken (bijvoorbeeld voor de afleverbrief). */
|
|
7
|
+
beschikbareTypes?: PakbonSectieType[];
|
|
6
8
|
}): import("react").JSX.Element;
|
|
7
9
|
/** Volledige instellingen van één blok — herbruikt in de blokontwerper. */
|
|
8
10
|
export declare function PakbonSectieEditor({ sectie, onChange, methode, }: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PakbonSectiesPanel.d.ts","sourceRoot":"","sources":["../../src/components/PakbonSectiesPanel.tsx"],"names":[],"mappings":"AAmBA,OAAO,EASL,KAAK,YAAY,EAEjB,KAAK,YAAY,
|
|
1
|
+
{"version":3,"file":"PakbonSectiesPanel.d.ts","sourceRoot":"","sources":["../../src/components/PakbonSectiesPanel.tsx"],"names":[],"mappings":"AAmBA,OAAO,EASL,KAAK,YAAY,EAEjB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EACjB,MAAM,sBAAsB,CAAC;AAE9B,4DAA4D;AAC5D,wBAAgB,kBAAkB,CAAC,EACjC,MAAM,EACN,QAAQ,EACR,gBAAgB,GACjB,EAAE;IACD,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,IAAI,CAAC;IACpC,6EAA6E;IAC7E,gBAAgB,CAAC,EAAE,gBAAgB,EAAE,CAAC;CACvC,+BAkLA;AA0TD,2EAA2E;AAC3E,wBAAgB,kBAAkB,CAAC,EACjC,MAAM,EACN,QAAQ,EACR,OAAe,GAChB,EAAE;IACD,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC;IACjD,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB,+BAuHA;AAED,4EAA4E;AAC5E,wBAAgB,qBAAqB,CAAC,EACpC,MAAM,EACN,QAAQ,GACT,EAAE;IACD,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC;CAClD,+BA4FA"}
|
|
@@ -7,12 +7,14 @@ import { LogoBibliotheekDialog } from "./LogoBibliotheekDialog.js";
|
|
|
7
7
|
import { LogoThumbnail } from "./LogosPage.js";
|
|
8
8
|
import { BESCHIKBARE_KOLOMMEN, CONDITIE_VELDEN, SECTIE_REGISTER, nieuweKolom, nieuweSectie, pickMethode, sectieDef, sectieOnderdrukt, } from "../lib/pakbonBuilder.js";
|
|
9
9
|
/** Beheer van de secties waaruit de pakbon is opgebouwd. */
|
|
10
|
-
export function PakbonSectiesPanel({ config, onChange, }) {
|
|
10
|
+
export function PakbonSectiesPanel({ config, onChange, beschikbareTypes, }) {
|
|
11
11
|
const alleSecties = Array.isArray(config?.secties) ? config.secties : [];
|
|
12
12
|
const methode = pickMethode(alleSecties);
|
|
13
|
+
const toegestaan = (t) => !beschikbareTypes || beschikbareTypes.includes(t);
|
|
13
14
|
const secties = alleSecties.filter((s) => !sectieOnderdrukt(s.type, methode));
|
|
14
15
|
const [open, setOpen] = useState(secties[0]?.id ?? null);
|
|
15
|
-
const
|
|
16
|
+
const keuzes = SECTIE_REGISTER.filter((d) => !sectieOnderdrukt(d.type, methode) && toegestaan(d.type));
|
|
17
|
+
const [toevoegen, setToevoegen] = useState(keuzes.find((d) => d.type === "orderregels")?.type ?? keuzes[0]?.type ?? "tekstblok");
|
|
16
18
|
// Onderdrukte blokken blijven bewaard in de configuratie, ook al staan ze niet in de lijst.
|
|
17
19
|
const verborgen = alleSecties.filter((s) => sectieOnderdrukt(s.type, methode));
|
|
18
20
|
const zet = (nieuw) => onChange({ ...config, secties: [...nieuw, ...verborgen] });
|
|
@@ -43,7 +45,7 @@ export function PakbonSectiesPanel({ config, onChange, }) {
|
|
|
43
45
|
...(config.logo ?? { logoId: null }),
|
|
44
46
|
uitlijning: v,
|
|
45
47
|
},
|
|
46
|
-
}), children: [_jsx(SelectTrigger, { children: _jsx(SelectValue, {}) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "left", children: "Links" }), _jsx(SelectItem, { value: "center", children: "Midden" }), _jsx(SelectItem, { value: "right", children: "Rechts" })] })] })] })] }))] }), _jsxs("div", { className: "flex gap-2", children: [_jsxs(Select, { value: toevoegen, onValueChange: (v) => setToevoegen(v), children: [_jsx(SelectTrigger, { className: "h-9", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children:
|
|
48
|
+
}), children: [_jsx(SelectTrigger, { children: _jsx(SelectValue, {}) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "left", children: "Links" }), _jsx(SelectItem, { value: "center", children: "Midden" }), _jsx(SelectItem, { value: "right", children: "Rechts" })] })] })] })] }))] }), _jsxs("div", { className: "flex gap-2", children: [_jsxs(Select, { value: toevoegen, onValueChange: (v) => setToevoegen(v), children: [_jsx(SelectTrigger, { className: "h-9", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: keuzes.map((d) => (_jsx(SelectItem, { value: d.type, children: d.label }, d.type))) })] }), _jsx(Button, { size: "sm", onClick: () => {
|
|
47
49
|
const s = nieuweSectie(toevoegen);
|
|
48
50
|
zet([...secties, s]);
|
|
49
51
|
setOpen(s.id);
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
type PdfMapToestemmingBannerProps = {
|
|
2
2
|
alleenActieNodig?: boolean;
|
|
3
3
|
zwevend?: boolean;
|
|
4
|
+
printplekId?: string;
|
|
4
5
|
};
|
|
5
|
-
export declare function PdfMapToestemmingBanner({ alleenActieNodig, zwevend, }?: PdfMapToestemmingBannerProps): import("react").JSX.Element | null;
|
|
6
|
+
export declare function PdfMapToestemmingBanner({ alleenActieNodig, zwevend, printplekId, }?: PdfMapToestemmingBannerProps): import("react").JSX.Element | null;
|
|
6
7
|
export {};
|
|
7
8
|
//# sourceMappingURL=PdfMapToestemmingBanner.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PdfMapToestemmingBanner.d.ts","sourceRoot":"","sources":["../../src/components/PdfMapToestemmingBanner.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PdfMapToestemmingBanner.d.ts","sourceRoot":"","sources":["../../src/components/PdfMapToestemmingBanner.tsx"],"names":[],"mappings":"AA0BA,KAAK,4BAA4B,GAAG;IAClC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,wBAAgB,uBAAuB,CAAC,EACtC,gBAAwB,EACxB,OAAe,EACf,WAAW,GACZ,GAAE,4BAAiC,sCAsTnC"}
|