@flowselections/layout-maker 1.57.2 → 1.59.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-lib/components/ComputersLijst.d.ts +1 -0
- package/dist-lib/components/ComputersLijst.d.ts.map +1 -1
- package/dist-lib/components/ComputersLijst.js +9 -5
- package/dist-lib/components/LayoutVerwijzingenKaart.js +3 -2
- package/dist-lib/components/PrintQueuePage.d.ts.map +1 -1
- package/dist-lib/components/PrintQueuePage.js +8 -5
- package/dist-lib/components/PrintplekDetailPage.d.ts.map +1 -1
- package/dist-lib/components/PrintplekDetailPage.js +4 -2
- package/dist-lib/components/PrintplekkenPage.d.ts.map +1 -1
- package/dist-lib/components/PrintplekkenPage.js +10 -2
- package/dist-lib/components/TestprintDialog.d.ts.map +1 -1
- package/dist-lib/components/TestprintDialog.js +5 -1
- package/dist-lib/components/WerkplekOmzettingStap.d.ts.map +1 -1
- package/dist-lib/components/WerkplekOmzettingStap.js +1 -1
- package/dist-lib/components/WerkplekkenTab.d.ts.map +1 -1
- package/dist-lib/components/WerkplekkenTab.js +4 -3
- package/dist-lib/integrations/supabase/types.d.ts +267 -2
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/types.js +1 -0
- package/dist-lib/lib/documentTypes.d.ts +4 -1
- package/dist-lib/lib/documentTypes.d.ts.map +1 -1
- package/dist-lib/lib/documentTypes.js +4 -0
- package/dist-lib/lib/layoutVerwijzingen.d.ts +20 -1
- package/dist-lib/lib/layoutVerwijzingen.d.ts.map +1 -1
- package/dist-lib/lib/layoutVerwijzingen.js +21 -3
- package/dist-lib/lib/orderData.server.d.ts.map +1 -1
- package/dist-lib/lib/orderData.server.js +26 -3
- package/dist-lib/lib/pakbonHtml.d.ts.map +1 -1
- package/dist-lib/lib/pakbonHtml.js +8 -1
- package/dist-lib/lib/printQueue.server.d.ts +6 -0
- package/dist-lib/lib/printQueue.server.d.ts.map +1 -1
- package/dist-lib/lib/printQueue.server.js +37 -3
- package/dist-lib/lib/printRoutering.d.ts +3 -1
- package/dist-lib/lib/printRoutering.d.ts.map +1 -1
- package/dist-lib/lib/printService.functions.d.ts.map +1 -1
- package/dist-lib/lib/printService.functions.js +3 -1
- package/dist-lib/lib/printService.server.d.ts +3 -1
- package/dist-lib/lib/printService.server.d.ts.map +1 -1
- package/dist-lib/lib/printService.server.js +3 -1
- package/dist-lib/lib/printnodeStatus.d.ts.map +1 -1
- package/dist-lib/lib/printnodeStatus.js +4 -0
- package/dist-lib/lib/printnodeWebhook.d.ts +2 -0
- package/dist-lib/lib/printnodeWebhook.d.ts.map +1 -1
- package/dist-lib/lib/printnodeWebhook.js +31 -1
- package/dist-lib/lib/printnodeWebhookBeheer.server.d.ts +2 -0
- package/dist-lib/lib/printnodeWebhookBeheer.server.d.ts.map +1 -1
- package/dist-lib/lib/printnodeWebhookBeheer.server.js +12 -2
- package/dist-lib/lib/productiebonHtml.d.ts.map +1 -1
- package/dist-lib/lib/productiebonHtml.js +7 -1
- package/dist-lib/lib/testprint.d.ts +5 -1
- package/dist-lib/lib/testprint.d.ts.map +1 -1
- package/dist-lib/lib/testprint.js +55 -11
- package/dist-lib/lib/vervoerder.d.ts +13 -0
- package/dist-lib/lib/vervoerder.d.ts.map +1 -0
- package/dist-lib/lib/vervoerder.js +58 -0
- package/dist-lib/lib/waaromPrinter.d.ts +2 -0
- package/dist-lib/lib/waaromPrinter.d.ts.map +1 -1
- package/dist-lib/lib/waaromPrinter.js +13 -0
- package/dist-lib/lib/werkplekOmzetting.d.ts +2 -0
- package/dist-lib/lib/werkplekOmzetting.d.ts.map +1 -1
- package/dist-lib/lib/werkplekOmzetting.js +2 -1
- package/dist-lib/lib/werkplekken.js +2 -2
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"productiebonHtml.d.ts","sourceRoot":"","sources":["../../src/lib/productiebonHtml.ts"],"names":[],"mappings":"AAwBA,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAI/B,MAAM,WAAW,wBAAwB;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,GAAG,CAgBxD;AAED,gEAAgE;AAChE,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAG9D;AA6HD,yDAAyD;AACzD,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,OAAO,EACjB,MAAM,GAAE,wBAA6B,GACpC,MAAM,
|
|
1
|
+
{"version":3,"file":"productiebonHtml.d.ts","sourceRoot":"","sources":["../../src/lib/productiebonHtml.ts"],"names":[],"mappings":"AAwBA,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAI/B,MAAM,WAAW,wBAAwB;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,GAAG,CAgBxD;AAED,gEAAgE;AAChE,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAG9D;AA6HD,yDAAyD;AACzD,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,OAAO,EACjB,MAAM,GAAE,wBAA6B,GACpC,MAAM,CAsCR"}
|
|
@@ -147,6 +147,12 @@ export function renderProductiebonDocument(config, gegevens, opties = {}) {
|
|
|
147
147
|
return inhoud ? `<div class="blok">${inhoud}</div>` : "";
|
|
148
148
|
})
|
|
149
149
|
.join("");
|
|
150
|
+
// Klantnaam groot bovenaan, alleen als de opdracht hem echt aanlevert.
|
|
151
|
+
const bronProduct = (gegevens?.["product"] ?? {});
|
|
152
|
+
const klantNaam = String(bronProduct["klantnaam"] ?? "").trim();
|
|
153
|
+
const klantKop = klantNaam
|
|
154
|
+
? `<div class="blok" style="font-size:16pt;font-weight:800;line-height:1.15">${esc(klantNaam)}</div>`
|
|
155
|
+
: "";
|
|
150
156
|
return `<!doctype html><html lang="nl"><head><meta charset="utf-8" />
|
|
151
157
|
<title>${esc(opties.titel ?? "Productiebon")}</title>
|
|
152
158
|
<style>
|
|
@@ -162,5 +168,5 @@ body { font-family: Arial, Helvetica, sans-serif; font-size: 9pt; color: #111827
|
|
|
162
168
|
.tabel { width: 100%; border-collapse: collapse; table-layout: fixed; }
|
|
163
169
|
.tabel th { text-align: left; font-weight: 600; }
|
|
164
170
|
.regel { padding: 0.4mm 0; }
|
|
165
|
-
</style></head><body>${body}</body></html>`;
|
|
171
|
+
</style></head><body>${klantKop}${body}</body></html>`;
|
|
166
172
|
}
|
|
@@ -22,7 +22,11 @@ export declare function bepaalTestOverzicht(ctx: TestprintContext): Promise<Test
|
|
|
22
22
|
* zodat een testvel nooit voor een echt document kan doorgaan. Bovenaan staat
|
|
23
23
|
* waar hij vandaan komt.
|
|
24
24
|
*/
|
|
25
|
-
export declare function testHtml(velden: Record<string, string
|
|
25
|
+
export declare function testHtml(velden: Record<string, string>, opts?: {
|
|
26
|
+
smal?: boolean;
|
|
27
|
+
}): string;
|
|
28
|
+
/** Smal etiket: kleinste zijde van het geladen etiket onder 40 mm. */
|
|
29
|
+
export declare function isSmalEtiket(etiket: unknown): boolean;
|
|
26
30
|
export interface TestprintResultaat {
|
|
27
31
|
jobId: string;
|
|
28
32
|
printerId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testprint.d.ts","sourceRoot":"","sources":["../../src/lib/testprint.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"testprint.d.ts","sourceRoot":"","sources":["../../src/lib/testprint.ts"],"names":[],"mappings":"AA0BA,MAAM,WAAW,gBAAgB;IAC/B,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,kDAAkD;IAClD,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CA+B1F;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,MAAM,CA0B9F;AAED,sEAAsE;AACtE,wBAAgB,YAAY,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAMrD;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,gBAAgB,GACpB,OAAO,CAAC,kBAAkB,CAAC,CA6C7B"}
|
|
@@ -5,8 +5,22 @@
|
|
|
5
5
|
// ============================================================================
|
|
6
6
|
import { supabase } from "./supabaseClient.js";
|
|
7
7
|
import { DOCUMENT_TYPES, documentTypeLabel } from "./documentTypes.js";
|
|
8
|
-
import { printHtml
|
|
8
|
+
import { printHtml } from "./printApi.js";
|
|
9
|
+
import { routeringMeldingTekst } from "./waaromPrinter.js";
|
|
9
10
|
import { printplekNaam } from "./printplekken.js";
|
|
11
|
+
import { routeringVoor } from "./printRoutering.js";
|
|
12
|
+
/** Naam van de werkplek: uit de routering (op id), anders de computernaam. */
|
|
13
|
+
async function werkplekNaamVoor(id, naam, computer) {
|
|
14
|
+
if (naam)
|
|
15
|
+
return naam;
|
|
16
|
+
if (id) {
|
|
17
|
+
const { data } = await supabase.from("print_werkplekken").select("naam").eq("id", id).maybeSingle();
|
|
18
|
+
const n = data?.naam;
|
|
19
|
+
if (n)
|
|
20
|
+
return n;
|
|
21
|
+
}
|
|
22
|
+
return computer;
|
|
23
|
+
}
|
|
10
24
|
const arr = (v) => (Array.isArray(v) ? v : []);
|
|
11
25
|
/**
|
|
12
26
|
* Bepaalt voor elke documentsoort welke printer er volgens de instellingen
|
|
@@ -19,8 +33,11 @@ export async function bepaalTestOverzicht(ctx) {
|
|
|
19
33
|
const namen = new Map(arr(data).map((p) => [p.id, p.naam]));
|
|
20
34
|
const regels = await Promise.all(DOCUMENT_TYPES.map(async (d) => {
|
|
21
35
|
let printerId = null;
|
|
36
|
+
let melding = null;
|
|
22
37
|
try {
|
|
23
|
-
|
|
38
|
+
const u = await routeringVoor({ documenttype: d.value, printplekId: printplekId ?? null, werkplek: werkplek ?? null });
|
|
39
|
+
printerId = u.printer_id;
|
|
40
|
+
melding = u.melding ?? null;
|
|
24
41
|
}
|
|
25
42
|
catch {
|
|
26
43
|
printerId = null;
|
|
@@ -30,9 +47,9 @@ export async function bepaalTestOverzicht(ctx) {
|
|
|
30
47
|
label: d.label,
|
|
31
48
|
printerId,
|
|
32
49
|
printerNaam: printerId ? (namen.get(printerId) ?? "Printer") : null,
|
|
33
|
-
reden: printerId
|
|
50
|
+
reden: routeringMeldingTekst(melding) ?? (printerId
|
|
34
51
|
? null
|
|
35
|
-
: "Nog geen printer ingesteld voor deze documentsoort op deze plek.",
|
|
52
|
+
: "Nog geen printer ingesteld voor deze documentsoort op deze plek."),
|
|
36
53
|
};
|
|
37
54
|
}));
|
|
38
55
|
return regels;
|
|
@@ -42,16 +59,39 @@ export async function bepaalTestOverzicht(ctx) {
|
|
|
42
59
|
* zodat een testvel nooit voor een echt document kan doorgaan. Bovenaan staat
|
|
43
60
|
* waar hij vandaan komt.
|
|
44
61
|
*/
|
|
45
|
-
export function testHtml(velden) {
|
|
62
|
+
export function testHtml(velden, opts = {}) {
|
|
63
|
+
// Nooit midden in een woord afbreken: alleen op spaties.
|
|
64
|
+
const geenAfbreken = "word-break:keep-all;overflow-wrap:normal;hyphens:none;-webkit-hyphens:none";
|
|
65
|
+
if (opts.smal) {
|
|
66
|
+
// Smal etiket (bijv. 25 mm): kleine letter, elk veld op een eigen regel.
|
|
67
|
+
const regels = Object.entries(velden)
|
|
68
|
+
.map(([k, v]) => `<div style="margin:0 0 0.4mm"><span style="color:#555">${k}:</span> <b>${v}</b></div>`)
|
|
69
|
+
.join("");
|
|
70
|
+
return `<div style="position:relative;min-height:100%;padding:1mm;font-family:Arial,Helvetica,sans-serif;font-size:5.5pt;line-height:1.2;overflow:hidden;${geenAfbreken}">
|
|
71
|
+
<div style="font-weight:800;font-size:6.5pt;margin:0 0 0.8mm;white-space:nowrap">TESTAFDRUK</div>
|
|
72
|
+
<div style="font-size:5pt;margin:0 0 0.8mm">niet gebruiken</div>
|
|
73
|
+
${regels}
|
|
74
|
+
<div style="position:absolute;left:50%;top:50%;transform:translate(-50%,-50%) rotate(-60deg);white-space:nowrap;font-size:9pt;font-weight:900;color:#999;opacity:0.5;border:0.5mm solid #999;padding:0.3mm 1.5mm">TESTAFDRUK</div>
|
|
75
|
+
</div>`;
|
|
76
|
+
}
|
|
46
77
|
const rijen = Object.entries(velden)
|
|
47
78
|
.map(([k, v]) => `<tr><td style="padding:0.6mm 3mm 0.6mm 0;color:#555">${k}</td><td style="padding:0.6mm 0;font-weight:700">${v}</td></tr>`)
|
|
48
79
|
.join("");
|
|
49
|
-
return `<div style="position:relative;min-height:100%;padding:3mm;font-family:Arial,Helvetica,sans-serif;font-size:9pt;overflow:hidden">
|
|
80
|
+
return `<div style="position:relative;min-height:100%;padding:3mm;font-family:Arial,Helvetica,sans-serif;font-size:9pt;overflow:hidden;${geenAfbreken}">
|
|
50
81
|
<div style="font-weight:800;font-size:11pt;margin:0 0 1.5mm">TESTAFDRUK — niet gebruiken</div>
|
|
51
82
|
<table style="border-collapse:collapse">${rijen}</table>
|
|
52
83
|
<div style="position:absolute;left:50%;top:50%;transform:translate(-50%,-50%) rotate(-35deg);white-space:nowrap;font-size:28pt;font-weight:900;color:#999;opacity:0.55;border:1.2mm solid #999;padding:1mm 4mm">TESTAFDRUK — niet gebruiken</div>
|
|
53
84
|
</div>`;
|
|
54
85
|
}
|
|
86
|
+
/** Smal etiket: kleinste zijde van het geladen etiket onder 40 mm. */
|
|
87
|
+
export function isSmalEtiket(etiket) {
|
|
88
|
+
const e = (etiket ?? null);
|
|
89
|
+
const b = Number(e?.breedte_mm);
|
|
90
|
+
const h = Number(e?.hoogte_mm);
|
|
91
|
+
if (!Number.isFinite(b) || !Number.isFinite(h) || b <= 0 || h <= 0)
|
|
92
|
+
return false;
|
|
93
|
+
return Math.min(b, h) < 40;
|
|
94
|
+
}
|
|
55
95
|
/**
|
|
56
96
|
* Verstuurt één testprint via de gewone printwachtrij, zodat exact dezelfde
|
|
57
97
|
* routering en PrintNode-afhandeling worden gebruikt als bij echte documenten.
|
|
@@ -60,7 +100,9 @@ export async function verstuurTestprint(documenttype, ctx) {
|
|
|
60
100
|
const printplekId = ctx.printplekId ?? undefined;
|
|
61
101
|
const werkplek = ctx.werkplek ?? undefined;
|
|
62
102
|
const plekNaam = printplekId ? await printplekNaam(printplekId) : null;
|
|
63
|
-
|
|
103
|
+
// Dezelfde gedeelde routering als het echte printen.
|
|
104
|
+
const uitkomst = await routeringVoor({ documenttype, printplekId: printplekId ?? null, werkplek: werkplek ?? null });
|
|
105
|
+
const printerId = uitkomst.printer_id;
|
|
64
106
|
if (!printerId) {
|
|
65
107
|
throw new Error(plekNaam
|
|
66
108
|
? `Geen printer voor ${documentTypeLabel(documenttype)} op ${plekNaam} — stel dit in bij deze printplek.`
|
|
@@ -68,18 +110,20 @@ export async function verstuurTestprint(documenttype, ctx) {
|
|
|
68
110
|
}
|
|
69
111
|
const { data } = await supabase
|
|
70
112
|
.from("printers")
|
|
71
|
-
.select("naam")
|
|
113
|
+
.select("naam, geladen_etiket")
|
|
72
114
|
.eq("id", printerId)
|
|
73
115
|
.maybeSingle();
|
|
74
|
-
const
|
|
116
|
+
const pr = data;
|
|
117
|
+
const printerNaam = pr?.naam ?? "Printer";
|
|
118
|
+
const werkplekNaam = await werkplekNaamVoor(uitkomst.werkplek_id ?? null, uitkomst.werkplek_naam ?? null, werkplek ?? null);
|
|
75
119
|
const testId = `test-${documenttype}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
76
120
|
const html = testHtml({
|
|
77
121
|
Documentsoort: documentTypeLabel(documenttype),
|
|
78
122
|
Printplek: plekNaam ?? "—",
|
|
79
|
-
Werkplek:
|
|
123
|
+
Werkplek: werkplekNaam ?? "—",
|
|
80
124
|
Printer: printerNaam,
|
|
81
125
|
Tijdstip: new Date().toLocaleString("nl-NL"),
|
|
82
|
-
});
|
|
126
|
+
}, { smal: isSmalEtiket(pr?.geladen_etiket) });
|
|
83
127
|
const { jobId } = await printHtml({
|
|
84
128
|
documenttype,
|
|
85
129
|
documentnaam: `Testprint ${documentTypeLabel(documenttype)}`,
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface VervoerderInfo {
|
|
2
|
+
transporteur: string;
|
|
3
|
+
ophaalmoment: string;
|
|
4
|
+
ophaaladres: string;
|
|
5
|
+
}
|
|
6
|
+
/** ISO-tijd (UTC) → leesbaar in Europe/Amsterdam. Ongeldig → leeg. */
|
|
7
|
+
export declare function ophaalmomentTekst(iso: unknown): string;
|
|
8
|
+
export declare function vervoerderUitPayload(payload: unknown): VervoerderInfo;
|
|
9
|
+
/** Zet bekende waarden op order.transport; ontbrekende blijven leeg (regel valt weg). */
|
|
10
|
+
export declare function metVervoerder<T extends {
|
|
11
|
+
transport: Record<string, unknown>;
|
|
12
|
+
}>(order: T, payload: unknown): T;
|
|
13
|
+
//# sourceMappingURL=vervoerder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vervoerder.d.ts","sourceRoot":"","sources":["../../src/lib/vervoerder.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAID,sEAAsE;AACtE,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAUtD;AAeD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,cAAc,CAWrE;AAED,yFAAyF;AACzF,wBAAgB,aAAa,CAAC,CAAC,SAAS;IAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,GAAG,CAAC,CAW7G"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// src/lib/vervoerder.ts — vervoerder en ophaalmoment uit de printopdracht.
|
|
3
|
+
// Alleen uit payload; nooit aanvullen. Een vervoerdersadres is geen ophaaladres.
|
|
4
|
+
// ============================================================================
|
|
5
|
+
const tekst = (v) => (typeof v === "string" ? v.trim() : "");
|
|
6
|
+
/** ISO-tijd (UTC) → leesbaar in Europe/Amsterdam. Ongeldig → leeg. */
|
|
7
|
+
export function ophaalmomentTekst(iso) {
|
|
8
|
+
const s = tekst(iso);
|
|
9
|
+
if (!s)
|
|
10
|
+
return "";
|
|
11
|
+
const d = new Date(s);
|
|
12
|
+
if (Number.isNaN(d.getTime()))
|
|
13
|
+
return "";
|
|
14
|
+
return new Intl.DateTimeFormat("nl-NL", {
|
|
15
|
+
timeZone: "Europe/Amsterdam",
|
|
16
|
+
weekday: "short", day: "2-digit", month: "2-digit", year: "numeric",
|
|
17
|
+
hour: "2-digit", minute: "2-digit",
|
|
18
|
+
}).format(d);
|
|
19
|
+
}
|
|
20
|
+
function adresTekst(v) {
|
|
21
|
+
if (typeof v === "string")
|
|
22
|
+
return v.trim();
|
|
23
|
+
if (!v || typeof v !== "object")
|
|
24
|
+
return "";
|
|
25
|
+
const a = v;
|
|
26
|
+
const delen = [
|
|
27
|
+
tekst(a["naam"]),
|
|
28
|
+
[tekst(a["straat"] ?? a["adres"]), tekst(a["huisnummer"])].filter(Boolean).join(" "),
|
|
29
|
+
[tekst(a["postcode"]), tekst(a["plaats"])].filter(Boolean).join(" "),
|
|
30
|
+
tekst(a["land"]),
|
|
31
|
+
].filter(Boolean);
|
|
32
|
+
return delen.join(", ");
|
|
33
|
+
}
|
|
34
|
+
export function vervoerderUitPayload(payload) {
|
|
35
|
+
const p = (payload && typeof payload === "object" ? payload : {});
|
|
36
|
+
const v = (p["vervoerder"] && typeof p["vervoerder"] === "object" ? p["vervoerder"] : {});
|
|
37
|
+
const naam = tekst(v["naam"]);
|
|
38
|
+
const code = tekst(v["code"]);
|
|
39
|
+
return {
|
|
40
|
+
transporteur: naam ? (code ? `${naam} (${code})` : naam) : "",
|
|
41
|
+
ophaalmoment: ophaalmomentTekst(p["ophaalmoment"]),
|
|
42
|
+
// Alleen payload.ophaaladres; vervoerder.adres wordt bewust genegeerd.
|
|
43
|
+
ophaaladres: adresTekst(p["ophaaladres"]),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/** Zet bekende waarden op order.transport; ontbrekende blijven leeg (regel valt weg). */
|
|
47
|
+
export function metVervoerder(order, payload) {
|
|
48
|
+
const v = vervoerderUitPayload(payload);
|
|
49
|
+
return {
|
|
50
|
+
...order,
|
|
51
|
+
transport: {
|
|
52
|
+
...order.transport,
|
|
53
|
+
...(v.transporteur ? { transporteur: v.transporteur } : {}),
|
|
54
|
+
ophaalmoment: v.ophaalmoment,
|
|
55
|
+
ophaaladres: v.ophaaladres,
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
}
|
|
@@ -4,4 +4,6 @@ import type { RouteringUitkomst } from "./printRoutering.js";
|
|
|
4
4
|
* "Werkplek Kantoor → A4-printer XP-2200 (regel: papierformaat A4)".
|
|
5
5
|
*/
|
|
6
6
|
export declare function waaromDezePrinter(u: Pick<RouteringUitkomst, "bron" | "papierformaat"> & Partial<Pick<RouteringUitkomst, "werkplek_naam" | "printer_rol" | "werkplek">>, printerNaam: string | null, plekNaam?: string | null, extra?: string | null): string;
|
|
7
|
+
/** Leesbare tekst bij de melding uit de gedeelde routering. */
|
|
8
|
+
export declare function routeringMeldingTekst(melding: string | null | undefined): string | null;
|
|
7
9
|
//# sourceMappingURL=waaromPrinter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"waaromPrinter.d.ts","sourceRoot":"","sources":["../../src/lib/waaromPrinter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAiB,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAYzE;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,GAAG,eAAe,CAAC,GAClD,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,eAAe,GAAG,aAAa,GAAG,UAAU,CAAC,CAAC,EAChF,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,EACxB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GACpB,MAAM,CAkBR"}
|
|
1
|
+
{"version":3,"file":"waaromPrinter.d.ts","sourceRoot":"","sources":["../../src/lib/waaromPrinter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAiB,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAYzE;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,GAAG,eAAe,CAAC,GAClD,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,eAAe,GAAG,aAAa,GAAG,UAAU,CAAC,CAAC,EAChF,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,EACxB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GACpB,MAAM,CAkBR;AAGD,+DAA+D;AAC/D,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAWvF"}
|
|
@@ -33,3 +33,16 @@ export function waaromDezePrinter(u, printerNaam, plekNaam, extra) {
|
|
|
33
33
|
const regel = u.bron === "werkplek_formaat" ? `papierformaat${formaat}` : BRON_TEKST[u.bron];
|
|
34
34
|
return `${wie} (regel: ${regel})${extra ? ` · ${extra}` : ""}`;
|
|
35
35
|
}
|
|
36
|
+
/** Leesbare tekst bij de melding uit de gedeelde routering. */
|
|
37
|
+
export function routeringMeldingTekst(melding) {
|
|
38
|
+
switch (melding) {
|
|
39
|
+
case "geen_etiketlayout":
|
|
40
|
+
return "Deze soort heeft nog geen etiketlayout (layout staat op A4)";
|
|
41
|
+
case "geen_labelprinter":
|
|
42
|
+
return "Etiketsoort: geen labelprinter op deze werkplek of printplek — er wordt niets geprint.";
|
|
43
|
+
case "meerdere_labelprinters":
|
|
44
|
+
return "Etiketsoort: deze printplek heeft meerdere labelprinters — kies een werkplek; er wordt niets geprint.";
|
|
45
|
+
default:
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -5,6 +5,8 @@ export interface VoorstelSoort {
|
|
|
5
5
|
printer_id: string | null;
|
|
6
6
|
na_printer_id: string | null;
|
|
7
7
|
verschil: boolean;
|
|
8
|
+
/** Etiketsoort waarvan de layout op A4 staat (of die geen layout heeft). */
|
|
9
|
+
geen_etiketlayout?: boolean;
|
|
8
10
|
}
|
|
9
11
|
export interface WerkplekVoorstel {
|
|
10
12
|
naam: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"werkplekOmzetting.d.ts","sourceRoot":"","sources":["../../src/lib/werkplekOmzetting.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"werkplekOmzetting.d.ts","sourceRoot":"","sources":["../../src/lib/werkplekOmzetting.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,EAAE,OAAO,CAAC;IAClB,4EAA4E;IAC5E,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,gBAAgB,EAAE,CAQ9D;AAED,+EAA+E;AAC/E,wBAAgB,UAAU,CAAC,CAAC,EAAE,gBAAgB,GAAG,gBAAgB,CAQhE;AAED,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAIzE;AAED,wBAAsB,eAAe,CAAC,WAAW,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAQxF"}
|
|
@@ -4,13 +4,14 @@
|
|
|
4
4
|
// pas na bevestiging maakt de database alles in één keer aan (alles of niets).
|
|
5
5
|
// ============================================================================
|
|
6
6
|
import { supabase } from "./supabaseClient.js";
|
|
7
|
+
import { isEtiketSoort } from "./documentTypes.js";
|
|
7
8
|
const db = supabase;
|
|
8
9
|
const arr = (v) => (Array.isArray(v) ? v : []);
|
|
9
10
|
export function leesVoorstel(data) {
|
|
10
11
|
return arr(data).map((w) => ({
|
|
11
12
|
...w,
|
|
12
13
|
bestaat: w.bestaat === true,
|
|
13
|
-
soorten: arr(w.soorten),
|
|
14
|
+
soorten: arr(w.soorten).map((s) => isEtiketSoort(s.documenttype) ? { ...s, klasse: "label", geen_etiketlayout: s.geen_etiketlayout ?? s.klasse !== "label" } : s),
|
|
14
15
|
}));
|
|
15
16
|
}
|
|
16
17
|
/** Na de omzetting: label-documenten naar de labelprinter, de rest naar A4. */
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
// ============================================================================
|
|
6
6
|
import { useCallback, useEffect, useState } from "react";
|
|
7
7
|
import { supabase } from "./supabaseClient.js";
|
|
8
|
-
import { PAPIERFORMATEN } from "./documentTypes.js";
|
|
8
|
+
import { ETIKET_SOORTEN, PAPIERFORMATEN } from "./documentTypes.js";
|
|
9
9
|
import { leesGeladenEtiket } from "./etiketControle.js";
|
|
10
10
|
const arr = (v) => (Array.isArray(v) ? v : []);
|
|
11
11
|
// Nieuwe tabellen staan nog niet in elke gegenereerde typelijst van een Shell.
|
|
@@ -21,7 +21,7 @@ export function formaatKlasse(code) {
|
|
|
21
21
|
return ["A4", "A5", "A3", "LETTER", "LEGAL", "VRIJ"].includes(c) ? "a4" : "label";
|
|
22
22
|
}
|
|
23
23
|
/** Past de documentsoort bij het papierformaat van de layout? */
|
|
24
|
-
const LABEL_SOORTEN = new Set(
|
|
24
|
+
const LABEL_SOORTEN = new Set(ETIKET_SOORTEN);
|
|
25
25
|
export function soortPastBijFormaat(documenttype, papierformaat) {
|
|
26
26
|
const klasse = formaatKlasse(papierformaat);
|
|
27
27
|
const labelSoort = LABEL_SOORTEN.has(String(documenttype));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flowselections/layout-maker",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.59.1",
|
|
4
4
|
"flowselections": {
|
|
5
5
|
"moduleId": "layout-maker",
|
|
6
6
|
"pages": [
|
|
@@ -139,13 +139,13 @@
|
|
|
139
139
|
"@cloudflare/vite-plugin": "^1.25.5",
|
|
140
140
|
"@eslint/js": "^9.32.0",
|
|
141
141
|
"@flowselections/core": "1.0.29",
|
|
142
|
-
"@lovable.dev/vite-tanstack-config": "2.
|
|
142
|
+
"@lovable.dev/vite-tanstack-config": "2.26.5",
|
|
143
143
|
"@rsbuild/core": "^1.0.0",
|
|
144
144
|
"@tailwindcss/vite": "^4.2.1",
|
|
145
145
|
"@tanstack/react-query": "^5.83.0",
|
|
146
|
-
"@tanstack/react-router": "
|
|
147
|
-
"@tanstack/react-start": "
|
|
148
|
-
"@tanstack/router-plugin": "
|
|
146
|
+
"@tanstack/react-router": "1.169.1",
|
|
147
|
+
"@tanstack/react-start": "1.167.63",
|
|
148
|
+
"@tanstack/router-plugin": "1.167.33",
|
|
149
149
|
"@types/node": "^22.16.5",
|
|
150
150
|
"@types/react": "^19.2.0",
|
|
151
151
|
"@types/react-dom": "^19.2.0",
|