@flowselections/layout-maker 1.8.3 → 1.13.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/README.md +139 -132
  2. package/dist-lib/components/ComputersLijst.d.ts +2 -1
  3. package/dist-lib/components/ComputersLijst.d.ts.map +1 -1
  4. package/dist-lib/components/ComputersLijst.js +2 -2
  5. package/dist-lib/components/DocumentRouteringPage.d.ts +2 -0
  6. package/dist-lib/components/DocumentRouteringPage.d.ts.map +1 -0
  7. package/dist-lib/components/DocumentRouteringPage.js +115 -0
  8. package/dist-lib/components/LayoutsPage.d.ts.map +1 -1
  9. package/dist-lib/components/LayoutsPage.js +13 -8
  10. package/dist-lib/components/PrintQueuePage.d.ts.map +1 -1
  11. package/dist-lib/components/PrintQueuePage.js +16 -1
  12. package/dist-lib/components/PrintStatusBanner.d.ts +8 -0
  13. package/dist-lib/components/PrintStatusBanner.d.ts.map +1 -0
  14. package/dist-lib/components/PrintStatusBanner.js +15 -0
  15. package/dist-lib/components/PrinterSetupWizard.js +1 -1
  16. package/dist-lib/components/PrintersPage.d.ts.map +1 -1
  17. package/dist-lib/components/PrintersPage.js +7 -23
  18. package/dist-lib/components/WerkplekConfiguratiePage.d.ts.map +1 -1
  19. package/dist-lib/components/WerkplekConfiguratiePage.js +35 -24
  20. package/dist-lib/components/WerkplekkenTabel.d.ts +2 -2
  21. package/dist-lib/components/WerkplekkenTabel.d.ts.map +1 -1
  22. package/dist-lib/components/WerkplekkenTabel.js +4 -3
  23. package/dist-lib/index.d.ts +8 -3
  24. package/dist-lib/index.d.ts.map +1 -1
  25. package/dist-lib/index.js +9 -5
  26. package/dist-lib/integrations/supabase/auth-middleware.d.ts +491 -145
  27. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  28. package/dist-lib/integrations/supabase/client.server.d.ts +491 -145
  29. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  30. package/dist-lib/integrations/supabase/types.d.ts +505 -150
  31. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  32. package/dist-lib/lib/aiLayout.functions.d.ts +491 -145
  33. package/dist-lib/lib/aiLayout.functions.d.ts.map +1 -1
  34. package/dist-lib/lib/aiLayout.server.js +9 -9
  35. package/dist-lib/lib/browserPrint.js +5 -5
  36. package/dist-lib/lib/documentBron.d.ts +35 -0
  37. package/dist-lib/lib/documentBron.d.ts.map +1 -0
  38. package/dist-lib/lib/documentBron.js +62 -0
  39. package/dist-lib/lib/documentRoutering.d.ts +23 -0
  40. package/dist-lib/lib/documentRoutering.d.ts.map +1 -0
  41. package/dist-lib/lib/documentRoutering.js +58 -0
  42. package/dist-lib/lib/documentTypes.d.ts +54 -0
  43. package/dist-lib/lib/documentTypes.d.ts.map +1 -1
  44. package/dist-lib/lib/documentTypes.js +56 -0
  45. package/dist-lib/lib/formaatPrinters.d.ts +5 -0
  46. package/dist-lib/lib/formaatPrinters.d.ts.map +1 -1
  47. package/dist-lib/lib/formaatPrinters.js +12 -0
  48. package/dist-lib/lib/layoutPreview.js +7 -7
  49. package/dist-lib/lib/pakbonHtml.js +50 -50
  50. package/dist-lib/lib/printApi.d.ts +20 -5
  51. package/dist-lib/lib/printApi.d.ts.map +1 -1
  52. package/dist-lib/lib/printApi.js +93 -32
  53. package/dist-lib/lib/printQueue.server.d.ts.map +1 -1
  54. package/dist-lib/lib/printQueue.server.js +72 -1
  55. package/dist-lib/lib/printService.functions.d.ts +1964 -580
  56. package/dist-lib/lib/printService.functions.d.ts.map +1 -1
  57. package/dist-lib/lib/printerTelling.d.ts +24 -0
  58. package/dist-lib/lib/printerTelling.d.ts.map +1 -0
  59. package/dist-lib/lib/printerTelling.js +41 -0
  60. package/dist-lib/lib/productiebonHtml.js +15 -15
  61. package/dist-lib/lib/profielHtml.js +18 -18
  62. package/dist-lib/lib/supabaseAdmin.server.d.ts +5 -5
  63. package/dist-lib/lib/supabaseAdmin.server.js +43 -43
  64. package/dist-lib/lib/testpagina.js +1 -1
  65. package/dist-lib/lib/useDocumentData.d.ts +4 -0
  66. package/dist-lib/lib/useDocumentData.d.ts.map +1 -1
  67. package/dist-lib/lib/useDocumentData.js +106 -1
  68. package/package.json +6 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PrintStatusBanner.d.ts","sourceRoot":"","sources":["../../src/components/PrintStatusBanner.tsx"],"names":[],"mappings":"AAQA,wBAAgB,iBAAiB,CAAC,EAChC,IAAI,EACJ,kBAAuB,EACvB,gBAAuB,GACxB,EAAE;IACD,qDAAqD;IACrD,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,8CAA8C;IAC9C,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,sCA2CA"}
@@ -0,0 +1,15 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ // ============================================================================
3
+ // src/components/PrintStatusBanner.tsx — één melding over de printdienst en de
4
+ // werkplekken, zodat Printers en Printwachtrij hetzelfde verhaal vertellen.
5
+ // ============================================================================
6
+ import { Link } from "@tanstack/react-router";
7
+ import { AlertTriangle } from "lucide-react";
8
+ export function PrintStatusBanner({ fout, offlineWerkplekken = [], toonWerkplekLink = true, }) {
9
+ const sleutelProbleem = !!fout && /toegangsbewijs|401|unauthorized|token|sleutel/i.test(fout);
10
+ if (!fout && offlineWerkplekken.length === 0)
11
+ return null;
12
+ return (_jsxs("div", { className: "border-destructive/30 bg-destructive/5 text-destructive space-y-1 rounded-xl border p-4 text-sm", children: [_jsxs("p", { className: "flex items-center gap-2 font-medium", children: [_jsx(AlertTriangle, { className: "h-4 w-4" }), " Er kan nu niet worden afgedrukt"] }), fout && (_jsxs("p", { children: [fout, " ", sleutelProbleem && (_jsxs(_Fragment, { children: ["Controleer de sleutel van de printdienst bij", " ", _jsx(Link, { to: "/instellingen", className: "underline", children: "Instellingen" }), "."] }))] })), offlineWerkplekken.length > 0 && (_jsxs("p", { children: [offlineWerkplekken.length === 1
13
+ ? `Werkplek ${offlineWerkplekken[0]} staat uit`
14
+ : `${offlineWerkplekken.length} werkplekken staan uit (${offlineWerkplekken.join(", ")})`, ". Opdrachten blijven wachten tot het printprogramma op die computer draait.", toonWerkplekLink && (_jsxs(_Fragment, { children: [" ", _jsx(Link, { to: "/layouts-printers/printers", className: "underline", children: "Naar werkplekken" })] }))] }))] }));
15
+ }
@@ -145,7 +145,7 @@ export function PrinterSetupWizard({ open, onOpenChange, onKlaar, computerFilter
145
145
  const [testStatus, setTestStatus] = useState("leeg");
146
146
  const testpagina = async () => {
147
147
  setTestStatus("bezig");
148
- const html = `<div style="padding:20mm;font-size:14pt"><h1 style="font-size:20pt">Testpagina</h1>
148
+ const html = `<div style="padding:20mm;font-size:14pt"><h1 style="font-size:20pt">Testpagina</h1>
149
149
  <p>Deze pagina hoort uit: <strong>${naam}</strong></p></div>`;
150
150
  const opdracht = {
151
151
  documenttype: "pakbon",
@@ -1 +1 @@
1
- {"version":3,"file":"PrintersPage.d.ts","sourceRoot":"","sources":["../../src/components/PrintersPage.tsx"],"names":[],"mappings":"AAyBA,wBAAgB,YAAY,gCA6O3B"}
1
+ {"version":3,"file":"PrintersPage.d.ts","sourceRoot":"","sources":["../../src/components/PrintersPage.tsx"],"names":[],"mappings":"AA2BA,wBAAgB,YAAY,gCAiP3B"}
@@ -13,6 +13,8 @@ import { useNetwerkPrinters } from "../lib/useNetwerkPrinters.js";
13
13
  import { PrinterSetupWizard } from "./PrinterSetupWizard.js";
14
14
  import { ComputersLijst, useComputers } from "./ComputersLijst.js";
15
15
  import { PrinterStatsKaarten } from "./PrinterStatsKaarten.js";
16
+ import { PrintStatusBanner } from "./PrintStatusBanner.js";
17
+ import { telPrintersPerComputer } from "../lib/printerTelling.js";
16
18
  import { WerkplekkenTabel } from "./WerkplekkenTabel.js";
17
19
  export function PrintersPage() {
18
20
  const { printers, koppelingen, reload } = usePrinters();
@@ -30,24 +32,7 @@ export function PrintersPage() {
30
32
  await Promise.all([reload(true), herlaadComputers(true), zoek()]);
31
33
  }, 10000, wizard || computerToevoegen);
32
34
  const gekoppeldePrinters = useMemo(() => new Set(koppelingen.map((k) => k.printer_id)), [koppelingen]);
33
- const printersPerComputer = useMemo(() => {
34
- const externNaarComputer = new Map(gevonden.map((g) => [g.id, g.computer]));
35
- const map = new Map();
36
- for (const p of printers) {
37
- const extern = p.extern_printer_id ?? null;
38
- const naam = extern ? externNaarComputer.get(extern) : undefined;
39
- if (!naam)
40
- continue;
41
- const rij = map.get(naam) ?? { totaal: 0, gekoppeld: 0, locaties: [] };
42
- rij.totaal += 1;
43
- if (gekoppeldePrinters.has(p.id))
44
- rij.gekoppeld += 1;
45
- if (p.locatie && !rij.locaties.includes(p.locatie))
46
- rij.locaties.push(p.locatie);
47
- map.set(naam, rij);
48
- }
49
- return map;
50
- }, [printers, gevonden, gekoppeldePrinters]);
35
+ const printersPerComputer = useMemo(() => telPrintersPerComputer(printers, gevonden, gekoppeldePrinters), [printers, gevonden, gekoppeldePrinters]);
51
36
  const alleRijen = computers.map((c) => {
52
37
  const info = printersPerComputer.get(c.naam);
53
38
  return {
@@ -55,8 +40,7 @@ export function PrintersPage() {
55
40
  naam: c.naam,
56
41
  online: c.online,
57
42
  locatie: info?.locaties.join(" · ") || "Geen locatie",
58
- aantalPrinters: info?.totaal ?? c.aantalPrinters,
59
- aantalGekoppeld: info?.gekoppeld ?? 0,
43
+ telling: info ?? { gevonden: c.aantalGevonden, ingesteld: 0, gekoppeld: 0, locaties: [] },
60
44
  };
61
45
  });
62
46
  const locaties = Array.from(new Set(alleRijen.map((r) => r.locatie))).filter((l) => l !== "Geen locatie");
@@ -77,7 +61,7 @@ export function PrintersPage() {
77
61
  .map((p) => p.extern_printer_id ?? null)
78
62
  .filter((e) => !!e);
79
63
  const bekendeLocaties = Array.from(new Set(printers.map((p) => p.locatie).filter((l) => !!l)));
80
- return (_jsxs("main", { className: "space-y-6 p-6", children: [_jsxs("div", { className: "flex flex-wrap items-end justify-between gap-4", children: [_jsxs("div", { children: [_jsx("h1", { className: "text-xl font-semibold", children: "Printers" }), _jsx("p", { className: "text-muted-foreground text-sm", children: "Beheer per werkplek welke computer is aangemeld en welke printers worden gebruikt." })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Button, { variant: "ghost", asChild: true, children: _jsxs(Link, { to: "/layouts-printers/wachtrij", children: [_jsx(ListChecks, { className: "mr-2 h-4 w-4" }), " Printwachtrij"] }) }), _jsxs(Button, { onClick: () => setComputerToevoegen(true), children: [_jsx(Plus, { className: "mr-2 h-4 w-4" }), " Computer toevoegen"] })] })] }), _jsx(PrinterStatsKaarten, { kaarten: [
64
+ return (_jsxs("main", { className: "space-y-6 p-6", children: [_jsxs("div", { className: "flex flex-wrap items-end justify-between gap-4", children: [_jsxs("div", { children: [_jsx("h1", { className: "text-xl font-semibold", children: "Printers" }), _jsx("p", { className: "text-muted-foreground text-sm", children: "Beheer per werkplek welke computer is aangemeld en welke printers worden gebruikt." })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Button, { variant: "ghost", asChild: true, children: _jsxs(Link, { to: "/layouts-printers/routering", children: [_jsx(FileText, { className: "mr-2 h-4 w-4" }), " Routering"] }) }), _jsx(Button, { variant: "ghost", asChild: true, children: _jsxs(Link, { to: "/layouts-printers/wachtrij", children: [_jsx(ListChecks, { className: "mr-2 h-4 w-4" }), " Printwachtrij"] }) }), _jsxs(Button, { onClick: () => setComputerToevoegen(true), children: [_jsx(Plus, { className: "mr-2 h-4 w-4" }), " Computer toevoegen"] })] })] }), _jsx(PrintStatusBanner, { fout: computersFout, offlineWerkplekken: computers.filter((c) => !c.online).map((c) => c.naam), toonWerkplekLink: false }), _jsx(PrinterStatsKaarten, { kaarten: [
81
65
  {
82
66
  label: "Werkplekken",
83
67
  waarde: String(computers.length),
@@ -85,9 +69,9 @@ export function PrintersPage() {
85
69
  icon: Monitor,
86
70
  },
87
71
  {
88
- label: "Totaal printers",
72
+ label: "Printers",
89
73
  waarde: String(printers.length),
90
- toelichting: "Ingestelde printers",
74
+ toelichting: `Ingesteld · ${gevonden.length} gevonden op de werkplekken`,
91
75
  icon: Printer,
92
76
  },
93
77
  {
@@ -1 +1 @@
1
- {"version":3,"file":"WerkplekConfiguratiePage.d.ts","sourceRoot":"","sources":["../../src/components/WerkplekConfiguratiePage.tsx"],"names":[],"mappings":"AA2BA,wBAAgB,wBAAwB,gCA6QvC"}
1
+ {"version":3,"file":"WerkplekConfiguratiePage.d.ts","sourceRoot":"","sources":["../../src/components/WerkplekConfiguratiePage.tsx"],"names":[],"mappings":"AAwCA,wBAAgB,wBAAwB,gCA2TvC"}
@@ -4,28 +4,31 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
4
4
  // printers op deze computer en welke ontwerpen er worden afgedrukt.
5
5
  // ============================================================================
6
6
  import { useMemo, useState } from "react";
7
- import { Button, Card, CardContent, CardDescription, CardHeader, CardTitle, Checkbox, Input, toast, } from "@flowselections/core";
7
+ import { Button, Card, CardContent, CardDescription, CardHeader, CardTitle, Input, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, toast, } from "@flowselections/core";
8
8
  import { Link, useParams } from "@tanstack/react-router";
9
9
  import { ChevronRight, Monitor, Plus, Printer, Search } from "lucide-react";
10
10
  import { bijgewerktTekst, useAutoRefresh } from "../lib/useAutoRefresh.js";
11
- import { toggleKoppeling, useLayouts, usePrinters, verwijderPrinter } from "../lib/useDocumentData.js";
11
+ import { usePrinters, verwijderPrinter } from "../lib/useDocumentData.js";
12
12
  import { useNetwerkPrinters } from "../lib/useNetwerkPrinters.js";
13
13
  import { drukTestpaginaAf } from "../lib/testpagina.js";
14
+ import { DOCUMENT_TYPES, documentTypeLabel } from "../lib/documentTypes.js";
15
+ import { useWerkplekPrinters, verwijderWerkplekPrinter, zetWerkplekPrinter, } from "../lib/documentRoutering.js";
16
+ import { printerTellingTekst, telPrintersPerComputer } from "../lib/printerTelling.js";
14
17
  import { useComputers } from "./ComputersLijst.js";
15
18
  import { PrinterKaart } from "./PrinterKaart.js";
16
19
  import { PrinterSetupWizard } from "./PrinterSetupWizard.js";
20
+ const VOLG_ROUTERING = "volg-routering";
17
21
  export function WerkplekConfiguratiePage() {
18
22
  const params = useParams({ strict: false });
19
23
  const computerId = params.computerId ?? "";
20
24
  const { printers, koppelingen, reload } = usePrinters();
21
- const { layouts } = useLayouts();
22
25
  const { computers, reload: herlaadComputers } = useComputers();
23
26
  const { gevonden, zoek } = useNetwerkPrinters();
27
+ const { koppelingen: routering, reload: herlaadRoutering } = useWerkplekPrinters();
24
28
  const [wizard, setWizard] = useState(false);
25
29
  const [bewerken, setBewerken] = useState(null);
26
30
  const [gekozenPrinter, setGekozenPrinter] = useState(null);
27
31
  const [zoekComputer, setZoekComputer] = useState("");
28
- const [layoutZoek, setLayoutZoek] = useState("");
29
32
  const bijgewerkt = useAutoRefresh(async () => {
30
33
  await Promise.all([reload(true), herlaadComputers(true), zoek()]);
31
34
  }, 10000, wizard);
@@ -36,15 +39,6 @@ export function WerkplekConfiguratiePage() {
36
39
  map.set(g.id, g);
37
40
  return map;
38
41
  }, [gevonden]);
39
- const gekoppeld = useMemo(() => {
40
- const map = new Map();
41
- for (const k of koppelingen) {
42
- if (!map.has(k.printer_id))
43
- map.set(k.printer_id, new Set());
44
- map.get(k.printer_id).add(k.layout_id);
45
- }
46
- return map;
47
- }, [koppelingen]);
48
42
  const rijen = printers
49
43
  .map((p) => {
50
44
  const extern = p.extern_printer_id ?? null;
@@ -53,8 +47,26 @@ export function WerkplekConfiguratiePage() {
53
47
  })
54
48
  .filter((r) => (computer ? r.computer === computer.naam : false));
55
49
  const actievePrinter = printers.find((p) => p.id === gekozenPrinter) ?? null;
50
+ const tellingen = useMemo(() => telPrintersPerComputer(printers, gevonden, new Set(koppelingen.map((k) => k.printer_id))), [printers, gevonden, koppelingen]);
51
+ const werkplekNaam = computer?.naam ?? "";
52
+ const eigenRoutering = routering.filter((r) => r.werkplek === werkplekNaam);
53
+ const zetDocument = async (documenttype, printerId) => {
54
+ if (!werkplekNaam)
55
+ return;
56
+ try {
57
+ const bestaand = eigenRoutering.find((r) => r.documenttype === documenttype);
58
+ if (!printerId && bestaand)
59
+ await verwijderWerkplekPrinter(bestaand.id);
60
+ else
61
+ await zetWerkplekPrinter(documenttype, werkplekNaam, printerId);
62
+ await herlaadRoutering();
63
+ toast.success("Opgeslagen");
64
+ }
65
+ catch {
66
+ toast.error("Opslaan mislukt");
67
+ }
68
+ };
56
69
  const zichtbareComputers = computers.filter((c) => zoekComputer.trim() ? c.naam.toLowerCase().includes(zoekComputer.trim().toLowerCase()) : true);
57
- const zichtbareLayouts = layouts.filter((l) => layoutZoek.trim() ? l.naam.toLowerCase().includes(layoutZoek.trim().toLowerCase()) : true);
58
70
  const bekendeExterneIds = printers
59
71
  .map((p) => p.extern_printer_id ?? null)
60
72
  .filter((e) => !!e);
@@ -62,9 +74,12 @@ export function WerkplekConfiguratiePage() {
62
74
  return (_jsxs("main", { className: "space-y-6 p-6", children: [_jsxs("div", { className: "text-muted-foreground flex items-center gap-1 text-sm", children: [_jsx(Link, { to: "/layouts-printers/printers", className: "hover:text-foreground", children: "Printers" }), _jsx(ChevronRight, { className: "h-3.5 w-3.5" }), _jsx("span", { className: "text-foreground", children: computer?.naam ?? "Werkplek" })] }), _jsxs("div", { className: "flex flex-wrap items-end justify-between gap-4", children: [_jsxs("div", { children: [_jsx("h1", { className: "text-xl font-semibold", children: "Werkplek configureren" }), _jsx("p", { className: "text-muted-foreground text-sm", children: "Kies welke printers op deze computer welke ontwerpen afdrukken." })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "text-muted-foreground text-xs", children: bijgewerktTekst(bijgewerkt) }), _jsxs(Button, { onClick: () => {
63
75
  setBewerken(null);
64
76
  setWizard(true);
65
- }, children: [_jsx(Plus, { className: "mr-2 h-4 w-4" }), " Printer toevoegen"] })] })] }), _jsxs("div", { className: "grid gap-6 lg:grid-cols-[300px_1fr]", children: [_jsxs(Card, { className: "h-fit", children: [_jsx(CardHeader, { className: "pb-3", children: _jsx(CardTitle, { className: "text-base", children: "Werkplekken" }) }), _jsxs(CardContent, { className: "space-y-2", children: [_jsxs("div", { className: "relative", children: [_jsx(Search, { className: "text-muted-foreground absolute top-2.5 left-3 h-4 w-4" }), _jsx(Input, { className: "pl-9", placeholder: "Zoek werkplek", value: zoekComputer, onChange: (e) => setZoekComputer(e.target.value) })] }), zichtbareComputers.map((c) => (_jsxs(Link, { to: "/layouts-printers/printers/$computerId", params: { computerId: c.id }, className: `flex items-center gap-3 rounded-lg border p-3 text-sm transition ${c.id === computerId ? "border-primary ring-primary/20 ring-2" : "hover:bg-muted/50"}`, children: [_jsx("span", { className: `h-2 w-2 shrink-0 rounded-full ${c.online ? "bg-primary" : "bg-muted-foreground/40"}` }), _jsxs("span", { className: "min-w-0 flex-1", children: [_jsx("span", { className: "block truncate font-medium", children: c.naam }), _jsxs("span", { className: "text-muted-foreground block text-xs", children: [c.aantalPrinters, " ", c.aantalPrinters === 1 ? "printer" : "printers"] })] }), _jsx(ChevronRight, { className: "text-muted-foreground h-4 w-4" })] }, c.id))), zichtbareComputers.length === 0 && (_jsx("p", { className: "text-muted-foreground text-sm", children: "Geen werkplekken gevonden." }))] })] }), _jsxs("div", { className: "space-y-6", children: [_jsx(Card, { children: _jsxs(CardHeader, { className: "pb-3", children: [_jsxs(CardTitle, { className: "flex items-center gap-2 text-base", children: [_jsx(Monitor, { className: "h-4 w-4" }), " ", computer?.naam ?? "Onbekende werkplek"] }), _jsx(CardDescription, { children: computer
66
- ? `${computer.online ? "Aan" : "Uit"} · ${rijen.length} ${rijen.length === 1 ? "printer" : "printers"}`
67
- : "Deze computer is niet gevonden. Staat hij aan?" })] }) }), _jsxs("div", { className: "grid gap-6 xl:grid-cols-[1fr_340px]", children: [_jsxs("div", { className: "space-y-3", children: [rijen.length === 0 && (_jsx(Card, { children: _jsxs(CardContent, { className: "space-y-4 py-10 text-center", children: [_jsx(Printer, { className: "text-muted-foreground mx-auto h-8 w-8" }), _jsx("p", { className: "text-sm font-medium", children: "Nog geen printers op deze werkplek" }), _jsx(Button, { onClick: () => {
77
+ }, children: [_jsx(Plus, { className: "mr-2 h-4 w-4" }), " Printer toevoegen"] })] })] }), _jsxs("div", { className: "grid gap-6 lg:grid-cols-[300px_1fr]", children: [_jsxs(Card, { className: "h-fit", children: [_jsx(CardHeader, { className: "pb-3", children: _jsx(CardTitle, { className: "text-base", children: "Werkplekken" }) }), _jsxs(CardContent, { className: "space-y-2", children: [_jsxs("div", { className: "relative", children: [_jsx(Search, { className: "text-muted-foreground absolute top-2.5 left-3 h-4 w-4" }), _jsx(Input, { className: "pl-9", placeholder: "Zoek werkplek", value: zoekComputer, onChange: (e) => setZoekComputer(e.target.value) })] }), zichtbareComputers.map((c) => (_jsxs(Link, { to: "/layouts-printers/printers/$computerId", params: { computerId: c.id }, className: `flex items-center gap-3 rounded-lg border p-3 text-sm transition ${c.id === computerId ? "border-primary ring-primary/20 ring-2" : "hover:bg-muted/50"}`, children: [_jsx("span", { className: `h-2 w-2 shrink-0 rounded-full ${c.online ? "bg-primary" : "bg-muted-foreground/40"}` }), _jsxs("span", { className: "min-w-0 flex-1", children: [_jsx("span", { className: "block truncate font-medium", children: c.naam }), _jsx("span", { className: "text-muted-foreground block text-xs", children: printerTellingTekst(tellingen.get(c.naam)) })] }), _jsx(ChevronRight, { className: "text-muted-foreground h-4 w-4" })] }, c.id))), zichtbareComputers.length === 0 && (_jsx("p", { className: "text-muted-foreground text-sm", children: "Geen werkplekken gevonden." }))] })] }), _jsxs("div", { className: "space-y-6", children: [_jsx(Card, { children: _jsxs(CardHeader, { className: "pb-3", children: [_jsxs(CardTitle, { className: "flex items-center gap-2 text-base", children: [_jsx(Monitor, { className: "h-4 w-4" }), " ", computer?.naam ?? "Onbekende werkplek"] }), _jsx(CardDescription, { children: computer
78
+ ? `${computer.online ? "Aan" : "Uit"} · ${printerTellingTekst(tellingen.get(computer.naam))}`
79
+ : "Deze computer is niet gevonden. Staat hij aan?" })] }) }), _jsxs(Card, { children: [_jsxs(CardHeader, { className: "pb-3", children: [_jsx(CardTitle, { className: "text-base", children: "Wat print deze werkplek" }), _jsxs(CardDescription, { children: ["Kies per documentsoort de printer op deze werkplek. Staat er \"Volg routering\", dan geldt de standaardprinter uit", " ", _jsx(Link, { to: "/layouts-printers/routering", className: "text-foreground underline", children: "Routering" }), "."] })] }), _jsxs(CardContent, { className: "grid gap-2 sm:grid-cols-2", children: [DOCUMENT_TYPES.map((d) => {
80
+ const huidig = eigenRoutering.find((r) => r.documenttype === d.value);
81
+ return (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "min-w-0 flex-1 truncate text-sm", children: documentTypeLabel(d.value) }), _jsxs(Select, { value: huidig?.printer_id ?? VOLG_ROUTERING, onValueChange: (v) => void zetDocument(d.value, v === VOLG_ROUTERING ? null : v), children: [_jsx(SelectTrigger, { className: "w-52", children: _jsx(SelectValue, {}) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: VOLG_ROUTERING, children: "Volg routering" }), rijen.map(({ printer }) => (_jsx(SelectItem, { value: printer.id, children: printer.naam }, printer.id)))] })] })] }, d.value));
82
+ }), rijen.length === 0 && (_jsx("p", { className: "text-muted-foreground text-sm", children: "Voeg eerst een printer toe op deze werkplek." }))] })] }), _jsxs("div", { className: "grid gap-6 xl:grid-cols-[1fr_340px]", children: [_jsxs("div", { className: "space-y-3", children: [rijen.length === 0 && (_jsx(Card, { children: _jsxs(CardContent, { className: "space-y-4 py-10 text-center", children: [_jsx(Printer, { className: "text-muted-foreground mx-auto h-8 w-8" }), _jsx("p", { className: "text-sm font-medium", children: "Nog geen printers op deze werkplek" }), _jsx(Button, { onClick: () => {
68
83
  setBewerken(null);
69
84
  setWizard(true);
70
85
  }, children: "Printer toevoegen" })] }) })), rijen.map(({ printer, online }) => (_jsx(PrinterKaart, { printer: printer, computer: computer?.naam ?? null, beschikbaar: online, gekozen: printer.id === gekozenPrinter, onKies: () => setGekozenPrinter(printer.id), onTest: () => void drukTestpaginaAf(printer.id, printer.naam), onBewerk: () => {
@@ -84,13 +99,9 @@ export function WerkplekConfiguratiePage() {
84
99
  catch {
85
100
  toast.error("Verwijderen mislukt");
86
101
  }
87
- } }, printer.id)))] }), actievePrinter && (_jsxs(Card, { className: "h-fit", children: [_jsxs(CardHeader, { className: "pb-3", children: [_jsx(CardTitle, { className: "text-base", children: "Wat wordt hier afgedrukt?" }), _jsx(CardDescription, { children: actievePrinter.naam })] }), _jsxs(CardContent, { className: "space-y-3", children: [layouts.length > 8 && (_jsxs("div", { className: "relative", children: [_jsx(Search, { className: "text-muted-foreground absolute top-2.5 left-3 h-4 w-4" }), _jsx(Input, { className: "pl-9", value: layoutZoek, placeholder: "Zoek een ontwerp", onChange: (e) => setLayoutZoek(e.target.value) })] })), zichtbareLayouts.map((l) => {
88
- const aan = gekoppeld.get(actievePrinter.id)?.has(l.id) ?? false;
89
- return (_jsxs("div", { className: "flex items-center gap-3", children: [_jsx(Checkbox, { checked: aan, onCheckedChange: async (v) => {
90
- await toggleKoppeling(l.id, actievePrinter.id, !!v);
91
- void reload();
92
- } }), _jsxs("div", { className: "min-w-0", children: [_jsx("span", { className: "block truncate text-sm", children: l.naam }), _jsx("span", { className: "text-muted-foreground text-xs", children: l.papierformaat })] })] }, l.id));
93
- }), zichtbareLayouts.length === 0 && (_jsx("p", { className: "text-muted-foreground text-sm", children: "Er zijn nog geen ontwerpen." }))] })] }))] })] })] }), _jsx(PrinterSetupWizard, { open: wizard, onOpenChange: (v) => {
102
+ } }, printer.id)))] }), actievePrinter && (_jsxs(Card, { className: "h-fit", children: [_jsxs(CardHeader, { className: "pb-3", children: [_jsx(CardTitle, { className: "text-base", children: "Documenten op deze printer" }), _jsx(CardDescription, { children: actievePrinter.naam })] }), _jsx(CardContent, { className: "space-y-2", children: eigenRoutering.filter((r) => r.printer_id === actievePrinter.id).length === 0 ? (_jsx("p", { className: "text-muted-foreground text-sm", children: "Nog geen documentsoorten naar deze printer gestuurd. Stel dat hierboven in bij \"Wat print deze werkplek\"." })) : (eigenRoutering
103
+ .filter((r) => r.printer_id === actievePrinter.id)
104
+ .map((r) => (_jsx("p", { className: "truncate text-sm", children: documentTypeLabel(r.documenttype) }, r.id)))) })] }))] })] })] }), _jsx(PrinterSetupWizard, { open: wizard, onOpenChange: (v) => {
94
105
  setWizard(v);
95
106
  if (!v)
96
107
  setBewerken(null);
@@ -1,10 +1,10 @@
1
+ import { type PrinterTelling } from "../lib/printerTelling.js";
1
2
  export interface WerkplekRij {
2
3
  id: string;
3
4
  naam: string;
4
5
  online: boolean;
5
6
  locatie: string;
6
- aantalPrinters: number;
7
- aantalGekoppeld: number;
7
+ telling: PrinterTelling;
8
8
  }
9
9
  export declare function WerkplekkenTabel({ rijen, onPrinterToevoegen, onVernieuw, }: {
10
10
  rijen: WerkplekRij[];
@@ -1 +1 @@
1
- {"version":3,"file":"WerkplekkenTabel.d.ts","sourceRoot":"","sources":["../../src/components/WerkplekkenTabel.tsx"],"names":[],"mappings":"AAqBA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,kBAAkB,EAClB,UAAU,GACX,EAAE;IACD,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB,+BA4EA"}
1
+ {"version":3,"file":"WerkplekkenTabel.d.ts","sourceRoot":"","sources":["../../src/components/WerkplekkenTabel.tsx"],"names":[],"mappings":"AAoBA,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEjF,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,cAAc,CAAC;CACzB;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,kBAAkB,EAClB,UAAU,GACX,EAAE;IACD,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB,+BA4EA"}
@@ -6,11 +6,12 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
6
6
  import { Button, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@flowselections/core";
7
7
  import { Link } from "@tanstack/react-router";
8
8
  import { MoreVertical, Plus, RefreshCw } from "lucide-react";
9
+ import { printerTellingTekst } from "../lib/printerTelling.js";
9
10
  export function WerkplekkenTabel({ rijen, onPrinterToevoegen, onVernieuw, }) {
10
11
  return (_jsx("div", { className: "overflow-x-auto rounded-xl border", children: _jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: "Werkplek" }), _jsx(TableHead, { children: "Locatie" }), _jsx(TableHead, { children: "Status" }), _jsx(TableHead, { children: "Printers" }), _jsx(TableHead, { className: "text-right", children: "Acties" })] }) }), _jsx(TableBody, { children: rijen.map((r) => {
11
- const deel = r.aantalPrinters
12
- ? Math.round((r.aantalGekoppeld / r.aantalPrinters) * 100)
12
+ const deel = r.telling.gevonden
13
+ ? Math.round((r.telling.ingesteld / r.telling.gevonden) * 100)
13
14
  : 0;
14
- return (_jsxs(TableRow, { children: [_jsx(TableCell, { className: "font-medium", children: r.naam }), _jsx(TableCell, { className: "text-muted-foreground", children: r.locatie }), _jsx(TableCell, { children: _jsxs("span", { className: "flex items-center gap-2 text-sm", children: [_jsx("span", { className: `h-2 w-2 rounded-full ${r.online ? "bg-primary" : "bg-muted-foreground/40"}` }), r.online ? "Aan" : "Uit"] }) }), _jsx(TableCell, { children: _jsxs("div", { className: "w-40 space-y-1", children: [_jsxs("span", { className: "text-sm", children: [r.aantalGekoppeld, " / ", r.aantalPrinters, " in gebruik"] }), _jsx("div", { className: "bg-muted h-1.5 w-full overflow-hidden rounded-full", children: _jsx("div", { className: "bg-primary h-full", style: { width: `${deel}%` } }) })] }) }), _jsx(TableCell, { className: "text-right", children: _jsxs("div", { className: "flex justify-end gap-1", children: [_jsx(Button, { variant: "outline", size: "sm", asChild: true, children: _jsx(Link, { to: "/layouts-printers/printers/$computerId", params: { computerId: r.id }, children: "Configureren" }) }), _jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "sm", "aria-label": "Meer", children: _jsx(MoreVertical, { className: "h-4 w-4" }) }) }), _jsxs(DropdownMenuContent, { align: "end", children: [_jsxs(DropdownMenuItem, { onSelect: () => onPrinterToevoegen(r.naam), children: [_jsx(Plus, { className: "mr-2 h-4 w-4" }), " Printer toevoegen"] }), _jsxs(DropdownMenuItem, { onSelect: () => onVernieuw(), children: [_jsx(RefreshCw, { className: "mr-2 h-4 w-4" }), " Gegevens vernieuwen"] })] })] })] }) })] }, r.id));
15
+ return (_jsxs(TableRow, { children: [_jsx(TableCell, { className: "font-medium", children: r.naam }), _jsx(TableCell, { className: "text-muted-foreground", children: r.locatie }), _jsx(TableCell, { children: _jsxs("span", { className: "flex items-center gap-2 text-sm", children: [_jsx("span", { className: `h-2 w-2 rounded-full ${r.online ? "bg-primary" : "bg-muted-foreground/40"}` }), r.online ? "Aan" : "Uit"] }) }), _jsx(TableCell, { children: _jsxs("div", { className: "w-40 space-y-1", children: [_jsx("span", { className: "text-sm", children: printerTellingTekst(r.telling) }), _jsx("div", { className: "bg-muted h-1.5 w-full overflow-hidden rounded-full", children: _jsx("div", { className: "bg-primary h-full", style: { width: `${deel}%` } }) })] }) }), _jsx(TableCell, { className: "text-right", children: _jsxs("div", { className: "flex justify-end gap-1", children: [_jsx(Button, { variant: "outline", size: "sm", asChild: true, children: _jsx(Link, { to: "/layouts-printers/printers/$computerId", params: { computerId: r.id }, children: "Configureren" }) }), _jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "sm", "aria-label": "Meer", children: _jsx(MoreVertical, { className: "h-4 w-4" }) }) }), _jsxs(DropdownMenuContent, { align: "end", children: [_jsxs(DropdownMenuItem, { onSelect: () => onPrinterToevoegen(r.naam), children: [_jsx(Plus, { className: "mr-2 h-4 w-4" }), " Printer toevoegen"] }), _jsxs(DropdownMenuItem, { onSelect: () => onVernieuw(), children: [_jsx(RefreshCw, { className: "mr-2 h-4 w-4" }), " Gegevens vernieuwen"] })] })] })] }) })] }, r.id));
15
16
  }) })] }) }));
16
17
  }
@@ -32,15 +32,20 @@ export { LOGO_BUCKET, LOGO_CATEGORIEEN, OPSLAG_ONTBREEKT, TOEGESTANE_LOGO_TYPES,
32
32
  export type { LogoModel, UploadInput } from './lib/logoLibrary.js';
33
33
  export { DOCUMENT_PROFIELEN, STICKER_FORMATEN, VERZENDLABEL_FORMATEN, configWaarde, documentProfiel, primaireProfielen, standaardConfig } from './lib/documentProfiles.js';
34
34
  export type { DocumentConfig, DocumentProfiel, InstellingDef, InstellingGroep, InstellingType } from './lib/documentProfiles.js';
35
- export { printerVoorFormaat, useFormaatPrinters, zetFormaatPrinter } from './lib/formaatPrinters.js';
35
+ export { printerVoorFormaat, useAlleFormaatPrinters, useFormaatPrinters, zetFormaatPrinter } from './lib/formaatPrinters.js';
36
+ export { BRONNEN, HERKOMSTEN, bronVoorDocument, useBronregels, verwijderBronregel, zetBronregel } from './lib/documentBron.js';
37
+ export type { Bron, Bronregel, Herkomst } from './lib/documentBron.js';
38
+ export { printerVoorWerkplekDocument, useWerkplekPrinters, verwijderWerkplekPrinter, zetWerkplekPrinter } from './lib/documentRoutering.js';
39
+ export type { WerkplekPrinter } from './lib/documentRoutering.js';
40
+ export { DocumentRouteringPage } from './components/DocumentRouteringPage.js';
36
41
  export type { FormaatPrinter } from './lib/formaatPrinters.js';
37
42
  export { DocumentSettingsPanel } from './components/DocumentSettingsPanel.js';
38
- export { DOCUMENT_TYPES, ELEMENT_STANDAARD, PAPIERFORMATEN, STANDAARD_KOLOMMEN, STANDAARD_STIJL, documentTypeLabel } from './lib/documentTypes.js';
43
+ export { DOCUMENT_TYPES, ELEMENT_STANDAARD, FLORIDAY_LAYOUT_TOELICHTING, FLORIDAY_SYSTEEM_LAYOUTS, PAPIERFORMATEN, STANDAARD_KOLOMMEN, STANDAARD_LAYOUTS, STANDAARD_LAYOUT_TOELICHTING, STANDAARD_STIJL, documentTypeLabel, isFloridayLayout } from './lib/documentTypes.js';
39
44
  export type { DocumentType, ElementConditie, ElementConfig, ElementStijl, ElementType, LayoutElementModel, LayoutModel, LayoutVariabele, PageSettings, PapierFormaatDef, TabelKolom } from './lib/documentTypes.js';
40
45
  export { alleEntiteiten, alleVelden, registreerEntiteit, veldRegisterSubscribe, zoekVeld } from './lib/fieldRegistry.js';
41
46
  export type { EntiteitDefinitie, VeldDefinitie, VeldSoort } from './lib/fieldRegistry.js';
42
47
  export { VOORBEELD_REGELS, bouwDocumentHtml, conditieVoldoet, voorbeeldContext, vulVelden } from './lib/layoutPreview.js';
43
- export { bewaarElementen, bewaarPrinter, bewaarVersie, dupliceerLayout, maakLayout, maakPrintJob, toggleKoppeling, updateJobStatus, updateLayout, useLayoutDetail, useLayouts, usePrintJobs, usePrinters, useVersies, verwijderLayout, verwijderPrinter } from './lib/useDocumentData.js';
48
+ export { bewaarElementen, bewaarPrinter, bewaarVersie, dupliceerLayout, maakLayout, maakPrintJob, toggleKoppeling, updateJobStatus, updateLayout, useLayoutDetail, useLayouts, usePrintJobs, usePrinters, useVersies, verwijderLayout, verwijderPrinter, zorgVoorFloridayLayouts } from './lib/useDocumentData.js';
44
49
  export type { PrintJobModel, PrinterModel } from './lib/useDocumentData.js';
45
50
  export { beschikbareLayouts, beschikbarePrinters, printDocument, printPdf, printHtml, printerVoorWerkplek, printerVoorDocumenttype, volgJobStatus, DubbeleAanvraagFout, } from './lib/printApi.js';
46
51
  export type { PrintDocumentInput, PrintDocumentResult, PrintPdfInput, PrintHtmlInput, JobStatus, } from './lib/printApi.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist-lib/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  // ============================================================================
2
2
  // src/index.ts — MODULE CONTRACT (layout-maker)
3
3
  // ============================================================================
4
- import { LayoutTemplate, Printer, FileText, ListChecks, Image } from "lucide-react";
4
+ import { LayoutTemplate, Printer, FileText, ListChecks, Image, Route } from "lucide-react";
5
5
  import './_core-safelist.js';
6
6
  export { LayoutsPage } from './components/LayoutsPage.js';
7
7
  export { PrintProgrammaUitleg, WerktHetNiet } from './components/PrintProgrammaUitleg.js';
@@ -29,12 +29,15 @@ export { BELADING_LABELS, DEMO_PRODUCTIEBON, EXTRA_LABELS, FUST_LABELS, LETTERTY
29
29
  export { LogoBibliotheekDialog } from './components/LogoBibliotheekDialog.js';
30
30
  export { LOGO_BUCKET, LOGO_CATEGORIEEN, OPSLAG_ONTBREEKT, TOEGESTANE_LOGO_TYPES, bestaatHash, bestandHash, bestandstypeVan, controleerLogoOpslag, downloadLogo, formatteerBytes, haalLogos, haalPrintLogos, leesAfmetingen, logoCategorieLabel, maakLogo, useLogoOpslag, useLogos, vertaalOpslagFout, vervangLogoBestand, verwijderLogo, werkLogoBij } from './lib/logoLibrary.js';
31
31
  export { DOCUMENT_PROFIELEN, STICKER_FORMATEN, VERZENDLABEL_FORMATEN, configWaarde, documentProfiel, primaireProfielen, standaardConfig } from './lib/documentProfiles.js';
32
- export { printerVoorFormaat, useFormaatPrinters, zetFormaatPrinter } from './lib/formaatPrinters.js';
32
+ export { printerVoorFormaat, useAlleFormaatPrinters, useFormaatPrinters, zetFormaatPrinter } from './lib/formaatPrinters.js';
33
+ export { BRONNEN, HERKOMSTEN, bronVoorDocument, useBronregels, verwijderBronregel, zetBronregel } from './lib/documentBron.js';
34
+ export { printerVoorWerkplekDocument, useWerkplekPrinters, verwijderWerkplekPrinter, zetWerkplekPrinter } from './lib/documentRoutering.js';
35
+ export { DocumentRouteringPage } from './components/DocumentRouteringPage.js';
33
36
  export { DocumentSettingsPanel } from './components/DocumentSettingsPanel.js';
34
- export { DOCUMENT_TYPES, ELEMENT_STANDAARD, PAPIERFORMATEN, STANDAARD_KOLOMMEN, STANDAARD_STIJL, documentTypeLabel } from './lib/documentTypes.js';
37
+ export { DOCUMENT_TYPES, ELEMENT_STANDAARD, FLORIDAY_LAYOUT_TOELICHTING, FLORIDAY_SYSTEEM_LAYOUTS, PAPIERFORMATEN, STANDAARD_KOLOMMEN, STANDAARD_LAYOUTS, STANDAARD_LAYOUT_TOELICHTING, STANDAARD_STIJL, documentTypeLabel, isFloridayLayout } from './lib/documentTypes.js';
35
38
  export { alleEntiteiten, alleVelden, registreerEntiteit, veldRegisterSubscribe, zoekVeld } from './lib/fieldRegistry.js';
36
39
  export { VOORBEELD_REGELS, bouwDocumentHtml, conditieVoldoet, voorbeeldContext, vulVelden } from './lib/layoutPreview.js';
37
- export { bewaarElementen, bewaarPrinter, bewaarVersie, dupliceerLayout, maakLayout, maakPrintJob, toggleKoppeling, updateJobStatus, updateLayout, useLayoutDetail, useLayouts, usePrintJobs, usePrinters, useVersies, verwijderLayout, verwijderPrinter } from './lib/useDocumentData.js';
40
+ export { bewaarElementen, bewaarPrinter, bewaarVersie, dupliceerLayout, maakLayout, maakPrintJob, toggleKoppeling, updateJobStatus, updateLayout, useLayoutDetail, useLayouts, usePrintJobs, usePrinters, useVersies, verwijderLayout, verwijderPrinter, zorgVoorFloridayLayouts } from './lib/useDocumentData.js';
38
41
  export { beschikbareLayouts, beschikbarePrinters, printDocument, printPdf, printHtml, printerVoorWerkplek, printerVoorDocumenttype, volgJobStatus, DubbeleAanvraagFout, } from './lib/printApi.js';
39
42
  export { bedoeldePrinter, drukAf, formaatDef, paginaCss } from './lib/browserPrint.js';
40
43
  export { printDirect } from './lib/directPrint.js';
@@ -51,7 +54,7 @@ export { TemplateModuleLogo } from './components/TemplateModuleLogo.js';
51
54
  export const layoutmodule = {
52
55
  id: "layout-maker",
53
56
  name: "Layouts en printers",
54
- version: "1.8.1",
57
+ version: "1.12.0",
55
58
  nav: {
56
59
  label: "Layouts en printers",
57
60
  href: "/layouts-printers",
@@ -59,6 +62,7 @@ export const layoutmodule = {
59
62
  children: [
60
63
  { label: "Layouts", href: "/layouts-printers", icon: FileText },
61
64
  { label: "Printers", href: "/layouts-printers/printers", icon: Printer },
65
+ { label: "Routering", href: "/layouts-printers/routering", icon: Route },
62
66
  { label: "Printwachtrij", href: "/layouts-printers/wachtrij", icon: ListChecks },
63
67
  { label: "Logo's", href: "/layouts-printers/logos", icon: Image },
64
68
  ],