@flowselections/layout-maker 1.63.5 → 1.65.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/README.md +10 -4
- package/dist-lib/components/BedrijfsgegevensKaart.d.ts +3 -0
- package/dist-lib/components/BedrijfsgegevensKaart.d.ts.map +1 -0
- package/dist-lib/components/BedrijfsgegevensKaart.js +58 -0
- package/dist-lib/components/KlaarOmTePrintenBlok.d.ts +3 -0
- package/dist-lib/components/KlaarOmTePrintenBlok.d.ts.map +1 -0
- package/dist-lib/components/KlaarOmTePrintenBlok.js +69 -0
- package/dist-lib/components/LayoutsPage.d.ts.map +1 -1
- package/dist-lib/components/LayoutsPage.js +23 -3
- package/dist-lib/components/PrintenPage.d.ts.map +1 -1
- package/dist-lib/components/PrintenPage.js +8 -2
- package/dist-lib/components/StandaardLayoutActies.d.ts +19 -0
- package/dist-lib/components/StandaardLayoutActies.d.ts.map +1 -0
- package/dist-lib/components/StandaardLayoutActies.js +105 -0
- package/dist-lib/index.d.ts +7 -0
- package/dist-lib/index.d.ts.map +1 -1
- package/dist-lib/index.js +9 -2
- package/dist-lib/integrations/supabase/types.d.ts +1078 -0
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/bedrijfsgegevens.d.ts +41 -0
- package/dist-lib/lib/bedrijfsgegevens.d.ts.map +1 -0
- package/dist-lib/lib/bedrijfsgegevens.functions.d.ts +41 -0
- package/dist-lib/lib/bedrijfsgegevens.functions.d.ts.map +1 -0
- package/dist-lib/lib/bedrijfsgegevens.functions.js +75 -0
- package/dist-lib/lib/bedrijfsgegevens.js +126 -0
- package/dist-lib/lib/documentTypes.d.ts +10 -0
- package/dist-lib/lib/documentTypes.d.ts.map +1 -1
- package/dist-lib/lib/documentTypes.js +8 -0
- package/dist-lib/lib/klaarOmTePrinten.d.ts +39 -0
- package/dist-lib/lib/klaarOmTePrinten.d.ts.map +1 -0
- package/dist-lib/lib/klaarOmTePrinten.js +65 -0
- package/dist-lib/lib/layoutStandaarden.d.ts +19 -0
- package/dist-lib/lib/layoutStandaarden.d.ts.map +1 -0
- package/dist-lib/lib/layoutStandaarden.js +23 -0
- package/dist-lib/lib/printQueue.server.d.ts.map +1 -1
- package/dist-lib/lib/printQueue.server.js +33 -2
- package/dist-lib/lib/printService.functions.d.ts +1 -1
- package/dist-lib/lib/printnodeWebhookBeheer.server.d.ts +1 -1
- package/dist-lib/lib/shellPoort.d.ts +2 -2
- package/dist-lib/lib/shellPoort.d.ts.map +1 -1
- package/dist-lib/lib/shellPoort.js +3 -2
- package/dist-lib/lib/standaardLayouts.server.d.ts +7 -1
- package/dist-lib/lib/standaardLayouts.server.d.ts.map +1 -1
- package/dist-lib/lib/standaardLayouts.server.js +52 -54
- package/dist-lib/lib/useDocumentData.d.ts.map +1 -1
- package/dist-lib/lib/useDocumentData.js +9 -5
- package/dist-lib/lib/versie.generated.d.ts +2 -0
- package/dist-lib/lib/versie.generated.d.ts.map +1 -0
- package/dist-lib/lib/versie.generated.js +2 -0
- package/package.json +9 -4
- package/sql/print-schema.sql +3205 -0
package/README.md
CHANGED
|
@@ -24,10 +24,16 @@ npm run dev
|
|
|
24
24
|
|
|
25
25
|
## Installeren in een andere shell
|
|
26
26
|
|
|
27
|
-
1.
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
27
|
+
1. Het schema zit in het pakket: `node_modules/@flowselections/layout-maker/sql/print-schema.sql`.
|
|
28
|
+
Draai het in de database van die shell (via de schema-update van de shell of de
|
|
29
|
+
SQL editor), bij installeren én na elke update. Het script is idempotent
|
|
30
|
+
(mag vaker) en zet keuzelijsten, tabellen, kolommen, sleutels, functies,
|
|
31
|
+
indexen, triggers, rechten, RLS en policies, realtime, de geplande taken
|
|
32
|
+
(zonder adres of sleutel) en de opslagmap `layout-logos` klaar. Zorg dat de
|
|
33
|
+
extensies `pg_cron`, `pg_net` en vault aan staan. Het schema wordt
|
|
34
|
+
gegenereerd met `scripts/bouw-schema.py`.
|
|
35
|
+
Floriday-systeemlayouts maakt de module daarna zelf aan bij de eerste
|
|
36
|
+
wachtrijronde of het openen van Layouts.
|
|
31
37
|
|
|
32
38
|
2. Zet in de omgeving van de shell:
|
|
33
39
|
- `SUPABASE_URL` en `SERVICE_ROLE_KEY` — nodig voor achtergrondprinten
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BedrijfsgegevensKaart.d.ts","sourceRoot":"","sources":["../../src/components/BedrijfsgegevensKaart.tsx"],"names":[],"mappings":"AAmBA,4FAA4F;AAC5F,wBAAgB,qBAAqB,gCA8EpC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useState } from "react";
|
|
3
|
+
import { Button, Card, CardContent, CardDescription, CardHeader, CardTitle, Input, Label, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, toast, } from "@flowselections/core";
|
|
4
|
+
import { LEGE_BEDRIJFSGEGEVENS } from "../lib/bedrijfsgegevens.js";
|
|
5
|
+
import { useLogos } from "../lib/logoLibrary.js";
|
|
6
|
+
const VELDEN = [
|
|
7
|
+
{ k: "naam", label: "Bedrijfsnaam" },
|
|
8
|
+
{ k: "adres", label: "Adres" },
|
|
9
|
+
{ k: "plaats", label: "Postcode en plaats" },
|
|
10
|
+
{ k: "telefoon", label: "Telefoon" },
|
|
11
|
+
{ k: "email", label: "E-mail" },
|
|
12
|
+
{ k: "kvk", label: "KvK-nummer" },
|
|
13
|
+
{ k: "btw", label: "Btw-nummer" },
|
|
14
|
+
{ k: "gln", label: "GLN" },
|
|
15
|
+
];
|
|
16
|
+
/** Instellingenkaart: bedrijfsgegevens voor de pakbon als de opdracht ze niet meestuurt. */
|
|
17
|
+
export function BedrijfsgegevensKaart() {
|
|
18
|
+
const [g, setG] = useState(LEGE_BEDRIJFSGEGEVENS);
|
|
19
|
+
const [bezig, setBezig] = useState(false);
|
|
20
|
+
const [melding, setMelding] = useState(null);
|
|
21
|
+
const logosHook = useLogos();
|
|
22
|
+
const logos = Array.isArray(logosHook?.logos) ? logosHook.logos : [];
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
void (async () => {
|
|
25
|
+
const { haalBedrijfsgegevens } = await import("../lib/bedrijfsgegevens.functions.js");
|
|
26
|
+
const r = await haalBedrijfsgegevens();
|
|
27
|
+
if (r?.ok) {
|
|
28
|
+
setG(r.gegevens);
|
|
29
|
+
setMelding(r.melding ?? null);
|
|
30
|
+
}
|
|
31
|
+
})();
|
|
32
|
+
}, []);
|
|
33
|
+
async function overnemen() {
|
|
34
|
+
const { factuurgegevensVoorstel } = await import("../lib/bedrijfsgegevens.functions.js");
|
|
35
|
+
const r = await factuurgegevensVoorstel();
|
|
36
|
+
if (!r?.ok)
|
|
37
|
+
return toast.error(r?.fout ?? "Overnemen mislukt");
|
|
38
|
+
setG((o) => ({ ...o, ...r.gegevens }));
|
|
39
|
+
toast.success("Overgenomen uit de factuurgegevens. Controleer en klik op Opslaan.");
|
|
40
|
+
}
|
|
41
|
+
async function opslaan() {
|
|
42
|
+
setBezig(true);
|
|
43
|
+
try {
|
|
44
|
+
const { bewaarBedrijfsgegevens } = await import("../lib/bedrijfsgegevens.functions.js");
|
|
45
|
+
const r = await bewaarBedrijfsgegevens({ data: g });
|
|
46
|
+
if (r?.ok) {
|
|
47
|
+
toast.success("Bedrijfsgegevens opgeslagen");
|
|
48
|
+
setMelding(null);
|
|
49
|
+
}
|
|
50
|
+
else
|
|
51
|
+
toast.error(r?.fout ?? "Opslaan mislukt");
|
|
52
|
+
}
|
|
53
|
+
finally {
|
|
54
|
+
setBezig(false);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return (_jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { children: "Bedrijfsgegevens op documenten" }), _jsx(CardDescription, { children: "Deze gegevens komen op de pakbon als de printopdracht zelf geen bedrijfsgegevens meestuurt." })] }), _jsxs(CardContent, { className: "space-y-4", children: [melding && (_jsx("p", { className: "rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm", children: melding })), _jsxs("div", { className: "grid gap-3 sm:grid-cols-2", children: [VELDEN.map((v) => (_jsxs("div", { className: "space-y-1", children: [_jsx(Label, { htmlFor: `bg-${v.k}`, children: v.label }), _jsx(Input, { id: `bg-${v.k}`, value: g[v.k], onChange: (e) => setG({ ...g, [v.k]: e.target.value }) })] }, v.k))), _jsxs("div", { className: "space-y-1", children: [_jsx(Label, { children: "Logo" }), _jsxs(Select, { value: g.logoId ?? "geen", onValueChange: (v) => setG({ ...g, logoId: v === "geen" ? null : v }), children: [_jsx(SelectTrigger, { children: _jsx(SelectValue, {}) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "geen", children: "Geen logo" }), logos.map((l) => _jsx(SelectItem, { value: l.id, children: l.naam ?? "Logo" }, l.id))] })] })] })] }), _jsxs("div", { className: "flex flex-wrap gap-2", children: [_jsx(Button, { onClick: opslaan, disabled: bezig, children: "Opslaan" }), _jsx(Button, { variant: "outline", onClick: overnemen, children: "Overnemen uit factuurgegevens" })] })] })] }));
|
|
58
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KlaarOmTePrintenBlok.d.ts","sourceRoot":"","sources":["../../src/components/KlaarOmTePrintenBlok.tsx"],"names":[],"mappings":"AAmBA,2DAA2D;AAC3D,wBAAgB,oBAAoB,gCA6GnC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useState } from "react";
|
|
3
|
+
import { Button, Card, CardContent, CardDescription, CardHeader, CardTitle } from "@flowselections/core";
|
|
4
|
+
import { CheckCircle2, RefreshCw, XCircle } from "lucide-react";
|
|
5
|
+
import { supabase } from "../lib/supabaseClient.js";
|
|
6
|
+
import { documentTypeLabel } from "../lib/documentTypes.js";
|
|
7
|
+
import { routeringVoor } from "../lib/printRoutering.js";
|
|
8
|
+
import { leesGeladenEtiket } from "../lib/etiketControle.js";
|
|
9
|
+
import { KLAAR_SOORTEN, isEtiketSoort, layoutStatus } from "../lib/klaarOmTePrinten.js";
|
|
10
|
+
const NAAR_LAYOUTS = "/layouts-printers/documenten";
|
|
11
|
+
const NAAR_PRINTEN = "/layouts-printers/printplekken";
|
|
12
|
+
/** Alleen lezen: per documentsoort klaar om te printen? */
|
|
13
|
+
export function KlaarOmTePrintenBlok() {
|
|
14
|
+
const [regels, setRegels] = useState([]);
|
|
15
|
+
const [laden, setLaden] = useState(true);
|
|
16
|
+
const load = useCallback(async () => {
|
|
17
|
+
setLaden(true);
|
|
18
|
+
try {
|
|
19
|
+
const db = supabase;
|
|
20
|
+
const [{ data: l }, { data: p }, { data: pr }] = await Promise.all([
|
|
21
|
+
db.from("document_layouts").select("id, naam, documenttype, bron, actief, is_standaard"),
|
|
22
|
+
db.from("print_plekken").select("id, naam"),
|
|
23
|
+
db.from("printers").select("id, geladen_etiket"),
|
|
24
|
+
]);
|
|
25
|
+
const layouts = (Array.isArray(l) ? l : []);
|
|
26
|
+
const plekken = (Array.isArray(p) ? p : []);
|
|
27
|
+
const printers = new Map((Array.isArray(pr) ? pr : []).map((x) => [x.id, x]));
|
|
28
|
+
const uit = [];
|
|
29
|
+
for (const soort of KLAAR_SOORTEN) {
|
|
30
|
+
const ls = layoutStatus(soort, layouts);
|
|
31
|
+
const printerIds = new Set();
|
|
32
|
+
for (const plek of plekken) {
|
|
33
|
+
try {
|
|
34
|
+
const r = await routeringVoor({ documenttype: soort, printplekId: plek.id, layoutId: ls.ok ? ls.layoutId : null });
|
|
35
|
+
if (r.printer_id)
|
|
36
|
+
printerIds.add(r.printer_id);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
/* telt als geen printer */
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const metEtiket = [...printerIds].filter((id) => leesGeladenEtiket(printers.get(id)?.geladen_etiket));
|
|
43
|
+
uit.push({
|
|
44
|
+
soort,
|
|
45
|
+
layout: ls.ok
|
|
46
|
+
? { ok: true, tekst: ls.naam || "Layout aanwezig" }
|
|
47
|
+
: { ok: false, tekst: ls.reden === "meerdere" ? "Meerdere actieve layouts, geen standaard" : "Geen layout" },
|
|
48
|
+
printer: printerIds.size
|
|
49
|
+
? { ok: true, tekst: `${printerIds.size} printer${printerIds.size === 1 ? "" : "s"}` }
|
|
50
|
+
: { ok: false, tekst: plekken.length ? "Geen printer ingesteld" : "Nog geen printplek" },
|
|
51
|
+
etiket: isEtiketSoort(soort)
|
|
52
|
+
? printerIds.size && metEtiket.length === printerIds.size
|
|
53
|
+
? { ok: true, tekst: "Geladen etiket ingesteld" }
|
|
54
|
+
: { ok: false, tekst: printerIds.size ? "Geladen etiket ontbreekt" : "Eerst een printer" }
|
|
55
|
+
: null,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
setRegels(uit);
|
|
59
|
+
}
|
|
60
|
+
finally {
|
|
61
|
+
setLaden(false);
|
|
62
|
+
}
|
|
63
|
+
}, []);
|
|
64
|
+
useEffect(() => {
|
|
65
|
+
void load();
|
|
66
|
+
}, [load]);
|
|
67
|
+
const Vak = ({ v, naar }) => !v ? (_jsx("span", { className: "text-muted-foreground", children: "\u2014" })) : (_jsxs("span", { className: "flex flex-wrap items-center gap-2", children: [v.ok ? _jsx(CheckCircle2, { className: "h-4 w-4 text-primary" }) : _jsx(XCircle, { className: "h-4 w-4 text-destructive" }), _jsx("span", { children: v.tekst }), !v.ok && (_jsx(Button, { asChild: true, size: "sm", variant: "outline", children: _jsx("a", { href: naar, children: "Instellen" }) }))] }));
|
|
68
|
+
return (_jsxs(Card, { children: [_jsxs(CardHeader, { className: "flex flex-row items-start justify-between gap-2 pb-3", children: [_jsxs("div", { children: [_jsx(CardTitle, { className: "text-base", children: "Klaar om te printen" }), _jsx(CardDescription, { children: "Per documentsoort: is er een layout, een printer en (bij etiketten) het juiste etiket?" })] }), _jsx(Button, { size: "sm", variant: "ghost", onClick: () => void load(), disabled: laden, "aria-label": "Opnieuw controleren", children: _jsx(RefreshCw, { className: `h-4 w-4 ${laden ? "animate-spin" : ""}` }) })] }), _jsx(CardContent, { children: _jsx("div", { className: "overflow-x-auto", children: _jsxs("table", { className: "w-full text-sm", children: [_jsx("thead", { className: "text-left text-muted-foreground", children: _jsxs("tr", { children: [_jsx("th", { className: "py-2 pr-4 font-medium", children: "Document" }), _jsx("th", { className: "py-2 pr-4 font-medium", children: "Layout" }), _jsx("th", { className: "py-2 pr-4 font-medium", children: "Printer" }), _jsx("th", { className: "py-2 font-medium", children: "Etiketmaat" })] }) }), _jsxs("tbody", { children: [regels.map((r) => (_jsxs("tr", { className: "border-t", children: [_jsx("td", { className: "py-2 pr-4 font-medium", children: documentTypeLabel(r.soort) }), _jsx("td", { className: "py-2 pr-4", children: _jsx(Vak, { v: r.layout, naar: NAAR_LAYOUTS }) }), _jsx("td", { className: "py-2 pr-4", children: _jsx(Vak, { v: r.printer, naar: NAAR_PRINTEN }) }), _jsx("td", { className: "py-2", children: _jsx(Vak, { v: r.etiket, naar: NAAR_PRINTEN }) })] }, r.soort))), !regels.length && (_jsx("tr", { children: _jsx("td", { colSpan: 4, className: "py-3 text-muted-foreground", children: laden ? "Controleren…" : "Niets te tonen." }) }))] })] }) }) })] }));
|
|
69
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LayoutsPage.d.ts","sourceRoot":"","sources":["../../src/components/LayoutsPage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"LayoutsPage.d.ts","sourceRoot":"","sources":["../../src/components/LayoutsPage.tsx"],"names":[],"mappings":"AAiFA,wBAAgB,WAAW,CAAC,EAAE,OAAe,EAAE,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,+BA2oB1E"}
|
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
-
import { useMemo, useState } from "react";
|
|
2
|
+
import { useEffect, useMemo, useState } from "react";
|
|
3
3
|
import { useAutoRefresh } from "../lib/useAutoRefresh.js";
|
|
4
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";
|
|
6
|
+
import { AlertTriangle, Copy, FileText, Pencil, Plus, Search, Settings2, Trash2 } from "lucide-react";
|
|
7
7
|
import { LayoutVerwijzingenKaart } from "./LayoutVerwijzingenKaart.js";
|
|
8
|
+
import { StandaardLayoutActies } from "./StandaardLayoutActies.js";
|
|
9
|
+
import { supabase as moduleDb } from "../lib/supabaseClient.js";
|
|
8
10
|
import { maakStandaardLayout } from "../lib/useDocumentData.js";
|
|
11
|
+
import { ontbrekendeStandaarden, soortenZonderKeuze } from "../lib/klaarOmTePrinten.js";
|
|
12
|
+
import { documentTypeLabel as soortLabel } from "../lib/documentTypes.js";
|
|
9
13
|
import { dupliceerLayout, maakLayout, updateLayout, useLayouts, verwijderLayout, } from "../lib/useDocumentData.js";
|
|
10
14
|
import { LayoutPrinterSelect } from "./LayoutPrinterSelect.js";
|
|
11
15
|
import { DOCUMENT_TYPES, FLORIDAY_LAYOUT_TOELICHTING, PAPIERFORMATEN, documentTypeLabel, isFloridayLayout, } from "../lib/documentTypes.js";
|
|
@@ -30,6 +34,13 @@ export function LayoutsPage({ ingebed = false } = {}) {
|
|
|
30
34
|
void reload(true);
|
|
31
35
|
}, 30000);
|
|
32
36
|
const navigate = useNavigate();
|
|
37
|
+
const [standaarden, setStandaarden] = useState([]);
|
|
38
|
+
useEffect(() => {
|
|
39
|
+
void (async () => {
|
|
40
|
+
const { data } = await moduleDb.from("layout_standaarden").select("sleutel, versie, documenttype, naam, config, page_settings");
|
|
41
|
+
setStandaarden(Array.isArray(data) ? data : []);
|
|
42
|
+
})();
|
|
43
|
+
}, []);
|
|
33
44
|
const [zoek, setZoek] = useState("");
|
|
34
45
|
const [typeFilter, setTypeFilter] = useState("alle");
|
|
35
46
|
const [statusFilter, setStatusFilter] = useState("alle");
|
|
@@ -156,7 +167,16 @@ export function LayoutsPage({ ingebed = false } = {}) {
|
|
|
156
167
|
}
|
|
157
168
|
};
|
|
158
169
|
const Wrapper = ingebed ? "div" : "main";
|
|
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"] }) })] }),
|
|
170
|
+
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"] }) })] }), ontbrekendeStandaarden(layouts).map((o) => (_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-3 rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm", children: [_jsxs("span", { children: ["Geen standaardlayout voor ", soortLabel(o.soort), " \u2013 maak deze standaard: ", _jsx("strong", { children: o.naam || "naamloos" })] }), _jsx(Button, { size: "sm", onClick: async () => {
|
|
171
|
+
try {
|
|
172
|
+
await maakStandaardLayout(o.layoutId);
|
|
173
|
+
toast.success(`${o.naam || "Layout"} is nu de standaard voor ${soortLabel(o.soort)}`);
|
|
174
|
+
await reload();
|
|
175
|
+
}
|
|
176
|
+
catch (e) {
|
|
177
|
+
toast.error(e instanceof Error ? e.message : "Standaard maken mislukt");
|
|
178
|
+
}
|
|
179
|
+
}, children: "Maak standaard" })] }, o.soort))), soortenZonderKeuze(layouts).map((o) => (_jsxs("div", { className: "flex items-center gap-2 rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm", children: [_jsx(AlertTriangle, { className: "h-4 w-4 text-destructive" }), _jsxs("span", { children: ["Geen standaardlayout voor ", soortLabel(o.soort), " \u2013 er zijn ", o.aantal, " actieve layouts. Kies er zelf \u00E9\u00E9n met ", _jsx("strong", { children: "Maak standaard" }), "."] })] }, `keuze-${o.soort}-${o.bron}`))), _jsx(LayoutVerwijzingenKaart, { onGewijzigd: () => void reload() }), _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 })), !isFloridayLayout(l) && !klantOntwerpLayout(l) && (_jsx(StandaardLayoutActies, { layout: l, standaarden: standaarden, onGewijzigd: () => void reload() }))] }), _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) => {
|
|
160
180
|
await updateLayout(l.id, { actief: v });
|
|
161
181
|
void reload();
|
|
162
182
|
} }), !l.is_standaard && (_jsx(Button, { variant: "ghost", size: "sm", onClick: async () => {
|
|
@@ -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":"AAeA,KAAK,GAAG,GAAG,cAAc,GAAG,aAAa,GAAG,WAAW,CAAC;AAYxD,wBAAgB,WAAW,CAAC,EAC1B,GAAoB,GACrB,EAAE;IACD,GAAG,CAAC,EAAE,GAAG,CAAC;CACX,+BA8BA"}
|
|
@@ -3,13 +3,15 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
3
3
|
// src/components/PrintenPage.tsx — één menu-item "Printen" met tabbladen voor
|
|
4
4
|
// printplekken (plekken, computers en printers samen) en standaardregels.
|
|
5
5
|
// ============================================================================
|
|
6
|
-
import { useState } from "react";
|
|
6
|
+
import { useEffect, useState } from "react";
|
|
7
|
+
import { zorgVoorStandaardLayouts } from "../lib/useDocumentData.js";
|
|
7
8
|
import { Laptop, MapPin, Route as RouteIcon } from "lucide-react";
|
|
8
9
|
import { ModuleTabs } from "./ModuleTabs.js";
|
|
9
10
|
import { PrintplekkenPage } from "./PrintplekkenPage.js";
|
|
10
11
|
import { DocumentRouteringPage } from "./DocumentRouteringPage.js";
|
|
11
12
|
import { LivePrintstatusRegel } from "./LivePrintstatusRegel.js";
|
|
12
13
|
import { WerkplekkenTab } from "./WerkplekkenTab.js";
|
|
14
|
+
import { KlaarOmTePrintenBlok } from "./KlaarOmTePrintenBlok.js";
|
|
13
15
|
const TABS = [
|
|
14
16
|
{
|
|
15
17
|
id: "printplekken",
|
|
@@ -20,6 +22,10 @@ const TABS = [
|
|
|
20
22
|
{ id: "routering", label: "Standaardregels", icon: RouteIcon },
|
|
21
23
|
];
|
|
22
24
|
export function PrintenPage({ tab = "printplekken", }) {
|
|
25
|
+
// Bij openen: ontbrekende standaardlayouts en eenduidige printers aanvullen (server, servicerol).
|
|
26
|
+
useEffect(() => {
|
|
27
|
+
void zorgVoorStandaardLayouts();
|
|
28
|
+
}, []);
|
|
23
29
|
const [actiefTab, setActiefTab] = useState(tab);
|
|
24
|
-
return (_jsx(_Fragment, { children: _jsxs(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" || nieuwTab === "werkplekken" ? nieuwTab : "printplekken"), children: [_jsx(LivePrintstatusRegel, {}), actiefTab === "werkplekken" ? (_jsx(WerkplekkenTab, {})) : actiefTab === "routering" ? (_jsx(DocumentRouteringPage, { ingebed: true })) : (_jsx(PrintplekkenPage, { ingebed: true }))] }) }));
|
|
30
|
+
return (_jsx(_Fragment, { children: _jsxs(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" || nieuwTab === "werkplekken" ? nieuwTab : "printplekken"), children: [_jsx(LivePrintstatusRegel, {}), _jsx(KlaarOmTePrintenBlok, {}), actiefTab === "werkplekken" ? (_jsx(WerkplekkenTab, {})) : actiefTab === "routering" ? (_jsx(DocumentRouteringPage, { ingebed: true })) : (_jsx(PrintplekkenPage, { ingebed: true }))] }) }));
|
|
25
31
|
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type LayoutStandaard } from "../lib/layoutStandaarden.js";
|
|
2
|
+
interface LayoutRij {
|
|
3
|
+
id: string;
|
|
4
|
+
naam: string;
|
|
5
|
+
documenttype: string;
|
|
6
|
+
bron?: string | null;
|
|
7
|
+
config?: unknown;
|
|
8
|
+
breedte_mm?: number;
|
|
9
|
+
hoogte_mm?: number;
|
|
10
|
+
standaard_sleutel?: string | null;
|
|
11
|
+
standaard_versie?: number | null;
|
|
12
|
+
}
|
|
13
|
+
export declare function StandaardLayoutActies({ layout, standaarden, onGewijzigd, }: {
|
|
14
|
+
layout: LayoutRij;
|
|
15
|
+
standaarden: LayoutStandaard[];
|
|
16
|
+
onGewijzigd: () => void;
|
|
17
|
+
}): import("react").JSX.Element | null;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=StandaardLayoutActies.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StandaardLayoutActies.d.ts","sourceRoot":"","sources":["../../src/components/StandaardLayoutActies.tsx"],"names":[],"mappings":"AAcA,OAAO,EAAoC,KAAK,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAOlG,UAAU,SAAS;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAoBD,wBAAgB,qBAAqB,CAAC,EACpC,MAAM,EAAE,WAAW,EAAE,WAAW,GACjC,EAAE;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,WAAW,EAAE,eAAe,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,IAAI,CAAA;CAAE,sCAgHhF"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
// ============================================================================
|
|
3
|
+
// src/components/StandaardLayoutActies.tsx — "Nieuwe standaard beschikbaar"
|
|
4
|
+
// (Bekijken / Overnemen) en "Terug naar de standaard van Flow Selections".
|
|
5
|
+
// Overnemen en terugzetten maken altijd een nieuwe versie; er wordt niets
|
|
6
|
+
// verwijderd en de vorige stand blijft terug te zetten.
|
|
7
|
+
// ============================================================================
|
|
8
|
+
import { useMemo, useState } from "react";
|
|
9
|
+
import { Badge, Button, Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, toast, } from "@flowselections/core";
|
|
10
|
+
import { supabase } from "../lib/supabaseClient.js";
|
|
11
|
+
import { PdfVoorbeeld } from "./PdfVoorbeeld.js";
|
|
12
|
+
import { useBevestig } from "./BevestigDialog.js";
|
|
13
|
+
import { nieuwereStandaard, standaardVoor } from "../lib/layoutStandaarden.js";
|
|
14
|
+
import { leesAfleverbriefConfig, leesPakbonConfig } from "../lib/pakbonBuilder.js";
|
|
15
|
+
import { renderPakbonDocument, voorbeeldPakbonOrder } from "../lib/pakbonHtml.js";
|
|
16
|
+
import { leesProductiebonConfig } from "../lib/productiebonBuilder.js";
|
|
17
|
+
import { renderProductiebonDocument } from "../lib/productiebonHtml.js";
|
|
18
|
+
function voorbeeldHtml(documenttype, config, titel, b, h) {
|
|
19
|
+
const opties = { breedteMm: b, hoogteMm: h, margeMm: 10, titel };
|
|
20
|
+
if (documenttype === "productiebon") {
|
|
21
|
+
return renderProductiebonDocument({ productiebon: leesProductiebonConfig(config) }, {}, opties);
|
|
22
|
+
}
|
|
23
|
+
if (documenttype === "afleverbrief") {
|
|
24
|
+
const basis = voorbeeldPakbonOrder();
|
|
25
|
+
return renderPakbonDocument(leesAfleverbriefConfig(config), { ...basis, karren: (basis.karren ?? []).slice(0, 1) }, opties);
|
|
26
|
+
}
|
|
27
|
+
return renderPakbonDocument(leesPakbonConfig(config), voorbeeldPakbonOrder(), opties);
|
|
28
|
+
}
|
|
29
|
+
async function rpc(naam, args) {
|
|
30
|
+
const { data, error } = await supabase.rpc(naam, args);
|
|
31
|
+
if (error)
|
|
32
|
+
throw new Error(error.message);
|
|
33
|
+
return data;
|
|
34
|
+
}
|
|
35
|
+
export function StandaardLayoutActies({ layout, standaarden, onGewijzigd, }) {
|
|
36
|
+
const [venster, bevestig] = useBevestig();
|
|
37
|
+
const [bekijk, setBekijk] = useState(false);
|
|
38
|
+
const [bezig, setBezig] = useState(false);
|
|
39
|
+
const std = standaardVoor(layout, standaarden);
|
|
40
|
+
const nieuwer = nieuwereStandaard(layout, standaarden);
|
|
41
|
+
const b = Number(layout.breedte_mm ?? 210) || 210;
|
|
42
|
+
const h = Number(layout.hoogte_mm ?? 297) || 297;
|
|
43
|
+
const huidigHtml = useMemo(() => (bekijk ? voorbeeldHtml(layout.documenttype, layout.config, layout.naam, b, h) : ""), [bekijk, layout.documenttype, layout.config, layout.naam, b, h]);
|
|
44
|
+
const nieuwHtml = useMemo(() => (bekijk && std ? voorbeeldHtml(layout.documenttype, std.config, std.naam, b, h) : ""), [bekijk, std, layout.documenttype, b, h]);
|
|
45
|
+
if (!std)
|
|
46
|
+
return null;
|
|
47
|
+
const overnemen = async (terug) => {
|
|
48
|
+
const ok = await bevestig({
|
|
49
|
+
titel: terug ? "Terug naar de standaard van Flow Selections?" : "Nieuwe standaard overnemen?",
|
|
50
|
+
tekst: "Je huidige layout wordt eerst als versie bewaard. Je kunt hem daarna altijd terugzetten.",
|
|
51
|
+
knop: terug ? "Terugzetten naar standaard" : "Overnemen",
|
|
52
|
+
});
|
|
53
|
+
if (!ok)
|
|
54
|
+
return;
|
|
55
|
+
setBezig(true);
|
|
56
|
+
try {
|
|
57
|
+
await rpc("layout_standaard_overnemen", { _layout_id: layout.id });
|
|
58
|
+
toast.success(terug ? "Layout staat weer op de standaard van Flow Selections" : "Nieuwe standaard overgenomen");
|
|
59
|
+
setBekijk(false);
|
|
60
|
+
onGewijzigd();
|
|
61
|
+
}
|
|
62
|
+
catch (e) {
|
|
63
|
+
toast.error(e instanceof Error ? e.message : "Mislukt");
|
|
64
|
+
}
|
|
65
|
+
finally {
|
|
66
|
+
setBezig(false);
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
const vorigeTerug = async () => {
|
|
70
|
+
setBezig(true);
|
|
71
|
+
try {
|
|
72
|
+
const { data, error } = await supabase
|
|
73
|
+
.from("document_layout_versions")
|
|
74
|
+
.select("id, versienummer, commentaar")
|
|
75
|
+
.eq("layout_id", layout.id)
|
|
76
|
+
.like("commentaar", "Vóór overnemen%")
|
|
77
|
+
.order("versienummer", { ascending: false })
|
|
78
|
+
.limit(1);
|
|
79
|
+
if (error)
|
|
80
|
+
throw new Error(error.message);
|
|
81
|
+
const v = Array.isArray(data) ? data[0] : null;
|
|
82
|
+
if (!v) {
|
|
83
|
+
toast.error("Er is geen eerdere stand om terug te zetten.");
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const ok = await bevestig({
|
|
87
|
+
titel: `Versie ${v.versienummer} terugzetten?`,
|
|
88
|
+
tekst: "Dit wordt een nieuwe versie; de huidige stand blijft in de geschiedenis.",
|
|
89
|
+
knop: "Terugzetten",
|
|
90
|
+
});
|
|
91
|
+
if (!ok)
|
|
92
|
+
return;
|
|
93
|
+
await rpc("layout_versie_terugzetten", { _versie_id: v.id });
|
|
94
|
+
toast.success(`Versie ${v.versienummer} teruggezet`);
|
|
95
|
+
onGewijzigd();
|
|
96
|
+
}
|
|
97
|
+
catch (e) {
|
|
98
|
+
toast.error(e instanceof Error ? e.message : "Mislukt");
|
|
99
|
+
}
|
|
100
|
+
finally {
|
|
101
|
+
setBezig(false);
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
return (_jsxs("div", { className: "mt-1 flex flex-wrap items-center gap-2", children: [venster, nieuwer && (_jsxs(_Fragment, { children: [_jsx(Badge, { variant: "outline", children: "Nieuwe standaard beschikbaar" }), _jsx(Button, { size: "sm", variant: "outline", onClick: () => setBekijk(true), children: "Bekijken" }), _jsx(Button, { size: "sm", disabled: bezig, onClick: () => void overnemen(false), children: "Overnemen" })] })), _jsx(Button, { size: "sm", variant: "ghost", disabled: bezig, onClick: () => void overnemen(true), children: "Terug naar de standaard van Flow Selections" }), _jsx(Button, { size: "sm", variant: "ghost", disabled: bezig, onClick: () => void vorigeTerug(), children: "Vorige stand terugzetten" }), _jsx(Dialog, { open: bekijk, onOpenChange: setBekijk, children: _jsxs(DialogContent, { className: "max-w-6xl", children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: "Nieuwe standaard bekijken" }), _jsxs(DialogDescription, { children: ["Links je huidige layout, rechts de standaard van Flow Selections (versie ", std.versie, ")."] })] }), _jsxs("div", { className: "grid max-h-[70vh] gap-4 overflow-auto md:grid-cols-2", children: [_jsxs("div", { className: "space-y-2", children: [_jsx("p", { className: "text-sm font-medium", children: "Huidig" }), huidigHtml && _jsx(PdfVoorbeeld, { html: huidigHtml, breedteMm: b, hoogteMm: h, margeMm: 10 })] }), _jsxs("div", { className: "space-y-2", children: [_jsx("p", { className: "text-sm font-medium", children: "Nieuwe standaard" }), nieuwHtml && _jsx(PdfVoorbeeld, { html: nieuwHtml, breedteMm: b, hoogteMm: h, margeMm: 10 })] })] }), _jsxs(DialogFooter, { children: [_jsx(Button, { variant: "outline", onClick: () => setBekijk(false), children: "Sluiten" }), _jsx(Button, { disabled: bezig, onClick: () => void overnemen(false), children: "Overnemen" })] })] }) })] }));
|
|
105
|
+
}
|
package/dist-lib/index.d.ts
CHANGED
|
@@ -117,4 +117,11 @@ export type { WerkplekVoorstel } from "./lib/werkplekOmzetting.js";
|
|
|
117
117
|
export { useIsBeheerder } from "./lib/beheerder.js";
|
|
118
118
|
export { toestandVanComputer, maakKoppelVoorstel, STATUS_ONBEKEND_TEKST, zelfdeNaamTekst, type ComputerToestand, type KoppelVoorstelRij, } from "./lib/computerKoppeling.js";
|
|
119
119
|
export { computerKoppelVoorstel, koppelComputerOpId } from "./lib/printService.functions.js";
|
|
120
|
+
export { BedrijfsgegevensKaart } from './components/BedrijfsgegevensKaart.js';
|
|
121
|
+
export { StandaardLayoutActies } from './components/StandaardLayoutActies.js';
|
|
122
|
+
export { nieuwereStandaard, standaardVoor } from './lib/layoutStandaarden.js';
|
|
123
|
+
export type { LayoutStandaard } from './lib/layoutStandaarden.js';
|
|
124
|
+
export { KlaarOmTePrintenBlok } from './components/KlaarOmTePrintenBlok.js';
|
|
125
|
+
export { bedrijfMetTerugval, leesBedrijfsgegevens, BEDRIJFSGEGEVENS_SLEUTEL } from './lib/bedrijfsgegevens.js';
|
|
126
|
+
export type { Bedrijfsgegevens } from './lib/bedrijfsgegevens.js';
|
|
120
127
|
//# sourceMappingURL=index.d.ts.map
|
package/dist-lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACvF,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,YAAY,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzE,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC5F,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC5E,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAChH,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAChF,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,UAAU,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,eAAe,EAAE,aAAa,EAAE,eAAe,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,cAAc,EAAE,UAAU,EAAE,eAAe,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,WAAW,EAAE,YAAY,EAAE,mBAAmB,EAAE,WAAW,EAAE,mBAAmB,EAAE,SAAS,EAAE,gBAAgB,EAAE,2BAA2B,EAAE,eAAe,EAAE,gBAAgB,EAAE,2BAA2B,EAAE,qBAAqB,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACvkB,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,YAAY,EAAE,kBAAkB,EAAE,WAAW,EAAE,mBAAmB,EAAE,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC9R,OAAO,EAAE,GAAG,EAAE,eAAe,EAAE,WAAW,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxJ,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACpF,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAChF,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EACL,wBAAwB,EACxB,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,4BAA4B,CAAC;AACpC,YAAY,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAC/E,OAAO,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AACjF,OAAO,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAChG,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,SAAS,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE,iBAAiB,EAAE,aAAa,EAAE,WAAW,EAAE,2BAA2B,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AACha,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7N,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,oBAAoB,EAAE,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,cAAc,EAAE,cAAc,EAAE,kBAAkB,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChX,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACxK,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC9H,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1H,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,aAAa,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC5H,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,2BAA2B,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AACzI,YAAY,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,YAAY,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,2BAA2B,EAAE,wBAAwB,EAAE,cAAc,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,4BAA4B,EAAE,eAAe,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC1Q,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,WAAW,EAAE,eAAe,EAAE,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjN,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACtH,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACvF,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,eAAe,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACvH,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,UAAU,EAAE,mBAAmB,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACzV,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC7F,YAAY,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACzF,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,aAAa,EACb,QAAQ,EACR,SAAS,EACT,wBAAwB,EACxB,mBAAmB,EACnB,uBAAuB,EAAE,iBAAiB,EAE1C,aAAa,EACb,mBAAmB,EACnB,mBAAmB,EACnB,yBAAyB,GAC1B,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,0BAA0B,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACzF,OAAO,EAAE,0BAA0B,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AACtF,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC1F,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACrF,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,YAAY,EACV,kBAAkB,EAClB,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,wBAAwB,EACxB,SAAS,GACV,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACnF,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,YAAY,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,0BAA0B,EAC1B,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,oBAAoB,EACpB,wBAAwB,EACxB,sBAAsB,EACtB,cAAc,EACd,gBAAgB,EAChB,6BAA6B,EAC7B,KAAK,kBAAkB,EACvB,aAAa,EACb,iBAAiB,EACjB,qBAAqB,EACrB,iBAAiB,EACjB,0BAA0B,EAC1B,oBAAoB,EACpB,eAAe,EACf,kBAAkB,EAClB,wBAAwB,EACxB,KAAK,eAAe,EACpB,mBAAmB,EACnB,0BAA0B,EAC1B,4BAA4B,EAC5B,cAAc,EACd,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAE,yBAAyB,EAAE,MAAM,wCAAwC,CAAC;AACnF,YAAY,EACV,SAAS,EACT,iBAAiB,EACjB,wBAAwB,EACxB,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,GACf,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,eAAO,MAAM,YAAY,EAAE,UAkB1B,CAAC;AAGF,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAEvE,OAAO,EACL,aAAa,EACb,qBAAqB,GACtB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,aAAa,EACb,iBAAiB,EACjB,eAAe,EACf,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,0BAA0B,EAAE,MAAM,yCAAyC,CAAC;AAGrF,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,cAAc,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC9M,YAAY,EAAE,QAAQ,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAChG,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,iBAAiB,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACvI,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAChG,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC7F,YAAY,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,EACrB,eAAe,EACf,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,GACvB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAE1F,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC3E,YAAY,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAC5G,YAAY,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC"}
|
package/dist-lib/index.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { MODULE_VERSIE } from './lib/shellPoort.js';
|
|
2
|
+
import { BedrijfsgegevensKaart } from './components/BedrijfsgegevensKaart.js';
|
|
1
3
|
// ============================================================================
|
|
2
4
|
// src/index.ts — MODULE CONTRACT (layout-maker)
|
|
3
5
|
// ============================================================================
|
|
@@ -76,7 +78,7 @@ export { GeenPrinterFout } from './lib/printApi.js';
|
|
|
76
78
|
export const layoutmodule = {
|
|
77
79
|
id: "layout-maker",
|
|
78
80
|
name: "Printen",
|
|
79
|
-
version:
|
|
81
|
+
version: MODULE_VERSIE,
|
|
80
82
|
nav: {
|
|
81
83
|
label: "Printen",
|
|
82
84
|
href: "/layouts-printers/documenten",
|
|
@@ -87,7 +89,7 @@ export const layoutmodule = {
|
|
|
87
89
|
{ label: "Printwachtrij", href: "/layouts-printers/wachtrij", icon: ListChecks },
|
|
88
90
|
],
|
|
89
91
|
},
|
|
90
|
-
settingsCards: [],
|
|
92
|
+
settingsCards: [{ component: BedrijfsgegevensKaart, order: 50 }],
|
|
91
93
|
};
|
|
92
94
|
export { voorbeeldPrint } from './lib/voorbeeldPrint.js';
|
|
93
95
|
export { LayoutPrinterSelect } from './components/LayoutPrinterSelect.js';
|
|
@@ -107,3 +109,8 @@ export { haalOmzettingVoorstel, pasOmzettingToe, herbereken } from "./lib/werkpl
|
|
|
107
109
|
export { useIsBeheerder } from "./lib/beheerder.js";
|
|
108
110
|
export { toestandVanComputer, maakKoppelVoorstel, STATUS_ONBEKEND_TEKST, zelfdeNaamTekst, } from "./lib/computerKoppeling.js";
|
|
109
111
|
export { computerKoppelVoorstel, koppelComputerOpId } from "./lib/printService.functions.js";
|
|
112
|
+
export { BedrijfsgegevensKaart } from './components/BedrijfsgegevensKaart.js';
|
|
113
|
+
export { StandaardLayoutActies } from './components/StandaardLayoutActies.js';
|
|
114
|
+
export { nieuwereStandaard, standaardVoor } from './lib/layoutStandaarden.js';
|
|
115
|
+
export { KlaarOmTePrintenBlok } from './components/KlaarOmTePrintenBlok.js';
|
|
116
|
+
export { bedrijfMetTerugval, leesBedrijfsgegevens, BEDRIJFSGEGEVENS_SLEUTEL } from './lib/bedrijfsgegevens.js';
|