@flowselections/layout-maker 1.45.9 → 1.45.19
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/README.md +139 -139
- package/dist-lib/components/AfdrukKnop.d.ts +19 -19
- package/dist-lib/components/AfdrukKnop.js +64 -64
- package/dist-lib/components/NetwerkPrintersDialog.d.ts +7 -7
- package/dist-lib/components/NetwerkPrintersDialog.js +79 -79
- package/dist-lib/components/PakbonPreview.d.ts.map +1 -1
- package/dist-lib/components/PakbonPreview.js +2 -2
- package/dist-lib/components/PrintQueuePage.d.ts.map +1 -1
- package/dist-lib/components/PrintQueuePage.js +42 -5
- package/dist-lib/components/PrinterSetupWizard.js +3 -3
- package/dist-lib/components/PrintersRedirectPage.d.ts +1 -1
- package/dist-lib/components/PrintersRedirectPage.js +14 -14
- package/dist-lib/index.d.ts +1 -0
- package/dist-lib/index.d.ts.map +1 -1
- package/dist-lib/index.js +1 -0
- package/dist-lib/integrations/supabase/auth-middleware.d.ts +4489 -277
- package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.server.d.ts +4489 -277
- package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.server.js +1 -1
- package/dist-lib/integrations/supabase/moduleClient.d.ts +4489 -277
- package/dist-lib/integrations/supabase/moduleClient.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/types.d.ts +4506 -253
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/aiLayout.functions.d.ts +4489 -277
- package/dist-lib/lib/aiLayout.functions.d.ts.map +1 -1
- package/dist-lib/lib/aiLayout.server.js +9 -9
- package/dist-lib/lib/browserPrint.js +1 -1
- package/dist-lib/lib/fieldRegistry.js +1 -0
- package/dist-lib/lib/layoutPreview.js +7 -7
- package/dist-lib/lib/logoLibrary.d.ts +2 -1
- package/dist-lib/lib/logoLibrary.d.ts.map +1 -1
- package/dist-lib/lib/logoLibrary.js +42 -2
- package/dist-lib/lib/orderData.server.d.ts.map +1 -1
- package/dist-lib/lib/orderData.server.js +13 -0
- package/dist-lib/lib/pakbonBuilder.d.ts +26 -0
- package/dist-lib/lib/pakbonBuilder.d.ts.map +1 -1
- package/dist-lib/lib/pakbonBuilder.js +37 -0
- package/dist-lib/lib/pakbonContent.d.ts.map +1 -1
- package/dist-lib/lib/pakbonContent.js +2 -2
- package/dist-lib/lib/pakbonHtml.d.ts.map +1 -1
- package/dist-lib/lib/pakbonHtml.js +60 -60
- package/dist-lib/lib/pakbonPresentation.d.ts.map +1 -1
- package/dist-lib/lib/pakbonPresentation.js +2 -4
- package/dist-lib/lib/pdfJobSaver.d.ts.map +1 -1
- package/dist-lib/lib/pdfJobSaver.js +31 -2
- package/dist-lib/lib/pdfMap.d.ts +7 -0
- package/dist-lib/lib/pdfMap.d.ts.map +1 -1
- package/dist-lib/lib/pdfMap.js +17 -0
- package/dist-lib/lib/printQueue.server.d.ts.map +1 -1
- package/dist-lib/lib/printQueue.server.js +142 -15
- package/dist-lib/lib/printService.functions.d.ts +47214 -52
- package/dist-lib/lib/printService.functions.d.ts.map +1 -1
- package/dist-lib/lib/printService.functions.js +69 -0
- package/dist-lib/lib/printService.server.d.ts +2 -0
- package/dist-lib/lib/printService.server.d.ts.map +1 -1
- package/dist-lib/lib/printService.server.js +10 -0
- package/dist-lib/lib/productiebonHtml.js +15 -15
- package/dist-lib/lib/profielHtml.d.ts.map +1 -1
- package/dist-lib/lib/profielHtml.js +22 -19
- package/dist-lib/lib/supabaseAdmin.server.d.ts +5 -5
- package/dist-lib/lib/supabaseAdmin.server.js +43 -43
- package/dist-lib/lib/testpagina.js +3 -3
- package/dist-lib/lib/testprint.js +4 -4
- package/package.json +3 -3
|
@@ -52,6 +52,75 @@ export const printStatus = createServerFn({ method: "POST" })
|
|
|
52
52
|
return { ok: false, fout: e instanceof Error ? e.message : "Status ophalen mislukt" };
|
|
53
53
|
}
|
|
54
54
|
});
|
|
55
|
+
export const annuleerPrintOpdrachten = createServerFn({ method: "POST" })
|
|
56
|
+
.middleware([requireSupabaseAuth])
|
|
57
|
+
.inputValidator((input) => ({
|
|
58
|
+
jobIds: Array.isArray(input?.jobIds)
|
|
59
|
+
? input.jobIds.filter((id) => typeof id === "string" && id.length > 0).slice(0, 200)
|
|
60
|
+
: [],
|
|
61
|
+
}))
|
|
62
|
+
.handler(async ({ data, context }) => {
|
|
63
|
+
// De server bepaalt de grens. Zo vallen ook opdrachten mee die al geclaimd
|
|
64
|
+
// zijn maar nog niet in de browserlijst stonden, terwijl later aangemaakte
|
|
65
|
+
// opdrachten direct normaal kunnen worden verwerkt.
|
|
66
|
+
const cutoff = new Date().toISOString();
|
|
67
|
+
let openJobs = [];
|
|
68
|
+
if (data.jobIds.length === 0) {
|
|
69
|
+
const { data: openData, error: annuleerFout } = await context.supabase.rpc("cancel_open_print_jobs", { _cutoff: cutoff });
|
|
70
|
+
if (annuleerFout)
|
|
71
|
+
throw new Error(`Annuleren mislukt: ${annuleerFout.message}`);
|
|
72
|
+
openJobs = Array.isArray(openData) ? openData : [];
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
const { data: geselecteerd, error: leesFout } = await context.supabase
|
|
76
|
+
.from("print_jobs")
|
|
77
|
+
.select("id, extern_job_id")
|
|
78
|
+
.in("id", data.jobIds)
|
|
79
|
+
.in("status", ["wachtend", "bezig"]);
|
|
80
|
+
if (leesFout)
|
|
81
|
+
throw new Error(`Printopdracht ophalen mislukt: ${leesFout.message}`);
|
|
82
|
+
openJobs = Array.isArray(geselecteerd) ? geselecteerd : [];
|
|
83
|
+
const ids = openJobs.map((job) => job.id);
|
|
84
|
+
if (ids.length > 0) {
|
|
85
|
+
const { error: wijzigFout } = await context.supabase
|
|
86
|
+
.from("print_jobs")
|
|
87
|
+
.update({
|
|
88
|
+
status: "geannuleerd",
|
|
89
|
+
verwerkingsfase: "geannuleerd",
|
|
90
|
+
fase_voltooid_op: cutoff,
|
|
91
|
+
lokale_pdf_status: "geannuleerd",
|
|
92
|
+
lokale_pdf_fout: null,
|
|
93
|
+
lokale_pdf_claim_id: null,
|
|
94
|
+
lokale_pdf_claim_tot: null,
|
|
95
|
+
volgende_poging: null,
|
|
96
|
+
voltooid_op: cutoff,
|
|
97
|
+
updated_at: cutoff,
|
|
98
|
+
})
|
|
99
|
+
.in("id", ids)
|
|
100
|
+
.in("status", ["wachtend", "bezig"]);
|
|
101
|
+
if (wijzigFout)
|
|
102
|
+
throw new Error(`Annuleren mislukt: ${wijzigFout.message}`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if (openJobs.length === 0)
|
|
106
|
+
return { geannuleerd: 0, externMislukt: 0 };
|
|
107
|
+
const ids = openJobs.map((job) => String(job.id));
|
|
108
|
+
await context.supabase.from("print_job_logs").insert(ids.map((jobId) => ({
|
|
109
|
+
job_id: jobId,
|
|
110
|
+
gebeurtenis: "geannuleerd",
|
|
111
|
+
detail: "Handmatig geannuleerd vanuit de printwachtrij.",
|
|
112
|
+
})));
|
|
113
|
+
const externeIds = openJobs
|
|
114
|
+
.map((job) => String(job.extern_job_id ?? "").trim())
|
|
115
|
+
.filter(Boolean);
|
|
116
|
+
let externMislukt = 0;
|
|
117
|
+
if (externeIds.length > 0) {
|
|
118
|
+
const { annuleerExternePrintOpdracht } = await import("./printService.server.js");
|
|
119
|
+
const resultaten = await Promise.allSettled(externeIds.map(annuleerExternePrintOpdracht));
|
|
120
|
+
externMislukt = resultaten.filter((resultaat) => resultaat.status === "rejected").length;
|
|
121
|
+
}
|
|
122
|
+
return { geannuleerd: ids.length, externMislukt, cutoff };
|
|
123
|
+
});
|
|
55
124
|
export const netwerkComputers = createServerFn({ method: "POST" })
|
|
56
125
|
.middleware([requireSupabaseAuth])
|
|
57
126
|
.handler(async () => {
|
|
@@ -35,6 +35,8 @@ export declare function haalPrinterFormaten(externPrinterId: string): Promise<{
|
|
|
35
35
|
}>;
|
|
36
36
|
/** Stuurt een PDF rechtstreeks naar de printer. Geeft het externe opdrachtnummer terug. */
|
|
37
37
|
export declare function stuurPdfNaarPrinter(input: PrintOpdrachtInput): Promise<string>;
|
|
38
|
+
/** Verwijdert een nog niet afgedrukte opdracht bij de externe printdienst. */
|
|
39
|
+
export declare function annuleerExternePrintOpdracht(externJobId: string): Promise<void>;
|
|
38
40
|
export type OpdrachtStatus = "wachtend" | "bezig" | "voltooid" | "mislukt";
|
|
39
41
|
/** Vraagt de status van een verstuurde opdracht op. */
|
|
40
42
|
export declare function opdrachtStatus(externJobId: string): Promise<OpdrachtStatus>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"printService.server.d.ts","sourceRoot":"","sources":["../../src/lib/printService.server.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,oFAAoF;IACpF,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;IAC1C,oDAAoD;IACpD,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,mEAAmE;IACnE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,8BAA8B;IAC9B,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,+EAA+E;IAC/E,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;
|
|
1
|
+
{"version":3,"file":"printService.server.d.ts","sourceRoot":"","sources":["../../src/lib/printService.server.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,oFAAoF;IACpF,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;IAC1C,oDAAoD;IACpD,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,mEAAmE;IACnE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,8BAA8B;IAC9B,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,+EAA+E;IAC/E,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAoDD,6EAA6E;AAC7E,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAmBrE;AAED,gFAAgF;AAChF,wBAAsB,mBAAmB,CACvC,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CASzE;AAED,2FAA2F;AAC3F,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAyBpF;AAED,8EAA8E;AAC9E,wBAAsB,4BAA4B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKrF;AAGD,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;AAE3E,uDAAuD;AACvD,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAejF;AAED,yCAAyC;AACzC,wBAAsB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAGpD;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,qDAAqD;AACrD,wBAAsB,aAAa,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAchE"}
|
|
@@ -49,6 +49,8 @@ async function vraag(pad, init) {
|
|
|
49
49
|
if (!res.ok) {
|
|
50
50
|
throw new PrintToegangFout("niet_bereikbaar", "De printdienst is tijdelijk niet bereikbaar. Probeer het zo opnieuw.");
|
|
51
51
|
}
|
|
52
|
+
if (res.status === 204)
|
|
53
|
+
return undefined;
|
|
52
54
|
return (await res.json());
|
|
53
55
|
}
|
|
54
56
|
/** Alle printers die via de printclients in het netwerk beschikbaar zijn. */
|
|
@@ -102,6 +104,14 @@ export async function stuurPdfNaarPrinter(input) {
|
|
|
102
104
|
});
|
|
103
105
|
return String(data);
|
|
104
106
|
}
|
|
107
|
+
/** Verwijdert een nog niet afgedrukte opdracht bij de externe printdienst. */
|
|
108
|
+
export async function annuleerExternePrintOpdracht(externJobId) {
|
|
109
|
+
if (!externJobId.trim())
|
|
110
|
+
return;
|
|
111
|
+
await vraag(`/printjobs/${encodeURIComponent(externJobId)}`, {
|
|
112
|
+
method: "DELETE",
|
|
113
|
+
});
|
|
114
|
+
}
|
|
105
115
|
/** Vraagt de status van een verstuurde opdracht op. */
|
|
106
116
|
export async function opdrachtStatus(externJobId) {
|
|
107
117
|
const data = await vraag(`/printjobs/${encodeURIComponent(externJobId)}/states`);
|
|
@@ -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;
|
|
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;AA2ND,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"}
|
|
@@ -117,8 +117,8 @@ function regeltabel(regels) {
|
|
|
117
117
|
const eenheid = r["eenheid"] ?? "";
|
|
118
118
|
return `<tr><td>${esc(code)}</td><td>${esc(omschrijving)}</td><td style="text-align:right">${esc(aantal)}</td><td>${esc(eenheid)}</td></tr>`;
|
|
119
119
|
};
|
|
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>
|
|
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>
|
|
122
122
|
<tbody>${regels.map(rij).join("")}</tbody></table>`;
|
|
123
123
|
}
|
|
124
124
|
function totalenBlok(regels, velden) {
|
|
@@ -166,7 +166,10 @@ function groepHtml(groep, config, velden, data, opties) {
|
|
|
166
166
|
delen.push(totalenBlok(zoekRegels(data), velden));
|
|
167
167
|
}
|
|
168
168
|
else if (inst.key === "toon_afbeelding" || inst.key === "afbeelding") {
|
|
169
|
-
const url = velden["afbeelding"] ??
|
|
169
|
+
const url = velden["afbeelding"] ??
|
|
170
|
+
velden["regel.afbeelding"] ??
|
|
171
|
+
velden["product.afbeelding"] ??
|
|
172
|
+
String(zoekRegels(data).find((r) => r["afbeelding"])?.["afbeelding"] ?? "");
|
|
170
173
|
delen.push(url
|
|
171
174
|
? `<img src="${esc(url)}" style="height:35mm" />`
|
|
172
175
|
: `<div class="lijnveld hoog"></div>`);
|
|
@@ -243,21 +246,21 @@ export function renderProfielDocument(documenttype, config, gegevens, opties = {
|
|
|
243
246
|
.map((groep) => groepHtml(groep, cfg, velden, data, opties))
|
|
244
247
|
.filter(Boolean)
|
|
245
248
|
.join("");
|
|
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; }
|
|
249
|
+
return `<!doctype html><html lang="nl"><head><meta charset="utf-8" />
|
|
250
|
+
<title>${esc(opties.titel ?? profiel.label)}</title>
|
|
251
|
+
<style>
|
|
252
|
+
@page { size: ${b}mm ${h}mm; margin: ${marge}mm; }
|
|
253
|
+
* { box-sizing: border-box; }
|
|
254
|
+
html, body { margin: 0; padding: 0; }
|
|
255
|
+
body { font-family: Arial, Helvetica, sans-serif; font-size: 9pt; color: #111827; line-height: 1.35; }
|
|
256
|
+
.blok { margin-bottom: 2.5mm; }
|
|
257
|
+
.kop { border-bottom: 0.3mm solid #d1d5db; padding-bottom: 1mm; }
|
|
258
|
+
.sectitel { font-size: 90%; font-weight: 600; text-transform: uppercase; color: #6b7280; margin-bottom: 0.6mm; }
|
|
259
|
+
.vet { font-weight: 600; }
|
|
260
|
+
.klein { font-size: 85%; color: #6b7280; }
|
|
261
|
+
.kv { display: flex; justify-content: space-between; gap: 3mm; }
|
|
262
|
+
.kv .k { color: #6b7280; }
|
|
263
|
+
.tabel { width: 100%; border-collapse: collapse; table-layout: fixed; }
|
|
264
|
+
.tabel th { text-align: left; font-weight: 600; }
|
|
262
265
|
</style></head><body>${kop}${body}</body></html>`;
|
|
263
266
|
}
|
|
@@ -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
|
/**
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flowselections/layout-maker",
|
|
3
|
-
"version": "1.45.
|
|
3
|
+
"version": "1.45.19",
|
|
4
4
|
"flowselections": {
|
|
5
5
|
"moduleId": "layout-maker",
|
|
6
6
|
"pages": [
|
|
@@ -126,8 +126,8 @@
|
|
|
126
126
|
"devDependencies": {
|
|
127
127
|
"@cloudflare/vite-plugin": "^1.25.5",
|
|
128
128
|
"@eslint/js": "^9.32.0",
|
|
129
|
-
"@flowselections/core": "1.0.
|
|
130
|
-
"@lovable.dev/vite-tanstack-config": "2.
|
|
129
|
+
"@flowselections/core": "1.0.21",
|
|
130
|
+
"@lovable.dev/vite-tanstack-config": "2.23.1",
|
|
131
131
|
"@rsbuild/core": "^1.0.0",
|
|
132
132
|
"@tailwindcss/vite": "^4.2.1",
|
|
133
133
|
"@tanstack/react-query": "^5.83.0",
|