@flowselections/layout-maker 1.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/README.md +24 -0
  2. package/dist-lib/_core-safelist.d.ts +2 -0
  3. package/dist-lib/_core-safelist.d.ts.map +1 -0
  4. package/dist-lib/_core-safelist.js +18 -0
  5. package/dist-lib/components/AfdrukKnop.d.ts +13 -0
  6. package/dist-lib/components/AfdrukKnop.d.ts.map +1 -0
  7. package/dist-lib/components/AfdrukKnop.js +38 -0
  8. package/dist-lib/components/AiLayoutImportDialog.d.ts +6 -0
  9. package/dist-lib/components/AiLayoutImportDialog.d.ts.map +1 -0
  10. package/dist-lib/components/AiLayoutImportDialog.js +133 -0
  11. package/dist-lib/components/BlokOntwerperPage.d.ts +5 -0
  12. package/dist-lib/components/BlokOntwerperPage.d.ts.map +1 -0
  13. package/dist-lib/components/BlokOntwerperPage.js +67 -0
  14. package/dist-lib/components/DocumentSettingsPanel.d.ts +13 -0
  15. package/dist-lib/components/DocumentSettingsPanel.d.ts.map +1 -0
  16. package/dist-lib/components/DocumentSettingsPanel.js +65 -0
  17. package/dist-lib/components/FormaatOrientatieBar.d.ts +10 -0
  18. package/dist-lib/components/FormaatOrientatieBar.d.ts.map +1 -0
  19. package/dist-lib/components/FormaatOrientatieBar.js +51 -0
  20. package/dist-lib/components/LayoutsPage.d.ts +2 -0
  21. package/dist-lib/components/LayoutsPage.d.ts.map +1 -0
  22. package/dist-lib/components/LayoutsPage.js +196 -0
  23. package/dist-lib/components/LogoBibliotheekDialog.d.ts +7 -0
  24. package/dist-lib/components/LogoBibliotheekDialog.d.ts.map +1 -0
  25. package/dist-lib/components/LogoBibliotheekDialog.js +27 -0
  26. package/dist-lib/components/LogosPage.d.ts +7 -0
  27. package/dist-lib/components/LogosPage.d.ts.map +1 -0
  28. package/dist-lib/components/LogosPage.js +131 -0
  29. package/dist-lib/components/PaginaDocument.d.ts +22 -0
  30. package/dist-lib/components/PaginaDocument.d.ts.map +1 -0
  31. package/dist-lib/components/PaginaDocument.js +80 -0
  32. package/dist-lib/components/PakbonBuilderPage.d.ts +5 -0
  33. package/dist-lib/components/PakbonBuilderPage.d.ts.map +1 -0
  34. package/dist-lib/components/PakbonBuilderPage.js +69 -0
  35. package/dist-lib/components/PakbonPreview.d.ts +13 -0
  36. package/dist-lib/components/PakbonPreview.d.ts.map +1 -0
  37. package/dist-lib/components/PakbonPreview.js +423 -0
  38. package/dist-lib/components/PakbonSectiesPanel.d.ts +18 -0
  39. package/dist-lib/components/PakbonSectiesPanel.d.ts.map +1 -0
  40. package/dist-lib/components/PakbonSectiesPanel.js +156 -0
  41. package/dist-lib/components/PreviewFit.d.ts +9 -0
  42. package/dist-lib/components/PreviewFit.d.ts.map +1 -0
  43. package/dist-lib/components/PreviewFit.js +38 -0
  44. package/dist-lib/components/PrintQueuePage.d.ts +2 -0
  45. package/dist-lib/components/PrintQueuePage.d.ts.map +1 -0
  46. package/dist-lib/components/PrintQueuePage.js +59 -0
  47. package/dist-lib/components/PrinterSetupWizard.d.ts +6 -0
  48. package/dist-lib/components/PrinterSetupWizard.d.ts.map +1 -0
  49. package/dist-lib/components/PrinterSetupWizard.js +119 -0
  50. package/dist-lib/components/PrintersPage.d.ts +2 -0
  51. package/dist-lib/components/PrintersPage.d.ts.map +1 -0
  52. package/dist-lib/components/PrintersPage.js +60 -0
  53. package/dist-lib/components/ProductiebonBlokkenPanel.d.ts +7 -0
  54. package/dist-lib/components/ProductiebonBlokkenPanel.d.ts.map +1 -0
  55. package/dist-lib/components/ProductiebonBlokkenPanel.js +85 -0
  56. package/dist-lib/components/ProductiebonBuilderPage.d.ts +5 -0
  57. package/dist-lib/components/ProductiebonBuilderPage.d.ts.map +1 -0
  58. package/dist-lib/components/ProductiebonBuilderPage.js +48 -0
  59. package/dist-lib/components/ProductiebonPreview.d.ts +12 -0
  60. package/dist-lib/components/ProductiebonPreview.d.ts.map +1 -0
  61. package/dist-lib/components/ProductiebonPreview.js +237 -0
  62. package/dist-lib/components/TemplateModuleLogo.d.ts +6 -0
  63. package/dist-lib/components/TemplateModuleLogo.d.ts.map +1 -0
  64. package/dist-lib/components/TemplateModuleLogo.js +4 -0
  65. package/dist-lib/components/settings/MijnModuleSettingsCard.d.ts +2 -0
  66. package/dist-lib/components/settings/MijnModuleSettingsCard.d.ts.map +1 -0
  67. package/dist-lib/components/settings/MijnModuleSettingsCard.js +42 -0
  68. package/dist-lib/hooks/useMijnModuleData.d.ts +13 -0
  69. package/dist-lib/hooks/useMijnModuleData.d.ts.map +1 -0
  70. package/dist-lib/hooks/useMijnModuleData.js +49 -0
  71. package/dist-lib/index.d.ts +38 -0
  72. package/dist-lib/index.d.ts.map +1 -0
  73. package/dist-lib/index.js +56 -0
  74. package/dist-lib/integrations/supabase/auth-attacher.d.ts +2 -0
  75. package/dist-lib/integrations/supabase/auth-attacher.d.ts.map +1 -0
  76. package/dist-lib/integrations/supabase/auth-attacher.js +12 -0
  77. package/dist-lib/integrations/supabase/auth-middleware.d.ts +19847 -0
  78. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -0
  79. package/dist-lib/integrations/supabase/auth-middleware.js +52 -0
  80. package/dist-lib/integrations/supabase/client.d.ts +2 -0
  81. package/dist-lib/integrations/supabase/client.d.ts.map +1 -0
  82. package/dist-lib/integrations/supabase/client.js +3 -0
  83. package/dist-lib/integrations/supabase/client.server.d.ts +19843 -0
  84. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -0
  85. package/dist-lib/integrations/supabase/client.server.js +30 -0
  86. package/dist-lib/integrations/supabase/types.d.ts +20423 -0
  87. package/dist-lib/integrations/supabase/types.d.ts.map +1 -0
  88. package/dist-lib/integrations/supabase/types.js +78 -0
  89. package/dist-lib/lib/aiLayout.functions.d.ts +19864 -0
  90. package/dist-lib/lib/aiLayout.functions.d.ts.map +1 -0
  91. package/dist-lib/lib/aiLayout.functions.js +28 -0
  92. package/dist-lib/lib/aiLayout.server.d.ts +14 -0
  93. package/dist-lib/lib/aiLayout.server.d.ts.map +1 -0
  94. package/dist-lib/lib/aiLayout.server.js +197 -0
  95. package/dist-lib/lib/browserPrint.d.ts +38 -0
  96. package/dist-lib/lib/browserPrint.d.ts.map +1 -0
  97. package/dist-lib/lib/browserPrint.js +104 -0
  98. package/dist-lib/lib/documentProfiles.d.ts +50 -0
  99. package/dist-lib/lib/documentProfiles.d.ts.map +1 -0
  100. package/dist-lib/lib/documentProfiles.js +458 -0
  101. package/dist-lib/lib/documentTypes.d.ts +123 -0
  102. package/dist-lib/lib/documentTypes.d.ts.map +1 -0
  103. package/dist-lib/lib/documentTypes.js +74 -0
  104. package/dist-lib/lib/fieldRegistry.d.ts +20 -0
  105. package/dist-lib/lib/fieldRegistry.d.ts.map +1 -0
  106. package/dist-lib/lib/fieldRegistry.js +123 -0
  107. package/dist-lib/lib/formaatPrinters.d.ts +14 -0
  108. package/dist-lib/lib/formaatPrinters.d.ts.map +1 -0
  109. package/dist-lib/lib/formaatPrinters.js +39 -0
  110. package/dist-lib/lib/layoutPreview.d.ts +18 -0
  111. package/dist-lib/lib/layoutPreview.d.ts.map +1 -0
  112. package/dist-lib/lib/layoutPreview.js +134 -0
  113. package/dist-lib/lib/logoLibrary.d.ts +80 -0
  114. package/dist-lib/lib/logoLibrary.d.ts.map +1 -0
  115. package/dist-lib/lib/logoLibrary.js +264 -0
  116. package/dist-lib/lib/pakbonBuilder.d.ts +210 -0
  117. package/dist-lib/lib/pakbonBuilder.d.ts.map +1 -0
  118. package/dist-lib/lib/pakbonBuilder.js +910 -0
  119. package/dist-lib/lib/pakbonHtml.d.ts +48 -0
  120. package/dist-lib/lib/pakbonHtml.d.ts.map +1 -0
  121. package/dist-lib/lib/pakbonHtml.js +754 -0
  122. package/dist-lib/lib/printApi.d.ts +45 -0
  123. package/dist-lib/lib/printApi.d.ts.map +1 -0
  124. package/dist-lib/lib/printApi.js +98 -0
  125. package/dist-lib/lib/productiebonBuilder.d.ts +137 -0
  126. package/dist-lib/lib/productiebonBuilder.d.ts.map +1 -0
  127. package/dist-lib/lib/productiebonBuilder.js +661 -0
  128. package/dist-lib/lib/supabaseClient.d.ts +4 -0
  129. package/dist-lib/lib/supabaseClient.d.ts.map +1 -0
  130. package/dist-lib/lib/supabaseClient.js +10 -0
  131. package/dist-lib/lib/useDocumentData.d.ts +97 -0
  132. package/dist-lib/lib/useDocumentData.d.ts.map +1 -0
  133. package/dist-lib/lib/useDocumentData.js +286 -0
  134. package/dist-lib/lib/useLayoutIdParam.d.ts +7 -0
  135. package/dist-lib/lib/useLayoutIdParam.d.ts.map +1 -0
  136. package/dist-lib/lib/useLayoutIdParam.js +10 -0
  137. package/dist-lib/lib/utils.d.ts +3 -0
  138. package/dist-lib/lib/utils.d.ts.map +1 -0
  139. package/dist-lib/lib/utils.js +5 -0
  140. package/dist-lib/lib/validationSchemas.d.ts +15 -0
  141. package/dist-lib/lib/validationSchemas.d.ts.map +1 -0
  142. package/dist-lib/lib/validationSchemas.js +25 -0
  143. package/dist-lib/styles.css +1 -0
  144. package/package.json +117 -0
  145. package/public/logo.png +0 -0
@@ -0,0 +1,264 @@
1
+ // ============================================================================
2
+ // src/lib/logoLibrary.ts — centrale Logo Bibliotheek
3
+ // ============================================================================
4
+ import { useCallback, useEffect, useState } from "react";
5
+ import { supabase } from "./supabaseClient";
6
+ export const LOGO_BUCKET = "layout-logos";
7
+ export const LOGO_CATEGORIEEN = [
8
+ { value: "hoofdlogo", label: "Hoofdlogo" },
9
+ { value: "facturen", label: "Facturen" },
10
+ { value: "merken", label: "Merken" },
11
+ { value: "labels", label: "Labels" },
12
+ { value: "klanten", label: "Klanten" },
13
+ { value: "overig", label: "Overig" },
14
+ ];
15
+ export function logoCategorieLabel(v) {
16
+ return LOGO_CATEGORIEEN.find((c) => c.value === v)?.label ?? v;
17
+ }
18
+ const arr = (v) => (Array.isArray(v) ? v : []);
19
+ export const TOEGESTANE_LOGO_TYPES = ["image/svg+xml", "image/png", "image/jpeg", "image/webp"];
20
+ export function bestandstypeVan(file) {
21
+ const map = {
22
+ "image/svg+xml": "svg",
23
+ "image/png": "png",
24
+ "image/jpeg": "jpg",
25
+ "image/webp": "webp",
26
+ };
27
+ return map[file.type] ?? (file.name.split(".").pop() ?? "png").toLowerCase();
28
+ }
29
+ export async function bestandHash(file) {
30
+ const buf = await file.arrayBuffer();
31
+ const digest = await crypto.subtle.digest("SHA-256", buf);
32
+ return Array.from(new Uint8Array(digest))
33
+ .map((b) => b.toString(16).padStart(2, "0"))
34
+ .join("");
35
+ }
36
+ export async function leesAfmetingen(file) {
37
+ if (file.type === "image/svg+xml") {
38
+ const tekst = await file.text();
39
+ const w = /width="([\d.]+)/.exec(tekst)?.[1];
40
+ const h = /height="([\d.]+)/.exec(tekst)?.[1];
41
+ const vb = /viewBox="[\d.\s-]*?([\d.]+)\s+([\d.]+)"/.exec(tekst);
42
+ return {
43
+ breedte: Math.round(Number(w ?? vb?.[1] ?? 0)),
44
+ hoogte: Math.round(Number(h ?? vb?.[2] ?? 0)),
45
+ transparant: true,
46
+ };
47
+ }
48
+ const url = URL.createObjectURL(file);
49
+ try {
50
+ const img = await new Promise((resolve, reject) => {
51
+ const i = new Image();
52
+ i.onload = () => resolve(i);
53
+ i.onerror = () => reject(new Error("Afbeelding kon niet worden gelezen"));
54
+ i.src = url;
55
+ });
56
+ let transparant = false;
57
+ if (file.type !== "image/jpeg") {
58
+ const c = document.createElement("canvas");
59
+ const max = 64;
60
+ const schaal = Math.min(1, max / Math.max(img.width, img.height, 1));
61
+ c.width = Math.max(1, Math.round(img.width * schaal));
62
+ c.height = Math.max(1, Math.round(img.height * schaal));
63
+ const ctx = c.getContext("2d");
64
+ if (ctx) {
65
+ ctx.drawImage(img, 0, 0, c.width, c.height);
66
+ const px = ctx.getImageData(0, 0, c.width, c.height).data;
67
+ for (let i = 3; i < px.length; i += 4) {
68
+ if (px[i] < 250) {
69
+ transparant = true;
70
+ break;
71
+ }
72
+ }
73
+ }
74
+ }
75
+ return { breedte: img.naturalWidth, hoogte: img.naturalHeight, transparant };
76
+ }
77
+ finally {
78
+ URL.revokeObjectURL(url);
79
+ }
80
+ }
81
+ async function tekenSignedUrls(logos) {
82
+ const paden = logos.map((l) => l.bestandspad ?? l.bestand_url).filter(Boolean);
83
+ if (!paden.length)
84
+ return logos;
85
+ const { data } = await supabase.storage.from(LOGO_BUCKET).createSignedUrls(paden, 60 * 60);
86
+ const map = new Map();
87
+ for (const r of arr(data)) {
88
+ if (r.path && r.signedUrl)
89
+ map.set(r.path, r.signedUrl);
90
+ }
91
+ return logos.map((l) => ({ ...l, viewUrl: map.get(l.bestandspad ?? l.bestand_url) }));
92
+ }
93
+ export async function haalLogos() {
94
+ const { data, error } = await supabase
95
+ .from("layout_logos")
96
+ .select("*")
97
+ .order("created_at", { ascending: false });
98
+ if (error)
99
+ throw error;
100
+ return tekenSignedUrls(arr(data));
101
+ }
102
+ export function useLogos() {
103
+ const [logos, setLogos] = useState([]);
104
+ const [loading, setLoading] = useState(true);
105
+ const load = useCallback(async () => {
106
+ setLoading(true);
107
+ try {
108
+ setLogos(await haalLogos());
109
+ }
110
+ catch {
111
+ setLogos([]);
112
+ }
113
+ setLoading(false);
114
+ }, []);
115
+ useEffect(() => {
116
+ void load();
117
+ }, [load]);
118
+ return { logos, loading, reload: load };
119
+ }
120
+ export async function bestaatHash(hash) {
121
+ const { data } = await supabase.from("layout_logos").select("*").eq("hash", hash).maybeSingle();
122
+ return data ?? null;
123
+ }
124
+ async function uploadBestand(file) {
125
+ const ext = bestandstypeVan(file);
126
+ const pad = `${crypto.randomUUID()}.${ext}`;
127
+ const { error } = await supabase.storage.from(LOGO_BUCKET).upload(pad, file, {
128
+ contentType: file.type || "application/octet-stream",
129
+ upsert: false,
130
+ });
131
+ if (error)
132
+ throw error;
133
+ return pad;
134
+ }
135
+ export async function maakLogo(input) {
136
+ const hash = await bestandHash(input.file);
137
+ const dubbel = await bestaatHash(hash);
138
+ if (dubbel)
139
+ throw new Error(`Dit bestand bestaat al als logo "${dubbel.naam}"`);
140
+ const { breedte, hoogte, transparant } = await leesAfmetingen(input.file);
141
+ const pad = await uploadBestand(input.file);
142
+ if (input.is_standaard)
143
+ await wisStandaard(input.categorie);
144
+ const { data, error } = await supabase
145
+ .from("layout_logos")
146
+ .insert({
147
+ naam: input.naam,
148
+ omschrijving: input.omschrijving,
149
+ categorie: input.categorie,
150
+ bestand_url: pad,
151
+ bestandspad: pad,
152
+ bestandstype: bestandstypeVan(input.file),
153
+ breedte,
154
+ hoogte,
155
+ bestandsgrootte: input.file.size,
156
+ transparant,
157
+ is_standaard: input.is_standaard,
158
+ hash,
159
+ })
160
+ .select("*")
161
+ .single();
162
+ if (error)
163
+ throw error;
164
+ return data;
165
+ }
166
+ async function wisStandaard(categorie) {
167
+ await supabase
168
+ .from("layout_logos")
169
+ .update({ is_standaard: false })
170
+ .eq("categorie", categorie)
171
+ .eq("is_standaard", true);
172
+ }
173
+ export async function werkLogoBij(id, patch) {
174
+ if (patch.is_standaard && patch.categorie)
175
+ await wisStandaard(patch.categorie);
176
+ const { error } = await supabase
177
+ .from("layout_logos")
178
+ .update(patch)
179
+ .eq("id", id);
180
+ if (error)
181
+ throw error;
182
+ }
183
+ /** Vervangt het bestand van een bestaand logo — alle layouts volgen automatisch. */
184
+ export async function vervangLogoBestand(logo, file) {
185
+ const hash = await bestandHash(file);
186
+ const dubbel = await bestaatHash(hash);
187
+ if (dubbel && dubbel.id !== logo.id)
188
+ throw new Error(`Dit bestand bestaat al als logo "${dubbel.naam}"`);
189
+ const { breedte, hoogte, transparant } = await leesAfmetingen(file);
190
+ const pad = await uploadBestand(file);
191
+ const oud = logo.bestandspad ?? logo.bestand_url;
192
+ const { error } = await supabase
193
+ .from("layout_logos")
194
+ .update({
195
+ bestand_url: pad,
196
+ bestandspad: pad,
197
+ bestandstype: bestandstypeVan(file),
198
+ breedte,
199
+ hoogte,
200
+ bestandsgrootte: file.size,
201
+ transparant,
202
+ hash,
203
+ })
204
+ .eq("id", logo.id);
205
+ if (error)
206
+ throw error;
207
+ if (oud)
208
+ await supabase.storage.from(LOGO_BUCKET).remove([oud]);
209
+ }
210
+ export async function verwijderLogo(logo) {
211
+ const pad = logo.bestandspad ?? logo.bestand_url;
212
+ const { error } = await supabase.from("layout_logos").delete().eq("id", logo.id);
213
+ if (error)
214
+ throw error;
215
+ if (pad)
216
+ await supabase.storage.from(LOGO_BUCKET).remove([pad]);
217
+ }
218
+ export async function downloadLogo(logo) {
219
+ const pad = logo.bestandspad ?? logo.bestand_url;
220
+ const { data, error } = await supabase.storage.from(LOGO_BUCKET).download(pad);
221
+ if (error || !data)
222
+ throw error ?? new Error("Download mislukt");
223
+ const url = URL.createObjectURL(data);
224
+ const a = document.createElement("a");
225
+ a.href = url;
226
+ a.download = `${logo.naam}.${logo.bestandstype}`;
227
+ a.click();
228
+ URL.revokeObjectURL(url);
229
+ }
230
+ export function formatteerBytes(n) {
231
+ if (!n)
232
+ return "—";
233
+ if (n < 1024)
234
+ return `${n} B`;
235
+ if (n < 1024 * 1024)
236
+ return `${(n / 1024).toFixed(1)} kB`;
237
+ return `${(n / 1024 / 1024).toFixed(1)} MB`;
238
+ }
239
+ /**
240
+ * Logo's als ingebedde data-URL. Nodig bij afdrukken: een printvenster kan
241
+ * tijdelijke (ondertekende) URL's soms niet op tijd laden, waardoor het logo
242
+ * als kapotte afbeelding op papier komt.
243
+ */
244
+ export async function haalPrintLogos() {
245
+ const logos = await haalLogos();
246
+ return Promise.all(logos.map(async (l) => {
247
+ const pad = l.bestandspad ?? l.bestand_url;
248
+ try {
249
+ const { data } = await supabase.storage.from(LOGO_BUCKET).download(pad);
250
+ if (!data)
251
+ return { id: l.id, naam: l.naam, viewUrl: l.viewUrl ?? null };
252
+ const dataUrl = await new Promise((resolve, reject) => {
253
+ const reader = new FileReader();
254
+ reader.onload = () => resolve(String(reader.result ?? ""));
255
+ reader.onerror = () => reject(new Error("Logo kon niet worden gelezen"));
256
+ reader.readAsDataURL(data);
257
+ });
258
+ return { id: l.id, naam: l.naam, viewUrl: dataUrl };
259
+ }
260
+ catch {
261
+ return { id: l.id, naam: l.naam, viewUrl: l.viewUrl ?? null };
262
+ }
263
+ }));
264
+ }
@@ -0,0 +1,210 @@
1
+ import type { InstellingDef } from "./documentProfiles";
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
+ export interface PakbonKolom {
4
+ key: string;
5
+ label: string;
6
+ breedte: number;
7
+ uitlijning: "left" | "center" | "right";
8
+ fontfamilie?: string;
9
+ fontgrootte?: number;
10
+ kleur?: string;
11
+ vet?: boolean;
12
+ achtergrond?: string;
13
+ rand?: boolean;
14
+ }
15
+ export interface PakbonConditie {
16
+ veld: string;
17
+ operator: "=" | "!=" | ">" | "<" | "bevat" | "leeg" | "niet_leeg";
18
+ waarde: string;
19
+ }
20
+ export interface PakbonSectie {
21
+ id: string;
22
+ type: PakbonSectieType;
23
+ titel: string;
24
+ zichtbaar: boolean;
25
+ opties: Record<string, unknown>;
26
+ kolommen?: PakbonKolom[];
27
+ condities: PakbonConditie[];
28
+ }
29
+ /** Logo dat op het hele document staat, los van de losse logo-sectie. */
30
+ export interface PakbonDocumentLogo {
31
+ logoId: string | null;
32
+ naam?: string | null;
33
+ hoogte?: number;
34
+ uitlijning?: "left" | "center" | "right";
35
+ }
36
+ export interface PakbonConfig {
37
+ secties: PakbonSectie[];
38
+ /** Documentlogo bovenaan elke pagina van dit document. */
39
+ logo?: PakbonDocumentLogo | null;
40
+ }
41
+ export declare const BESCHIKBARE_KOLOMMEN: {
42
+ key: string;
43
+ label: string;
44
+ }[];
45
+ export declare function kolomLabel(key: string): string;
46
+ export declare function nieuweKolom(key: string): PakbonKolom;
47
+ /**
48
+ * Geeft productvelden overal dezelfde relatieve breedte. Iedere laag wordt als
49
+ * losse tabel gerenderd, dus de browser mag deze breedtes niet uit de inhoud
50
+ * van één specifieke laag afleiden.
51
+ */
52
+ export declare function productVeldBreedtes(velden: string[]): number[];
53
+ export interface SectieDef {
54
+ type: PakbonSectieType;
55
+ label: string;
56
+ omschrijving: string;
57
+ /** deze sectie werkt met een kolommenkiezer */
58
+ kolommen?: boolean;
59
+ opties: InstellingDef[];
60
+ }
61
+ export declare const FUST_VELD_OPTIES: {
62
+ value: string;
63
+ label: string;
64
+ }[];
65
+ export declare const SECTIE_REGISTER: SectieDef[];
66
+ export declare function sectieDef(type: PakbonSectieType): SectieDef;
67
+ export declare function nieuweSectie(type: PakbonSectieType): PakbonSectie;
68
+ export declare function standaardPakbonConfig(): PakbonConfig;
69
+ export declare function leesPakbonConfig(config: unknown): PakbonConfig;
70
+ /** Actieve pickmethode van een pakbonconfiguratie. */
71
+ export declare function pickMethode(secties: PakbonSectie[] | undefined): "kar" | "fusten";
72
+ /** Blokken die bij de gekozen pickmethode niet van toepassing zijn. */
73
+ export declare function sectieOnderdrukt(type: PakbonSectieType, methode: "kar" | "fusten"): boolean;
74
+ export interface DemoProduct {
75
+ artikelnummer: string;
76
+ artikelnaam: string;
77
+ potmaat: string;
78
+ aantal: number;
79
+ belading: string;
80
+ barcode: string;
81
+ opmerking: string;
82
+ locatie: string;
83
+ gewicht: string;
84
+ productgroep: string;
85
+ kleur: string;
86
+ fust_aantal: number;
87
+ fustsoort: string;
88
+ planten_per_fust: number;
89
+ }
90
+ export interface DemoLaag {
91
+ laagnummer: number;
92
+ belading: string;
93
+ potmaat: string;
94
+ gewicht: string;
95
+ opmerking: string;
96
+ producten: DemoProduct[];
97
+ fusten: {
98
+ fusttype: string;
99
+ aantal: number;
100
+ hoogte: string;
101
+ belading: string;
102
+ barcode: string;
103
+ }[];
104
+ }
105
+ export interface DemoKar {
106
+ karnummer: number;
107
+ route: string;
108
+ chauffeur: string;
109
+ gewicht: string;
110
+ lagen: DemoLaag[];
111
+ }
112
+ export declare const DEMO_ORDER: {
113
+ order: {
114
+ nummer: string;
115
+ datum: string;
116
+ leverdatum: string;
117
+ referentie: string;
118
+ opmerking: string;
119
+ };
120
+ bedrijf: {
121
+ naam: string;
122
+ adres: string;
123
+ plaats: string;
124
+ telefoon: string;
125
+ email: string;
126
+ kvk: string;
127
+ btw: string;
128
+ };
129
+ klant: {
130
+ naam: string;
131
+ nummer: string;
132
+ contact: string;
133
+ referentie: string;
134
+ };
135
+ afleveradres: {
136
+ naam: string;
137
+ adres: string;
138
+ plaats: string;
139
+ land: string;
140
+ };
141
+ factuuradres: {
142
+ naam: string;
143
+ adres: string;
144
+ plaats: string;
145
+ land: string;
146
+ };
147
+ transport: {
148
+ transporteur: string;
149
+ route: string;
150
+ chauffeur: string;
151
+ track: string;
152
+ };
153
+ karren: DemoKar[];
154
+ };
155
+ export type DemoOrder = typeof DEMO_ORDER;
156
+ export declare function alleProducten(order: DemoOrder): DemoProduct[];
157
+ export declare function totalen(order: DemoOrder): Record<string, string>;
158
+ export declare const CONDITIE_VELDEN: {
159
+ value: string;
160
+ label: string;
161
+ }[];
162
+ export declare function conditieContext(order: DemoOrder): Record<string, string>;
163
+ export declare function sectieZichtbaar(sectie: PakbonSectie, ctx: Record<string, string>): boolean;
164
+ export declare function sorteerProducten(items: DemoProduct[], sortering: string): DemoProduct[];
165
+ /** Vervangt {{groep.veld}} codes door waarden uit de (voorbeeld)order. */
166
+ export declare function vulVeldcodes(tekst: string, order: DemoOrder): string;
167
+ export interface KarGroep {
168
+ kar: DemoKar;
169
+ aantal: number;
170
+ nummers: number[];
171
+ }
172
+ export interface LaagGroep {
173
+ laag: DemoLaag;
174
+ aantal: number;
175
+ nummers: number[];
176
+ }
177
+ /** Groepeert identieke karren. Bij `aan = false` blijft elke kar los. */
178
+ export declare function groepeerIdentiekeKarren(karren: DemoKar[], aan: boolean): KarGroep[];
179
+ /** Groepeert identieke lagen binnen één kar. */
180
+ export declare function groepeerIdentiekeLagen(lagen: DemoLaag[], aan: boolean): LaagGroep[];
181
+ /** Tekst boven een gebundelde kar, bijv. "Deze kar 5× pakken". */
182
+ export declare function karBundelTekst(aantal: number): string;
183
+ /** Tekst boven een gebundelde laag, bijv. "Deze laag 4×". */
184
+ export declare function laagBundelTekst(aantal: number): string;
185
+ export interface FustVerzamelProduct {
186
+ artikelnummer: string;
187
+ artikelnaam: string;
188
+ potmaat: string;
189
+ kleur: string;
190
+ productgroep: string;
191
+ locatie: string;
192
+ fustsoort: string;
193
+ planten_per_fust: number;
194
+ aantal: number;
195
+ }
196
+ export interface FustVerzamelGroep {
197
+ fusttype: string;
198
+ aantal: number;
199
+ hoogte: string;
200
+ belading: string;
201
+ producten: FustVerzamelProduct[];
202
+ }
203
+ /**
204
+ * Verzamellijst met alle fusten van een order, opgeteld per fusttype,
205
+ * inclusief de producten die in dat fusttype gepickt moeten worden.
206
+ * Gebruikt wanneer er per fust gepickt wordt en de gebruiker zelf de
207
+ * karindeling maakt.
208
+ */
209
+ export declare function fustVerzamellijst(karren: unknown): FustVerzamelGroep[];
210
+ //# sourceMappingURL=pakbonBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pakbonBuilder.d.ts","sourceRoot":"","sources":["../../src/lib/pakbonBuilder.ts"],"names":[],"mappings":"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"}