@flowselections/layout-maker 1.45.9 → 1.46.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 (96) hide show
  1. package/README.md +139 -139
  2. package/dist-lib/components/AfdrukKnop.d.ts +19 -19
  3. package/dist-lib/components/AfdrukKnop.js +64 -64
  4. package/dist-lib/components/DocumentenPage.d.ts.map +1 -1
  5. package/dist-lib/components/DocumentenPage.js +2 -3
  6. package/dist-lib/components/NetwerkPrintersDialog.d.ts +7 -7
  7. package/dist-lib/components/NetwerkPrintersDialog.js +79 -79
  8. package/dist-lib/components/PakbonPreview.d.ts.map +1 -1
  9. package/dist-lib/components/PakbonPreview.js +2 -2
  10. package/dist-lib/components/PrintQueuePage.d.ts.map +1 -1
  11. package/dist-lib/components/PrintQueuePage.js +45 -74
  12. package/dist-lib/components/PrintenPage.d.ts.map +1 -1
  13. package/dist-lib/components/PrintenPage.js +2 -3
  14. package/dist-lib/components/PrinterSetupWizard.d.ts.map +1 -1
  15. package/dist-lib/components/PrinterSetupWizard.js +5 -28
  16. package/dist-lib/components/PrintersRedirectPage.d.ts +1 -1
  17. package/dist-lib/components/PrintersRedirectPage.js +14 -14
  18. package/dist-lib/components/PrintplekDetailPage.d.ts.map +1 -1
  19. package/dist-lib/components/PrintplekDetailPage.js +3 -25
  20. package/dist-lib/components/PrintplekWizard.d.ts.map +1 -1
  21. package/dist-lib/components/PrintplekWizard.js +3 -85
  22. package/dist-lib/index.d.ts +1 -8
  23. package/dist-lib/index.d.ts.map +1 -1
  24. package/dist-lib/index.js +1 -10
  25. package/dist-lib/integrations/supabase/auth-middleware.d.ts +5386 -289
  26. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  27. package/dist-lib/integrations/supabase/client.server.d.ts +5386 -289
  28. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  29. package/dist-lib/integrations/supabase/client.server.js +1 -1
  30. package/dist-lib/integrations/supabase/moduleClient.d.ts +5386 -289
  31. package/dist-lib/integrations/supabase/moduleClient.d.ts.map +1 -1
  32. package/dist-lib/integrations/supabase/types.d.ts +5404 -243
  33. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  34. package/dist-lib/lib/aiLayout.functions.d.ts +5386 -289
  35. package/dist-lib/lib/aiLayout.functions.d.ts.map +1 -1
  36. package/dist-lib/lib/aiLayout.server.js +9 -9
  37. package/dist-lib/lib/browserPrint.js +1 -1
  38. package/dist-lib/lib/fieldRegistry.js +1 -0
  39. package/dist-lib/lib/layoutPreview.js +7 -7
  40. package/dist-lib/lib/logoLibrary.d.ts +2 -1
  41. package/dist-lib/lib/logoLibrary.d.ts.map +1 -1
  42. package/dist-lib/lib/logoLibrary.js +42 -2
  43. package/dist-lib/lib/orderData.server.d.ts.map +1 -1
  44. package/dist-lib/lib/orderData.server.js +13 -0
  45. package/dist-lib/lib/pakbonBuilder.d.ts +26 -0
  46. package/dist-lib/lib/pakbonBuilder.d.ts.map +1 -1
  47. package/dist-lib/lib/pakbonBuilder.js +37 -0
  48. package/dist-lib/lib/pakbonContent.d.ts.map +1 -1
  49. package/dist-lib/lib/pakbonContent.js +2 -2
  50. package/dist-lib/lib/pakbonHtml.d.ts.map +1 -1
  51. package/dist-lib/lib/pakbonHtml.js +60 -60
  52. package/dist-lib/lib/pakbonPresentation.d.ts.map +1 -1
  53. package/dist-lib/lib/pakbonPresentation.js +2 -4
  54. package/dist-lib/lib/printApi.d.ts +0 -2
  55. package/dist-lib/lib/printApi.d.ts.map +1 -1
  56. package/dist-lib/lib/printApi.js +0 -21
  57. package/dist-lib/lib/printQueue.server.d.ts +8 -0
  58. package/dist-lib/lib/printQueue.server.d.ts.map +1 -1
  59. package/dist-lib/lib/printQueue.server.js +162 -66
  60. package/dist-lib/lib/printService.functions.d.ts +51639 -52
  61. package/dist-lib/lib/printService.functions.d.ts.map +1 -1
  62. package/dist-lib/lib/printService.functions.js +69 -0
  63. package/dist-lib/lib/printService.server.d.ts +2 -0
  64. package/dist-lib/lib/printService.server.d.ts.map +1 -1
  65. package/dist-lib/lib/printService.server.js +10 -0
  66. package/dist-lib/lib/productiebonHtml.js +15 -15
  67. package/dist-lib/lib/profielHtml.d.ts.map +1 -1
  68. package/dist-lib/lib/profielHtml.js +22 -19
  69. package/dist-lib/lib/supabaseAdmin.server.d.ts +5 -5
  70. package/dist-lib/lib/supabaseAdmin.server.js +43 -43
  71. package/dist-lib/lib/testpagina.js +3 -3
  72. package/dist-lib/lib/testprint.js +4 -4
  73. package/dist-lib/lib/voorbeeldPrint.d.ts.map +1 -1
  74. package/dist-lib/lib/voorbeeldPrint.js +7 -39
  75. package/package.json +3 -3
  76. package/dist-lib/components/PdfMapAutoSaver.d.ts +0 -6
  77. package/dist-lib/components/PdfMapAutoSaver.d.ts.map +0 -1
  78. package/dist-lib/components/PdfMapAutoSaver.js +0 -12
  79. package/dist-lib/components/PdfMapGlobaleBanner.d.ts +0 -12
  80. package/dist-lib/components/PdfMapGlobaleBanner.d.ts.map +0 -1
  81. package/dist-lib/components/PdfMapGlobaleBanner.js +0 -30
  82. package/dist-lib/components/PdfMapToestemmingBanner.d.ts +0 -8
  83. package/dist-lib/components/PdfMapToestemmingBanner.d.ts.map +0 -1
  84. package/dist-lib/components/PdfMapToestemmingBanner.js +0 -245
  85. package/dist-lib/lib/pdfJobSaver.d.ts +0 -24
  86. package/dist-lib/lib/pdfJobSaver.d.ts.map +0 -1
  87. package/dist-lib/lib/pdfJobSaver.js +0 -376
  88. package/dist-lib/lib/pdfMap.d.ts +0 -83
  89. package/dist-lib/lib/pdfMap.d.ts.map +0 -1
  90. package/dist-lib/lib/pdfMap.js +0 -332
  91. package/dist-lib/lib/pdfOpslagStatus.d.ts +0 -23
  92. package/dist-lib/lib/pdfOpslagStatus.d.ts.map +0 -1
  93. package/dist-lib/lib/pdfOpslagStatus.js +0 -74
  94. package/dist-lib/lib/pdfPrinter.d.ts +0 -9
  95. package/dist-lib/lib/pdfPrinter.d.ts.map +0 -1
  96. package/dist-lib/lib/pdfPrinter.js +0 -34
@@ -1,83 +0,0 @@
1
- type MapHandle = {
2
- name: string;
3
- queryPermission?: (o: {
4
- mode: string;
5
- }) => Promise<string>;
6
- requestPermission?: (o: {
7
- mode: string;
8
- }) => Promise<string>;
9
- getFileHandle: (naam: string, o?: {
10
- create?: boolean;
11
- }) => Promise<{
12
- createWritable: () => Promise<{
13
- write: (d: Blob) => Promise<void>;
14
- close: () => Promise<void>;
15
- }>;
16
- }>;
17
- };
18
- export type PdfMapKoppeling = {
19
- versie: 1;
20
- handle: MapHandle;
21
- printPlekId: string | null;
22
- persistent: boolean | null;
23
- bijgewerktOp: string;
24
- };
25
- export declare function mapKiezenMogelijk(): boolean;
26
- /** Koppelt deze browsermap aan de fysieke printplek die hij mag afhandelen. */
27
- export declare function koppelPdfMapAanPrintplek(printPlekId: string): Promise<void>;
28
- /** De printplek waarvoor deze browser lokale PDF's mag schrijven. */
29
- export declare function lokalePdfPrintplek(): Promise<string | null>;
30
- /**
31
- * Leest de samenhangende lokale map/printplek-koppeling. Oude losse sleutels
32
- * worden eenmalig naar dit record gemigreerd zonder een geldige handle te wissen.
33
- */
34
- export declare function pdfMapKoppeling(): Promise<PdfMapKoppeling | null>;
35
- export declare function luisterNaarPdfMapWijziging(handler: () => void): () => void;
36
- export type PdfMapKeuze = {
37
- status: "gekozen";
38
- naam: string;
39
- persistent: boolean | null;
40
- } | {
41
- status: "geannuleerd";
42
- } | {
43
- status: "niet-ondersteund";
44
- } | {
45
- status: "iframe-geblokkeerd";
46
- } | {
47
- status: "fout";
48
- melding: string;
49
- };
50
- /**
51
- * Browsers blokkeren showDirectoryPicker in een cross-origin iframe (zoals de
52
- * Lovable-preview). De aanroeper kan dan aanbieden om de app in een eigen
53
- * tabblad te openen, waar de verkenner wel werkt.
54
- */
55
- export declare function draaitInIframe(): boolean;
56
- /** Opent de huidige pagina in een eigen tabblad (buiten het preview-iframe). */
57
- export declare function openInEigenTabblad(printPlekId?: string): void;
58
- /**
59
- * Opent de mappenverkenner van het besturingssysteem zodat de gebruiker een
60
- * map kan selecteren. Start in Downloads zodat het pad snel te vinden is.
61
- * Geeft terug wat er is gebeurd zodat de aanroeper gericht kan reageren.
62
- */
63
- export declare function kiesPdfMap(printerId: string, printPlekId?: string): Promise<PdfMapKeuze>;
64
- /** Is er voor deze printer een map gekozen op deze computer? */
65
- export declare function heeftPdfMap(printerId: string): Promise<boolean>;
66
- /** Naam van de gekozen map (voor meldingen), of null. */
67
- export declare function pdfMapNaam(printerId: string): Promise<string | null>;
68
- /**
69
- * Probeert het bestand rechtstreeks in de gekozen map te zetten. Lukt dat niet
70
- * (andere computer, geen toestemming, browser zonder ondersteuning), dan geeft
71
- * de functie false terug en kan de aanroeper gewoon downloaden.
72
- */
73
- export declare function bewaarInPdfMap(printerId: string, bestandsnaam: string, blob: Blob): Promise<boolean>;
74
- /** Controleert toestemming zonder een bestandsactie te starten. */
75
- export declare function pdfMapToestemming(printerId: string): Promise<"granted" | "prompt" | "denied" | "ontbreekt">;
76
- /**
77
- * Vraagt vanuit een expliciete gebruikersklik opnieuw schrijftoestemming voor
78
- * een eerder gekozen map. Achtergrondtaken mogen deze browserprompt niet zelf
79
- * openen, omdat browsers daarvoor een actieve gebruikershandeling vereisen.
80
- */
81
- export declare function herstelPdfMapToestemming(printerId: string): Promise<"granted" | "denied" | "ontbreekt">;
82
- export {};
83
- //# sourceMappingURL=pdfMap.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pdfMap.d.ts","sourceRoot":"","sources":["../../src/lib/pdfMap.ts"],"names":[],"mappings":"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"}
@@ -1,332 +0,0 @@
1
- // ============================================================================
2
- // src/lib/pdfMap.ts — keuze van de map op de eigen computer waarin PDF's van
3
- // de virtuele "Opslaan als PDF"-printer worden bewaard. De maphandle blijft
4
- // lokaal in IndexedDB staan. De browser bewaart daarnaast de printplek-id,
5
- // zodat alleen de bedoelde werkplek opdrachten uit de gedeelde wachtrij claimt.
6
- // ============================================================================
7
- const DB_NAAM = "layout-maker-pdfmap";
8
- const STORE = "handles";
9
- const BEWAARD_SLEUTEL = "layout-maker-pdf-bewaard";
10
- const GLOBALE_HANDLE_SLEUTEL = "__gekozen_pdf_map__";
11
- const PDF_PRINTPLEK_SLEUTEL = "__gekozen_pdf_printplek__";
12
- const PDF_KOPPELING_SLEUTEL = "__pdf_map_koppeling_v1__";
13
- const PDF_MAP_GEWIJZIGD_EVENT = "layout-maker:pdf-map-gewijzigd";
14
- export function mapKiezenMogelijk() {
15
- return typeof window !== "undefined" && "showDirectoryPicker" in window;
16
- }
17
- function openDb() {
18
- return new Promise((resolve, reject) => {
19
- const req = indexedDB.open(DB_NAAM, 1);
20
- req.onupgradeneeded = () => {
21
- if (!req.result.objectStoreNames.contains(STORE))
22
- req.result.createObjectStore(STORE);
23
- };
24
- req.onsuccess = () => resolve(req.result);
25
- req.onerror = () => reject(req.error);
26
- });
27
- }
28
- async function vraagPersistenteOpslag() {
29
- try {
30
- if (!navigator.storage?.persist)
31
- return null;
32
- if (await navigator.storage.persisted?.())
33
- return true;
34
- return await navigator.storage.persist();
35
- }
36
- catch {
37
- return null;
38
- }
39
- }
40
- async function bewaarHandle(printerId, handle, printPlekId) {
41
- const persistent = await vraagPersistenteOpslag();
42
- const koppeling = {
43
- versie: 1,
44
- handle,
45
- printPlekId: printPlekId?.trim() || null,
46
- persistent,
47
- bijgewerktOp: new Date().toISOString(),
48
- };
49
- const db = await openDb();
50
- await new Promise((resolve, reject) => {
51
- const tx = db.transaction(STORE, "readwrite");
52
- const store = tx.objectStore(STORE);
53
- // De map hoort bij deze browser/computer, niet bij een database-printer-id.
54
- // Bewaar daarom ook onder één vaste sleutel. Dit voorkomt dat een nieuwe of
55
- // dubbele virtuele PDF-printer de reeds goedgekeurde map onzichtbaar maakt.
56
- store.put(handle, GLOBALE_HANDLE_SLEUTEL);
57
- store.put(handle, printerId);
58
- store.put(koppeling, PDF_KOPPELING_SLEUTEL);
59
- if (koppeling.printPlekId)
60
- store.put(koppeling.printPlekId, PDF_PRINTPLEK_SLEUTEL);
61
- tx.oncomplete = () => resolve();
62
- tx.onerror = () => reject(tx.error);
63
- });
64
- window.dispatchEvent(new CustomEvent(PDF_MAP_GEWIJZIGD_EVENT, { detail: { printerId } }));
65
- return koppeling;
66
- }
67
- /** Koppelt deze browsermap aan de fysieke printplek die hij mag afhandelen. */
68
- export async function koppelPdfMapAanPrintplek(printPlekId) {
69
- const id = printPlekId.trim();
70
- if (!id)
71
- throw new Error("Kies eerst een printplek voor deze PDF-map.");
72
- const bestaande = await pdfMapKoppeling();
73
- const db = await openDb();
74
- await new Promise((resolve, reject) => {
75
- const tx = db.transaction(STORE, "readwrite");
76
- const store = tx.objectStore(STORE);
77
- store.put(id, PDF_PRINTPLEK_SLEUTEL);
78
- if (bestaande?.handle) {
79
- store.put({ ...bestaande, printPlekId: id, bijgewerktOp: new Date().toISOString() }, PDF_KOPPELING_SLEUTEL);
80
- }
81
- tx.oncomplete = () => resolve();
82
- tx.onerror = () => reject(tx.error);
83
- });
84
- window.dispatchEvent(new CustomEvent(PDF_MAP_GEWIJZIGD_EVENT, { detail: { printPlekId: id } }));
85
- }
86
- /** De printplek waarvoor deze browser lokale PDF's mag schrijven. */
87
- export async function lokalePdfPrintplek() {
88
- try {
89
- const koppeling = await pdfMapKoppeling();
90
- if (koppeling?.printPlekId)
91
- return koppeling.printPlekId;
92
- const db = await openDb();
93
- return await new Promise((resolve, reject) => {
94
- const tx = db.transaction(STORE, "readonly");
95
- const req = tx.objectStore(STORE).get(PDF_PRINTPLEK_SLEUTEL);
96
- req.onsuccess = () => {
97
- const waarde = typeof req.result === "string" ? req.result.trim() : "";
98
- resolve(waarde || null);
99
- };
100
- req.onerror = () => reject(req.error);
101
- });
102
- }
103
- catch {
104
- return null;
105
- }
106
- }
107
- /**
108
- * Leest de samenhangende lokale map/printplek-koppeling. Oude losse sleutels
109
- * worden eenmalig naar dit record gemigreerd zonder een geldige handle te wissen.
110
- */
111
- export async function pdfMapKoppeling() {
112
- try {
113
- const db = await openDb();
114
- const lees = (sleutel) => new Promise((resolve, reject) => {
115
- const tx = db.transaction(STORE, "readonly");
116
- const req = tx.objectStore(STORE).get(sleutel);
117
- req.onsuccess = () => resolve(req.result ?? null);
118
- req.onerror = () => reject(req.error);
119
- });
120
- const bestaand = await lees(PDF_KOPPELING_SLEUTEL);
121
- if (bestaand?.versie === 1 && bestaand.handle)
122
- return bestaand;
123
- const handle = await lees(GLOBALE_HANDLE_SLEUTEL);
124
- if (!handle)
125
- return null;
126
- const printPlekId = await lees(PDF_PRINTPLEK_SLEUTEL);
127
- const gemigreerd = {
128
- versie: 1,
129
- handle,
130
- printPlekId: typeof printPlekId === "string" && printPlekId.trim() ? printPlekId.trim() : null,
131
- persistent: await vraagPersistenteOpslag(),
132
- bijgewerktOp: new Date().toISOString(),
133
- };
134
- await new Promise((resolve, reject) => {
135
- const tx = db.transaction(STORE, "readwrite");
136
- tx.objectStore(STORE).put(gemigreerd, PDF_KOPPELING_SLEUTEL);
137
- tx.oncomplete = () => resolve();
138
- tx.onerror = () => reject(tx.error);
139
- });
140
- return gemigreerd;
141
- }
142
- catch {
143
- return null;
144
- }
145
- }
146
- export function luisterNaarPdfMapWijziging(handler) {
147
- if (typeof window === "undefined")
148
- return () => undefined;
149
- window.addEventListener(PDF_MAP_GEWIJZIGD_EVENT, handler);
150
- return () => window.removeEventListener(PDF_MAP_GEWIJZIGD_EVENT, handler);
151
- }
152
- async function leesHandle(printerId) {
153
- try {
154
- const db = await openDb();
155
- const lees = (sleutel) => new Promise((resolve, reject) => {
156
- const tx = db.transaction(STORE, "readonly");
157
- const req = tx.objectStore(STORE).get(sleutel);
158
- req.onsuccess = () => resolve(req.result ?? null);
159
- req.onerror = () => reject(req.error);
160
- });
161
- const koppeling = await pdfMapKoppeling();
162
- if (koppeling?.handle)
163
- return koppeling.handle;
164
- const globaal = await lees(GLOBALE_HANDLE_SLEUTEL);
165
- if (globaal)
166
- return globaal;
167
- const direct = await lees(printerId);
168
- if (direct) {
169
- await bewaarHandle(printerId, direct);
170
- return direct;
171
- }
172
- const gevonden = await new Promise((resolve, reject) => {
173
- const tx = db.transaction(STORE, "readonly");
174
- const store = tx.objectStore(STORE);
175
- const cursor = store.openCursor();
176
- cursor.onsuccess = () => {
177
- const rij = cursor.result;
178
- if (!rij) {
179
- resolve(null);
180
- return;
181
- }
182
- const handle = rij.value;
183
- if (handle?.name && typeof handle.getFileHandle === "function") {
184
- resolve(handle);
185
- return;
186
- }
187
- rij.continue();
188
- };
189
- cursor.onerror = () => reject(cursor.error);
190
- });
191
- if (gevonden)
192
- await bewaarHandle(printerId, gevonden);
193
- return gevonden;
194
- }
195
- catch {
196
- return null;
197
- }
198
- }
199
- /**
200
- * Browsers blokkeren showDirectoryPicker in een cross-origin iframe (zoals de
201
- * Lovable-preview). De aanroeper kan dan aanbieden om de app in een eigen
202
- * tabblad te openen, waar de verkenner wel werkt.
203
- */
204
- export function draaitInIframe() {
205
- try {
206
- return typeof window !== "undefined" && window.self !== window.top;
207
- }
208
- catch {
209
- return true;
210
- }
211
- }
212
- /** Opent de huidige pagina in een eigen tabblad (buiten het preview-iframe). */
213
- export function openInEigenTabblad(printPlekId) {
214
- const url = new URL(window.location.href);
215
- url.searchParams.set("pdf-map-instellen", "1");
216
- if (printPlekId?.trim())
217
- url.searchParams.set("pdf-printplek", printPlekId.trim());
218
- window.open(url.toString(), "_blank", "noopener");
219
- }
220
- /**
221
- * Opent de mappenverkenner van het besturingssysteem zodat de gebruiker een
222
- * map kan selecteren. Start in Downloads zodat het pad snel te vinden is.
223
- * Geeft terug wat er is gebeurd zodat de aanroeper gericht kan reageren.
224
- */
225
- export async function kiesPdfMap(printerId, printPlekId) {
226
- if (!mapKiezenMogelijk())
227
- return { status: "niet-ondersteund" };
228
- try {
229
- const handle = (await window.showDirectoryPicker({
230
- mode: "readwrite",
231
- startIn: "downloads",
232
- }));
233
- const koppeling = await bewaarHandle(printerId, handle, printPlekId);
234
- // Een nieuwe mapkeuze is ook een expliciete opdracht om reeds voltooide
235
- // PDF-jobs opnieuw naar deze map te schrijven.
236
- try {
237
- localStorage.removeItem(BEWAARD_SLEUTEL);
238
- }
239
- catch {
240
- // Lokale opslag kan door browserbeleid uitgeschakeld zijn.
241
- }
242
- return { status: "gekozen", naam: handle.name, persistent: koppeling.persistent };
243
- }
244
- catch (fout) {
245
- // De gebruiker drukt op Annuleren in de verkenner → AbortError, geen fout.
246
- if (fout instanceof DOMException && fout.name === "AbortError") {
247
- return { status: "geannuleerd" };
248
- }
249
- // Cross-origin iframe → SecurityError ("Cross origin sub frames aren't
250
- // allowed to show a file picker"). Aparte status zodat de UI een
251
- // "open in eigen tabblad"-knop kan tonen.
252
- if (fout instanceof DOMException &&
253
- (fout.name === "SecurityError" || /cross.?origin/i.test(fout.message))) {
254
- return { status: "iframe-geblokkeerd" };
255
- }
256
- return {
257
- status: "fout",
258
- melding: fout instanceof Error ? fout.message : "Onbekende fout",
259
- };
260
- }
261
- }
262
- /** Is er voor deze printer een map gekozen op deze computer? */
263
- export async function heeftPdfMap(printerId) {
264
- return (await leesHandle(printerId)) !== null;
265
- }
266
- /** Naam van de gekozen map (voor meldingen), of null. */
267
- export async function pdfMapNaam(printerId) {
268
- const h = await leesHandle(printerId);
269
- return h?.name ?? null;
270
- }
271
- /**
272
- * Probeert het bestand rechtstreeks in de gekozen map te zetten. Lukt dat niet
273
- * (andere computer, geen toestemming, browser zonder ondersteuning), dan geeft
274
- * de functie false terug en kan de aanroeper gewoon downloaden.
275
- */
276
- export async function bewaarInPdfMap(printerId, bestandsnaam, blob) {
277
- const handle = await leesHandle(printerId);
278
- if (!handle)
279
- return false;
280
- try {
281
- const toestemming = (await handle.queryPermission?.({ mode: "readwrite" })) ?? "granted";
282
- if (toestemming !== "granted") {
283
- const nieuw = await handle.requestPermission?.({ mode: "readwrite" });
284
- if (nieuw !== "granted")
285
- return false;
286
- }
287
- const bestand = await handle.getFileHandle(bestandsnaam, { create: true });
288
- const writable = await bestand.createWritable();
289
- await writable.write(blob);
290
- await writable.close();
291
- return true;
292
- }
293
- catch (fout) {
294
- console.error("[layout-maker] PDF kon niet lokaal worden opgeslagen", fout);
295
- return false;
296
- }
297
- }
298
- /** Controleert toestemming zonder een bestandsactie te starten. */
299
- export async function pdfMapToestemming(printerId) {
300
- const handle = await leesHandle(printerId);
301
- if (!handle)
302
- return "ontbreekt";
303
- try {
304
- return ((await handle.queryPermission?.({ mode: "readwrite" })) ?? "granted");
305
- }
306
- catch {
307
- return "denied";
308
- }
309
- }
310
- /**
311
- * Vraagt vanuit een expliciete gebruikersklik opnieuw schrijftoestemming voor
312
- * een eerder gekozen map. Achtergrondtaken mogen deze browserprompt niet zelf
313
- * openen, omdat browsers daarvoor een actieve gebruikershandeling vereisen.
314
- */
315
- export async function herstelPdfMapToestemming(printerId) {
316
- const handle = await leesHandle(printerId);
317
- if (!handle)
318
- return "ontbreekt";
319
- try {
320
- // requestPermission moet rechtstreeks in deze klik-callstack plaatsvinden;
321
- // een voorafgaande await kan de tijdelijke gebruikersactivatie laten verlopen.
322
- if (handle.requestPermission) {
323
- const nieuw = await handle.requestPermission({ mode: "readwrite" });
324
- return nieuw === "granted" ? "granted" : "denied";
325
- }
326
- const huidig = (await handle.queryPermission?.({ mode: "readwrite" })) ?? "granted";
327
- return huidig === "granted" ? "granted" : "denied";
328
- }
329
- catch {
330
- return "denied";
331
- }
332
- }
@@ -1,23 +0,0 @@
1
- /** Volledige set opslagstatussen die deze module schrijft. */
2
- export declare const PDF_OPSLAG_STATUSSEN: readonly ["wachtend", "bezig", "gereed", "opgeslagen", "map_ontbreekt", "geen_rechten", "schrijffout", "timeout"];
3
- export type PdfOpslagStatus = (typeof PDF_OPSLAG_STATUSSEN)[number];
4
- /** Statussen waarbij opslaan (nog) niet is gelukt en herstel nodig is. */
5
- export declare const PDF_OPSLAG_FOUTSTATUSSEN: readonly string[];
6
- /** Statussen waarvoor de lokale service nog werk moet doen. */
7
- export declare const PDF_OPSLAG_OPENSTAAND: readonly string[];
8
- /** Korte, tonbare omschrijving per status (voor wachtrij en pickscherm). */
9
- export declare const PDF_OPSLAG_LABEL: Record<string, string>;
10
- /**
11
- * Foutzinnen in gewone taal. Deze tekst wordt letterlijk in het pickscherm
12
- * getoond, dus: één zin, met wie wat moet doen. Geen technische details.
13
- */
14
- export declare const PDF_OPSLAG_MELDING: Record<string, string>;
15
- /**
16
- * Leesbare status voor de wachtrij. Een PDF die gereed staat maar aan geen
17
- * enkele plek hangt, wacht niet op een werkplek: er is er simpelweg geen
18
- * gekoppeld. Dat verschil maken we hier zichtbaar.
19
- */
20
- export declare function pdfOpslagLabel(status?: string | null, heeftPlek?: boolean): string | null;
21
- /** Is deze opdracht blijven steken op het opslaan? */
22
- export declare function isOpslagFout(status?: string | null): boolean;
23
- //# sourceMappingURL=pdfOpslagStatus.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pdfOpslagStatus.d.ts","sourceRoot":"","sources":["../../src/lib/pdfOpslagStatus.ts"],"names":[],"mappings":"AAOA,8DAA8D;AAC9D,eAAO,MAAM,oBAAoB,mHASvB,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEpE,0EAA0E;AAC1E,eAAO,MAAM,wBAAwB,EAAE,SAAS,MAAM,EAQrD,CAAC;AAEF,+DAA+D;AAC/D,eAAO,MAAM,qBAAqB,EAAE,SAAS,MAAM,EAKlD,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAWnD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CASrD,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAMzF;AAED,sDAAsD;AACtD,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAE5D"}
@@ -1,74 +0,0 @@
1
- // ============================================================================
2
- // src/lib/pdfOpslagStatus.ts — vaste, gedocumenteerde set statussen voor het
3
- // lokaal opslaan van een PDF-printopdracht. De pickmodule leest deze waarden
4
- // rechtstreeks uit `print_jobs.lokale_pdf_status`, dus waarden mogen alleen
5
- // worden TOEGEVOEGD; nooit hernoemd of hergebruikt.
6
- // ============================================================================
7
- /** Volledige set opslagstatussen die deze module schrijft. */
8
- export const PDF_OPSLAG_STATUSSEN = [
9
- "wachtend", // opdracht aangemaakt, PDF nog niet opgemaakt
10
- "bezig", // PDF wordt opgemaakt of weggeschreven
11
- "gereed", // PDF staat klaar, wacht op de werkplek die de map beheert
12
- "opgeslagen", // bestand staat in de gekozen map op de werkplek
13
- "map_ontbreekt", // op deze werkplek is (nog) geen PDF-map gekozen
14
- "geen_rechten", // de map bestaat, maar de werkplek heeft geen schrijfrecht meer
15
- "schrijffout", // schrijven naar de map is mislukt
16
- "timeout", // de PDF was niet op tijd gereed
17
- ];
18
- /** Statussen waarbij opslaan (nog) niet is gelukt en herstel nodig is. */
19
- export const PDF_OPSLAG_FOUTSTATUSSEN = [
20
- "map_ontbreekt",
21
- "geen_rechten",
22
- "schrijffout",
23
- "timeout",
24
- // Historische waarden; blijven leesbaar zodat oude opdrachten herstelbaar zijn.
25
- "toestemming_nodig",
26
- "fout",
27
- ];
28
- /** Statussen waarvoor de lokale service nog werk moet doen. */
29
- export const PDF_OPSLAG_OPENSTAAND = [
30
- "wachtend",
31
- "bezig",
32
- "gereed",
33
- ...PDF_OPSLAG_FOUTSTATUSSEN,
34
- ];
35
- /** Korte, tonbare omschrijving per status (voor wachtrij en pickscherm). */
36
- export const PDF_OPSLAG_LABEL = {
37
- wachtend: "PDF nog niet opgemaakt",
38
- bezig: "PDF wordt opgeslagen",
39
- gereed: "PDF gereed — wacht op werkplek",
40
- opgeslagen: "opgeslagen in de PDF-map",
41
- map_ontbreekt: "PDF-map ontbreekt",
42
- geen_rechten: "geen schrijfrecht op de PDF-map",
43
- schrijffout: "opslaan in de map mislukt",
44
- timeout: "wachten op de PDF verlopen",
45
- toestemming_nodig: "geen schrijfrecht op de PDF-map",
46
- fout: "opslaan mislukt",
47
- };
48
- /**
49
- * Foutzinnen in gewone taal. Deze tekst wordt letterlijk in het pickscherm
50
- * getoond, dus: één zin, met wie wat moet doen. Geen technische details.
51
- */
52
- export const PDF_OPSLAG_MELDING = {
53
- map_ontbreekt: "Kies op deze werkplek eerst een PDF-map in Layout maker; daarna wordt dit document opnieuw opgeslagen.",
54
- geen_rechten: "Geef op deze werkplek opnieuw toestemming voor de PDF-map; daarna wordt dit document opnieuw opgeslagen.",
55
- schrijffout: "Het document kon niet in de PDF-map worden opgeslagen; controleer de map op deze werkplek en probeer opslaan opnieuw.",
56
- timeout: "Het document was niet op tijd opgemaakt; print of sla dit document opnieuw op.",
57
- };
58
- /**
59
- * Leesbare status voor de wachtrij. Een PDF die gereed staat maar aan geen
60
- * enkele plek hangt, wacht niet op een werkplek: er is er simpelweg geen
61
- * gekoppeld. Dat verschil maken we hier zichtbaar.
62
- */
63
- export function pdfOpslagLabel(status, heeftPlek) {
64
- if (!status)
65
- return null;
66
- if (status === "gereed") {
67
- return heeftPlek ? "PDF gereed — wordt opgehaald" : "geen computer gekoppeld";
68
- }
69
- return PDF_OPSLAG_LABEL[status] ?? null;
70
- }
71
- /** Is deze opdracht blijven steken op het opslaan? */
72
- export function isOpslagFout(status) {
73
- return !!status && PDF_OPSLAG_FOUTSTATUSSEN.includes(status);
74
- }
@@ -1,9 +0,0 @@
1
- /**
2
- * Zorgt dat de virtuele PDF-printer bestaat. Geeft true terug als de printer
3
- * er na afloop is (bestaand of net aangemaakt), en welke melding past.
4
- */
5
- export declare function zorgVoorPdfPrinter(): Promise<{
6
- ok: boolean;
7
- alAanwezig: boolean;
8
- }>;
9
- //# sourceMappingURL=pdfPrinter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pdfPrinter.d.ts","sourceRoot":"","sources":["../../src/lib/pdfPrinter.ts"],"names":[],"mappings":"AASA;;;GAGG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC;IAClD,EAAE,EAAE,OAAO,CAAC;IACZ,UAAU,EAAE,OAAO,CAAC;CACrB,CAAC,CAsBD"}
@@ -1,34 +0,0 @@
1
- // ============================================================================
2
- // src/lib/pdfPrinter.ts — gedeelde helper voor de virtuele "Opslaan als
3
- // PDF"-printer. Documenten die hierheen gaan worden niet geprint maar als
4
- // downloadbare PDF in de printwachtrij bewaard. Er is maar één PDF-printer
5
- // nodig; een tweede wordt niet aangemaakt.
6
- // ============================================================================
7
- import { supabase } from "./supabaseClient.js";
8
- /**
9
- * Zorgt dat de virtuele PDF-printer bestaat. Geeft true terug als de printer
10
- * er na afloop is (bestaand of net aangemaakt), en welke melding past.
11
- */
12
- export async function zorgVoorPdfPrinter() {
13
- const { data: bestaand } = await supabase
14
- .from("printers")
15
- .select("id")
16
- .eq("afdrukmethode", "pdf")
17
- .eq("actief", true)
18
- .limit(1);
19
- if ((bestaand ?? []).length > 0)
20
- return { ok: true, alAanwezig: true };
21
- const { error } = await supabase
22
- .from("printers")
23
- .insert({
24
- naam: "Opslaan als PDF",
25
- omschrijving: "Virtuele printer: documenten worden als PDF in de printwachtrij bewaard.",
26
- actief: true,
27
- online: true,
28
- afdrukmethode: "pdf",
29
- papierformaat: "A4",
30
- });
31
- if (error)
32
- throw error;
33
- return { ok: true, alAanwezig: false };
34
- }