@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,661 @@
1
+ // ============================================================================
2
+ // src/lib/productiebonBuilder.ts — blokgebaseerde opbouw van een productiebon
3
+ //
4
+ // Volledig losstaand van de pakbon: eigen bloktypes, eigen veldenbibliotheek,
5
+ // eigen kolommen en eigen voorbeeldgegevens.
6
+ // Nieuw blok toevoegen = één entry in PB_BLOK_REGISTER.
7
+ // ============================================================================
8
+ export const LETTERTYPEN = ["Helvetica", "Arial", "Times New Roman", "Courier New", "Verdana"];
9
+ // --- veldenbibliotheek algemene productinformatie ---------------------------
10
+ export const PRODUCTINFO_VELDEN = [
11
+ { key: "productfoto_groot", label: "Grote productfoto" },
12
+ { key: "productfotos", label: "Meerdere productfoto's" },
13
+ { key: "artikelnummer", label: "Artikelnummer" },
14
+ { key: "artikelnaam", label: "Artikelnaam" },
15
+ { key: "aantal", label: "Aantal te produceren" },
16
+ { key: "variant", label: "Variant" },
17
+ { key: "omschrijving", label: "Productomschrijving" },
18
+ { key: "potmaat", label: "Potmaat" },
19
+ { key: "hoogte", label: "Hoogte" },
20
+ { key: "kleur", label: "Kleur" },
21
+ { key: "productgroep", label: "Productgroep" },
22
+ { key: "productiestatus", label: "Productiestatus" },
23
+ { key: "productiedatum", label: "Productiedatum" },
24
+ { key: "leverdatum", label: "Leverdatum" },
25
+ { key: "productieordernummer", label: "Productieordernummer" },
26
+ { key: "klantnaam", label: "Klantnaam" },
27
+ { key: "bestelreferentie", label: "Bestelreferentie" },
28
+ { key: "barcode", label: "Barcode" },
29
+ { key: "qrcode", label: "QR-code" },
30
+ ];
31
+ const STANDAARD_PRODUCTINFO = [
32
+ "productfoto_groot",
33
+ "artikelnummer",
34
+ "artikelnaam",
35
+ "aantal",
36
+ "variant",
37
+ "potmaat",
38
+ "hoogte",
39
+ "kleur",
40
+ "productiedatum",
41
+ "leverdatum",
42
+ "productieordernummer",
43
+ "klantnaam",
44
+ "barcode",
45
+ ];
46
+ export function nieuwVeld(key, aan = false) {
47
+ const label = PRODUCTINFO_VELDEN.find((v) => v.key === key)?.label ?? key;
48
+ const groot = key === "productfoto_groot" || key === "productfotos";
49
+ return {
50
+ key,
51
+ label,
52
+ tonen: aan,
53
+ kolom: groot ? "volledig" : "links",
54
+ grootte: groot ? 45 : 10,
55
+ fontfamilie: "Helvetica",
56
+ kleur: "#111827",
57
+ uitlijning: "left",
58
+ vet: key === "artikelnaam",
59
+ };
60
+ }
61
+ function standaardVelden() {
62
+ return PRODUCTINFO_VELDEN.map((v, i) => nieuwVeld(v.key, STANDAARD_PRODUCTINFO.includes(v.key) && i >= 0));
63
+ }
64
+ // --- kolommenbibliotheken ---------------------------------------------------
65
+ export const SAMENSTELLING_KOLOMMEN = [
66
+ { key: "artikelnummer", label: "Artikelnummer" },
67
+ { key: "artikelnaam", label: "Artikelnaam" },
68
+ { key: "foto", label: "Foto" },
69
+ { key: "aantal", label: "Aantal" },
70
+ { key: "eenheid", label: "Eenheid" },
71
+ { key: "locatie", label: "Magazijnlocatie" },
72
+ { key: "barcode", label: "Barcode" },
73
+ { key: "qrcode", label: "QR-code" },
74
+ { key: "opmerking", label: "Opmerking" },
75
+ { key: "alternatief", label: "Alternatief artikel" },
76
+ ];
77
+ export const MATERIAAL_KOLOMMEN = [
78
+ { key: "artikelnummer", label: "Artikelnummer" },
79
+ { key: "artikelnaam", label: "Naam" },
80
+ { key: "foto", label: "Foto" },
81
+ { key: "aantal", label: "Benodigd aantal" },
82
+ { key: "eenheid", label: "Eenheid" },
83
+ { key: "locatie", label: "Voorraadlocatie" },
84
+ { key: "voorraad", label: "Voorraadniveau" },
85
+ { key: "barcode", label: "Barcode" },
86
+ { key: "qrcode", label: "QR-code" },
87
+ ];
88
+ export function pbNieuweKolom(key, bibliotheek = SAMENSTELLING_KOLOMMEN) {
89
+ return {
90
+ key,
91
+ label: bibliotheek.find((k) => k.key === key)?.label ?? key,
92
+ breedte: 20,
93
+ uitlijning: key === "aantal" || key === "voorraad" ? "right" : "left",
94
+ fontgrootte: 9,
95
+ fontfamilie: "Helvetica",
96
+ kleur: "#111827",
97
+ vet: false,
98
+ };
99
+ }
100
+ const uitlijningOptie = {
101
+ key: "uitlijning",
102
+ label: "Uitlijning",
103
+ type: "keuze",
104
+ standaard: "left",
105
+ opties: [
106
+ { value: "left", label: "Links" },
107
+ { value: "center", label: "Midden" },
108
+ { value: "right", label: "Rechts" },
109
+ ],
110
+ };
111
+ export const PB_BLOK_REGISTER = [
112
+ {
113
+ type: "productinfo",
114
+ label: "Algemene productinformatie",
115
+ omschrijving: "Kopblok met alle algemene gegevens van het te produceren product.",
116
+ velden: true,
117
+ opties: [
118
+ {
119
+ key: "indeling",
120
+ label: "Indeling",
121
+ type: "keuze",
122
+ standaard: "twee",
123
+ opties: [
124
+ { value: "een", label: "Eén kolom" },
125
+ { value: "twee", label: "Twee kolommen" },
126
+ ],
127
+ },
128
+ { key: "toonTitel", label: "Bloktitel tonen", type: "schakelaar", standaard: false },
129
+ { key: "kader", label: "Kader rondom", type: "schakelaar", standaard: true },
130
+ ],
131
+ },
132
+ {
133
+ type: "productfotos",
134
+ label: "Productfoto's",
135
+ omschrijving: "Eén of meerdere foto's van het product naast elkaar.",
136
+ opties: [
137
+ { key: "aantal", label: "Aantal foto's", type: "getal", standaard: 3 },
138
+ { key: "hoogte", label: "Hoogte (mm)", type: "getal", standaard: 35 },
139
+ { key: "bijschrift", label: "Bijschrift tonen", type: "schakelaar", standaard: true },
140
+ uitlijningOptie,
141
+ ],
142
+ },
143
+ {
144
+ type: "samenstelling",
145
+ label: "Samenstelling van het product",
146
+ omschrijving: "Welke onderdelen samen het eindproduct vormen.",
147
+ kolommen: "samenstelling",
148
+ opties: [
149
+ {
150
+ key: "onderdelen",
151
+ label: "Zichtbare onderdelen",
152
+ type: "meerkeuze",
153
+ standaard: ["planten", "potten", "hoezen", "stickers", "labels", "decoratie"],
154
+ opties: [
155
+ { value: "planten", label: "Planten" },
156
+ { value: "potten", label: "Potten" },
157
+ { value: "hoezen", label: "Hoezen" },
158
+ { value: "stickers", label: "Stickers" },
159
+ { value: "labels", label: "Labels" },
160
+ { value: "decoratie", label: "Decoratie" },
161
+ { value: "stokjes", label: "Stokjes" },
162
+ { value: "meststoffen", label: "Meststoffen" },
163
+ { value: "verpakking", label: "Verpakking" },
164
+ { value: "fust", label: "Fust" },
165
+ { value: "overig", label: "Overige materialen" },
166
+ ],
167
+ },
168
+ { key: "groepeerPerSoort", label: "Groeperen per soort", type: "schakelaar", standaard: true },
169
+ { key: "toonKoppen", label: "Kolomkoppen tonen", type: "schakelaar", standaard: true },
170
+ { key: "streepjes", label: "Regelscheiding tonen", type: "schakelaar", standaard: true },
171
+ { key: "regelhoogte", label: "Regelhoogte (mm)", type: "getal", standaard: 7 },
172
+ ],
173
+ },
174
+ {
175
+ type: "instructies",
176
+ label: "Productie-instructies",
177
+ omschrijving: "Werkinstructies, controlepunten, veiligheid en gereedschap.",
178
+ opties: [
179
+ {
180
+ key: "onderdelen",
181
+ label: "Zichtbare onderdelen",
182
+ type: "meerkeuze",
183
+ standaard: ["stappen", "eigentekst", "controlepunten", "gereedschap", "tijd"],
184
+ opties: [
185
+ { value: "stappen", label: "Stap voor stap uitleg" },
186
+ { value: "eigentekst", label: "Eigen tekst" },
187
+ { value: "controlepunten", label: "Controlepunten" },
188
+ { value: "veiligheid", label: "Veiligheidsinstructies" },
189
+ { value: "gereedschap", label: "Benodigd gereedschap" },
190
+ { value: "tijd", label: "Benodigde tijd" },
191
+ { value: "opmerkingen", label: "Opmerkingen voor productie" },
192
+ ],
193
+ },
194
+ {
195
+ key: "volgorde",
196
+ label: "Volgorde onderdelen",
197
+ type: "tekst",
198
+ standaard: "stappen,eigentekst,controlepunten,veiligheid,gereedschap,tijd,opmerkingen",
199
+ hint: "Sleutels gescheiden door komma's; bepaalt de volgorde in het blok.",
200
+ },
201
+ { key: "eigenTekst", label: "Eigen tekst", type: "tekst", standaard: "" },
202
+ { key: "genummerd", label: "Genummerde lijst", type: "schakelaar", standaard: true },
203
+ ],
204
+ },
205
+ {
206
+ type: "productiestappen",
207
+ label: "Productiestappen",
208
+ omschrijving: "Losse stappen met titel, omschrijving, foto en controlevak.",
209
+ opties: [
210
+ {
211
+ key: "stappen",
212
+ label: "Stappen",
213
+ type: "tekst",
214
+ standaard: "Pak de juiste pot;Plaats de plant;Voeg decoratie toe;Plaats de sticker;Controleer de kwaliteit;Plaats het product in het juiste fust;Vul het fust volgens de belading;Plaats het fust op de juiste kar",
215
+ hint: "Stappen gescheiden door een puntkomma.",
216
+ },
217
+ {
218
+ key: "velden",
219
+ label: "Per stap tonen",
220
+ type: "meerkeuze",
221
+ standaard: ["omschrijving", "controlevak", "tijd"],
222
+ opties: [
223
+ { value: "omschrijving", label: "Omschrijving" },
224
+ { value: "foto", label: "Foto" },
225
+ { value: "controlevak", label: "Controlevak" },
226
+ { value: "tijd", label: "Geschatte tijd" },
227
+ { value: "gereedschap", label: "Benodigd gereedschap" },
228
+ { value: "materialen", label: "Benodigde materialen" },
229
+ ],
230
+ },
231
+ { key: "nummeren", label: "Stappen nummeren", type: "schakelaar", standaard: true },
232
+ { key: "regelhoogte", label: "Regelhoogte (mm)", type: "getal", standaard: 9 },
233
+ ],
234
+ },
235
+ {
236
+ type: "fustinformatie",
237
+ label: "Fustinformatie",
238
+ omschrijving: "Welk fust gebruikt moet worden en hoe het gevuld wordt.",
239
+ opties: [
240
+ {
241
+ key: "velden",
242
+ label: "Zichtbare gegevens",
243
+ type: "meerkeuze",
244
+ standaard: ["fustcode", "fustnaam", "afmetingen", "per_fust", "lagen", "per_laag"],
245
+ opties: [
246
+ { value: "fustcode", label: "Fustcode" },
247
+ { value: "fustnaam", label: "Fustnaam" },
248
+ { value: "afbeelding", label: "Afbeelding van het fust" },
249
+ { value: "barcode", label: "Barcode van het fust" },
250
+ { value: "afmetingen", label: "Afmetingen" },
251
+ { value: "beladingstype", label: "Beladingstype" },
252
+ { value: "per_fust", label: "Aantal producten per fust" },
253
+ { value: "lagen", label: "Aantal lagen" },
254
+ { value: "per_laag", label: "Producten per laag" },
255
+ { value: "capaciteit", label: "Maximale capaciteit" },
256
+ { value: "stapelrichting", label: "Stapelrichting" },
257
+ ],
258
+ },
259
+ {
260
+ key: "weergave",
261
+ label: "Weergave",
262
+ type: "keuze",
263
+ standaard: "tabel",
264
+ opties: [
265
+ { value: "tabel", label: "In tabelvorm" },
266
+ { value: "lijst", label: "Onder elkaar" },
267
+ ],
268
+ },
269
+ ],
270
+ },
271
+ {
272
+ type: "belading",
273
+ label: "Beladingsinformatie",
274
+ omschrijving: "Volledige belading van de kar met laagoverzicht.",
275
+ opties: [
276
+ {
277
+ key: "velden",
278
+ label: "Zichtbare gegevens",
279
+ type: "meerkeuze",
280
+ standaard: ["beladingstype", "lagen", "per_laag", "capaciteit", "laagoverzicht", "volgorde"],
281
+ opties: [
282
+ { value: "beladingstype", label: "Beladingstype" },
283
+ { value: "lagen", label: "Aantal lagen" },
284
+ { value: "per_laag", label: "Producten per laag" },
285
+ { value: "capaciteit", label: "Totale capaciteit" },
286
+ { value: "laagoverzicht", label: "Overzicht van alle lagen" },
287
+ { value: "visueel", label: "Visuele indeling van de kar" },
288
+ { value: "volgorde", label: "Volgorde van vullen" },
289
+ { value: "uitzonderingen", label: "Uitzonderingen" },
290
+ ],
291
+ },
292
+ { key: "karhoogte", label: "Hoogte kartekening (mm)", type: "getal", standaard: 45 },
293
+ ],
294
+ },
295
+ {
296
+ type: "visueleopbouw",
297
+ label: "Visuele productopbouw",
298
+ omschrijving: "Eindfoto, detailfoto's of explosietekening van het eindproduct.",
299
+ opties: [
300
+ {
301
+ key: "weergaven",
302
+ label: "Zichtbare afbeeldingen",
303
+ type: "meerkeuze",
304
+ standaard: ["eindfoto", "detail"],
305
+ opties: [
306
+ { value: "eindfoto", label: "Grote eindfoto" },
307
+ { value: "detail", label: "Detailfoto's" },
308
+ { value: "explosie", label: "Explosietekening" },
309
+ { value: "voorbeeld", label: "Voorbeeld eindresultaat" },
310
+ ],
311
+ },
312
+ { key: "naastElkaar", label: "Afbeeldingen naast elkaar", type: "schakelaar", standaard: true },
313
+ { key: "hoogte", label: "Hoogte (mm)", type: "getal", standaard: 50 },
314
+ uitlijningOptie,
315
+ ],
316
+ },
317
+ {
318
+ type: "materialen",
319
+ label: "Materialenoverzicht",
320
+ omschrijving: "Automatisch overzicht van alle benodigde materialen.",
321
+ kolommen: "materiaal",
322
+ opties: [
323
+ {
324
+ key: "groepering",
325
+ label: "Groeperen op",
326
+ type: "keuze",
327
+ standaard: "geen",
328
+ opties: [
329
+ { value: "geen", label: "Niet groeperen" },
330
+ { value: "productgroep", label: "Productgroep" },
331
+ { value: "locatie", label: "Magazijnlocatie" },
332
+ { value: "leverancier", label: "Leverancier" },
333
+ { value: "stap", label: "Productiestap" },
334
+ ],
335
+ },
336
+ { key: "toonKoppen", label: "Kolomkoppen tonen", type: "schakelaar", standaard: true },
337
+ { key: "toonTotaal", label: "Totaalregel tonen", type: "schakelaar", standaard: true },
338
+ { key: "regelhoogte", label: "Regelhoogte (mm)", type: "getal", standaard: 7 },
339
+ ],
340
+ },
341
+ {
342
+ type: "controlepunten",
343
+ label: "Controlepunten",
344
+ omschrijving: "Kwaliteitscontroles met afvinkvakjes.",
345
+ opties: [
346
+ {
347
+ key: "punten",
348
+ label: "Controlepunten",
349
+ type: "tekst",
350
+ standaard: "Pot gecontroleerd;Sticker aanwezig;Juiste plant gebruikt;Juiste aantallen;Juiste fust gebruikt;Correcte belading;Product schoon;Kwaliteit akkoord",
351
+ hint: "Punten gescheiden door een puntkomma.",
352
+ },
353
+ {
354
+ key: "kolommenAantal",
355
+ label: "Kolommen",
356
+ type: "keuze",
357
+ standaard: "2",
358
+ opties: [
359
+ { value: "1", label: "1 kolom" },
360
+ { value: "2", label: "2 kolommen" },
361
+ { value: "3", label: "3 kolommen" },
362
+ ],
363
+ },
364
+ { key: "paraaf", label: "Paraafvak per punt", type: "schakelaar", standaard: false },
365
+ ],
366
+ },
367
+ {
368
+ type: "extrainfo",
369
+ label: "Extra informatie",
370
+ omschrijving: "Interne opmerkingen, klantinstructies en AI-opmerkingen.",
371
+ opties: [
372
+ {
373
+ key: "onderdelen",
374
+ label: "Zichtbare onderdelen",
375
+ type: "meerkeuze",
376
+ standaard: ["intern", "klant"],
377
+ opties: [
378
+ { value: "intern", label: "Interne opmerkingen" },
379
+ { value: "klant", label: "Klantspecifieke instructies" },
380
+ { value: "productie", label: "Productie-opmerkingen" },
381
+ { value: "ai", label: "AI-opmerkingen" },
382
+ ],
383
+ },
384
+ { key: "kader", label: "Kader rondom", type: "schakelaar", standaard: true },
385
+ ],
386
+ },
387
+ {
388
+ type: "qrblok",
389
+ label: "QR-codes",
390
+ omschrijving: "Instructievideo, handleiding of veiligheidsblad via QR.",
391
+ opties: [
392
+ {
393
+ key: "codes",
394
+ label: "Zichtbare codes",
395
+ type: "meerkeuze",
396
+ standaard: ["video", "handleiding"],
397
+ opties: [
398
+ { value: "video", label: "Instructievideo" },
399
+ { value: "handleiding", label: "Handleiding" },
400
+ { value: "veiligheid", label: "Veiligheidsblad" },
401
+ ],
402
+ },
403
+ { key: "grootte", label: "Grootte (mm)", type: "getal", standaard: 22 },
404
+ { key: "bijschrift", label: "Bijschrift tonen", type: "schakelaar", standaard: true },
405
+ uitlijningOptie,
406
+ ],
407
+ },
408
+ {
409
+ type: "tekstblok",
410
+ label: "Vrij tekstblok",
411
+ omschrijving: "Eigen tekst; veldcodes zoals {{product.artikelnaam}} worden ingevuld.",
412
+ opties: [
413
+ { key: "tekst", label: "Tekst", type: "tekst", standaard: "Eigen tekst voor de productievloer." },
414
+ { key: "fontgrootte", label: "Tekstgrootte (pt)", type: "getal", standaard: 10 },
415
+ { key: "kleur", label: "Tekstkleur", type: "kleur", standaard: "#111827" },
416
+ { key: "kader", label: "Kader rondom", type: "schakelaar", standaard: false },
417
+ uitlijningOptie,
418
+ ],
419
+ },
420
+ ];
421
+ export function pbBlokDef(type) {
422
+ return PB_BLOK_REGISTER.find((d) => d.type === type) ?? PB_BLOK_REGISTER[0];
423
+ }
424
+ let teller = 0;
425
+ export function nieuwBlok(type) {
426
+ const def = pbBlokDef(type);
427
+ teller += 1;
428
+ const opties = {};
429
+ for (const o of def.opties)
430
+ opties[o.key] = o.standaard;
431
+ const bibliotheek = def.kolommen === "materiaal" ? MATERIAAL_KOLOMMEN : SAMENSTELLING_KOLOMMEN;
432
+ const standaardKeys = def.kolommen === "materiaal"
433
+ ? ["artikelnummer", "artikelnaam", "aantal", "eenheid", "locatie"]
434
+ : ["artikelnummer", "artikelnaam", "aantal", "eenheid", "locatie"];
435
+ return {
436
+ id: `${type}-${Date.now().toString(36)}-${teller}`,
437
+ type,
438
+ titel: def.label,
439
+ zichtbaar: true,
440
+ opties,
441
+ velden: def.velden ? standaardVelden() : undefined,
442
+ kolommen: def.kolommen ? standaardKeys.map((k) => pbNieuweKolom(k, bibliotheek)) : undefined,
443
+ condities: [],
444
+ };
445
+ }
446
+ export function standaardProductiebonConfig() {
447
+ return {
448
+ blokken: [
449
+ "productinfo",
450
+ "samenstelling",
451
+ "instructies",
452
+ "productiestappen",
453
+ "fustinformatie",
454
+ "belading",
455
+ "materialen",
456
+ "controlepunten",
457
+ ].map(nieuwBlok),
458
+ };
459
+ }
460
+ export function leesProductiebonConfig(config) {
461
+ const c = config;
462
+ const blokken = Array.isArray(c?.productiebon?.blokken) ? c.productiebon.blokken : null;
463
+ return blokken && blokken.length ? { blokken } : standaardProductiebonConfig();
464
+ }
465
+ const o = (soort, nr, naam, aantal, eenheid, locatie, extra = {}) => ({
466
+ soort,
467
+ artikelnummer: nr,
468
+ artikelnaam: naam,
469
+ aantal,
470
+ eenheid,
471
+ locatie,
472
+ barcode: `87${nr}`,
473
+ opmerking: "",
474
+ alternatief: "",
475
+ voorraad: `${aantal * 12} ${eenheid}`,
476
+ leverancier: "Van der Meer B.V.",
477
+ productgroep: soort,
478
+ stap: "Assemblage",
479
+ ...extra,
480
+ });
481
+ export const DEMO_PRODUCTIEBON = {
482
+ product: {
483
+ artikelnummer: "PRD-40218",
484
+ artikelnaam: "Phalaenopsis 2-tak in keramiek",
485
+ variant: "Wit / mat antraciet",
486
+ omschrijving: "Orchidee 2-tak, geplant in keramieken pot met decoratieschors en houten sticker.",
487
+ potmaat: "12 cm",
488
+ hoogte: "60 cm",
489
+ kleur: "Wit",
490
+ productgroep: "Orchidee",
491
+ productiestatus: "Vrijgegeven",
492
+ productiedatum: "29-07-2026",
493
+ leverdatum: "31-07-2026",
494
+ productieordernummer: "PO-2026-00871",
495
+ klantnaam: "Bloemenhuis De Zonnebloem",
496
+ bestelreferentie: "PO-88213",
497
+ barcode: "8712345409218",
498
+ qrcode: "https://flow.example/po/2026-00871",
499
+ aantal: 240,
500
+ },
501
+ onderdelen: [
502
+ o("planten", "PL-1001", "Phalaenopsis wit 2-tak", 1, "st", "A-03-1"),
503
+ o("potten", "PO-2210", "Keramiek pot 12 cm antraciet", 1, "st", "B-11-2"),
504
+ o("hoezen", "HZ-3140", "Transparante hoes 60 cm", 1, "st", "C-02-4"),
505
+ o("stickers", "ST-5502", "Sticker logo klant", 1, "st", "D-01-1", { opmerking: "Rechtsonder plakken" }),
506
+ o("labels", "LB-5610", "Verzorgingslabel NL/DE", 1, "st", "D-02-3"),
507
+ o("decoratie", "DC-6720", "Decoratieschors 40 gram", 40, "gram", "E-05-2"),
508
+ o("stokjes", "SK-6801", "Bamboestok 40 cm wit", 2, "st", "E-06-1"),
509
+ o("meststoffen", "MS-7010", "Slow release korrels", 5, "gram", "E-07-4"),
510
+ o("verpakking", "VP-8120", "Kartonnen tussenschot", 1, "st", "F-01-1"),
511
+ o("fust", "FT-9001", "Deense tray 566", 1, "st", "G-01-1"),
512
+ o("overig", "OV-9500", "Elastiek transport", 1, "st", "G-04-2"),
513
+ ],
514
+ fust: {
515
+ fustcode: "FT-566",
516
+ fustnaam: "Deense tray 566",
517
+ afmetingen: "56,5 × 36,5 × 22 cm",
518
+ beladingstype: "Deense kar 4 lagen",
519
+ per_fust: "12 stuks",
520
+ lagen: "4 lagen",
521
+ per_laag: "3 fusten",
522
+ capaciteit: "144 stuks per kar",
523
+ stapelrichting: "Lengterichting, hoes naar buiten",
524
+ barcode: "FT-8801",
525
+ },
526
+ belading: {
527
+ beladingstype: "Deense kar 4 lagen",
528
+ lagen: "4",
529
+ per_laag: "36 stuks",
530
+ capaciteit: "144 stuks",
531
+ volgorde: "Vul van onder naar boven, zwaarste laag onderin.",
532
+ uitzonderingen: "Laag 4 maximaal 24 stuks in verband met hoogte.",
533
+ },
534
+ lagen: [
535
+ { laag: 1, inhoud: "36 stuks", opmerking: "Onderin, zwaarste laag" },
536
+ { laag: 2, inhoud: "36 stuks", opmerking: "" },
537
+ { laag: 3, inhoud: "36 stuks", opmerking: "" },
538
+ { laag: 4, inhoud: "24 stuks", opmerking: "Beperkt i.v.m. hoogte" },
539
+ ],
540
+ instructies: {
541
+ veiligheid: "Draag handschoenen bij het werken met meststoffen.",
542
+ gereedschap: "Plantschep, sticker-applicator, hoezenmachine",
543
+ tijd: "circa 2,5 minuut per product",
544
+ opmerkingen: "Beschadigde bladeren direct verwijderen.",
545
+ controlepunten: "Plant recht in de pot; hoes strak; sticker rechtsonder.",
546
+ },
547
+ extra: {
548
+ intern: "Restant potten terug naar B-11-2.",
549
+ klant: "Klant wenst sticker altijd rechtsonder op de hoes.",
550
+ productie: "Bij minder dan 12 stuks per fust: melden bij teamleider.",
551
+ ai: "Vergelijkbare orders duurden gemiddeld 2,3 minuut per product.",
552
+ },
553
+ qr: {
554
+ video: "https://flow.example/video/po-2026-00871",
555
+ handleiding: "https://flow.example/handleiding/phalaenopsis",
556
+ veiligheid: "https://flow.example/vib/meststof-7010",
557
+ },
558
+ };
559
+ export const ONDERDEEL_LABELS = {
560
+ planten: "Planten",
561
+ potten: "Potten",
562
+ hoezen: "Hoezen",
563
+ stickers: "Stickers",
564
+ labels: "Labels",
565
+ decoratie: "Decoratie",
566
+ stokjes: "Stokjes",
567
+ meststoffen: "Meststoffen",
568
+ verpakking: "Verpakking",
569
+ fust: "Fust",
570
+ overig: "Overige materialen",
571
+ };
572
+ export const FUST_LABELS = {
573
+ fustcode: "Fustcode",
574
+ fustnaam: "Fustnaam",
575
+ afbeelding: "Afbeelding",
576
+ barcode: "Barcode",
577
+ afmetingen: "Afmetingen",
578
+ beladingstype: "Beladingstype",
579
+ per_fust: "Producten per fust",
580
+ lagen: "Aantal lagen",
581
+ per_laag: "Producten per laag",
582
+ capaciteit: "Maximale capaciteit",
583
+ stapelrichting: "Stapelrichting",
584
+ };
585
+ export const BELADING_LABELS = {
586
+ beladingstype: "Beladingstype",
587
+ lagen: "Aantal lagen",
588
+ per_laag: "Producten per laag",
589
+ capaciteit: "Totale capaciteit",
590
+ volgorde: "Volgorde van vullen",
591
+ uitzonderingen: "Uitzonderingen",
592
+ };
593
+ export const EXTRA_LABELS = {
594
+ intern: "Interne opmerkingen",
595
+ klant: "Klantspecifieke instructies",
596
+ productie: "Productie-opmerkingen",
597
+ ai: "AI-opmerkingen",
598
+ };
599
+ export const QR_LABELS = {
600
+ video: "Instructievideo",
601
+ handleiding: "Handleiding",
602
+ veiligheid: "Veiligheidsblad",
603
+ };
604
+ // --- condities --------------------------------------------------------------
605
+ export const PB_CONDITIE_VELDEN = [
606
+ { value: "productgroep", label: "Productgroep" },
607
+ { value: "productiestatus", label: "Productiestatus" },
608
+ { value: "aantal", label: "Aantal te produceren" },
609
+ { value: "klant", label: "Klant" },
610
+ { value: "potmaat", label: "Potmaat" },
611
+ ];
612
+ export function pbConditieContext(data) {
613
+ return {
614
+ productgroep: data.product.productgroep,
615
+ productiestatus: data.product.productiestatus,
616
+ aantal: String(data.product.aantal),
617
+ klant: data.product.klantnaam,
618
+ potmaat: data.product.potmaat,
619
+ };
620
+ }
621
+ export function pbBlokZichtbaar(blok, ctx) {
622
+ if (!blok.zichtbaar)
623
+ return false;
624
+ return (blok.condities ?? []).every((c) => {
625
+ const w = ctx[c.veld] ?? "";
626
+ switch (c.operator) {
627
+ case "=":
628
+ return w === c.waarde;
629
+ case "!=":
630
+ return w !== c.waarde;
631
+ case ">":
632
+ return Number(w) > Number(c.waarde);
633
+ case "<":
634
+ return Number(w) < Number(c.waarde);
635
+ case "bevat":
636
+ return w.toLowerCase().includes(c.waarde.toLowerCase());
637
+ case "leeg":
638
+ return w === "";
639
+ case "niet_leeg":
640
+ return w !== "";
641
+ default:
642
+ return true;
643
+ }
644
+ });
645
+ }
646
+ /** Vervangt {{groep.veld}} codes door waarden uit de voorbeeldproductiebon. */
647
+ export function vulPbVeldcodes(tekst, data) {
648
+ if (!tekst)
649
+ return "";
650
+ const bron = data;
651
+ return tekst.replace(/\{\{\s*([a-zA-Z_]+)\.([a-zA-Z_]+)\s*\}\}/g, (heel, groep, veld) => {
652
+ const waarde = bron[groep]?.[veld];
653
+ return waarde === undefined || waarde === null ? heel : String(waarde);
654
+ });
655
+ }
656
+ export function splitsLijst(waarde) {
657
+ return String(waarde ?? "")
658
+ .split(";")
659
+ .map((s) => s.trim())
660
+ .filter(Boolean);
661
+ }
@@ -0,0 +1,4 @@
1
+ import type { SupabaseClient } from "@supabase/supabase-js";
2
+ import type { Database } from "../integrations/supabase/types";
3
+ export declare const supabase: SupabaseClient<Database>;
4
+ //# sourceMappingURL=supabaseClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabaseClient.d.ts","sourceRoot":"","sources":["../../src/lib/supabaseClient.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAE/D,eAAO,MAAM,QAAQ,EAA8B,cAAc,CAAC,QAAQ,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ // ============================================================================
2
+ // src/lib/supabaseClient.ts — gedeelde Supabase-client
3
+ // ============================================================================
4
+ // De client komt uit @flowselections/core en leest zijn URL en key uit de
5
+ // omgeving van de shell. Zo werkt deze module in elke shell zonder dat er
6
+ // project-URL's of keys in de code staan.
7
+ // De cast is nodig omdat de core-typedefinities de layout- en printertabellen
8
+ // van deze module niet kennen.
9
+ import { supabase as coreSupabase } from "@flowselections/core";
10
+ export const supabase = coreSupabase;