@flowselections/layout-maker 1.38.4 → 1.45.8

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 (124) hide show
  1. package/README.md +139 -139
  2. package/dist-lib/components/AfdrukKnop.d.ts +19 -19
  3. package/dist-lib/components/AfleverbriefBuilderPage.d.ts +10 -0
  4. package/dist-lib/components/AfleverbriefBuilderPage.d.ts.map +1 -0
  5. package/dist-lib/components/AfleverbriefBuilderPage.js +101 -0
  6. package/dist-lib/components/BlokOntwerperPage.d.ts.map +1 -1
  7. package/dist-lib/components/BlokOntwerperPage.js +8 -3
  8. package/dist-lib/components/ComputersLijst.d.ts.map +1 -1
  9. package/dist-lib/components/ComputersLijst.js +1 -1
  10. package/dist-lib/components/FustKolomVolgorde.d.ts +11 -0
  11. package/dist-lib/components/FustKolomVolgorde.d.ts.map +1 -0
  12. package/dist-lib/components/FustKolomVolgorde.js +52 -0
  13. package/dist-lib/components/LayoutsPage.d.ts.map +1 -1
  14. package/dist-lib/components/LayoutsPage.js +10 -9
  15. package/dist-lib/components/NetwerkPrintersDialog.d.ts +7 -7
  16. package/dist-lib/components/PakbonBuilderPage.d.ts.map +1 -1
  17. package/dist-lib/components/PakbonBuilderPage.js +32 -14
  18. package/dist-lib/components/PakbonPreview.d.ts.map +1 -1
  19. package/dist-lib/components/PakbonPreview.js +21 -14
  20. package/dist-lib/components/PakbonSectiesPanel.d.ts +4 -2
  21. package/dist-lib/components/PakbonSectiesPanel.d.ts.map +1 -1
  22. package/dist-lib/components/PakbonSectiesPanel.js +5 -3
  23. package/dist-lib/components/PdfMapToestemmingBanner.d.ts +2 -1
  24. package/dist-lib/components/PdfMapToestemmingBanner.d.ts.map +1 -1
  25. package/dist-lib/components/PdfMapToestemmingBanner.js +73 -14
  26. package/dist-lib/components/PdfVoorbeeld.d.ts +20 -0
  27. package/dist-lib/components/PdfVoorbeeld.d.ts.map +1 -0
  28. package/dist-lib/components/PdfVoorbeeld.js +95 -0
  29. package/dist-lib/components/PrintProgrammaUitleg.d.ts.map +1 -1
  30. package/dist-lib/components/PrintProgrammaUitleg.js +1 -1
  31. package/dist-lib/components/PrintQueuePage.d.ts.map +1 -1
  32. package/dist-lib/components/PrintQueuePage.js +81 -43
  33. package/dist-lib/components/PrinterSetupWizard.js +3 -3
  34. package/dist-lib/components/PrintersRedirectPage.d.ts +1 -1
  35. package/dist-lib/components/PrintersRedirectPage.js +14 -14
  36. package/dist-lib/components/PrintplekDetailPage.d.ts.map +1 -1
  37. package/dist-lib/components/PrintplekDetailPage.js +2 -2
  38. package/dist-lib/components/PrintplekWizard.d.ts.map +1 -1
  39. package/dist-lib/components/PrintplekWizard.js +6 -2
  40. package/dist-lib/components/ProductiebonBuilderPage.d.ts.map +1 -1
  41. package/dist-lib/components/ProductiebonBuilderPage.js +13 -7
  42. package/dist-lib/index.d.ts +13 -5
  43. package/dist-lib/index.d.ts.map +1 -1
  44. package/dist-lib/index.js +10 -5
  45. package/dist-lib/integrations/supabase/auth-middleware.d.ts +2008 -118
  46. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  47. package/dist-lib/integrations/supabase/client.server.d.ts +2008 -118
  48. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  49. package/dist-lib/integrations/supabase/client.server.js +1 -1
  50. package/dist-lib/integrations/supabase/moduleClient.d.ts +2008 -118
  51. package/dist-lib/integrations/supabase/moduleClient.d.ts.map +1 -1
  52. package/dist-lib/integrations/supabase/types.d.ts +2031 -99
  53. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  54. package/dist-lib/integrations/supabase/types.js +1 -0
  55. package/dist-lib/lib/aiLayout.functions.d.ts +2008 -118
  56. package/dist-lib/lib/aiLayout.functions.d.ts.map +1 -1
  57. package/dist-lib/lib/aiLayout.server.js +9 -9
  58. package/dist-lib/lib/browserPrint.js +1 -1
  59. package/dist-lib/lib/documentVoorbeeld.functions.d.ts +23 -0
  60. package/dist-lib/lib/documentVoorbeeld.functions.d.ts.map +1 -0
  61. package/dist-lib/lib/documentVoorbeeld.functions.js +37 -0
  62. package/dist-lib/lib/fontMetrics.d.ts +15 -0
  63. package/dist-lib/lib/fontMetrics.d.ts.map +1 -0
  64. package/dist-lib/lib/fontMetrics.js +118 -0
  65. package/dist-lib/lib/htmlNaarPdf.server.d.ts +2 -2
  66. package/dist-lib/lib/htmlNaarPdf.server.d.ts.map +1 -1
  67. package/dist-lib/lib/htmlNaarPdf.server.js +2 -1
  68. package/dist-lib/lib/htmlPdf.server.d.ts +11 -0
  69. package/dist-lib/lib/htmlPdf.server.d.ts.map +1 -1
  70. package/dist-lib/lib/htmlPdf.server.js +118 -15
  71. package/dist-lib/lib/layoutPreview.js +7 -7
  72. package/dist-lib/lib/orderData.server.d.ts.map +1 -1
  73. package/dist-lib/lib/orderData.server.js +43 -16
  74. package/dist-lib/lib/pakbonBarcodeVerzoek.d.ts +39 -0
  75. package/dist-lib/lib/pakbonBarcodeVerzoek.d.ts.map +1 -0
  76. package/dist-lib/lib/pakbonBarcodeVerzoek.js +80 -0
  77. package/dist-lib/lib/pakbonBuilder.d.ts +62 -3
  78. package/dist-lib/lib/pakbonBuilder.d.ts.map +1 -1
  79. package/dist-lib/lib/pakbonBuilder.js +386 -50
  80. package/dist-lib/lib/pakbonContent.d.ts +41 -0
  81. package/dist-lib/lib/pakbonContent.d.ts.map +1 -0
  82. package/dist-lib/lib/pakbonContent.js +668 -0
  83. package/dist-lib/lib/pakbonDocument.d.ts +199 -0
  84. package/dist-lib/lib/pakbonDocument.d.ts.map +1 -0
  85. package/dist-lib/lib/pakbonDocument.js +735 -0
  86. package/dist-lib/lib/pakbonHtml.d.ts +7 -0
  87. package/dist-lib/lib/pakbonHtml.d.ts.map +1 -1
  88. package/dist-lib/lib/pakbonHtml.js +142 -126
  89. package/dist-lib/lib/pakbonPresentation.d.ts +8 -0
  90. package/dist-lib/lib/pakbonPresentation.d.ts.map +1 -0
  91. package/dist-lib/lib/pakbonPresentation.js +31 -0
  92. package/dist-lib/lib/pakbonScan.d.ts.map +1 -1
  93. package/dist-lib/lib/pakbonScan.js +20 -38
  94. package/dist-lib/lib/pdfJobSaver.d.ts +10 -6
  95. package/dist-lib/lib/pdfJobSaver.d.ts.map +1 -1
  96. package/dist-lib/lib/pdfJobSaver.js +302 -99
  97. package/dist-lib/lib/pdfMap.d.ts +37 -2
  98. package/dist-lib/lib/pdfMap.d.ts.map +1 -1
  99. package/dist-lib/lib/pdfMap.js +120 -7
  100. package/dist-lib/lib/pdfOpslagStatus.d.ts +23 -0
  101. package/dist-lib/lib/pdfOpslagStatus.d.ts.map +1 -0
  102. package/dist-lib/lib/pdfOpslagStatus.js +74 -0
  103. package/dist-lib/lib/printApi.d.ts +31 -0
  104. package/dist-lib/lib/printApi.d.ts.map +1 -1
  105. package/dist-lib/lib/printApi.js +62 -1
  106. package/dist-lib/lib/printQueue.server.d.ts +6 -0
  107. package/dist-lib/lib/printQueue.server.d.ts.map +1 -1
  108. package/dist-lib/lib/printQueue.server.js +450 -94
  109. package/dist-lib/lib/printService.functions.d.ts +7916 -356
  110. package/dist-lib/lib/printService.functions.d.ts.map +1 -1
  111. package/dist-lib/lib/productiebonHtml.js +15 -15
  112. package/dist-lib/lib/profielHtml.d.ts.map +1 -1
  113. package/dist-lib/lib/profielHtml.js +26 -19
  114. package/dist-lib/lib/supabaseAdmin.server.d.ts +5 -5
  115. package/dist-lib/lib/supabaseAdmin.server.js +43 -43
  116. package/dist-lib/lib/testpagina.js +3 -3
  117. package/dist-lib/lib/testprint.js +4 -4
  118. package/dist-lib/lib/useDocumentData.d.ts +8 -0
  119. package/dist-lib/lib/useDocumentData.d.ts.map +1 -1
  120. package/dist-lib/lib/useDocumentData.js +1 -1
  121. package/dist-lib/lib/voorbeeldPrint.d.ts +3 -0
  122. package/dist-lib/lib/voorbeeldPrint.d.ts.map +1 -1
  123. package/dist-lib/lib/voorbeeldPrint.js +65 -17
  124. package/package.json +158 -151
@@ -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
  }
@@ -1 +1 @@
1
- {"version":3,"file":"profielHtml.d.ts","sourceRoot":"","sources":["../../src/lib/profielHtml.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAiND,kEAAkE;AAClE,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAWjF;AAED,oEAAoE;AACpE,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,OAAO,EACjB,MAAM,GAAE,mBAAwB,GAC/B,MAAM,CAwCR"}
1
+ {"version":3,"file":"profielHtml.d.ts","sourceRoot":"","sources":["../../src/lib/profielHtml.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAuND,kEAAkE;AAClE,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAWjF;AAED,oEAAoE;AACpE,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,OAAO,EACjB,MAAM,GAAE,mBAAwB,GAC/B,MAAM,CAwCR"}
@@ -90,7 +90,14 @@ function waardeVoor(velden, inst) {
90
90
  const staart = Object.entries(velden).find(([k, v]) => k.toLowerCase().endsWith(`.${inst.key}`) && String(v).trim() !== "");
91
91
  return staart ? String(staart[1]) : "";
92
92
  }
93
- const kv = (label, waarde) => `<div class="kv"><span class="k">${esc(label)}</span><span class="v">${esc(waarde === "" ? "—" : waarde)}</span></div>`;
93
+ /**
94
+ * Eén regel "label — waarde". Een veld zonder waarde levert géén regel op:
95
+ * anders komt er een vel met alleen veldnamen uit de printer, terwijl het
96
+ * ontwerp op het scherm wel gevuld lijkt.
97
+ */
98
+ const kv = (label, waarde) => String(waarde).trim() === ""
99
+ ? ""
100
+ : `<div class="kv"><span class="k">${esc(label)}</span><span class="v">${esc(waarde)}</span></div>`;
94
101
  /** Zoekt de regels van het document (orderregels, producten, materialen, ...). */
95
102
  function zoekRegels(data) {
96
103
  for (const sleutel of ["regels", "orderregels", "items", "producten", "lines", "onderdelen"]) {
@@ -110,8 +117,8 @@ function regeltabel(regels) {
110
117
  const eenheid = r["eenheid"] ?? "";
111
118
  return `<tr><td>${esc(code)}</td><td>${esc(omschrijving)}</td><td style="text-align:right">${esc(aantal)}</td><td>${esc(eenheid)}</td></tr>`;
112
119
  };
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>
120
+ return `<table class="tabel"><colgroup><col style="width:20%" /><col style="width:52%" /><col style="width:16%" /><col style="width:12%" /></colgroup>
121
+ <thead><tr class="onder"><th>Code</th><th>Omschrijving</th><th style="text-align:right">Aantal</th><th>Eenheid</th></tr></thead>
115
122
  <tbody>${regels.map(rij).join("")}</tbody></table>`;
116
123
  }
117
124
  function totalenBlok(regels, velden) {
@@ -236,21 +243,21 @@ export function renderProfielDocument(documenttype, config, gegevens, opties = {
236
243
  .map((groep) => groepHtml(groep, cfg, velden, data, opties))
237
244
  .filter(Boolean)
238
245
  .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; }
246
+ return `<!doctype html><html lang="nl"><head><meta charset="utf-8" />
247
+ <title>${esc(opties.titel ?? profiel.label)}</title>
248
+ <style>
249
+ @page { size: ${b}mm ${h}mm; margin: ${marge}mm; }
250
+ * { box-sizing: border-box; }
251
+ html, body { margin: 0; padding: 0; }
252
+ body { font-family: Arial, Helvetica, sans-serif; font-size: 9pt; color: #111827; line-height: 1.35; }
253
+ .blok { margin-bottom: 2.5mm; }
254
+ .kop { border-bottom: 0.3mm solid #d1d5db; padding-bottom: 1mm; }
255
+ .sectitel { font-size: 90%; font-weight: 600; text-transform: uppercase; color: #6b7280; margin-bottom: 0.6mm; }
256
+ .vet { font-weight: 600; }
257
+ .klein { font-size: 85%; color: #6b7280; }
258
+ .kv { display: flex; justify-content: space-between; gap: 3mm; }
259
+ .kv .k { color: #6b7280; }
260
+ .tabel { width: 100%; border-collapse: collapse; table-layout: fixed; }
261
+ .tabel th { text-align: left; font-weight: 600; }
255
262
  </style></head><body>${kop}${body}</body></html>`;
256
263
  }
@@ -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
+ });
@@ -6,9 +6,9 @@
6
6
  import { toast } from "@flowselections/core";
7
7
  import { printHtml, volgJobStatus } from "./printApi.js";
8
8
  export async function drukTestpaginaAf(printerId, naam) {
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>
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
12
  <p style="margin:0">${new Date().toLocaleString("nl-NL")}</p></div>`;
13
13
  try {
14
14
  const { jobId } = await printHtml({
@@ -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
  /**
@@ -34,9 +34,15 @@ export interface PrintJobModel {
34
34
  payload?: Record<string, unknown> | null;
35
35
  /** Bij de virtuele PDF-printer: de opgemaakte PDF om te downloaden. */
36
36
  resultaat_pdf_base64?: string | null;
37
+ artefact_pad?: string | null;
38
+ artefact_sha256?: string | null;
39
+ artefact_bytes?: number | null;
40
+ verwerkingsfase?: string | null;
41
+ foutcode?: string | null;
37
42
  lokale_pdf_status?: string | null;
38
43
  lokaal_opgeslagen_op?: string | null;
39
44
  lokale_pdf_fout?: string | null;
45
+ lokale_pdf_print_plek_id?: string | null;
40
46
  }
41
47
  export declare function zorgVoorFloridayLayouts(): Promise<boolean>;
42
48
  export declare function zorgVoorStandaardLayouts(): Promise<boolean>;
@@ -113,5 +119,7 @@ export declare function maakPrintJob(input: {
113
119
  documentnaam: string;
114
120
  kopieen?: number;
115
121
  is_herprint?: boolean;
122
+ bron_job_id?: string | null;
123
+ payload?: Record<string, unknown>;
116
124
  }): Promise<void>;
117
125
  //# sourceMappingURL=useDocumentData.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useDocumentData.d.ts","sourceRoot":"","sources":["../../src/lib/useDocumentData.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAGrF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAI9C,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,+EAA+E;IAC/E,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,iEAAiE;IACjE,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,iFAAiF;IACjF,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACzC,uEAAuE;IACvE,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AASD,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,OAAO,CAAC,CA8BhE;AAmBD,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,OAAO,CAAC,CA+DjE;AAED,wBAAgB,UAAU;;;;EAyBzB;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,UAAU,GAAG,WAAW,CAAC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC,mBAQA;AAED,wBAAsB,eAAe,CAAC,EAAE,EAAE,MAAM,mBA2B/C;AAED,wBAAsB,eAAe,CAAC,EAAE,EAAE,MAAM,iBAG/C;AAED,wBAAsB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,iBAM5E;AAwBD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM;;;;;;;EAkD/C;AAED,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,kBAAkB,EAAE,EAC/B,YAAY,CAAC,EAAE,YAAY,iBA+C5B;AAED,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,kBAAkB,EAAE,EAAE,UAAU,EAAE,MAAM,mBAmBvG;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM;;YAEjC,MAAM;sBAAgB,MAAM;oBAAc,MAAM,GAAG,IAAI;oBAAc,MAAM;kBAAY,OAAO;;;EAcvG;AAID,wBAAgB,WAAW;;;mBAEmC,MAAM;oBAAc,MAAM;;;;EAmBvF;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,iBAS9E;AAED,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,MAAM,iBAGhD;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,iBAWhF;AAED,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,iBAMtF;AAID,wBAAgB,YAAY;;;;EAoB3B;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,SAAS,CAyB7C;AAED,wBAAsB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,iBAS/D;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,iBAkBA"}
1
+ {"version":3,"file":"useDocumentData.d.ts","sourceRoot":"","sources":["../../src/lib/useDocumentData.ts"],"names":[],"mappings":"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"}
@@ -407,7 +407,7 @@ export function usePrintJobs() {
407
407
  setLoading(true);
408
408
  const { data } = await supabase
409
409
  .from("print_jobs")
410
- .select("*")
410
+ .select("id, layout_id, printer_id, documenttype, documentnaam, status, paginas, kopieen, foutmelding, is_herprint, gebruiker_naam, created_at, voltooid_op, extern_job_id, gebruikte_layout_id, gebruikte_bron, payload, lokale_pdf_status, lokaal_opgeslagen_op, lokale_pdf_fout, lokale_pdf_print_plek_id, artefact_pad, artefact_sha256, artefact_bytes, verwerkingsfase, foutcode")
411
411
  .order("created_at", { ascending: false })
412
412
  .limit(200);
413
413
  setJobs(arr(data));
@@ -1,3 +1,4 @@
1
+ import { type PrintHtmlInput } from "./printApi.js";
1
2
  export interface VoorbeeldLayout {
2
3
  id?: string | null;
3
4
  naam?: string | null;
@@ -8,6 +9,8 @@ export interface VoorbeeldLayout {
8
9
  orientatie?: string | null;
9
10
  marge_boven?: number | null;
10
11
  }
12
+ /** Pure opbouw van de opdracht, zodat printplekdoorgifte regressiegetest kan worden. */
13
+ export declare function bouwVoorbeeldPrintInvoer(layout: VoorbeeldLayout, html: string, printerId: string, printplekId?: string): PrintHtmlInput;
11
14
  /**
12
15
  * Stuurt meegestuurde opmaak als voorbeeldafdruk naar de printer die bij deze
13
16
  * layout hoort en volgt de status in de wachtrij.
@@ -1 +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;IAC9B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6CzF"}
1
+ {"version":3,"file":"voorbeeldPrint.d.ts","sourceRoot":"","sources":["../../src/lib/voorbeeldPrint.ts"],"names":[],"mappings":"AAQA,OAAO,EAKL,KAAK,cAAc,EACpB,MAAM,YAAY,CAAC;AAKpB,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;IAC9B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,wFAAwF;AACxF,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,WAAW,CAAC,EAAE,MAAM,GACnB,cAAc,CAwBhB;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqEzF"}
@@ -5,24 +5,20 @@
5
5
  // zodat de wachtrij niets opnieuw opmaakt.
6
6
  // ============================================================================
7
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) {
8
+ import { printHtml, printerAfdrukmethode, printerVoorLayout, volgJobStatus, } from "./printApi.js";
9
+ import { lokalePdfPrintplek, pdfMapToestemming } from "./pdfMap.js";
10
+ import { printerVoorPrintplek } from "./printplekken.js";
11
+ import { isOpslagFout, PDF_OPSLAG_MELDING } from "./pdfOpslagStatus.js";
12
+ /** Pure opbouw van de opdracht, zodat printplekdoorgifte regressiegetest kan worden. */
13
+ export function bouwVoorbeeldPrintInvoer(layout, html, printerId, printplekId) {
14
14
  const documenttype = String(layout.documenttype ?? "pakbon");
15
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({
16
+ return {
22
17
  documenttype,
23
18
  documentnaam: `Voorbeeld ${naam}`,
24
19
  html,
25
20
  printerId,
21
+ ...(printplekId ? { printplekId } : {}),
26
22
  // Bewust geen layout_id: de meegestuurde opmaak is leidend. Het formaat van
27
23
  // de bewerkte layout gaat wel mee, zodat het voorbeeld op hetzelfde papier
28
24
  // uitkomt als de echte afdruk (bijvoorbeeld A5 in plaats van A4).
@@ -37,17 +33,69 @@ export async function voorbeeldPrint(layout, html) {
37
33
  },
38
34
  },
39
35
  isHerprint: true,
40
- });
41
- toast.success("Voorbeeld naar de printer verstuurd");
36
+ };
37
+ }
38
+ /**
39
+ * Stuurt meegestuurde opmaak als voorbeeldafdruk naar de printer die bij deze
40
+ * layout hoort en volgt de status in de wachtrij.
41
+ */
42
+ export async function voorbeeldPrint(layout, html) {
43
+ const documenttype = String(layout.documenttype ?? "pakbon");
44
+ const naam = layout.naam ?? documenttype;
45
+ const printerId = await printerVoorLayout(layout);
46
+ if (!printerId) {
47
+ toast.error(`Nog geen printer gekoppeld aan ${naam} — stel dit in bij Printen > Standaardregels.`);
48
+ return;
49
+ }
50
+ const isPdf = (await printerAfdrukmethode(printerId)) === "pdf";
51
+ let printplekId;
52
+ if (isPdf) {
53
+ const lokalePrintplek = await lokalePdfPrintplek();
54
+ if (!lokalePrintplek) {
55
+ throw new Error("Deze Mac heeft nog geen PDF-map met printplek. Kies de map opnieuw bij de bedoelde printplek.");
56
+ }
57
+ const printerOpPlek = await printerVoorPrintplek(lokalePrintplek, documenttype);
58
+ if (printerOpPlek !== printerId) {
59
+ throw new Error("De PDF-map van deze Mac hoort niet bij de printplek van dit document. Controleer de printer bij deze printplek.");
60
+ }
61
+ const toestemming = await pdfMapToestemming(printerId);
62
+ if (toestemming === "ontbreekt")
63
+ throw new Error(PDF_OPSLAG_MELDING.map_ontbreekt);
64
+ if (toestemming !== "granted")
65
+ throw new Error(PDF_OPSLAG_MELDING.geen_rechten);
66
+ printplekId = lokalePrintplek;
67
+ }
68
+ const { jobId } = await printHtml(bouwVoorbeeldPrintInvoer(layout, html, printerId, printplekId));
69
+ toast.success(isPdf ? "Voorbeeld wordt in de PDF-map opgeslagen" : "Voorbeeld naar de printer verstuurd");
70
+ let afgerond = false;
42
71
  const stop = volgJobStatus(jobId, (s) => {
43
- if (s.status === "klaar") {
72
+ if (isPdf && s.lokale_pdf_status === "opgeslagen" && s.lokaal_opgeslagen_op) {
73
+ afgerond = true;
74
+ toast.success("Voorbeeld opgeslagen in de PDF-map");
75
+ stop();
76
+ }
77
+ else if (isPdf && isOpslagFout(s.lokale_pdf_status)) {
78
+ afgerond = true;
79
+ toast.error(s.lokale_pdf_fout ??
80
+ PDF_OPSLAG_MELDING[s.lokale_pdf_status ?? ""] ??
81
+ "Voorbeeld kon niet in de PDF-map worden opgeslagen.");
82
+ stop();
83
+ }
84
+ else if (!isPdf && (s.status === "klaar" || s.status === "voltooid")) {
85
+ afgerond = true;
44
86
  toast.success("Voorbeeld afgedrukt");
45
87
  stop();
46
88
  }
47
89
  else if (s.status === "mislukt") {
48
- toast.error(s.foutmelding ?? "Voorbeeld printen mislukt");
90
+ afgerond = true;
91
+ toast.error(s.lokale_pdf_fout ?? s.foutmelding ?? "Voorbeeld printen mislukt");
49
92
  stop();
50
93
  }
51
94
  });
52
- window.setTimeout(() => stop(), 120000);
95
+ window.setTimeout(() => {
96
+ stop();
97
+ if (isPdf && !afgerond) {
98
+ toast.error("Het voorbeeld is nog niet opgeslagen. Controleer de opdracht in de printwachtrij.");
99
+ }
100
+ }, 5 * 60000);
53
101
  }