@flowselections/layout-maker 1.58.1 → 1.59.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.
- package/dist-lib/components/ComputersLijst.d.ts +1 -0
- package/dist-lib/components/ComputersLijst.d.ts.map +1 -1
- package/dist-lib/components/ComputersLijst.js +9 -5
- package/dist-lib/components/PrintQueuePage.d.ts.map +1 -1
- package/dist-lib/components/PrintQueuePage.js +8 -5
- 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 +10 -2
- package/dist-lib/components/TestprintDialog.d.ts.map +1 -1
- package/dist-lib/components/TestprintDialog.js +5 -1
- package/dist-lib/components/WerkplekkenTab.d.ts.map +1 -1
- package/dist-lib/components/WerkplekkenTab.js +4 -3
- package/dist-lib/integrations/supabase/types.d.ts +456 -0
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/orderData.server.d.ts.map +1 -1
- package/dist-lib/lib/orderData.server.js +26 -3
- package/dist-lib/lib/pakbonHtml.d.ts.map +1 -1
- package/dist-lib/lib/pakbonHtml.js +6 -1
- package/dist-lib/lib/printQueue.server.d.ts +6 -0
- package/dist-lib/lib/printQueue.server.d.ts.map +1 -1
- package/dist-lib/lib/printQueue.server.js +25 -2
- package/dist-lib/lib/printRoutering.d.ts +3 -1
- package/dist-lib/lib/printRoutering.d.ts.map +1 -1
- package/dist-lib/lib/printService.functions.d.ts.map +1 -1
- package/dist-lib/lib/printService.functions.js +3 -1
- package/dist-lib/lib/printnodeStatus.d.ts.map +1 -1
- package/dist-lib/lib/printnodeStatus.js +4 -0
- package/dist-lib/lib/printnodeWebhook.d.ts +2 -0
- package/dist-lib/lib/printnodeWebhook.d.ts.map +1 -1
- package/dist-lib/lib/printnodeWebhook.js +31 -1
- package/dist-lib/lib/printnodeWebhookBeheer.server.d.ts +2 -0
- package/dist-lib/lib/printnodeWebhookBeheer.server.d.ts.map +1 -1
- package/dist-lib/lib/printnodeWebhookBeheer.server.js +12 -2
- package/dist-lib/lib/productiebonHtml.d.ts.map +1 -1
- package/dist-lib/lib/productiebonHtml.js +7 -1
- package/dist-lib/lib/testprint.d.ts +5 -1
- package/dist-lib/lib/testprint.d.ts.map +1 -1
- package/dist-lib/lib/testprint.js +55 -11
- package/dist-lib/lib/waaromPrinter.d.ts +2 -0
- package/dist-lib/lib/waaromPrinter.d.ts.map +1 -1
- package/dist-lib/lib/waaromPrinter.js +13 -0
- package/package.json +4 -4
|
@@ -9,6 +9,7 @@ export declare function useComputers(): {
|
|
|
9
9
|
computers: ComputerModel[];
|
|
10
10
|
loading: boolean;
|
|
11
11
|
fout: string | null;
|
|
12
|
+
gecontroleerd: Date | null;
|
|
12
13
|
reload: (stil?: boolean) => Promise<void>;
|
|
13
14
|
};
|
|
14
15
|
export declare function ComputersLijst({ computers, loading, fout, onVernieuw, onPrintersToevoegen, toevoegenOpen, onToevoegenOpenChange, alleenDialog, }: {
|
|
@@ -1 +1 @@
|
|
|
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
|
|
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;;;;;;EAuD3B;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"}
|
|
@@ -13,6 +13,7 @@ export function useComputers() {
|
|
|
13
13
|
const [computers, setComputers] = useState([]);
|
|
14
14
|
const [loading, setLoading] = useState(true);
|
|
15
15
|
const [fout, setFout] = useState(null);
|
|
16
|
+
const [gecontroleerd, setGecontroleerd] = useState(null);
|
|
16
17
|
const load = useCallback(async (stil = false) => {
|
|
17
18
|
if (!stil)
|
|
18
19
|
setLoading(true);
|
|
@@ -26,8 +27,13 @@ export function useComputers() {
|
|
|
26
27
|
const printers = p.ok && Array.isArray(p.printers) ? p.printers : [];
|
|
27
28
|
const genegeerd = new Set((Array.isArray(g) ? g : []).map((x) => x.computer_naam));
|
|
28
29
|
const lijst = (c.ok && Array.isArray(c.computers) ? c.computers : []).filter((comp) => !genegeerd.has(comp.naam));
|
|
29
|
-
if (!c.ok)
|
|
30
|
-
|
|
30
|
+
if (!c.ok) {
|
|
31
|
+
// PrintNode niet bereikbaar: vorige status laten staan en de reden tonen,
|
|
32
|
+
// in plaats van alle computers als "niet aangemeld" te tonen.
|
|
33
|
+
setFout(c.fout ?? "PrintNode gaf geen computerlijst terug.");
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
setGecontroleerd(new Date());
|
|
31
37
|
setComputers(lijst.map((comp) => ({
|
|
32
38
|
id: String(comp.id),
|
|
33
39
|
naam: comp.naam,
|
|
@@ -40,8 +46,6 @@ export function useComputers() {
|
|
|
40
46
|
setFout(/401|unauthorized|authorization/i.test(melding)
|
|
41
47
|
? "Je sessie is verlopen. Log opnieuw in en probeer het nog eens."
|
|
42
48
|
: "Er kon geen verbinding worden gemaakt met de printdienst.");
|
|
43
|
-
if (!stil)
|
|
44
|
-
setComputers([]);
|
|
45
49
|
}
|
|
46
50
|
finally {
|
|
47
51
|
setLoading(false);
|
|
@@ -50,7 +54,7 @@ export function useComputers() {
|
|
|
50
54
|
useEffect(() => {
|
|
51
55
|
void load();
|
|
52
56
|
}, [load]);
|
|
53
|
-
return { computers, loading, fout, reload: load };
|
|
57
|
+
return { computers, loading, fout, gecontroleerd, reload: load };
|
|
54
58
|
}
|
|
55
59
|
export function ComputersLijst({ computers, loading, fout, onVernieuw, onPrintersToevoegen, toevoegenOpen, onToevoegenOpenChange, alleenDialog = false, }) {
|
|
56
60
|
const [wachtOp, setWachtOp] = useState([]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PrintQueuePage.d.ts","sourceRoot":"","sources":["../../src/components/PrintQueuePage.tsx"],"names":[],"mappings":"AAoFA,wBAAgB,cAAc,
|
|
1
|
+
{"version":3,"file":"PrintQueuePage.d.ts","sourceRoot":"","sources":["../../src/components/PrintQueuePage.tsx"],"names":[],"mappings":"AAoFA,wBAAgB,cAAc,gCA4Z7B"}
|
|
@@ -78,15 +78,18 @@ export function PrintQueuePage() {
|
|
|
78
78
|
return true;
|
|
79
79
|
});
|
|
80
80
|
// Echte tellingen over alle opdrachten (de lijst toont alleen de laatste 200).
|
|
81
|
-
const [tellingen, setTellingen] = useState(
|
|
81
|
+
const [tellingen, setTellingen] = useState(null);
|
|
82
|
+
const [tellingFout, setTellingFout] = useState(null);
|
|
82
83
|
const herlaadTellingen = async () => {
|
|
83
84
|
try {
|
|
84
85
|
const t = await printTellingen();
|
|
85
|
-
if (t && typeof t === "object")
|
|
86
|
+
if (t && typeof t === "object") {
|
|
86
87
|
setTellingen(t);
|
|
88
|
+
setTellingFout(null);
|
|
89
|
+
}
|
|
87
90
|
}
|
|
88
|
-
catch {
|
|
89
|
-
|
|
91
|
+
catch (e) {
|
|
92
|
+
setTellingFout(e instanceof Error ? e.message : "Tellen is niet gelukt");
|
|
90
93
|
}
|
|
91
94
|
};
|
|
92
95
|
const printerById = useMemo(() => new Map(printers.map((p) => [p.id, p])), [printers]);
|
|
@@ -182,7 +185,7 @@ export function PrintQueuePage() {
|
|
|
182
185
|
setAnnuleertAlles(false);
|
|
183
186
|
await reload(true);
|
|
184
187
|
}
|
|
185
|
-
}, children: [_jsx(XCircle, { className: "mr-2 h-4 w-4" }), annuleertAlles ? "Bezig…" : `Alles annuleren (${openJobs.length})`] })] })] }), _jsx(PrintStatusBanner, { fout: tickFout }), _jsx("div", { className: "grid gap-4 md:grid-cols-4", children: ["wachtend", "bezig", "voltooid", "mislukt"].map((s) => (_jsx(Card, { children: _jsxs(CardHeader, { className: "pb-2", children: [_jsx(CardDescription, { className: "capitalize", children: s }), _jsx(CardTitle, { className: "text-2xl", children: tellingen[s] ?? 0 })] }) }, s))) }), _jsxs(Card, { children: [_jsxs(CardHeader, { className: "pb-3", children: [_jsx(CardTitle, { className: "text-base", children: "Opdrachten" }), _jsx(CardDescription, { children: loading ? "Laden…" : `${gefilterd.length} opdrachten` })] }), _jsxs(CardContent, { className: "space-y-4", children: [_jsxs("div", { className: "grid gap-3 md:grid-cols-4", 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 document of gebruiker", value: zoek, onChange: (e) => setZoek(e.target.value) })] }), _jsxs(Select, { value: status, onValueChange: setStatus, children: [_jsx(SelectTrigger, { children: _jsx(SelectValue, {}) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "alle", children: "Alle statussen" }), ["wachtend", "bezig", "voltooid", "mislukt", "geannuleerd"].map((s) => (_jsx(SelectItem, { value: s, children: s }, s)))] })] }), _jsxs(Select, { value: plekFilter, onValueChange: setPlekFilter, children: [_jsx(SelectTrigger, { children: _jsx(SelectValue, {}) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "alle", children: "Alle printplekken" }), plekOpties.map((p) => (_jsx(SelectItem, { value: p, children: p }, p))), _jsx(SelectItem, { value: "\u2014", children: "Zonder printplek" })] })] })] }), _jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: "Document" }), _jsx(TableHead, { children: "Printplek" }), _jsx(TableHead, { children: "Layout (aangeleverd \u2192 gebruikt)" }), _jsx(TableHead, { children: "Printer" }), _jsx(TableHead, { children: "Status" }), _jsx(TableHead, { children: "Tijdstip" }), _jsx(TableHead, { className: "text-right", children: "Acties" })] }) }), _jsxs(TableBody, { children: [gefilterd.length === 0 && (_jsx(TableRow, { children: _jsx(TableCell, { colSpan: 7, className: "py-10 text-center text-sm text-muted-foreground", children: "Geen printopdrachten." }) })), gefilterd.map((j) => (_jsxs(TableRow, { children: [_jsxs(TableCell, { children: [_jsx("span", { className: "font-medium", children: j.documentnaam ?? documentTypeLabel(j.documenttype) }), j.is_herprint && (_jsx(Badge, { variant: "outline", className: "ml-2", children: "herprint" })), !heeftOrderKenmerk(j) && (_jsx(Badge, { variant: "outline", className: "ml-2 text-amber-600", children: "geen orderkenmerk" })), j.foutmelding && (_jsx("span", { className: "block text-xs text-destructive", children: j.foutmelding }))] }), _jsx(TableCell, { className: "text-sm text-muted-foreground", children: plekPerJob.get(j.id) || "—" }), _jsxs(TableCell, { className: "text-sm text-muted-foreground", children: [_jsx("span", { title: "Aangeleverd door de module", children: j.layout_id ? layoutNaam.get(j.layout_id) ?? "Onbekende layout" : "geen" }), _jsxs("span", { className: "block text-xs", children: ["\u2192", " ", _jsx("span", { title: "Layout die de wachtrij gebruikte", children: j.gebruikte_layout_id
|
|
188
|
+
}, children: [_jsx(XCircle, { className: "mr-2 h-4 w-4" }), annuleertAlles ? "Bezig…" : `Alles annuleren (${openJobs.length})`] })] })] }), _jsx(PrintStatusBanner, { fout: tickFout }), _jsx("div", { className: "grid gap-4 md:grid-cols-4", children: ["wachtend", "bezig", "voltooid", "mislukt"].map((s) => (_jsx(Card, { children: _jsxs(CardHeader, { className: "pb-2", children: [_jsx(CardDescription, { className: "capitalize", children: s }), _jsx(CardTitle, { className: "text-2xl", title: tellingFout ?? undefined, children: tellingFout && !tellingen ? "—" : tellingen ? (tellingen[s] ?? 0) : "laden…" }), tellingFout ? _jsx("p", { className: "text-destructive text-xs", children: tellingFout }) : null] }) }, s))) }), _jsxs(Card, { children: [_jsxs(CardHeader, { className: "pb-3", children: [_jsx(CardTitle, { className: "text-base", children: "Opdrachten" }), _jsx(CardDescription, { children: loading ? "Laden…" : `${gefilterd.length} opdrachten` })] }), _jsxs(CardContent, { className: "space-y-4", children: [_jsxs("div", { className: "grid gap-3 md:grid-cols-4", 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 document of gebruiker", value: zoek, onChange: (e) => setZoek(e.target.value) })] }), _jsxs(Select, { value: status, onValueChange: setStatus, children: [_jsx(SelectTrigger, { children: _jsx(SelectValue, {}) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "alle", children: "Alle statussen" }), ["wachtend", "bezig", "voltooid", "mislukt", "geannuleerd"].map((s) => (_jsx(SelectItem, { value: s, children: s }, s)))] })] }), _jsxs(Select, { value: plekFilter, onValueChange: setPlekFilter, children: [_jsx(SelectTrigger, { children: _jsx(SelectValue, {}) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "alle", children: "Alle printplekken" }), plekOpties.map((p) => (_jsx(SelectItem, { value: p, children: p }, p))), _jsx(SelectItem, { value: "\u2014", children: "Zonder printplek" })] })] })] }), _jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: "Document" }), _jsx(TableHead, { children: "Printplek" }), _jsx(TableHead, { children: "Layout (aangeleverd \u2192 gebruikt)" }), _jsx(TableHead, { children: "Printer" }), _jsx(TableHead, { children: "Status" }), _jsx(TableHead, { children: "Tijdstip" }), _jsx(TableHead, { className: "text-right", children: "Acties" })] }) }), _jsxs(TableBody, { children: [gefilterd.length === 0 && (_jsx(TableRow, { children: _jsx(TableCell, { colSpan: 7, className: "py-10 text-center text-sm text-muted-foreground", children: "Geen printopdrachten." }) })), gefilterd.map((j) => (_jsxs(TableRow, { children: [_jsxs(TableCell, { children: [_jsx("span", { className: "font-medium", children: j.documentnaam ?? documentTypeLabel(j.documenttype) }), j.is_herprint && (_jsx(Badge, { variant: "outline", className: "ml-2", children: "herprint" })), !heeftOrderKenmerk(j) && (_jsx(Badge, { variant: "outline", className: "ml-2 text-amber-600", children: "geen orderkenmerk" })), j.foutmelding && (_jsx("span", { className: "block text-xs text-destructive", children: j.foutmelding }))] }), _jsx(TableCell, { className: "text-sm text-muted-foreground", children: plekPerJob.get(j.id) || "—" }), _jsxs(TableCell, { className: "text-sm text-muted-foreground", children: [_jsx("span", { title: "Aangeleverd door de module", children: j.layout_id ? layoutNaam.get(j.layout_id) ?? "Onbekende layout" : "geen" }), _jsxs("span", { className: "block text-xs", children: ["\u2192", " ", _jsx("span", { title: "Layout die de wachtrij gebruikte", children: j.gebruikte_layout_id
|
|
186
189
|
? layoutNaam.get(j.gebruikte_layout_id) ?? "Onbekende layout"
|
|
187
190
|
: j.gebruikte_bron
|
|
188
191
|
? "geen layout"
|
|
@@ -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":"AAkEA,wBAAgB,mBAAmB,gCA0oBlC"}
|
|
@@ -15,12 +15,13 @@ import { ComputerVerwijderenDialog } from "./ComputerVerwijderenDialog.js";
|
|
|
15
15
|
import { usePrinters } from "../lib/useDocumentData.js";
|
|
16
16
|
import { useNetwerkPrinters } from "../lib/useNetwerkPrinters.js";
|
|
17
17
|
import { useComputers } from "./ComputersLijst.js";
|
|
18
|
-
import { DOCUMENT_TYPES, documentTypeLabel } from "../lib/documentTypes.js";
|
|
18
|
+
import { DOCUMENT_TYPES, documentTypeLabel, isEtiketSoort } from "../lib/documentTypes.js";
|
|
19
19
|
import { drukTestpaginaAf } from "../lib/testpagina.js";
|
|
20
20
|
import { TestprintDialog } from "./TestprintDialog.js";
|
|
21
21
|
import { leesbareFout } from "../lib/foutTekst.js";
|
|
22
22
|
import { supabase } from "../lib/supabaseClient.js";
|
|
23
23
|
import { useRouteringOverzicht } from "../lib/printRoutering.js";
|
|
24
|
+
import { routeringMeldingTekst } from "../lib/waaromPrinter.js";
|
|
24
25
|
const BRON_LABEL = {
|
|
25
26
|
werkplek_formaat: "Werkplek (papierformaat)",
|
|
26
27
|
werkplek_afwijking: "Werkplek (afwijking)",
|
|
@@ -114,6 +115,7 @@ export function PrintplekDetailPage() {
|
|
|
114
115
|
const { uitkomsten, laden: routeringLaden, reload: reloadRoutering } = useRouteringOverzicht(plekId, DOCUMENT_TYPES.map((d) => d.value), pcNamen);
|
|
115
116
|
const uitkomstVoor = (t, pc) => uitkomsten[`${t}::${pc ?? ""}`] ?? null;
|
|
116
117
|
const routeringZichtbaar = DOCUMENT_TYPES.filter((d) => alleDocumenten ||
|
|
118
|
+
isEtiketSoort(d.value) ||
|
|
117
119
|
(pcNamen.length ? pcNamen : [null]).some((pc) => {
|
|
118
120
|
const u = uitkomstVoor(d.value, pc);
|
|
119
121
|
return !!u && (u.bron !== "geen" || u.overgeslagen.length > 0);
|
|
@@ -156,7 +158,7 @@ export function PrintplekDetailPage() {
|
|
|
156
158
|
return _jsx("td", { colSpan: 3 });
|
|
157
159
|
const n = printerNaam(u.printer_id);
|
|
158
160
|
const status = !u.printer_id ? "geen" : n ? (printerOnline(u.printer_id) ? "online" : "offline") : "ontbreekt";
|
|
159
|
-
return (_jsxs(_Fragment, { children: [_jsx("td", { className: "py-2 pr-3 text-xs text-muted-foreground", children: u.papierformaat ?? "—" }), _jsxs("td", { className: "py-2 pr-3", children: [_jsxs(Badge, { variant: u.bron === "geen" ? "destructive" : "secondary", "data-bron": u.bron, children: [BRON_LABEL[u.bron], u.bron === "werkplek" && u.werkplek ? ` (${u.werkplek})` : ""] }), u.overgeslagen.map((o) => (_jsxs("div", { className: "text-destructive mt-1 flex items-center gap-1 text-xs", children: [_jsx(AlertTriangle, { className: "h-3.5 w-3.5" }), " ", BRON_LABEL[o.bron], " overgeslagen: printer", " ", o.reden === "ontbreekt" ? "ontbreekt" : o.reden === "inactief" ? "inactief" : "niet (meer) aan deze plek gekoppeld"] }, o.regel_id)))] }), _jsxs("td", { className: "py-2 pr-3", children: [u.printer_id ? (_jsxs("span", { className: "flex items-center gap-1", children: [_jsx("span", { className: `h-2 w-2 rounded-full ${status === "online" ? "bg-emerald-500" : status === "offline" ? "bg-muted-foreground" : "bg-destructive"}` }), n ?? "Onbekende printer", _jsx("span", { className: "text-muted-foreground text-xs", children: status })] })) : (_jsx("span", { className: "text-destructive text-xs", children: "geen printer \u2014 opdrachten blijven wachten" })), _jsx("div", { children: _jsx(BronLink, { u: u }) })] })] }));
|
|
161
|
+
return (_jsxs(_Fragment, { children: [_jsx("td", { className: "py-2 pr-3 text-xs text-muted-foreground", children: u.papierformaat ?? "—" }), _jsxs("td", { className: "py-2 pr-3", children: [_jsxs(Badge, { variant: u.bron === "geen" ? "destructive" : "secondary", "data-bron": u.bron, children: [BRON_LABEL[u.bron], u.bron === "werkplek" && u.werkplek ? ` (${u.werkplek})` : ""] }), u.overgeslagen.map((o) => (_jsxs("div", { className: "text-destructive mt-1 flex items-center gap-1 text-xs", children: [_jsx(AlertTriangle, { className: "h-3.5 w-3.5" }), " ", BRON_LABEL[o.bron], " overgeslagen: printer", " ", o.reden === "ontbreekt" ? "ontbreekt" : o.reden === "inactief" ? "inactief" : o.reden === "geen_labelprinter" ? "is geen labelprinter (etiketsoort)" : "niet (meer) aan deze plek gekoppeld"] }, o.regel_id))), routeringMeldingTekst(u.melding) ? (_jsxs("div", { className: "text-destructive mt-1 flex items-center gap-1 text-xs", children: [_jsx(AlertTriangle, { className: "h-3.5 w-3.5" }), " ", routeringMeldingTekst(u.melding)] })) : null] }), _jsxs("td", { className: "py-2 pr-3", children: [u.printer_id ? (_jsxs("span", { className: "flex items-center gap-1", children: [_jsx("span", { className: `h-2 w-2 rounded-full ${status === "online" ? "bg-emerald-500" : status === "offline" ? "bg-muted-foreground" : "bg-destructive"}` }), n ?? "Onbekende printer", _jsx("span", { className: "text-muted-foreground text-xs", children: status })] })) : (_jsx("span", { className: "text-destructive text-xs", children: "geen printer \u2014 opdrachten blijven wachten" })), _jsx("div", { children: _jsx(BronLink, { u: u }) })] })] }));
|
|
160
162
|
}
|
|
161
163
|
const bronnen = koppelingen.filter((k) => k.print_plek_id === plekId);
|
|
162
164
|
const bestaandePlekIds = new Set(plekken.map((p) => p.id));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PrintplekkenPage.d.ts","sourceRoot":"","sources":["../../src/components/PrintplekkenPage.tsx"],"names":[],"mappings":"AAsDA,wBAAgB,gBAAgB,CAAC,EAAE,OAAe,EAAE,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,+
|
|
1
|
+
{"version":3,"file":"PrintplekkenPage.d.ts","sourceRoot":"","sources":["../../src/components/PrintplekkenPage.tsx"],"names":[],"mappings":"AAsDA,wBAAgB,gBAAgB,CAAC,EAAE,OAAe,EAAE,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,+BA+e/E"}
|
|
@@ -22,7 +22,7 @@ import { bijgewerktTekst, useAutoRefresh } from "../lib/useAutoRefresh.js";
|
|
|
22
22
|
import { documentTypeLabel } from "../lib/documentTypes.js";
|
|
23
23
|
export function PrintplekkenPage({ ingebed = false } = {}) {
|
|
24
24
|
const { plekken, computers: plekComputers, regels, koppelingen, fout, reload } = usePrintplekken();
|
|
25
|
-
const { computers, loading: computersLaden, fout: computersFout, reload: herlaadComputers, } = useComputers();
|
|
25
|
+
const { computers, loading: computersLaden, fout: computersFout, gecontroleerd: computersGecontroleerd, reload: herlaadComputers, } = useComputers();
|
|
26
26
|
const { printers, reload: herlaadPrinters } = usePrinters();
|
|
27
27
|
const { gevonden, zoek } = useNetwerkPrinters();
|
|
28
28
|
const { genegeerd, reload: herlaadGenegeerd } = useGenegeerdeComputers();
|
|
@@ -101,7 +101,15 @@ export function PrintplekkenPage({ ingebed = false } = {}) {
|
|
|
101
101
|
const Wrapper = ingebed ? "div" : "main";
|
|
102
102
|
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
|
|
103
103
|
? 'Maak er één aan per plek waar geprint wordt, bijvoorbeeld "Pickstation 1".'
|
|
104
|
-
: "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("button", { type: "button", className: "text-destructive flex items-center text-xs", onClick: () => setTeVerwijderen({ id: k.plek.id, naam: k.plek.naam }), children: [_jsx(Trash2, { className: "mr-1 h-3.5 w-3.5" }), " Verwijderen"] }), _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
|
|
104
|
+
: "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("button", { type: "button", className: "text-destructive flex items-center text-xs", onClick: () => setTeVerwijderen({ id: k.plek.id, naam: k.plek.naam }), children: [_jsx(Trash2, { className: "mr-1 h-3.5 w-3.5" }), " Verwijderen"] }), _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
|
|
105
|
+
? c.online
|
|
106
|
+
? "Aan"
|
|
107
|
+
: "Uit"
|
|
108
|
+
: computersFout || !computersGecontroleerd
|
|
109
|
+
? computersLaden && !computersFout
|
|
110
|
+
? "Status laden…"
|
|
111
|
+
: "Status onbekend"
|
|
112
|
+
: "Niet aangemeld" }), !c.aangemeld && computersFout ? (_jsx("span", { className: "text-destructive text-xs", children: computersFout })) : null, computersGecontroleerd ? (_jsxs("span", { className: "text-muted-foreground text-xs", children: ["PrintNode gecontroleerd om", " ", computersGecontroleerd.toLocaleTimeString("nl-NL", { hour: "2-digit", minute: "2-digit", second: "2-digit" })] })) : null, _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
|
|
105
113
|
? "Nog geen document aan een printer gekoppeld"
|
|
106
114
|
: k.documentRegels
|
|
107
115
|
.map((r) => `${documentTypeLabel(r.documenttype)} → ${printerNaam.get(r.printer_id ?? "") ?? "onbekende printer"}`)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestprintDialog.d.ts","sourceRoot":"","sources":["../../src/components/TestprintDialog.tsx"],"names":[],"mappings":"AAsCA,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,+
|
|
1
|
+
{"version":3,"file":"TestprintDialog.d.ts","sourceRoot":"","sources":["../../src/components/TestprintDialog.tsx"],"names":[],"mappings":"AAsCA,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,+BAwKA"}
|
|
@@ -89,6 +89,10 @@ export function TestprintDialog({ open, onOpenChange, printplekId, printplekNaam
|
|
|
89
89
|
? "default"
|
|
90
90
|
: st.status === "mislukt" || st.status === "geannuleerd"
|
|
91
91
|
? "destructive"
|
|
92
|
-
: "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,
|
|
92
|
+
: "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, st.status === "mislukt" && st.fout?.startsWith("FORMAAT_PAST_NIET")
|
|
93
|
+
? "Geweigerd – past niet"
|
|
94
|
+
: st.status === "mislukt" && st.fout?.startsWith("GEEN_GELADEN_ETIKET")
|
|
95
|
+
? "Geweigerd – geen etiket geladen"
|
|
96
|
+
: 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));
|
|
93
97
|
}) }))] }) }));
|
|
94
98
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WerkplekkenTab.d.ts","sourceRoot":"","sources":["../../src/components/WerkplekkenTab.tsx"],"names":[],"mappings":"AAcA,OAAO,EAUL,KAAK,UAAU,EAEhB,MAAM,oBAAoB,CAAC;AAM5B,wBAAgB,kBAAkB,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE;IAAE,OAAO,EAAE,UAAU,CAAC;IAAC,WAAW,EAAE,MAAM,IAAI,CAAA;CAAE,+
|
|
1
|
+
{"version":3,"file":"WerkplekkenTab.d.ts","sourceRoot":"","sources":["../../src/components/WerkplekkenTab.tsx"],"names":[],"mappings":"AAcA,OAAO,EAUL,KAAK,UAAU,EAEhB,MAAM,oBAAoB,CAAC;AAM5B,wBAAgB,kBAAkB,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE;IAAE,OAAO,EAAE,UAAU,CAAC;IAAC,WAAW,EAAE,MAAM,IAAI,CAAA;CAAE,+BAyC5G;AAqPD,wBAAgB,cAAc,gCA4E7B"}
|
|
@@ -18,9 +18,10 @@ const selectKlasse = "border-input bg-background rounded-md border px-2 py-1 tex
|
|
|
18
18
|
const db = supabase;
|
|
19
19
|
export function GeladenEtiketKeuze({ printer, onGewijzigd }) {
|
|
20
20
|
const opties = useMemo(() => etiketOpties(printer.ondersteunde_formaten), [printer.ondersteunde_formaten]);
|
|
21
|
-
|
|
21
|
+
// Namen uit PrintNode kunnen spaties aan begin of eind hebben: vergelijk getrimd.
|
|
22
|
+
const huidig = (printer.geladen_etiket?.naam ?? "").trim();
|
|
22
23
|
return (_jsxs("div", { className: "flex flex-wrap items-center gap-2 text-sm", id: `etiket-${printer.id}`, children: [_jsx("span", { className: "text-muted-foreground", children: "Geladen etiket:" }), _jsxs("select", { className: selectKlasse, value: huidig, onChange: async (e) => {
|
|
23
|
-
const keuze = opties.find((o) => o.naam === e.target.value) ?? null;
|
|
24
|
+
const keuze = opties.find((o) => o.naam.trim() === e.target.value) ?? null;
|
|
24
25
|
try {
|
|
25
26
|
await zetPrinterVelden(printer.id, { geladen_etiket: keuze });
|
|
26
27
|
toast.success("Geladen etiket opgeslagen");
|
|
@@ -29,7 +30,7 @@ export function GeladenEtiketKeuze({ printer, onGewijzigd }) {
|
|
|
29
30
|
catch (err) {
|
|
30
31
|
toast.error(leesbareFout(err, "Opslaan mislukt"));
|
|
31
32
|
}
|
|
32
|
-
}, children: [_jsx("option", { value: "", children: "\u2014 kies het etiket dat in de printer zit \u2014" }), opties.map((o) => (_jsxs("option", { value: o.naam, children: [o.naam.trim(), " (", maatTekst(o.breedte_mm, o.hoogte_mm), ")"] }, o.naam)))] }), !huidig ? (_jsxs("span", { className: "text-destructive flex items-center gap-1 text-xs", children: [_jsx(AlertTriangle, { className: "h-3 w-3" }), " Niet ingesteld: er wordt niets naar deze labelprinter geprint."] })) : null, !opties.length ? _jsx("span", { className: "text-muted-foreground text-xs", children: "PrintNode meldt nog geen formaten voor deze printer." }) : null] }));
|
|
33
|
+
}, children: [_jsx("option", { value: "", children: "\u2014 kies het etiket dat in de printer zit \u2014" }), huidig && !opties.some((o) => o.naam.trim() === huidig) && printer.geladen_etiket ? (_jsxs("option", { value: huidig, children: [huidig, " (", maatTekst(printer.geladen_etiket.breedte_mm, printer.geladen_etiket.hoogte_mm), ")"] })) : null, opties.map((o) => (_jsxs("option", { value: o.naam.trim(), children: [o.naam.trim(), " (", maatTekst(o.breedte_mm, o.hoogte_mm), ")"] }, o.naam)))] }), !huidig ? (_jsxs("span", { className: "text-destructive flex items-center gap-1 text-xs", children: [_jsx(AlertTriangle, { className: "h-3 w-3" }), " Niet ingesteld: er wordt niets naar deze labelprinter geprint."] })) : null, !opties.length ? _jsx("span", { className: "text-muted-foreground text-xs", children: "PrintNode meldt nog geen formaten voor deze printer." }) : null] }));
|
|
33
34
|
}
|
|
34
35
|
function PrinterSelect({ printers, value, onChange, leeg = "— geen —", }) {
|
|
35
36
|
return (_jsxs("select", { className: selectKlasse, value: value ?? "", onChange: (e) => onChange(e.target.value || null), children: [_jsx("option", { value: "", children: leeg }), printers.map((p) => (_jsxs("option", { value: p.id, children: [printerTitel(p), p.locatie ? ` · ${p.locatie}` : "", p.online === false ? " (offline)" : ""] }, p.id)))] }));
|