@flowselections/layout-maker 1.13.2 → 1.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-lib/components/AfdrukKnop.d.ts +5 -0
- package/dist-lib/components/AfdrukKnop.d.ts.map +1 -1
- package/dist-lib/components/AfdrukKnop.js +5 -0
- package/dist-lib/components/DocumentRouteringPage.d.ts +3 -1
- package/dist-lib/components/DocumentRouteringPage.d.ts.map +1 -1
- package/dist-lib/components/DocumentRouteringPage.js +66 -64
- package/dist-lib/components/DocumentenPage.d.ts +4 -0
- package/dist-lib/components/DocumentenPage.d.ts.map +1 -0
- package/dist-lib/components/DocumentenPage.js +16 -0
- package/dist-lib/components/LayoutsPage.d.ts +3 -1
- package/dist-lib/components/LayoutsPage.d.ts.map +1 -1
- package/dist-lib/components/LayoutsPage.js +3 -2
- package/dist-lib/components/LayoutsPrintersTabPage.d.ts +2 -0
- package/dist-lib/components/LayoutsPrintersTabPage.d.ts.map +1 -0
- package/dist-lib/components/LayoutsPrintersTabPage.js +32 -0
- package/dist-lib/components/LogosPage.d.ts +3 -1
- package/dist-lib/components/LogosPage.d.ts.map +1 -1
- package/dist-lib/components/LogosPage.js +3 -2
- package/dist-lib/components/ModuleTabs.d.ts +19 -0
- package/dist-lib/components/ModuleTabs.d.ts.map +1 -0
- package/dist-lib/components/ModuleTabs.js +17 -0
- package/dist-lib/components/PakbonBuilderPage.d.ts.map +1 -1
- package/dist-lib/components/PakbonBuilderPage.js +30 -4
- package/dist-lib/components/PrintQueuePage.d.ts.map +1 -1
- package/dist-lib/components/PrintQueuePage.js +15 -2
- package/dist-lib/components/PrintenPage.d.ts +4 -0
- package/dist-lib/components/PrintenPage.d.ts.map +1 -0
- package/dist-lib/components/PrintenPage.js +21 -0
- package/dist-lib/components/PrinterSetupWizard.js +3 -3
- package/dist-lib/components/PrintersPage.d.ts +3 -1
- package/dist-lib/components/PrintersPage.d.ts.map +1 -1
- package/dist-lib/components/PrintersPage.js +20 -38
- package/dist-lib/components/PrintersRedirectPage.d.ts +2 -0
- package/dist-lib/components/PrintersRedirectPage.d.ts.map +1 -0
- package/dist-lib/components/PrintersRedirectPage.js +14 -0
- package/dist-lib/components/PrintplekDetailPage.d.ts +2 -0
- package/dist-lib/components/PrintplekDetailPage.d.ts.map +1 -0
- package/dist-lib/components/PrintplekDetailPage.js +93 -0
- package/dist-lib/components/PrintplekWizard.d.ts +8 -0
- package/dist-lib/components/PrintplekWizard.d.ts.map +1 -0
- package/dist-lib/components/PrintplekWizard.js +194 -0
- package/dist-lib/components/PrintplekkenPage.d.ts +4 -0
- package/dist-lib/components/PrintplekkenPage.d.ts.map +1 -0
- package/dist-lib/components/PrintplekkenPage.js +110 -0
- package/dist-lib/index.d.ts +15 -1
- package/dist-lib/index.d.ts.map +1 -1
- package/dist-lib/index.js +16 -7
- package/dist-lib/integrations/supabase/auth-middleware.d.ts +371 -0
- package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.server.d.ts +371 -0
- package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/types.d.ts +378 -0
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/aiLayout.functions.d.ts +371 -0
- package/dist-lib/lib/aiLayout.functions.d.ts.map +1 -1
- package/dist-lib/lib/browserPrint.d.ts +4 -0
- package/dist-lib/lib/browserPrint.d.ts.map +1 -1
- package/dist-lib/lib/browserPrint.js +4 -0
- package/dist-lib/lib/pakbonHtml.d.ts +5 -2
- package/dist-lib/lib/pakbonHtml.d.ts.map +1 -1
- package/dist-lib/lib/pakbonHtml.js +5 -2
- package/dist-lib/lib/printApi.d.ts +23 -7
- package/dist-lib/lib/printApi.d.ts.map +1 -1
- package/dist-lib/lib/printApi.js +51 -15
- package/dist-lib/lib/printQueue.d.ts +28 -0
- package/dist-lib/lib/printQueue.d.ts.map +1 -0
- package/dist-lib/lib/printQueue.js +70 -0
- package/dist-lib/lib/printQueue.server.d.ts.map +1 -1
- package/dist-lib/lib/printQueue.server.js +141 -18
- package/dist-lib/lib/printService.functions.d.ts +1484 -0
- package/dist-lib/lib/printService.functions.d.ts.map +1 -1
- package/dist-lib/lib/printplekWizard.d.ts +57 -0
- package/dist-lib/lib/printplekWizard.d.ts.map +1 -0
- package/dist-lib/lib/printplekWizard.js +87 -0
- package/dist-lib/lib/printplekken.d.ts +90 -0
- package/dist-lib/lib/printplekken.d.ts.map +1 -0
- package/dist-lib/lib/printplekken.js +244 -0
- package/dist-lib/lib/testpagina.d.ts.map +1 -1
- package/dist-lib/lib/testpagina.js +5 -5
- package/dist-lib/lib/useDocumentData.d.ts +6 -0
- package/dist-lib/lib/useDocumentData.d.ts.map +1 -1
- package/dist-lib/lib/useDocumentData.js +31 -0
- package/package.json +14 -14
|
@@ -0,0 +1 @@
|
|
|
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,+BAUA"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
// ============================================================================
|
|
3
|
+
// src/components/PrintenPage.tsx — één menu-item "Printen" met tabbladen voor
|
|
4
|
+
// printplekken (plekken, computers en printers samen) en standaardregels.
|
|
5
|
+
// ============================================================================
|
|
6
|
+
import { MapPin, Route as RouteIcon } from "lucide-react";
|
|
7
|
+
import { ModuleTabs } from "./ModuleTabs.js";
|
|
8
|
+
import { PrintplekkenPage } from "./PrintplekkenPage.js";
|
|
9
|
+
import { DocumentRouteringPage } from "./DocumentRouteringPage.js";
|
|
10
|
+
const TABS = [
|
|
11
|
+
{
|
|
12
|
+
label: "Printplekken",
|
|
13
|
+
href: "/layouts-printers/printplekken",
|
|
14
|
+
icon: MapPin,
|
|
15
|
+
ook: ["/layouts-printers/printers"],
|
|
16
|
+
},
|
|
17
|
+
{ label: "Standaardregels", href: "/layouts-printers/routering", icon: RouteIcon },
|
|
18
|
+
];
|
|
19
|
+
export function PrintenPage({ tab = "printplekken", }) {
|
|
20
|
+
return (_jsx(ModuleTabs, { titel: "Printen", omschrijving: "Stel per plek in het bedrijf in welke computers, printers en documenten daar horen.", tabs: TABS, children: tab === "routering" ? _jsx(DocumentRouteringPage, { ingebed: true }) : _jsx(PrintplekkenPage, { ingebed: true }) }));
|
|
21
|
+
}
|
|
@@ -7,7 +7,6 @@ import { useCallback, useEffect, useMemo, useState } from "react";
|
|
|
7
7
|
import { Button, Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, Input, Label, toast, } from "@flowselections/core";
|
|
8
8
|
import { Check, CheckCircle2, FileText, Loader2, Printer, RefreshCw, Search, Tag, } from "lucide-react";
|
|
9
9
|
import { supabase } from "../lib/supabaseClient.js";
|
|
10
|
-
import { drukAf } from "../lib/browserPrint.js";
|
|
11
10
|
import { printDirect } from "../lib/directPrint.js";
|
|
12
11
|
import { netwerkPrinters } from "../lib/printService.functions.js";
|
|
13
12
|
import { PrintProgrammaUitleg, WerktHetNiet } from "./PrintProgrammaUitleg.js";
|
|
@@ -161,8 +160,9 @@ export function PrinterSetupWizard({ open, onOpenChange, onKlaar, computerFilter
|
|
|
161
160
|
setTestStatus("gelukt");
|
|
162
161
|
return;
|
|
163
162
|
}
|
|
164
|
-
|
|
165
|
-
|
|
163
|
+
if (direct.reden)
|
|
164
|
+
toast.error(direct.reden);
|
|
165
|
+
setTestStatus("fout");
|
|
166
166
|
}
|
|
167
167
|
catch {
|
|
168
168
|
setTestStatus("fout");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PrintersPage.d.ts","sourceRoot":"","sources":["../../src/components/PrintersPage.tsx"],"names":[],"mappings":"AA2BA,wBAAgB,YAAY,
|
|
1
|
+
{"version":3,"file":"PrintersPage.d.ts","sourceRoot":"","sources":["../../src/components/PrintersPage.tsx"],"names":[],"mappings":"AA2BA,wBAAgB,YAAY,CAAC,EAAE,OAAe,EAAE,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,+BAyM3E"}
|
|
@@ -1,36 +1,34 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
// ============================================================================
|
|
3
|
-
// src/components/PrintersPage.tsx —
|
|
4
|
-
//
|
|
3
|
+
// src/components/PrintersPage.tsx — apparatenoverzicht: welke computers zijn
|
|
4
|
+
// aangemeld en welke printers zijn daar bekend. Alleen monitoring; instellen
|
|
5
|
+
// gebeurt uitsluitend via de printplek-wizard.
|
|
5
6
|
// ============================================================================
|
|
6
7
|
import { useMemo, useState } from "react";
|
|
7
8
|
import { Button, Input, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@flowselections/core";
|
|
8
|
-
import {
|
|
9
|
-
import { CheckCircle2, FileText,
|
|
9
|
+
import { useNavigate } from "@tanstack/react-router";
|
|
10
|
+
import { CheckCircle2, FileText, Monitor, Plus, Printer, Search } from "lucide-react";
|
|
10
11
|
import { bijgewerktTekst, useAutoRefresh } from "../lib/useAutoRefresh.js";
|
|
11
12
|
import { useLayouts, usePrinters } from "../lib/useDocumentData.js";
|
|
12
13
|
import { useNetwerkPrinters } from "../lib/useNetwerkPrinters.js";
|
|
13
|
-
import { PrinterSetupWizard } from "./PrinterSetupWizard.js";
|
|
14
14
|
import { ComputersLijst, useComputers } from "./ComputersLijst.js";
|
|
15
15
|
import { PrinterStatsKaarten } from "./PrinterStatsKaarten.js";
|
|
16
16
|
import { PrintStatusBanner } from "./PrintStatusBanner.js";
|
|
17
17
|
import { telPrintersPerComputer } from "../lib/printerTelling.js";
|
|
18
18
|
import { WerkplekkenTabel } from "./WerkplekkenTabel.js";
|
|
19
|
-
export function PrintersPage() {
|
|
19
|
+
export function PrintersPage({ ingebed = false } = {}) {
|
|
20
20
|
const { printers, koppelingen, reload } = usePrinters();
|
|
21
21
|
const { layouts } = useLayouts();
|
|
22
|
+
const navigate = useNavigate();
|
|
22
23
|
const { computers, loading: computersLaden, fout: computersFout, reload: herlaadComputers, } = useComputers();
|
|
23
24
|
const { gevonden, zoek } = useNetwerkPrinters();
|
|
24
|
-
const [wizard, setWizard] = useState(false);
|
|
25
25
|
const [computerToevoegen, setComputerToevoegen] = useState(false);
|
|
26
|
-
const [computerFilter, setComputerFilter] = useState(null);
|
|
27
|
-
const [bewerken] = useState(null);
|
|
28
26
|
const [zoekterm, setZoekterm] = useState("");
|
|
29
27
|
const [status, setStatus] = useState("alle");
|
|
30
28
|
const [locatie, setLocatie] = useState("alle");
|
|
31
29
|
const bijgewerkt = useAutoRefresh(async () => {
|
|
32
30
|
await Promise.all([reload(true), herlaadComputers(true), zoek()]);
|
|
33
|
-
}, 10000,
|
|
31
|
+
}, 10000, computerToevoegen);
|
|
34
32
|
const gekoppeldePrinters = useMemo(() => new Set(koppelingen.map((k) => k.printer_id)), [koppelingen]);
|
|
35
33
|
const printersPerComputer = useMemo(() => telPrintersPerComputer(printers, gevonden, gekoppeldePrinters), [printers, gevonden, gekoppeldePrinters]);
|
|
36
34
|
const alleRijen = computers.map((c) => {
|
|
@@ -57,21 +55,21 @@ export function PrintersPage() {
|
|
|
57
55
|
return true;
|
|
58
56
|
});
|
|
59
57
|
const computersOnline = computers.filter((c) => c.online).length;
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
const
|
|
64
|
-
return (_jsxs(
|
|
58
|
+
const naarWizard = () => {
|
|
59
|
+
void navigate({ to: "/layouts-printers/printplekken" });
|
|
60
|
+
};
|
|
61
|
+
const Wrapper = ingebed ? "div" : "main";
|
|
62
|
+
return (_jsxs(Wrapper, { className: ingebed ? "space-y-6" : "space-y-6 p-6", children: [_jsxs("div", { className: "flex flex-wrap items-end justify-between gap-4", children: [!ingebed && (_jsxs("div", { children: [_jsx("h1", { className: "text-xl font-semibold", children: "Apparaten" }), _jsx("p", { className: "text-muted-foreground text-sm", children: "Overzicht van aangemelde computers en hun printers." })] })), _jsx("div", { className: "ml-auto flex items-center gap-2", children: _jsxs(Button, { onClick: () => setComputerToevoegen(true), children: [_jsx(Plus, { className: "mr-2 h-4 w-4" }), " Computer aanmelden"] }) })] }), _jsx(PrintStatusBanner, { fout: computersFout, offlineWerkplekken: computers.filter((c) => !c.online).map((c) => c.naam), toonWerkplekLink: false }), _jsx(PrinterStatsKaarten, { kaarten: [
|
|
65
63
|
{
|
|
66
|
-
label: "
|
|
64
|
+
label: "Computers",
|
|
67
65
|
waarde: String(computers.length),
|
|
68
|
-
toelichting: "
|
|
66
|
+
toelichting: "Aangemeld met het printprogramma",
|
|
69
67
|
icon: Monitor,
|
|
70
68
|
},
|
|
71
69
|
{
|
|
72
70
|
label: "Printers",
|
|
73
71
|
waarde: String(printers.length),
|
|
74
|
-
toelichting: `Ingesteld · ${gevonden.length} gevonden op de
|
|
72
|
+
toelichting: `Ingesteld · ${gevonden.length} gevonden op de computers`,
|
|
75
73
|
icon: Printer,
|
|
76
74
|
},
|
|
77
75
|
{
|
|
@@ -83,33 +81,17 @@ export function PrintersPage() {
|
|
|
83
81
|
{
|
|
84
82
|
label: "Status",
|
|
85
83
|
waarde: `${computersOnline} / ${computers.length}`,
|
|
86
|
-
toelichting: "
|
|
84
|
+
toelichting: "Computers aan",
|
|
87
85
|
icon: CheckCircle2,
|
|
88
86
|
},
|
|
89
|
-
] }), _jsxs("div", { className: "flex flex-wrap items-center gap-3 rounded-xl border p-3", children: [_jsxs("div", { className: "relative min-w-[220px] flex-1", children: [_jsx(Search, { className: "text-muted-foreground absolute top-2.5 left-3 h-4 w-4" }), _jsx(Input, { className: "pl-9", placeholder: "Zoek
|
|
90
|
-
setComputerFilter(computer);
|
|
91
|
-
setWizard(true);
|
|
92
|
-
}, onVernieuw: () => {
|
|
87
|
+
] }), _jsxs("div", { className: "flex flex-wrap items-center gap-3 rounded-xl border p-3", children: [_jsxs("div", { className: "relative min-w-[220px] flex-1", children: [_jsx(Search, { className: "text-muted-foreground absolute top-2.5 left-3 h-4 w-4" }), _jsx(Input, { className: "pl-9", placeholder: "Zoek computer of locatie\u2026", value: zoekterm, onChange: (e) => setZoekterm(e.target.value) })] }), _jsxs(Select, { value: status, onValueChange: setStatus, children: [_jsx(SelectTrigger, { className: "w-[170px]", children: _jsx(SelectValue, { placeholder: "Status" }) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "alle", children: "Status: alle" }), _jsx(SelectItem, { value: "aan", children: "Alleen aan" }), _jsx(SelectItem, { value: "uit", children: "Alleen uit" })] })] }), _jsxs(Select, { value: locatie, onValueChange: setLocatie, children: [_jsx(SelectTrigger, { className: "w-[190px]", children: _jsx(SelectValue, { placeholder: "Locatie" }) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "alle", children: "Locatie: alle" }), locaties.map((l) => (_jsx(SelectItem, { value: l, children: l }, l)))] })] }), _jsx("span", { className: "text-muted-foreground ml-auto text-xs", children: bijgewerktTekst(bijgewerkt) })] }), rijen.length > 0 ? (_jsx(WerkplekkenTabel, { rijen: rijen, onPrinterToevoegen: naarWizard, onVernieuw: () => {
|
|
93
88
|
void herlaadComputers();
|
|
94
89
|
void zoek();
|
|
95
90
|
} })) : (_jsx(ComputersLijst, { computers: computers, loading: computersLaden, fout: computersFout, onVernieuw: () => {
|
|
96
91
|
void herlaadComputers();
|
|
97
92
|
void zoek();
|
|
98
|
-
}, onPrintersToevoegen: (
|
|
99
|
-
setComputerFilter(computer);
|
|
100
|
-
setWizard(true);
|
|
101
|
-
}, toevoegenOpen: false, onToevoegenOpenChange: setComputerToevoegen })), _jsx(ComputersLijst, { computers: computers, loading: false, fout: null, onVernieuw: () => {
|
|
93
|
+
}, onPrintersToevoegen: naarWizard, toevoegenOpen: false, onToevoegenOpenChange: setComputerToevoegen })), _jsx(ComputersLijst, { computers: computers, loading: false, fout: null, onVernieuw: () => {
|
|
102
94
|
void herlaadComputers();
|
|
103
95
|
void zoek();
|
|
104
|
-
}, onPrintersToevoegen:
|
|
105
|
-
setComputerFilter(computer);
|
|
106
|
-
setWizard(true);
|
|
107
|
-
}, toevoegenOpen: computerToevoegen, onToevoegenOpenChange: setComputerToevoegen, alleenDialog: true }), _jsx(PrinterSetupWizard, { open: wizard, onOpenChange: (v) => {
|
|
108
|
-
setWizard(v);
|
|
109
|
-
if (!v)
|
|
110
|
-
setComputerFilter(null);
|
|
111
|
-
}, computerFilter: computerFilter, bekendeExterneIds: bekendeExterneIds, bekendeLocaties: bekendeLocaties, bewerken: bewerken, onKlaar: () => {
|
|
112
|
-
void reload();
|
|
113
|
-
void zoek();
|
|
114
|
-
} })] }));
|
|
96
|
+
}, onPrintersToevoegen: naarWizard, toevoegenOpen: computerToevoegen, onToevoegenOpenChange: setComputerToevoegen, alleenDialog: true })] }));
|
|
115
97
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PrintersRedirectPage.d.ts","sourceRoot":"","sources":["../../src/components/PrintersRedirectPage.tsx"],"names":[],"mappings":"AAQA,wBAAgB,oBAAoB,gCAQnC"}
|
|
@@ -0,0 +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
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PrintplekDetailPage.d.ts","sourceRoot":"","sources":["../../src/components/PrintplekDetailPage.tsx"],"names":[],"mappings":"AA6CA,wBAAgB,mBAAmB,gCAqVlC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
// ============================================================================
|
|
3
|
+
// src/components/PrintplekDetailPage.tsx — één printplek instellen: welke
|
|
4
|
+
// computers erbij horen, welke printers beschikbaar zijn en welk document naar
|
|
5
|
+
// welke printer gaat.
|
|
6
|
+
// ============================================================================
|
|
7
|
+
import { useMemo, useState } from "react";
|
|
8
|
+
import { Badge, Button, Card, CardContent, CardDescription, CardHeader, CardTitle, Input, toast, } from "@flowselections/core";
|
|
9
|
+
import { Link, useParams } from "@tanstack/react-router";
|
|
10
|
+
import { AlertTriangle, ArrowLeft, Check, Link2, Monitor, Plus, Printer, Trash2, Wand2, X, } from "lucide-react";
|
|
11
|
+
import { bewerkPrintplek, ontkoppelBron, usePrintplekken, verwijderPrintplek, } from "../lib/printplekken.js";
|
|
12
|
+
import { usePrinters } from "../lib/useDocumentData.js";
|
|
13
|
+
import { useNetwerkPrinters } from "../lib/useNetwerkPrinters.js";
|
|
14
|
+
import { useComputers } from "./ComputersLijst.js";
|
|
15
|
+
import { DOCUMENT_TYPES, documentTypeLabel } from "../lib/documentTypes.js";
|
|
16
|
+
import { drukTestpaginaAf } from "../lib/testpagina.js";
|
|
17
|
+
import { PrintplekWizard } from "./PrintplekWizard.js";
|
|
18
|
+
export function PrintplekDetailPage() {
|
|
19
|
+
const params = useParams({ strict: false });
|
|
20
|
+
const plekId = params.printplekId ?? "";
|
|
21
|
+
const { plekken, computers: plekComputers, regels, koppelingen, reload } = usePrintplekken();
|
|
22
|
+
const { computers } = useComputers();
|
|
23
|
+
const { printers } = usePrinters();
|
|
24
|
+
const { gevonden } = useNetwerkPrinters();
|
|
25
|
+
const [naamBewerken, setNaamBewerken] = useState(false);
|
|
26
|
+
const [naam, setNaam] = useState("");
|
|
27
|
+
const [alleDocumenten, setAlleDocumenten] = useState(false);
|
|
28
|
+
const [wizardOpen, setWizardOpen] = useState(false);
|
|
29
|
+
const plek = plekken.find((p) => p.id === plekId) ?? null;
|
|
30
|
+
const eigenComputers = plekComputers.filter((c) => c.print_plek_id === plekId);
|
|
31
|
+
const eigenNamen = new Set(eigenComputers.map((c) => c.computer_naam));
|
|
32
|
+
// Printers van deze plek: alles wat op één van de gekoppelde computers staat.
|
|
33
|
+
const externOpComputer = useMemo(() => {
|
|
34
|
+
const map = new Map();
|
|
35
|
+
for (const g of gevonden)
|
|
36
|
+
if (g.computer)
|
|
37
|
+
map.set(g.id, g.computer);
|
|
38
|
+
return map;
|
|
39
|
+
}, [gevonden]);
|
|
40
|
+
const eigenPrinters = printers.filter((p) => {
|
|
41
|
+
const extern = p.extern_printer_id;
|
|
42
|
+
const computer = extern ? externOpComputer.get(extern) : undefined;
|
|
43
|
+
return computer ? eigenNamen.has(computer) : false;
|
|
44
|
+
});
|
|
45
|
+
const regelVoor = (documenttype) => regels.find((r) => r.print_plek_id === plekId && r.documenttype === documenttype) ?? null;
|
|
46
|
+
const inGebruik = DOCUMENT_TYPES.filter((d) => regelVoor(d.value));
|
|
47
|
+
const overige = DOCUMENT_TYPES.filter((d) => !regelVoor(d.value));
|
|
48
|
+
const zichtbaar = alleDocumenten ? DOCUMENT_TYPES : inGebruik;
|
|
49
|
+
const bronnen = koppelingen.filter((k) => k.print_plek_id === plekId);
|
|
50
|
+
const bestaandePlekIds = new Set(plekken.map((p) => p.id));
|
|
51
|
+
const weeskoppelingen = koppelingen.filter((k) => !bestaandePlekIds.has(k.print_plek_id));
|
|
52
|
+
const onvolledig = eigenComputers.length === 0 || !regels.some((r) => r.print_plek_id === plekId && r.printer_id);
|
|
53
|
+
const ontkoppel = async (bron, bronId) => {
|
|
54
|
+
try {
|
|
55
|
+
await ontkoppelBron(bron, bronId);
|
|
56
|
+
await reload(true);
|
|
57
|
+
toast.success("Koppeling verwijderd");
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
toast.error("Ontkoppelen mislukt");
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
if (!plek) {
|
|
64
|
+
return (_jsxs("main", { className: "space-y-4 p-6", children: [_jsx(Button, { variant: "ghost", asChild: true, children: _jsxs(Link, { to: "/layouts-printers/printplekken", children: [_jsx(ArrowLeft, { className: "mr-2 h-4 w-4" }), " Terug"] }) }), _jsx("p", { className: "text-muted-foreground text-sm", children: "Deze printplek bestaat niet (meer)." })] }));
|
|
65
|
+
}
|
|
66
|
+
return (_jsxs("main", { className: "space-y-6 p-6", children: [_jsxs("div", { className: "flex flex-wrap items-start justify-between gap-4", children: [_jsxs("div", { className: "space-y-1", children: [_jsx(Button, { variant: "ghost", size: "sm", asChild: true, className: "-ml-2", children: _jsxs(Link, { to: "/layouts-printers/printplekken", children: [_jsx(ArrowLeft, { className: "mr-2 h-4 w-4" }), " Alle printplekken"] }) }), naamBewerken ? (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Input, { value: naam, onChange: (e) => setNaam(e.target.value), className: "w-64" }), _jsx(Button, { size: "icon", onClick: async () => {
|
|
67
|
+
await bewerkPrintplek(plek.id, { naam: naam.trim() });
|
|
68
|
+
setNaamBewerken(false);
|
|
69
|
+
await reload(true);
|
|
70
|
+
}, children: _jsx(Check, { className: "h-4 w-4" }) }), _jsx(Button, { size: "icon", variant: "ghost", onClick: () => setNaamBewerken(false), children: _jsx(X, { className: "h-4 w-4" }) })] })) : (_jsx("h1", { className: "cursor-pointer text-xl font-semibold", onClick: () => {
|
|
71
|
+
setNaam(plek.naam);
|
|
72
|
+
setNaamBewerken(true);
|
|
73
|
+
}, children: plek.naam })), _jsx("p", { className: "text-muted-foreground text-sm", children: plek.omschrijving ?? "Stel hier in wat er op deze plek wordt afgedrukt." })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsxs(Button, { variant: "outline", onClick: () => setWizardOpen(true), children: [_jsx(Wand2, { className: "mr-2 h-4 w-4" }), onvolledig ? "Afmaken met de wizard" : "Instellen met de wizard"] }), _jsxs(Button, { variant: "ghost", className: "text-destructive", onClick: async () => {
|
|
74
|
+
await verwijderPrintplek(plek.id);
|
|
75
|
+
toast.success("Printplek verwijderd");
|
|
76
|
+
await reload();
|
|
77
|
+
}, children: [_jsx(Trash2, { className: "mr-2 h-4 w-4" }), " Verwijderen"] })] })] }), _jsx(PrintplekWizard, { open: wizardOpen, onOpenChange: setWizardOpen, printplekId: plekId, onKlaar: () => void reload() }), _jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsxs(CardTitle, { className: "flex items-center gap-2 text-base", children: [_jsx(Monitor, { className: "h-4 w-4" }), " Computers op deze plek"] }), _jsx(CardDescription, { children: "Computers voeg je toe of haal je weg met de wizard." })] }), _jsx(CardContent, { className: "space-y-3", children: eigenComputers.length === 0 ? (_jsx("p", { className: "text-muted-foreground text-sm", children: "Nog geen computers gekoppeld." })) : (_jsx("div", { className: "flex flex-wrap gap-2", children: eigenComputers.map((c) => {
|
|
78
|
+
const aan = computers.find((k) => k.naam === c.computer_naam)?.online ?? false;
|
|
79
|
+
return (_jsxs("span", { className: "flex items-center gap-2 rounded-full border px-3 py-1 text-sm", children: [_jsx("span", { className: `h-2 w-2 rounded-full ${aan ? "bg-emerald-500" : "bg-muted-foreground"}` }), c.computer_naam] }, c.id));
|
|
80
|
+
}) })) })] }), _jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsxs(CardTitle, { className: "flex items-center gap-2 text-base", children: [_jsx(Printer, { className: "h-4 w-4" }), " Printers op deze plek"] }), _jsx(CardDescription, { children: "Test een printer om te zien of hij goed staat." })] }), _jsx(CardContent, { children: eigenPrinters.length === 0 ? (_jsxs("div", { className: "text-muted-foreground flex items-center gap-2 text-sm", children: [_jsx(AlertTriangle, { className: "text-destructive h-4 w-4" }), "Nog geen ingestelde printers. Voeg ze toe bij", " ", _jsx(Link, { className: "text-primary underline", to: "/layouts-printers/printers", children: "Werkplekken" }), "."] })) : (_jsx("div", { className: "space-y-2", children: eigenPrinters.map((p) => (_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-2 rounded-lg border p-2", children: [_jsxs("div", { className: "text-sm", children: [_jsx("span", { className: "font-medium", children: p.naam }), p.papierformaat ? (_jsx(Badge, { variant: "secondary", className: "ml-2", children: p.papierformaat })) : null] }), _jsx(Button, { size: "sm", variant: "ghost", onClick: async () => {
|
|
81
|
+
try {
|
|
82
|
+
await drukTestpaginaAf(p.id, p.naam);
|
|
83
|
+
toast.success("Testpagina verstuurd");
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
toast.error("Testpagina versturen is niet gelukt.");
|
|
87
|
+
}
|
|
88
|
+
}, children: "Testpagina" })] }, p.id))) })) })] }), _jsxs(Card, { children: [_jsxs(CardHeader, { className: "flex flex-row items-start justify-between gap-3", children: [_jsxs("div", { children: [_jsx(CardTitle, { className: "text-base", children: "Welk document gaat naar welke printer?" }), _jsx(CardDescription, { children: "Alleen wat hier is ingesteld wordt op deze plek afgedrukt. Wijzigen doe je met de wizard." })] }), _jsx(Button, { variant: "ghost", size: "sm", onClick: () => setAlleDocumenten((v) => !v), children: alleDocumenten ? "Alleen ingestelde" : (_jsxs(_Fragment, { children: [_jsx(Plus, { className: "mr-1 h-4 w-4" }), " Meer documenten"] })) })] }), _jsxs(CardContent, { className: "space-y-2", children: [zichtbaar.length === 0 ? (_jsx("p", { className: "text-muted-foreground text-sm", children: "Nog niets ingesteld. Gebruik de wizard bovenaan deze pagina." })) : null, zichtbaar.map((d) => {
|
|
89
|
+
const regel = regelVoor(d.value);
|
|
90
|
+
const printer = eigenPrinters.find((p) => p.id === regel?.printer_id) ?? null;
|
|
91
|
+
return (_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-3 rounded-lg border p-2", children: [_jsx("div", { className: "text-sm font-medium", children: documentTypeLabel(d.value) }), printer ? (_jsx("span", { className: "text-muted-foreground text-sm", children: printer.naam })) : (_jsxs("span", { className: "text-destructive flex items-center gap-1 text-xs", children: [_jsx(AlertTriangle, { className: "h-3.5 w-3.5" }), " Geen printer"] }))] }, d.value));
|
|
92
|
+
}), !alleDocumenten && overige.length > 0 ? (_jsxs("p", { className: "text-muted-foreground text-xs", children: [overige.length, " documentsoort", overige.length === 1 ? "" : "en", " nog niet ingesteld."] })) : null] })] }), _jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsxs(CardTitle, { className: "flex items-center gap-2 text-base", children: [_jsx(Link2, { className: "h-4 w-4" }), " Gekoppeld aan"] }), _jsx(CardDescription, { children: "Andere modules (bijvoorbeeld pickstations) kunnen zich aan deze printplek koppelen." })] }), _jsxs(CardContent, { className: "space-y-4", children: [bronnen.length === 0 ? (_jsx("p", { className: "text-muted-foreground text-sm", children: "Nog niets gekoppeld. Kies deze printplek in de andere module (bijvoorbeeld bij een pickstation); de koppeling verschijnt hier vanzelf." })) : (_jsx("div", { className: "space-y-2", children: bronnen.map((b) => (_jsxs("div", { className: "flex flex-wrap items-center gap-3 rounded-lg border px-3 py-2 text-sm", children: [_jsx(Badge, { variant: "secondary", children: b.bron }), _jsxs("span", { className: "min-w-0 flex-1 truncate", children: [b.label ?? b.bron_id, _jsx("span", { className: "text-muted-foreground ml-2 text-xs", children: b.bron_id })] }), _jsxs(Button, { variant: "ghost", size: "sm", onClick: () => void ontkoppel(b.bron, b.bron_id), children: [_jsx(X, { className: "mr-1 h-3.5 w-3.5" }), " Ontkoppelen"] })] }, b.id))) })), weeskoppelingen.length > 0 ? (_jsxs("div", { className: "space-y-2 rounded-lg border border-dashed p-3", children: [_jsxs("p", { className: "text-muted-foreground flex items-center gap-2 text-xs", children: [_jsx(AlertTriangle, { className: "h-3.5 w-3.5" }), " Koppelingen zonder bestaande printplek:"] }), weeskoppelingen.map((b) => (_jsxs("div", { className: "flex flex-wrap items-center gap-3 text-sm", children: [_jsx("span", { className: "min-w-0 flex-1 truncate", children: b.label ?? `${b.bron} ${b.bron_id}` }), _jsxs(Button, { variant: "ghost", size: "sm", onClick: () => void ontkoppel(b.bron, b.bron_id), children: [_jsx(Trash2, { className: "mr-1 h-3.5 w-3.5" }), " Opruimen"] })] }, b.id)))] })) : null] })] })] }));
|
|
93
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare function PrintplekWizard({ open, onOpenChange, printplekId, onKlaar, }: {
|
|
2
|
+
open: boolean;
|
|
3
|
+
onOpenChange: (v: boolean) => void;
|
|
4
|
+
/** Vul in om een bestaande, nog onvolledige printplek af te maken. */
|
|
5
|
+
printplekId?: string | null;
|
|
6
|
+
onKlaar?: (printplekId: string) => void;
|
|
7
|
+
}): import("react").JSX.Element;
|
|
8
|
+
//# sourceMappingURL=PrintplekWizard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PrintplekWizard.d.ts","sourceRoot":"","sources":["../../src/components/PrintplekWizard.tsx"],"names":[],"mappings":"AA4DA,wBAAgB,eAAe,CAAC,EAC9B,IAAI,EACJ,YAAY,EACZ,WAAW,EACX,OAAO,GACR,EAAE;IACD,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,sEAAsE;IACtE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC,+BAgaA"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
// ============================================================================
|
|
3
|
+
// src/components/PrintplekWizard.tsx — stapsgewijze setup van een printplek:
|
|
4
|
+
// naam → computers → printers → documenten → testprint. Schrijft in dezelfde
|
|
5
|
+
// tabellen als de detailpagina; alleen de route erlangs is begeleid.
|
|
6
|
+
// ============================================================================
|
|
7
|
+
import { useEffect, useMemo, useState } from "react";
|
|
8
|
+
import { Badge, Button, Checkbox, Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, Input, Label, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, toast, } from "@flowselections/core";
|
|
9
|
+
import { AlertTriangle, ArrowLeft, ArrowRight, Check, Monitor, Printer, RefreshCw, } from "lucide-react";
|
|
10
|
+
import { bewerkPrintplek, koppelComputerAanPrintplek, maakPrintplek, ontkoppelComputer, usePrintplekken, zetPrintplekPrinter, } from "../lib/printplekken.js";
|
|
11
|
+
import { usePrinters, useLayouts } from "../lib/useDocumentData.js";
|
|
12
|
+
import { useNetwerkPrinters } from "../lib/useNetwerkPrinters.js";
|
|
13
|
+
import { useComputers } from "./ComputersLijst.js";
|
|
14
|
+
import { documentTypeLabel } from "../lib/documentTypes.js";
|
|
15
|
+
import { drukTestpaginaAf } from "../lib/testpagina.js";
|
|
16
|
+
import { NAAM_SUGGESTIES, WIZARD_STAPPEN, eersteOnvoltooideStap, overigeDocumenttypes, relevanteDocumenttypes, voorgesteldeDocumentPrinters, wizardStapKlaar, } from "../lib/printplekWizard.js";
|
|
17
|
+
const GEEN = "geen";
|
|
18
|
+
export function PrintplekWizard({ open, onOpenChange, printplekId, onKlaar, }) {
|
|
19
|
+
const { plekken, computers: plekComputers, regels, reload } = usePrintplekken();
|
|
20
|
+
const { computers, reload: herlaadComputers } = useComputers();
|
|
21
|
+
const { printers } = usePrinters();
|
|
22
|
+
const { layouts } = useLayouts();
|
|
23
|
+
const { gevonden } = useNetwerkPrinters();
|
|
24
|
+
const [stap, setStap] = useState(1);
|
|
25
|
+
const [bezig, setBezig] = useState(false);
|
|
26
|
+
const [plekId, setPlekId] = useState("");
|
|
27
|
+
const [naam, setNaam] = useState("");
|
|
28
|
+
const [omschrijving, setOmschrijving] = useState("");
|
|
29
|
+
const [gekozenComputers, setGekozenComputers] = useState([]);
|
|
30
|
+
const [documentPrinters, setDocumentPrinters] = useState({});
|
|
31
|
+
const [alleDocumenten, setAlleDocumenten] = useState(false);
|
|
32
|
+
const [voorstelGedaan, setVoorstelGedaan] = useState(false);
|
|
33
|
+
const [geinitialiseerd, setGeinitialiseerd] = useState(false);
|
|
34
|
+
// --- printers die bij de gekozen computers horen -------------------------
|
|
35
|
+
const computerVanPrinter = useMemo(() => {
|
|
36
|
+
const map = new Map();
|
|
37
|
+
for (const g of gevonden)
|
|
38
|
+
if (g.computer)
|
|
39
|
+
map.set(g.id, g.computer);
|
|
40
|
+
return map;
|
|
41
|
+
}, [gevonden]);
|
|
42
|
+
const gekozenSet = useMemo(() => new Set(gekozenComputers), [gekozenComputers]);
|
|
43
|
+
const plekPrinters = useMemo(() => (Array.isArray(printers) ? printers : []).filter((p) => {
|
|
44
|
+
const extern = p.extern_printer_id;
|
|
45
|
+
const computer = extern ? computerVanPrinter.get(extern) : undefined;
|
|
46
|
+
return computer ? gekozenSet.has(computer) : false;
|
|
47
|
+
}), [printers, computerVanPrinter, gekozenSet]);
|
|
48
|
+
const relevant = useMemo(() => relevanteDocumenttypes(layouts), [layouts]);
|
|
49
|
+
const overig = useMemo(() => overigeDocumenttypes(relevant), [relevant]);
|
|
50
|
+
const zichtbareDocumenten = alleDocumenten ? [...relevant, ...overig] : relevant;
|
|
51
|
+
const status = {
|
|
52
|
+
naam,
|
|
53
|
+
computers: gekozenComputers,
|
|
54
|
+
printers: plekPrinters.length,
|
|
55
|
+
documentPrinters,
|
|
56
|
+
};
|
|
57
|
+
// --- initialisatie bij openen -------------------------------------------
|
|
58
|
+
useEffect(() => {
|
|
59
|
+
if (!open) {
|
|
60
|
+
setGeinitialiseerd(false);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
if (geinitialiseerd)
|
|
64
|
+
return;
|
|
65
|
+
const bestaand = printplekId ? (plekken.find((p) => p.id === printplekId) ?? null) : null;
|
|
66
|
+
if (printplekId && !bestaand)
|
|
67
|
+
return; // wacht tot de plekken geladen zijn
|
|
68
|
+
if (bestaand) {
|
|
69
|
+
const eigenComputers = plekComputers
|
|
70
|
+
.filter((c) => c.print_plek_id === bestaand.id)
|
|
71
|
+
.map((c) => c.computer_naam);
|
|
72
|
+
const eigenRegels = {};
|
|
73
|
+
for (const r of regels) {
|
|
74
|
+
if (r.print_plek_id === bestaand.id && r.printer_id)
|
|
75
|
+
eigenRegels[r.documenttype] = r.printer_id;
|
|
76
|
+
}
|
|
77
|
+
setPlekId(bestaand.id);
|
|
78
|
+
setNaam(bestaand.naam);
|
|
79
|
+
setOmschrijving(bestaand.omschrijving ?? "");
|
|
80
|
+
setGekozenComputers(eigenComputers);
|
|
81
|
+
setDocumentPrinters(eigenRegels);
|
|
82
|
+
setVoorstelGedaan(Object.keys(eigenRegels).length > 0);
|
|
83
|
+
setStap(eersteOnvoltooideStap({
|
|
84
|
+
naam: bestaand.naam,
|
|
85
|
+
computers: eigenComputers,
|
|
86
|
+
printers: eigenComputers.length,
|
|
87
|
+
documentPrinters: eigenRegels,
|
|
88
|
+
}));
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
setPlekId("");
|
|
92
|
+
setNaam("");
|
|
93
|
+
setOmschrijving("");
|
|
94
|
+
setGekozenComputers([]);
|
|
95
|
+
setDocumentPrinters({});
|
|
96
|
+
setVoorstelGedaan(false);
|
|
97
|
+
setStap(1);
|
|
98
|
+
}
|
|
99
|
+
setAlleDocumenten(false);
|
|
100
|
+
setGeinitialiseerd(true);
|
|
101
|
+
}, [open, geinitialiseerd, printplekId, plekken, plekComputers, regels]);
|
|
102
|
+
// Bij binnenkomst in stap 4 eenmalig een voorstel doen.
|
|
103
|
+
useEffect(() => {
|
|
104
|
+
if (stap !== 4 || voorstelGedaan || plekPrinters.length === 0)
|
|
105
|
+
return;
|
|
106
|
+
setDocumentPrinters(voorgesteldeDocumentPrinters(relevant, plekPrinters));
|
|
107
|
+
setVoorstelGedaan(true);
|
|
108
|
+
}, [stap, voorstelGedaan, plekPrinters, relevant]);
|
|
109
|
+
// --- opslaan per stap ----------------------------------------------------
|
|
110
|
+
async function bewaarStap1() {
|
|
111
|
+
if (plekId) {
|
|
112
|
+
await bewerkPrintplek(plekId, { naam: naam.trim(), omschrijving: omschrijving.trim() || null });
|
|
113
|
+
return plekId;
|
|
114
|
+
}
|
|
115
|
+
const id = await maakPrintplek(naam, omschrijving);
|
|
116
|
+
setPlekId(id);
|
|
117
|
+
return id;
|
|
118
|
+
}
|
|
119
|
+
async function bewaarStap2(id) {
|
|
120
|
+
const huidige = plekComputers
|
|
121
|
+
.filter((c) => c.print_plek_id === id)
|
|
122
|
+
.map((c) => c.computer_naam);
|
|
123
|
+
for (const naamC of gekozenComputers) {
|
|
124
|
+
if (!huidige.includes(naamC))
|
|
125
|
+
await koppelComputerAanPrintplek(id, naamC);
|
|
126
|
+
}
|
|
127
|
+
for (const naamC of huidige) {
|
|
128
|
+
if (!gekozenComputers.includes(naamC))
|
|
129
|
+
await ontkoppelComputer(naamC);
|
|
130
|
+
}
|
|
131
|
+
await reload(true);
|
|
132
|
+
}
|
|
133
|
+
async function bewaarStap4(id) {
|
|
134
|
+
for (const doc of zichtbareDocumenten) {
|
|
135
|
+
const printerId = documentPrinters[doc] || null;
|
|
136
|
+
await zetPrintplekPrinter(id, doc, printerId);
|
|
137
|
+
}
|
|
138
|
+
await reload(true);
|
|
139
|
+
}
|
|
140
|
+
async function volgende() {
|
|
141
|
+
setBezig(true);
|
|
142
|
+
try {
|
|
143
|
+
let id = plekId;
|
|
144
|
+
if (stap === 1)
|
|
145
|
+
id = await bewaarStap1();
|
|
146
|
+
if (stap === 2)
|
|
147
|
+
await bewaarStap2(id);
|
|
148
|
+
if (stap === 4)
|
|
149
|
+
await bewaarStap4(id);
|
|
150
|
+
setStap((s) => Math.min(5, s + 1));
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
toast.error("Deze stap kon niet worden opgeslagen. Controleer de naam en probeer opnieuw.");
|
|
154
|
+
}
|
|
155
|
+
finally {
|
|
156
|
+
setBezig(false);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
function afronden() {
|
|
160
|
+
toast.success(`"${naam.trim()}" is klaar om te printen`);
|
|
161
|
+
onOpenChange(false);
|
|
162
|
+
if (plekId)
|
|
163
|
+
onKlaar?.(plekId);
|
|
164
|
+
void reload();
|
|
165
|
+
}
|
|
166
|
+
async function testprint() {
|
|
167
|
+
const eerste = zichtbareDocumenten.find((d) => documentPrinters[d]);
|
|
168
|
+
const printerId = eerste ? documentPrinters[eerste] : "";
|
|
169
|
+
const printer = plekPrinters.find((p) => p.id === printerId);
|
|
170
|
+
if (!printer) {
|
|
171
|
+
toast.error("Er is nog geen printer gekozen om te testen.");
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
setBezig(true);
|
|
175
|
+
try {
|
|
176
|
+
await drukTestpaginaAf(printer.id, printer.naam);
|
|
177
|
+
}
|
|
178
|
+
finally {
|
|
179
|
+
setBezig(false);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
const huidige = WIZARD_STAPPEN.find((s) => s.nummer === stap) ?? WIZARD_STAPPEN[0];
|
|
183
|
+
const magVerder = wizardStapKlaar(stap, status);
|
|
184
|
+
return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(DialogContent, { className: "max-w-2xl", children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: huidige.vraag }), _jsxs(DialogDescription, { children: ["Stap ", stap, " van ", WIZARD_STAPPEN.length, " \u00B7 ", huidige.titel] })] }), _jsx("div", { className: "flex gap-1", children: WIZARD_STAPPEN.map((s) => (_jsx("span", { className: `h-1.5 flex-1 rounded-full ${s.nummer <= stap ? "bg-primary" : "bg-muted"}` }, s.nummer))) }), _jsxs("div", { className: "max-h-[55vh] space-y-4 overflow-y-auto pr-1", children: [stap === 1 ? (_jsxs("div", { className: "space-y-3", children: [_jsxs("div", { className: "space-y-1", children: [_jsx(Label, { htmlFor: "wizard-naam", children: "Naam van deze plek" }), _jsx(Input, { id: "wizard-naam", value: naam, onChange: (e) => setNaam(e.target.value), placeholder: "Pickstation 1" })] }), _jsx("div", { className: "flex flex-wrap gap-2", children: NAAM_SUGGESTIES.map((s) => (_jsx(Button, { variant: "outline", size: "sm", onClick: () => setNaam(s), children: s }, s))) }), _jsxs("div", { className: "space-y-1", children: [_jsx(Label, { htmlFor: "wizard-omschrijving", children: "Omschrijving (optioneel)" }), _jsx(Input, { id: "wizard-omschrijving", value: omschrijving, onChange: (e) => setOmschrijving(e.target.value), placeholder: "Hal 2, links naast de inpaktafel" })] })] })) : null, stap === 2 ? (_jsxs("div", { className: "space-y-3", children: [computers.length === 0 ? (_jsxs("div", { className: "space-y-2 rounded-lg border p-4 text-sm", children: [_jsx("p", { className: "text-muted-foreground", children: "Er is nog geen computer gevonden. Zet op de computer bij deze plek het printprogramma aan en zoek daarna opnieuw." }), _jsxs(Button, { variant: "outline", size: "sm", onClick: () => void herlaadComputers(), children: [_jsx(RefreshCw, { className: "mr-2 h-4 w-4" }), " Opnieuw zoeken"] })] })) : null, computers.map((c) => {
|
|
185
|
+
const bezetDoor = plekComputers.find((pc) => pc.computer_naam === c.naam && pc.print_plek_id !== plekId);
|
|
186
|
+
const bezetNaam = bezetDoor
|
|
187
|
+
? (plekken.find((p) => p.id === bezetDoor.print_plek_id)?.naam ?? "een andere plek")
|
|
188
|
+
: null;
|
|
189
|
+
const aangevinkt = gekozenComputers.includes(c.naam);
|
|
190
|
+
return (_jsxs("label", { className: `flex items-center gap-3 rounded-lg border p-3 ${bezetNaam ? "opacity-60" : "cursor-pointer"}`, children: [_jsx(Checkbox, { checked: aangevinkt, disabled: Boolean(bezetNaam), onCheckedChange: (v) => setGekozenComputers((lijst) => v ? [...new Set([...lijst, c.naam])] : lijst.filter((n) => n !== c.naam)) }), _jsx(Monitor, { className: "text-muted-foreground h-4 w-4" }), _jsxs("span", { className: "min-w-0 flex-1", children: [_jsx("span", { className: "block truncate text-sm font-medium", children: c.naam }), _jsxs("span", { className: "text-muted-foreground text-xs", children: [c.online ? "aan" : "uit", " \u00B7 ", c.aantalGevonden, " printer", c.aantalGevonden === 1 ? "" : "s", bezetNaam ? ` · hoort al bij ${bezetNaam}` : ""] })] }), _jsx("span", { className: `h-2.5 w-2.5 rounded-full ${c.online ? "bg-emerald-500" : "bg-muted-foreground"}` })] }, c.id));
|
|
191
|
+
})] })) : null, stap === 3 ? (_jsx("div", { className: "space-y-2", children: plekPrinters.length === 0 ? (_jsxs("div", { className: "text-destructive flex items-start gap-2 rounded-lg border p-3 text-sm", children: [_jsx(AlertTriangle, { className: "mt-0.5 h-4 w-4" }), _jsx("span", { children: "Op deze computers zijn nog geen printers ingesteld. Ga terug en kies een andere computer, of stel de printers eerst in bij Werkplekken." })] })) : (plekPrinters.map((p) => (_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-2 rounded-lg border p-3", children: [_jsxs("span", { className: "flex items-center gap-2 text-sm", children: [_jsx(Printer, { className: "text-muted-foreground h-4 w-4" }), _jsx("span", { className: "font-medium", children: p.naam }), p.papierformaat ? (_jsx(Badge, { variant: "secondary", children: p.papierformaat })) : null] }), _jsx(Button, { size: "sm", variant: "ghost", onClick: () => void drukTestpaginaAf(p.id, p.naam), children: "Testpagina" })] }, p.id)))) })) : null, stap === 4 ? (_jsxs("div", { className: "space-y-2", children: [_jsx("p", { className: "text-muted-foreground text-sm", children: "We hebben alvast een verstandige keuze gemaakt. Pas aan wat er niet klopt." }), zichtbareDocumenten.map((d) => (_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-3 rounded-lg border p-2", children: [_jsx("span", { className: "text-sm font-medium", children: documentTypeLabel(d) }), _jsxs(Select, { value: documentPrinters[d] || GEEN, onValueChange: (v) => setDocumentPrinters((m) => ({ ...m, [d]: v === GEEN ? "" : v })), children: [_jsx(SelectTrigger, { className: "w-64", children: _jsx(SelectValue, { placeholder: "Kies printer" }) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: GEEN, children: "Niet op deze plek printen" }), plekPrinters.map((p) => (_jsx(SelectItem, { value: p.id, children: p.naam }, p.id)))] })] })] }, d))), overig.length > 0 ? (_jsx(Button, { variant: "ghost", size: "sm", onClick: () => setAlleDocumenten((v) => !v), children: alleDocumenten
|
|
192
|
+
? "Minder documenten"
|
|
193
|
+
: `Meer documenten (${overig.length})` })) : null] })) : null, stap === 5 ? (_jsxs("div", { className: "space-y-3", children: [_jsxs("div", { className: "rounded-lg border p-3 text-sm", children: [_jsx("p", { className: "font-medium", children: naam.trim() }), _jsxs("p", { className: "text-muted-foreground", children: [gekozenComputers.length, " computer", gekozenComputers.length === 1 ? "" : "s", " \u00B7", " ", plekPrinters.length, " printer", plekPrinters.length === 1 ? "" : "s", " \u00B7", " ", Object.values(documentPrinters).filter(Boolean).length, " documentregel", Object.values(documentPrinters).filter(Boolean).length === 1 ? "" : "s"] })] }), _jsxs(Button, { variant: "outline", onClick: () => void testprint(), disabled: bezig, children: [_jsx(Printer, { className: "mr-2 h-4 w-4" }), " Testpagina versturen"] }), _jsx("p", { className: "text-muted-foreground text-xs", children: "Komt de pagina eruit? Dan is deze plek klaar voor gebruik." })] })) : null] }), _jsxs(DialogFooter, { className: "flex-row justify-between gap-2 sm:justify-between", children: [_jsx(Button, { variant: "ghost", onClick: () => (stap === 1 ? onOpenChange(false) : setStap((s) => s - 1)), disabled: bezig, children: stap === 1 ? ("Annuleren") : (_jsxs(_Fragment, { children: [_jsx(ArrowLeft, { className: "mr-2 h-4 w-4" }), " Terug"] })) }), _jsxs("div", { className: "flex items-center gap-2", children: [stap > 1 && stap < 5 ? (_jsx(Button, { variant: "ghost", onClick: () => onOpenChange(false), disabled: bezig, children: "Later afmaken" })) : null, stap === 5 ? (_jsxs(Button, { onClick: afronden, children: [_jsx(Check, { className: "mr-2 h-4 w-4" }), " Klaar"] })) : (_jsxs(Button, { onClick: () => void volgende(), disabled: bezig || !magVerder, children: ["Volgende ", _jsx(ArrowRight, { className: "ml-2 h-4 w-4" })] }))] })] })] }) }));
|
|
194
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PrintplekkenPage.d.ts","sourceRoot":"","sources":["../../src/components/PrintplekkenPage.tsx"],"names":[],"mappings":"AAmCA,wBAAgB,gBAAgB,CAAC,EAAE,OAAe,EAAE,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,+BAmY/E"}
|