@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.
Files changed (63) hide show
  1. package/dist-lib/components/ComputersLijst.d.ts +1 -0
  2. package/dist-lib/components/ComputersLijst.d.ts.map +1 -1
  3. package/dist-lib/components/ComputersLijst.js +9 -5
  4. package/dist-lib/components/LayoutVerwijzingenKaart.js +3 -2
  5. package/dist-lib/components/PrintQueuePage.d.ts.map +1 -1
  6. package/dist-lib/components/PrintQueuePage.js +8 -5
  7. package/dist-lib/components/PrintplekDetailPage.d.ts.map +1 -1
  8. package/dist-lib/components/PrintplekDetailPage.js +4 -2
  9. package/dist-lib/components/PrintplekkenPage.d.ts.map +1 -1
  10. package/dist-lib/components/PrintplekkenPage.js +10 -2
  11. package/dist-lib/components/TestprintDialog.d.ts.map +1 -1
  12. package/dist-lib/components/TestprintDialog.js +5 -1
  13. package/dist-lib/components/WerkplekOmzettingStap.d.ts.map +1 -1
  14. package/dist-lib/components/WerkplekOmzettingStap.js +1 -1
  15. package/dist-lib/components/WerkplekkenTab.d.ts.map +1 -1
  16. package/dist-lib/components/WerkplekkenTab.js +4 -3
  17. package/dist-lib/integrations/supabase/types.d.ts +267 -2
  18. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  19. package/dist-lib/integrations/supabase/types.js +1 -0
  20. package/dist-lib/lib/documentTypes.d.ts +4 -1
  21. package/dist-lib/lib/documentTypes.d.ts.map +1 -1
  22. package/dist-lib/lib/documentTypes.js +4 -0
  23. package/dist-lib/lib/layoutVerwijzingen.d.ts +20 -1
  24. package/dist-lib/lib/layoutVerwijzingen.d.ts.map +1 -1
  25. package/dist-lib/lib/layoutVerwijzingen.js +21 -3
  26. package/dist-lib/lib/orderData.server.d.ts.map +1 -1
  27. package/dist-lib/lib/orderData.server.js +26 -3
  28. package/dist-lib/lib/pakbonHtml.d.ts.map +1 -1
  29. package/dist-lib/lib/pakbonHtml.js +8 -1
  30. package/dist-lib/lib/printQueue.server.d.ts +6 -0
  31. package/dist-lib/lib/printQueue.server.d.ts.map +1 -1
  32. package/dist-lib/lib/printQueue.server.js +37 -3
  33. package/dist-lib/lib/printRoutering.d.ts +3 -1
  34. package/dist-lib/lib/printRoutering.d.ts.map +1 -1
  35. package/dist-lib/lib/printService.functions.d.ts.map +1 -1
  36. package/dist-lib/lib/printService.functions.js +3 -1
  37. package/dist-lib/lib/printService.server.d.ts +3 -1
  38. package/dist-lib/lib/printService.server.d.ts.map +1 -1
  39. package/dist-lib/lib/printService.server.js +3 -1
  40. package/dist-lib/lib/printnodeStatus.d.ts.map +1 -1
  41. package/dist-lib/lib/printnodeStatus.js +4 -0
  42. package/dist-lib/lib/printnodeWebhook.d.ts +2 -0
  43. package/dist-lib/lib/printnodeWebhook.d.ts.map +1 -1
  44. package/dist-lib/lib/printnodeWebhook.js +31 -1
  45. package/dist-lib/lib/printnodeWebhookBeheer.server.d.ts +2 -0
  46. package/dist-lib/lib/printnodeWebhookBeheer.server.d.ts.map +1 -1
  47. package/dist-lib/lib/printnodeWebhookBeheer.server.js +12 -2
  48. package/dist-lib/lib/productiebonHtml.d.ts.map +1 -1
  49. package/dist-lib/lib/productiebonHtml.js +7 -1
  50. package/dist-lib/lib/testprint.d.ts +5 -1
  51. package/dist-lib/lib/testprint.d.ts.map +1 -1
  52. package/dist-lib/lib/testprint.js +55 -11
  53. package/dist-lib/lib/vervoerder.d.ts +13 -0
  54. package/dist-lib/lib/vervoerder.d.ts.map +1 -0
  55. package/dist-lib/lib/vervoerder.js +58 -0
  56. package/dist-lib/lib/waaromPrinter.d.ts +2 -0
  57. package/dist-lib/lib/waaromPrinter.d.ts.map +1 -1
  58. package/dist-lib/lib/waaromPrinter.js +13 -0
  59. package/dist-lib/lib/werkplekOmzetting.d.ts +2 -0
  60. package/dist-lib/lib/werkplekOmzetting.d.ts.map +1 -1
  61. package/dist-lib/lib/werkplekOmzetting.js +2 -1
  62. package/dist-lib/lib/werkplekken.js +2 -2
  63. 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,CAgCR"}
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>): 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":"AAaA,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,CA4B1F;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAY/D;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,CAyC7B"}
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, printerVoorDocumenttype } from "./printApi.js";
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
- printerId = await printerVoorDocumenttype(d.value, undefined, werkplek, printplekId);
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
- const printerId = await printerVoorDocumenttype(documenttype, undefined, werkplek, printplekId);
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 printerNaam = data?.naam ?? "Printer";
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: 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":"AAWA,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;CACnB;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,CAM9D;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"}
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(["etiket", "verzendlabel", "productlabel", "barcode_label", "sticker"]);
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.57.2",
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.25.3",
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": "^1.168.0",
147
- "@tanstack/react-start": "^1.167.14",
148
- "@tanstack/router-plugin": "^1.167.10",
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",