@flowselections/layout-maker 1.45.19 → 1.51.2

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 (95) hide show
  1. package/dist-lib/components/ComputerVerwijderenDialog.d.ts +16 -0
  2. package/dist-lib/components/ComputerVerwijderenDialog.d.ts.map +1 -0
  3. package/dist-lib/components/ComputerVerwijderenDialog.js +38 -0
  4. package/dist-lib/components/ComputersLijst.d.ts.map +1 -1
  5. package/dist-lib/components/ComputersLijst.js +5 -2
  6. package/dist-lib/components/DocumentenPage.d.ts.map +1 -1
  7. package/dist-lib/components/DocumentenPage.js +2 -3
  8. package/dist-lib/components/LayoutPrinterSelect.d.ts +3 -5
  9. package/dist-lib/components/LayoutPrinterSelect.d.ts.map +1 -1
  10. package/dist-lib/components/LayoutPrinterSelect.js +40 -17
  11. package/dist-lib/components/LayoutsPage.d.ts.map +1 -1
  12. package/dist-lib/components/LayoutsPage.js +28 -18
  13. package/dist-lib/components/PrintQueuePage.d.ts.map +1 -1
  14. package/dist-lib/components/PrintQueuePage.js +5 -71
  15. package/dist-lib/components/PrintenPage.d.ts.map +1 -1
  16. package/dist-lib/components/PrintenPage.js +2 -3
  17. package/dist-lib/components/PrinterSetupWizard.d.ts +3 -1
  18. package/dist-lib/components/PrinterSetupWizard.d.ts.map +1 -1
  19. package/dist-lib/components/PrinterSetupWizard.js +15 -29
  20. package/dist-lib/components/PrinterVervangenDialog.d.ts +14 -0
  21. package/dist-lib/components/PrinterVervangenDialog.d.ts.map +1 -0
  22. package/dist-lib/components/PrinterVervangenDialog.js +44 -0
  23. package/dist-lib/components/PrintersPage.d.ts.map +1 -1
  24. package/dist-lib/components/PrintersPage.js +2 -2
  25. package/dist-lib/components/PrintplekDetailPage.d.ts.map +1 -1
  26. package/dist-lib/components/PrintplekDetailPage.js +173 -68
  27. package/dist-lib/components/PrintplekVerwijderenDialog.d.ts +9 -0
  28. package/dist-lib/components/PrintplekVerwijderenDialog.d.ts.map +1 -0
  29. package/dist-lib/components/PrintplekVerwijderenDialog.js +34 -0
  30. package/dist-lib/components/PrintplekWizard.d.ts.map +1 -1
  31. package/dist-lib/components/PrintplekWizard.js +3 -85
  32. package/dist-lib/components/PrintplekkenPage.d.ts.map +1 -1
  33. package/dist-lib/components/PrintplekkenPage.js +28 -6
  34. package/dist-lib/components/WerkplekConfiguratiePage.d.ts.map +1 -1
  35. package/dist-lib/components/WerkplekConfiguratiePage.js +67 -25
  36. package/dist-lib/index.d.ts +9 -12
  37. package/dist-lib/index.d.ts.map +1 -1
  38. package/dist-lib/index.js +7 -13
  39. package/dist-lib/integrations/supabase/auth-middleware.d.ts +1414 -24
  40. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  41. package/dist-lib/integrations/supabase/client.server.d.ts +1414 -24
  42. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  43. package/dist-lib/integrations/supabase/moduleClient.d.ts +1414 -24
  44. package/dist-lib/integrations/supabase/moduleClient.d.ts.map +1 -1
  45. package/dist-lib/integrations/supabase/types.d.ts +1471 -42
  46. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  47. package/dist-lib/lib/aiLayout.functions.d.ts +1414 -24
  48. package/dist-lib/lib/aiLayout.functions.d.ts.map +1 -1
  49. package/dist-lib/lib/documentRoutering.d.ts +2 -1
  50. package/dist-lib/lib/documentRoutering.d.ts.map +1 -1
  51. package/dist-lib/lib/documentRoutering.js +5 -8
  52. package/dist-lib/lib/foutTekst.d.ts +3 -0
  53. package/dist-lib/lib/foutTekst.d.ts.map +1 -0
  54. package/dist-lib/lib/foutTekst.js +25 -0
  55. package/dist-lib/lib/printApi.d.ts +0 -2
  56. package/dist-lib/lib/printApi.d.ts.map +1 -1
  57. package/dist-lib/lib/printApi.js +13 -60
  58. package/dist-lib/lib/printQueue.server.d.ts +8 -0
  59. package/dist-lib/lib/printQueue.server.d.ts.map +1 -1
  60. package/dist-lib/lib/printQueue.server.js +55 -133
  61. package/dist-lib/lib/printRoutering.d.ts +34 -0
  62. package/dist-lib/lib/printRoutering.d.ts.map +1 -0
  63. package/dist-lib/lib/printRoutering.js +69 -0
  64. package/dist-lib/lib/printService.functions.d.ts +6980 -30
  65. package/dist-lib/lib/printService.functions.d.ts.map +1 -1
  66. package/dist-lib/lib/printplekken.d.ts +67 -2
  67. package/dist-lib/lib/printplekken.d.ts.map +1 -1
  68. package/dist-lib/lib/printplekken.js +141 -10
  69. package/dist-lib/lib/useDocumentData.d.ts +15 -10
  70. package/dist-lib/lib/useDocumentData.d.ts.map +1 -1
  71. package/dist-lib/lib/useDocumentData.js +43 -34
  72. package/dist-lib/lib/voorbeeldPrint.d.ts.map +1 -1
  73. package/dist-lib/lib/voorbeeldPrint.js +7 -39
  74. package/package.json +2 -2
  75. package/dist-lib/components/PdfMapAutoSaver.d.ts +0 -6
  76. package/dist-lib/components/PdfMapAutoSaver.d.ts.map +0 -1
  77. package/dist-lib/components/PdfMapAutoSaver.js +0 -12
  78. package/dist-lib/components/PdfMapGlobaleBanner.d.ts +0 -12
  79. package/dist-lib/components/PdfMapGlobaleBanner.d.ts.map +0 -1
  80. package/dist-lib/components/PdfMapGlobaleBanner.js +0 -30
  81. package/dist-lib/components/PdfMapToestemmingBanner.d.ts +0 -8
  82. package/dist-lib/components/PdfMapToestemmingBanner.d.ts.map +0 -1
  83. package/dist-lib/components/PdfMapToestemmingBanner.js +0 -245
  84. package/dist-lib/lib/pdfJobSaver.d.ts +0 -24
  85. package/dist-lib/lib/pdfJobSaver.d.ts.map +0 -1
  86. package/dist-lib/lib/pdfJobSaver.js +0 -405
  87. package/dist-lib/lib/pdfMap.d.ts +0 -90
  88. package/dist-lib/lib/pdfMap.d.ts.map +0 -1
  89. package/dist-lib/lib/pdfMap.js +0 -349
  90. package/dist-lib/lib/pdfOpslagStatus.d.ts +0 -23
  91. package/dist-lib/lib/pdfOpslagStatus.d.ts.map +0 -1
  92. package/dist-lib/lib/pdfOpslagStatus.js +0 -74
  93. package/dist-lib/lib/pdfPrinter.d.ts +0 -9
  94. package/dist-lib/lib/pdfPrinter.d.ts.map +0 -1
  95. package/dist-lib/lib/pdfPrinter.js +0 -34
@@ -1,405 +0,0 @@
1
- import { toast } from "@flowselections/core";
2
- import { supabase } from "./supabaseClient.js";
3
- import { startPdfMapGlobaleBanner } from "../components/PdfMapGlobaleBanner.js";
4
- import { bewaarInPdfMap, herstelPdfMapToestemming, koppelPdfMapAanPrintplek, luisterNaarPdfMapWijziging, lokalePdfPrintplek, pdfMapKoppeling, pdfMapToestemming, verwijderUitPdfMap, } from "./pdfMap.js";
5
- import { PDF_OPSLAG_MELDING } from "./pdfOpslagStatus.js";
6
- const SERVICE_INTERVAL_MS = 5000;
7
- const WACHT_INTERVAL_MS = 2000;
8
- const MAX_WACHTTIJD_MS = 5 * 60 * 1000;
9
- const WRITER_SLEUTEL = "layout-maker-pdf-writer-id";
10
- function writerId() {
11
- try {
12
- const bestaand = localStorage.getItem(WRITER_SLEUTEL)?.trim();
13
- if (bestaand)
14
- return bestaand;
15
- const nieuw = crypto.randomUUID();
16
- localStorage.setItem(WRITER_SLEUTEL, nieuw);
17
- return nieuw;
18
- }
19
- catch {
20
- return crypto.randomUUID();
21
- }
22
- }
23
- function veiligeBestandsnaam(naam) {
24
- return naam.replace(/[\\/:*?"<>|]/g, "-").replace(/\s+/g, " ").trim() || "document";
25
- }
26
- function pdfBlob(base64) {
27
- const bytes = Uint8Array.from(atob(base64), (teken) => teken.charCodeAt(0));
28
- return new Blob([bytes], { type: "application/pdf" });
29
- }
30
- async function laadPdfBlob(job) {
31
- if (job.artefact_pad) {
32
- const { data, error } = await supabase.storage.from("print-artifacts").download(job.artefact_pad);
33
- if (error || !data)
34
- throw new Error(`PDF-bestand kon niet worden opgehaald: ${error?.message ?? "onbekend"}`);
35
- return data;
36
- }
37
- if (job.resultaat_pdf_base64)
38
- return pdfBlob(job.resultaat_pdf_base64);
39
- throw new Error("Voor deze opdracht is geen PDF-bestand beschikbaar.");
40
- }
41
- async function rondClaimAf(jobId, schrijver, status, fout = null) {
42
- const { data, error } = await supabase.rpc("finish_local_pdf_job", {
43
- _job_id: jobId,
44
- _writer_id: schrijver,
45
- _status: status,
46
- _fout: fout ?? undefined,
47
- });
48
- if (error)
49
- throw new Error(`Lokale PDF-status kon niet worden opgeslagen: ${error.message}`);
50
- if (data !== true)
51
- throw new Error("De lokale PDF-claim is verlopen of door een andere werkplek overgenomen.");
52
- }
53
- /**
54
- * Geeft een geclaimde opdracht terug aan de wachtrij. Een tabblad zonder
55
- * bruikbare map mag nooit afkeuren wat een andere werkplek wél kan opslaan.
56
- */
57
- async function geefClaimTerug(jobId, schrijver) {
58
- const { error } = await supabase.rpc("release_local_pdf_job", {
59
- _job_id: jobId,
60
- _writer_id: schrijver,
61
- });
62
- if (error)
63
- console.warn("[layout-maker] PDF-opdracht teruggeven mislukt", error.message);
64
- }
65
- /** Is deze opdracht net geannuleerd? Annuleren wint altijd van een lopende claim. */
66
- async function isGeannuleerd(jobId) {
67
- const { data } = await supabase
68
- .from("print_jobs")
69
- .select("status")
70
- .eq("id", jobId)
71
- .maybeSingle();
72
- return data?.status === "geannuleerd";
73
- }
74
- async function schrijfGeclaimdePdf(job, schrijver) {
75
- if (!job.printer_id || (!job.artefact_pad && !job.resultaat_pdf_base64))
76
- return false;
77
- // Race met de annuleerknop: controleer vlak vóór het schrijven opnieuw.
78
- if (await isGeannuleerd(job.id))
79
- return true;
80
- const toestemming = await pdfMapToestemming(job.printer_id);
81
- if (toestemming !== "granted") {
82
- // Geen map of geen schrijfrecht op dít tabblad: terug in de wachtrij.
83
- await geefClaimTerug(job.id, schrijver);
84
- return false;
85
- }
86
- const naam = `${veiligeBestandsnaam(job.documentnaam ?? "document")}-${job.id.slice(0, 8)}.pdf`;
87
- let geschreven = false;
88
- try {
89
- geschreven = await bewaarInPdfMap(job.printer_id, naam, await laadPdfBlob(job));
90
- }
91
- catch {
92
- geschreven = false;
93
- }
94
- if (!geschreven) {
95
- await rondClaimAf(job.id, schrijver, "schrijffout", PDF_OPSLAG_MELDING.schrijffout);
96
- return false;
97
- }
98
- // Annulering tijdens het schrijven: haal het bestand meteen weer weg en
99
- // bevestig niets meer aan de database. Annuleren wint altijd.
100
- if (await isGeannuleerd(job.id)) {
101
- await verwijderUitPdfMap(job.printer_id, naam);
102
- return true;
103
- }
104
- // Eerst het bestand sluiten, daarna pas de database bevestigen. Een fout in
105
- // deze bevestiging wordt nooit meer genegeerd of als succes aan de UI gemeld.
106
- try {
107
- await rondClaimAf(job.id, schrijver, "opgeslagen");
108
- }
109
- catch (fout) {
110
- // Was de opdracht ondertussen geannuleerd, dan is de mislukte bevestiging
111
- // juist de bedoeling: bestand weghalen en stilletjes afronden.
112
- if (await isGeannuleerd(job.id)) {
113
- await verwijderUitPdfMap(job.printer_id, naam);
114
- return true;
115
- }
116
- throw fout;
117
- }
118
- return true;
119
- }
120
- async function bepaalEigenPrintplek() {
121
- const opgeslagen = await lokalePdfPrintplek();
122
- if (opgeslagen)
123
- return opgeslagen;
124
- // Zonder een in deze browser gekozen map doet dit tabblad niet mee: anders
125
- // kaapt een preview- of extra tabblad opdrachten die het niet kan opslaan.
126
- const koppeling = await pdfMapKoppeling();
127
- if (!koppeling?.handle)
128
- return null;
129
- // Wél een map, maar nog geen plek eraan gekoppeld (oude installatie):
130
- // uitsluitend als deze database exact één printplek met een PDF-printer heeft
131
- // kan er geen twijfel bestaan over de eigenaar van die map.
132
- const { data, error } = await supabase
133
- .from("document_printplek_printers")
134
- .select("print_plek_id, printers!inner(afdrukmethode)")
135
- .eq("printers.afdrukmethode", "pdf");
136
- if (error)
137
- return null;
138
- const ids = [...new Set((Array.isArray(data) ? data : []).map((rij) => String(rij.print_plek_id ?? "")).filter(Boolean))];
139
- if (ids.length !== 1)
140
- return null;
141
- const enigePrintplek = ids[0];
142
- if (!enigePrintplek)
143
- return null;
144
- await koppelPdfMapAanPrintplek(enigePrintplek);
145
- return enigePrintplek;
146
- }
147
- /** Heeft dít tabblad een bruikbare map met schrijfrecht voor deze printplek? */
148
- async function magOpdrachtenClaimen() {
149
- const koppeling = await pdfMapKoppeling();
150
- if (!koppeling?.handle)
151
- return false;
152
- try {
153
- const toestemming = await koppeling.handle.queryPermission?.({ mode: "readwrite" });
154
- return (toestemming ?? "granted") === "granted";
155
- }
156
- catch {
157
- return false;
158
- }
159
- }
160
- function meldMapProbleem(state, printerId) {
161
- if (state.gemeldePrinters.has(printerId))
162
- return;
163
- state.gemeldePrinters.add(printerId);
164
- toast.error("De PDF-map van deze werkplek is niet bruikbaar", {
165
- description: "Bevestig de maptoestemming en kies daarna bij de opdracht ‘Opnieuw opslaan’.",
166
- action: {
167
- label: "Maptoestemming regelen",
168
- onClick: () => {
169
- void herstelPdfMapToestemming(printerId).then((resultaat) => {
170
- if (resultaat === "granted")
171
- state.gemeldePrinters.delete(printerId);
172
- else
173
- toast.error("Maptoestemming is niet verleend");
174
- });
175
- },
176
- },
177
- duration: 15000,
178
- });
179
- }
180
- /** Schrijft hooguit dit aantal bestanden tegelijk naar de map. */
181
- const SCHRIJF_PARALLEL = 2;
182
- /** Vaste batchlimiet per ronde. */
183
- const CLAIM_MAX = 6;
184
- async function metPool(items, max, fn) {
185
- let volgende = 0;
186
- const werkers = Array.from({ length: Math.max(1, Math.min(max, items.length)) }, async () => {
187
- for (;;) {
188
- const i = volgende++;
189
- if (i >= items.length)
190
- return;
191
- await fn(items[i]);
192
- }
193
- });
194
- await Promise.all(werkers);
195
- }
196
- async function verwerkGereedstaandePdfs(state) {
197
- if (state.bezig)
198
- return;
199
- state.bezig = true;
200
- try {
201
- const printPlekId = await bepaalEigenPrintplek();
202
- if (!printPlekId)
203
- return;
204
- // Alleen een tabblad met een bruikbare map pakt werk op.
205
- if (!(await magOpdrachtenClaimen()))
206
- return;
207
- const { data, error } = await supabase.rpc("claim_local_pdf_jobs", {
208
- _print_plek_id: printPlekId,
209
- _writer_id: state.writerId,
210
- _max: CLAIM_MAX,
211
- });
212
- if (error)
213
- throw new Error(`PDF-opdrachten ophalen mislukt: ${error.message}`);
214
- let opgeslagen = 0;
215
- const jobs = (Array.isArray(data) ? data : []);
216
- await metPool(jobs, SCHRIJF_PARALLEL, async (job) => {
217
- try {
218
- if (await schrijfGeclaimdePdf(job, state.writerId)) {
219
- opgeslagen += 1;
220
- if (job.printer_id)
221
- state.gemeldePrinters.delete(job.printer_id);
222
- }
223
- else if (job.printer_id) {
224
- meldMapProbleem(state, job.printer_id);
225
- }
226
- }
227
- catch (fout) {
228
- console.error("[layout-maker] lokale PDF-opslag kon niet worden bevestigd", fout);
229
- toast.error(fout instanceof Error ? fout.message : "Lokale PDF-opslag mislukt");
230
- }
231
- });
232
- if (opgeslagen) {
233
- toast.success(opgeslagen === 1 ? "PDF opgeslagen in de ingestelde map" : `${opgeslagen} PDF's opgeslagen`);
234
- }
235
- // Zat de batch vol? Dan staat er mogelijk nog werk klaar.
236
- if (jobs.length >= CLAIM_MAX) {
237
- state.bezig = false;
238
- await verwerkGereedstaandePdfs(state);
239
- return;
240
- }
241
- }
242
- catch (fout) {
243
- console.error("[layout-maker] lokale PDF-service", fout);
244
- }
245
- finally {
246
- state.bezig = false;
247
- }
248
- }
249
- /** Herstelt uitsluitend de lokale aflevering van een reeds gerenderde PDF. */
250
- export async function bewaarPdfJobOpnieuw(jobId) {
251
- const printPlekId = await bepaalEigenPrintplek();
252
- if (!printPlekId)
253
- throw new Error("Kies eerst bij deze printplek de lokale PDF-map.");
254
- const { data: job, error: leesFout } = await supabase
255
- .from("print_jobs")
256
- .select("id, resultaat_pdf_base64, artefact_pad, lokale_pdf_print_plek_id")
257
- .eq("id", jobId)
258
- .maybeSingle();
259
- if (leesFout)
260
- throw leesFout;
261
- if (!job?.resultaat_pdf_base64 && !job?.artefact_pad)
262
- throw new Error("Voor deze opdracht is nog geen bestaande PDF beschikbaar.");
263
- if (job.lokale_pdf_print_plek_id && job.lokale_pdf_print_plek_id !== printPlekId) {
264
- throw new Error("Deze PDF hoort bij een andere printplek.");
265
- }
266
- const { error } = await supabase
267
- .from("print_jobs")
268
- .update({
269
- lokale_pdf_print_plek_id: printPlekId,
270
- lokale_pdf_status: "gereed",
271
- lokale_pdf_fout: null,
272
- lokale_pdf_claim_id: null,
273
- lokale_pdf_claim_tot: null,
274
- status: "bezig",
275
- foutmelding: null,
276
- voltooid_op: null,
277
- updated_at: new Date().toISOString(),
278
- })
279
- .eq("id", jobId);
280
- if (error)
281
- throw error;
282
- startPdfMapService();
283
- const state = window.__layoutMakerPdfService;
284
- if (state)
285
- await verwerkGereedstaandePdfs(state);
286
- return true;
287
- }
288
- /** Downloadt exact het opgeslagen artefact; legacy jobs vallen terug op base64. */
289
- export async function downloadPdfJob(jobId, documentnaam) {
290
- const { data, error } = await supabase
291
- .from("print_jobs")
292
- .select("id, artefact_pad, resultaat_pdf_base64")
293
- .eq("id", jobId)
294
- .maybeSingle();
295
- if (error)
296
- throw error;
297
- if (!data)
298
- throw new Error("De printopdracht bestaat niet meer.");
299
- const blob = await laadPdfBlob({
300
- ...data,
301
- status: "",
302
- printer_id: null,
303
- documentnaam,
304
- lokale_pdf_status: null,
305
- lokale_pdf_print_plek_id: null,
306
- artefact_sha256: null,
307
- artefact_bytes: null,
308
- });
309
- const url = URL.createObjectURL(blob);
310
- const link = document.createElement("a");
311
- link.href = url;
312
- link.download = `${veiligeBestandsnaam(documentnaam)}.pdf`;
313
- link.click();
314
- URL.revokeObjectURL(url);
315
- }
316
- export async function controleerPdfMap(printerId) {
317
- const toestemming = await pdfMapToestemming(printerId);
318
- if (toestemming === "ontbreekt")
319
- return "map_ontbreekt";
320
- return toestemming === "granted" ? "ok" : "geen_rechten";
321
- }
322
- /**
323
- * Volgt de printopdrachten van de eigen printplek live. Zodra er een PDF
324
- * gereed staat begint het wegschrijven direct; mislukt het abonnement, dan
325
- * blijft de poll het vangnet en wordt dat zichtbaar in de console.
326
- */
327
- async function abonneerOpGereedstaandePdfs(state, controleer) {
328
- try {
329
- const printPlekId = await bepaalEigenPrintplek();
330
- if (!printPlekId)
331
- return;
332
- if (state.kanaal)
333
- return;
334
- state.kanaal = supabase
335
- .channel(`layout-maker-lokale-pdf-${printPlekId}`)
336
- .on("postgres_changes", {
337
- event: "*",
338
- schema: "public",
339
- table: "print_jobs",
340
- filter: `lokale_pdf_print_plek_id=eq.${printPlekId}`,
341
- }, (payload) => {
342
- const rij = (payload.new ?? {});
343
- if (rij.lokale_pdf_status === "gereed")
344
- controleer();
345
- })
346
- .subscribe();
347
- }
348
- catch (fout) {
349
- console.warn("[layout-maker] live meeluisteren op PDF-opdrachten mislukt", fout);
350
- }
351
- }
352
- export function startPdfMapService() {
353
- if (typeof window === "undefined")
354
- return;
355
- // De zwevende mapmelding hoort bij deze service: zodra de map of toestemming
356
- // ontbreekt verschijnt hij boven elke pagina, en verdwijnt hij weer zodra de
357
- // toestemming verleend is.
358
- startPdfMapGlobaleBanner();
359
- const bestaand = window.__layoutMakerPdfService;
360
- if (bestaand?.gestart) {
361
- void verwerkGereedstaandePdfs(bestaand);
362
- return;
363
- }
364
- const state = {
365
- gestart: true,
366
- bezig: false,
367
- interval: null,
368
- gemeldePrinters: new Set(),
369
- writerId: writerId(),
370
- };
371
- window.__layoutMakerPdfService = state;
372
- const controleer = () => void verwerkGereedstaandePdfs(state);
373
- // Realtime is het snelle pad: zodra een opdracht 'gereed' staat begint het
374
- // wegschrijven meteen. De vijfsecondenpoll blijft uitsluitend vangnet.
375
- void abonneerOpGereedstaandePdfs(state, controleer);
376
- state.interval = window.setInterval(controleer, SERVICE_INTERVAL_MS);
377
- window.addEventListener("focus", controleer);
378
- window.addEventListener("online", controleer);
379
- document.addEventListener("visibilitychange", () => {
380
- if (document.visibilityState === "visible")
381
- controleer();
382
- });
383
- luisterNaarPdfMapWijziging(controleer);
384
- controleer();
385
- }
386
- /** Wacht alleen op het eindresultaat; de singleton met databaseclaim schrijft. */
387
- export async function bewaarPdfJobZodraKlaar(jobId, _printerId) {
388
- startPdfMapService();
389
- const deadline = Date.now() + MAX_WACHTTIJD_MS;
390
- while (Date.now() < deadline) {
391
- const { data, error } = await supabase
392
- .from("print_jobs")
393
- .select("status, lokale_pdf_status")
394
- .eq("id", jobId)
395
- .maybeSingle();
396
- if (error)
397
- return false;
398
- if (data?.lokale_pdf_status === "opgeslagen")
399
- return true;
400
- if (data?.status === "mislukt" || data?.status === "geannuleerd")
401
- return false;
402
- await new Promise((resolve) => window.setTimeout(resolve, WACHT_INTERVAL_MS));
403
- }
404
- return false;
405
- }
@@ -1,90 +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
- removeEntry?: (naam: string) => Promise<void>;
18
- };
19
- export type PdfMapKoppeling = {
20
- versie: 1;
21
- handle: MapHandle;
22
- printPlekId: string | null;
23
- persistent: boolean | null;
24
- bijgewerktOp: string;
25
- };
26
- export declare function mapKiezenMogelijk(): boolean;
27
- /** Koppelt deze browsermap aan de fysieke printplek die hij mag afhandelen. */
28
- export declare function koppelPdfMapAanPrintplek(printPlekId: string): Promise<void>;
29
- /** De printplek waarvoor deze browser lokale PDF's mag schrijven. */
30
- export declare function lokalePdfPrintplek(): Promise<string | null>;
31
- /**
32
- * Leest de samenhangende lokale map/printplek-koppeling. Oude losse sleutels
33
- * worden eenmalig naar dit record gemigreerd zonder een geldige handle te wissen.
34
- */
35
- export declare function pdfMapKoppeling(): Promise<PdfMapKoppeling | null>;
36
- export declare function luisterNaarPdfMapWijziging(handler: () => void): () => void;
37
- export type PdfMapKeuze = {
38
- status: "gekozen";
39
- naam: string;
40
- persistent: boolean | null;
41
- } | {
42
- status: "geannuleerd";
43
- } | {
44
- status: "niet-ondersteund";
45
- } | {
46
- status: "iframe-geblokkeerd";
47
- } | {
48
- status: "fout";
49
- melding: string;
50
- };
51
- /**
52
- * Browsers blokkeren showDirectoryPicker in een cross-origin iframe (zoals de
53
- * Lovable-preview). De aanroeper kan dan aanbieden om de app in een eigen
54
- * tabblad te openen, waar de verkenner wel werkt.
55
- */
56
- export declare function draaitInIframe(): boolean;
57
- /** Opent de huidige pagina in een eigen tabblad (buiten het preview-iframe). */
58
- export declare function openInEigenTabblad(printPlekId?: string): void;
59
- /**
60
- * Opent de mappenverkenner van het besturingssysteem zodat de gebruiker een
61
- * map kan selecteren. Start in Downloads zodat het pad snel te vinden is.
62
- * Geeft terug wat er is gebeurd zodat de aanroeper gericht kan reageren.
63
- */
64
- export declare function kiesPdfMap(printerId: string, printPlekId?: string): Promise<PdfMapKeuze>;
65
- /** Is er voor deze printer een map gekozen op deze computer? */
66
- export declare function heeftPdfMap(printerId: string): Promise<boolean>;
67
- /** Naam van de gekozen map (voor meldingen), of null. */
68
- export declare function pdfMapNaam(printerId: string): Promise<string | null>;
69
- /**
70
- * Probeert het bestand rechtstreeks in de gekozen map te zetten. Lukt dat niet
71
- * (andere computer, geen toestemming, browser zonder ondersteuning), dan geeft
72
- * de functie false terug en kan de aanroeper gewoon downloaden.
73
- */
74
- export declare function bewaarInPdfMap(printerId: string, bestandsnaam: string, blob: Blob): Promise<boolean>;
75
- /**
76
- * Verwijdert een zojuist weggeschreven bestand weer, bijvoorbeeld wanneer de
77
- * opdracht tijdens het schrijven is geannuleerd. Lukt het niet, dan blijft het
78
- * bestand staan en geeft de functie false terug.
79
- */
80
- export declare function verwijderUitPdfMap(printerId: string, bestandsnaam: string): Promise<boolean>;
81
- /** Controleert toestemming zonder een bestandsactie te starten. */
82
- export declare function pdfMapToestemming(printerId: string): Promise<"granted" | "prompt" | "denied" | "ontbreekt">;
83
- /**
84
- * Vraagt vanuit een expliciete gebruikersklik opnieuw schrijftoestemming voor
85
- * een eerder gekozen map. Achtergrondtaken mogen deze browserprompt niet zelf
86
- * openen, omdat browsers daarvoor een actieve gebruikershandeling vereisen.
87
- */
88
- export declare function herstelPdfMapToestemming(printerId: string): Promise<"granted" | "denied" | "ontbreekt">;
89
- export {};
90
- //# 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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"}