@flowselections/layout-maker 1.69.19 → 1.69.23
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/FormaatOrientatieBar.d.ts.map +1 -1
- package/dist-lib/components/FormaatOrientatieBar.js +10 -7
- package/dist-lib/components/GeladenEtiketTab.d.ts.map +1 -1
- package/dist-lib/components/GeladenEtiketTab.js +3 -1
- package/dist-lib/components/InstelOverzichtKaart.d.ts +12 -0
- package/dist-lib/components/InstelOverzichtKaart.d.ts.map +1 -0
- package/dist-lib/components/InstelOverzichtKaart.js +78 -0
- package/dist-lib/components/KlaarOmTePrintenBlok.d.ts.map +1 -1
- package/dist-lib/components/KlaarOmTePrintenBlok.js +2 -1
- package/dist-lib/components/LayoutsPage.d.ts.map +1 -1
- package/dist-lib/components/LayoutsPage.js +29 -5
- package/dist-lib/components/PakbonBuilderPage.d.ts.map +1 -1
- package/dist-lib/components/PakbonBuilderPage.js +9 -1
- package/dist-lib/components/PrintersPage.d.ts.map +1 -1
- package/dist-lib/components/PrintersPage.js +3 -2
- package/dist-lib/components/PrintplekDetailPage.d.ts.map +1 -1
- package/dist-lib/components/PrintplekDetailPage.js +5 -9
- package/dist-lib/components/RolKeuze.d.ts +9 -0
- package/dist-lib/components/RolKeuze.d.ts.map +1 -0
- package/dist-lib/components/RolKeuze.js +91 -0
- package/dist-lib/components/StickerOntwerpPage.d.ts +4 -0
- package/dist-lib/components/StickerOntwerpPage.d.ts.map +1 -0
- package/dist-lib/components/StickerOntwerpPage.js +77 -0
- package/dist-lib/components/SysteemLayoutMelding.d.ts +1 -1
- package/dist-lib/components/SysteemLayoutMelding.d.ts.map +1 -1
- package/dist-lib/components/WerkplekConfiguratiePage.d.ts.map +1 -1
- package/dist-lib/components/WerkplekConfiguratiePage.js +15 -7
- package/dist-lib/index.d.ts +5 -0
- package/dist-lib/index.d.ts.map +1 -1
- package/dist-lib/index.js +5 -0
- package/dist-lib/integrations/supabase/types.d.ts +621 -120
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/directPrint.d.ts.map +1 -1
- package/dist-lib/lib/directPrint.js +19 -0
- package/dist-lib/lib/etiketRollen.d.ts +41 -0
- package/dist-lib/lib/etiketRollen.d.ts.map +1 -0
- package/dist-lib/lib/etiketRollen.js +64 -0
- package/dist-lib/lib/formaatWeergave.d.ts +24 -0
- package/dist-lib/lib/formaatWeergave.d.ts.map +1 -0
- package/dist-lib/lib/formaatWeergave.js +24 -0
- package/dist-lib/lib/instelOverzicht.d.ts +45 -0
- package/dist-lib/lib/instelOverzicht.d.ts.map +1 -0
- package/dist-lib/lib/instelOverzicht.js +106 -0
- package/dist-lib/lib/ontwerpKeuze.d.ts +80 -0
- package/dist-lib/lib/ontwerpKeuze.d.ts.map +1 -0
- package/dist-lib/lib/ontwerpKeuze.js +193 -0
- package/dist-lib/lib/pakbonBuilder.d.ts +6 -0
- package/dist-lib/lib/pakbonBuilder.d.ts.map +1 -1
- package/dist-lib/lib/pakbonBuilder.js +15 -0
- package/dist-lib/lib/pakbonContent.d.ts.map +1 -1
- package/dist-lib/lib/pakbonContent.js +2 -1
- package/dist-lib/lib/pakbonHtml.d.ts.map +1 -1
- package/dist-lib/lib/pakbonHtml.js +3 -1
- package/dist-lib/lib/pakbonPresentation.d.ts.map +1 -1
- package/dist-lib/lib/pakbonPresentation.js +3 -0
- package/dist-lib/lib/printQueue.server.d.ts +4 -0
- package/dist-lib/lib/printQueue.server.d.ts.map +1 -1
- package/dist-lib/lib/printQueue.server.js +274 -5
- package/dist-lib/lib/stickerOntwerp.d.ts +67 -0
- package/dist-lib/lib/stickerOntwerp.d.ts.map +1 -0
- package/dist-lib/lib/stickerOntwerp.js +109 -0
- package/dist-lib/lib/stickerRoute.d.ts +3 -0
- package/dist-lib/lib/stickerRoute.d.ts.map +1 -0
- package/dist-lib/lib/stickerRoute.js +5 -0
- package/dist-lib/lib/stickerUitwijk.d.ts +5 -0
- package/dist-lib/lib/stickerUitwijk.d.ts.map +1 -1
- package/dist-lib/lib/stickerUitwijk.js +12 -1
- package/dist-lib/lib/testpagina.d.ts +7 -1
- package/dist-lib/lib/testpagina.d.ts.map +1 -1
- package/dist-lib/lib/testpagina.js +39 -5
- package/dist-lib/lib/useNetwerkPrinters.d.ts +1 -0
- package/dist-lib/lib/useNetwerkPrinters.d.ts.map +1 -1
- package/dist-lib/lib/useNetwerkPrinters.js +11 -3
- package/dist-lib/lib/versie.generated.d.ts +1 -1
- package/dist-lib/lib/versie.generated.js +1 -1
- package/dist-lib/lib/voorbeeldPrint.d.ts.map +1 -1
- package/dist-lib/lib/voorbeeldPrint.js +53 -3
- package/dist-lib/lib/werkplekken.d.ts +5 -1
- package/dist-lib/lib/werkplekken.d.ts.map +1 -1
- package/dist-lib/lib/werkplekken.js +1 -1
- package/package.json +6 -1
- package/sql/print-schema.sql +320 -162
- package/sql/print-schema.verslag.md +5 -2
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// src/lib/stickerOntwerp.ts — stickerontwerp met velden (config.fs_sticker),
|
|
3
|
+
// voor de standaardontwerpen van Flow Selections en de stickerontwerper
|
|
4
|
+
// (1.69.20). Puur: geen database. Lege velden blijven leeg.
|
|
5
|
+
// ============================================================================
|
|
6
|
+
import { code128BarsHtml } from "./code128.js";
|
|
7
|
+
export const STICKER_VELDEN = [
|
|
8
|
+
{ veld: "logo", label: "Logo" },
|
|
9
|
+
{ veld: "bedrijfsnaam", label: "Bedrijfsnaam" },
|
|
10
|
+
{ veld: "klantnaam", label: "Klant" },
|
|
11
|
+
{ veld: "ordernummer", label: "Order" },
|
|
12
|
+
{ veld: "leverdatum", label: "Leverdatum" },
|
|
13
|
+
{ veld: "afleverlocatie", label: "Afleverlocatie" },
|
|
14
|
+
{ veld: "product", label: "Product" },
|
|
15
|
+
{ veld: "planten_per_fust", label: "Planten per fust" },
|
|
16
|
+
{ veld: "fust", label: "Fust x van y" },
|
|
17
|
+
{ veld: "barcode", label: "Barcode (Code128)" },
|
|
18
|
+
];
|
|
19
|
+
/** Velden per klasse (gelijk aan de standaardontwerpen in de database). */
|
|
20
|
+
export const VELDEN_PER_KLASSE = {
|
|
21
|
+
groot: ["logo", "bedrijfsnaam", "klantnaam", "ordernummer", "leverdatum", "afleverlocatie", "product", "planten_per_fust", "fust", "barcode"],
|
|
22
|
+
middel: ["klantnaam", "ordernummer", "leverdatum", "afleverlocatie", "product", "planten_per_fust", "fust", "barcode"],
|
|
23
|
+
klein: ["ordernummer", "klantnaam", "fust", "barcode"],
|
|
24
|
+
};
|
|
25
|
+
const obj = (v) => (v && typeof v === "object" && !Array.isArray(v) ? v : {});
|
|
26
|
+
const tekst = (v) => (v == null ? "" : String(v).trim());
|
|
27
|
+
const esc = (v) => tekst(v).replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
28
|
+
/** Leest config.fs_sticker; null als het geen stickerontwerp is. */
|
|
29
|
+
export function leesStickerOntwerp(cfg) {
|
|
30
|
+
const c = obj(obj(cfg)["fs_sticker"]);
|
|
31
|
+
if (!Object.keys(c).length)
|
|
32
|
+
return null;
|
|
33
|
+
const bekend = new Set(STICKER_VELDEN.map((v) => v.veld));
|
|
34
|
+
const velden = (Array.isArray(c["velden"]) ? c["velden"] : []).map(String).filter((v) => bekend.has(v));
|
|
35
|
+
const k = tekst(c["klasse"]);
|
|
36
|
+
return { klasse: k === "groot" || k === "middel" || k === "klein" ? k : null, velden };
|
|
37
|
+
}
|
|
38
|
+
/** Gegevens uit de opdracht (en eventueel de order); lege velden blijven leeg. */
|
|
39
|
+
export function stickerGegevens(payload, order = null) {
|
|
40
|
+
const p = obj(payload);
|
|
41
|
+
const o = obj(order);
|
|
42
|
+
const ok = obj(o["klant"]);
|
|
43
|
+
const eerst = (...v) => v.map(tekst).find(Boolean) ?? "";
|
|
44
|
+
const tray = Array.isArray(p["tray_producten"]) ? obj(p["tray_producten"][0]) : {};
|
|
45
|
+
const ordernummer = eerst(p["order_number"], p["ordernummer"], o["ordernummer"], o["order_number"]);
|
|
46
|
+
const fustNummer = eerst(p["tray_nummer"], p["fust_nummer"], p["fust_volgnummer"]);
|
|
47
|
+
const fustTotaal = eerst(p["tray_totaal"], p["fust_totaal"], p["fusten_totaal"]);
|
|
48
|
+
return {
|
|
49
|
+
klantnaam: eerst(p["klantnaam"], p["customer_name"], ok["naam"], o["klantnaam"]),
|
|
50
|
+
ordernummer,
|
|
51
|
+
leverdatum: eerst(p["leverdatum"], p["delivery_date"], o["leverdatum"], o["delivery_date"]),
|
|
52
|
+
afleverlocatie: eerst(p["afleverlocatie"], p["delivery_location"], o["afleverlocatie"]),
|
|
53
|
+
product: eerst(p["productnaam"], p["artikelnaam"], p["product"], tray["naam"], tray["productnaam"]),
|
|
54
|
+
planten_per_fust: eerst(p["planten_per_fust"], p["aantal_per_fust"], tray["aantal"]),
|
|
55
|
+
fust_nummer: fustNummer,
|
|
56
|
+
fust_totaal: fustTotaal,
|
|
57
|
+
barcode: eerst(p["barcode"], ordernummer && fustNummer ? `${ordernummer}-T${fustNummer}` : ordernummer),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/** Voorbeeldgegevens: geen echte order, geen echte namen. */
|
|
61
|
+
export const VOORBEELD_STICKER = {
|
|
62
|
+
klantnaam: "Voorbeeldklant",
|
|
63
|
+
ordernummer: "VOORBEELD-0001",
|
|
64
|
+
leverdatum: "01-01-2027",
|
|
65
|
+
afleverlocatie: "Voorbeeldlocatie",
|
|
66
|
+
product: "Voorbeeldplant 12 cm",
|
|
67
|
+
planten_per_fust: "10",
|
|
68
|
+
fust_nummer: "1",
|
|
69
|
+
fust_totaal: "2",
|
|
70
|
+
barcode: "VOORBEELD-0001-T1",
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* HTML van een stickerontwerp op een vaste maat (mm). Lettergrootte en
|
|
74
|
+
* barcodehoogte volgen de maat van het etiket; nooit buiten het etiket.
|
|
75
|
+
*/
|
|
76
|
+
export function stickerOntwerpHtml(g, velden, maat, bedrijf = {}) {
|
|
77
|
+
const aan = new Set(velden);
|
|
78
|
+
const b = maat.breedte_mm;
|
|
79
|
+
const h = maat.hoogte_mm;
|
|
80
|
+
const kort = Math.min(b, h);
|
|
81
|
+
const pt = kort <= 30 ? 6.5 : kort <= 40 ? 7.5 : kort <= 70 ? 8 : 10;
|
|
82
|
+
const bcHoogte = Math.max(5, Math.min(14, h * 0.28));
|
|
83
|
+
const regel = (label, w) => (w ? `<div class="r"><b>${label}</b> ${esc(w)}</div>` : "");
|
|
84
|
+
const delen = [];
|
|
85
|
+
const kop = [];
|
|
86
|
+
if (aan.has("logo") && bedrijf.logoSrc)
|
|
87
|
+
kop.push(`<img class="logo" src="${bedrijf.logoSrc}" alt="">`);
|
|
88
|
+
if (aan.has("bedrijfsnaam") && bedrijf.naam)
|
|
89
|
+
kop.push(`<span class="bn">${esc(bedrijf.naam)}</span>`);
|
|
90
|
+
if (kop.length)
|
|
91
|
+
delen.push(`<div class="kop">${kop.join("")}</div>`);
|
|
92
|
+
if (aan.has("ordernummer"))
|
|
93
|
+
delen.push(regel("Order", g.ordernummer));
|
|
94
|
+
if (aan.has("klantnaam"))
|
|
95
|
+
delen.push(regel("Klant", g.klantnaam));
|
|
96
|
+
if (aan.has("leverdatum"))
|
|
97
|
+
delen.push(regel("Levering", g.leverdatum));
|
|
98
|
+
if (aan.has("afleverlocatie"))
|
|
99
|
+
delen.push(regel("Locatie", g.afleverlocatie));
|
|
100
|
+
if (aan.has("product"))
|
|
101
|
+
delen.push(regel("Product", g.product));
|
|
102
|
+
if (aan.has("planten_per_fust"))
|
|
103
|
+
delen.push(regel("Per fust", g.planten_per_fust));
|
|
104
|
+
if (aan.has("fust") && (g.fust_nummer || g.fust_totaal))
|
|
105
|
+
delen.push(`<div class="fust">Fust ${esc(g.fust_nummer)} van ${esc(g.fust_totaal)}</div>`);
|
|
106
|
+
if (aan.has("barcode") && g.barcode)
|
|
107
|
+
delen.push(`<div class="bc">${code128BarsHtml(g.barcode)}</div><div class="bct">${esc(g.barcode)}</div>`);
|
|
108
|
+
return `<!doctype html><html><head><meta charset="utf-8"><style>@page{size:${b}mm ${h}mm;margin:0}html,body{margin:0;padding:0}body{width:${b}mm;height:${h}mm;box-sizing:border-box;padding:1.5mm 2mm;font:${pt}pt Arial,sans-serif;overflow:hidden;display:flex;flex-direction:column}.kop{display:flex;align-items:center;gap:2mm;margin-bottom:1mm}.logo{max-height:${Math.min(12, h * 0.12)}mm;max-width:35mm}.bn{font-weight:bold}.r{line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.fust{font-weight:bold;font-size:${pt + 2}pt;margin:0.5mm 0}.bc{display:flex;height:${bcHoogte}mm;margin-top:auto}.bct{text-align:center;font-size:${Math.max(5, pt - 1.5)}pt}</style></head><body>${delen.join("")}</body></html>`;
|
|
109
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stickerRoute.d.ts","sourceRoot":"","sources":["../../src/lib/stickerRoute.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,uBAAuB,sEAAuE,CAAC;AAE5G,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAEtF"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// src/lib/stickerRoute.ts — welke documentsoorten in de stickerontwerper openen (1.69.20).
|
|
2
|
+
export const STICKER_ONTWERP_SOORTEN = ["sticker", "traysticker", "eigen_sticker", "verzendlabel"];
|
|
3
|
+
export function isStickerOntwerpSoort(documenttype) {
|
|
4
|
+
return STICKER_ONTWERP_SOORTEN.includes(String(documenttype ?? ""));
|
|
5
|
+
}
|
|
@@ -86,6 +86,11 @@ export interface UitwijkUitkomst {
|
|
|
86
86
|
}
|
|
87
87
|
/** Tolerantie bij het herkennen van een papiermaat van de printer. */
|
|
88
88
|
export declare const PAPIER_TOLERANTIE_MM = 1;
|
|
89
|
+
/** 1.69.20: nooit verkleinen onder 95 % (barcode-leesbaarheid), ook niet bij een lagere opgeslagen waarde. */
|
|
90
|
+
export declare const MIN_VERKLEIN_PCT = 95;
|
|
91
|
+
export declare function effectieveOndergrens(opgeslagen: number): number;
|
|
92
|
+
/** Waarschuwing voor een opgeslagen waarde onder 95 % (de instelling zelf blijft ongewijzigd). */
|
|
93
|
+
export declare function ondergrensWaarschuwing(label: string, opgeslagen: number): string | null;
|
|
89
94
|
/** Papiernaam op afmeting (±1 mm, ook gedraaid) uit de PrintNode-lijst; null als er geen is. */
|
|
90
95
|
export declare function papierOpMaat(formaten: PrinterFormaten | null | undefined, b: number, h: number): string | null;
|
|
91
96
|
/** Nominale smalste streep van een Code128/veilingbarcode op ware grootte. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stickerUitwijk.d.ts","sourceRoot":"","sources":["../../src/lib/stickerUitwijk.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"stickerUitwijk.d.ts","sourceRoot":"","sources":["../../src/lib/stickerUitwijk.ts"],"names":[],"mappings":"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"}
|
|
@@ -104,6 +104,17 @@ export function velindelingVoor(b, h) {
|
|
|
104
104
|
}
|
|
105
105
|
/** Tolerantie bij het herkennen van een papiermaat van de printer. */
|
|
106
106
|
export const PAPIER_TOLERANTIE_MM = 1;
|
|
107
|
+
/** 1.69.20: nooit verkleinen onder 95 % (barcode-leesbaarheid), ook niet bij een lagere opgeslagen waarde. */
|
|
108
|
+
export const MIN_VERKLEIN_PCT = 95;
|
|
109
|
+
export function effectieveOndergrens(opgeslagen) {
|
|
110
|
+
return Math.max(Number(opgeslagen) || 0, MIN_VERKLEIN_PCT);
|
|
111
|
+
}
|
|
112
|
+
/** Waarschuwing voor een opgeslagen waarde onder 95 % (de instelling zelf blijft ongewijzigd). */
|
|
113
|
+
export function ondergrensWaarschuwing(label, opgeslagen) {
|
|
114
|
+
return Number(opgeslagen) < MIN_VERKLEIN_PCT
|
|
115
|
+
? `${label} staat op ${Math.round(Number(opgeslagen))} %, wordt ${MIN_VERKLEIN_PCT} % (barcode-leesbaarheid)`
|
|
116
|
+
: null;
|
|
117
|
+
}
|
|
107
118
|
/** Papiernaam op afmeting (±1 mm, ook gedraaid) uit de PrintNode-lijst; null als er geen is. */
|
|
108
119
|
export function papierOpMaat(formaten, b, h) {
|
|
109
120
|
if (!formaten || typeof formaten !== "object" || Array.isArray(formaten))
|
|
@@ -190,7 +201,7 @@ export function kiesUitwijkroute(input) {
|
|
|
190
201
|
// 3b. verkleinen, verhouding gelijk, nooit uitrekken
|
|
191
202
|
const schaal = Math.min(eb / b, eh / h, 1);
|
|
192
203
|
const pct = Math.round(schaal * 100);
|
|
193
|
-
if (schaal * 100 >= input.instelling.ondergrens_pct - 1e-9 && (input.heeftBarcode === false || barcodeLeesbaar(schaal, e.dpi))) {
|
|
204
|
+
if (schaal * 100 >= effectieveOndergrens(input.instelling.ondergrens_pct) - 1e-9 && (input.heeftBarcode === false || barcodeLeesbaar(schaal, e.dpi))) {
|
|
194
205
|
kleiner.push({ afwijking: 1 - schaal, u: uit(e, "verkleind", Math.round(schaal * 100) / 100, rot, `Geprint op ${maat(e.breedte_mm, e.hoogte_mm)} in plaats van ${st}, verkleind tot ${pct}%`) });
|
|
195
206
|
}
|
|
196
207
|
}
|
|
@@ -1,2 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
/** HTML van de testpagina op een rol van b × h mm (puur, voor tests). */
|
|
2
|
+
export declare function testpaginaRolHtml(printerNaam: string, rol: {
|
|
3
|
+
naam: string;
|
|
4
|
+
breedte_mm: number;
|
|
5
|
+
hoogte_mm: number;
|
|
6
|
+
}, datum: string): string;
|
|
7
|
+
export declare function drukTestpaginaAf(printerId: string, naam: string): Promise<boolean>;
|
|
2
8
|
//# sourceMappingURL=testpagina.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testpagina.d.ts","sourceRoot":"","sources":["../../src/lib/testpagina.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"testpagina.d.ts","sourceRoot":"","sources":["../../src/lib/testpagina.ts"],"names":[],"mappings":"AAkBA,yEAAyE;AACzE,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAO1I;AAED,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA0CxF"}
|
|
@@ -2,23 +2,55 @@
|
|
|
2
2
|
// src/lib/testpagina.ts — een testpagina naar een printer sturen.
|
|
3
3
|
// Loopt via de printwachtrij, net als echte documenten, zodat ook het
|
|
4
4
|
// papierformaat en de stand worden getest.
|
|
5
|
+
// 1.69.20: op een labelprinter met ingestelde rol is de testpagina zo groot
|
|
6
|
+
// als de rol (printernaam, rol, datum, randkader, Code128-testbarcode). Zonder
|
|
7
|
+
// rol: A4 (gewone printer).
|
|
5
8
|
// ============================================================================
|
|
6
9
|
import { toast } from "@flowselections/core";
|
|
7
10
|
import { printHtml, volgJobStatus } from "./printApi.js";
|
|
11
|
+
import { supabase } from "./supabaseClient.js";
|
|
12
|
+
import { code128BarsHtml } from "./code128.js";
|
|
13
|
+
import { leesGeladenEtiket } from "./etiketControle.js";
|
|
14
|
+
const esc = (v) => v.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
15
|
+
const nl = (n) => String(Math.round(n * 10) / 10).replace(".", ",");
|
|
16
|
+
/** HTML van de testpagina op een rol van b × h mm (puur, voor tests). */
|
|
17
|
+
export function testpaginaRolHtml(printerNaam, rol, datum) {
|
|
18
|
+
const b = rol.breedte_mm;
|
|
19
|
+
const h = rol.hoogte_mm;
|
|
20
|
+
const kort = Math.min(b, h);
|
|
21
|
+
const pt = kort <= 30 ? 6 : kort <= 45 ? 7 : 9;
|
|
22
|
+
const bc = Math.max(4, Math.min(12, h * 0.3));
|
|
23
|
+
return `<!doctype html><html><head><meta charset="utf-8"><style>@page{size:${b}mm ${h}mm;margin:0}html,body{margin:0;padding:0}body{width:${b}mm;height:${h}mm;box-sizing:border-box;border:0.4mm solid #000;padding:1mm 1.5mm;font:${pt}pt Arial,sans-serif;overflow:hidden;display:flex;flex-direction:column}.t{font-weight:bold}.bc{display:flex;height:${bc}mm;margin-top:auto}</style></head><body><div class="t">Testpagina · ${esc(printerNaam)}</div><div>Rol: ${esc(rol.naam)} (${nl(b)} × ${nl(h)} mm)</div><div>${esc(datum)}</div><div class="bc">${code128BarsHtml("TEST-128")}</div></body></html>`;
|
|
24
|
+
}
|
|
8
25
|
export async function drukTestpaginaAf(printerId, naam) {
|
|
9
|
-
|
|
26
|
+
let rol = null;
|
|
27
|
+
try {
|
|
28
|
+
const { data } = await supabase.from("printers").select("geladen_etiket").eq("id", printerId).maybeSingle();
|
|
29
|
+
rol = leesGeladenEtiket(data?.geladen_etiket);
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
rol = null;
|
|
33
|
+
}
|
|
34
|
+
const datum = new Date().toLocaleString("nl-NL");
|
|
35
|
+
const html = rol
|
|
36
|
+
? testpaginaRolHtml(naam, rol, datum)
|
|
37
|
+
: `<div style="padding:15mm;font-family:Arial,Helvetica,sans-serif;font-size:12pt">
|
|
10
38
|
<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
|
-
<p style="margin:0">${
|
|
39
|
+
<p style="margin:0 0 3mm">Deze pagina hoort uit: <strong>${esc(naam)}</strong></p>
|
|
40
|
+
<p style="margin:0">${datum}</p></div>`;
|
|
13
41
|
try {
|
|
14
42
|
const { jobId } = await printHtml({
|
|
15
43
|
documenttype: "vrij",
|
|
16
44
|
documentnaam: "Testpagina",
|
|
17
45
|
html,
|
|
18
46
|
printerId,
|
|
19
|
-
payload: {
|
|
47
|
+
payload: {
|
|
48
|
+
is_testpagina: true,
|
|
49
|
+
test_id: `testpagina-${Date.now()}`,
|
|
50
|
+
...(rol ? { voorbeeld_formaat: { breedte_mm: rol.breedte_mm, hoogte_mm: rol.hoogte_mm, orientatie: "portrait", marge_boven: 0 } } : {}),
|
|
51
|
+
},
|
|
20
52
|
});
|
|
21
|
-
toast.success(`Testpagina
|
|
53
|
+
toast.success(`Testpagina in de wachtrij gezet voor ${naam}${rol ? ` (rol ${nl(rol.breedte_mm)} × ${nl(rol.hoogte_mm)} mm)` : " (A4)"}`);
|
|
22
54
|
const stop = volgJobStatus(jobId, (st) => {
|
|
23
55
|
if (st.status === "mislukt") {
|
|
24
56
|
toast.error(st.foutmelding ?? `De testpagina op ${naam} is mislukt`);
|
|
@@ -29,8 +61,10 @@ export async function drukTestpaginaAf(printerId, naam) {
|
|
|
29
61
|
}
|
|
30
62
|
});
|
|
31
63
|
setTimeout(() => stop(), 60000);
|
|
64
|
+
return true;
|
|
32
65
|
}
|
|
33
66
|
catch (e) {
|
|
34
67
|
toast.error(e instanceof Error ? e.message : "De testpagina kon niet worden afgedrukt");
|
|
68
|
+
return false;
|
|
35
69
|
}
|
|
36
70
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useNetwerkPrinters.d.ts","sourceRoot":"","sources":["../../src/lib/useNetwerkPrinters.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,kBAAkB
|
|
1
|
+
{"version":3,"file":"useNetwerkPrinters.d.ts","sourceRoot":"","sources":["../../src/lib/useNetwerkPrinters.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,kBAAkB;;;;;EA6BjC"}
|
|
@@ -6,14 +6,22 @@ import { netwerkPrinters } from "./printService.functions.js";
|
|
|
6
6
|
export function useNetwerkPrinters() {
|
|
7
7
|
const [gevonden, setGevonden] = useState([]);
|
|
8
8
|
const [bezig, setBezig] = useState(false);
|
|
9
|
+
/** true zodra er één keer een lijst van PrintNode is gekomen. */
|
|
10
|
+
const [geladen, setGeladen] = useState(false);
|
|
11
|
+
// 1.69.20: een mislukte of lege tussentijdse ronde wist de vorige lijst niet
|
|
12
|
+
// meer. Anders sprong de werkplektelling tussen "0 ingesteld · 7 nog
|
|
13
|
+
// beschikbaar" (geen lijst) en "5 ingesteld · 2 nog beschikbaar".
|
|
9
14
|
const zoek = useCallback(async () => {
|
|
10
15
|
setBezig(true);
|
|
11
16
|
try {
|
|
12
17
|
const res = await netwerkPrinters({ data: undefined });
|
|
13
|
-
|
|
18
|
+
if (res.ok && Array.isArray(res.printers)) {
|
|
19
|
+
setGevonden(res.printers);
|
|
20
|
+
setGeladen(true);
|
|
21
|
+
}
|
|
14
22
|
}
|
|
15
23
|
catch {
|
|
16
|
-
|
|
24
|
+
// vorige lijst laten staan
|
|
17
25
|
}
|
|
18
26
|
finally {
|
|
19
27
|
setBezig(false);
|
|
@@ -22,5 +30,5 @@ export function useNetwerkPrinters() {
|
|
|
22
30
|
useEffect(() => {
|
|
23
31
|
void zoek();
|
|
24
32
|
}, [zoek]);
|
|
25
|
-
return { gevonden, bezig, zoek };
|
|
33
|
+
return { gevonden, bezig, zoek, geladen };
|
|
26
34
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const PAKKET_VERSIE = "1.69.
|
|
1
|
+
export declare const PAKKET_VERSIE = "1.69.23";
|
|
2
2
|
//# sourceMappingURL=versie.generated.d.ts.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// Gegenereerd door scripts/schrijf-versie.cjs uit package.json. Niet met de hand wijzigen.
|
|
2
|
-
export const PAKKET_VERSIE = "1.69.
|
|
2
|
+
export const PAKKET_VERSIE = "1.69.23";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"voorbeeldPrint.d.ts","sourceRoot":"","sources":["../../src/lib/voorbeeldPrint.ts"],"names":[],"mappings":"AAQA,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"voorbeeldPrint.d.ts","sourceRoot":"","sources":["../../src/lib/voorbeeldPrint.ts"],"names":[],"mappings":"AAQA,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,YAAY,CAAC;AAQpB,MAAM,WAAW,eAAe;IAC9B,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,wFAAwF;AACxF,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,WAAW,CAAC,EAAE,MAAM,GACnB,cAAc,CAwBhB;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkFzF"}
|
|
@@ -6,6 +6,11 @@
|
|
|
6
6
|
// ============================================================================
|
|
7
7
|
import { toast } from "@flowselections/core";
|
|
8
8
|
import { printHtml, printerVoorLayout, volgJobStatus, } from "./printApi.js";
|
|
9
|
+
import { supabase } from "./supabaseClient.js";
|
|
10
|
+
import { leesGeladenEtiket } from "./etiketControle.js";
|
|
11
|
+
import { afdrukMaat } from "./formaatWeergave.js";
|
|
12
|
+
import { kiesOntwerpEnPrinter, maatNl } from "./ontwerpKeuze.js";
|
|
13
|
+
const STICKER_ACHTIG = new Set(["sticker", "traysticker", "eigen_sticker", "verzendlabel"]);
|
|
9
14
|
/** Pure opbouw van de opdracht, zodat printplekdoorgifte regressiegetest kan worden. */
|
|
10
15
|
export function bouwVoorbeeldPrintInvoer(layout, html, printerId, printplekId) {
|
|
11
16
|
const documenttype = String(layout.documenttype ?? "pakbon");
|
|
@@ -39,14 +44,59 @@ export function bouwVoorbeeldPrintInvoer(layout, html, printerId, printplekId) {
|
|
|
39
44
|
export async function voorbeeldPrint(layout, html) {
|
|
40
45
|
const documenttype = String(layout.documenttype ?? "pakbon");
|
|
41
46
|
const naam = layout.naam ?? documenttype;
|
|
42
|
-
|
|
47
|
+
let printerId = await printerVoorLayout(layout);
|
|
48
|
+
// 1.69.20: een sticker-achtig ontwerp gaat naar een printer waarop het past
|
|
49
|
+
// (zelfde keuzeregel als de wachtrij). Past het nergens, dan zegt de melding dat.
|
|
50
|
+
if (STICKER_ACHTIG.has(documenttype)) {
|
|
51
|
+
const { data } = await supabase
|
|
52
|
+
.from("printers")
|
|
53
|
+
.select("id, naam, weergavenaam, actief, extern_printer_id, geladen_etiket")
|
|
54
|
+
.not("geladen_etiket", "is", null);
|
|
55
|
+
const rijen = (Array.isArray(data) ? data : []);
|
|
56
|
+
const printers = rijen
|
|
57
|
+
.filter((p) => p["actief"] !== false && p["extern_printer_id"])
|
|
58
|
+
.map((p) => {
|
|
59
|
+
const e = leesGeladenEtiket(p["geladen_etiket"]);
|
|
60
|
+
return { id: String(p["id"]), naam: String(p["weergavenaam"] || p["naam"] || "Printer"), breedte_mm: e?.breedte_mm ?? null, hoogte_mm: e?.hoogte_mm ?? null };
|
|
61
|
+
})
|
|
62
|
+
.sort((a, b) => (a.id === printerId ? -1 : b.id === printerId ? 1 : a.naam.localeCompare(b.naam)));
|
|
63
|
+
const m = afdrukMaat(layout);
|
|
64
|
+
const k = kiesOntwerpEnPrinter({
|
|
65
|
+
documentLabel: naam,
|
|
66
|
+
klant: { id: layout.id ?? null, naam, breedte_mm: m.breedte_mm, hoogte_mm: m.hoogte_mm, herkomst: "klant" },
|
|
67
|
+
kweker: [],
|
|
68
|
+
standaard: [],
|
|
69
|
+
printers,
|
|
70
|
+
a4Printer: null,
|
|
71
|
+
a4Terugval: false,
|
|
72
|
+
vastFormaat: true,
|
|
73
|
+
});
|
|
74
|
+
if (!k.printer) {
|
|
75
|
+
toast.error(`Voorbeeld niet geprint: ${naam} (${maatNl(m.breedte_mm, m.hoogte_mm)}) past op geen labelprinter. Rollen: ${printers.filter((p) => p.breedte_mm && p.hoogte_mm).map((p) => `${p.naam} (${maatNl(p.breedte_mm, p.hoogte_mm)})`).join(", ") || "geen ingesteld"}.`);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
printerId = k.printer.id;
|
|
79
|
+
}
|
|
43
80
|
if (!printerId) {
|
|
44
81
|
toast.error(`Nog geen printer gekoppeld aan ${naam} — stel dit in bij Printen > Standaardregels.`);
|
|
45
82
|
return;
|
|
46
83
|
}
|
|
47
84
|
const printplekId = undefined;
|
|
48
|
-
|
|
49
|
-
|
|
85
|
+
let jobId;
|
|
86
|
+
try {
|
|
87
|
+
({ jobId } = await printHtml(bouwVoorbeeldPrintInvoer(layout, html, printerId, printplekId)));
|
|
88
|
+
}
|
|
89
|
+
catch (e) {
|
|
90
|
+
toast.error(`Voorbeeld niet geprint: ${e instanceof Error ? e.message : "er is geen printopdracht gemaakt"}`);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
// Nooit "verstuurd" zonder opdracht: lees de opdracht terug.
|
|
94
|
+
const { data: rij } = await supabase.from("print_jobs").select("id").eq("id", jobId).maybeSingle();
|
|
95
|
+
if (!rij) {
|
|
96
|
+
toast.error("Voorbeeld niet geprint: er is geen printopdracht gemaakt. Probeer het opnieuw of kijk in de printwachtrij.");
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
toast.success("Voorbeeld in de printwachtrij gezet");
|
|
50
100
|
let afgerond = false;
|
|
51
101
|
const stop = volgJobStatus(jobId, (s) => {
|
|
52
102
|
if (s.status === "klaar" || s.status === "voltooid") {
|
|
@@ -27,6 +27,10 @@ export interface PrinterRij {
|
|
|
27
27
|
ondersteunde_formaten: Record<string, number[]> | null;
|
|
28
28
|
geladen_etiket: GeladenEtiket | null;
|
|
29
29
|
soort?: string | null;
|
|
30
|
+
rol_id?: string | null;
|
|
31
|
+
rol_invoerrichting?: string | null;
|
|
32
|
+
rol_marge_mm?: number | null;
|
|
33
|
+
rol_doorlopend?: boolean | null;
|
|
30
34
|
}
|
|
31
35
|
export declare const isVirtuelePrinter: (naam: string | null | undefined) => boolean;
|
|
32
36
|
/** De naam die we tonen: eigen naam van de beheerder, anders de technische. */
|
|
@@ -50,7 +54,7 @@ export declare function usePrinterLijst(): {
|
|
|
50
54
|
printers: PrinterRij[];
|
|
51
55
|
reload: () => Promise<void>;
|
|
52
56
|
};
|
|
53
|
-
export declare function zetPrinterVelden(id: string, velden: Partial<Pick<PrinterRij, "weergavenaam" | "verborgen" | "is_virtueel" | "geladen_etiket">>): Promise<void>;
|
|
57
|
+
export declare function zetPrinterVelden(id: string, velden: Partial<Pick<PrinterRij, "weergavenaam" | "verborgen" | "is_virtueel" | "geladen_etiket" | "rol_id" | "rol_invoerrichting" | "rol_marge_mm" | "rol_doorlopend">>): Promise<void>;
|
|
54
58
|
/** Werkplek van de ingelogde gebruiker (Afhandeling, Facturen…); null = nog niet gekozen. */
|
|
55
59
|
export declare function mijnWerkplekId(): Promise<string | null>;
|
|
56
60
|
export declare function kiesMijnWerkplek(werkplek_id: string): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"werkplekken.d.ts","sourceRoot":"","sources":["../../src/lib/werkplekken.ts"],"names":[],"mappings":"AASA,OAAO,EAAqB,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAMzE,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;IACvD,cAAc,EAAE,aAAa,GAAG,IAAI,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"werkplekken.d.ts","sourceRoot":"","sources":["../../src/lib/werkplekken.ts"],"names":[],"mappings":"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"}
|
|
@@ -87,7 +87,7 @@ export function usePrinterLijst() {
|
|
|
87
87
|
const load = useCallback(async () => {
|
|
88
88
|
const { data } = await db
|
|
89
89
|
.from("printers")
|
|
90
|
-
.select("id, naam, weergavenaam, systeemnaam, locatie, online, actief, verborgen, is_virtueel, extern_printer_id, ondersteunde_formaten, geladen_etiket, soort")
|
|
90
|
+
.select("id, naam, weergavenaam, systeemnaam, locatie, online, actief, verborgen, is_virtueel, extern_printer_id, ondersteunde_formaten, geladen_etiket, soort, rol_id, rol_invoerrichting, rol_marge_mm, rol_doorlopend")
|
|
91
91
|
.order("naam");
|
|
92
92
|
setPrinters(arr(data).map((p) => ({
|
|
93
93
|
...p,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flowselections/layout-maker",
|
|
3
|
-
"version": "1.69.
|
|
3
|
+
"version": "1.69.23",
|
|
4
4
|
"flowselections": {
|
|
5
5
|
"moduleId": "layout-maker",
|
|
6
6
|
"pages": [
|
|
@@ -34,6 +34,11 @@
|
|
|
34
34
|
"route": "layouts-printers/pakbon/$layoutId",
|
|
35
35
|
"title": "Pakbon opbouw"
|
|
36
36
|
},
|
|
37
|
+
{
|
|
38
|
+
"export": "StickerOntwerpPage",
|
|
39
|
+
"route": "layouts-printers/sticker/$layoutId",
|
|
40
|
+
"title": "Stickerontwerp"
|
|
41
|
+
},
|
|
37
42
|
{
|
|
38
43
|
"export": "AfleverbriefBuilderPage",
|
|
39
44
|
"route": "layouts-printers/afleverbrief/$layoutId",
|