@flowselections/layout-maker 1.45.9 → 1.46.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +139 -139
- package/dist-lib/components/AfdrukKnop.d.ts +19 -19
- package/dist-lib/components/AfdrukKnop.js +64 -64
- package/dist-lib/components/DocumentenPage.d.ts.map +1 -1
- package/dist-lib/components/DocumentenPage.js +2 -3
- package/dist-lib/components/NetwerkPrintersDialog.d.ts +7 -7
- package/dist-lib/components/NetwerkPrintersDialog.js +79 -79
- package/dist-lib/components/PakbonPreview.d.ts.map +1 -1
- package/dist-lib/components/PakbonPreview.js +2 -2
- package/dist-lib/components/PrintQueuePage.d.ts.map +1 -1
- package/dist-lib/components/PrintQueuePage.js +45 -74
- package/dist-lib/components/PrintenPage.d.ts.map +1 -1
- package/dist-lib/components/PrintenPage.js +2 -3
- package/dist-lib/components/PrinterSetupWizard.d.ts.map +1 -1
- package/dist-lib/components/PrinterSetupWizard.js +5 -28
- package/dist-lib/components/PrintersRedirectPage.d.ts +1 -1
- package/dist-lib/components/PrintersRedirectPage.js +14 -14
- package/dist-lib/components/PrintplekDetailPage.d.ts.map +1 -1
- package/dist-lib/components/PrintplekDetailPage.js +3 -25
- package/dist-lib/components/PrintplekWizard.d.ts.map +1 -1
- package/dist-lib/components/PrintplekWizard.js +3 -85
- package/dist-lib/index.d.ts +1 -8
- package/dist-lib/index.d.ts.map +1 -1
- package/dist-lib/index.js +1 -10
- package/dist-lib/integrations/supabase/auth-middleware.d.ts +5386 -289
- package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.server.d.ts +5386 -289
- package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.server.js +1 -1
- package/dist-lib/integrations/supabase/moduleClient.d.ts +5386 -289
- package/dist-lib/integrations/supabase/moduleClient.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/types.d.ts +5404 -243
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/aiLayout.functions.d.ts +5386 -289
- package/dist-lib/lib/aiLayout.functions.d.ts.map +1 -1
- package/dist-lib/lib/aiLayout.server.js +9 -9
- package/dist-lib/lib/browserPrint.js +1 -1
- package/dist-lib/lib/fieldRegistry.js +1 -0
- package/dist-lib/lib/layoutPreview.js +7 -7
- package/dist-lib/lib/logoLibrary.d.ts +2 -1
- package/dist-lib/lib/logoLibrary.d.ts.map +1 -1
- package/dist-lib/lib/logoLibrary.js +42 -2
- package/dist-lib/lib/orderData.server.d.ts.map +1 -1
- package/dist-lib/lib/orderData.server.js +13 -0
- package/dist-lib/lib/pakbonBuilder.d.ts +26 -0
- package/dist-lib/lib/pakbonBuilder.d.ts.map +1 -1
- package/dist-lib/lib/pakbonBuilder.js +37 -0
- package/dist-lib/lib/pakbonContent.d.ts.map +1 -1
- package/dist-lib/lib/pakbonContent.js +2 -2
- package/dist-lib/lib/pakbonHtml.d.ts.map +1 -1
- package/dist-lib/lib/pakbonHtml.js +60 -60
- package/dist-lib/lib/pakbonPresentation.d.ts.map +1 -1
- package/dist-lib/lib/pakbonPresentation.js +2 -4
- package/dist-lib/lib/printApi.d.ts +0 -2
- package/dist-lib/lib/printApi.d.ts.map +1 -1
- package/dist-lib/lib/printApi.js +0 -21
- package/dist-lib/lib/printQueue.server.d.ts +8 -0
- package/dist-lib/lib/printQueue.server.d.ts.map +1 -1
- package/dist-lib/lib/printQueue.server.js +162 -66
- package/dist-lib/lib/printService.functions.d.ts +51639 -52
- package/dist-lib/lib/printService.functions.d.ts.map +1 -1
- package/dist-lib/lib/printService.functions.js +69 -0
- package/dist-lib/lib/printService.server.d.ts +2 -0
- package/dist-lib/lib/printService.server.d.ts.map +1 -1
- package/dist-lib/lib/printService.server.js +10 -0
- package/dist-lib/lib/productiebonHtml.js +15 -15
- package/dist-lib/lib/profielHtml.d.ts.map +1 -1
- package/dist-lib/lib/profielHtml.js +22 -19
- package/dist-lib/lib/supabaseAdmin.server.d.ts +5 -5
- package/dist-lib/lib/supabaseAdmin.server.js +43 -43
- package/dist-lib/lib/testpagina.js +3 -3
- package/dist-lib/lib/testprint.js +4 -4
- package/dist-lib/lib/voorbeeldPrint.d.ts.map +1 -1
- package/dist-lib/lib/voorbeeldPrint.js +7 -39
- package/package.json +3 -3
- package/dist-lib/components/PdfMapAutoSaver.d.ts +0 -6
- package/dist-lib/components/PdfMapAutoSaver.d.ts.map +0 -1
- package/dist-lib/components/PdfMapAutoSaver.js +0 -12
- package/dist-lib/components/PdfMapGlobaleBanner.d.ts +0 -12
- package/dist-lib/components/PdfMapGlobaleBanner.d.ts.map +0 -1
- package/dist-lib/components/PdfMapGlobaleBanner.js +0 -30
- package/dist-lib/components/PdfMapToestemmingBanner.d.ts +0 -8
- package/dist-lib/components/PdfMapToestemmingBanner.d.ts.map +0 -1
- package/dist-lib/components/PdfMapToestemmingBanner.js +0 -245
- package/dist-lib/lib/pdfJobSaver.d.ts +0 -24
- package/dist-lib/lib/pdfJobSaver.d.ts.map +0 -1
- package/dist-lib/lib/pdfJobSaver.js +0 -376
- package/dist-lib/lib/pdfMap.d.ts +0 -83
- package/dist-lib/lib/pdfMap.d.ts.map +0 -1
- package/dist-lib/lib/pdfMap.js +0 -332
- package/dist-lib/lib/pdfOpslagStatus.d.ts +0 -23
- package/dist-lib/lib/pdfOpslagStatus.d.ts.map +0 -1
- package/dist-lib/lib/pdfOpslagStatus.js +0 -74
- package/dist-lib/lib/pdfPrinter.d.ts +0 -9
- package/dist-lib/lib/pdfPrinter.d.ts.map +0 -1
- package/dist-lib/lib/pdfPrinter.js +0 -34
|
@@ -1,79 +1,79 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
// ============================================================================
|
|
3
|
-
// src/components/NetwerkPrintersDialog.tsx — printers uit het netwerk zoeken,
|
|
4
|
-
// toevoegen of koppelen aan een bestaande printer.
|
|
5
|
-
// ============================================================================
|
|
6
|
-
import { useCallback, useEffect, useState } from "react";
|
|
7
|
-
import { Button, Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, toast, } from "@flowselections/core";
|
|
8
|
-
import { Loader2, Printer, RefreshCw } from "lucide-react";
|
|
9
|
-
import { supabase } from "../lib/supabaseClient.js";
|
|
10
|
-
import { netwerkPrinters } from "../lib/printService.functions.js";
|
|
11
|
-
export function NetwerkPrintersDialog({ open, onOpenChange, huidigePrinterId, huidigePrinterNaam, onKlaar, }) {
|
|
12
|
-
const [bezig, setBezig] = useState(false);
|
|
13
|
-
const [fout, setFout] = useState(null);
|
|
14
|
-
const [lijst, setLijst] = useState([]);
|
|
15
|
-
const zoeken = useCallback(async () => {
|
|
16
|
-
setBezig(true);
|
|
17
|
-
setFout(null);
|
|
18
|
-
try {
|
|
19
|
-
const res = await netwerkPrinters({ data: undefined });
|
|
20
|
-
if (!res.ok) {
|
|
21
|
-
setFout(res.fout);
|
|
22
|
-
setLijst([]);
|
|
23
|
-
}
|
|
24
|
-
else {
|
|
25
|
-
setLijst(Array.isArray(res.printers) ? res.printers : []);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
catch {
|
|
29
|
-
setFout("Er kon niet in het netwerk worden gezocht. Probeer het zo opnieuw.");
|
|
30
|
-
}
|
|
31
|
-
finally {
|
|
32
|
-
setBezig(false);
|
|
33
|
-
}
|
|
34
|
-
}, []);
|
|
35
|
-
useEffect(() => {
|
|
36
|
-
if (open)
|
|
37
|
-
void zoeken();
|
|
38
|
-
}, [open, zoeken]);
|
|
39
|
-
const toevoegen = async (p) => {
|
|
40
|
-
try {
|
|
41
|
-
const { error } = await supabase.from("printers").insert({
|
|
42
|
-
naam: p.naam,
|
|
43
|
-
systeemnaam: p.naam,
|
|
44
|
-
locatie: p.computer,
|
|
45
|
-
omschrijving: p.omschrijving,
|
|
46
|
-
online: p.online,
|
|
47
|
-
actief: true,
|
|
48
|
-
extern_printer_id: p.id,
|
|
49
|
-
});
|
|
50
|
-
if (error)
|
|
51
|
-
throw error;
|
|
52
|
-
toast.success(`${p.naam} is toegevoegd`);
|
|
53
|
-
onKlaar?.();
|
|
54
|
-
onOpenChange(false);
|
|
55
|
-
}
|
|
56
|
-
catch {
|
|
57
|
-
toast.error("Toevoegen mislukt");
|
|
58
|
-
}
|
|
59
|
-
};
|
|
60
|
-
const koppelen = async (p) => {
|
|
61
|
-
if (!huidigePrinterId)
|
|
62
|
-
return;
|
|
63
|
-
try {
|
|
64
|
-
const { error } = await supabase
|
|
65
|
-
.from("printers")
|
|
66
|
-
.update({ extern_printer_id: p.id, systeemnaam: p.naam, locatie: p.computer })
|
|
67
|
-
.eq("id", huidigePrinterId);
|
|
68
|
-
if (error)
|
|
69
|
-
throw error;
|
|
70
|
-
toast.success("Printer gekoppeld");
|
|
71
|
-
onKlaar?.();
|
|
72
|
-
onOpenChange(false);
|
|
73
|
-
}
|
|
74
|
-
catch {
|
|
75
|
-
toast.error("Koppelen mislukt");
|
|
76
|
-
}
|
|
77
|
-
};
|
|
78
|
-
return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(DialogContent, { className: "max-w-lg", children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: "Printers in het netwerk" }), _jsx(DialogDescription, { children: "Kies een printer om toe te voegen. Staat een printer er niet bij? Zet dan de computer aan waar de printer op is aangesloten." })] }), _jsxs("div", { className: "space-y-2", children: [bezig && (_jsxs("p", { className: "text-muted-foreground flex items-center gap-2 text-sm", children: [_jsx(Loader2, { className: "h-4 w-4 animate-spin" }), " Zoeken\u2026"] })), !bezig && fout && _jsx("p", { className: "text-destructive text-sm", children: fout }), !bezig && !fout && lijst.length === 0 && (_jsx("p", { className: "text-muted-foreground text-sm", children: "Er zijn geen printers gevonden." })), lijst.map((p) => (_jsxs("div", { className: "flex items-center gap-3 rounded-lg border p-3", children: [_jsx(Printer, { className: "text-muted-foreground h-5 w-5" }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("p", { className: "truncate text-sm font-medium", children: p.naam }), _jsxs("p", { className: "text-muted-foreground truncate text-xs", children: [p.computer || "Onbekende computer", " \u00B7 ", p.online ? "online" : "offline"] })] }), huidigePrinterId && (_jsxs(Button, { variant: "outline", size: "sm", onClick: () => void koppelen(p), children: ["Koppelen aan ", huidigePrinterNaam ?? "printer"] })), _jsx(Button, { size: "sm", onClick: () => void toevoegen(p), children: "Toevoegen" })] }, p.id)))] }), _jsx("div", { className: "flex justify-end", children: _jsxs(Button, { variant: "ghost", onClick: () => void zoeken(), disabled: bezig, children: [_jsx(RefreshCw, { className: "mr-2 h-4 w-4" }), " Opnieuw zoeken"] }) })] }) }));
|
|
79
|
-
}
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
// ============================================================================
|
|
3
|
+
// src/components/NetwerkPrintersDialog.tsx — printers uit het netwerk zoeken,
|
|
4
|
+
// toevoegen of koppelen aan een bestaande printer.
|
|
5
|
+
// ============================================================================
|
|
6
|
+
import { useCallback, useEffect, useState } from "react";
|
|
7
|
+
import { Button, Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, toast, } from "@flowselections/core";
|
|
8
|
+
import { Loader2, Printer, RefreshCw } from "lucide-react";
|
|
9
|
+
import { supabase } from "../lib/supabaseClient.js";
|
|
10
|
+
import { netwerkPrinters } from "../lib/printService.functions.js";
|
|
11
|
+
export function NetwerkPrintersDialog({ open, onOpenChange, huidigePrinterId, huidigePrinterNaam, onKlaar, }) {
|
|
12
|
+
const [bezig, setBezig] = useState(false);
|
|
13
|
+
const [fout, setFout] = useState(null);
|
|
14
|
+
const [lijst, setLijst] = useState([]);
|
|
15
|
+
const zoeken = useCallback(async () => {
|
|
16
|
+
setBezig(true);
|
|
17
|
+
setFout(null);
|
|
18
|
+
try {
|
|
19
|
+
const res = await netwerkPrinters({ data: undefined });
|
|
20
|
+
if (!res.ok) {
|
|
21
|
+
setFout(res.fout);
|
|
22
|
+
setLijst([]);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
setLijst(Array.isArray(res.printers) ? res.printers : []);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
setFout("Er kon niet in het netwerk worden gezocht. Probeer het zo opnieuw.");
|
|
30
|
+
}
|
|
31
|
+
finally {
|
|
32
|
+
setBezig(false);
|
|
33
|
+
}
|
|
34
|
+
}, []);
|
|
35
|
+
useEffect(() => {
|
|
36
|
+
if (open)
|
|
37
|
+
void zoeken();
|
|
38
|
+
}, [open, zoeken]);
|
|
39
|
+
const toevoegen = async (p) => {
|
|
40
|
+
try {
|
|
41
|
+
const { error } = await supabase.from("printers").insert({
|
|
42
|
+
naam: p.naam,
|
|
43
|
+
systeemnaam: p.naam,
|
|
44
|
+
locatie: p.computer,
|
|
45
|
+
omschrijving: p.omschrijving,
|
|
46
|
+
online: p.online,
|
|
47
|
+
actief: true,
|
|
48
|
+
extern_printer_id: p.id,
|
|
49
|
+
});
|
|
50
|
+
if (error)
|
|
51
|
+
throw error;
|
|
52
|
+
toast.success(`${p.naam} is toegevoegd`);
|
|
53
|
+
onKlaar?.();
|
|
54
|
+
onOpenChange(false);
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
toast.error("Toevoegen mislukt");
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
const koppelen = async (p) => {
|
|
61
|
+
if (!huidigePrinterId)
|
|
62
|
+
return;
|
|
63
|
+
try {
|
|
64
|
+
const { error } = await supabase
|
|
65
|
+
.from("printers")
|
|
66
|
+
.update({ extern_printer_id: p.id, systeemnaam: p.naam, locatie: p.computer })
|
|
67
|
+
.eq("id", huidigePrinterId);
|
|
68
|
+
if (error)
|
|
69
|
+
throw error;
|
|
70
|
+
toast.success("Printer gekoppeld");
|
|
71
|
+
onKlaar?.();
|
|
72
|
+
onOpenChange(false);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
toast.error("Koppelen mislukt");
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(DialogContent, { className: "max-w-lg", children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: "Printers in het netwerk" }), _jsx(DialogDescription, { children: "Kies een printer om toe te voegen. Staat een printer er niet bij? Zet dan de computer aan waar de printer op is aangesloten." })] }), _jsxs("div", { className: "space-y-2", children: [bezig && (_jsxs("p", { className: "text-muted-foreground flex items-center gap-2 text-sm", children: [_jsx(Loader2, { className: "h-4 w-4 animate-spin" }), " Zoeken\u2026"] })), !bezig && fout && _jsx("p", { className: "text-destructive text-sm", children: fout }), !bezig && !fout && lijst.length === 0 && (_jsx("p", { className: "text-muted-foreground text-sm", children: "Er zijn geen printers gevonden." })), lijst.map((p) => (_jsxs("div", { className: "flex items-center gap-3 rounded-lg border p-3", children: [_jsx(Printer, { className: "text-muted-foreground h-5 w-5" }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("p", { className: "truncate text-sm font-medium", children: p.naam }), _jsxs("p", { className: "text-muted-foreground truncate text-xs", children: [p.computer || "Onbekende computer", " \u00B7 ", p.online ? "online" : "offline"] })] }), huidigePrinterId && (_jsxs(Button, { variant: "outline", size: "sm", onClick: () => void koppelen(p), children: ["Koppelen aan ", huidigePrinterNaam ?? "printer"] })), _jsx(Button, { size: "sm", onClick: () => void toevoegen(p), children: "Toevoegen" })] }, p.id)))] }), _jsx("div", { className: "flex justify-end", children: _jsxs(Button, { variant: "ghost", onClick: () => void zoeken(), disabled: bezig, children: [_jsx(RefreshCw, { className: "mr-2 h-4 w-4" }), " Opnieuw zoeken"] }) })] }) }));
|
|
79
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PakbonPreview.d.ts","sourceRoot":"","sources":["../../src/components/PakbonPreview.tsx"],"names":[],"mappings":"AAKA,OAAO,
|
|
1
|
+
{"version":3,"file":"PakbonPreview.d.ts","sourceRoot":"","sources":["../../src/components/PakbonPreview.tsx"],"names":[],"mappings":"AAKA,OAAO,EA0BL,KAAK,YAAY,EAEjB,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACzB,MAAM,sBAAsB,CAAC;AA6B9B,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,SAAe,EACf,QAAc,EACd,OAAc,GACf,EAAE;IACD,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oFAAoF;IACpF,OAAO,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;CACtC,+BAiJA;AAiLD,oEAAoE;AACpE,wBAAgB,mBAAmB,CAAC,EAClC,MAAM,EACN,MAAM,EACN,SAAS,GACV,EAAE;IACD,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,+BAmCA"}
|
|
@@ -4,7 +4,7 @@ import { PaginaDocument } from "./PaginaDocument.js";
|
|
|
4
4
|
import { useLogos } from "../lib/logoLibrary.js";
|
|
5
5
|
import { code128Bars } from "../lib/code128.js";
|
|
6
6
|
import { karMetadata } from "../lib/pakbonPresentation.js";
|
|
7
|
-
import { DEMO_ORDER, deelkarVoorbeeldOrder, conditieContext, groepeerIdentiekeKarren, groepeerIdentiekeLagen, karBundelTekst, fustVerzamellijst, fustRegels, FUSTREGEL_LABELS, FUSTREGEL_RECHTS, pickMethode, pakbonLayoutVariant, productVeldBreedtes, sectieOnderdruktVoorVariant, kolomLabel, laagBundelTekst, sectieZichtbaar, sorteerProducten, totalen, vulVeldcodes, } from "../lib/pakbonBuilder.js";
|
|
7
|
+
import { DEMO_ORDER, deelkarVoorbeeldOrder, conditieContext, groepeerIdentiekeKarren, groepeerIdentiekeLagen, karBundelTekst, fustVerzamellijst, fustRegels, FUSTREGEL_LABELS, FUSTREGEL_RECHTS, pickMethode, pakbonLayoutVariant, productVeldBreedtes, sectieOnderdruktVoorVariant, karKopNummer, kolomLabel, laagBundelTekst, sectieZichtbaar, sorteerProducten, totalen, vulVeldcodes, } from "../lib/pakbonBuilder.js";
|
|
8
8
|
/** Voorbeeldbarcode: alleen bedoeld om de plek en hoogte te tonen. */
|
|
9
9
|
function BarcodeStrepen({ waarde, hoogteMm = 15 }) {
|
|
10
10
|
const bars = code128Bars(waarde);
|
|
@@ -290,7 +290,7 @@ function Scheiding({ modus }) {
|
|
|
290
290
|
function KarKop({ sectie, kar, velden, bundelTekst = "" }) {
|
|
291
291
|
const scheiding = optS(sectie, "scheiding", "kop");
|
|
292
292
|
const tekst = String(opt(sectie, "koptekst", "KAR {kar}"))
|
|
293
|
-
.replace(/{kar}/g,
|
|
293
|
+
.replace(/{kar}/g, karKopNummer(kar))
|
|
294
294
|
.replace(/{route}/g, kar.route)
|
|
295
295
|
.replace(/{chauffeur}/g, kar.chauffeur)
|
|
296
296
|
.replace(/{lagen}/g, String(kar.lagen.length))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PrintQueuePage.d.ts","sourceRoot":"","sources":["../../src/components/PrintQueuePage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PrintQueuePage.d.ts","sourceRoot":"","sources":["../../src/components/PrintQueuePage.tsx"],"names":[],"mappings":"AAkFA,wBAAgB,cAAc,gCA4T7B"}
|
|
@@ -1,19 +1,14 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useMemo, useRef, useState } from "react";
|
|
3
3
|
import { Badge, Button, Card, CardContent, CardDescription, CardHeader, CardTitle, Input, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, toast, } from "@flowselections/core";
|
|
4
|
-
import {
|
|
4
|
+
import { RotateCcw, Search, XCircle } from "lucide-react";
|
|
5
5
|
import { bijgewerktTekst, useAutoRefresh } from "../lib/useAutoRefresh.js";
|
|
6
6
|
import { PrintStatusBanner } from "./PrintStatusBanner.js";
|
|
7
7
|
import { maakPrintJob, updateJobStatus, useLayouts, usePrinters, usePrintJobs, usePrintPlekNamen, } from "../lib/useDocumentData.js";
|
|
8
|
-
import { printStatus } from "../lib/printService.functions.js";
|
|
8
|
+
import { annuleerPrintOpdrachten, printStatus } from "../lib/printService.functions.js";
|
|
9
9
|
import { vraagWachtrijRonde } from "../lib/queueTickClient.js";
|
|
10
10
|
import { documentTypeLabel } from "../lib/documentTypes.js";
|
|
11
|
-
import { jobPlekLabel
|
|
12
|
-
import { kiesPdfMap, openInEigenTabblad } from "../lib/pdfMap.js";
|
|
13
|
-
import { bewaarPdfJobOpnieuw, downloadPdfJob } from "../lib/pdfJobSaver.js";
|
|
14
|
-
import { pdfOpslagLabel, isOpslagFout } from "../lib/pdfOpslagStatus.js";
|
|
15
|
-
import { PdfMapAutoSaver } from "./PdfMapAutoSaver.js";
|
|
16
|
-
import { PdfMapToestemmingBanner } from "./PdfMapToestemmingBanner.js";
|
|
11
|
+
import { jobPlekLabel } from "../lib/printQueue.js";
|
|
17
12
|
const STATUS_VARIANT = {
|
|
18
13
|
wachtend: "outline",
|
|
19
14
|
bezig: "secondary",
|
|
@@ -54,43 +49,11 @@ export function PrintQueuePage() {
|
|
|
54
49
|
const [zoek, setZoek] = useState("");
|
|
55
50
|
const [status, setStatus] = useState("alle");
|
|
56
51
|
const [plekFilter, setPlekFilter] = useState("alle");
|
|
57
|
-
const [opslagFilter, setOpslagFilter] = useState("alle");
|
|
58
52
|
const [tickFout, setTickFout] = useState(null);
|
|
53
|
+
const [annuleertAlles, setAnnuleertAlles] = useState(false);
|
|
54
|
+
const openJobs = useMemo(() => jobs.filter((j) => j.status === "wachtend" || j.status === "bezig"), [jobs]);
|
|
59
55
|
const plekNamen = usePrintPlekNamen();
|
|
60
56
|
const printerNaam = useMemo(() => new Map(printers.map((p) => [p.id, p.naam])), [printers]);
|
|
61
|
-
const pdfPrinter = printers.find((p) => p.afdrukmethode === "pdf");
|
|
62
|
-
/** Kies direct vanuit een foute opdracht de PDF-map op deze werkplek. */
|
|
63
|
-
const stelMapIn = async (printplekId) => {
|
|
64
|
-
if (!pdfPrinter) {
|
|
65
|
-
toast.error("Er is nog geen “Opslaan als PDF”-printer aangemaakt");
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
const uitkomst = await kiesPdfMap(pdfPrinter.id, printplekId);
|
|
69
|
-
if (uitkomst.status === "gekozen") {
|
|
70
|
-
toast.success("Map gekozen", {
|
|
71
|
-
description: `PDF's worden opgeslagen in “${uitkomst.naam}”. De opdracht wordt opnieuw opgeslagen.`,
|
|
72
|
-
});
|
|
73
|
-
void reload(true);
|
|
74
|
-
}
|
|
75
|
-
else if (uitkomst.status === "iframe-geblokkeerd") {
|
|
76
|
-
toast.error("Map kiezen werkt niet in een iframe", {
|
|
77
|
-
description: "Open de app in een eigen tabblad.",
|
|
78
|
-
action: {
|
|
79
|
-
label: "Open in eigen tabblad",
|
|
80
|
-
onClick: () => openInEigenTabblad(printplekId),
|
|
81
|
-
},
|
|
82
|
-
duration: 15000,
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
else if (uitkomst.status === "niet-ondersteund") {
|
|
86
|
-
toast.error("Deze browser ondersteunt geen mapkeuze", {
|
|
87
|
-
description: "Gebruik Chrome, Edge of Safari op desktop.",
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
else if (uitkomst.status === "fout") {
|
|
91
|
-
toast.error("Map kiezen is mislukt", { description: uitkomst.melding });
|
|
92
|
-
}
|
|
93
|
-
};
|
|
94
57
|
const layoutNaam = useMemo(() => new Map(layouts.map((l) => [l.id, l.naam])), [layouts]);
|
|
95
58
|
/** Herkomstlabel per opdracht: printplek, anders pickstation of werkplek. */
|
|
96
59
|
const plekPerJob = useMemo(() => {
|
|
@@ -108,13 +71,6 @@ export function PrintQueuePage() {
|
|
|
108
71
|
return false;
|
|
109
72
|
if (plekFilter !== "alle" && (plekPerJob.get(j.id) || "—") !== plekFilter)
|
|
110
73
|
return false;
|
|
111
|
-
if (opslagFilter === "fout" && !isOpslagFout(j.lokale_pdf_status))
|
|
112
|
-
return false;
|
|
113
|
-
if (opslagFilter === "opgeslagen" && j.lokale_pdf_status !== "opgeslagen")
|
|
114
|
-
return false;
|
|
115
|
-
if (opslagFilter === "wacht" &&
|
|
116
|
-
!["wachtend", "genereren", "gereed", "bezig"].includes(j.lokale_pdf_status ?? ""))
|
|
117
|
-
return false;
|
|
118
74
|
return true;
|
|
119
75
|
});
|
|
120
76
|
const tellingen = useMemo(() => {
|
|
@@ -154,31 +110,34 @@ export function PrintQueuePage() {
|
|
|
154
110
|
await reload(true);
|
|
155
111
|
};
|
|
156
112
|
const bijgewerkt = useAutoRefresh(ronde, lopende ? 5000 : 20000);
|
|
157
|
-
return (_jsxs("main", { className: "space-y-6 p-6", children: [
|
|
158
|
-
|
|
113
|
+
return (_jsxs("main", { className: "space-y-6 p-6", children: [_jsxs("div", { className: "flex flex-wrap items-end justify-between gap-4", children: [_jsxs("div", { children: [_jsx("h1", { className: "text-xl font-semibold", children: "Printwachtrij" }), _jsx("p", { className: "text-sm text-muted-foreground", children: "Volg printopdrachten, herstart mislukte prints en print documenten opnieuw." })] }), _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("span", { className: "text-muted-foreground text-xs", children: bijgewerktTekst(bijgewerkt) }), _jsxs(Button, { variant: "outline", size: "sm", disabled: annuleertAlles, onClick: async () => {
|
|
114
|
+
setAnnuleertAlles(true);
|
|
115
|
+
try {
|
|
116
|
+
const resultaat = await annuleerPrintOpdrachten({
|
|
117
|
+
data: {},
|
|
118
|
+
});
|
|
119
|
+
if (resultaat.geannuleerd === 0) {
|
|
120
|
+
toast.info("Er stonden geen wachtende of lopende opdrachten meer in de wachtrij.");
|
|
121
|
+
}
|
|
122
|
+
else if (resultaat.externMislukt > 0) {
|
|
123
|
+
toast.error(`${resultaat.geannuleerd} opdrachten gestopt; ${resultaat.externMislukt} konden niet meer bij de printer worden ingetrokken`);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
toast.success(`${resultaat.geannuleerd} bestaande opdrachten direct gestopt. Nieuwe opdrachten worden normaal geprint.`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
catch (fout) {
|
|
130
|
+
toast.error(fout instanceof Error ? fout.message : "Annuleren mislukt");
|
|
131
|
+
}
|
|
132
|
+
finally {
|
|
133
|
+
setAnnuleertAlles(false);
|
|
134
|
+
await reload(true);
|
|
135
|
+
}
|
|
136
|
+
}, 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
|
|
159
137
|
? layoutNaam.get(j.gebruikte_layout_id) ?? "Onbekende layout"
|
|
160
138
|
: j.gebruikte_bron
|
|
161
139
|
? "geen layout"
|
|
162
|
-
: "nog niet verwerkt" }), j.gebruikte_bron && (_jsx(Badge, { variant: "outline", className: "ml-2", children: BRON_LABEL[j.gebruikte_bron] ?? j.gebruikte_bron }))] })] }), _jsx(TableCell, { className: "text-sm text-muted-foreground", children: j.printer_id ? printerNaam.get(j.printer_id) ?? "—" : "—" }), _jsx(TableCell, { children: _jsx(Badge, { variant: STATUS_VARIANT[j.status] ?? "outline", children:
|
|
163
|
-
try {
|
|
164
|
-
await downloadPdfJob(j.id, j.documentnaam ?? "document");
|
|
165
|
-
}
|
|
166
|
-
catch (fout) {
|
|
167
|
-
toast.error(fout instanceof Error ? fout.message : "PDF downloaden mislukt");
|
|
168
|
-
}
|
|
169
|
-
}, children: [_jsx(FileDown, { className: "mr-2 h-4 w-4" }), " PDF"] })), j.lokale_pdf_status !== "opgeslagen" &&
|
|
170
|
-
(j.artefact_pad || j.resultaat_pdf_base64) && (_jsxs(Button, { variant: "ghost", size: "sm", title: "Bewaar de bestaande PDF opnieuw in de ingestelde map", onClick: async () => {
|
|
171
|
-
try {
|
|
172
|
-
await bewaarPdfJobOpnieuw(j.id);
|
|
173
|
-
toast.success("De bestaande PDF wordt opnieuw in de ingestelde map opgeslagen");
|
|
174
|
-
}
|
|
175
|
-
catch (fout) {
|
|
176
|
-
toast.error(fout instanceof Error ? fout.message : "Opnieuw opslaan mislukt");
|
|
177
|
-
}
|
|
178
|
-
finally {
|
|
179
|
-
void reload(true);
|
|
180
|
-
}
|
|
181
|
-
}, children: [_jsx(Save, { className: "mr-2 h-4 w-4" }), " Opslag opnieuw"] })), _jsxs(Button, { variant: "ghost", size: "sm", onClick: async () => {
|
|
140
|
+
: "nog niet verwerkt" }), j.gebruikte_bron && (_jsx(Badge, { variant: "outline", className: "ml-2", children: BRON_LABEL[j.gebruikte_bron] ?? j.gebruikte_bron }))] })] }), _jsx(TableCell, { className: "text-sm text-muted-foreground", children: j.printer_id ? printerNaam.get(j.printer_id) ?? "—" : "—" }), _jsx(TableCell, { children: _jsx(Badge, { variant: STATUS_VARIANT[j.status] ?? "outline", children: j.status }) }), _jsx(TableCell, { className: "text-sm text-muted-foreground", children: new Date(j.created_at).toLocaleString("nl-NL") }), _jsx(TableCell, { className: "text-right", children: _jsxs("div", { className: "flex justify-end gap-1", children: [_jsxs(Button, { variant: "ghost", size: "sm", onClick: async () => {
|
|
182
141
|
if (!j.layout_id)
|
|
183
142
|
return;
|
|
184
143
|
try {
|
|
@@ -203,8 +162,20 @@ export function PrintQueuePage() {
|
|
|
203
162
|
toast.error("Herprint mislukt");
|
|
204
163
|
}
|
|
205
164
|
}, children: [_jsx(RotateCcw, { className: "mr-2 h-4 w-4" }), " Opnieuw"] }), (j.status === "wachtend" || j.status === "bezig") && (_jsx(Button, { variant: "ghost", size: "sm", onClick: async () => {
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
165
|
+
try {
|
|
166
|
+
const resultaat = await annuleerPrintOpdrachten({ data: { jobIds: [j.id] } });
|
|
167
|
+
if (resultaat.externMislukt > 0) {
|
|
168
|
+
toast.error("De opdracht is gestopt, maar stond mogelijk al bij de printer");
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
toast.success("Opdracht geannuleerd");
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
catch (fout) {
|
|
175
|
+
toast.error(fout instanceof Error ? fout.message : "Annuleren mislukt");
|
|
176
|
+
}
|
|
177
|
+
finally {
|
|
178
|
+
void reload(true);
|
|
179
|
+
}
|
|
209
180
|
}, children: _jsx(XCircle, { className: "h-4 w-4" }) }))] }) })] }, j.id)))] })] })] })] })] }));
|
|
210
181
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PrintenPage.d.ts","sourceRoot":"","sources":["../../src/components/PrintenPage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PrintenPage.d.ts","sourceRoot":"","sources":["../../src/components/PrintenPage.tsx"],"names":[],"mappings":"AAoBA,wBAAgB,WAAW,CAAC,EAC1B,GAAoB,GACrB,EAAE;IACD,GAAG,CAAC,EAAE,cAAc,GAAG,WAAW,CAAC;CACpC,+BAsBA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { jsx as _jsx, Fragment as _Fragment
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
// ============================================================================
|
|
3
3
|
// src/components/PrintenPage.tsx — één menu-item "Printen" met tabbladen voor
|
|
4
4
|
// printplekken (plekken, computers en printers samen) en standaardregels.
|
|
@@ -8,7 +8,6 @@ import { MapPin, Route as RouteIcon } from "lucide-react";
|
|
|
8
8
|
import { ModuleTabs } from "./ModuleTabs.js";
|
|
9
9
|
import { PrintplekkenPage } from "./PrintplekkenPage.js";
|
|
10
10
|
import { DocumentRouteringPage } from "./DocumentRouteringPage.js";
|
|
11
|
-
import { PdfMapAutoSaver } from "./PdfMapAutoSaver.js";
|
|
12
11
|
const TABS = [
|
|
13
12
|
{
|
|
14
13
|
id: "printplekken",
|
|
@@ -19,5 +18,5 @@ const TABS = [
|
|
|
19
18
|
];
|
|
20
19
|
export function PrintenPage({ tab = "printplekken", }) {
|
|
21
20
|
const [actiefTab, setActiefTab] = useState(tab);
|
|
22
|
-
return (
|
|
21
|
+
return (_jsx(_Fragment, { children: _jsx(ModuleTabs, { titel: "Printen", omschrijving: "Stel per plek in het bedrijf in welke computers, printers en documenten daar horen.", tabs: TABS, actiefTab: actiefTab, onTabWijzig: (nieuwTab) => setActiefTab(nieuwTab === "routering" ? "routering" : "printplekken"), children: actiefTab === "routering" ? (_jsx(DocumentRouteringPage, { ingebed: true })) : (_jsx(PrintplekkenPage, { ingebed: true })) }) }));
|
|
23
22
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PrinterSetupWizard.d.ts","sourceRoot":"","sources":["../../src/components/PrinterSetupWizard.tsx"],"names":[],"mappings":"
|
|
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"}
|
|
@@ -5,9 +5,8 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
5
5
|
// ============================================================================
|
|
6
6
|
import { useCallback, useEffect, useMemo, useState } from "react";
|
|
7
7
|
import { Button, Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, Input, Label, toast, } from "@flowselections/core";
|
|
8
|
-
import { Check, CheckCircle2,
|
|
8
|
+
import { Check, CheckCircle2, FileText, Loader2, Printer, RefreshCw, Search, Tag, } from "lucide-react";
|
|
9
9
|
import { supabase } from "../lib/supabaseClient.js";
|
|
10
|
-
import { zorgVoorPdfPrinter } from "../lib/pdfPrinter.js";
|
|
11
10
|
import { printHtml, volgJobStatus } from "../lib/printApi.js";
|
|
12
11
|
import { netwerkPrinters } from "../lib/printService.functions.js";
|
|
13
12
|
import { printerFormaatOpties } from "../lib/papierFormaten.js";
|
|
@@ -174,28 +173,6 @@ export function PrinterSetupWizard({ open, onOpenChange, onKlaar, computerFilter
|
|
|
174
173
|
setBezig(false);
|
|
175
174
|
}
|
|
176
175
|
};
|
|
177
|
-
/**
|
|
178
|
-
* Voegt de virtuele "Opslaan als PDF"-printer toe. Documenten die hierheen
|
|
179
|
-
* gaan worden niet geprint maar als downloadbare PDF in de wachtrij bewaard.
|
|
180
|
-
* Er is maar één PDF-printer nodig; een tweede wordt niet aangemaakt.
|
|
181
|
-
*/
|
|
182
|
-
const pdfPrinterToevoegen = async () => {
|
|
183
|
-
setBezig(true);
|
|
184
|
-
try {
|
|
185
|
-
const { alAanwezig } = await zorgVoorPdfPrinter();
|
|
186
|
-
toast.success(alAanwezig
|
|
187
|
-
? "'Opslaan als PDF' stond al tussen uw printers"
|
|
188
|
-
: "'Opslaan als PDF' toegevoegd");
|
|
189
|
-
onKlaar?.();
|
|
190
|
-
onOpenChange(false);
|
|
191
|
-
}
|
|
192
|
-
catch {
|
|
193
|
-
toast.error("Toevoegen mislukt");
|
|
194
|
-
}
|
|
195
|
-
finally {
|
|
196
|
-
setBezig(false);
|
|
197
|
-
}
|
|
198
|
-
};
|
|
199
176
|
const [testStatus, setTestStatus] = useState("leeg");
|
|
200
177
|
const [testMelding, setTestMelding] = useState("");
|
|
201
178
|
const testpagina = async () => {
|
|
@@ -206,9 +183,9 @@ export function PrinterSetupWizard({ open, onOpenChange, onKlaar, computerFilter
|
|
|
206
183
|
setTestStatus("bezig");
|
|
207
184
|
setTestMelding("");
|
|
208
185
|
const maat = gekozenFormaat ? `${gekozenFormaat.breedte} × ${gekozenFormaat.hoogte} mm` : "standaardformaat";
|
|
209
|
-
const html = `<div style="padding:15mm;font-family:Arial,Helvetica,sans-serif;font-size:12pt">
|
|
210
|
-
<h1 style="font-size:20pt;margin:0 0 6mm">Testpagina</h1>
|
|
211
|
-
<p style="margin:0 0 3mm">Deze pagina hoort uit: <strong>${naam}</strong></p>
|
|
186
|
+
const html = `<div style="padding:15mm;font-family:Arial,Helvetica,sans-serif;font-size:12pt">
|
|
187
|
+
<h1 style="font-size:20pt;margin:0 0 6mm">Testpagina</h1>
|
|
188
|
+
<p style="margin:0 0 3mm">Deze pagina hoort uit: <strong>${naam}</strong></p>
|
|
212
189
|
<p style="margin:0">Papier: ${maat} — ${new Date().toLocaleString("nl-NL")}</p></div>`;
|
|
213
190
|
try {
|
|
214
191
|
const { jobId } = await printHtml({
|
|
@@ -251,7 +228,7 @@ export function PrinterSetupWizard({ open, onOpenChange, onKlaar, computerFilter
|
|
|
251
228
|
: "Kies uw printer, geef hem een herkenbare naam en druk een testpagina af." })] }), !bewerken && _jsx(Stappenbalk, { stap: stap }), stap === 0 && (_jsxs("div", { className: "space-y-4", children: [lijst.length > 6 && (_jsxs("div", { className: "relative", children: [_jsx(Search, { className: "text-muted-foreground absolute top-2.5 left-3 h-4 w-4" }), _jsx(Input, { className: "pl-9", value: zoekterm, placeholder: "Zoek op printer of computer", onChange: (e) => setZoekterm(e.target.value) })] })), zoekt && (_jsxs("p", { className: "text-muted-foreground flex items-center gap-2 text-sm", children: [_jsx(Loader2, { className: "h-4 w-4 animate-spin" }), " Printers zoeken\u2026"] })), !zoekt && fout && _jsx("p", { className: "text-destructive text-sm", children: fout }), !zoekt && zichtbaar.length > 0 && (_jsx("div", { className: "grid gap-2 sm:grid-cols-2", children: zichtbaar.map((p) => {
|
|
252
229
|
const al = bekendeExterneIds.includes(p.id);
|
|
253
230
|
return (_jsx("button", { type: "button", disabled: al, onClick: () => kiesPrinter(p), className: `rounded-xl border p-4 text-left transition ${al ? "opacity-60" : "hover:border-primary/50 hover:bg-accent/40"}`, children: _jsxs("div", { className: "flex items-start gap-3", children: [_jsx(Printer, { className: "text-muted-foreground mt-0.5 h-5 w-5 shrink-0" }), _jsxs("div", { className: "min-w-0", children: [_jsx("p", { className: "truncate text-sm font-medium", children: p.naam }), _jsx("p", { className: "text-muted-foreground truncate text-xs", children: p.computer }), _jsxs("span", { className: "mt-2 flex items-center gap-1.5 text-xs", children: [_jsx("span", { className: `h-2 w-2 rounded-full ${p.online ? "bg-primary" : "bg-muted-foreground/40"}` }), al ? "Al toegevoegd" : p.online ? "Beschikbaar" : "Niet aan"] })] })] }) }, p.id));
|
|
254
|
-
}) })), !zoekt && zichtbaar.length === 0 && _jsx(PrintProgrammaUitleg, {}), !zoekt &&
|
|
231
|
+
}) })), !zoekt && zichtbaar.length === 0 && _jsx(PrintProgrammaUitleg, {}), !zoekt && zichtbaar.length > 0 && (_jsxs("div", { className: "space-y-3", children: [_jsx("button", { type: "button", className: "text-muted-foreground hover:text-foreground text-sm underline", onClick: () => setUitlegOpen((v) => !v), children: "Ik zie mijn printer niet" }), uitlegOpen && _jsx(PrintProgrammaUitleg, { compact: true })] })), _jsx("div", { className: "flex justify-between", children: _jsxs(Button, { variant: "ghost", onClick: () => void zoeken(), disabled: zoekt, children: [_jsx(RefreshCw, { className: "mr-2 h-4 w-4" }), " Opnieuw zoeken"] }) })] })), stap === 1 && (_jsxs("div", { className: "grid gap-5 sm:grid-cols-[1fr_200px]", children: [_jsxs("div", { className: "space-y-4", children: [_jsxs("div", { className: "space-y-2", children: [_jsx(Label, { children: "Weergavenaam" }), _jsx(Input, { value: naam, placeholder: "Bijvoorbeeld: pakbonprinter voorin", onChange: (e) => setNaam(e.target.value) })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { children: "Omschrijving (optioneel)" }), _jsx("p", { className: "text-muted-foreground text-xs", children: "Waar staat deze printer? Bijvoorbeeld: magazijn achter." }), _jsx(Input, { value: locatie, placeholder: "Bijvoorbeeld: magazijn achter", onChange: (e) => setLocatie(e.target.value) }), bekendeLocaties.length > 0 && (_jsx("div", { className: "flex flex-wrap gap-2 pt-1", children: bekendeLocaties.slice(0, 6).map((l) => (_jsx("button", { type: "button", onClick: () => setLocatie(l), className: "hover:bg-accent rounded-full border px-3 py-1 text-xs", children: l }, l))) }))] }), formaatOpties.length > 0 ? (_jsxs("div", { className: "space-y-2", children: [_jsx(Label, { children: "Standaardformaat van deze printer" }), _jsxs("p", { className: "text-muted-foreground text-xs", children: ["Deze printer kan: ", formaatOpties.map((o) => o.label.split(" (")[0]).join(", "), "."] }), formaatOpties.length === 1 ? (_jsx("p", { className: "text-sm", children: formaatOpties[0].label })) : (_jsx("div", { className: "grid gap-2 sm:grid-cols-2", children: formaatOpties.map((o) => (_jsxs("button", { type: "button", onClick: () => setFormaatCode(o.code), className: `hover:bg-accent rounded-lg border p-3 text-left transition ${formaatCode === o.code ? "border-primary bg-accent" : ""}`, children: [o.breedte <= 120 && o.hoogte <= 220 ? (_jsx(Tag, { className: "text-muted-foreground mb-1 h-4 w-4" })) : (_jsx(FileText, { className: "text-muted-foreground mb-1 h-4 w-4" })), _jsx("p", { className: "text-sm font-medium", children: o.label.split(" (")[0] }), _jsxs("p", { className: "text-muted-foreground text-xs", children: [o.breedte, " \u00D7 ", o.hoogte, " mm"] })] }, o.code))) }))] })) : (_jsxs("div", { className: "space-y-2", children: [_jsx(Label, { children: "Wat gaat deze printer afdrukken?" }), _jsx("p", { className: "text-muted-foreground text-xs", children: "De formaten van deze printer konden niet worden opgehaald." }), _jsx("div", { className: "grid grid-cols-2 gap-3", children: [
|
|
255
232
|
{ code: "papier", label: "Papier (A4)", sub: "Gewone documenten", Icon: FileText },
|
|
256
233
|
{ code: "etiket", label: "Etiketten", sub: "Stickers en labels", Icon: Tag },
|
|
257
234
|
].map((o) => (_jsxs("button", { type: "button", onClick: () => setGebruik(o.code), className: `hover:bg-accent rounded-lg border p-4 text-left transition ${gebruik === o.code ? "border-primary bg-accent" : ""}`, children: [_jsx(o.Icon, { className: "text-muted-foreground mb-2 h-5 w-5" }), _jsx("p", { className: "text-sm font-medium", children: o.label }), _jsx("p", { className: "text-muted-foreground text-xs", children: o.sub })] }, o.code))) })] })), _jsxs("div", { className: "flex justify-between", children: [!bewerken ? (_jsx(Button, { variant: "ghost", onClick: () => setStap(0), children: "Terug" })) : (_jsx("span", {})), _jsx(Button, { disabled: bezig, onClick: () => void opslaan(), children: bewerken ? "Opslaan" : "Opslaan en verder" })] })] }), _jsxs("div", { className: "hidden sm:block", children: [_jsx("p", { className: "text-muted-foreground mb-2 text-xs", children: "Zo komt hij in de lijst:" }), _jsxs("div", { className: "bg-card rounded-xl border p-3", children: [_jsx(Printer, { className: "text-muted-foreground mb-2 h-4 w-4" }), _jsx("p", { className: "truncate text-sm font-medium", children: naam || "Naam van de printer" }), _jsx("p", { className: "text-muted-foreground truncate text-xs", children: locatie || gekozen?.computer || "Geen omschrijving" })] })] })] })), stap === 2 && (_jsxs("div", { className: "space-y-4 text-center", children: [_jsx(CheckCircle2, { className: "text-primary mx-auto h-10 w-10" }), _jsxs("div", { children: [_jsx("p", { className: "font-medium", children: "De printer is klaar voor gebruik" }), _jsxs("p", { className: "text-muted-foreground text-sm", children: [naam, " ", locatie ? `bij ${locatie}` : "", " drukt voortaan automatisch af."] })] }), testStatus !== "leeg" && (_jsxs("p", { className: "text-muted-foreground text-sm", children: [testStatus === "bezig" && "Onderweg naar de printer…", testStatus === "gelukt" && (testMelding || "De testpagina is afgedrukt."), testStatus === "fout" &&
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare function PrintersRedirectPage(): import("react").JSX.Element;
|
|
1
|
+
export declare function PrintersRedirectPage(): import("react").JSX.Element;
|
|
2
2
|
//# sourceMappingURL=PrintersRedirectPage.d.ts.map
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
// ============================================================================
|
|
3
|
-
// src/components/PrintersRedirectPage.tsx — oude URL /layouts-printers/printers
|
|
4
|
-
// stuurt door naar de samengevoegde pagina Printplekken.
|
|
5
|
-
// ============================================================================
|
|
6
|
-
import { useEffect } from "react";
|
|
7
|
-
import { useNavigate } from "@tanstack/react-router";
|
|
8
|
-
export function PrintersRedirectPage() {
|
|
9
|
-
const navigate = useNavigate();
|
|
10
|
-
useEffect(() => {
|
|
11
|
-
void navigate({ to: "/layouts-printers/printplekken", replace: true });
|
|
12
|
-
}, [navigate]);
|
|
13
|
-
return _jsx("p", { className: "text-muted-foreground p-6 text-sm", children: "Doorsturen naar Printplekken\u2026" });
|
|
14
|
-
}
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
// ============================================================================
|
|
3
|
+
// src/components/PrintersRedirectPage.tsx — oude URL /layouts-printers/printers
|
|
4
|
+
// stuurt door naar de samengevoegde pagina Printplekken.
|
|
5
|
+
// ============================================================================
|
|
6
|
+
import { useEffect } from "react";
|
|
7
|
+
import { useNavigate } from "@tanstack/react-router";
|
|
8
|
+
export function PrintersRedirectPage() {
|
|
9
|
+
const navigate = useNavigate();
|
|
10
|
+
useEffect(() => {
|
|
11
|
+
void navigate({ to: "/layouts-printers/printplekken", replace: true });
|
|
12
|
+
}, [navigate]);
|
|
13
|
+
return _jsx("p", { className: "text-muted-foreground p-6 text-sm", children: "Doorsturen naar Printplekken\u2026" });
|
|
14
|
+
}
|
|
@@ -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,gCA2WlC"}
|