@flowselections/layout-maker 1.45.19 → 1.51.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-lib/components/ComputerVerwijderenDialog.d.ts +16 -0
- package/dist-lib/components/ComputerVerwijderenDialog.d.ts.map +1 -0
- package/dist-lib/components/ComputerVerwijderenDialog.js +38 -0
- package/dist-lib/components/ComputersLijst.d.ts.map +1 -1
- package/dist-lib/components/ComputersLijst.js +5 -2
- package/dist-lib/components/DocumentenPage.d.ts.map +1 -1
- package/dist-lib/components/DocumentenPage.js +2 -3
- package/dist-lib/components/LayoutPrinterSelect.d.ts +3 -5
- package/dist-lib/components/LayoutPrinterSelect.d.ts.map +1 -1
- package/dist-lib/components/LayoutPrinterSelect.js +40 -17
- package/dist-lib/components/LayoutsPage.d.ts.map +1 -1
- package/dist-lib/components/LayoutsPage.js +28 -18
- package/dist-lib/components/PrintQueuePage.d.ts.map +1 -1
- package/dist-lib/components/PrintQueuePage.js +5 -71
- 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 +3 -1
- package/dist-lib/components/PrinterSetupWizard.d.ts.map +1 -1
- package/dist-lib/components/PrinterSetupWizard.js +15 -29
- package/dist-lib/components/PrinterVervangenDialog.d.ts +14 -0
- package/dist-lib/components/PrinterVervangenDialog.d.ts.map +1 -0
- package/dist-lib/components/PrinterVervangenDialog.js +44 -0
- package/dist-lib/components/PrintersPage.d.ts.map +1 -1
- package/dist-lib/components/PrintersPage.js +2 -2
- package/dist-lib/components/PrintplekDetailPage.d.ts.map +1 -1
- package/dist-lib/components/PrintplekDetailPage.js +173 -68
- package/dist-lib/components/PrintplekVerwijderenDialog.d.ts +9 -0
- package/dist-lib/components/PrintplekVerwijderenDialog.d.ts.map +1 -0
- package/dist-lib/components/PrintplekVerwijderenDialog.js +34 -0
- package/dist-lib/components/PrintplekWizard.d.ts.map +1 -1
- package/dist-lib/components/PrintplekWizard.js +3 -85
- package/dist-lib/components/PrintplekkenPage.d.ts.map +1 -1
- package/dist-lib/components/PrintplekkenPage.js +28 -6
- package/dist-lib/components/WerkplekConfiguratiePage.d.ts.map +1 -1
- package/dist-lib/components/WerkplekConfiguratiePage.js +67 -25
- package/dist-lib/index.d.ts +9 -12
- package/dist-lib/index.d.ts.map +1 -1
- package/dist-lib/index.js +7 -13
- package/dist-lib/integrations/supabase/auth-middleware.d.ts +1414 -24
- package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.server.d.ts +1414 -24
- package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/moduleClient.d.ts +1414 -24
- package/dist-lib/integrations/supabase/moduleClient.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/types.d.ts +1471 -42
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/aiLayout.functions.d.ts +1414 -24
- package/dist-lib/lib/aiLayout.functions.d.ts.map +1 -1
- package/dist-lib/lib/documentRoutering.d.ts +2 -1
- package/dist-lib/lib/documentRoutering.d.ts.map +1 -1
- package/dist-lib/lib/documentRoutering.js +5 -8
- package/dist-lib/lib/foutTekst.d.ts +3 -0
- package/dist-lib/lib/foutTekst.d.ts.map +1 -0
- package/dist-lib/lib/foutTekst.js +25 -0
- 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 +13 -60
- 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 +55 -133
- package/dist-lib/lib/printRoutering.d.ts +34 -0
- package/dist-lib/lib/printRoutering.d.ts.map +1 -0
- package/dist-lib/lib/printRoutering.js +69 -0
- package/dist-lib/lib/printService.functions.d.ts +6980 -30
- package/dist-lib/lib/printService.functions.d.ts.map +1 -1
- package/dist-lib/lib/printplekken.d.ts +67 -2
- package/dist-lib/lib/printplekken.d.ts.map +1 -1
- package/dist-lib/lib/printplekken.js +141 -10
- package/dist-lib/lib/useDocumentData.d.ts +15 -10
- package/dist-lib/lib/useDocumentData.d.ts.map +1 -1
- package/dist-lib/lib/useDocumentData.js +43 -34
- package/dist-lib/lib/voorbeeldPrint.d.ts.map +1 -1
- package/dist-lib/lib/voorbeeldPrint.js +7 -39
- package/package.json +2 -2
- 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 -405
- package/dist-lib/lib/pdfMap.d.ts +0 -90
- package/dist-lib/lib/pdfMap.d.ts.map +0 -1
- package/dist-lib/lib/pdfMap.js +0 -349
- 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
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare function ComputerVerwijderenDialog({ open, onOpenChange, computerNaam, printplekId, printers, andereplekken, onKlaar, }: {
|
|
2
|
+
open: boolean;
|
|
3
|
+
onOpenChange: (v: boolean) => void;
|
|
4
|
+
computerNaam: string | null;
|
|
5
|
+
printplekId: string | null;
|
|
6
|
+
printers: {
|
|
7
|
+
id: string;
|
|
8
|
+
naam: string;
|
|
9
|
+
}[];
|
|
10
|
+
andereplekken: {
|
|
11
|
+
id: string;
|
|
12
|
+
naam: string;
|
|
13
|
+
}[];
|
|
14
|
+
onKlaar: () => void;
|
|
15
|
+
}): import("react").JSX.Element;
|
|
16
|
+
//# sourceMappingURL=ComputerVerwijderenDialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ComputerVerwijderenDialog.d.ts","sourceRoot":"","sources":["../../src/components/ComputerVerwijderenDialog.tsx"],"names":[],"mappings":"AAkBA,wBAAgB,yBAAyB,CAAC,EACxC,IAAI,EACJ,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,aAAa,EACb,OAAO,GACR,EAAE;IACD,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACzC,aAAa,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC9C,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,+BAwEA"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
// ============================================================================
|
|
3
|
+
// src/components/ComputerVerwijderenDialog.tsx — een computer "verwijderen"
|
|
4
|
+
// (op de negeerlijst zetten). Hangen er nog printers aan, dan moet eerst
|
|
5
|
+
// gekozen worden: meeverwijderen of verplaatsen. Nooit stil verweesd.
|
|
6
|
+
// ============================================================================
|
|
7
|
+
import { useState } from "react";
|
|
8
|
+
import { Button, Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, toast, } from "@flowselections/core";
|
|
9
|
+
import { negeerComputer } from "../lib/printplekken.js";
|
|
10
|
+
export function ComputerVerwijderenDialog({ open, onOpenChange, computerNaam, printplekId, printers, andereplekken, onKlaar, }) {
|
|
11
|
+
const [keuze, setKeuze] = useState("verwijderen");
|
|
12
|
+
const [bezig, setBezig] = useState(false);
|
|
13
|
+
const metPrinters = printers.length > 0;
|
|
14
|
+
const bevestig = async () => {
|
|
15
|
+
if (!computerNaam)
|
|
16
|
+
return;
|
|
17
|
+
setBezig(true);
|
|
18
|
+
try {
|
|
19
|
+
await negeerComputer(computerNaam, metPrinters
|
|
20
|
+
? {
|
|
21
|
+
printerIds: printers.map((p) => p.id),
|
|
22
|
+
vanPlek: printplekId,
|
|
23
|
+
actie: keuze === "verwijderen" ? "verwijderen" : { naarPlek: keuze },
|
|
24
|
+
}
|
|
25
|
+
: null);
|
|
26
|
+
toast.success(`${computerNaam} verwijderd`);
|
|
27
|
+
onOpenChange(false);
|
|
28
|
+
onKlaar();
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
toast.error("Verwijderen mislukt");
|
|
32
|
+
}
|
|
33
|
+
finally {
|
|
34
|
+
setBezig(false);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(DialogContent, { className: "sm:max-w-lg", children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: "Computer verwijderen" }), _jsxs(DialogDescription, { children: [computerNaam, " verdwijnt van deze plek en uit \"Computers zonder printplek\". Je kunt hem later terugzetten via \"Toon genegeerde computers\"."] })] }), metPrinters ? (_jsxs("div", { className: "space-y-3 text-sm", children: [_jsxs("p", { children: ["Aan deze computer hangen nog ", printers.length, " printer(s):", " ", _jsx("strong", { children: printers.map((p) => p.naam).join(", ") }), ". Wat moet ermee gebeuren?"] }), _jsxs("label", { className: "flex items-center gap-2", children: [_jsx("input", { type: "radio", checked: keuze === "verwijderen", onChange: () => setKeuze("verwijderen") }), "Printers meeverwijderen van deze plek (regels worden zichtbaar leeg gemarkeerd)"] }), andereplekken.map((p) => (_jsxs("label", { className: "flex items-center gap-2", children: [_jsx("input", { type: "radio", checked: keuze === p.id, onChange: () => setKeuze(p.id) }), "Printers verplaatsen naar ", p.naam] }, p.id)))] })) : null, _jsxs("div", { className: "flex justify-end gap-2", children: [_jsx(Button, { variant: "outline", onClick: () => onOpenChange(false), children: "Annuleren" }), _jsx(Button, { variant: "destructive", disabled: bezig, onClick: () => void bevestig(), children: "Verwijderen" })] })] }) }));
|
|
38
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComputersLijst.d.ts","sourceRoot":"","sources":["../../src/components/ComputersLijst.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ComputersLijst.d.ts","sourceRoot":"","sources":["../../src/components/ComputersLijst.tsx"],"names":[],"mappings":"AAqBA,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,6DAA6D;IAC7D,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,YAAY;;;;;EAiD3B;AAED,wBAAgB,cAAc,CAAC,EAC7B,SAAS,EACT,OAAO,EACP,IAAI,EACJ,UAAU,EACV,mBAAmB,EACnB,aAAa,EACb,qBAAqB,EACrB,YAAoB,GACrB,EAAE;IACD,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,mBAAmB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,aAAa,EAAE,OAAO,CAAC;IACvB,qBAAqB,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5C,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,+BA0IA"}
|
|
@@ -8,6 +8,7 @@ import { Button, Card, CardContent, Dialog, DialogContent, DialogDescription, Di
|
|
|
8
8
|
import { Loader2, Monitor, Plus, RefreshCw } from "lucide-react";
|
|
9
9
|
import { netwerkComputers, netwerkPrinters } from "../lib/printService.functions.js";
|
|
10
10
|
import { PrintProgrammaUitleg, WerktHetNiet } from "./PrintProgrammaUitleg.js";
|
|
11
|
+
import { genegeerdeComputersLijst } from "../lib/printplekken.js";
|
|
11
12
|
export function useComputers() {
|
|
12
13
|
const [computers, setComputers] = useState([]);
|
|
13
14
|
const [loading, setLoading] = useState(true);
|
|
@@ -17,12 +18,14 @@ export function useComputers() {
|
|
|
17
18
|
setLoading(true);
|
|
18
19
|
setFout(null);
|
|
19
20
|
try {
|
|
20
|
-
const [c, p] = await Promise.all([
|
|
21
|
+
const [c, p, g] = await Promise.all([
|
|
21
22
|
netwerkComputers({ data: undefined }),
|
|
22
23
|
netwerkPrinters({ data: undefined }),
|
|
24
|
+
genegeerdeComputersLijst().catch(() => []),
|
|
23
25
|
]);
|
|
24
26
|
const printers = p.ok && Array.isArray(p.printers) ? p.printers : [];
|
|
25
|
-
const
|
|
27
|
+
const genegeerd = new Set((Array.isArray(g) ? g : []).map((x) => x.computer_naam));
|
|
28
|
+
const lijst = (c.ok && Array.isArray(c.computers) ? c.computers : []).filter((comp) => !genegeerd.has(comp.naam));
|
|
26
29
|
if (!c.ok)
|
|
27
30
|
setFout(c.fout);
|
|
28
31
|
setComputers(lijst.map((comp) => ({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DocumentenPage.d.ts","sourceRoot":"","sources":["../../src/components/DocumentenPage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"DocumentenPage.d.ts","sourceRoot":"","sources":["../../src/components/DocumentenPage.tsx"],"names":[],"mappings":"AAgBA,wBAAgB,cAAc,CAAC,EAAE,GAAe,EAAE,EAAE;IAAE,GAAG,CAAC,EAAE,SAAS,GAAG,OAAO,CAAA;CAAE,+BAgBhF"}
|
|
@@ -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/DocumentenPage.tsx — één menu-item "Documenten" met tabbladen
|
|
4
4
|
// voor de documentontwerpen en de logobibliotheek.
|
|
@@ -8,12 +8,11 @@ import { FileText, Image } from "lucide-react";
|
|
|
8
8
|
import { ModuleTabs } from "./ModuleTabs.js";
|
|
9
9
|
import { LayoutsPage } from "./LayoutsPage.js";
|
|
10
10
|
import { LogosPage } from "./LogosPage.js";
|
|
11
|
-
import { PdfMapAutoSaver } from "./PdfMapAutoSaver.js";
|
|
12
11
|
const TABS = [
|
|
13
12
|
{ id: "layouts", label: "Documenten", icon: FileText },
|
|
14
13
|
{ id: "logos", label: "Logo's", icon: Image },
|
|
15
14
|
];
|
|
16
15
|
export function DocumentenPage({ tab = "layouts" }) {
|
|
17
16
|
const [actiefTab, setActiefTab] = useState(tab);
|
|
18
|
-
return (
|
|
17
|
+
return (_jsx(_Fragment, { children: _jsx(ModuleTabs, { titel: "Documenten", omschrijving: "Ontwerp pakbonnen, facturen, stickers en beheer de logo's die daarop staan.", tabs: TABS, actiefTab: actiefTab, onTabWijzig: (nieuwTab) => setActiefTab(nieuwTab === "logos" ? "logos" : "layouts"), children: actiefTab === "logos" ? _jsx(LogosPage, { ingebed: true }) : _jsx(LayoutsPage, { ingebed: true }) }) }));
|
|
19
18
|
}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
* Printerkeuze voor één layout (zelfde koppeling als de kolom op de
|
|
3
|
-
* Documenten-pagina). Compact, bedoeld voor de header van de builders.
|
|
4
|
-
*/
|
|
5
|
-
export declare function LayoutPrinterSelect({ layoutId }: {
|
|
1
|
+
export declare function LayoutPrinterSelect({ layoutId, documenttype, metLink, }: {
|
|
6
2
|
layoutId: string;
|
|
3
|
+
documenttype?: string;
|
|
4
|
+
metLink?: boolean;
|
|
7
5
|
}): import("react").JSX.Element;
|
|
8
6
|
//# sourceMappingURL=LayoutPrinterSelect.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LayoutPrinterSelect.d.ts","sourceRoot":"","sources":["../../src/components/LayoutPrinterSelect.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"LayoutPrinterSelect.d.ts","sourceRoot":"","sources":["../../src/components/LayoutPrinterSelect.tsx"],"names":[],"mappings":"AAOA,wBAAgB,mBAAmB,CAAC,EAClC,QAAQ,EACR,YAAY,EACZ,OAAc,GACf,EAAE;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,+BA+CA"}
|
|
@@ -1,23 +1,46 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
export function LayoutPrinterSelect({ layoutId }) {
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
2
|
+
// Alleen-lezen: welke printer geldt nu voor het documenttype van deze layout.
|
|
3
|
+
// Printers kies je uitsluitend op de Printen-pagina (printplek of standaardregel).
|
|
4
|
+
import { useEffect, useState } from "react";
|
|
5
|
+
import { Link } from "@tanstack/react-router";
|
|
6
|
+
import { supabase } from "../lib/supabaseClient.js";
|
|
7
|
+
import { routeringVoor } from "../lib/printRoutering.js";
|
|
8
|
+
export function LayoutPrinterSelect({ layoutId, documenttype, metLink = true, }) {
|
|
9
|
+
const [tekst, setTekst] = useState("…");
|
|
10
|
+
useEffect(() => {
|
|
11
|
+
let weg = false;
|
|
12
|
+
void (async () => {
|
|
12
13
|
try {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
let type = documenttype;
|
|
15
|
+
if (!type) {
|
|
16
|
+
const { data } = await supabase
|
|
17
|
+
.from("document_layouts")
|
|
18
|
+
.select("documenttype")
|
|
19
|
+
.eq("id", layoutId)
|
|
20
|
+
.maybeSingle();
|
|
21
|
+
type = data?.documenttype ?? "";
|
|
22
|
+
}
|
|
23
|
+
if (!type)
|
|
24
|
+
return setTekst("Geen printer");
|
|
25
|
+
const u = await routeringVoor({ documenttype: type, layoutId });
|
|
26
|
+
if (!u.printer_id)
|
|
27
|
+
return !weg && setTekst("Geen printer ingesteld");
|
|
28
|
+
const { data: p } = await supabase
|
|
29
|
+
.from("printers")
|
|
30
|
+
.select("naam")
|
|
31
|
+
.eq("id", u.printer_id)
|
|
32
|
+
.maybeSingle();
|
|
33
|
+
if (!weg)
|
|
34
|
+
setTekst(p?.naam ?? "Onbekende printer");
|
|
16
35
|
}
|
|
17
36
|
catch {
|
|
18
|
-
|
|
37
|
+
if (!weg)
|
|
38
|
+
setTekst("Onbekend");
|
|
19
39
|
}
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
|
|
40
|
+
})();
|
|
41
|
+
return () => {
|
|
42
|
+
weg = true;
|
|
43
|
+
};
|
|
44
|
+
}, [layoutId, documenttype]);
|
|
45
|
+
return (_jsxs("div", { className: "text-sm", children: [_jsx("span", { children: tekst }), metLink && (_jsx(Link, { to: "/layouts-printers/printplekken", className: "ml-2 text-xs text-primary underline", children: "Wijzigen op Printen" }))] }));
|
|
23
46
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LayoutsPage.d.ts","sourceRoot":"","sources":["../../src/components/LayoutsPage.tsx"],"names":[],"mappings":"AA2EA,wBAAgB,WAAW,CAAC,EAAE,OAAe,EAAE,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,+
|
|
1
|
+
{"version":3,"file":"LayoutsPage.d.ts","sourceRoot":"","sources":["../../src/components/LayoutsPage.tsx"],"names":[],"mappings":"AA2EA,wBAAgB,WAAW,CAAC,EAAE,OAAe,EAAE,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,+BAkpB1E"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import { useMemo, useState } from "react";
|
|
3
3
|
import { useAutoRefresh } from "../lib/useAutoRefresh.js";
|
|
4
|
-
import { useNavigate } from "@tanstack/react-router";
|
|
4
|
+
import { Link, useNavigate } from "@tanstack/react-router";
|
|
5
5
|
import { Badge, Button, Card, CardContent, CardDescription, CardHeader, CardTitle, Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, Input, Label, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Separator, Switch, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, Textarea, toast, } from "@flowselections/core";
|
|
6
|
-
import { Copy, FileText, Pencil, Plus, Search, Settings2, Trash2 } from "lucide-react";
|
|
7
|
-
import {
|
|
6
|
+
import { AlertTriangle, Copy, FileText, Pencil, Plus, Search, Settings2, Trash2 } from "lucide-react";
|
|
7
|
+
import { layoutConflicten, maakStandaardLayout } from "../lib/useDocumentData.js";
|
|
8
|
+
import { dupliceerLayout, maakLayout, updateLayout, useLayouts, verwijderLayout, } from "../lib/useDocumentData.js";
|
|
9
|
+
import { LayoutPrinterSelect } from "./LayoutPrinterSelect.js";
|
|
8
10
|
import { DOCUMENT_TYPES, FLORIDAY_LAYOUT_TOELICHTING, PAPIERFORMATEN, documentTypeLabel, isFloridayLayout, } from "../lib/documentTypes.js";
|
|
9
11
|
import { DOCUMENT_PROFIELEN, documentProfiel, primaireProfielen, standaardConfig, } from "../lib/documentProfiles.js";
|
|
10
12
|
/** Elk documenttype krijgt zijn eigen opbouwpagina. */
|
|
@@ -23,10 +25,9 @@ function klantOntwerpLayout(l) {
|
|
|
23
25
|
}
|
|
24
26
|
export function LayoutsPage({ ingebed = false } = {}) {
|
|
25
27
|
const { layouts, loading, reload } = useLayouts();
|
|
26
|
-
const
|
|
28
|
+
const conflicten = useMemo(() => layoutConflicten(layouts), [layouts]);
|
|
27
29
|
useAutoRefresh(() => {
|
|
28
30
|
void reload(true);
|
|
29
|
-
void reloadPrinters(true);
|
|
30
31
|
}, 30000);
|
|
31
32
|
const navigate = useNavigate();
|
|
32
33
|
const [zoek, setZoek] = useState("");
|
|
@@ -155,19 +156,28 @@ export function LayoutsPage({ ingebed = false } = {}) {
|
|
|
155
156
|
}
|
|
156
157
|
};
|
|
157
158
|
const Wrapper = ingebed ? "div" : "main";
|
|
158
|
-
return (_jsxs(Wrapper, { className: ingebed ? "space-y-6" : "p-6 space-y-6", children: [_jsxs("div", { className: "flex flex-wrap items-end justify-between gap-4", children: [!ingebed && (_jsxs("div", { children: [_jsx("h1", { className: "text-xl font-semibold", children: "Documentlayouts" }), _jsx("p", { className: "text-sm text-muted-foreground", children: "Ontwerp pakbonnen, facturen, etiketten en alle andere documenten." })] })), _jsx("div", { className: "ml-auto flex gap-2", children: _jsxs(Button, { onClick: () => setWizardOpen(true), children: [_jsx(Plus, { className: "mr-2 h-4 w-4" }), " Nieuwe layout"] }) })] }),
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
159
|
+
return (_jsxs(Wrapper, { className: ingebed ? "space-y-6" : "p-6 space-y-6", children: [_jsxs("div", { className: "flex flex-wrap items-end justify-between gap-4", children: [!ingebed && (_jsxs("div", { children: [_jsx("h1", { className: "text-xl font-semibold", children: "Documentlayouts" }), _jsx("p", { className: "text-sm text-muted-foreground", children: "Ontwerp pakbonnen, facturen, etiketten en alle andere documenten." })] })), _jsx("div", { className: "ml-auto flex gap-2", children: _jsxs(Button, { onClick: () => setWizardOpen(true), children: [_jsx(Plus, { className: "mr-2 h-4 w-4" }), " Nieuwe layout"] }) })] }), conflicten.length > 0 && (_jsxs(Card, { className: "border-destructive/50", children: [_jsxs(CardHeader, { className: "pb-2", children: [_jsxs(CardTitle, { className: "flex items-center gap-2 text-base", children: [_jsx(AlertTriangle, { className: "h-4 w-4 text-destructive" }), " Meerdere actieve layouts"] }), _jsx(CardDescription, { children: "Bij het printen wint per documentsoort \u00E9\u00E9n layout. De andere worden alleen gebruikt als een module ze expliciet kiest." })] }), _jsx(CardContent, { className: "space-y-2", children: conflicten.map((c) => (_jsxs("div", { className: "rounded-lg border p-2 text-sm", "data-conflict": c.documenttype, children: [_jsxs("div", { className: "font-medium", children: [documentTypeLabel(c.documenttype), " (", c.bron === "floriday" ? "Floriday" : "eigen", ") \u2014 ", c.actief.length, " actief"] }), _jsxs("div", { className: "text-muted-foreground text-xs", children: ["Wint bij printen: ", _jsx("span", { className: "font-medium text-foreground", children: c.winnaar.naam }), c.heeftStandaard ? " (standaard)" : " — geen standaard, de laatst bewerkte wint"] }), _jsx("div", { className: "mt-1 flex flex-wrap gap-2", children: c.actief.filter((l) => l.id !== c.winnaar.id || !c.heeftStandaard).map((l) => (_jsxs(Button, { size: "sm", variant: "outline", onClick: async () => {
|
|
160
|
+
try {
|
|
161
|
+
await maakStandaardLayout(l.id);
|
|
162
|
+
toast.success(`${l.naam} is nu de standaard`);
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
toast.error("Standaard maken mislukt");
|
|
166
|
+
}
|
|
167
|
+
void reload();
|
|
168
|
+
}, children: ["Maak \"", l.naam, "\" standaard"] }, l.id))) })] }, `${c.documenttype}-${c.bron}`))) })] })), _jsxs(Card, { children: [_jsxs(CardHeader, { className: "pb-3", children: [_jsx(CardTitle, { className: "text-base", children: "Overzicht" }), _jsx(CardDescription, { children: loading ? "Laden…" : `${gefilterd.length} van ${layouts.length} layouts` })] }), _jsxs(CardContent, { className: "space-y-4", children: [_jsxs("div", { className: "grid gap-3 md:grid-cols-5", children: [_jsxs("div", { className: "relative md:col-span-2", children: [_jsx(Search, { className: "absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" }), _jsx(Input, { className: "pl-9", placeholder: "Zoek op naam of omschrijving", value: zoek, onChange: (e) => setZoek(e.target.value) })] }), _jsxs(Select, { value: typeFilter, onValueChange: setTypeFilter, children: [_jsx(SelectTrigger, { children: _jsx(SelectValue, { placeholder: "Documenttype" }) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "alle", children: "Alle documenttypes" }), DOCUMENT_TYPES.map((d) => (_jsx(SelectItem, { value: d.value, children: d.label }, d.value)))] })] }), _jsxs(Select, { value: statusFilter, onValueChange: setStatusFilter, children: [_jsx(SelectTrigger, { children: _jsx(SelectValue, { placeholder: "Status" }) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "alle", children: "Alle statussen" }), _jsx(SelectItem, { value: "actief", children: "Actief" }), _jsx(SelectItem, { value: "inactief", children: "Inactief" })] })] }), _jsxs(Select, { value: bronFilter, onValueChange: setBronFilter, children: [_jsx(SelectTrigger, { children: _jsx(SelectValue, { placeholder: "Herkomst" }) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "alle", children: "Alle herkomsten" }), _jsx(SelectItem, { value: "eigen", children: "Eigen ontwerp" }), _jsx(SelectItem, { value: "floriday", children: "Uit Floriday" })] })] })] }), _jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: "Naam" }), _jsx(TableHead, { children: "Documenttype" }), _jsx(TableHead, { children: "Formaat" }), _jsxs(TableHead, { children: [_jsx("div", { children: "Printer nu" }), _jsxs("div", { className: "text-xs font-normal", children: ["bedrijfsstandaard, in te stellen op", " ", _jsx(Link, { to: "/layouts-printers/printplekken", className: "text-primary underline", children: "Printen" })] })] }), _jsx(TableHead, { children: "Actief" }), _jsx(TableHead, { className: "text-right", children: "Acties" })] }) }), _jsxs(TableBody, { children: [gefilterd.length === 0 && (_jsx(TableRow, { children: _jsx(TableCell, { colSpan: 6, className: "py-10 text-center text-sm text-muted-foreground", children: "Geen layouts gevonden." }) })), gefilterd.map((l) => (_jsxs(TableRow, { children: [_jsxs(TableCell, { children: [_jsxs("div", { className: "flex items-center gap-2 font-medium", children: [_jsx(FileText, { className: "h-4 w-4 text-muted-foreground" }), l.naam, l.is_standaard && _jsx(Badge, { variant: "secondary", children: "Standaard" }), isFloridayLayout(l) && _jsx(Badge, { variant: "outline", children: "Uit Floriday" })] }), (l.omschrijving || isFloridayLayout(l)) && (_jsx("span", { className: "text-xs text-muted-foreground", children: isFloridayLayout(l) ? FLORIDAY_LAYOUT_TOELICHTING : l.omschrijving }))] }), _jsx(TableCell, { children: documentTypeLabel(l.documenttype) }), _jsxs(TableCell, { className: "text-sm text-muted-foreground", children: [l.papierformaat, " \u00B7 ", Number(l.breedte_mm), " \u00D7 ", Number(l.hoogte_mm), " mm"] }), _jsx(TableCell, { className: "min-w-52", children: _jsx(LayoutPrinterSelect, { layoutId: l.id, documenttype: l.documenttype }) }), _jsx(TableCell, { children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Switch, { checked: l.actief, onCheckedChange: async (v) => {
|
|
169
|
+
await updateLayout(l.id, { actief: v });
|
|
170
|
+
void reload();
|
|
171
|
+
} }), !l.is_standaard && (_jsx(Button, { variant: "ghost", size: "sm", onClick: async () => {
|
|
172
|
+
try {
|
|
173
|
+
await maakStandaardLayout(l.id);
|
|
174
|
+
toast.success(`${l.naam} is nu de standaard`);
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
toast.error("Standaard maken mislukt");
|
|
178
|
+
}
|
|
179
|
+
void reload();
|
|
180
|
+
}, children: "Maak standaard" }))] }) }), _jsx(TableCell, { className: "text-right", children: _jsxs("div", { className: "flex justify-end gap-1", children: [isFloridayLayout(l) ? (_jsx("span", { className: "text-xs text-muted-foreground", children: "Niet aanpasbaar \u2014 komt uit Floriday" })) : klantOntwerpLayout(l) ? (_jsx(Badge, { variant: "outline", children: "Ontwerp van klant" })) : (_jsxs(Button, { variant: "ghost", size: "sm", onClick: () => navigate(builderRoute(l.documenttype, l.id)), children: [_jsx(Pencil, { className: "mr-2 h-4 w-4" }), " Ontwerpen"] })), !isFloridayLayout(l) && (_jsx(Button, { variant: "ghost", size: "sm", title: "Naam, documenttype en formaat wijzigen", onClick: () => openBewerken(l), children: _jsx(Settings2, { className: "h-4 w-4" }) })), !isFloridayLayout(l) && (_jsx(Button, { variant: "ghost", size: "sm", title: "Kopie maken", onClick: async () => {
|
|
171
181
|
try {
|
|
172
182
|
await dupliceerLayout(l.id);
|
|
173
183
|
toast.success("Layout gedupliceerd");
|
|
@@ -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
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,45 +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);
|
|
59
53
|
const [annuleertAlles, setAnnuleertAlles] = useState(false);
|
|
60
54
|
const openJobs = useMemo(() => jobs.filter((j) => j.status === "wachtend" || j.status === "bezig"), [jobs]);
|
|
61
55
|
const plekNamen = usePrintPlekNamen();
|
|
62
56
|
const printerNaam = useMemo(() => new Map(printers.map((p) => [p.id, p.naam])), [printers]);
|
|
63
|
-
const pdfPrinter = printers.find((p) => p.afdrukmethode === "pdf");
|
|
64
|
-
/** Kies direct vanuit een foute opdracht de PDF-map op deze werkplek. */
|
|
65
|
-
const stelMapIn = async (printplekId) => {
|
|
66
|
-
if (!pdfPrinter) {
|
|
67
|
-
toast.error("Er is nog geen “Opslaan als PDF”-printer aangemaakt");
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
const uitkomst = await kiesPdfMap(pdfPrinter.id, printplekId);
|
|
71
|
-
if (uitkomst.status === "gekozen") {
|
|
72
|
-
toast.success("Map gekozen", {
|
|
73
|
-
description: `PDF's worden opgeslagen in “${uitkomst.naam}”. De opdracht wordt opnieuw opgeslagen.`,
|
|
74
|
-
});
|
|
75
|
-
void reload(true);
|
|
76
|
-
}
|
|
77
|
-
else if (uitkomst.status === "iframe-geblokkeerd") {
|
|
78
|
-
toast.error("Map kiezen werkt niet in een iframe", {
|
|
79
|
-
description: "Open de app in een eigen tabblad.",
|
|
80
|
-
action: {
|
|
81
|
-
label: "Open in eigen tabblad",
|
|
82
|
-
onClick: () => openInEigenTabblad(printplekId),
|
|
83
|
-
},
|
|
84
|
-
duration: 15000,
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
else if (uitkomst.status === "niet-ondersteund") {
|
|
88
|
-
toast.error("Deze browser ondersteunt geen mapkeuze", {
|
|
89
|
-
description: "Gebruik Chrome, Edge of Safari op desktop.",
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
else if (uitkomst.status === "fout") {
|
|
93
|
-
toast.error("Map kiezen is mislukt", { description: uitkomst.melding });
|
|
94
|
-
}
|
|
95
|
-
};
|
|
96
57
|
const layoutNaam = useMemo(() => new Map(layouts.map((l) => [l.id, l.naam])), [layouts]);
|
|
97
58
|
/** Herkomstlabel per opdracht: printplek, anders pickstation of werkplek. */
|
|
98
59
|
const plekPerJob = useMemo(() => {
|
|
@@ -110,13 +71,6 @@ export function PrintQueuePage() {
|
|
|
110
71
|
return false;
|
|
111
72
|
if (plekFilter !== "alle" && (plekPerJob.get(j.id) || "—") !== plekFilter)
|
|
112
73
|
return false;
|
|
113
|
-
if (opslagFilter === "fout" && !isOpslagFout(j.lokale_pdf_status))
|
|
114
|
-
return false;
|
|
115
|
-
if (opslagFilter === "opgeslagen" && j.lokale_pdf_status !== "opgeslagen")
|
|
116
|
-
return false;
|
|
117
|
-
if (opslagFilter === "wacht" &&
|
|
118
|
-
!["wachtend", "genereren", "gereed", "bezig"].includes(j.lokale_pdf_status ?? ""))
|
|
119
|
-
return false;
|
|
120
74
|
return true;
|
|
121
75
|
});
|
|
122
76
|
const tellingen = useMemo(() => {
|
|
@@ -156,7 +110,7 @@ export function PrintQueuePage() {
|
|
|
156
110
|
await reload(true);
|
|
157
111
|
};
|
|
158
112
|
const bijgewerkt = useAutoRefresh(ronde, lopende ? 5000 : 20000);
|
|
159
|
-
return (_jsxs("main", { className: "space-y-6 p-6", children: [
|
|
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 () => {
|
|
160
114
|
setAnnuleertAlles(true);
|
|
161
115
|
try {
|
|
162
116
|
const resultaat = await annuleerPrintOpdrachten({
|
|
@@ -179,31 +133,11 @@ export function PrintQueuePage() {
|
|
|
179
133
|
setAnnuleertAlles(false);
|
|
180
134
|
await reload(true);
|
|
181
135
|
}
|
|
182
|
-
}, 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-
|
|
183
|
-
(j.lokale_pdf_status === "gereed" && !j.lokale_pdf_print_plek_id)) && (_jsxs(Button, { variant: "outline", size: "sm", className: "mt-1", onClick: () => void stelMapIn(jobPrintPlekId(j) || undefined), children: [_jsx(FolderOpen, { className: "mr-2 h-4 w-4" }), " Map instellen"] }))] }), _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
|
|
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
|
|
184
137
|
? layoutNaam.get(j.gebruikte_layout_id) ?? "Onbekende layout"
|
|
185
138
|
: j.gebruikte_bron
|
|
186
139
|
? "geen layout"
|
|
187
|
-
: "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:
|
|
188
|
-
try {
|
|
189
|
-
await downloadPdfJob(j.id, j.documentnaam ?? "document");
|
|
190
|
-
}
|
|
191
|
-
catch (fout) {
|
|
192
|
-
toast.error(fout instanceof Error ? fout.message : "PDF downloaden mislukt");
|
|
193
|
-
}
|
|
194
|
-
}, children: [_jsx(FileDown, { className: "mr-2 h-4 w-4" }), " PDF"] })), j.lokale_pdf_status !== "opgeslagen" &&
|
|
195
|
-
(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 () => {
|
|
196
|
-
try {
|
|
197
|
-
await bewaarPdfJobOpnieuw(j.id);
|
|
198
|
-
toast.success("De bestaande PDF wordt opnieuw in de ingestelde map opgeslagen");
|
|
199
|
-
}
|
|
200
|
-
catch (fout) {
|
|
201
|
-
toast.error(fout instanceof Error ? fout.message : "Opnieuw opslaan mislukt");
|
|
202
|
-
}
|
|
203
|
-
finally {
|
|
204
|
-
void reload(true);
|
|
205
|
-
}
|
|
206
|
-
}, 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 () => {
|
|
207
141
|
if (!j.layout_id)
|
|
208
142
|
return;
|
|
209
143
|
try {
|
|
@@ -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
|
}
|
|
@@ -4,11 +4,13 @@ export interface BewerkPrinter {
|
|
|
4
4
|
locatie: string | null;
|
|
5
5
|
papierformaat: string | null;
|
|
6
6
|
}
|
|
7
|
-
export declare function PrinterSetupWizard({ open, onOpenChange, onKlaar, computerFilter, bekendeExterneIds, bekendeLocaties, bewerken, }: {
|
|
7
|
+
export declare function PrinterSetupWizard({ open, onOpenChange, onKlaar, computerFilter, bekendeExterneIds, bekendeLocaties, bewerken, printPlekId, }: {
|
|
8
8
|
open: boolean;
|
|
9
9
|
onOpenChange: (v: boolean) => void;
|
|
10
10
|
onKlaar?: () => void;
|
|
11
11
|
computerFilter?: string | null;
|
|
12
|
+
/** Nieuwe printers worden direct aan deze printplek gekoppeld. */
|
|
13
|
+
printPlekId?: string | null;
|
|
12
14
|
bekendeExterneIds?: string[];
|
|
13
15
|
bekendeLocaties?: string[];
|
|
14
16
|
bewerken?: BewerkPrinter | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PrinterSetupWizard.d.ts","sourceRoot":"","sources":["../../src/components/PrinterSetupWizard.tsx"],"names":[],"mappings":"AAoDA,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAwCD,wBAAgB,kBAAkB,CAAC,EACjC,IAAI,EACJ,YAAY,EACZ,OAAO,EACP,cAAc,EACd,iBAAsB,EACtB,eAAoB,EACpB,QAAQ,
|
|
1
|
+
{"version":3,"file":"PrinterSetupWizard.d.ts","sourceRoot":"","sources":["../../src/components/PrinterSetupWizard.tsx"],"names":[],"mappings":"AAoDA,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAwCD,wBAAgB,kBAAkB,CAAC,EACjC,IAAI,EACJ,YAAY,EACZ,OAAO,EACP,cAAc,EACd,iBAAsB,EACtB,eAAoB,EACpB,QAAQ,EACR,WAAW,GACZ,EAAE;IACD,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,kEAAkE;IAClE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;CACjC,+BAodA"}
|