@flowselections/layout-maker 1.22.3 → 1.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/README.md +139 -139
  2. package/dist-lib/components/AfdrukKnop.d.ts +1 -1
  3. package/dist-lib/components/AfdrukKnop.d.ts.map +1 -1
  4. package/dist-lib/components/DocumentRouteringPage.js +1 -1
  5. package/dist-lib/components/DocumentSettingsPanel.d.ts.map +1 -1
  6. package/dist-lib/components/DocumentSettingsPanel.js +26 -2
  7. package/dist-lib/components/NetwerkPrintersDialog.d.ts +1 -1
  8. package/dist-lib/components/NetwerkPrintersDialog.d.ts.map +1 -1
  9. package/dist-lib/components/PakbonBuilderPage.d.ts.map +1 -1
  10. package/dist-lib/components/PakbonBuilderPage.js +7 -26
  11. package/dist-lib/components/PrinterSetupWizard.d.ts.map +1 -1
  12. package/dist-lib/components/PrinterSetupWizard.js +77 -30
  13. package/dist-lib/components/PrintersRedirectPage.d.ts +1 -1
  14. package/dist-lib/components/PrintersRedirectPage.js +14 -14
  15. package/dist-lib/components/ProductiebonBuilderPage.d.ts.map +1 -1
  16. package/dist-lib/components/ProductiebonBuilderPage.js +25 -2
  17. package/dist-lib/index.d.ts +4 -6
  18. package/dist-lib/index.d.ts.map +1 -1
  19. package/dist-lib/index.js +3 -4
  20. package/dist-lib/integrations/supabase/auth-middleware.d.ts +9 -0
  21. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  22. package/dist-lib/integrations/supabase/client.server.d.ts +9 -0
  23. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  24. package/dist-lib/integrations/supabase/types.d.ts +9 -0
  25. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  26. package/dist-lib/lib/aiLayout.functions.d.ts +9 -0
  27. package/dist-lib/lib/aiLayout.functions.d.ts.map +1 -1
  28. package/dist-lib/lib/aiLayout.server.js +9 -9
  29. package/dist-lib/lib/browserPrint.d.ts +0 -23
  30. package/dist-lib/lib/browserPrint.d.ts.map +1 -1
  31. package/dist-lib/lib/browserPrint.js +4 -49
  32. package/dist-lib/lib/layoutPreview.js +7 -7
  33. package/dist-lib/lib/pakbonHtml.js +50 -50
  34. package/dist-lib/lib/papierFormaten.d.ts +30 -0
  35. package/dist-lib/lib/papierFormaten.d.ts.map +1 -0
  36. package/dist-lib/lib/papierFormaten.js +106 -0
  37. package/dist-lib/lib/printApi.d.ts +10 -0
  38. package/dist-lib/lib/printApi.d.ts.map +1 -1
  39. package/dist-lib/lib/printApi.js +9 -0
  40. package/dist-lib/lib/printQueue.server.d.ts +2 -0
  41. package/dist-lib/lib/printQueue.server.d.ts.map +1 -1
  42. package/dist-lib/lib/printQueue.server.js +86 -12
  43. package/dist-lib/lib/printService.functions.d.ts +36 -0
  44. package/dist-lib/lib/printService.functions.d.ts.map +1 -1
  45. package/dist-lib/lib/printService.server.d.ts +20 -0
  46. package/dist-lib/lib/printService.server.d.ts.map +1 -1
  47. package/dist-lib/lib/printService.server.js +24 -0
  48. package/dist-lib/lib/productiebonHtml.js +15 -15
  49. package/dist-lib/lib/profielHtml.js +18 -18
  50. package/dist-lib/lib/supabaseAdmin.server.d.ts +5 -5
  51. package/dist-lib/lib/supabaseAdmin.server.js +43 -43
  52. package/dist-lib/lib/testpagina.d.ts.map +1 -1
  53. package/dist-lib/lib/testpagina.js +27 -22
  54. package/dist-lib/lib/testprint.js +4 -4
  55. package/dist-lib/lib/useDocumentData.d.ts +1 -6
  56. package/dist-lib/lib/useDocumentData.d.ts.map +1 -1
  57. package/dist-lib/lib/voorbeeldPrint.d.ts +12 -0
  58. package/dist-lib/lib/voorbeeldPrint.d.ts.map +1 -0
  59. package/dist-lib/lib/voorbeeldPrint.js +42 -0
  60. package/package.json +1 -1
@@ -4,15 +4,35 @@ export interface NetwerkPrinter {
4
4
  computer: string;
5
5
  online: boolean;
6
6
  omschrijving: string;
7
+ /** Papierformaten die deze printer aankan: naam -> [breedte, hoogte] in 0,01 mm. */
8
+ formaten: Record<string, number[]> | null;
9
+ /** Papierladen / uitvoerbakken van deze printer. */
10
+ laden: string[];
11
+ }
12
+ export interface PrintOpties {
13
+ /** Naam van het papierformaat, exact zoals de printer die kent. */
14
+ paper?: string | null;
15
+ /** Naam van de papierlade. */
16
+ bin?: string | null;
17
+ /** Draaihoek van elke pagina: 0, 90, 180 of 270 (absoluut). */
18
+ rotate?: number | null;
19
+ /** Document automatisch passend maken. Standaard uit: geen stille schaling. */
20
+ fitToPage?: boolean;
7
21
  }
8
22
  export interface PrintOpdrachtInput {
9
23
  externPrinterId: string;
10
24
  documentnaam: string;
11
25
  pdfBase64: string;
12
26
  kopieen?: number;
27
+ opties?: PrintOpties;
13
28
  }
14
29
  /** Alle printers die via de printclients in het netwerk beschikbaar zijn. */
15
30
  export declare function haalNetwerkPrinters(): Promise<NetwerkPrinter[]>;
31
+ /** Papierformaten en laden van één printer, rechtstreeks bij de printdienst. */
32
+ export declare function haalPrinterFormaten(externPrinterId: string): Promise<{
33
+ formaten: Record<string, number[]> | null;
34
+ laden: string[];
35
+ }>;
16
36
  /** Stuurt een PDF rechtstreeks naar de printer. Geeft het externe opdrachtnummer terug. */
17
37
  export declare function stuurPdfNaarPrinter(input: PrintOpdrachtInput): Promise<string>;
18
38
  export type OpdrachtStatus = "wachtend" | "bezig" | "voltooid" | "mislukt";
@@ -1 +1 @@
1
- {"version":3,"file":"printService.server.d.ts","sourceRoot":"","sources":["../../src/lib/printService.server.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAkDD,6EAA6E;AAC7E,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAgBrE;AAED,2FAA2F;AAC3F,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAapF;AAED,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;AAE3E,uDAAuD;AACvD,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAUjF;AAED,yCAAyC;AACzC,wBAAsB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAGpD;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,qDAAqD;AACrD,wBAAsB,aAAa,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAchE"}
1
+ {"version":3,"file":"printService.server.d.ts","sourceRoot":"","sources":["../../src/lib/printService.server.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,oFAAoF;IACpF,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;IAC1C,oDAAoD;IACpD,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,mEAAmE;IACnE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,8BAA8B;IAC9B,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,+EAA+E;IAC/E,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAmDD,6EAA6E;AAC7E,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAmBrE;AAED,gFAAgF;AAChF,wBAAsB,mBAAmB,CACvC,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CASzE;AAED,2FAA2F;AAC3F,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAyBpF;AAGD,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;AAE3E,uDAAuD;AACvD,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAUjF;AAED,yCAAyC;AACzC,wBAAsB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAGpD;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,qDAAqD;AACrD,wBAAsB,aAAa,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAchE"}
@@ -61,10 +61,33 @@ export async function haalNetwerkPrinters() {
61
61
  online: (p.state ?? "").toLowerCase() === "online" &&
62
62
  (p.computer?.state ?? "connected").toLowerCase() === "connected",
63
63
  omschrijving: p.description ?? "",
64
+ formaten: p.capabilities?.papers ?? null,
65
+ laden: arr(p.capabilities?.bins).map((b) => String(b)),
64
66
  }));
65
67
  }
68
+ /** Papierformaten en laden van één printer, rechtstreeks bij de printdienst. */
69
+ export async function haalPrinterFormaten(externPrinterId) {
70
+ const data = await vraag(`/printers/${encodeURIComponent(externPrinterId)}`);
71
+ const eerste = arr(data)[0];
72
+ return {
73
+ formaten: eerste?.capabilities?.papers ?? null,
74
+ laden: arr(eerste?.capabilities?.bins).map((b) => String(b)),
75
+ };
76
+ }
66
77
  /** Stuurt een PDF rechtstreeks naar de printer. Geeft het externe opdrachtnummer terug. */
67
78
  export async function stuurPdfNaarPrinter(input) {
79
+ const o = input.opties ?? {};
80
+ const options = {
81
+ // Bewust uit: anders schaalt de printer een etiket stilzwijgend naar A4.
82
+ fit_to_page: o.fitToPage === true,
83
+ };
84
+ if (o.paper)
85
+ options["paper"] = o.paper;
86
+ if (o.bin)
87
+ options["bin"] = o.bin;
88
+ if (o.rotate === 0 || o.rotate === 90 || o.rotate === 180 || o.rotate === 270) {
89
+ options["rotate"] = o.rotate;
90
+ }
68
91
  const data = await vraag("/printjobs", {
69
92
  method: "POST",
70
93
  body: JSON.stringify({
@@ -74,6 +97,7 @@ export async function stuurPdfNaarPrinter(input) {
74
97
  content: input.pdfBase64,
75
98
  source: "Layouts en printers",
76
99
  qty: Math.max(1, Math.min(50, input.kopieen ?? 1)),
100
+ options,
77
101
  }),
78
102
  });
79
103
  return String(data);
@@ -147,20 +147,20 @@ export function renderProductiebonDocument(config, gegevens, opties = {}) {
147
147
  return inhoud ? `<div class="blok">${inhoud}</div>` : "";
148
148
  })
149
149
  .join("");
150
- return `<!doctype html><html lang="nl"><head><meta charset="utf-8" />
151
- <title>${esc(opties.titel ?? "Productiebon")}</title>
152
- <style>
153
- @page { size: ${b}mm ${h}mm; margin: ${marge}mm; }
154
- * { box-sizing: border-box; }
155
- html, body { margin: 0; padding: 0; }
156
- body { font-family: Arial, Helvetica, sans-serif; font-size: 9pt; color: #111827; line-height: 1.35; }
157
- .blok { margin-bottom: 2.5mm; }
158
- .sectitel { font-size: 90%; font-weight: 600; text-transform: uppercase; color: #6b7280; margin-bottom: 0.6mm; }
159
- .vet { font-weight: 600; }
160
- .kv { display: flex; justify-content: space-between; gap: 3mm; }
161
- .kv .k { color: #6b7280; }
162
- .tabel { width: 100%; border-collapse: collapse; table-layout: fixed; }
163
- .tabel th { text-align: left; font-weight: 600; }
164
- .regel { padding: 0.4mm 0; }
150
+ return `<!doctype html><html lang="nl"><head><meta charset="utf-8" />
151
+ <title>${esc(opties.titel ?? "Productiebon")}</title>
152
+ <style>
153
+ @page { size: ${b}mm ${h}mm; margin: ${marge}mm; }
154
+ * { box-sizing: border-box; }
155
+ html, body { margin: 0; padding: 0; }
156
+ body { font-family: Arial, Helvetica, sans-serif; font-size: 9pt; color: #111827; line-height: 1.35; }
157
+ .blok { margin-bottom: 2.5mm; }
158
+ .sectitel { font-size: 90%; font-weight: 600; text-transform: uppercase; color: #6b7280; margin-bottom: 0.6mm; }
159
+ .vet { font-weight: 600; }
160
+ .kv { display: flex; justify-content: space-between; gap: 3mm; }
161
+ .kv .k { color: #6b7280; }
162
+ .tabel { width: 100%; border-collapse: collapse; table-layout: fixed; }
163
+ .tabel th { text-align: left; font-weight: 600; }
164
+ .regel { padding: 0.4mm 0; }
165
165
  </style></head><body>${body}</body></html>`;
166
166
  }
@@ -110,8 +110,8 @@ function regeltabel(regels) {
110
110
  const eenheid = r["eenheid"] ?? "";
111
111
  return `<tr><td>${esc(code)}</td><td>${esc(omschrijving)}</td><td style="text-align:right">${esc(aantal)}</td><td>${esc(eenheid)}</td></tr>`;
112
112
  };
113
- return `<table class="tabel"><colgroup><col style="width:20%" /><col style="width:52%" /><col style="width:16%" /><col style="width:12%" /></colgroup>
114
- <thead><tr class="onder"><th>Code</th><th>Omschrijving</th><th style="text-align:right">Aantal</th><th>Eenheid</th></tr></thead>
113
+ return `<table class="tabel"><colgroup><col style="width:20%" /><col style="width:52%" /><col style="width:16%" /><col style="width:12%" /></colgroup>
114
+ <thead><tr class="onder"><th>Code</th><th>Omschrijving</th><th style="text-align:right">Aantal</th><th>Eenheid</th></tr></thead>
115
115
  <tbody>${regels.map(rij).join("")}</tbody></table>`;
116
116
  }
117
117
  function totalenBlok(regels, velden) {
@@ -236,21 +236,21 @@ export function renderProfielDocument(documenttype, config, gegevens, opties = {
236
236
  .map((groep) => groepHtml(groep, cfg, velden, data, opties))
237
237
  .filter(Boolean)
238
238
  .join("");
239
- return `<!doctype html><html lang="nl"><head><meta charset="utf-8" />
240
- <title>${esc(opties.titel ?? profiel.label)}</title>
241
- <style>
242
- @page { size: ${b}mm ${h}mm; margin: ${marge}mm; }
243
- * { box-sizing: border-box; }
244
- html, body { margin: 0; padding: 0; }
245
- body { font-family: Arial, Helvetica, sans-serif; font-size: 9pt; color: #111827; line-height: 1.35; }
246
- .blok { margin-bottom: 2.5mm; }
247
- .kop { border-bottom: 0.3mm solid #d1d5db; padding-bottom: 1mm; }
248
- .sectitel { font-size: 90%; font-weight: 600; text-transform: uppercase; color: #6b7280; margin-bottom: 0.6mm; }
249
- .vet { font-weight: 600; }
250
- .klein { font-size: 85%; color: #6b7280; }
251
- .kv { display: flex; justify-content: space-between; gap: 3mm; }
252
- .kv .k { color: #6b7280; }
253
- .tabel { width: 100%; border-collapse: collapse; table-layout: fixed; }
254
- .tabel th { text-align: left; font-weight: 600; }
239
+ return `<!doctype html><html lang="nl"><head><meta charset="utf-8" />
240
+ <title>${esc(opties.titel ?? profiel.label)}</title>
241
+ <style>
242
+ @page { size: ${b}mm ${h}mm; margin: ${marge}mm; }
243
+ * { box-sizing: border-box; }
244
+ html, body { margin: 0; padding: 0; }
245
+ body { font-family: Arial, Helvetica, sans-serif; font-size: 9pt; color: #111827; line-height: 1.35; }
246
+ .blok { margin-bottom: 2.5mm; }
247
+ .kop { border-bottom: 0.3mm solid #d1d5db; padding-bottom: 1mm; }
248
+ .sectitel { font-size: 90%; font-weight: 600; text-transform: uppercase; color: #6b7280; margin-bottom: 0.6mm; }
249
+ .vet { font-weight: 600; }
250
+ .klein { font-size: 85%; color: #6b7280; }
251
+ .kv { display: flex; justify-content: space-between; gap: 3mm; }
252
+ .kv .k { color: #6b7280; }
253
+ .tabel { width: 100%; border-collapse: collapse; table-layout: fixed; }
254
+ .tabel th { text-align: left; font-weight: 600; }
255
255
  </style></head><body>${kop}${body}</body></html>`;
256
256
  }
@@ -1,6 +1,6 @@
1
- import { type SupabaseClient } from "@supabase/supabase-js";
2
- /** Uitleg voor de gebruiker als de serverinstellingen ontbreken. */
3
- export declare function adminConfiguratieFout(): string | null;
4
- /** Lazy adminclient: pas bij het eerste gebruik worden de instellingen gelezen. */
5
- export declare const adminDb: SupabaseClient<any, any, any, any, any>;
1
+ import { type SupabaseClient } from "@supabase/supabase-js";
2
+ /** Uitleg voor de gebruiker als de serverinstellingen ontbreken. */
3
+ export declare function adminConfiguratieFout(): string | null;
4
+ /** Lazy adminclient: pas bij het eerste gebruik worden de instellingen gelezen. */
5
+ export declare const adminDb: SupabaseClient<any, any, any, any, any>;
6
6
  //# sourceMappingURL=supabaseAdmin.server.d.ts.map
@@ -1,43 +1,43 @@
1
- // ============================================================================
2
- // src/lib/supabaseAdmin.server.ts — adminclient die in elke shell werkt.
3
- // Leest de service-role sleutel uit meerdere mogelijke namen, zodat de module
4
- // niet afhankelijk is van hoe een shell zijn omgeving heeft ingericht.
5
- // ============================================================================
6
- import { createClient } from "@supabase/supabase-js";
7
- function lees(...namen) {
8
- for (const naam of namen) {
9
- const waarde = process.env[naam];
10
- if (waarde && waarde.trim().length > 0)
11
- return waarde.trim();
12
- }
13
- return undefined;
14
- }
15
- /** Uitleg voor de gebruiker als de serverinstellingen ontbreken. */
16
- export function adminConfiguratieFout() {
17
- const url = lees("SUPABASE_URL", "VITE_SUPABASE_URL");
18
- const key = lees("SERVICE_ROLE_KEY", "SUPABASE_SERVICE_ROLE_KEY");
19
- if (url && key)
20
- return null;
21
- const mist = [!url ? "SUPABASE_URL" : null, !key ? "SERVICE_ROLE_KEY" : null]
22
- .filter(Boolean)
23
- .join(" en ");
24
- return `Achtergrondprinten is niet ingesteld: ${mist} ontbreekt in deze omgeving.`;
25
- }
26
- function maakClient() {
27
- const url = lees("SUPABASE_URL", "VITE_SUPABASE_URL");
28
- const key = lees("SERVICE_ROLE_KEY", "SUPABASE_SERVICE_ROLE_KEY");
29
- if (!url || !key)
30
- throw new Error(adminConfiguratieFout() ?? "Serverinstellingen ontbreken.");
31
- return createClient(url, key, {
32
- auth: { storage: undefined, persistSession: false, autoRefreshToken: false },
33
- });
34
- }
35
- let _client;
36
- /** Lazy adminclient: pas bij het eerste gebruik worden de instellingen gelezen. */
37
- export const adminDb = new Proxy({}, {
38
- get(_t, prop, receiver) {
39
- if (!_client)
40
- _client = maakClient();
41
- return Reflect.get(_client, prop, receiver);
42
- },
43
- });
1
+ // ============================================================================
2
+ // src/lib/supabaseAdmin.server.ts — adminclient die in elke shell werkt.
3
+ // Leest de service-role sleutel uit meerdere mogelijke namen, zodat de module
4
+ // niet afhankelijk is van hoe een shell zijn omgeving heeft ingericht.
5
+ // ============================================================================
6
+ import { createClient } from "@supabase/supabase-js";
7
+ function lees(...namen) {
8
+ for (const naam of namen) {
9
+ const waarde = process.env[naam];
10
+ if (waarde && waarde.trim().length > 0)
11
+ return waarde.trim();
12
+ }
13
+ return undefined;
14
+ }
15
+ /** Uitleg voor de gebruiker als de serverinstellingen ontbreken. */
16
+ export function adminConfiguratieFout() {
17
+ const url = lees("SUPABASE_URL", "VITE_SUPABASE_URL");
18
+ const key = lees("SERVICE_ROLE_KEY", "SUPABASE_SERVICE_ROLE_KEY");
19
+ if (url && key)
20
+ return null;
21
+ const mist = [!url ? "SUPABASE_URL" : null, !key ? "SERVICE_ROLE_KEY" : null]
22
+ .filter(Boolean)
23
+ .join(" en ");
24
+ return `Achtergrondprinten is niet ingesteld: ${mist} ontbreekt in deze omgeving.`;
25
+ }
26
+ function maakClient() {
27
+ const url = lees("SUPABASE_URL", "VITE_SUPABASE_URL");
28
+ const key = lees("SERVICE_ROLE_KEY", "SUPABASE_SERVICE_ROLE_KEY");
29
+ if (!url || !key)
30
+ throw new Error(adminConfiguratieFout() ?? "Serverinstellingen ontbreken.");
31
+ return createClient(url, key, {
32
+ auth: { storage: undefined, persistSession: false, autoRefreshToken: false },
33
+ });
34
+ }
35
+ let _client;
36
+ /** Lazy adminclient: pas bij het eerste gebruik worden de instellingen gelezen. */
37
+ export const adminDb = new Proxy({}, {
38
+ get(_t, prop, receiver) {
39
+ if (!_client)
40
+ _client = maakClient();
41
+ return Reflect.get(_client, prop, receiver);
42
+ },
43
+ });
@@ -1 +1 @@
1
- {"version":3,"file":"testpagina.d.ts","sourceRoot":"","sources":["../../src/lib/testpagina.ts"],"names":[],"mappings":"AASA,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,iBAwBrE"}
1
+ {"version":3,"file":"testpagina.d.ts","sourceRoot":"","sources":["../../src/lib/testpagina.ts"],"names":[],"mappings":"AASA,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,iBA0BrE"}
@@ -1,31 +1,36 @@
1
1
  // ============================================================================
2
2
  // src/lib/testpagina.ts — een testpagina naar een printer sturen.
3
- // Altijd via PrintNode: een testpagina die in het browser-printvenster
4
- // uitkomt zegt niets over de koppeling die je wilt testen.
3
+ // Loopt via de printwachtrij, net als echte documenten, zodat ook het
4
+ // papierformaat en de stand worden getest.
5
5
  // ============================================================================
6
6
  import { toast } from "@flowselections/core";
7
- import { printDirect } from "./directPrint.js";
7
+ import { printHtml, volgJobStatus } from "./printApi.js";
8
8
  export async function drukTestpaginaAf(printerId, naam) {
9
- const html = `<div style="padding:20mm;font-size:14pt"><h1 style="font-size:20pt">Testpagina</h1>
10
- <p>Deze pagina hoort uit: <strong>${naam}</strong></p></div>`;
11
- const opdracht = {
12
- documenttype: "pakbon",
13
- formaatCode: "A4",
14
- orientatie: "portrait",
15
- documentnaam: "Testpagina",
16
- html,
17
- printerId,
18
- };
9
+ const html = `<div style="padding:15mm;font-family:Arial,Helvetica,sans-serif;font-size:12pt">
10
+ <h1 style="font-size:20pt;margin:0 0 6mm">Testpagina</h1>
11
+ <p style="margin:0 0 3mm">Deze pagina hoort uit: <strong>${naam}</strong></p>
12
+ <p style="margin:0">${new Date().toLocaleString("nl-NL")}</p></div>`;
19
13
  try {
20
- const direct = await printDirect(opdracht);
21
- if (direct.gelukt) {
22
- toast.success(`Testpagina verstuurd naar ${direct.printernaam ?? naam}`);
23
- return;
24
- }
25
- toast.error(direct.reden ??
26
- `${naam} is nog niet gekoppeld aan het printprogramma — controleer de werkplek.`);
14
+ const { jobId } = await printHtml({
15
+ documenttype: "vrij",
16
+ documentnaam: "Testpagina",
17
+ html,
18
+ printerId,
19
+ payload: { is_testpagina: true, test_id: `testpagina-${Date.now()}` },
20
+ });
21
+ toast.success(`Testpagina verstuurd naar ${naam}`);
22
+ const stop = volgJobStatus(jobId, (st) => {
23
+ if (st.status === "mislukt") {
24
+ toast.error(st.foutmelding ?? `De testpagina op ${naam} is mislukt`);
25
+ stop();
26
+ }
27
+ else if (st.status === "voltooid") {
28
+ stop();
29
+ }
30
+ });
31
+ setTimeout(() => stop(), 60000);
27
32
  }
28
- catch {
29
- toast.error("De testpagina kon niet worden afgedrukt");
33
+ catch (e) {
34
+ toast.error(e instanceof Error ? e.message : "De testpagina kon niet worden afgedrukt");
30
35
  }
31
36
  }
@@ -42,10 +42,10 @@ function testHtml(velden) {
42
42
  const rijen = Object.entries(velden)
43
43
  .map(([k, v]) => `<tr><td style="padding:2mm 6mm 2mm 0;color:#555">${k}</td><td style="padding:2mm 0;font-weight:600">${v}</td></tr>`)
44
44
  .join("");
45
- return `<div style="padding:15mm;font-family:Arial,Helvetica,sans-serif;font-size:12pt">
46
- <h1 style="font-size:20pt;margin:0 0 6mm">Testprint</h1>
47
- <p style="margin:0 0 6mm">Komt dit vel uit de bedoelde printer op de bedoelde plek? Dan zijn de instellingen goed.</p>
48
- <table style="border-collapse:collapse;font-size:12pt">${rijen}</table>
45
+ return `<div style="padding:15mm;font-family:Arial,Helvetica,sans-serif;font-size:12pt">
46
+ <h1 style="font-size:20pt;margin:0 0 6mm">Testprint</h1>
47
+ <p style="margin:0 0 6mm">Komt dit vel uit de bedoelde printer op de bedoelde plek? Dan zijn de instellingen goed.</p>
48
+ <table style="border-collapse:collapse;font-size:12pt">${rijen}</table>
49
49
  </div>`;
50
50
  }
51
51
  /**
@@ -4,12 +4,7 @@ export interface PrinterModel {
4
4
  id: string;
5
5
  naam: string;
6
6
  omschrijving: string | null;
7
- soort: string;
8
- verbinding: string;
9
- merk: string | null;
10
- ip_adres: string | null;
11
- poort: number | null;
12
- driver: string | null;
7
+ /** Formaatcode waarop deze printer standaard afdrukt (A4, LABEL_100x62, …). */
13
8
  papierformaat: string | null;
14
9
  locatie: string | null;
15
10
  online: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"useDocumentData.d.ts","sourceRoot":"","sources":["../../src/lib/useDocumentData.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useDocumentData.d.ts","sourceRoot":"","sources":["../../src/lib/useDocumentData.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export interface VoorbeeldLayout {
2
+ id?: string | null;
3
+ naam?: string | null;
4
+ documenttype?: string | null;
5
+ papierformaat?: string | null;
6
+ }
7
+ /**
8
+ * Stuurt meegestuurde opmaak als voorbeeldafdruk naar de printer die bij deze
9
+ * layout hoort en volgt de status in de wachtrij.
10
+ */
11
+ export declare function voorbeeldPrint(layout: VoorbeeldLayout, html: string): Promise<void>;
12
+ //# sourceMappingURL=voorbeeldPrint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voorbeeldPrint.d.ts","sourceRoot":"","sources":["../../src/lib/voorbeeldPrint.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,eAAe;IAC9B,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiCzF"}
@@ -0,0 +1,42 @@
1
+ // ============================================================================
2
+ // src/lib/voorbeeldPrint.ts — "Voorbeeld printen" vanuit een ontwerper.
3
+ // Wat op het scherm staat wordt exact zo naar de printer gestuurd: de opmaak
4
+ // gaat mee als kant-en-klare HTML en er wordt bewust géén layout gekoppeld,
5
+ // zodat de wachtrij niets opnieuw opmaakt.
6
+ // ============================================================================
7
+ import { toast } from "@flowselections/core";
8
+ import { printHtml, printerVoorLayout, volgJobStatus } from "./printApi.js";
9
+ /**
10
+ * Stuurt meegestuurde opmaak als voorbeeldafdruk naar de printer die bij deze
11
+ * layout hoort en volgt de status in de wachtrij.
12
+ */
13
+ export async function voorbeeldPrint(layout, html) {
14
+ const documenttype = String(layout.documenttype ?? "pakbon");
15
+ const naam = layout.naam ?? documenttype;
16
+ const printerId = await printerVoorLayout(layout);
17
+ if (!printerId) {
18
+ toast.error(`Nog geen printer gekoppeld aan ${naam} — stel dit in bij Printen > Standaardregels.`);
19
+ return;
20
+ }
21
+ const { jobId } = await printHtml({
22
+ documenttype,
23
+ documentnaam: `Voorbeeld ${naam}`,
24
+ html,
25
+ printerId,
26
+ // Bewust geen layout_id: de meegestuurde opmaak is leidend.
27
+ payload: { voorbeeld: true, voorbeeld_layout_id: layout.id ?? null },
28
+ isHerprint: true,
29
+ });
30
+ toast.success("Voorbeeld naar de printer verstuurd");
31
+ const stop = volgJobStatus(jobId, (s) => {
32
+ if (s.status === "klaar") {
33
+ toast.success("Voorbeeld afgedrukt");
34
+ stop();
35
+ }
36
+ else if (s.status === "mislukt") {
37
+ toast.error(s.foutmelding ?? "Voorbeeld printen mislukt");
38
+ stop();
39
+ }
40
+ });
41
+ window.setTimeout(() => stop(), 120000);
42
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowselections/layout-maker",
3
- "version": "1.22.3",
3
+ "version": "1.24.0",
4
4
  "flowselections": {
5
5
  "moduleId": "layout-maker",
6
6
  "pages": [