@flowselections/layout-maker 1.46.1 → 1.51.2

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 (62) hide show
  1. package/dist-lib/components/ComputerVerwijderenDialog.d.ts +16 -0
  2. package/dist-lib/components/ComputerVerwijderenDialog.d.ts.map +1 -0
  3. package/dist-lib/components/ComputerVerwijderenDialog.js +38 -0
  4. package/dist-lib/components/ComputersLijst.d.ts.map +1 -1
  5. package/dist-lib/components/ComputersLijst.js +5 -2
  6. package/dist-lib/components/LayoutPrinterSelect.d.ts +3 -5
  7. package/dist-lib/components/LayoutPrinterSelect.d.ts.map +1 -1
  8. package/dist-lib/components/LayoutPrinterSelect.js +40 -17
  9. package/dist-lib/components/LayoutsPage.d.ts.map +1 -1
  10. package/dist-lib/components/LayoutsPage.js +28 -18
  11. package/dist-lib/components/PrinterSetupWizard.d.ts +3 -1
  12. package/dist-lib/components/PrinterSetupWizard.d.ts.map +1 -1
  13. package/dist-lib/components/PrinterSetupWizard.js +13 -4
  14. package/dist-lib/components/PrinterVervangenDialog.d.ts +14 -0
  15. package/dist-lib/components/PrinterVervangenDialog.d.ts.map +1 -0
  16. package/dist-lib/components/PrinterVervangenDialog.js +44 -0
  17. package/dist-lib/components/PrintersPage.d.ts.map +1 -1
  18. package/dist-lib/components/PrintersPage.js +2 -2
  19. package/dist-lib/components/PrintplekDetailPage.d.ts.map +1 -1
  20. package/dist-lib/components/PrintplekDetailPage.js +175 -48
  21. package/dist-lib/components/PrintplekVerwijderenDialog.d.ts +9 -0
  22. package/dist-lib/components/PrintplekVerwijderenDialog.d.ts.map +1 -0
  23. package/dist-lib/components/PrintplekVerwijderenDialog.js +34 -0
  24. package/dist-lib/components/PrintplekkenPage.d.ts.map +1 -1
  25. package/dist-lib/components/PrintplekkenPage.js +28 -6
  26. package/dist-lib/components/WerkplekConfiguratiePage.d.ts.map +1 -1
  27. package/dist-lib/components/WerkplekConfiguratiePage.js +67 -25
  28. package/dist-lib/index.d.ts +9 -4
  29. package/dist-lib/index.d.ts.map +1 -1
  30. package/dist-lib/index.js +7 -3
  31. package/dist-lib/integrations/supabase/auth-middleware.d.ts +511 -6
  32. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  33. package/dist-lib/integrations/supabase/client.server.d.ts +511 -6
  34. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  35. package/dist-lib/integrations/supabase/moduleClient.d.ts +511 -6
  36. package/dist-lib/integrations/supabase/moduleClient.d.ts.map +1 -1
  37. package/dist-lib/integrations/supabase/types.d.ts +527 -6
  38. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  39. package/dist-lib/lib/aiLayout.functions.d.ts +511 -6
  40. package/dist-lib/lib/aiLayout.functions.d.ts.map +1 -1
  41. package/dist-lib/lib/documentRoutering.d.ts +2 -1
  42. package/dist-lib/lib/documentRoutering.d.ts.map +1 -1
  43. package/dist-lib/lib/documentRoutering.js +5 -8
  44. package/dist-lib/lib/foutTekst.d.ts +3 -0
  45. package/dist-lib/lib/foutTekst.d.ts.map +1 -0
  46. package/dist-lib/lib/foutTekst.js +25 -0
  47. package/dist-lib/lib/printApi.d.ts.map +1 -1
  48. package/dist-lib/lib/printApi.js +13 -39
  49. package/dist-lib/lib/printQueue.server.d.ts.map +1 -1
  50. package/dist-lib/lib/printQueue.server.js +19 -66
  51. package/dist-lib/lib/printRoutering.d.ts +34 -0
  52. package/dist-lib/lib/printRoutering.d.ts.map +1 -0
  53. package/dist-lib/lib/printRoutering.js +69 -0
  54. package/dist-lib/lib/printService.functions.d.ts +2555 -30
  55. package/dist-lib/lib/printService.functions.d.ts.map +1 -1
  56. package/dist-lib/lib/printplekken.d.ts +67 -2
  57. package/dist-lib/lib/printplekken.d.ts.map +1 -1
  58. package/dist-lib/lib/printplekken.js +141 -10
  59. package/dist-lib/lib/useDocumentData.d.ts +15 -10
  60. package/dist-lib/lib/useDocumentData.d.ts.map +1 -1
  61. package/dist-lib/lib/useDocumentData.js +43 -34
  62. package/package.json +2 -2
@@ -0,0 +1,16 @@
1
+ export declare function ComputerVerwijderenDialog({ open, onOpenChange, computerNaam, printplekId, printers, andereplekken, onKlaar, }: {
2
+ open: boolean;
3
+ onOpenChange: (v: boolean) => void;
4
+ computerNaam: string | null;
5
+ printplekId: string | null;
6
+ printers: {
7
+ id: string;
8
+ naam: string;
9
+ }[];
10
+ andereplekken: {
11
+ id: string;
12
+ naam: string;
13
+ }[];
14
+ onKlaar: () => void;
15
+ }): import("react").JSX.Element;
16
+ //# sourceMappingURL=ComputerVerwijderenDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ComputerVerwijderenDialog.d.ts","sourceRoot":"","sources":["../../src/components/ComputerVerwijderenDialog.tsx"],"names":[],"mappings":"AAkBA,wBAAgB,yBAAyB,CAAC,EACxC,IAAI,EACJ,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,aAAa,EACb,OAAO,GACR,EAAE;IACD,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACzC,aAAa,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC9C,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,+BAwEA"}
@@ -0,0 +1,38 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // ============================================================================
3
+ // src/components/ComputerVerwijderenDialog.tsx — een computer "verwijderen"
4
+ // (op de negeerlijst zetten). Hangen er nog printers aan, dan moet eerst
5
+ // gekozen worden: meeverwijderen of verplaatsen. Nooit stil verweesd.
6
+ // ============================================================================
7
+ import { useState } from "react";
8
+ import { Button, Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, toast, } from "@flowselections/core";
9
+ import { negeerComputer } from "../lib/printplekken.js";
10
+ export function ComputerVerwijderenDialog({ open, onOpenChange, computerNaam, printplekId, printers, andereplekken, onKlaar, }) {
11
+ const [keuze, setKeuze] = useState("verwijderen");
12
+ const [bezig, setBezig] = useState(false);
13
+ const metPrinters = printers.length > 0;
14
+ const bevestig = async () => {
15
+ if (!computerNaam)
16
+ return;
17
+ setBezig(true);
18
+ try {
19
+ await negeerComputer(computerNaam, metPrinters
20
+ ? {
21
+ printerIds: printers.map((p) => p.id),
22
+ vanPlek: printplekId,
23
+ actie: keuze === "verwijderen" ? "verwijderen" : { naarPlek: keuze },
24
+ }
25
+ : null);
26
+ toast.success(`${computerNaam} verwijderd`);
27
+ onOpenChange(false);
28
+ onKlaar();
29
+ }
30
+ catch {
31
+ toast.error("Verwijderen mislukt");
32
+ }
33
+ finally {
34
+ setBezig(false);
35
+ }
36
+ };
37
+ return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(DialogContent, { className: "sm:max-w-lg", children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: "Computer verwijderen" }), _jsxs(DialogDescription, { children: [computerNaam, " verdwijnt van deze plek en uit \"Computers zonder printplek\". Je kunt hem later terugzetten via \"Toon genegeerde computers\"."] })] }), metPrinters ? (_jsxs("div", { className: "space-y-3 text-sm", children: [_jsxs("p", { children: ["Aan deze computer hangen nog ", printers.length, " printer(s):", " ", _jsx("strong", { children: printers.map((p) => p.naam).join(", ") }), ". Wat moet ermee gebeuren?"] }), _jsxs("label", { className: "flex items-center gap-2", children: [_jsx("input", { type: "radio", checked: keuze === "verwijderen", onChange: () => setKeuze("verwijderen") }), "Printers meeverwijderen van deze plek (regels worden zichtbaar leeg gemarkeerd)"] }), andereplekken.map((p) => (_jsxs("label", { className: "flex items-center gap-2", children: [_jsx("input", { type: "radio", checked: keuze === p.id, onChange: () => setKeuze(p.id) }), "Printers verplaatsen naar ", p.naam] }, p.id)))] })) : null, _jsxs("div", { className: "flex justify-end gap-2", children: [_jsx(Button, { variant: "outline", onClick: () => onOpenChange(false), children: "Annuleren" }), _jsx(Button, { variant: "destructive", disabled: bezig, onClick: () => void bevestig(), children: "Verwijderen" })] })] }) }));
38
+ }
@@ -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,+BA0IA"}
1
+ {"version":3,"file":"ComputersLijst.d.ts","sourceRoot":"","sources":["../../src/components/ComputersLijst.tsx"],"names":[],"mappings":"AAqBA,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;;;;;EAiD3B;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"}
@@ -8,6 +8,7 @@ import { Button, Card, CardContent, Dialog, DialogContent, DialogDescription, Di
8
8
  import { Loader2, Monitor, Plus, RefreshCw } from "lucide-react";
9
9
  import { netwerkComputers, netwerkPrinters } from "../lib/printService.functions.js";
10
10
  import { PrintProgrammaUitleg, WerktHetNiet } from "./PrintProgrammaUitleg.js";
11
+ import { genegeerdeComputersLijst } from "../lib/printplekken.js";
11
12
  export function useComputers() {
12
13
  const [computers, setComputers] = useState([]);
13
14
  const [loading, setLoading] = useState(true);
@@ -17,12 +18,14 @@ export function useComputers() {
17
18
  setLoading(true);
18
19
  setFout(null);
19
20
  try {
20
- const [c, p] = await Promise.all([
21
+ const [c, p, g] = await Promise.all([
21
22
  netwerkComputers({ data: undefined }),
22
23
  netwerkPrinters({ data: undefined }),
24
+ genegeerdeComputersLijst().catch(() => []),
23
25
  ]);
24
26
  const printers = p.ok && Array.isArray(p.printers) ? p.printers : [];
25
- const lijst = c.ok && Array.isArray(c.computers) ? c.computers : [];
27
+ const genegeerd = new Set((Array.isArray(g) ? g : []).map((x) => x.computer_naam));
28
+ const lijst = (c.ok && Array.isArray(c.computers) ? c.computers : []).filter((comp) => !genegeerd.has(comp.naam));
26
29
  if (!c.ok)
27
30
  setFout(c.fout);
28
31
  setComputers(lijst.map((comp) => ({
@@ -1,8 +1,6 @@
1
- /**
2
- * Printerkeuze voor één layout (zelfde koppeling als de kolom op de
3
- * Documenten-pagina). Compact, bedoeld voor de header van de builders.
4
- */
5
- export declare function LayoutPrinterSelect({ layoutId }: {
1
+ export declare function LayoutPrinterSelect({ layoutId, documenttype, metLink, }: {
6
2
  layoutId: string;
3
+ documenttype?: string;
4
+ metLink?: boolean;
7
5
  }): import("react").JSX.Element;
8
6
  //# sourceMappingURL=LayoutPrinterSelect.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"LayoutPrinterSelect.d.ts","sourceRoot":"","sources":["../../src/components/LayoutPrinterSelect.tsx"],"names":[],"mappings":"AAUA;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,+BAgCrE"}
1
+ {"version":3,"file":"LayoutPrinterSelect.d.ts","sourceRoot":"","sources":["../../src/components/LayoutPrinterSelect.tsx"],"names":[],"mappings":"AAOA,wBAAgB,mBAAmB,CAAC,EAClC,QAAQ,EACR,YAAY,EACZ,OAAc,GACf,EAAE;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,+BA+CA"}
@@ -1,23 +1,46 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, toast, } from "@flowselections/core";
3
- import { usePrinters, zetLayoutPrinter } from "../lib/useDocumentData.js";
4
- /**
5
- * Printerkeuze voor één layout (zelfde koppeling als de kolom op de
6
- * Documenten-pagina). Compact, bedoeld voor de header van de builders.
7
- */
8
- export function LayoutPrinterSelect({ layoutId }) {
9
- const { printers, koppelingen, reload } = usePrinters();
10
- const huidige = koppelingen.find((k) => k.layout_id === layoutId)?.printer_id ?? "geen";
11
- return (_jsxs(Select, { value: huidige, onValueChange: async (printerId) => {
2
+ // Alleen-lezen: welke printer geldt nu voor het documenttype van deze layout.
3
+ // Printers kies je uitsluitend op de Printen-pagina (printplek of standaardregel).
4
+ import { useEffect, useState } from "react";
5
+ import { Link } from "@tanstack/react-router";
6
+ import { supabase } from "../lib/supabaseClient.js";
7
+ import { routeringVoor } from "../lib/printRoutering.js";
8
+ export function LayoutPrinterSelect({ layoutId, documenttype, metLink = true, }) {
9
+ const [tekst, setTekst] = useState("…");
10
+ useEffect(() => {
11
+ let weg = false;
12
+ void (async () => {
12
13
  try {
13
- await zetLayoutPrinter(layoutId, printerId === "geen" ? null : printerId);
14
- await reload(true);
15
- toast.success("Printer bij document opgeslagen");
14
+ let type = documenttype;
15
+ if (!type) {
16
+ const { data } = await supabase
17
+ .from("document_layouts")
18
+ .select("documenttype")
19
+ .eq("id", layoutId)
20
+ .maybeSingle();
21
+ type = data?.documenttype ?? "";
22
+ }
23
+ if (!type)
24
+ return setTekst("Geen printer");
25
+ const u = await routeringVoor({ documenttype: type, layoutId });
26
+ if (!u.printer_id)
27
+ return !weg && setTekst("Geen printer ingesteld");
28
+ const { data: p } = await supabase
29
+ .from("printers")
30
+ .select("naam")
31
+ .eq("id", u.printer_id)
32
+ .maybeSingle();
33
+ if (!weg)
34
+ setTekst(p?.naam ?? "Onbekende printer");
16
35
  }
17
36
  catch {
18
- toast.error("Printerkeuze opslaan mislukt");
37
+ if (!weg)
38
+ setTekst("Onbekend");
19
39
  }
20
- }, children: [_jsx(SelectTrigger, { className: "h-8 w-48 text-sm", "aria-label": "Printer bij dit document", children: _jsx(SelectValue, { placeholder: "Geen printer" }) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "geen", children: "Geen printer" }), printers
21
- .filter((p) => p.actief)
22
- .map((printer) => (_jsx(SelectItem, { value: printer.id, children: printer.naam }, printer.id)))] })] }));
40
+ })();
41
+ return () => {
42
+ weg = true;
43
+ };
44
+ }, [layoutId, documenttype]);
45
+ return (_jsxs("div", { className: "text-sm", children: [_jsx("span", { children: tekst }), metLink && (_jsx(Link, { to: "/layouts-printers/printplekken", className: "ml-2 text-xs text-primary underline", children: "Wijzigen op Printen" }))] }));
23
46
  }
@@ -1 +1 @@
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"}
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,+BAkpB1E"}
@@ -1,10 +1,12 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { useMemo, useState } from "react";
3
3
  import { useAutoRefresh } from "../lib/useAutoRefresh.js";
4
- import { useNavigate } from "@tanstack/react-router";
4
+ import { Link, useNavigate } from "@tanstack/react-router";
5
5
  import { Badge, Button, Card, CardContent, CardDescription, CardHeader, CardTitle, Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, Input, Label, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Separator, Switch, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, Textarea, toast, } from "@flowselections/core";
6
- import { Copy, FileText, Pencil, Plus, Search, Settings2, Trash2 } from "lucide-react";
7
- import { dupliceerLayout, maakLayout, updateLayout, useLayouts, usePrinters, zetLayoutPrinter, verwijderLayout, } from "../lib/useDocumentData.js";
6
+ import { AlertTriangle, Copy, FileText, Pencil, Plus, Search, Settings2, Trash2 } from "lucide-react";
7
+ import { layoutConflicten, maakStandaardLayout } from "../lib/useDocumentData.js";
8
+ import { dupliceerLayout, maakLayout, updateLayout, useLayouts, verwijderLayout, } from "../lib/useDocumentData.js";
9
+ import { LayoutPrinterSelect } from "./LayoutPrinterSelect.js";
8
10
  import { DOCUMENT_TYPES, FLORIDAY_LAYOUT_TOELICHTING, PAPIERFORMATEN, documentTypeLabel, isFloridayLayout, } from "../lib/documentTypes.js";
9
11
  import { DOCUMENT_PROFIELEN, documentProfiel, primaireProfielen, standaardConfig, } from "../lib/documentProfiles.js";
10
12
  /** Elk documenttype krijgt zijn eigen opbouwpagina. */
@@ -23,10 +25,9 @@ function klantOntwerpLayout(l) {
23
25
  }
24
26
  export function LayoutsPage({ ingebed = false } = {}) {
25
27
  const { layouts, loading, reload } = useLayouts();
26
- const { printers, koppelingen, reload: reloadPrinters } = usePrinters();
28
+ const conflicten = useMemo(() => layoutConflicten(layouts), [layouts]);
27
29
  useAutoRefresh(() => {
28
30
  void reload(true);
29
- void reloadPrinters(true);
30
31
  }, 30000);
31
32
  const navigate = useNavigate();
32
33
  const [zoek, setZoek] = useState("");
@@ -155,19 +156,28 @@ export function LayoutsPage({ ingebed = false } = {}) {
155
156
  }
156
157
  };
157
158
  const Wrapper = ingebed ? "div" : "main";
158
- return (_jsxs(Wrapper, { className: ingebed ? "space-y-6" : "p-6 space-y-6", children: [_jsxs("div", { className: "flex flex-wrap items-end justify-between gap-4", children: [!ingebed && (_jsxs("div", { children: [_jsx("h1", { className: "text-xl font-semibold", children: "Documentlayouts" }), _jsx("p", { className: "text-sm text-muted-foreground", children: "Ontwerp pakbonnen, facturen, etiketten en alle andere documenten." })] })), _jsx("div", { className: "ml-auto flex gap-2", children: _jsxs(Button, { onClick: () => setWizardOpen(true), children: [_jsx(Plus, { className: "mr-2 h-4 w-4" }), " Nieuwe layout"] }) })] }), _jsxs(Card, { children: [_jsxs(CardHeader, { className: "pb-3", children: [_jsx(CardTitle, { className: "text-base", children: "Overzicht" }), _jsx(CardDescription, { children: loading ? "Laden…" : `${gefilterd.length} van ${layouts.length} layouts` })] }), _jsxs(CardContent, { className: "space-y-4", children: [_jsxs("div", { className: "grid gap-3 md:grid-cols-5", children: [_jsxs("div", { className: "relative md:col-span-2", children: [_jsx(Search, { className: "absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" }), _jsx(Input, { className: "pl-9", placeholder: "Zoek op naam of omschrijving", value: zoek, onChange: (e) => setZoek(e.target.value) })] }), _jsxs(Select, { value: typeFilter, onValueChange: setTypeFilter, children: [_jsx(SelectTrigger, { children: _jsx(SelectValue, { placeholder: "Documenttype" }) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "alle", children: "Alle documenttypes" }), DOCUMENT_TYPES.map((d) => (_jsx(SelectItem, { value: d.value, children: d.label }, d.value)))] })] }), _jsxs(Select, { value: statusFilter, onValueChange: setStatusFilter, children: [_jsx(SelectTrigger, { children: _jsx(SelectValue, { placeholder: "Status" }) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "alle", children: "Alle statussen" }), _jsx(SelectItem, { value: "actief", children: "Actief" }), _jsx(SelectItem, { value: "inactief", children: "Inactief" })] })] }), _jsxs(Select, { value: bronFilter, onValueChange: setBronFilter, children: [_jsx(SelectTrigger, { children: _jsx(SelectValue, { placeholder: "Herkomst" }) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "alle", children: "Alle herkomsten" }), _jsx(SelectItem, { value: "eigen", children: "Eigen ontwerp" }), _jsx(SelectItem, { value: "floriday", children: "Uit Floriday" })] })] })] }), _jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: "Naam" }), _jsx(TableHead, { children: "Documenttype" }), _jsx(TableHead, { children: "Formaat" }), _jsx(TableHead, { children: "Printer bij document" }), _jsx(TableHead, { children: "Actief" }), _jsx(TableHead, { className: "text-right", children: "Acties" })] }) }), _jsxs(TableBody, { children: [gefilterd.length === 0 && (_jsx(TableRow, { children: _jsx(TableCell, { colSpan: 6, className: "py-10 text-center text-sm text-muted-foreground", children: "Geen layouts gevonden." }) })), gefilterd.map((l) => (_jsxs(TableRow, { children: [_jsxs(TableCell, { children: [_jsxs("div", { className: "flex items-center gap-2 font-medium", children: [_jsx(FileText, { className: "h-4 w-4 text-muted-foreground" }), l.naam, l.is_standaard && _jsx(Badge, { variant: "secondary", children: "Standaard" }), isFloridayLayout(l) && _jsx(Badge, { variant: "outline", children: "Uit Floriday" })] }), (l.omschrijving || isFloridayLayout(l)) && (_jsx("span", { className: "text-xs text-muted-foreground", children: isFloridayLayout(l) ? FLORIDAY_LAYOUT_TOELICHTING : l.omschrijving }))] }), _jsx(TableCell, { children: documentTypeLabel(l.documenttype) }), _jsxs(TableCell, { className: "text-sm text-muted-foreground", children: [l.papierformaat, " \u00B7 ", Number(l.breedte_mm), " \u00D7 ", Number(l.hoogte_mm), " mm"] }), _jsx(TableCell, { className: "min-w-52", children: _jsxs(Select, { value: koppelingen.find((k) => k.layout_id === l.id)?.printer_id ?? "geen", onValueChange: async (printerId) => {
159
- try {
160
- await zetLayoutPrinter(l.id, printerId === "geen" ? null : printerId);
161
- await reloadPrinters(true);
162
- toast.success("Printer bij document opgeslagen");
163
- }
164
- catch {
165
- toast.error("Printerkeuze opslaan mislukt");
166
- }
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) => {
168
- await updateLayout(l.id, { actief: v });
169
- void reload();
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 () => {
159
+ return (_jsxs(Wrapper, { className: ingebed ? "space-y-6" : "p-6 space-y-6", children: [_jsxs("div", { className: "flex flex-wrap items-end justify-between gap-4", children: [!ingebed && (_jsxs("div", { children: [_jsx("h1", { className: "text-xl font-semibold", children: "Documentlayouts" }), _jsx("p", { className: "text-sm text-muted-foreground", children: "Ontwerp pakbonnen, facturen, etiketten en alle andere documenten." })] })), _jsx("div", { className: "ml-auto flex gap-2", children: _jsxs(Button, { onClick: () => setWizardOpen(true), children: [_jsx(Plus, { className: "mr-2 h-4 w-4" }), " Nieuwe layout"] }) })] }), conflicten.length > 0 && (_jsxs(Card, { className: "border-destructive/50", children: [_jsxs(CardHeader, { className: "pb-2", children: [_jsxs(CardTitle, { className: "flex items-center gap-2 text-base", children: [_jsx(AlertTriangle, { className: "h-4 w-4 text-destructive" }), " Meerdere actieve layouts"] }), _jsx(CardDescription, { children: "Bij het printen wint per documentsoort \u00E9\u00E9n layout. De andere worden alleen gebruikt als een module ze expliciet kiest." })] }), _jsx(CardContent, { className: "space-y-2", children: conflicten.map((c) => (_jsxs("div", { className: "rounded-lg border p-2 text-sm", "data-conflict": c.documenttype, children: [_jsxs("div", { className: "font-medium", children: [documentTypeLabel(c.documenttype), " (", c.bron === "floriday" ? "Floriday" : "eigen", ") \u2014 ", c.actief.length, " actief"] }), _jsxs("div", { className: "text-muted-foreground text-xs", children: ["Wint bij printen: ", _jsx("span", { className: "font-medium text-foreground", children: c.winnaar.naam }), c.heeftStandaard ? " (standaard)" : " — geen standaard, de laatst bewerkte wint"] }), _jsx("div", { className: "mt-1 flex flex-wrap gap-2", children: c.actief.filter((l) => l.id !== c.winnaar.id || !c.heeftStandaard).map((l) => (_jsxs(Button, { size: "sm", variant: "outline", onClick: async () => {
160
+ try {
161
+ await maakStandaardLayout(l.id);
162
+ toast.success(`${l.naam} is nu de standaard`);
163
+ }
164
+ catch {
165
+ toast.error("Standaard maken mislukt");
166
+ }
167
+ void reload();
168
+ }, children: ["Maak \"", l.naam, "\" standaard"] }, l.id))) })] }, `${c.documenttype}-${c.bron}`))) })] })), _jsxs(Card, { children: [_jsxs(CardHeader, { className: "pb-3", children: [_jsx(CardTitle, { className: "text-base", children: "Overzicht" }), _jsx(CardDescription, { children: loading ? "Laden…" : `${gefilterd.length} van ${layouts.length} layouts` })] }), _jsxs(CardContent, { className: "space-y-4", children: [_jsxs("div", { className: "grid gap-3 md:grid-cols-5", children: [_jsxs("div", { className: "relative md:col-span-2", children: [_jsx(Search, { className: "absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" }), _jsx(Input, { className: "pl-9", placeholder: "Zoek op naam of omschrijving", value: zoek, onChange: (e) => setZoek(e.target.value) })] }), _jsxs(Select, { value: typeFilter, onValueChange: setTypeFilter, children: [_jsx(SelectTrigger, { children: _jsx(SelectValue, { placeholder: "Documenttype" }) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "alle", children: "Alle documenttypes" }), DOCUMENT_TYPES.map((d) => (_jsx(SelectItem, { value: d.value, children: d.label }, d.value)))] })] }), _jsxs(Select, { value: statusFilter, onValueChange: setStatusFilter, children: [_jsx(SelectTrigger, { children: _jsx(SelectValue, { placeholder: "Status" }) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "alle", children: "Alle statussen" }), _jsx(SelectItem, { value: "actief", children: "Actief" }), _jsx(SelectItem, { value: "inactief", children: "Inactief" })] })] }), _jsxs(Select, { value: bronFilter, onValueChange: setBronFilter, children: [_jsx(SelectTrigger, { children: _jsx(SelectValue, { placeholder: "Herkomst" }) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "alle", children: "Alle herkomsten" }), _jsx(SelectItem, { value: "eigen", children: "Eigen ontwerp" }), _jsx(SelectItem, { value: "floriday", children: "Uit Floriday" })] })] })] }), _jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: "Naam" }), _jsx(TableHead, { children: "Documenttype" }), _jsx(TableHead, { children: "Formaat" }), _jsxs(TableHead, { children: [_jsx("div", { children: "Printer nu" }), _jsxs("div", { className: "text-xs font-normal", children: ["bedrijfsstandaard, in te stellen op", " ", _jsx(Link, { to: "/layouts-printers/printplekken", className: "text-primary underline", children: "Printen" })] })] }), _jsx(TableHead, { children: "Actief" }), _jsx(TableHead, { className: "text-right", children: "Acties" })] }) }), _jsxs(TableBody, { children: [gefilterd.length === 0 && (_jsx(TableRow, { children: _jsx(TableCell, { colSpan: 6, className: "py-10 text-center text-sm text-muted-foreground", children: "Geen layouts gevonden." }) })), gefilterd.map((l) => (_jsxs(TableRow, { children: [_jsxs(TableCell, { children: [_jsxs("div", { className: "flex items-center gap-2 font-medium", children: [_jsx(FileText, { className: "h-4 w-4 text-muted-foreground" }), l.naam, l.is_standaard && _jsx(Badge, { variant: "secondary", children: "Standaard" }), isFloridayLayout(l) && _jsx(Badge, { variant: "outline", children: "Uit Floriday" })] }), (l.omschrijving || isFloridayLayout(l)) && (_jsx("span", { className: "text-xs text-muted-foreground", children: isFloridayLayout(l) ? FLORIDAY_LAYOUT_TOELICHTING : l.omschrijving }))] }), _jsx(TableCell, { children: documentTypeLabel(l.documenttype) }), _jsxs(TableCell, { className: "text-sm text-muted-foreground", children: [l.papierformaat, " \u00B7 ", Number(l.breedte_mm), " \u00D7 ", Number(l.hoogte_mm), " mm"] }), _jsx(TableCell, { className: "min-w-52", children: _jsx(LayoutPrinterSelect, { layoutId: l.id, documenttype: l.documenttype }) }), _jsx(TableCell, { children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Switch, { checked: l.actief, onCheckedChange: async (v) => {
169
+ await updateLayout(l.id, { actief: v });
170
+ void reload();
171
+ } }), !l.is_standaard && (_jsx(Button, { variant: "ghost", size: "sm", onClick: async () => {
172
+ try {
173
+ await maakStandaardLayout(l.id);
174
+ toast.success(`${l.naam} is nu de standaard`);
175
+ }
176
+ catch {
177
+ toast.error("Standaard maken mislukt");
178
+ }
179
+ void reload();
180
+ }, children: "Maak standaard" }))] }) }), _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 () => {
171
181
  try {
172
182
  await dupliceerLayout(l.id);
173
183
  toast.success("Layout gedupliceerd");
@@ -4,11 +4,13 @@ export interface BewerkPrinter {
4
4
  locatie: string | null;
5
5
  papierformaat: string | null;
6
6
  }
7
- export declare function PrinterSetupWizard({ open, onOpenChange, onKlaar, computerFilter, bekendeExterneIds, bekendeLocaties, bewerken, }: {
7
+ export declare function PrinterSetupWizard({ open, onOpenChange, onKlaar, computerFilter, bekendeExterneIds, bekendeLocaties, bewerken, printPlekId, }: {
8
8
  open: boolean;
9
9
  onOpenChange: (v: boolean) => void;
10
10
  onKlaar?: () => void;
11
11
  computerFilter?: string | null;
12
+ /** Nieuwe printers worden direct aan deze printplek gekoppeld. */
13
+ printPlekId?: string | null;
12
14
  bekendeExterneIds?: string[];
13
15
  bekendeLocaties?: string[];
14
16
  bewerken?: BewerkPrinter | null;
@@ -1 +1 @@
1
- {"version":3,"file":"PrinterSetupWizard.d.ts","sourceRoot":"","sources":["../../src/components/PrinterSetupWizard.tsx"],"names":[],"mappings":"AAkDA,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAwCD,wBAAgB,kBAAkB,CAAC,EACjC,IAAI,EACJ,YAAY,EACZ,OAAO,EACP,cAAc,EACd,iBAAsB,EACtB,eAAoB,EACpB,QAAQ,GACT,EAAE;IACD,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;CACjC,+BA4cA"}
1
+ {"version":3,"file":"PrinterSetupWizard.d.ts","sourceRoot":"","sources":["../../src/components/PrinterSetupWizard.tsx"],"names":[],"mappings":"AAoDA,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAwCD,wBAAgB,kBAAkB,CAAC,EACjC,IAAI,EACJ,YAAY,EACZ,OAAO,EACP,cAAc,EACd,iBAAsB,EACtB,eAAoB,EACpB,QAAQ,EACR,WAAW,GACZ,EAAE;IACD,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,kEAAkE;IAClE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;CACjC,+BAodA"}
@@ -7,6 +7,8 @@ import { useCallback, useEffect, useMemo, useState } from "react";
7
7
  import { Button, Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, Input, Label, toast, } from "@flowselections/core";
8
8
  import { Check, CheckCircle2, FileText, Loader2, Printer, RefreshCw, Search, Tag, } from "lucide-react";
9
9
  import { supabase } from "../lib/supabaseClient.js";
10
+ import { wijsPrinterToeAanPrintplek } from "../lib/printplekken.js";
11
+ import { leesbareFout } from "../lib/foutTekst.js";
10
12
  import { printHtml, volgJobStatus } from "../lib/printApi.js";
11
13
  import { netwerkPrinters } from "../lib/printService.functions.js";
12
14
  import { printerFormaatOpties } from "../lib/papierFormaten.js";
@@ -29,7 +31,7 @@ function Stappenbalk({ stap }) {
29
31
  ? "border-primary text-primary border-2"
30
32
  : "bg-muted text-muted-foreground"}`, children: i < stap ? _jsx(Check, { className: "h-4 w-4" }) : i + 1 }), _jsx("span", { className: `hidden text-sm sm:inline ${i === stap ? "text-foreground font-medium" : "text-muted-foreground"}`, children: s }), i < STAPPEN.length - 1 && _jsx("div", { className: "bg-border h-px flex-1" })] }, s))) }));
31
33
  }
32
- export function PrinterSetupWizard({ open, onOpenChange, onKlaar, computerFilter, bekendeExterneIds = [], bekendeLocaties = [], bewerken, }) {
34
+ export function PrinterSetupWizard({ open, onOpenChange, onKlaar, computerFilter, bekendeExterneIds = [], bekendeLocaties = [], bewerken, printPlekId, }) {
33
35
  const [stap, setStap] = useState(0);
34
36
  const [bezig, setBezig] = useState(false);
35
37
  const [zoekt, setZoekt] = useState(false);
@@ -162,12 +164,19 @@ export function PrinterSetupWizard({ open, onOpenChange, onKlaar, computerFilter
162
164
  .single();
163
165
  if (error)
164
166
  throw error;
165
- setPrinterId(data?.id ?? null);
167
+ const nieuwId = data?.id ?? null;
168
+ if (nieuwId && printPlekId) {
169
+ await wijsPrinterToeAanPrintplek(printPlekId, nieuwId);
170
+ }
171
+ else if (nieuwId && computerFilter && !printPlekId) {
172
+ toast.warning(`Printer opgeslagen, maar computer ${computerFilter} hoort bij geen printplek. Koppel de computer eerst aan een printplek.`);
173
+ }
174
+ setPrinterId(nieuwId);
166
175
  setStap(2);
167
176
  onKlaar?.();
168
177
  }
169
- catch {
170
- toast.error("Opslaan mislukt");
178
+ catch (err) {
179
+ toast.error(leesbareFout(err));
171
180
  }
172
181
  finally {
173
182
  setBezig(false);
@@ -0,0 +1,14 @@
1
+ export declare function PrinterVervangenDialog({ open, onOpenChange, printer, printers, onKlaar, }: {
2
+ open: boolean;
3
+ onOpenChange: (v: boolean) => void;
4
+ printer: {
5
+ id: string;
6
+ naam: string;
7
+ } | null;
8
+ printers: {
9
+ id: string;
10
+ naam: string;
11
+ }[];
12
+ onKlaar?: () => void;
13
+ }): import("react").JSX.Element;
14
+ //# sourceMappingURL=PrinterVervangenDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PrinterVervangenDialog.d.ts","sourceRoot":"","sources":["../../src/components/PrinterVervangenDialog.tsx"],"names":[],"mappings":"AAkBA,wBAAgB,sBAAsB,CAAC,EACrC,IAAI,EACJ,YAAY,EACZ,OAAO,EACP,QAAQ,EACR,OAAO,GACR,EAAE;IACD,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC7C,QAAQ,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACzC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB,+BA2EA"}
@@ -0,0 +1,44 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // ============================================================================
3
+ // src/components/PrinterVervangenDialog.tsx — laat zien waar een printer
4
+ // gebruikt wordt en zet in één keer alle verwijzingen over naar een andere
5
+ // printer, of expliciet op "geen printer".
6
+ // ============================================================================
7
+ import { useEffect, useState } from "react";
8
+ import { Button, Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, toast, } from "@flowselections/core";
9
+ import { printerGebruik, vervangPrinterOveral } from "../lib/printplekken.js";
10
+ export function PrinterVervangenDialog({ open, onOpenChange, printer, printers, onKlaar, }) {
11
+ const [gebruik, setGebruik] = useState(null);
12
+ const [nieuw, setNieuw] = useState("");
13
+ const [bezig, setBezig] = useState(false);
14
+ useEffect(() => {
15
+ if (!open || !printer)
16
+ return;
17
+ setNieuw("");
18
+ setGebruik(null);
19
+ printerGebruik(printer.id).then(setGebruik).catch(() => setGebruik(null));
20
+ }, [open, printer]);
21
+ const totaal = gebruik
22
+ ? gebruik.printplek_regels + gebruik.werkplek_regels + gebruik.layout_koppelingen + gebruik.standaardregels
23
+ : 0;
24
+ const opties = (Array.isArray(printers) ? printers : []).filter((p) => p.id !== printer?.id);
25
+ const uitvoeren = async () => {
26
+ if (!printer)
27
+ return;
28
+ setBezig(true);
29
+ try {
30
+ const r = await vervangPrinterOveral(printer.id, nieuw || null);
31
+ const n = Object.values(r).reduce((a, b) => a + Number(b || 0), 0);
32
+ toast.success(nieuw ? `${n} regels overgezet` : `${n} regels op "geen printer" gezet`);
33
+ onOpenChange(false);
34
+ onKlaar?.();
35
+ }
36
+ catch (e) {
37
+ toast.error(e instanceof Error ? e.message : "Vervangen mislukt");
38
+ }
39
+ finally {
40
+ setBezig(false);
41
+ }
42
+ };
43
+ return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(DialogContent, { children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: "Printer overal vervangen" }), _jsxs(DialogDescription, { children: [printer?.naam, " wordt gebruikt in ", gebruik ? totaal : "…", " regel", totaal === 1 ? "" : "s", "."] })] }), gebruik ? (_jsxs("ul", { className: "text-sm space-y-1", children: [_jsxs("li", { children: ["Printplekregels: ", gebruik.printplek_regels] }), _jsxs("li", { children: ["Werkplek-uitzonderingen: ", gebruik.werkplek_regels] }), _jsxs("li", { children: ["Layout-koppelingen: ", gebruik.layout_koppelingen] }), _jsxs("li", { children: ["Bedrijfsstandaard: ", gebruik.standaardregels] }), _jsxs("li", { children: ["Gekoppeld aan printplekken: ", gebruik.printplekken] })] })) : null, _jsx("label", { className: "text-sm font-medium", children: "Vervangen door" }), _jsxs("select", { className: "border-input bg-background w-full rounded-md border px-3 py-2 text-sm", value: nieuw, onChange: (e) => setNieuw(e.target.value), children: [_jsx("option", { value: "", children: "Geen printer (regels worden zichtbaar leeg)" }), opties.map((p) => (_jsx("option", { value: p.id, children: p.naam }, p.id)))] }), _jsxs("div", { className: "flex justify-end gap-2", children: [_jsx(Button, { variant: "ghost", onClick: () => onOpenChange(false), children: "Annuleren" }), _jsx(Button, { onClick: () => void uitvoeren(), disabled: bezig || !printer, children: nieuw ? "Overal vervangen" : "Overal leegmaken" })] })] }) }));
44
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"PrintersPage.d.ts","sourceRoot":"","sources":["../../src/components/PrintersPage.tsx"],"names":[],"mappings":"AA2BA,wBAAgB,YAAY,CAAC,EAAE,OAAe,EAAE,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,+BAyM3E"}
1
+ {"version":3,"file":"PrintersPage.d.ts","sourceRoot":"","sources":["../../src/components/PrintersPage.tsx"],"names":[],"mappings":"AA2BA,wBAAgB,YAAY,CAAC,EAAE,OAAe,EAAE,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,+BAsM3E"}
@@ -17,7 +17,7 @@ import { PrintStatusBanner } from "./PrintStatusBanner.js";
17
17
  import { telPrintersPerComputer } from "../lib/printerTelling.js";
18
18
  import { WerkplekkenTabel } from "./WerkplekkenTabel.js";
19
19
  export function PrintersPage({ ingebed = false } = {}) {
20
- const { printers, koppelingen, reload } = usePrinters();
20
+ const { printers, reload } = usePrinters();
21
21
  const { layouts } = useLayouts();
22
22
  const navigate = useNavigate();
23
23
  const { computers, loading: computersLaden, fout: computersFout, reload: herlaadComputers, } = useComputers();
@@ -29,7 +29,7 @@ export function PrintersPage({ ingebed = false } = {}) {
29
29
  const bijgewerkt = useAutoRefresh(async () => {
30
30
  await Promise.all([reload(true), herlaadComputers(true), zoek()]);
31
31
  }, 10000, computerToevoegen);
32
- const gekoppeldePrinters = useMemo(() => new Set(koppelingen.map((k) => k.printer_id)), [koppelingen]);
32
+ const gekoppeldePrinters = useMemo(() => new Set(), []);
33
33
  const printersPerComputer = useMemo(() => telPrintersPerComputer(printers, gevonden, gekoppeldePrinters), [printers, gevonden, gekoppeldePrinters]);
34
34
  const alleRijen = computers.map((c) => {
35
35
  const info = printersPerComputer.get(c.naam);
@@ -1 +1 @@
1
- {"version":3,"file":"PrintplekDetailPage.d.ts","sourceRoot":"","sources":["../../src/components/PrintplekDetailPage.tsx"],"names":[],"mappings":"AA8CA,wBAAgB,mBAAmB,gCA2WlC"}
1
+ {"version":3,"file":"PrintplekDetailPage.d.ts","sourceRoot":"","sources":["../../src/components/PrintplekDetailPage.tsx"],"names":[],"mappings":"AA8DA,wBAAgB,mBAAmB,gCAmmBlC"}