@flowselections/layout-maker 1.31.0 → 1.36.7
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.
- package/dist-lib/components/ComputersLijst.d.ts.map +1 -1
- package/dist-lib/components/ComputersLijst.js +5 -5
- package/dist-lib/components/DocumentenPage.d.ts.map +1 -1
- package/dist-lib/components/DocumentenPage.js +3 -2
- package/dist-lib/components/LayoutPrinterSelect.d.ts +8 -0
- package/dist-lib/components/LayoutPrinterSelect.d.ts.map +1 -0
- package/dist-lib/components/LayoutPrinterSelect.js +23 -0
- package/dist-lib/components/LayoutsPage.d.ts.map +1 -1
- package/dist-lib/components/LayoutsPage.js +16 -3
- package/dist-lib/components/PakbonBuilderPage.d.ts.map +1 -1
- package/dist-lib/components/PakbonBuilderPage.js +3 -1
- package/dist-lib/components/PakbonSectiesPanel.d.ts.map +1 -1
- package/dist-lib/components/PakbonSectiesPanel.js +6 -2
- package/dist-lib/components/PdfMapAutoSaver.d.ts +6 -0
- package/dist-lib/components/PdfMapAutoSaver.d.ts.map +1 -0
- package/dist-lib/components/PdfMapAutoSaver.js +12 -0
- package/dist-lib/components/PdfMapGlobaleBanner.d.ts +12 -0
- package/dist-lib/components/PdfMapGlobaleBanner.d.ts.map +1 -0
- package/dist-lib/components/PdfMapGlobaleBanner.js +30 -0
- package/dist-lib/components/PdfMapToestemmingBanner.d.ts +7 -0
- package/dist-lib/components/PdfMapToestemmingBanner.d.ts.map +1 -0
- package/dist-lib/components/PdfMapToestemmingBanner.js +139 -0
- package/dist-lib/components/PrintQueuePage.d.ts.map +1 -1
- package/dist-lib/components/PrintQueuePage.js +42 -3
- package/dist-lib/components/PrintenPage.d.ts.map +1 -1
- package/dist-lib/components/PrintenPage.js +3 -2
- package/dist-lib/components/PrinterSetupWizard.d.ts.map +1 -1
- package/dist-lib/components/PrinterSetupWizard.js +25 -2
- package/dist-lib/components/PrintplekDetailPage.d.ts.map +1 -1
- package/dist-lib/components/PrintplekDetailPage.js +30 -4
- package/dist-lib/components/PrintplekWizard.d.ts.map +1 -1
- package/dist-lib/components/PrintplekWizard.js +81 -3
- package/dist-lib/components/ProductiebonBuilderPage.d.ts.map +1 -1
- package/dist-lib/components/ProductiebonBuilderPage.js +3 -1
- package/dist-lib/index.d.ts +6 -0
- package/dist-lib/index.d.ts.map +1 -1
- package/dist-lib/index.js +11 -1
- package/dist-lib/integrations/supabase/auth-middleware.d.ts +293 -8
- package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.server.d.ts +293 -8
- package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/types.d.ts +295 -8
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/aiLayout.functions.d.ts +293 -8
- package/dist-lib/lib/aiLayout.functions.d.ts.map +1 -1
- package/dist-lib/lib/htmlPdf.server.d.ts.map +1 -1
- package/dist-lib/lib/htmlPdf.server.js +43 -6
- package/dist-lib/lib/orderData.server.d.ts.map +1 -1
- package/dist-lib/lib/orderData.server.js +117 -10
- package/dist-lib/lib/pdfJobSaver.d.ts +20 -0
- package/dist-lib/lib/pdfJobSaver.d.ts.map +1 -0
- package/dist-lib/lib/pdfJobSaver.js +173 -0
- package/dist-lib/lib/pdfMap.d.ts +48 -0
- package/dist-lib/lib/pdfMap.d.ts.map +1 -0
- package/dist-lib/lib/pdfMap.js +219 -0
- package/dist-lib/lib/pdfPrinter.d.ts +9 -0
- package/dist-lib/lib/pdfPrinter.d.ts.map +1 -0
- package/dist-lib/lib/pdfPrinter.js +34 -0
- package/dist-lib/lib/previewPdf.d.ts +10 -0
- package/dist-lib/lib/previewPdf.d.ts.map +1 -0
- package/dist-lib/lib/previewPdf.js +202 -0
- package/dist-lib/lib/printApi.d.ts.map +1 -1
- package/dist-lib/lib/printApi.js +9 -1
- package/dist-lib/lib/printQueue.server.d.ts +14 -1
- package/dist-lib/lib/printQueue.server.d.ts.map +1 -1
- package/dist-lib/lib/printQueue.server.js +125 -27
- package/dist-lib/lib/printService.functions.d.ts +1172 -32
- package/dist-lib/lib/printService.functions.d.ts.map +1 -1
- package/dist-lib/lib/useDocumentData.d.ts +10 -0
- package/dist-lib/lib/useDocumentData.d.ts.map +1 -1
- package/dist-lib/lib/useDocumentData.js +19 -0
- package/dist-lib/lib/voorbeeldPrint.d.ts +4 -0
- package/dist-lib/lib/voorbeeldPrint.d.ts.map +1 -1
- package/dist-lib/lib/voorbeeldPrint.js +13 -2
- package/package.json +14 -2
|
@@ -0,0 +1,219 @@
|
|
|
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 (per printer); de servers zien alleen de naam.
|
|
5
|
+
// ============================================================================
|
|
6
|
+
const DB_NAAM = "layout-maker-pdfmap";
|
|
7
|
+
const STORE = "handles";
|
|
8
|
+
const BEWAARD_SLEUTEL = "layout-maker-pdf-bewaard";
|
|
9
|
+
const GLOBALE_HANDLE_SLEUTEL = "__gekozen_pdf_map__";
|
|
10
|
+
const PDF_MAP_GEWIJZIGD_EVENT = "layout-maker:pdf-map-gewijzigd";
|
|
11
|
+
export function mapKiezenMogelijk() {
|
|
12
|
+
return typeof window !== "undefined" && "showDirectoryPicker" in window;
|
|
13
|
+
}
|
|
14
|
+
function openDb() {
|
|
15
|
+
return new Promise((resolve, reject) => {
|
|
16
|
+
const req = indexedDB.open(DB_NAAM, 1);
|
|
17
|
+
req.onupgradeneeded = () => {
|
|
18
|
+
if (!req.result.objectStoreNames.contains(STORE))
|
|
19
|
+
req.result.createObjectStore(STORE);
|
|
20
|
+
};
|
|
21
|
+
req.onsuccess = () => resolve(req.result);
|
|
22
|
+
req.onerror = () => reject(req.error);
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
async function bewaarHandle(printerId, handle) {
|
|
26
|
+
const db = await openDb();
|
|
27
|
+
await new Promise((resolve, reject) => {
|
|
28
|
+
const tx = db.transaction(STORE, "readwrite");
|
|
29
|
+
const store = tx.objectStore(STORE);
|
|
30
|
+
// De map hoort bij deze browser/computer, niet bij een database-printer-id.
|
|
31
|
+
// Bewaar daarom ook onder één vaste sleutel. Dit voorkomt dat een nieuwe of
|
|
32
|
+
// dubbele virtuele PDF-printer de reeds goedgekeurde map onzichtbaar maakt.
|
|
33
|
+
store.put(handle, GLOBALE_HANDLE_SLEUTEL);
|
|
34
|
+
store.put(handle, printerId);
|
|
35
|
+
tx.oncomplete = () => resolve();
|
|
36
|
+
tx.onerror = () => reject(tx.error);
|
|
37
|
+
});
|
|
38
|
+
window.dispatchEvent(new CustomEvent(PDF_MAP_GEWIJZIGD_EVENT, { detail: { printerId } }));
|
|
39
|
+
}
|
|
40
|
+
export function luisterNaarPdfMapWijziging(handler) {
|
|
41
|
+
if (typeof window === "undefined")
|
|
42
|
+
return () => undefined;
|
|
43
|
+
window.addEventListener(PDF_MAP_GEWIJZIGD_EVENT, handler);
|
|
44
|
+
return () => window.removeEventListener(PDF_MAP_GEWIJZIGD_EVENT, handler);
|
|
45
|
+
}
|
|
46
|
+
async function leesHandle(printerId) {
|
|
47
|
+
try {
|
|
48
|
+
const db = await openDb();
|
|
49
|
+
const lees = (sleutel) => new Promise((resolve, reject) => {
|
|
50
|
+
const tx = db.transaction(STORE, "readonly");
|
|
51
|
+
const req = tx.objectStore(STORE).get(sleutel);
|
|
52
|
+
req.onsuccess = () => resolve(req.result ?? null);
|
|
53
|
+
req.onerror = () => reject(req.error);
|
|
54
|
+
});
|
|
55
|
+
const globaal = await lees(GLOBALE_HANDLE_SLEUTEL);
|
|
56
|
+
if (globaal)
|
|
57
|
+
return globaal;
|
|
58
|
+
const direct = await lees(printerId);
|
|
59
|
+
if (direct) {
|
|
60
|
+
await bewaarHandle(printerId, direct);
|
|
61
|
+
return direct;
|
|
62
|
+
}
|
|
63
|
+
const gevonden = await new Promise((resolve, reject) => {
|
|
64
|
+
const tx = db.transaction(STORE, "readonly");
|
|
65
|
+
const store = tx.objectStore(STORE);
|
|
66
|
+
const cursor = store.openCursor();
|
|
67
|
+
cursor.onsuccess = () => {
|
|
68
|
+
const rij = cursor.result;
|
|
69
|
+
if (!rij) {
|
|
70
|
+
resolve(null);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const handle = rij.value;
|
|
74
|
+
if (handle?.name && typeof handle.getFileHandle === "function") {
|
|
75
|
+
resolve(handle);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
rij.continue();
|
|
79
|
+
};
|
|
80
|
+
cursor.onerror = () => reject(cursor.error);
|
|
81
|
+
});
|
|
82
|
+
if (gevonden)
|
|
83
|
+
await bewaarHandle(printerId, gevonden);
|
|
84
|
+
return gevonden;
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Browsers blokkeren showDirectoryPicker in een cross-origin iframe (zoals de
|
|
92
|
+
* Lovable-preview). De aanroeper kan dan aanbieden om de app in een eigen
|
|
93
|
+
* tabblad te openen, waar de verkenner wel werkt.
|
|
94
|
+
*/
|
|
95
|
+
export function draaitInIframe() {
|
|
96
|
+
try {
|
|
97
|
+
return typeof window !== "undefined" && window.self !== window.top;
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/** Opent de huidige pagina in een eigen tabblad (buiten het preview-iframe). */
|
|
104
|
+
export function openInEigenTabblad() {
|
|
105
|
+
window.open(window.location.href, "_blank", "noopener");
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Opent de mappenverkenner van het besturingssysteem zodat de gebruiker een
|
|
109
|
+
* map kan selecteren. Start in Downloads zodat het pad snel te vinden is.
|
|
110
|
+
* Geeft terug wat er is gebeurd zodat de aanroeper gericht kan reageren.
|
|
111
|
+
*/
|
|
112
|
+
export async function kiesPdfMap(printerId) {
|
|
113
|
+
if (!mapKiezenMogelijk())
|
|
114
|
+
return { status: "niet-ondersteund" };
|
|
115
|
+
try {
|
|
116
|
+
const handle = (await window.showDirectoryPicker({
|
|
117
|
+
mode: "readwrite",
|
|
118
|
+
startIn: "downloads",
|
|
119
|
+
}));
|
|
120
|
+
await bewaarHandle(printerId, handle);
|
|
121
|
+
// Een nieuwe mapkeuze is ook een expliciete opdracht om reeds voltooide
|
|
122
|
+
// PDF-jobs opnieuw naar deze map te schrijven.
|
|
123
|
+
try {
|
|
124
|
+
localStorage.removeItem(BEWAARD_SLEUTEL);
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
// Lokale opslag kan door browserbeleid uitgeschakeld zijn.
|
|
128
|
+
}
|
|
129
|
+
return { status: "gekozen", naam: handle.name };
|
|
130
|
+
}
|
|
131
|
+
catch (fout) {
|
|
132
|
+
// De gebruiker drukt op Annuleren in de verkenner → AbortError, geen fout.
|
|
133
|
+
if (fout instanceof DOMException && fout.name === "AbortError") {
|
|
134
|
+
return { status: "geannuleerd" };
|
|
135
|
+
}
|
|
136
|
+
// Cross-origin iframe → SecurityError ("Cross origin sub frames aren't
|
|
137
|
+
// allowed to show a file picker"). Aparte status zodat de UI een
|
|
138
|
+
// "open in eigen tabblad"-knop kan tonen.
|
|
139
|
+
if (fout instanceof DOMException &&
|
|
140
|
+
(fout.name === "SecurityError" || /cross.?origin/i.test(fout.message))) {
|
|
141
|
+
return { status: "iframe-geblokkeerd" };
|
|
142
|
+
}
|
|
143
|
+
return {
|
|
144
|
+
status: "fout",
|
|
145
|
+
melding: fout instanceof Error ? fout.message : "Onbekende fout",
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/** Is er voor deze printer een map gekozen op deze computer? */
|
|
150
|
+
export async function heeftPdfMap(printerId) {
|
|
151
|
+
return (await leesHandle(printerId)) !== null;
|
|
152
|
+
}
|
|
153
|
+
/** Naam van de gekozen map (voor meldingen), of null. */
|
|
154
|
+
export async function pdfMapNaam(printerId) {
|
|
155
|
+
const h = await leesHandle(printerId);
|
|
156
|
+
return h?.name ?? null;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Probeert het bestand rechtstreeks in de gekozen map te zetten. Lukt dat niet
|
|
160
|
+
* (andere computer, geen toestemming, browser zonder ondersteuning), dan geeft
|
|
161
|
+
* de functie false terug en kan de aanroeper gewoon downloaden.
|
|
162
|
+
*/
|
|
163
|
+
export async function bewaarInPdfMap(printerId, bestandsnaam, blob) {
|
|
164
|
+
const handle = await leesHandle(printerId);
|
|
165
|
+
if (!handle)
|
|
166
|
+
return false;
|
|
167
|
+
try {
|
|
168
|
+
const toestemming = (await handle.queryPermission?.({ mode: "readwrite" })) ?? "granted";
|
|
169
|
+
if (toestemming !== "granted") {
|
|
170
|
+
const nieuw = await handle.requestPermission?.({ mode: "readwrite" });
|
|
171
|
+
if (nieuw !== "granted")
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
const bestand = await handle.getFileHandle(bestandsnaam, { create: true });
|
|
175
|
+
const writable = await bestand.createWritable();
|
|
176
|
+
await writable.write(blob);
|
|
177
|
+
await writable.close();
|
|
178
|
+
return true;
|
|
179
|
+
}
|
|
180
|
+
catch (fout) {
|
|
181
|
+
console.error("[layout-maker] PDF kon niet lokaal worden opgeslagen", fout);
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
/** Controleert toestemming zonder een bestandsactie te starten. */
|
|
186
|
+
export async function pdfMapToestemming(printerId) {
|
|
187
|
+
const handle = await leesHandle(printerId);
|
|
188
|
+
if (!handle)
|
|
189
|
+
return "ontbreekt";
|
|
190
|
+
try {
|
|
191
|
+
return ((await handle.queryPermission?.({ mode: "readwrite" })) ?? "granted");
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
return "denied";
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Vraagt vanuit een expliciete gebruikersklik opnieuw schrijftoestemming voor
|
|
199
|
+
* een eerder gekozen map. Achtergrondtaken mogen deze browserprompt niet zelf
|
|
200
|
+
* openen, omdat browsers daarvoor een actieve gebruikershandeling vereisen.
|
|
201
|
+
*/
|
|
202
|
+
export async function herstelPdfMapToestemming(printerId) {
|
|
203
|
+
const handle = await leesHandle(printerId);
|
|
204
|
+
if (!handle)
|
|
205
|
+
return "ontbreekt";
|
|
206
|
+
try {
|
|
207
|
+
// requestPermission moet rechtstreeks in deze klik-callstack plaatsvinden;
|
|
208
|
+
// een voorafgaande await kan de tijdelijke gebruikersactivatie laten verlopen.
|
|
209
|
+
if (handle.requestPermission) {
|
|
210
|
+
const nieuw = await handle.requestPermission({ mode: "readwrite" });
|
|
211
|
+
return nieuw === "granted" ? "granted" : "denied";
|
|
212
|
+
}
|
|
213
|
+
const huidig = (await handle.queryPermission?.({ mode: "readwrite" })) ?? "granted";
|
|
214
|
+
return huidig === "granted" ? "granted" : "denied";
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
return "denied";
|
|
218
|
+
}
|
|
219
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { SupabaseClient } from "@supabase/supabase-js";
|
|
2
|
+
type Db = SupabaseClient<any, any, any>;
|
|
3
|
+
/**
|
|
4
|
+
* POST { station_slug, queue_item_id } → PDF-bytes.
|
|
5
|
+
* Fouten komen terug als JSON met een code, en worden vastgelegd in
|
|
6
|
+
* `print_preview_events`.
|
|
7
|
+
*/
|
|
8
|
+
export declare function behandelPreviewPdf(request: Request, supabase: Db): Promise<Response>;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=previewPdf.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"previewPdf.d.ts","sourceRoot":"","sources":["../../src/lib/previewPdf.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,KAAK,EAAE,GAAG,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAqFxC;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAoM1F"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// src/lib/previewPdf.ts — afhandeling van /api/public/print/preview-pdf.
|
|
3
|
+
// Toont hoe een pickregel eruit komt als PDF, zonder printopdracht en zonder
|
|
4
|
+
// iets in de database te wijzigen. De shell levert de databaseverbinding.
|
|
5
|
+
//
|
|
6
|
+
// Eén bron van waarheid: de gegevens komen uit de read-only databasefunctie
|
|
7
|
+
// `pick_preview_job` van de Logistiek Engine — dezelfde opbouw als
|
|
8
|
+
// `pick_enqueue_print_job`. Deze module spiegelt die mapping bewust niet.
|
|
9
|
+
// ============================================================================
|
|
10
|
+
/** Maximaal aantal voorbeelden per station binnen het venster. */
|
|
11
|
+
const MAX_PER_VENSTER = 6;
|
|
12
|
+
const VENSTER_SEC = 60;
|
|
13
|
+
function gelijk(a, b) {
|
|
14
|
+
if (a.length !== b.length)
|
|
15
|
+
return false;
|
|
16
|
+
let verschil = 0;
|
|
17
|
+
for (let i = 0; i < a.length; i++)
|
|
18
|
+
verschil |= a.charCodeAt(i) ^ b.charCodeAt(i);
|
|
19
|
+
return verschil === 0;
|
|
20
|
+
}
|
|
21
|
+
function leesSleutel(request) {
|
|
22
|
+
return (request.headers.get("apikey") ??
|
|
23
|
+
(request.headers.get("authorization") ?? "").replace(/^Bearer\s+/i, "")).trim();
|
|
24
|
+
}
|
|
25
|
+
/** Mag deze aanroeper voorbeelden opvragen? Zelfde regels als de queue-tick. */
|
|
26
|
+
async function magAanroepen(request, db) {
|
|
27
|
+
const geprobeerd = [];
|
|
28
|
+
const ontbrekend = [];
|
|
29
|
+
const meegegeven = leesSleutel(request);
|
|
30
|
+
if (!meegegeven) {
|
|
31
|
+
ontbrekend.push("toegangsbewijs in de apikey- of authorization-header");
|
|
32
|
+
return { ok: false, geprobeerd, ontbrekend };
|
|
33
|
+
}
|
|
34
|
+
geprobeerd.push("runner-sleutel");
|
|
35
|
+
const { isRunnerSleutel } = await import("./runnerRegistry.server.js");
|
|
36
|
+
if (await isRunnerSleutel(db, meegegeven))
|
|
37
|
+
return { ok: true, geprobeerd, ontbrekend };
|
|
38
|
+
geprobeerd.push("publishable-key");
|
|
39
|
+
const projectSleutel = process.env["SUPABASE_PUBLISHABLE_KEY"] ??
|
|
40
|
+
process.env["VITE_SUPABASE_PUBLISHABLE_KEY"] ??
|
|
41
|
+
"";
|
|
42
|
+
if (!projectSleutel)
|
|
43
|
+
ontbrekend.push("SUPABASE_PUBLISHABLE_KEY");
|
|
44
|
+
else if (gelijk(projectSleutel, meegegeven))
|
|
45
|
+
return { ok: true, geprobeerd, ontbrekend };
|
|
46
|
+
geprobeerd.push("gebruikerstoken");
|
|
47
|
+
try {
|
|
48
|
+
const { data } = await db.auth.getUser(meegegeven);
|
|
49
|
+
if (data?.user?.id)
|
|
50
|
+
return { ok: true, geprobeerd, ontbrekend };
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
/* val door naar weigering */
|
|
54
|
+
}
|
|
55
|
+
return { ok: false, geprobeerd, ontbrekend };
|
|
56
|
+
}
|
|
57
|
+
/** Herkent een databaseweigering (de server mag niet) los van "jij mag niet". */
|
|
58
|
+
function isRechtenFout(melding, code) {
|
|
59
|
+
return code === "42501" || /permission denied|must be owner|not allowed/i.test(melding);
|
|
60
|
+
}
|
|
61
|
+
const UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
62
|
+
/** Legt een weigering vindbaar vast; faalt nooit hard. */
|
|
63
|
+
async function weiger(db, station, queueItem, code, reden, status) {
|
|
64
|
+
try {
|
|
65
|
+
await db.rpc("print_preview_weiger", {
|
|
66
|
+
_station_slug: station,
|
|
67
|
+
_queue_item_id: queueItem && UUID.test(queueItem) ? queueItem : null,
|
|
68
|
+
_code: code,
|
|
69
|
+
_reden: reden,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
/* logboek mag een voorbeeld nooit blokkeren */
|
|
74
|
+
}
|
|
75
|
+
return Response.json({ ok: false, code, fout: reden }, { status });
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* POST { station_slug, queue_item_id } → PDF-bytes.
|
|
79
|
+
* Fouten komen terug als JSON met een code, en worden vastgelegd in
|
|
80
|
+
* `print_preview_events`.
|
|
81
|
+
*/
|
|
82
|
+
export async function behandelPreviewPdf(request, supabase) {
|
|
83
|
+
if (!supabase) {
|
|
84
|
+
return Response.json({ ok: false, code: "geen_database", fout: "De server kreeg geen databaseverbinding." }, { status: 500 });
|
|
85
|
+
}
|
|
86
|
+
const toegang = await magAanroepen(request, supabase);
|
|
87
|
+
if (!toegang.ok) {
|
|
88
|
+
return Response.json({
|
|
89
|
+
ok: false,
|
|
90
|
+
code: "geen_toegang",
|
|
91
|
+
fout: "Het voorbeeld weigerde het verzoek: geen geldig toegangsbewijs meegestuurd (dit is een aanroeper-probleem, geen databaserechten-probleem).",
|
|
92
|
+
geprobeerd: toegang.geprobeerd,
|
|
93
|
+
ontbrekend: toegang.ontbrekend,
|
|
94
|
+
}, { status: 401 });
|
|
95
|
+
}
|
|
96
|
+
let body = {};
|
|
97
|
+
try {
|
|
98
|
+
body = (await request.json());
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
body = {};
|
|
102
|
+
}
|
|
103
|
+
const station = typeof body["station_slug"] === "string" ? body["station_slug"].trim() : "";
|
|
104
|
+
const queueItem = typeof body["queue_item_id"] === "string" ? body["queue_item_id"].trim() : "";
|
|
105
|
+
if (!station || !queueItem || !UUID.test(queueItem)) {
|
|
106
|
+
return weiger(supabase, station || null, null, "ongeldig_verzoek", "Geef een station_slug en een geldig queue_item_id mee.", 400);
|
|
107
|
+
}
|
|
108
|
+
// 1) Snelheidsbegrenzing (telt en logt in één databasestap).
|
|
109
|
+
const { data: tempo, error: tempoFout } = await supabase.rpc("print_preview_toestaan", {
|
|
110
|
+
_station_slug: station,
|
|
111
|
+
_queue_item_id: queueItem,
|
|
112
|
+
_max: MAX_PER_VENSTER,
|
|
113
|
+
_venster_sec: VENSTER_SEC,
|
|
114
|
+
});
|
|
115
|
+
if (tempoFout) {
|
|
116
|
+
if (isRechtenFout(String(tempoFout.message ?? ""), tempoFout.code)) {
|
|
117
|
+
return Response.json({
|
|
118
|
+
ok: false,
|
|
119
|
+
code: "server_geen_rechten",
|
|
120
|
+
fout: "De server mag print_preview_toestaan niet uitvoeren. De route draait niet met de service-role sleutel of het EXECUTE-recht ontbreekt.",
|
|
121
|
+
}, { status: 503 });
|
|
122
|
+
}
|
|
123
|
+
return weiger(supabase, station, queueItem, "render_mislukt", `Voorbeeld niet mogelijk: ${tempoFout.message}`, 500);
|
|
124
|
+
}
|
|
125
|
+
const toestemming = (tempo ?? {});
|
|
126
|
+
if (toestemming["toegestaan"] === false) {
|
|
127
|
+
const wacht = Number(toestemming["wacht_sec"] ?? VENSTER_SEC);
|
|
128
|
+
return Response.json({
|
|
129
|
+
ok: false,
|
|
130
|
+
code: "te_snel",
|
|
131
|
+
fout: `Te veel voorbeelden achter elkaar. Probeer het over ${wacht} seconden opnieuw.`,
|
|
132
|
+
wacht_sec: wacht,
|
|
133
|
+
}, { status: 429, headers: { "Retry-After": String(wacht) } });
|
|
134
|
+
}
|
|
135
|
+
// 2) Gegevens ophalen: read-only, met stationvalidatie in de database zelf.
|
|
136
|
+
const { data: rij, error: rpcFout } = await supabase.rpc("pick_preview_job", {
|
|
137
|
+
_station_slug: station,
|
|
138
|
+
_queue_item_id: queueItem,
|
|
139
|
+
});
|
|
140
|
+
if (rpcFout) {
|
|
141
|
+
const melding = String(rpcFout.message ?? "");
|
|
142
|
+
if (isRechtenFout(melding, rpcFout.code)) {
|
|
143
|
+
return weiger(supabase, station, queueItem, "server_geen_rechten", "De server mag pick_preview_job niet uitvoeren. De route draait niet met de service-role sleutel of het EXECUTE-recht ontbreekt.", 503);
|
|
144
|
+
}
|
|
145
|
+
// Ontbreekt de functie zelf (Engine nog niet bijgewerkt)? Dat is geen
|
|
146
|
+
// stationprobleem maar een installatieprobleem.
|
|
147
|
+
if (/could not find the function|does not exist/i.test(melding)) {
|
|
148
|
+
return weiger(supabase, station, queueItem, "rpc_ontbreekt", "De databasefunctie pick_preview_job ontbreekt. Werk de Logistiek Engine bij.", 503);
|
|
149
|
+
}
|
|
150
|
+
if (/is not unique/i.test(melding)) {
|
|
151
|
+
return weiger(supabase, station, queueItem, "rpc_dubbel", "Er bestaan meerdere varianten van pick_preview_job in de database. Verwijder de oude variant.", 503);
|
|
152
|
+
}
|
|
153
|
+
const code = /station/i.test(melding)
|
|
154
|
+
? "station_mismatch"
|
|
155
|
+
: /bestaat niet|niet gevonden|not found|onbekend/i.test(melding)
|
|
156
|
+
? "regel_onbekend"
|
|
157
|
+
: "render_mislukt";
|
|
158
|
+
return weiger(supabase, station, queueItem, code, melding || "Voorbeeld niet mogelijk.", code === "render_mislukt" ? 500 : 404);
|
|
159
|
+
}
|
|
160
|
+
const job = (Array.isArray(rij) ? rij[0] : rij);
|
|
161
|
+
if (!job) {
|
|
162
|
+
return weiger(supabase, station, queueItem, "regel_onbekend", "Deze pickregel bestaat niet of hoort niet bij dit station.", 404);
|
|
163
|
+
}
|
|
164
|
+
// 3) Exact dezelfde documentkeuze en opmaak als de printwachtrij.
|
|
165
|
+
const { bepaalDocumentKeuze, bouwHtml, heeftZichtbareInhoud, GeenDocumentFout } = await import("./printQueue.server.js");
|
|
166
|
+
const { htmlNaarPdfServer } = await import("./htmlNaarPdf.server.js");
|
|
167
|
+
try {
|
|
168
|
+
const { keuze, klaarPdf } = await bepaalDocumentKeuze(supabase, job);
|
|
169
|
+
const layout = keuze.layout;
|
|
170
|
+
const uitkomst = { bron: "extern_pdf" };
|
|
171
|
+
let pdfBase64 = klaarPdf;
|
|
172
|
+
if (!pdfBase64) {
|
|
173
|
+
const html = await bouwHtml(supabase, job, keuze, uitkomst);
|
|
174
|
+
if (!heeftZichtbareInhoud(html)) {
|
|
175
|
+
return weiger(supabase, station, queueItem, "layout_leeg", "Het document blijft leeg: de layout heeft geen blokken of de order heeft geen gegevens.", 422);
|
|
176
|
+
}
|
|
177
|
+
pdfBase64 = await htmlNaarPdfServer({
|
|
178
|
+
html,
|
|
179
|
+
breedteMm: Number(layout?.breedte_mm ?? 210),
|
|
180
|
+
hoogteMm: Number(layout?.hoogte_mm ?? 297),
|
|
181
|
+
margeMm: Number(layout?.marge_boven ?? 10),
|
|
182
|
+
landschap: String(layout?.orientatie ?? "portrait") === "landscape",
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
const bytes = Uint8Array.from(atob(pdfBase64), (c) => c.charCodeAt(0));
|
|
186
|
+
return new Response(bytes, {
|
|
187
|
+
status: 200,
|
|
188
|
+
headers: {
|
|
189
|
+
"Content-Type": "application/pdf",
|
|
190
|
+
"Content-Disposition": 'inline; filename="voorbeeld.pdf"',
|
|
191
|
+
"Cache-Control": "no-store",
|
|
192
|
+
"X-Preview-Bron": String(uitkomst.bron),
|
|
193
|
+
"X-Preview-Layout-Id": String(layout?.id ?? ""),
|
|
194
|
+
},
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
catch (e) {
|
|
198
|
+
const melding = e instanceof Error ? e.message : "Voorbeeld maken mislukte.";
|
|
199
|
+
const blijvend = e?.name === "GeenDocumentFout" || e instanceof GeenDocumentFout;
|
|
200
|
+
return weiger(supabase, station, queueItem, blijvend ? "layout_ontbreekt" : "render_mislukt", melding, blijvend ? 422 : 500);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"printApi.d.ts","sourceRoot":"","sources":["../../src/lib/printApi.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"printApi.d.ts","sourceRoot":"","sources":["../../src/lib/printApi.ts"],"names":[],"mappings":"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"}
|
package/dist-lib/lib/printApi.js
CHANGED
|
@@ -7,6 +7,7 @@ import { supabase } from "./supabaseClient.js";
|
|
|
7
7
|
import { printerVoorWerkplekDocument } from "./documentRoutering.js";
|
|
8
8
|
import { printerVoorPrintplek, printplekNaam, printplekVoorComputer } from "./printplekken.js";
|
|
9
9
|
import { bronVoorDocument } from "./documentBron.js";
|
|
10
|
+
import { bewaarPdfJobZodraKlaar } from "./pdfJobSaver.js";
|
|
10
11
|
const arr = (v) => (Array.isArray(v) ? v : []);
|
|
11
12
|
/** Zoekt de te gebruiken layout: expliciet, anders standaard, anders de nieuwste. */
|
|
12
13
|
async function bepaalLayout(documenttype, layoutId) {
|
|
@@ -104,8 +105,15 @@ async function zetInWachtrij(rij) {
|
|
|
104
105
|
const id = data?.id ?? null;
|
|
105
106
|
// Direct laten verwerken; wacht niet op de cron-ronde. Mislukt dit, dan
|
|
106
107
|
// blijft de opdracht gewoon wachtend staan voor een volgende poging.
|
|
107
|
-
if (id)
|
|
108
|
+
if (id) {
|
|
108
109
|
void startWachtrijVerwerking();
|
|
110
|
+
const printerId = typeof rij.printer_id === "string" ? rij.printer_id : null;
|
|
111
|
+
// Bij de virtuele PDF-printer blijft deze browser wachten op de gemaakte
|
|
112
|
+
// PDF en schrijft hem meteen naar de lokaal gekozen map. Voor gewone
|
|
113
|
+
// printers stopt de helper direct omdat daar geen maphandle voor bestaat.
|
|
114
|
+
if (printerId)
|
|
115
|
+
void bewaarPdfJobZodraKlaar(id, printerId);
|
|
116
|
+
}
|
|
109
117
|
return id;
|
|
110
118
|
}
|
|
111
119
|
/** Fout wanneer een identieke aanvraag kort geleden al is aangemaakt. */
|
|
@@ -8,13 +8,17 @@ export type PrintDb = SupabaseClient<any, any, any>;
|
|
|
8
8
|
* meer nu de shell de client levert.
|
|
9
9
|
*/
|
|
10
10
|
export declare function controleerClient(db: PrintDb): Promise<string | null>;
|
|
11
|
+
/** Fout waarbij opnieuw proberen zinloos is (er valt niets te printen). */
|
|
12
|
+
export declare class GeenDocumentFout extends Error {
|
|
13
|
+
name: string;
|
|
14
|
+
}
|
|
11
15
|
/**
|
|
12
16
|
* `ontwerpWint` = deze layout is een echt ontwerp van deze module (actief, geen
|
|
13
17
|
* Floriday-systeemlayout) en gaat daarom vóór meegestuurde HTML. Er is bewust
|
|
14
18
|
* maar één schakelaar voor dit besluit: bron/systeem. Een tweede schakelaar
|
|
15
19
|
* ("stond er een layout_id op de opdracht?") is verwijderd.
|
|
16
20
|
*/
|
|
17
|
-
type LayoutKeuze = {
|
|
21
|
+
export type LayoutKeuze = {
|
|
18
22
|
layout: Job | null;
|
|
19
23
|
ontwerpWint: boolean;
|
|
20
24
|
};
|
|
@@ -50,5 +54,14 @@ export interface WachtrijResultaat {
|
|
|
50
54
|
}
|
|
51
55
|
/** Eén ronde: vastgelopen opdrachten opruimen, afdrukken en statussen bijwerken. */
|
|
52
56
|
export declare function verwerkWachtrij(db: PrintDb, max?: number): Promise<WachtrijResultaat>;
|
|
57
|
+
/**
|
|
58
|
+
* Dezelfde documentkeuze als de printwachtrij maakt, maar zonder printer en
|
|
59
|
+
* zonder statuswijziging. Gebruikt door het voorbeeld (`preview-pdf`) zodat
|
|
60
|
+
* het voorbeeld exact toont wat er straks uit de printer komt.
|
|
61
|
+
*/
|
|
62
|
+
export declare function bepaalDocumentKeuze(db: PrintDb, job: Job): Promise<{
|
|
63
|
+
keuze: LayoutKeuze;
|
|
64
|
+
klaarPdf: string | null;
|
|
65
|
+
}>;
|
|
53
66
|
export {};
|
|
54
67
|
//# sourceMappingURL=printQueue.server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"printQueue.server.d.ts","sourceRoot":"","sources":["../../src/lib/printQueue.server.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAsB5D,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAE/B,mFAAmF;AACnF,MAAM,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAEpD;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAW1E;
|
|
1
|
+
{"version":3,"file":"printQueue.server.d.ts","sourceRoot":"","sources":["../../src/lib/printQueue.server.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAsB5D,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAE/B,mFAAmF;AACnF,MAAM,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAEpD;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAW1E;AAUD,2EAA2E;AAC3E,qBAAa,gBAAiB,SAAQ,KAAK;IAChC,IAAI,SAAsB;CACpC;AAED;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG;IAAE,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,CAAC;AAEvE,yEAAyE;AACzE,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,cAAc,GAAG,aAAa,GAAG,aAAa,CAAC;AAE1F,6EAA6E;AAC7E,MAAM,MAAM,YAAY,GAAG;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,CAAC;AAcnD,4EAA4E;AAC5E,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAI7D;AAkHD;;;GAGG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA+BnF;AAwQD;;;;GAIG;AACH,wBAAsB,QAAQ,CAC5B,EAAE,EAAE,OAAO,EACX,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,WAAW,EAClB,QAAQ,CAAC,EAAE,YAAY,GACtB,OAAO,CAAC,MAAM,CAAC,CA8IjB;AAGD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAY1D;AAmVD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,oFAAoF;AACpF,wBAAsB,eAAe,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,SAAI,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAwCtF;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,OAAO,EACX,GAAG,EAAE,GAAG,GACP,OAAO,CAAC;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CA0B1D"}
|