@flowselections/layout-maker 1.20.1 → 1.21.0
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/PrintplekDetailPage.d.ts.map +1 -1
- package/dist-lib/components/PrintplekDetailPage.js +4 -2
- package/dist-lib/components/PrintplekkenPage.d.ts.map +1 -1
- package/dist-lib/components/PrintplekkenPage.js +4 -2
- package/dist-lib/components/TestprintDialog.d.ts +8 -0
- package/dist-lib/components/TestprintDialog.d.ts.map +1 -0
- package/dist-lib/components/TestprintDialog.js +93 -0
- package/dist-lib/index.d.ts +3 -0
- package/dist-lib/index.d.ts.map +1 -1
- package/dist-lib/index.js +2 -0
- package/dist-lib/lib/testprint.d.ts +29 -0
- package/dist-lib/lib/testprint.d.ts.map +1 -0
- package/dist-lib/lib/testprint.js +89 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PrintplekDetailPage.d.ts","sourceRoot":"","sources":["../../src/components/PrintplekDetailPage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PrintplekDetailPage.d.ts","sourceRoot":"","sources":["../../src/components/PrintplekDetailPage.tsx"],"names":[],"mappings":"AA8CA,wBAAgB,mBAAmB,gCAgWlC"}
|
|
@@ -15,6 +15,7 @@ import { useComputers } from "./ComputersLijst.js";
|
|
|
15
15
|
import { DOCUMENT_TYPES, documentTypeLabel } from "../lib/documentTypes.js";
|
|
16
16
|
import { drukTestpaginaAf } from "../lib/testpagina.js";
|
|
17
17
|
import { PrintplekWizard } from "./PrintplekWizard.js";
|
|
18
|
+
import { TestprintDialog } from "./TestprintDialog.js";
|
|
18
19
|
export function PrintplekDetailPage() {
|
|
19
20
|
const params = useParams({ strict: false });
|
|
20
21
|
const plekId = params.printplekId ?? "";
|
|
@@ -26,6 +27,7 @@ export function PrintplekDetailPage() {
|
|
|
26
27
|
const [naam, setNaam] = useState("");
|
|
27
28
|
const [alleDocumenten, setAlleDocumenten] = useState(false);
|
|
28
29
|
const [wizardOpen, setWizardOpen] = useState(false);
|
|
30
|
+
const [testprintOpen, setTestprintOpen] = useState(false);
|
|
29
31
|
const plek = plekken.find((p) => p.id === plekId) ?? null;
|
|
30
32
|
const eigenComputers = plekComputers.filter((c) => c.print_plek_id === plekId);
|
|
31
33
|
const eigenNamen = new Set(eigenComputers.map((c) => c.computer_naam));
|
|
@@ -70,11 +72,11 @@ export function PrintplekDetailPage() {
|
|
|
70
72
|
}, children: _jsx(Check, { className: "h-4 w-4" }) }), _jsx(Button, { size: "icon", variant: "ghost", onClick: () => setNaamBewerken(false), children: _jsx(X, { className: "h-4 w-4" }) })] })) : (_jsx("h1", { className: "cursor-pointer text-xl font-semibold", onClick: () => {
|
|
71
73
|
setNaam(plek.naam);
|
|
72
74
|
setNaamBewerken(true);
|
|
73
|
-
}, children: plek.naam })), _jsx("p", { className: "text-muted-foreground text-sm", children: plek.omschrijving ?? "Stel hier in wat er op deze plek wordt afgedrukt." })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsxs(Button, { variant: "outline", onClick: () => setWizardOpen(true), children: [_jsx(Wand2, { className: "mr-2 h-4 w-4" }), onvolledig ? "Afmaken met de wizard" : "Instellen met de wizard"] }), _jsxs(Button, { variant: "ghost", className: "text-destructive", onClick: async () => {
|
|
75
|
+
}, children: plek.naam })), _jsx("p", { className: "text-muted-foreground text-sm", children: plek.omschrijving ?? "Stel hier in wat er op deze plek wordt afgedrukt." })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsxs(Button, { variant: "outline", onClick: () => setTestprintOpen(true), children: [_jsx(Printer, { className: "mr-2 h-4 w-4" }), " Testprint controleren"] }), _jsxs(Button, { variant: "outline", onClick: () => setWizardOpen(true), children: [_jsx(Wand2, { className: "mr-2 h-4 w-4" }), onvolledig ? "Afmaken met de wizard" : "Instellen met de wizard"] }), _jsxs(Button, { variant: "ghost", className: "text-destructive", onClick: async () => {
|
|
74
76
|
await verwijderPrintplek(plek.id);
|
|
75
77
|
toast.success("Printplek verwijderd");
|
|
76
78
|
await reload();
|
|
77
|
-
}, children: [_jsx(Trash2, { className: "mr-2 h-4 w-4" }), " Verwijderen"] })] })] }), _jsx(PrintplekWizard, { open: wizardOpen, onOpenChange: setWizardOpen, printplekId: plekId, onKlaar: () => void reload() }), _jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsxs(CardTitle, { className: "flex items-center gap-2 text-base", children: [_jsx(Monitor, { className: "h-4 w-4" }), " Computers op deze plek"] }), _jsx(CardDescription, { children: "Computers voeg je toe of haal je weg met de wizard." })] }), _jsx(CardContent, { className: "space-y-3", children: eigenComputers.length === 0 ? (_jsx("p", { className: "text-muted-foreground text-sm", children: "Nog geen computers gekoppeld." })) : (_jsx("div", { className: "flex flex-wrap gap-2", children: eigenComputers.map((c) => {
|
|
79
|
+
}, children: [_jsx(Trash2, { className: "mr-2 h-4 w-4" }), " Verwijderen"] })] })] }), _jsx(PrintplekWizard, { open: wizardOpen, onOpenChange: setWizardOpen, printplekId: plekId, onKlaar: () => void reload() }), _jsx(TestprintDialog, { open: testprintOpen, onOpenChange: setTestprintOpen, printplekId: plekId, printplekNaam: plek.naam }), _jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsxs(CardTitle, { className: "flex items-center gap-2 text-base", children: [_jsx(Monitor, { className: "h-4 w-4" }), " Computers op deze plek"] }), _jsx(CardDescription, { children: "Computers voeg je toe of haal je weg met de wizard." })] }), _jsx(CardContent, { className: "space-y-3", children: eigenComputers.length === 0 ? (_jsx("p", { className: "text-muted-foreground text-sm", children: "Nog geen computers gekoppeld." })) : (_jsx("div", { className: "flex flex-wrap gap-2", children: eigenComputers.map((c) => {
|
|
78
80
|
const aan = computers.find((k) => k.naam === c.computer_naam)?.online ?? false;
|
|
79
81
|
return (_jsxs("span", { className: "flex items-center gap-2 rounded-full border px-3 py-1 text-sm", children: [_jsx("span", { className: `h-2 w-2 rounded-full ${aan ? "bg-emerald-500" : "bg-muted-foreground"}` }), c.computer_naam] }, c.id));
|
|
80
82
|
}) })) })] }), _jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsxs(CardTitle, { className: "flex items-center gap-2 text-base", children: [_jsx(Printer, { className: "h-4 w-4" }), " Printers op deze plek"] }), _jsx(CardDescription, { children: "Test een printer om te zien of hij goed staat." })] }), _jsx(CardContent, { children: eigenPrinters.length === 0 ? (_jsxs("div", { className: "text-muted-foreground flex items-center gap-2 text-sm", children: [_jsx(AlertTriangle, { className: "text-destructive h-4 w-4" }), "Nog geen ingestelde printers. Voeg ze toe bij", " ", _jsx(Link, { className: "text-primary underline", to: "/layouts-printers/printplekken", children: "Printplekken" }), "."] })) : (_jsx("div", { className: "space-y-2", children: eigenPrinters.map((p) => (_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-2 rounded-lg border p-2", children: [_jsxs("div", { className: "text-sm", children: [_jsx("span", { className: "font-medium", children: p.naam }), p.papierformaat ? (_jsx(Badge, { variant: "secondary", className: "ml-2", children: p.papierformaat })) : null] }), _jsx(Button, { size: "sm", variant: "ghost", onClick: async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PrintplekkenPage.d.ts","sourceRoot":"","sources":["../../src/components/PrintplekkenPage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PrintplekkenPage.d.ts","sourceRoot":"","sources":["../../src/components/PrintplekkenPage.tsx"],"names":[],"mappings":"AAoCA,wBAAgB,gBAAgB,CAAC,EAAE,OAAe,EAAE,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,+BAuZ/E"}
|
|
@@ -15,6 +15,7 @@ import { useComputers } from "./ComputersLijst.js";
|
|
|
15
15
|
import { ComputersLijst } from "./ComputersLijst.js";
|
|
16
16
|
import { telPrintersPerComputer } from "../lib/printerTelling.js";
|
|
17
17
|
import { PrintplekWizard } from "./PrintplekWizard.js";
|
|
18
|
+
import { TestprintDialog } from "./TestprintDialog.js";
|
|
18
19
|
import { PrintStatusBanner } from "./PrintStatusBanner.js";
|
|
19
20
|
import { bijgewerktTekst, useAutoRefresh } from "../lib/useAutoRefresh.js";
|
|
20
21
|
import { documentTypeLabel } from "../lib/documentTypes.js";
|
|
@@ -26,6 +27,7 @@ export function PrintplekkenPage({ ingebed = false } = {}) {
|
|
|
26
27
|
const navigate = useNavigate();
|
|
27
28
|
const [zoekterm, setZoekterm] = useState("");
|
|
28
29
|
const [wizardOpen, setWizardOpen] = useState(false);
|
|
30
|
+
const [testprint, setTestprint] = useState(null);
|
|
29
31
|
const [computerToevoegen, setComputerToevoegen] = useState(false);
|
|
30
32
|
const bijgewerkt = useAutoRefresh(async () => {
|
|
31
33
|
await Promise.all([reload(true), herlaadComputers(true), herlaadPrinters(true), zoek()]);
|
|
@@ -95,14 +97,14 @@ export function PrintplekkenPage({ ingebed = false } = {}) {
|
|
|
95
97
|
const Wrapper = ingebed ? "div" : "main";
|
|
96
98
|
return (_jsxs(Wrapper, { className: ingebed ? "space-y-6" : "space-y-6 p-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: "Printplekken" }), _jsx("p", { className: "text-muted-foreground text-sm", children: "Een printplek is een fysieke plek in het bedrijf, bijvoorbeeld een pickstation. Alle computers en printers op die plek horen bij elkaar." })] })), _jsxs("div", { className: "ml-auto flex items-center gap-2", children: [_jsxs(Button, { variant: "outline", onClick: () => setComputerToevoegen(true), children: [_jsx(Plus, { className: "mr-2 h-4 w-4" }), " Computer aanmelden"] }), _jsxs(Button, { onClick: () => setWizardOpen(true), children: [_jsx(Wand2, { className: "mr-2 h-4 w-4" }), " Printplek instellen"] })] })] }), _jsx(PrintStatusBanner, { fout: computersFout, offlineWerkplekken: computers.filter((c) => !c.online).map((c) => c.naam), toonWerkplekLink: false }), fout ? (_jsx("div", { className: "border-destructive/40 bg-destructive/10 text-destructive rounded-xl border p-3 text-sm", children: fout })) : null, _jsxs("div", { className: "flex flex-wrap items-center gap-3 rounded-xl border p-3", children: [_jsxs("div", { className: "relative min-w-[220px] flex-1", children: [_jsx(Search, { className: "text-muted-foreground absolute top-2.5 left-3 h-4 w-4" }), _jsx(Input, { className: "pl-9", placeholder: "Zoek printplek of computer\u2026", value: zoekterm, onChange: (e) => setZoekterm(e.target.value) })] }), _jsxs("span", { className: "text-muted-foreground text-sm", children: [plekken.length, " plek", plekken.length === 1 ? "" : "ken", " \u00B7 ", computers.length, " computer", computers.length === 1 ? "" : "s", " (", computersOnline, " aan) \u00B7 ", totaalPrinters, " printer", totaalPrinters === 1 ? "" : "s"] }), _jsx("span", { className: "text-muted-foreground ml-auto text-xs", children: bijgewerktTekst(bijgewerkt) })] }), kaarten.length === 0 ? (_jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { className: "text-base", children: plekken.length === 0 ? "Nog geen printplekken" : "Geen resultaten" }), _jsx(CardDescription, { children: plekken.length === 0
|
|
97
99
|
? 'Maak er één aan per plek waar geprint wordt, bijvoorbeeld "Pickstation 1".'
|
|
98
|
-
: "Geen printplek of computer gevonden met deze zoekterm." })] }), _jsx(CardContent, { className: "flex flex-wrap gap-2", children: _jsxs(Button, { onClick: () => setWizardOpen(true), children: [_jsx(Wand2, { className: "mr-2 h-4 w-4" }), " Printplek instellen"] }) })] })) : (_jsx("div", { className: "grid gap-4 xl:grid-cols-2", children: kaarten.map((k) => (_jsxs("div", { className: "rounded-xl border p-4", children: [_jsxs("div", { className: "flex items-start justify-between gap-3", children: [_jsxs("div", { className: "min-w-0", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(MapPin, { className: "text-muted-foreground h-4 w-4" }), _jsx("span", { className: "truncate font-medium", children: k.plek.naam }), _jsx("span", { className: `h-2.5 w-2.5 shrink-0 rounded-full ${k.klaar ? "bg-emerald-500" : "bg-destructive"}`, "aria-label": k.klaar ? "Klaar om te printen" : "Nog niet compleet" })] }), k.plek.omschrijving ? (_jsx("p", { className: "text-muted-foreground mt-1 text-xs", children: k.plek.omschrijving })) : null] }), _jsxs(Link, { to: "/layouts-printers/printplekken/$printplekId", params: { printplekId: k.plek.id }, className: "text-primary flex
|
|
100
|
+
: "Geen printplek of computer gevonden met deze zoekterm." })] }), _jsx(CardContent, { className: "flex flex-wrap gap-2", children: _jsxs(Button, { onClick: () => setWizardOpen(true), children: [_jsx(Wand2, { className: "mr-2 h-4 w-4" }), " Printplek instellen"] }) })] })) : (_jsx("div", { className: "grid gap-4 xl:grid-cols-2", children: kaarten.map((k) => (_jsxs("div", { className: "rounded-xl border p-4", children: [_jsxs("div", { className: "flex items-start justify-between gap-3", children: [_jsxs("div", { className: "min-w-0", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(MapPin, { className: "text-muted-foreground h-4 w-4" }), _jsx("span", { className: "truncate font-medium", children: k.plek.naam }), _jsx("span", { className: `h-2.5 w-2.5 shrink-0 rounded-full ${k.klaar ? "bg-emerald-500" : "bg-destructive"}`, "aria-label": k.klaar ? "Klaar om te printen" : "Nog niet compleet" })] }), k.plek.omschrijving ? (_jsx("p", { className: "text-muted-foreground mt-1 text-xs", children: k.plek.omschrijving })) : null] }), _jsxs("div", { className: "flex shrink-0 items-center gap-3", children: [_jsxs("button", { type: "button", className: "text-primary flex items-center text-xs", onClick: () => setTestprint({ id: k.plek.id, naam: k.plek.naam }), children: [_jsx(Printer, { className: "mr-1 h-3.5 w-3.5" }), " Testprint"] }), _jsxs(Link, { to: "/layouts-printers/printplekken/$printplekId", params: { printplekId: k.plek.id }, className: "text-primary flex items-center text-xs", children: ["Instellen ", _jsx(ChevronRight, { className: "ml-1 h-3.5 w-3.5" })] })] })] }), _jsx("div", { className: "mt-3 space-y-2", children: k.computerLijst.length === 0 ? (_jsxs("div", { className: "text-muted-foreground flex flex-wrap items-center gap-2 rounded-lg border border-dashed p-3 text-sm", children: ["Nog geen computer gekoppeld", nietGekoppeld.length > 0 ? (_jsxs(Select, { onValueChange: (naam) => void koppel(k.plek.id, naam), children: [_jsx(SelectTrigger, { className: "h-8 w-[190px]", children: _jsx(SelectValue, { placeholder: "Computer koppelen" }) }), _jsx(SelectContent, { children: nietGekoppeld.map((c) => (_jsx(SelectItem, { value: c.naam, children: c.naam }, c.id))) })] })) : (_jsx(Button, { variant: "ghost", size: "sm", onClick: () => setComputerToevoegen(true), children: "Computer aanmelden" }))] })) : (k.computerLijst.map((c) => (_jsxs("div", { className: "bg-muted/40 flex flex-wrap items-center gap-3 rounded-lg px-3 py-2 text-sm", children: [_jsx(Monitor, { className: "text-muted-foreground h-4 w-4 shrink-0" }), _jsx("span", { className: "min-w-0 flex-1 truncate font-medium", children: c.naam }), _jsx("span", { className: `rounded-full px-2 py-0.5 text-xs font-medium ${c.online ? "bg-primary/10 text-primary" : "bg-muted text-muted-foreground"}`, children: c.aangemeld ? (c.online ? "Aan" : "Uit") : "Niet aangemeld" }), _jsxs("span", { className: "text-muted-foreground text-xs", children: [c.ingesteld, " printer", c.ingesteld === 1 ? "" : "s", " \u00B7 ", c.gevonden, " gevonden"] }), _jsx(Button, { variant: "ghost", size: "sm", disabled: !c.id, onClick: () => naarComputer(c.id), children: "Printers toevoegen" })] }, c.koppelingId)))) }), _jsxs("div", { className: "text-muted-foreground mt-3 flex items-start gap-2 text-xs", children: [_jsx(Printer, { className: "mt-0.5 h-3.5 w-3.5 shrink-0" }), _jsx("span", { children: k.documentRegels.length === 0
|
|
99
101
|
? "Nog geen document aan een printer gekoppeld"
|
|
100
102
|
: k.documentRegels
|
|
101
103
|
.map((r) => `${documentTypeLabel(r.documenttype)} → ${printerNaam.get(r.printer_id ?? "") ?? "onbekende printer"}`)
|
|
102
104
|
.join(" · ") })] }), k.bronnen.length > 0 ? (_jsx("div", { className: "mt-3 flex flex-wrap gap-1", children: Array.from(new Set(k.bronnen.map((b) => b.bron))).map((bron) => (_jsxs(Badge, { variant: "secondary", children: [k.bronnen.filter((b) => b.bron === bron).length, "\u00D7 ", bron] }, bron))) })) : null] }, k.plek.id))) })), nietGekoppeld.length > 0 ? (_jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsxs(CardTitle, { className: "text-base", children: ["Computers zonder printplek (", nietGekoppeld.length, ")"] }), _jsx(CardDescription, { children: "Deze computers zijn aangemeld maar horen nog nergens bij. Kies hieronder waar ze staan." })] }), _jsx(CardContent, { className: "space-y-2", children: nietGekoppeld.map((c) => {
|
|
103
105
|
const info = perComputer.get(c.naam);
|
|
104
106
|
return (_jsxs("div", { className: "flex flex-wrap items-center gap-3 rounded-lg border px-3 py-2 text-sm", children: [_jsx(Monitor, { className: "text-muted-foreground h-4 w-4 shrink-0" }), _jsx("span", { className: "min-w-0 flex-1 truncate font-medium", children: c.naam }), _jsx("span", { className: `rounded-full px-2 py-0.5 text-xs font-medium ${c.online ? "bg-primary/10 text-primary" : "bg-muted text-muted-foreground"}`, children: c.online ? "Aan" : "Uit" }), _jsxs("span", { className: "text-muted-foreground text-xs", children: [info?.gevonden ?? c.aantalGevonden, " printers gevonden"] }), plekken.length > 0 ? (_jsxs(Select, { onValueChange: (plekId) => void koppel(plekId, c.naam), children: [_jsx(SelectTrigger, { className: "h-8 w-[170px]", children: _jsx(SelectValue, { placeholder: "Plek kiezen" }) }), _jsx(SelectContent, { children: plekken.map((p) => (_jsx(SelectItem, { value: p.id, children: p.naam }, p.id))) })] })) : (_jsx(Button, { variant: "ghost", size: "sm", onClick: () => setWizardOpen(true), children: "Printplek maken" }))] }, c.id));
|
|
105
|
-
}) })] })) : null, !computersLaden && computers.length === 0 && plekken.length === 0 ? (_jsx(Card, { children: _jsxs(CardContent, { className: "space-y-3 py-6 text-sm", children: [_jsx("p", { className: "font-medium", children: "Nog geen computer aangemeld" }), _jsx("p", { className: "text-muted-foreground", children: "Installeer het printprogramma op de computer waar de printers aan hangen. Zodra die zich meldt, verschijnt hij hier." }), _jsxs(Button, { onClick: () => setComputerToevoegen(true), children: [_jsx(Plus, { className: "mr-2 h-4 w-4" }), " Computer aanmelden"] })] }) })) : null, _jsx(PrintplekWizard, { open: wizardOpen, onOpenChange: setWizardOpen, onKlaar: () => vernieuwAlles() }), _jsx(ComputersLijst, { computers: computers, loading: false, fout: null, onVernieuw: () => {
|
|
107
|
+
}) })] })) : null, !computersLaden && computers.length === 0 && plekken.length === 0 ? (_jsx(Card, { children: _jsxs(CardContent, { className: "space-y-3 py-6 text-sm", children: [_jsx("p", { className: "font-medium", children: "Nog geen computer aangemeld" }), _jsx("p", { className: "text-muted-foreground", children: "Installeer het printprogramma op de computer waar de printers aan hangen. Zodra die zich meldt, verschijnt hij hier." }), _jsxs(Button, { onClick: () => setComputerToevoegen(true), children: [_jsx(Plus, { className: "mr-2 h-4 w-4" }), " Computer aanmelden"] })] }) })) : null, _jsx(PrintplekWizard, { open: wizardOpen, onOpenChange: setWizardOpen, onKlaar: () => vernieuwAlles() }), _jsx(TestprintDialog, { open: testprint !== null, onOpenChange: (v) => !v && setTestprint(null), printplekId: testprint?.id ?? null, printplekNaam: testprint?.naam ?? null }), _jsx(ComputersLijst, { computers: computers, loading: false, fout: null, onVernieuw: () => {
|
|
106
108
|
void herlaadComputers();
|
|
107
109
|
void zoek();
|
|
108
110
|
}, onPrintersToevoegen: (naam) => {
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare function TestprintDialog({ open, onOpenChange, printplekId, printplekNaam, werkplek, }: {
|
|
2
|
+
open: boolean;
|
|
3
|
+
onOpenChange: (v: boolean) => void;
|
|
4
|
+
printplekId?: string | null;
|
|
5
|
+
printplekNaam?: string | null;
|
|
6
|
+
werkplek?: string | null;
|
|
7
|
+
}): import("react").JSX.Element;
|
|
8
|
+
//# sourceMappingURL=TestprintDialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TestprintDialog.d.ts","sourceRoot":"","sources":["../../src/components/TestprintDialog.tsx"],"names":[],"mappings":"AAqCA,wBAAgB,eAAe,CAAC,EAC9B,IAAI,EACJ,YAAY,EACZ,WAAW,EACX,aAAa,EACb,QAAQ,GACT,EAAE;IACD,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,+BAoKA"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
// ============================================================================
|
|
3
|
+
// src/components/TestprintDialog.tsx — controleren of elke documentsoort op de
|
|
4
|
+
// juiste printer uitkomt vanaf een printplek of werkplek.
|
|
5
|
+
// ============================================================================
|
|
6
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
7
|
+
import { Badge, Button, Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, } from "@flowselections/core";
|
|
8
|
+
import { AlertTriangle, Check, Loader2, Printer, X } from "lucide-react";
|
|
9
|
+
import { volgJobStatus } from "../lib/printApi.js";
|
|
10
|
+
import { bepaalTestOverzicht, verstuurTestprint, } from "../lib/testprint.js";
|
|
11
|
+
const STATUS_LABEL = {
|
|
12
|
+
wachtend: "In de wachtrij",
|
|
13
|
+
bezig: "Wordt afgedrukt",
|
|
14
|
+
voltooid: "Afgedrukt",
|
|
15
|
+
mislukt: "Mislukt",
|
|
16
|
+
geannuleerd: "Geannuleerd",
|
|
17
|
+
};
|
|
18
|
+
export function TestprintDialog({ open, onOpenChange, printplekId, printplekNaam, werkplek, }) {
|
|
19
|
+
const [regels, setRegels] = useState([]);
|
|
20
|
+
const [laden, setLaden] = useState(false);
|
|
21
|
+
const [alles, setAlles] = useState(false);
|
|
22
|
+
const [statussen, setStatussen] = useState({});
|
|
23
|
+
const stoppers = useRef([]);
|
|
24
|
+
const laad = useCallback(async () => {
|
|
25
|
+
setLaden(true);
|
|
26
|
+
try {
|
|
27
|
+
const lijst = await bepaalTestOverzicht({
|
|
28
|
+
printplekId: printplekId ?? null,
|
|
29
|
+
werkplek: werkplek ?? null,
|
|
30
|
+
});
|
|
31
|
+
setRegels(lijst);
|
|
32
|
+
}
|
|
33
|
+
finally {
|
|
34
|
+
setLaden(false);
|
|
35
|
+
}
|
|
36
|
+
}, [printplekId, werkplek]);
|
|
37
|
+
useEffect(() => {
|
|
38
|
+
if (open)
|
|
39
|
+
void laad();
|
|
40
|
+
}, [open, laad]);
|
|
41
|
+
useEffect(() => () => {
|
|
42
|
+
for (const stop of stoppers.current)
|
|
43
|
+
stop();
|
|
44
|
+
stoppers.current = [];
|
|
45
|
+
}, []);
|
|
46
|
+
const test = useCallback(async (documenttype) => {
|
|
47
|
+
setStatussen((s) => ({ ...s, [documenttype]: { bezig: true } }));
|
|
48
|
+
try {
|
|
49
|
+
const { jobId } = await verstuurTestprint(documenttype, {
|
|
50
|
+
printplekId: printplekId ?? null,
|
|
51
|
+
werkplek: werkplek ?? null,
|
|
52
|
+
});
|
|
53
|
+
setStatussen((s) => ({ ...s, [documenttype]: { status: "wachtend" } }));
|
|
54
|
+
const stop = volgJobStatus(jobId, (j) => {
|
|
55
|
+
setStatussen((s) => ({
|
|
56
|
+
...s,
|
|
57
|
+
[documenttype]: { status: j.status, fout: j.foutmelding },
|
|
58
|
+
}));
|
|
59
|
+
});
|
|
60
|
+
stoppers.current.push(stop);
|
|
61
|
+
}
|
|
62
|
+
catch (e) {
|
|
63
|
+
setStatussen((s) => ({
|
|
64
|
+
...s,
|
|
65
|
+
[documenttype]: {
|
|
66
|
+
status: "mislukt",
|
|
67
|
+
fout: e instanceof Error ? e.message : "Versturen is niet gelukt.",
|
|
68
|
+
},
|
|
69
|
+
}));
|
|
70
|
+
}
|
|
71
|
+
}, [printplekId, werkplek]);
|
|
72
|
+
const testAlles = async () => {
|
|
73
|
+
setAlles(true);
|
|
74
|
+
try {
|
|
75
|
+
for (const r of regels.filter((x) => x.printerId)) {
|
|
76
|
+
await test(r.documenttype);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
finally {
|
|
80
|
+
setAlles(false);
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
const ingesteld = regels.filter((r) => r.printerId);
|
|
84
|
+
const ontbreekt = regels.filter((r) => !r.printerId);
|
|
85
|
+
return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(DialogContent, { className: "max-h-[85vh] max-w-2xl overflow-y-auto", children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: "Testprint controleren" }), _jsxs(DialogDescription, { children: ["Elke testprint volgt precies dezelfde weg als een echt document", printplekNaam ? ` vanaf ${printplekNaam}` : werkplek ? ` vanaf ${werkplek}` : "", ". Op het vel staat welke documentsoort, plek en printer bedoeld waren."] })] }), _jsxs("div", { className: "flex items-center justify-between gap-2", children: [_jsxs("p", { className: "text-muted-foreground text-sm", children: [ingesteld.length, " documentsoort", ingesteld.length === 1 ? "" : "en", " ingesteld", ontbreekt.length ? `, ${ontbreekt.length} zonder printer` : "", "."] }), _jsxs(Button, { size: "sm", disabled: laden || alles || !ingesteld.length, onClick: () => void testAlles(), children: [alles ? (_jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" })) : (_jsx(Printer, { className: "mr-2 h-4 w-4" })), "Alles testen"] })] }), laden ? (_jsxs("div", { className: "text-muted-foreground flex items-center gap-2 py-8 text-sm", children: [_jsx(Loader2, { className: "h-4 w-4 animate-spin" }), " Instellingen ophalen\u2026"] })) : (_jsx("div", { className: "space-y-2", children: [...ingesteld, ...ontbreekt].map((r) => {
|
|
86
|
+
const st = statussen[r.documenttype];
|
|
87
|
+
return (_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-2 rounded-lg border p-3", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "text-sm font-medium", children: r.label }), r.printerId ? (_jsxs("div", { className: "text-muted-foreground text-xs", children: ["Gaat naar ", _jsx("span", { className: "font-medium", children: r.printerNaam })] })) : (_jsxs("div", { className: "text-muted-foreground flex items-center gap-1 text-xs", children: [_jsx(AlertTriangle, { className: "h-3 w-3" }), " ", r.reden] })), st?.fout ? (_jsx("div", { className: "text-destructive mt-1 text-xs", children: st.fout })) : null] }), _jsxs("div", { className: "flex items-center gap-2", children: [st?.status ? (_jsxs(Badge, { variant: st.status === "voltooid"
|
|
88
|
+
? "default"
|
|
89
|
+
: st.status === "mislukt" || st.status === "geannuleerd"
|
|
90
|
+
? "destructive"
|
|
91
|
+
: "secondary", children: [st.status === "voltooid" ? _jsx(Check, { className: "mr-1 h-3 w-3" }) : null, st.status === "mislukt" ? _jsx(X, { className: "mr-1 h-3 w-3" }) : null, STATUS_LABEL[st.status] ?? st.status] })) : null, _jsxs(Button, { size: "sm", variant: "outline", disabled: !r.printerId || st?.bezig || alles, onClick: () => void test(r.documenttype), children: [st?.bezig ? _jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }) : null, "Test afdrukken"] })] })] }, r.documenttype));
|
|
92
|
+
}) }))] }) }));
|
|
93
|
+
}
|
package/dist-lib/index.d.ts
CHANGED
|
@@ -11,6 +11,9 @@ export { PrinterStatsKaarten } from './components/PrinterStatsKaarten.js';
|
|
|
11
11
|
export { useNetwerkPrinters } from './lib/useNetwerkPrinters.js';
|
|
12
12
|
export type { GevondenPrinter } from './lib/useNetwerkPrinters.js';
|
|
13
13
|
export { drukTestpaginaAf } from './lib/testpagina.js';
|
|
14
|
+
export { TestprintDialog } from './components/TestprintDialog.js';
|
|
15
|
+
export { bepaalTestOverzicht, verstuurTestprint } from './lib/testprint.js';
|
|
16
|
+
export type { TestprintContext, TestprintRegel, TestprintResultaat } from './lib/testprint.js';
|
|
14
17
|
export { PrintQueuePage } from './components/PrintQueuePage.js';
|
|
15
18
|
export { AiLayoutImportDialog } from './components/AiLayoutImportDialog.js';
|
|
16
19
|
export { LogosPage, LogoThumbnail } from './components/LogosPage.js';
|
package/dist-lib/index.d.ts.map
CHANGED
|
@@ -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
|
@@ -13,6 +13,8 @@ export { WerkplekkenTabel } from './components/WerkplekkenTabel.js';
|
|
|
13
13
|
export { PrinterStatsKaarten } from './components/PrinterStatsKaarten.js';
|
|
14
14
|
export { useNetwerkPrinters } from './lib/useNetwerkPrinters.js';
|
|
15
15
|
export { drukTestpaginaAf } from './lib/testpagina.js';
|
|
16
|
+
export { TestprintDialog } from './components/TestprintDialog.js';
|
|
17
|
+
export { bepaalTestOverzicht, verstuurTestprint } from './lib/testprint.js';
|
|
16
18
|
export { PrintQueuePage } from './components/PrintQueuePage.js';
|
|
17
19
|
export { AiLayoutImportDialog } from './components/AiLayoutImportDialog.js';
|
|
18
20
|
export { LogosPage, LogoThumbnail } from './components/LogosPage.js';
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export interface TestprintContext {
|
|
2
|
+
/** De printplek waarvandaan getest wordt. */
|
|
3
|
+
printplekId?: string | null;
|
|
4
|
+
/** Of de naam van de computer/werkplek. */
|
|
5
|
+
werkplek?: string | null;
|
|
6
|
+
}
|
|
7
|
+
export interface TestprintRegel {
|
|
8
|
+
documenttype: string;
|
|
9
|
+
label: string;
|
|
10
|
+
printerId: string | null;
|
|
11
|
+
printerNaam: string | null;
|
|
12
|
+
/** Uitleg wanneer er geen printer gevonden is. */
|
|
13
|
+
reden: string | null;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Bepaalt voor elke documentsoort welke printer er volgens de instellingen
|
|
17
|
+
* gekozen wordt vanaf deze printplek of werkplek.
|
|
18
|
+
*/
|
|
19
|
+
export declare function bepaalTestOverzicht(ctx: TestprintContext): Promise<TestprintRegel[]>;
|
|
20
|
+
export interface TestprintResultaat {
|
|
21
|
+
jobId: string;
|
|
22
|
+
printerId: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Verstuurt één testprint via de gewone printwachtrij, zodat exact dezelfde
|
|
26
|
+
* routering en PrintNode-afhandeling worden gebruikt als bij echte documenten.
|
|
27
|
+
*/
|
|
28
|
+
export declare function verstuurTestprint(documenttype: string, ctx: TestprintContext): Promise<TestprintResultaat>;
|
|
29
|
+
//# sourceMappingURL=testprint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testprint.d.ts","sourceRoot":"","sources":["../../src/lib/testprint.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,gBAAgB;IAC/B,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,kDAAkD;IAClD,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CA4B1F;AAiBD,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,gBAAgB,GACpB,OAAO,CAAC,kBAAkB,CAAC,CAyC7B"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// src/lib/testprint.ts — controleren of élk document op de juiste printer
|
|
3
|
+
// uitkomt. Anders dan de gewone testpagina volgt een testprint de volledige
|
|
4
|
+
// beslisketen: printplek → werkplek → layout → papierformaat → PrintNode.
|
|
5
|
+
// ============================================================================
|
|
6
|
+
import { supabase } from "./supabaseClient.js";
|
|
7
|
+
import { DOCUMENT_TYPES, documentTypeLabel } from "./documentTypes.js";
|
|
8
|
+
import { printHtml, printerVoorDocumenttype } from "./printApi.js";
|
|
9
|
+
import { printplekNaam } from "./printplekken.js";
|
|
10
|
+
const arr = (v) => (Array.isArray(v) ? v : []);
|
|
11
|
+
/**
|
|
12
|
+
* Bepaalt voor elke documentsoort welke printer er volgens de instellingen
|
|
13
|
+
* gekozen wordt vanaf deze printplek of werkplek.
|
|
14
|
+
*/
|
|
15
|
+
export async function bepaalTestOverzicht(ctx) {
|
|
16
|
+
const printplekId = ctx.printplekId ?? undefined;
|
|
17
|
+
const werkplek = ctx.werkplek ?? undefined;
|
|
18
|
+
const { data } = await supabase.from("printers").select("id, naam").order("naam");
|
|
19
|
+
const namen = new Map(arr(data).map((p) => [p.id, p.naam]));
|
|
20
|
+
const regels = await Promise.all(DOCUMENT_TYPES.map(async (d) => {
|
|
21
|
+
let printerId = null;
|
|
22
|
+
try {
|
|
23
|
+
printerId = await printerVoorDocumenttype(d.value, undefined, werkplek, printplekId);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
printerId = null;
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
documenttype: d.value,
|
|
30
|
+
label: d.label,
|
|
31
|
+
printerId,
|
|
32
|
+
printerNaam: printerId ? (namen.get(printerId) ?? "Printer") : null,
|
|
33
|
+
reden: printerId
|
|
34
|
+
? null
|
|
35
|
+
: "Nog geen printer ingesteld voor deze documentsoort op deze plek.",
|
|
36
|
+
};
|
|
37
|
+
}));
|
|
38
|
+
return regels;
|
|
39
|
+
}
|
|
40
|
+
/** De HTML van de testpagina: op papier zichtbaar waar hij vandaan komt. */
|
|
41
|
+
function testHtml(velden) {
|
|
42
|
+
const rijen = Object.entries(velden)
|
|
43
|
+
.map(([k, v]) => `<tr><td style="padding:2mm 6mm 2mm 0;color:#555">${k}</td><td style="padding:2mm 0;font-weight:600">${v}</td></tr>`)
|
|
44
|
+
.join("");
|
|
45
|
+
return `<div style="padding:15mm;font-family:Arial,Helvetica,sans-serif;font-size:12pt">
|
|
46
|
+
<h1 style="font-size:20pt;margin:0 0 6mm">Testprint</h1>
|
|
47
|
+
<p style="margin:0 0 6mm">Komt dit vel uit de bedoelde printer op de bedoelde plek? Dan zijn de instellingen goed.</p>
|
|
48
|
+
<table style="border-collapse:collapse;font-size:12pt">${rijen}</table>
|
|
49
|
+
</div>`;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Verstuurt één testprint via de gewone printwachtrij, zodat exact dezelfde
|
|
53
|
+
* routering en PrintNode-afhandeling worden gebruikt als bij echte documenten.
|
|
54
|
+
*/
|
|
55
|
+
export async function verstuurTestprint(documenttype, ctx) {
|
|
56
|
+
const printplekId = ctx.printplekId ?? undefined;
|
|
57
|
+
const werkplek = ctx.werkplek ?? undefined;
|
|
58
|
+
const plekNaam = printplekId ? await printplekNaam(printplekId) : null;
|
|
59
|
+
const printerId = await printerVoorDocumenttype(documenttype, undefined, werkplek, printplekId);
|
|
60
|
+
if (!printerId) {
|
|
61
|
+
throw new Error(plekNaam
|
|
62
|
+
? `Geen printer voor ${documentTypeLabel(documenttype)} op ${plekNaam} — stel dit in bij deze printplek.`
|
|
63
|
+
: `Geen printer voor ${documentTypeLabel(documenttype)} — stel dit in bij Printen.`);
|
|
64
|
+
}
|
|
65
|
+
const { data } = await supabase
|
|
66
|
+
.from("printers")
|
|
67
|
+
.select("naam")
|
|
68
|
+
.eq("id", printerId)
|
|
69
|
+
.maybeSingle();
|
|
70
|
+
const printerNaam = data?.naam ?? "Printer";
|
|
71
|
+
const testId = `test-${documenttype}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
72
|
+
const html = testHtml({
|
|
73
|
+
Documentsoort: documentTypeLabel(documenttype),
|
|
74
|
+
Printplek: plekNaam ?? "—",
|
|
75
|
+
Werkplek: werkplek ?? "—",
|
|
76
|
+
Printer: printerNaam,
|
|
77
|
+
Tijdstip: new Date().toLocaleString("nl-NL"),
|
|
78
|
+
});
|
|
79
|
+
const { jobId } = await printHtml({
|
|
80
|
+
documenttype,
|
|
81
|
+
documentnaam: `Testprint ${documentTypeLabel(documenttype)}`,
|
|
82
|
+
html,
|
|
83
|
+
printerId,
|
|
84
|
+
...(printplekId ? { printplekId } : {}),
|
|
85
|
+
...(werkplek ? { werkplek } : {}),
|
|
86
|
+
payload: { test_id: testId, is_testprint: true },
|
|
87
|
+
});
|
|
88
|
+
return { jobId, printerId };
|
|
89
|
+
}
|