@flowselections/layout-maker 1.7.2 → 1.7.3
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 +69 -54
- package/dist-lib/components/AfdrukKnop.d.ts +1 -1
- package/dist-lib/components/AfdrukKnop.js +2 -2
- package/dist-lib/components/AiLayoutImportDialog.js +4 -4
- package/dist-lib/components/BlokOntwerperPage.js +5 -5
- package/dist-lib/components/ComputersLijst.js +2 -2
- package/dist-lib/components/DocumentSettingsPanel.d.ts +2 -2
- package/dist-lib/components/DocumentSettingsPanel.js +3 -3
- package/dist-lib/components/FormaatOrientatieBar.d.ts +1 -1
- package/dist-lib/components/FormaatOrientatieBar.js +2 -2
- package/dist-lib/components/LayoutsPage.js +4 -4
- package/dist-lib/components/LogoBibliotheekDialog.d.ts +1 -1
- package/dist-lib/components/LogoBibliotheekDialog.js +2 -2
- package/dist-lib/components/LogosPage.d.ts +1 -1
- package/dist-lib/components/LogosPage.js +2 -2
- package/dist-lib/components/NetwerkPrintersDialog.js +2 -2
- package/dist-lib/components/PakbonBuilderPage.js +8 -8
- package/dist-lib/components/PakbonPreview.d.ts +1 -1
- package/dist-lib/components/PakbonPreview.js +3 -3
- package/dist-lib/components/PakbonSectiesPanel.d.ts +1 -1
- package/dist-lib/components/PakbonSectiesPanel.js +4 -4
- package/dist-lib/components/PrintQueuePage.d.ts.map +1 -1
- package/dist-lib/components/PrintQueuePage.js +7 -6
- package/dist-lib/components/PrinterSetupWizard.js +6 -6
- package/dist-lib/components/PrintersPage.js +7 -7
- package/dist-lib/components/ProductiebonBlokkenPanel.d.ts +1 -1
- package/dist-lib/components/ProductiebonBlokkenPanel.js +1 -1
- package/dist-lib/components/ProductiebonBuilderPage.js +6 -6
- package/dist-lib/components/ProductiebonPreview.d.ts +1 -1
- package/dist-lib/components/ProductiebonPreview.js +2 -2
- package/dist-lib/components/WerkplekConfiguratiePage.js +7 -7
- package/dist-lib/index.d.ts +62 -46
- package/dist-lib/index.d.ts.map +1 -1
- package/dist-lib/index.js +46 -46
- package/dist-lib/integrations/supabase/auth-attacher.js +1 -1
- package/dist-lib/integrations/supabase/auth-middleware.d.ts +1302 -749
- package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.d.ts +1 -1
- package/dist-lib/integrations/supabase/client.js +1 -1
- package/dist-lib/integrations/supabase/client.server.d.ts +1302 -749
- 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/types.d.ts +685 -127
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/aiLayout.functions.d.ts +1385 -832
- package/dist-lib/lib/aiLayout.functions.d.ts.map +1 -1
- package/dist-lib/lib/aiLayout.functions.js +2 -2
- package/dist-lib/lib/aiLayout.server.d.ts +1 -1
- package/dist-lib/lib/aiLayout.server.js +9 -9
- package/dist-lib/lib/browserPrint.d.ts +1 -1
- package/dist-lib/lib/browserPrint.js +8 -8
- package/dist-lib/lib/directPrint.d.ts +1 -1
- package/dist-lib/lib/directPrint.js +4 -4
- package/dist-lib/lib/documentPdf.d.ts +1 -1
- package/dist-lib/lib/documentProfiles.d.ts +1 -1
- package/dist-lib/lib/formaatPrinters.js +1 -1
- package/dist-lib/lib/htmlNaarPdf.server.js +1 -1
- package/dist-lib/lib/layoutPreview.d.ts +1 -1
- package/dist-lib/lib/layoutPreview.js +8 -8
- package/dist-lib/lib/logoLibrary.js +1 -1
- package/dist-lib/lib/orderData.server.d.ts +2 -1
- package/dist-lib/lib/orderData.server.d.ts.map +1 -1
- package/dist-lib/lib/orderData.server.js +7 -8
- package/dist-lib/lib/pakbonBuilder.d.ts +1 -1
- package/dist-lib/lib/pakbonHtml.d.ts +1 -1
- package/dist-lib/lib/pakbonHtml.js +52 -52
- package/dist-lib/lib/printApi.d.ts +1 -1
- package/dist-lib/lib/printApi.js +3 -3
- package/dist-lib/lib/printQueue.server.d.ts +12 -3
- package/dist-lib/lib/printQueue.server.d.ts.map +1 -1
- package/dist-lib/lib/printQueue.server.js +66 -48
- package/dist-lib/lib/printService.functions.d.ts +5539 -24425
- package/dist-lib/lib/printService.functions.d.ts.map +1 -1
- package/dist-lib/lib/printService.functions.js +5 -31
- package/dist-lib/lib/printService.server.js +1 -1
- package/dist-lib/lib/productiebonBuilder.d.ts +1 -1
- package/dist-lib/lib/productiebonHtml.js +17 -17
- package/dist-lib/lib/profielHtml.js +20 -20
- package/dist-lib/lib/queueTick.d.ts +11 -3
- package/dist-lib/lib/queueTick.d.ts.map +1 -1
- package/dist-lib/lib/queueTick.js +68 -21
- package/dist-lib/lib/queueTickClient.d.ts +8 -0
- package/dist-lib/lib/queueTickClient.d.ts.map +1 -0
- package/dist-lib/lib/queueTickClient.js +37 -0
- package/dist-lib/lib/runnerRegistry.server.d.ts +3 -2
- package/dist-lib/lib/runnerRegistry.server.d.ts.map +1 -1
- package/dist-lib/lib/runnerRegistry.server.js +6 -8
- package/dist-lib/lib/supabaseAdmin.server.d.ts +5 -5
- package/dist-lib/lib/supabaseAdmin.server.js +43 -43
- package/dist-lib/lib/supabaseClient.d.ts +1 -1
- package/dist-lib/lib/testpagina.js +3 -3
- package/dist-lib/lib/useDocumentData.d.ts +1 -1
- package/dist-lib/lib/useDocumentData.js +1 -1
- package/dist-lib/lib/useNetwerkPrinters.js +1 -1
- package/package.json +2 -2
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
// oriëntatie vooraf goed, zodat de gebruiker in het printvenster niets meer
|
|
7
7
|
// hoeft aan te passen behalve — indien nodig — de printernaam.
|
|
8
8
|
// ============================================================================
|
|
9
|
-
import { supabase } from "./supabaseClient";
|
|
10
|
-
import { documentProfiel } from "./documentProfiles";
|
|
11
|
-
import { PAPIERFORMATEN } from "./documentTypes";
|
|
9
|
+
import { supabase } from "./supabaseClient.js";
|
|
10
|
+
import { documentProfiel } from "./documentProfiles.js";
|
|
11
|
+
import { PAPIERFORMATEN } from "./documentTypes.js";
|
|
12
12
|
const arr = (v) => (Array.isArray(v) ? v : []);
|
|
13
13
|
/** Zoekt de afmetingen die bij een formaatcode horen. */
|
|
14
14
|
export function formaatDef(documenttype, code) {
|
|
@@ -29,7 +29,7 @@ export function paginaCss(formaat, orientatie, margeMm = 0) {
|
|
|
29
29
|
const gedraaid = formaat && orientatie === "landscape"
|
|
30
30
|
? `${formaat.hoogte}mm ${formaat.breedte}mm`
|
|
31
31
|
: size;
|
|
32
|
-
return `@page { size: ${gedraaid}; margin: ${margeMm}mm; }
|
|
32
|
+
return `@page { size: ${gedraaid}; margin: ${margeMm}mm; }
|
|
33
33
|
@media print { html, body { margin: 0; padding: 0; } }`;
|
|
34
34
|
}
|
|
35
35
|
/**
|
|
@@ -90,10 +90,10 @@ export async function drukAf(opdracht) {
|
|
|
90
90
|
return { printer };
|
|
91
91
|
}
|
|
92
92
|
doc.open();
|
|
93
|
-
doc.write(`<!doctype html><html><head><meta charset="utf-8" />
|
|
94
|
-
<title>${opdracht.documentnaam ?? "Document"}</title>
|
|
95
|
-
<style>${paginaCss(formaat, opdracht.orientatie, opdracht.margeMm ?? 0)}
|
|
96
|
-
body { font-family: system-ui, -apple-system, "Segoe UI", sans-serif; }
|
|
93
|
+
doc.write(`<!doctype html><html><head><meta charset="utf-8" />
|
|
94
|
+
<title>${opdracht.documentnaam ?? "Document"}</title>
|
|
95
|
+
<style>${paginaCss(formaat, opdracht.orientatie, opdracht.margeMm ?? 0)}
|
|
96
|
+
body { font-family: system-ui, -apple-system, "Segoe UI", sans-serif; }
|
|
97
97
|
${opdracht.css ?? ""}</style></head><body>${opdracht.html}</body></html>`);
|
|
98
98
|
doc.close();
|
|
99
99
|
await new Promise((r) => setTimeout(r, 250));
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
// src/lib/directPrint.ts — documenten stil afdrukken op de achtergrond.
|
|
3
3
|
// Lukt dat niet, dan valt de aanroeper terug op het printvenster.
|
|
4
4
|
// ============================================================================
|
|
5
|
-
import { supabase } from "./supabaseClient";
|
|
6
|
-
import { bedoeldePrinter, formaatDef } from "./browserPrint";
|
|
7
|
-
import { htmlNaarPdfBase64 } from "./documentPdf";
|
|
8
|
-
import { verstuurPrintOpdracht } from "./printService.functions";
|
|
5
|
+
import { supabase } from "./supabaseClient.js";
|
|
6
|
+
import { bedoeldePrinter, formaatDef } from "./browserPrint.js";
|
|
7
|
+
import { htmlNaarPdfBase64 } from "./documentPdf.js";
|
|
8
|
+
import { verstuurPrintOpdracht } from "./printService.functions.js";
|
|
9
9
|
/**
|
|
10
10
|
* Probeert het document rechtstreeks naar de ingestelde printer te sturen.
|
|
11
11
|
* Geeft `gelukt: false` terug wanneer er geen geschikte printer is; de
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// src/lib/formaatPrinters.ts — standaardprinter per documentsoort en formaat
|
|
3
3
|
// ============================================================================
|
|
4
4
|
import { useCallback, useEffect, useState } from "react";
|
|
5
|
-
import { supabase } from "./supabaseClient";
|
|
5
|
+
import { supabase } from "./supabaseClient.js";
|
|
6
6
|
const arr = (v) => (Array.isArray(v) ? v : []);
|
|
7
7
|
export function useFormaatPrinters(documenttype) {
|
|
8
8
|
const [koppelingen, setKoppelingen] = useState([]);
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// Gebruikt de eigen documentmaker (src/lib/htmlPdf.server.ts). Geen externe
|
|
4
4
|
// dienst, geen browser en geen instellingen per shell nodig.
|
|
5
5
|
// ============================================================================
|
|
6
|
-
import { bytesNaarBase64, htmlNaarPdfBytes } from "./htmlPdf.server";
|
|
6
|
+
import { bytesNaarBase64, htmlNaarPdfBytes } from "./htmlPdf.server.js";
|
|
7
7
|
export class PdfRenderFout extends Error {
|
|
8
8
|
constructor(code, boodschap) {
|
|
9
9
|
super(boodschap);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { LayoutElementModel, LayoutModel } from "./documentTypes";
|
|
1
|
+
import type { LayoutElementModel, LayoutModel } from "./documentTypes.js";
|
|
2
2
|
export declare function voorbeeldContext(): Record<string, string>;
|
|
3
3
|
export declare function vulVelden(tekst: string, ctx: Record<string, string>): string;
|
|
4
4
|
export declare function conditieVoldoet(el: LayoutElementModel, ctx: Record<string, string>): boolean;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// ============================================================================
|
|
2
2
|
// src/lib/layoutPreview.ts — voorbeeldgegevens, veldvervanging en print-HTML
|
|
3
3
|
// ============================================================================
|
|
4
|
-
import { alleVelden } from "./fieldRegistry";
|
|
4
|
+
import { alleVelden } from "./fieldRegistry.js";
|
|
5
5
|
export function voorbeeldContext() {
|
|
6
6
|
const ctx = {};
|
|
7
7
|
for (const v of alleVelden())
|
|
@@ -79,8 +79,8 @@ function elementHtml(el, ctx) {
|
|
|
79
79
|
case "cirkel":
|
|
80
80
|
return `<div style="${base};border-radius:50%;border:${s.randbreedte || 0.3}mm solid ${s.randkleur ?? "#111827"}"></div>`;
|
|
81
81
|
case "barcode":
|
|
82
|
-
return `<div style="${base};display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:monospace">
|
|
83
|
-
<div style="width:100%;height:70%;background:repeating-linear-gradient(90deg,#111 0 1.2px,#fff 1.2px 3px)"></div>
|
|
82
|
+
return `<div style="${base};display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:monospace">
|
|
83
|
+
<div style="width:100%;height:70%;background:repeating-linear-gradient(90deg,#111 0 1.2px,#fff 1.2px 3px)"></div>
|
|
84
84
|
<div style="font-size:7pt">${esc(inhoud)}</div></div>`;
|
|
85
85
|
case "qrcode":
|
|
86
86
|
return `<div style="${base};background:repeating-conic-gradient(#111 0% 25%, #fff 0% 50%) 0 0/22% 22%"></div>`;
|
|
@@ -125,10 +125,10 @@ export function bouwDocumentHtml(layout, elementen, gegevens) {
|
|
|
125
125
|
const body = zichtbaar.map((e) => elementHtml(e, ctx)).join("");
|
|
126
126
|
const b = layout.orientatie === "landscape" ? layout.hoogte_mm : layout.breedte_mm;
|
|
127
127
|
const h = layout.orientatie === "landscape" ? layout.breedte_mm : layout.hoogte_mm;
|
|
128
|
-
return `<!doctype html><html lang="nl"><head><meta charset="utf-8"><title>${esc(layout.naam)}</title>
|
|
129
|
-
<style>@page{size:${b}mm ${h}mm;margin:0}
|
|
130
|
-
body{margin:0;background:#e5e7eb}
|
|
131
|
-
.pagina{position:relative;width:${b}mm;height:${h}mm;background:#fff;margin:0 auto;overflow:hidden}
|
|
132
|
-
@media print{body{background:#fff}}</style></head>
|
|
128
|
+
return `<!doctype html><html lang="nl"><head><meta charset="utf-8"><title>${esc(layout.naam)}</title>
|
|
129
|
+
<style>@page{size:${b}mm ${h}mm;margin:0}
|
|
130
|
+
body{margin:0;background:#e5e7eb}
|
|
131
|
+
.pagina{position:relative;width:${b}mm;height:${h}mm;background:#fff;margin:0 auto;overflow:hidden}
|
|
132
|
+
@media print{body{background:#fff}}</style></head>
|
|
133
133
|
<body><div class="pagina">${body}</div></body></html>`;
|
|
134
134
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// src/lib/logoLibrary.ts — centrale Logo Bibliotheek
|
|
3
3
|
// ============================================================================
|
|
4
4
|
import { useCallback, useEffect, useState } from "react";
|
|
5
|
-
import { supabase } from "./supabaseClient";
|
|
5
|
+
import { supabase } from "./supabaseClient.js";
|
|
6
6
|
export const LOGO_BUCKET = "layout-logos";
|
|
7
7
|
export const LOGO_CATEGORIEEN = [
|
|
8
8
|
{ value: "hoofdlogo", label: "Hoofdlogo" },
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { PrintDb } from "./printQueue.server.js";
|
|
1
2
|
type Rij = Record<string, any>;
|
|
2
3
|
/** Bevat de meegestuurde payload zelf al orderregels of karren? */
|
|
3
4
|
export declare function heeftOrderInhoud(bron: unknown): boolean;
|
|
@@ -10,6 +11,6 @@ export declare function zoekOrderVerwijzing(payload: unknown): {
|
|
|
10
11
|
* Bouwt de ruwe ordergegevens (vorm die `maakPakbonOrder` verwacht) op basis
|
|
11
12
|
* van het order-id of ordernummer. Geeft `null` als de order niet te vinden is.
|
|
12
13
|
*/
|
|
13
|
-
export declare function laadOrderVanuitDatabase(payload: unknown): Promise<Rij | null>;
|
|
14
|
+
export declare function laadOrderVanuitDatabase(db: PrintDb, payload: unknown): Promise<Rij | null>;
|
|
14
15
|
export {};
|
|
15
16
|
//# sourceMappingURL=orderData.server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orderData.server.d.ts","sourceRoot":"","sources":["../../src/lib/orderData.server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"orderData.server.d.ts","sourceRoot":"","sources":["../../src/lib/orderData.server.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAuB/B,mEAAmE;AACnE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAKvD;AAED,wEAAwE;AACxE,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG;IACrD,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,CAyBA;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAiKhG"}
|
|
@@ -7,7 +7,6 @@
|
|
|
7
7
|
// `order_items`, `order_carts` en `order_cart_items`.
|
|
8
8
|
// Draait alleen op de server (printwachtrij).
|
|
9
9
|
// ============================================================================
|
|
10
|
-
import { adminDb as supabaseAdmin } from "./supabaseAdmin.server";
|
|
11
10
|
const arr = (v) => (Array.isArray(v) ? v : []);
|
|
12
11
|
const num = (v) => (Number.isFinite(Number(v)) ? Number(v) : 0);
|
|
13
12
|
/**
|
|
@@ -66,16 +65,16 @@ export function zoekOrderVerwijzing(payload) {
|
|
|
66
65
|
* Bouwt de ruwe ordergegevens (vorm die `maakPakbonOrder` verwacht) op basis
|
|
67
66
|
* van het order-id of ordernummer. Geeft `null` als de order niet te vinden is.
|
|
68
67
|
*/
|
|
69
|
-
export async function laadOrderVanuitDatabase(payload) {
|
|
68
|
+
export async function laadOrderVanuitDatabase(db, payload) {
|
|
70
69
|
const { orderId, ordernummer } = zoekOrderVerwijzing(payload);
|
|
71
70
|
if (!orderId && !ordernummer)
|
|
72
71
|
return null;
|
|
73
72
|
let order = null;
|
|
74
73
|
if (orderId) {
|
|
75
|
-
order = await veilig(() =>
|
|
74
|
+
order = await veilig(() => db.from("orders").select("*").eq("id", orderId).maybeSingle());
|
|
76
75
|
}
|
|
77
76
|
if (!order && ordernummer) {
|
|
78
|
-
const rijen = await veilig(() =>
|
|
77
|
+
const rijen = await veilig(() => db
|
|
79
78
|
.from("orders")
|
|
80
79
|
.select("*")
|
|
81
80
|
.eq("order_number", ordernummer)
|
|
@@ -86,8 +85,8 @@ export async function laadOrderVanuitDatabase(payload) {
|
|
|
86
85
|
if (!order)
|
|
87
86
|
return null;
|
|
88
87
|
const [regelsRuw, karrenRuw] = await Promise.all([
|
|
89
|
-
veilig(() =>
|
|
90
|
-
veilig(() =>
|
|
88
|
+
veilig(() => db.from("order_items").select("*").eq("order_id", order["id"])),
|
|
89
|
+
veilig(() => db
|
|
91
90
|
.from("order_carts")
|
|
92
91
|
.select("*")
|
|
93
92
|
.eq("order_id", order["id"])
|
|
@@ -97,7 +96,7 @@ export async function laadOrderVanuitDatabase(payload) {
|
|
|
97
96
|
const karrenRijen = arr(karrenRuw);
|
|
98
97
|
let karItems = [];
|
|
99
98
|
if (karrenRijen.length) {
|
|
100
|
-
karItems = arr(await veilig(() =>
|
|
99
|
+
karItems = arr(await veilig(() => db
|
|
101
100
|
.from("order_cart_items")
|
|
102
101
|
.select("*")
|
|
103
102
|
.in("cart_id", karrenRijen.map((k) => k["id"]))));
|
|
@@ -107,7 +106,7 @@ export async function laadOrderVanuitDatabase(payload) {
|
|
|
107
106
|
.filter((v) => typeof v === "string")));
|
|
108
107
|
const producten = new Map();
|
|
109
108
|
if (productIds.length) {
|
|
110
|
-
const data = await veilig(() =>
|
|
109
|
+
const data = await veilig(() => db
|
|
111
110
|
.from("products")
|
|
112
111
|
.select("id, product, article_number, barcode, location, unit, weight, custom_fields")
|
|
113
112
|
.in("id", productIds));
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { InstellingDef } from "./documentProfiles";
|
|
1
|
+
import type { InstellingDef } from "./documentProfiles.js";
|
|
2
2
|
export type PakbonSectieType = "logo" | "bedrijfsgegevens" | "klantgegevens" | "afleveradres" | "factuuradres" | "orderinformatie" | "transportinformatie" | "opmerkingen" | "orderregels" | "pickmethode" | "karren" | "lagen" | "producten" | "fusten" | "totalen" | "handtekening" | "tekstblok" | "qrcode" | "barcode" | "afbeelding";
|
|
3
3
|
export interface PakbonKolom {
|
|
4
4
|
key: string;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type DemoOrder, type PakbonConfig } from "./pakbonBuilder";
|
|
1
|
+
import { type DemoOrder, type PakbonConfig } from "./pakbonBuilder.js";
|
|
2
2
|
/** Gegevensvorm van een pakbon. Gelijk aan de vorm van het live voorbeeld. */
|
|
3
3
|
export type PakbonOrder = DemoOrder;
|
|
4
4
|
export interface PakbonLogo {
|
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
// layoutconfiguratie en de echte ordergegevens. Zo tonen het live voorbeeld en
|
|
8
8
|
// de afdruk altijd exact dezelfde secties — inclusief de orderregels.
|
|
9
9
|
// ============================================================================
|
|
10
|
-
import { DEMO_ORDER, conditieContext, groepeerIdentiekeKarren, groepeerIdentiekeLagen, karBundelTekst, fustVerzamellijst, pickMethode, productVeldBreedtes, sectieOnderdrukt, laagBundelTekst, leesPakbonConfig, sectieZichtbaar, sorteerProducten, totalen, vulVeldcodes, } from "./pakbonBuilder";
|
|
11
|
-
import { haalPrintLogos } from "./logoLibrary";
|
|
10
|
+
import { DEMO_ORDER, conditieContext, groepeerIdentiekeKarren, groepeerIdentiekeLagen, karBundelTekst, fustVerzamellijst, pickMethode, productVeldBreedtes, sectieOnderdrukt, laagBundelTekst, leesPakbonConfig, sectieZichtbaar, sorteerProducten, totalen, vulVeldcodes, } from "./pakbonBuilder.js";
|
|
11
|
+
import { haalPrintLogos } from "./logoLibrary.js";
|
|
12
12
|
// --- kleine hulpjes ---------------------------------------------------------
|
|
13
13
|
const arr = (v) => (Array.isArray(v) ? v : []);
|
|
14
14
|
const opt = (s, key, fallback) => s.opties?.[key] ?? fallback;
|
|
@@ -640,56 +640,56 @@ export function renderPakbonDocument(config, order, opties = {}) {
|
|
|
640
640
|
const font = opties.lettertype ?? 'Arial, Helvetica, "Segoe UI", sans-serif';
|
|
641
641
|
const grootte = opties.lettergrootte ?? 8.5;
|
|
642
642
|
const body = renderPakbonBody(config, order, opties);
|
|
643
|
-
return `<!doctype html><html lang="nl"><head><meta charset="utf-8" />
|
|
644
|
-
<title>${esc(opties.titel ?? "Pakbon")}</title>
|
|
645
|
-
<style>
|
|
646
|
-
@page { size: ${b}mm ${h}mm; margin: ${marge}mm; }
|
|
647
|
-
* { box-sizing: border-box; }
|
|
648
|
-
html, body { margin: 0; padding: 0; }
|
|
649
|
-
body { font-family: ${font}; font-size: ${grootte}pt; color: #111827; line-height: 1.35; }
|
|
650
|
-
.blok { margin-bottom: 2mm; }
|
|
651
|
-
.sectitel { font-size: 90%; font-weight: 600; text-transform: uppercase; color: #6b7280; margin-bottom: 0.6mm; }
|
|
652
|
-
.vet { font-weight: 600; }
|
|
653
|
-
.kv { display: flex; justify-content: space-between; gap: 3mm; }
|
|
654
|
-
.kv .k { color: #6b7280; }
|
|
655
|
-
.kv .v { font-weight: 500; }
|
|
656
|
-
.grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: 0 6mm; }
|
|
657
|
-
.kader { border: 0.25mm solid #d1d5db; border-radius: 1mm; padding: 1.5mm; }
|
|
658
|
-
table.regels { width: 100%; border-collapse: collapse; }
|
|
659
|
-
table.regels.vast { table-layout: fixed; }
|
|
660
|
-
table.regels.vast td, table.regels.vast th { overflow-wrap: anywhere; }
|
|
661
|
-
table.regels th, table.regels td { padding: 0.7mm 1mm; vertical-align: top; }
|
|
662
|
-
table.regels th { font-size: 90%; text-transform: uppercase; color: #6b7280; font-weight: 600; text-align: left; }
|
|
663
|
-
.rand { border: 0.2mm solid #d1d5db; }
|
|
664
|
-
.onder { border-bottom: 0.2mm solid #d1d5db; }
|
|
665
|
-
table.regels.compact th, table.regels.compact td { padding: 0.3mm 0.8mm; }
|
|
666
|
-
tr.zebra td { background: #f3f4f6; }
|
|
667
|
-
.plijst { margin: 0; padding-left: 4mm; }
|
|
668
|
-
.groep { margin-bottom: 1.5mm; }
|
|
669
|
-
.regelrij { display: flex; gap: 2mm; }
|
|
670
|
-
.tweekolom { display: grid; grid-template-columns: 1fr 1fr; gap: 3mm; }
|
|
671
|
-
.karblok { margin-bottom: 2mm; }
|
|
672
|
-
.karblok.omkaderd { border: 0.25mm solid #d1d5db; border-radius: 1mm; padding: 1.5mm; }
|
|
673
|
-
.karkop { display: flex; justify-content: space-between; align-items: center; padding: 0.8mm 1.5mm; border-radius: 1mm; margin-bottom: 1mm; }
|
|
674
|
-
.bundel { display: inline-block; border: 0.3mm dashed #6b7280; border-radius: 1mm; padding: 0.4mm 1.5mm; margin-bottom: 1mm; font-weight: 700; text-transform: uppercase; letter-spacing: 0.2mm; font-size: 90%; }
|
|
675
|
-
.laag { margin-bottom: 1.5mm; }
|
|
676
|
-
.laagkop { display: flex; justify-content: space-between; font-weight: 500; border-bottom: 0.2mm solid #d1d5db; padding-bottom: 0.4mm; margin-bottom: 0.6mm; }
|
|
677
|
-
.laagkop.compact { border-bottom: none; }
|
|
678
|
-
.meta { display: flex; gap: 3mm; font-size: 88%; font-weight: 400; color: #4b5563; }
|
|
679
|
-
.totalen { display: flex; flex-wrap: wrap; gap: 5mm; border-top: 0.25mm solid #d1d5db; padding-top: 1.2mm; font-weight: 500; }
|
|
680
|
-
.paginavoet { position: fixed; bottom: 0; left: 0; right: 0; background: #fff; }
|
|
681
|
-
.handtekening { margin-top: 3mm; }
|
|
682
|
-
.lijnveld { margin-top: 4mm; border-bottom: 0.25mm solid #6b7280; padding-bottom: 3mm; }
|
|
683
|
-
.lijnveld.hoog { padding-bottom: 10mm; }
|
|
684
|
-
.lijn { border-top: 0.25mm solid #d1d5db; margin: 1.5mm 0; }
|
|
685
|
-
.balk { height: 1mm; background: #374151; margin: 1.5mm 0; }
|
|
686
|
-
.qr { border: 0.25mm dashed #9ca3af; }
|
|
687
|
-
.streepjes { width: 45mm; background: repeating-linear-gradient(to right, #111827 0 2px, transparent 2px 5px); }
|
|
688
|
-
.klein { font-size: 85%; color: #6b7280; }
|
|
689
|
-
.breekvoor { break-before: page; page-break-before: always; }
|
|
690
|
-
.heelhouden { break-inside: avoid; page-break-inside: avoid; }
|
|
691
|
-
img { max-width: 100%; }
|
|
692
|
-
</style></head>
|
|
643
|
+
return `<!doctype html><html lang="nl"><head><meta charset="utf-8" />
|
|
644
|
+
<title>${esc(opties.titel ?? "Pakbon")}</title>
|
|
645
|
+
<style>
|
|
646
|
+
@page { size: ${b}mm ${h}mm; margin: ${marge}mm; }
|
|
647
|
+
* { box-sizing: border-box; }
|
|
648
|
+
html, body { margin: 0; padding: 0; }
|
|
649
|
+
body { font-family: ${font}; font-size: ${grootte}pt; color: #111827; line-height: 1.35; }
|
|
650
|
+
.blok { margin-bottom: 2mm; }
|
|
651
|
+
.sectitel { font-size: 90%; font-weight: 600; text-transform: uppercase; color: #6b7280; margin-bottom: 0.6mm; }
|
|
652
|
+
.vet { font-weight: 600; }
|
|
653
|
+
.kv { display: flex; justify-content: space-between; gap: 3mm; }
|
|
654
|
+
.kv .k { color: #6b7280; }
|
|
655
|
+
.kv .v { font-weight: 500; }
|
|
656
|
+
.grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: 0 6mm; }
|
|
657
|
+
.kader { border: 0.25mm solid #d1d5db; border-radius: 1mm; padding: 1.5mm; }
|
|
658
|
+
table.regels { width: 100%; border-collapse: collapse; }
|
|
659
|
+
table.regels.vast { table-layout: fixed; }
|
|
660
|
+
table.regels.vast td, table.regels.vast th { overflow-wrap: anywhere; }
|
|
661
|
+
table.regels th, table.regels td { padding: 0.7mm 1mm; vertical-align: top; }
|
|
662
|
+
table.regels th { font-size: 90%; text-transform: uppercase; color: #6b7280; font-weight: 600; text-align: left; }
|
|
663
|
+
.rand { border: 0.2mm solid #d1d5db; }
|
|
664
|
+
.onder { border-bottom: 0.2mm solid #d1d5db; }
|
|
665
|
+
table.regels.compact th, table.regels.compact td { padding: 0.3mm 0.8mm; }
|
|
666
|
+
tr.zebra td { background: #f3f4f6; }
|
|
667
|
+
.plijst { margin: 0; padding-left: 4mm; }
|
|
668
|
+
.groep { margin-bottom: 1.5mm; }
|
|
669
|
+
.regelrij { display: flex; gap: 2mm; }
|
|
670
|
+
.tweekolom { display: grid; grid-template-columns: 1fr 1fr; gap: 3mm; }
|
|
671
|
+
.karblok { margin-bottom: 2mm; }
|
|
672
|
+
.karblok.omkaderd { border: 0.25mm solid #d1d5db; border-radius: 1mm; padding: 1.5mm; }
|
|
673
|
+
.karkop { display: flex; justify-content: space-between; align-items: center; padding: 0.8mm 1.5mm; border-radius: 1mm; margin-bottom: 1mm; }
|
|
674
|
+
.bundel { display: inline-block; border: 0.3mm dashed #6b7280; border-radius: 1mm; padding: 0.4mm 1.5mm; margin-bottom: 1mm; font-weight: 700; text-transform: uppercase; letter-spacing: 0.2mm; font-size: 90%; }
|
|
675
|
+
.laag { margin-bottom: 1.5mm; }
|
|
676
|
+
.laagkop { display: flex; justify-content: space-between; font-weight: 500; border-bottom: 0.2mm solid #d1d5db; padding-bottom: 0.4mm; margin-bottom: 0.6mm; }
|
|
677
|
+
.laagkop.compact { border-bottom: none; }
|
|
678
|
+
.meta { display: flex; gap: 3mm; font-size: 88%; font-weight: 400; color: #4b5563; }
|
|
679
|
+
.totalen { display: flex; flex-wrap: wrap; gap: 5mm; border-top: 0.25mm solid #d1d5db; padding-top: 1.2mm; font-weight: 500; }
|
|
680
|
+
.paginavoet { position: fixed; bottom: 0; left: 0; right: 0; background: #fff; }
|
|
681
|
+
.handtekening { margin-top: 3mm; }
|
|
682
|
+
.lijnveld { margin-top: 4mm; border-bottom: 0.25mm solid #6b7280; padding-bottom: 3mm; }
|
|
683
|
+
.lijnveld.hoog { padding-bottom: 10mm; }
|
|
684
|
+
.lijn { border-top: 0.25mm solid #d1d5db; margin: 1.5mm 0; }
|
|
685
|
+
.balk { height: 1mm; background: #374151; margin: 1.5mm 0; }
|
|
686
|
+
.qr { border: 0.25mm dashed #9ca3af; }
|
|
687
|
+
.streepjes { width: 45mm; background: repeating-linear-gradient(to right, #111827 0 2px, transparent 2px 5px); }
|
|
688
|
+
.klein { font-size: 85%; color: #6b7280; }
|
|
689
|
+
.breekvoor { break-before: page; page-break-before: always; }
|
|
690
|
+
.heelhouden { break-inside: avoid; page-break-inside: avoid; }
|
|
691
|
+
img { max-width: 100%; }
|
|
692
|
+
</style></head>
|
|
693
693
|
<body>${body}</body></html>`;
|
|
694
694
|
}
|
|
695
695
|
/** Handig voor testen: het document met de voorbeeldgegevens. */
|
package/dist-lib/lib/printApi.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// ============================================================================
|
|
4
4
|
// Andere modules gebruiken uitsluitend deze functies; zij hoeven de tabellen
|
|
5
5
|
// van deze module niet te kennen.
|
|
6
|
-
import { supabase } from "./supabaseClient";
|
|
6
|
+
import { supabase } from "./supabaseClient.js";
|
|
7
7
|
const arr = (v) => (Array.isArray(v) ? v : []);
|
|
8
8
|
/** Zoekt de te gebruiken layout: expliciet, anders standaard, anders de nieuwste. */
|
|
9
9
|
async function bepaalLayout(documenttype, layoutId) {
|
|
@@ -82,8 +82,8 @@ export async function printDocument(input) {
|
|
|
82
82
|
/** Zet de wachtrijverwerking op de achtergrond in gang (best effort). */
|
|
83
83
|
async function startWachtrijVerwerking() {
|
|
84
84
|
try {
|
|
85
|
-
const {
|
|
86
|
-
await
|
|
85
|
+
const { vraagWachtrijRonde } = await import("./queueTickClient.js");
|
|
86
|
+
await vraagWachtrijRonde();
|
|
87
87
|
}
|
|
88
88
|
catch {
|
|
89
89
|
// Geen probleem: de cron of de printwachtrij-pagina pakt het op.
|
|
@@ -1,4 +1,13 @@
|
|
|
1
|
+
import type { SupabaseClient } from "@supabase/supabase-js";
|
|
1
2
|
type Job = Record<string, any>;
|
|
3
|
+
/** De databaseclient die de shell aanlevert. De module maakt er zelf nooit een. */
|
|
4
|
+
export type PrintDb = SupabaseClient<any, any, any>;
|
|
5
|
+
/**
|
|
6
|
+
* Goedkope controle of de aangeleverde client de printtabellen kan lezen.
|
|
7
|
+
* Vervangt de oude controle op omgevingsvariabelen: die kende de module niet
|
|
8
|
+
* meer nu de shell de client levert.
|
|
9
|
+
*/
|
|
10
|
+
export declare function controleerClient(db: PrintDb): Promise<string | null>;
|
|
2
11
|
type LayoutKeuze = {
|
|
3
12
|
layout: Job | null;
|
|
4
13
|
expliciet: boolean;
|
|
@@ -7,13 +16,13 @@ type LayoutKeuze = {
|
|
|
7
16
|
* Haalt een kant-en-klare PDF van de opdracht op (klantstickers, standaard
|
|
8
17
|
* Floriday-documenten). Die gaat ongewijzigd naar de printer.
|
|
9
18
|
*/
|
|
10
|
-
export declare function kantEnKlarePdf(job: Job): Promise<string | null>;
|
|
19
|
+
export declare function kantEnKlarePdf(_db: PrintDb, job: Job): Promise<string | null>;
|
|
11
20
|
/**
|
|
12
21
|
* Bouwt de HTML van de opdracht.
|
|
13
22
|
* Volgorde: gekoppelde layout wint > meegestuurde HTML > actieve layout van
|
|
14
23
|
* het documenttype. Zo werkt een bijgewerkte layout meteen door.
|
|
15
24
|
*/
|
|
16
|
-
export declare function bouwHtml(job: Job, keuze: LayoutKeuze): Promise<string>;
|
|
25
|
+
export declare function bouwHtml(db: PrintDb, job: Job, keuze: LayoutKeuze): Promise<string>;
|
|
17
26
|
/**
|
|
18
27
|
* Controleert of het document echt iets afdrukt. Zonder deze controle kan een
|
|
19
28
|
* lege layout of een opdracht zonder gegevens een blanco vel opleveren.
|
|
@@ -26,6 +35,6 @@ export interface WachtrijResultaat {
|
|
|
26
35
|
bijgewerkt: number;
|
|
27
36
|
}
|
|
28
37
|
/** Eén ronde: wachtende opdrachten afdrukken en statussen bijwerken. */
|
|
29
|
-
export declare function verwerkWachtrij(max?: number): Promise<WachtrijResultaat>;
|
|
38
|
+
export declare function verwerkWachtrij(db: PrintDb, max?: number): Promise<WachtrijResultaat>;
|
|
30
39
|
export {};
|
|
31
40
|
//# 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":"
|
|
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;AAc5D,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;AAeD,KAAK,WAAW,GAAG;IAAE,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC;AAqC9D;;;GAGG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA+BnF;AAqED;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAoHzF;AAGD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAY1D;AA6ID,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,wEAAwE;AACxE,wBAAsB,eAAe,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,SAAI,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAmBtF"}
|