@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,97 @@
1
+ import type { LayoutElementModel, LayoutModel, PageSettings } from "./documentTypes";
2
+ export interface PrinterModel {
3
+ id: string;
4
+ naam: string;
5
+ omschrijving: string | null;
6
+ soort: string;
7
+ verbinding: string;
8
+ merk: string | null;
9
+ ip_adres: string | null;
10
+ poort: number | null;
11
+ driver: string | null;
12
+ papierformaat: string | null;
13
+ locatie: string | null;
14
+ online: boolean;
15
+ actief: boolean;
16
+ laatst_gezien: string | null;
17
+ }
18
+ export interface PrintJobModel {
19
+ id: string;
20
+ layout_id: string | null;
21
+ printer_id: string | null;
22
+ documenttype: string;
23
+ documentnaam: string | null;
24
+ status: string;
25
+ paginas: number | null;
26
+ kopieen: number | null;
27
+ foutmelding: string | null;
28
+ is_herprint: boolean;
29
+ gebruiker_naam: string | null;
30
+ created_at: string;
31
+ voltooid_op: string | null;
32
+ }
33
+ export declare function useLayouts(): {
34
+ layouts: LayoutModel[];
35
+ loading: boolean;
36
+ reload: () => Promise<void>;
37
+ };
38
+ export declare function maakLayout(input: {
39
+ naam: string;
40
+ documenttype: string;
41
+ omschrijving?: string;
42
+ papierformaat: string;
43
+ breedte_mm: number;
44
+ hoogte_mm: number;
45
+ orientatie: "portrait" | "landscape";
46
+ config?: Record<string, unknown>;
47
+ }): Promise<string>;
48
+ export declare function dupliceerLayout(id: string): Promise<string>;
49
+ export declare function verwijderLayout(id: string): Promise<void>;
50
+ export declare function updateLayout(id: string, patch: Record<string, unknown>): Promise<void>;
51
+ export declare function useLayoutDetail(layoutId: string): {
52
+ layout: LayoutModel | null;
53
+ elementen: LayoutElementModel[];
54
+ setElementen: import("react").Dispatch<import("react").SetStateAction<LayoutElementModel[]>>;
55
+ setLayout: import("react").Dispatch<import("react").SetStateAction<LayoutModel | null>>;
56
+ loading: boolean;
57
+ reload: () => Promise<void>;
58
+ };
59
+ export declare function bewaarElementen(layoutId: string, elementen: LayoutElementModel[], pageSettings?: PageSettings): Promise<void>;
60
+ export declare function bewaarVersie(layoutId: string, elementen: LayoutElementModel[], commentaar: string): Promise<number>;
61
+ export declare function useVersies(layoutId: string): {
62
+ versies: {
63
+ id: string;
64
+ versienummer: number;
65
+ commentaar: string | null;
66
+ created_at: string;
67
+ elements: unknown;
68
+ }[];
69
+ reload: () => Promise<void>;
70
+ };
71
+ export declare function usePrinters(): {
72
+ printers: PrinterModel[];
73
+ koppelingen: {
74
+ layout_id: string;
75
+ printer_id: string;
76
+ }[];
77
+ loading: boolean;
78
+ reload: () => Promise<void>;
79
+ };
80
+ export declare function bewaarPrinter(input: Record<string, unknown>, id?: string): Promise<void>;
81
+ export declare function verwijderPrinter(id: string): Promise<void>;
82
+ export declare function toggleKoppeling(layoutId: string, printerId: string, aan: boolean): Promise<void>;
83
+ export declare function usePrintJobs(): {
84
+ jobs: PrintJobModel[];
85
+ loading: boolean;
86
+ reload: () => Promise<void>;
87
+ };
88
+ export declare function updateJobStatus(id: string, status: string): Promise<void>;
89
+ export declare function maakPrintJob(input: {
90
+ layout_id: string;
91
+ printer_id: string | null;
92
+ documenttype: string;
93
+ documentnaam: string;
94
+ kopieen?: number;
95
+ is_herprint?: boolean;
96
+ }): Promise<void>;
97
+ //# sourceMappingURL=useDocumentData.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDocumentData.d.ts","sourceRoot":"","sources":["../../src/lib/useDocumentData.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,286 @@
1
+ // ============================================================================
2
+ // src/lib/useDocumentData.ts — datahooks voor layouts, printers en wachtrij
3
+ // ============================================================================
4
+ import { useCallback, useEffect, useState } from "react";
5
+ import { toast } from "@flowselections/core";
6
+ import { supabase } from "./supabaseClient";
7
+ const arr = (v) => (Array.isArray(v) ? v : []);
8
+ // --- Layouts ---------------------------------------------------------------
9
+ export function useLayouts() {
10
+ const [layouts, setLayouts] = useState([]);
11
+ const [loading, setLoading] = useState(true);
12
+ const load = useCallback(async () => {
13
+ setLoading(true);
14
+ const { data, error } = await supabase
15
+ .from("document_layouts")
16
+ .select("*")
17
+ .order("updated_at", { ascending: false });
18
+ if (error)
19
+ toast.error("Layouts laden mislukt");
20
+ setLayouts(arr(data));
21
+ setLoading(false);
22
+ }, []);
23
+ useEffect(() => {
24
+ void load();
25
+ }, [load]);
26
+ return { layouts, loading, reload: load };
27
+ }
28
+ export async function maakLayout(input) {
29
+ const { data, error } = await supabase
30
+ .from("document_layouts")
31
+ .insert(input)
32
+ .select("id")
33
+ .single();
34
+ if (error)
35
+ throw error;
36
+ return data.id;
37
+ }
38
+ export async function dupliceerLayout(id) {
39
+ const { data: bron } = await supabase.from("document_layouts").select("*").eq("id", id).maybeSingle();
40
+ if (!bron)
41
+ throw new Error("Layout niet gevonden");
42
+ const b = bron;
43
+ delete b.id;
44
+ delete b.created_at;
45
+ delete b.updated_at;
46
+ b.naam = `${String(b.naam)} (kopie)`;
47
+ b.is_standaard = false;
48
+ const { data: nieuw, error } = await supabase
49
+ .from("document_layouts")
50
+ .insert(b)
51
+ .select("id")
52
+ .single();
53
+ if (error)
54
+ throw error;
55
+ const nieuwId = nieuw.id;
56
+ const { data: elementen } = await supabase.from("document_layout_elements").select("*").eq("layout_id", id);
57
+ const kopie = arr(elementen).map((e) => {
58
+ const c = { ...e };
59
+ delete c.id;
60
+ delete c.created_at;
61
+ delete c.updated_at;
62
+ c.layout_id = nieuwId;
63
+ return c;
64
+ });
65
+ if (kopie.length)
66
+ await supabase.from("document_layout_elements").insert(kopie);
67
+ return nieuwId;
68
+ }
69
+ export async function verwijderLayout(id) {
70
+ const { error } = await supabase.from("document_layouts").delete().eq("id", id);
71
+ if (error)
72
+ throw error;
73
+ }
74
+ export async function updateLayout(id, patch) {
75
+ const { error } = await supabase
76
+ .from("document_layouts")
77
+ .update(patch)
78
+ .eq("id", id);
79
+ if (error)
80
+ throw error;
81
+ }
82
+ export function useLayoutDetail(layoutId) {
83
+ const [layout, setLayout] = useState(null);
84
+ const [elementen, setElementen] = useState([]);
85
+ const [loading, setLoading] = useState(true);
86
+ const load = useCallback(async () => {
87
+ setLoading(true);
88
+ const [{ data: l }, { data: els }, { data: cond }] = await Promise.all([
89
+ supabase.from("document_layouts").select("*").eq("id", layoutId).maybeSingle(),
90
+ supabase.from("document_layout_elements").select("*").eq("layout_id", layoutId).order("volgorde"),
91
+ supabase.from("document_layout_conditions").select("*").eq("layout_id", layoutId),
92
+ ]);
93
+ setLayout(l ?? null);
94
+ const condities = arr(cond);
95
+ setElementen(arr(els).map((e, i) => ({
96
+ key: e.element_key,
97
+ type: e.type,
98
+ volgorde: e.volgorde ?? i,
99
+ x: Number(e.x),
100
+ y: Number(e.y),
101
+ breedte: Number(e.breedte),
102
+ hoogte: Number(e.hoogte),
103
+ rotatie: Number(e.rotatie ?? 0),
104
+ zIndex: e.z_index ?? i,
105
+ content: e.content ?? "",
106
+ veldpad: e.veldpad,
107
+ logoId: e.logo_id ?? null,
108
+ stijl: e.stijl ?? {},
109
+ config: e.config ?? {},
110
+ groep: e.parent_key,
111
+ vergrendeld: !!e.vergrendeld,
112
+ verborgen: !!e.verborgen,
113
+ condities: condities
114
+ .filter((c) => c.element_key === e.element_key)
115
+ .map((c) => ({
116
+ veld: c.veld,
117
+ operator: c.operator,
118
+ waarde: c.waarde,
119
+ })),
120
+ })));
121
+ setLoading(false);
122
+ }, [layoutId]);
123
+ useEffect(() => {
124
+ void load();
125
+ }, [load]);
126
+ return { layout, elementen, setElementen, setLayout, loading, reload: load };
127
+ }
128
+ export async function bewaarElementen(layoutId, elementen, pageSettings) {
129
+ await supabase.from("document_layout_elements").delete().eq("layout_id", layoutId);
130
+ await supabase.from("document_layout_conditions").delete().eq("layout_id", layoutId);
131
+ if (elementen.length) {
132
+ const rows = elementen.map((e, i) => ({
133
+ layout_id: layoutId,
134
+ element_key: e.key,
135
+ type: e.type,
136
+ parent_key: e.groep ?? null,
137
+ volgorde: i,
138
+ x: e.x,
139
+ y: e.y,
140
+ breedte: e.breedte,
141
+ hoogte: e.hoogte,
142
+ rotatie: e.rotatie,
143
+ z_index: e.zIndex,
144
+ content: e.content,
145
+ veldpad: e.veldpad,
146
+ logo_id: e.logoId ?? null,
147
+ stijl: e.stijl,
148
+ config: e.config,
149
+ vergrendeld: e.vergrendeld,
150
+ verborgen: e.verborgen,
151
+ }));
152
+ const { error } = await supabase.from("document_layout_elements").insert(rows);
153
+ if (error)
154
+ throw error;
155
+ const condRows = elementen.flatMap((e) => (e.condities ?? []).map((c) => ({
156
+ layout_id: layoutId,
157
+ element_key: e.key,
158
+ veld: c.veld,
159
+ operator: c.operator,
160
+ waarde: c.waarde,
161
+ })));
162
+ if (condRows.length)
163
+ await supabase.from("document_layout_conditions").insert(condRows);
164
+ }
165
+ if (pageSettings) {
166
+ await supabase
167
+ .from("document_layouts")
168
+ .update({ page_settings: pageSettings })
169
+ .eq("id", layoutId);
170
+ }
171
+ }
172
+ export async function bewaarVersie(layoutId, elementen, commentaar) {
173
+ const { data } = await supabase
174
+ .from("document_layout_versions")
175
+ .select("versienummer")
176
+ .eq("layout_id", layoutId)
177
+ .order("versienummer", { ascending: false })
178
+ .limit(1);
179
+ const volgende = (arr(data)[0]?.versienummer ?? 0) + 1;
180
+ await supabase.from("document_layout_versions").insert({
181
+ layout_id: layoutId,
182
+ versienummer: volgende,
183
+ elements: elementen,
184
+ commentaar,
185
+ });
186
+ await supabase
187
+ .from("document_layouts")
188
+ .update({ huidige_versie: volgende })
189
+ .eq("id", layoutId);
190
+ return volgende;
191
+ }
192
+ export function useVersies(layoutId) {
193
+ const [versies, setVersies] = useState([]);
194
+ const load = useCallback(async () => {
195
+ const { data } = await supabase
196
+ .from("document_layout_versions")
197
+ .select("id, versienummer, commentaar, created_at, elements")
198
+ .eq("layout_id", layoutId)
199
+ .order("versienummer", { ascending: false });
200
+ setVersies(arr(data));
201
+ }, [layoutId]);
202
+ useEffect(() => {
203
+ void load();
204
+ }, [load]);
205
+ return { versies, reload: load };
206
+ }
207
+ // --- Printers --------------------------------------------------------------
208
+ export function usePrinters() {
209
+ const [printers, setPrinters] = useState([]);
210
+ const [koppelingen, setKoppelingen] = useState([]);
211
+ const [loading, setLoading] = useState(true);
212
+ const load = useCallback(async () => {
213
+ setLoading(true);
214
+ const [{ data: p }, { data: m }] = await Promise.all([
215
+ supabase.from("printers").select("*").order("naam"),
216
+ supabase.from("printer_mappings").select("layout_id, printer_id"),
217
+ ]);
218
+ setPrinters(arr(p));
219
+ setKoppelingen(arr(m));
220
+ setLoading(false);
221
+ }, []);
222
+ useEffect(() => {
223
+ void load();
224
+ }, [load]);
225
+ return { printers, koppelingen, loading, reload: load };
226
+ }
227
+ export async function bewaarPrinter(input, id) {
228
+ const q = id
229
+ ? supabase
230
+ .from("printers")
231
+ .update(input)
232
+ .eq("id", id)
233
+ : supabase.from("printers").insert(input);
234
+ const { error } = await q;
235
+ if (error)
236
+ throw error;
237
+ }
238
+ export async function verwijderPrinter(id) {
239
+ const { error } = await supabase.from("printers").delete().eq("id", id);
240
+ if (error)
241
+ throw error;
242
+ }
243
+ export async function toggleKoppeling(layoutId, printerId, aan) {
244
+ if (aan) {
245
+ await supabase.from("printer_mappings").insert({ layout_id: layoutId, printer_id: printerId });
246
+ }
247
+ else {
248
+ await supabase.from("printer_mappings").delete().eq("layout_id", layoutId).eq("printer_id", printerId);
249
+ }
250
+ }
251
+ // --- Printwachtrij ---------------------------------------------------------
252
+ export function usePrintJobs() {
253
+ const [jobs, setJobs] = useState([]);
254
+ const [loading, setLoading] = useState(true);
255
+ const load = useCallback(async () => {
256
+ setLoading(true);
257
+ const { data } = await supabase
258
+ .from("print_jobs")
259
+ .select("*")
260
+ .order("created_at", { ascending: false })
261
+ .limit(200);
262
+ setJobs(arr(data));
263
+ setLoading(false);
264
+ }, []);
265
+ useEffect(() => {
266
+ void load();
267
+ }, [load]);
268
+ return { jobs, loading, reload: load };
269
+ }
270
+ export async function updateJobStatus(id, status) {
271
+ const patch = { status };
272
+ if (status === "voltooid")
273
+ patch.voltooid_op = new Date().toISOString();
274
+ const { error } = await supabase
275
+ .from("print_jobs")
276
+ .update(patch)
277
+ .eq("id", id);
278
+ if (error)
279
+ throw error;
280
+ await supabase.from("print_job_logs").insert({ job_id: id, gebeurtenis: status });
281
+ }
282
+ export async function maakPrintJob(input) {
283
+ const { error } = await supabase.from("print_jobs").insert({ ...input, status: "wachtend" });
284
+ if (error)
285
+ throw error;
286
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Geeft het layout-id terug: de meegegeven prop, of anders de routeparameter.
3
+ * Nodig omdat een shell de pagina zonder prop kan renderen op een route
4
+ * met een `$layoutId`-segment.
5
+ */
6
+ export declare function useLayoutIdParam(layoutId?: string): string | undefined;
7
+ //# sourceMappingURL=useLayoutIdParam.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLayoutIdParam.d.ts","sourceRoot":"","sources":["../../src/lib/useLayoutIdParam.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGtE"}
@@ -0,0 +1,10 @@
1
+ import { useParams } from "@tanstack/react-router";
2
+ /**
3
+ * Geeft het layout-id terug: de meegegeven prop, of anders de routeparameter.
4
+ * Nodig omdat een shell de pagina zonder prop kan renderen op een route
5
+ * met een `$layoutId`-segment.
6
+ */
7
+ export function useLayoutIdParam(layoutId) {
8
+ const params = useParams({ strict: false });
9
+ return layoutId ?? params?.layoutId;
10
+ }
@@ -0,0 +1,3 @@
1
+ import { type ClassValue } from "clsx";
2
+ export declare function cn(...inputs: ClassValue[]): string;
3
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,UAAU,EAAE,MAAM,MAAM,CAAA;AAG5C,wBAAgB,EAAE,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,UAEzC"}
@@ -0,0 +1,5 @@
1
+ import { clsx } from "clsx";
2
+ import { twMerge } from "tailwind-merge";
3
+ export function cn(...inputs) {
4
+ return twMerge(clsx(inputs));
5
+ }
@@ -0,0 +1,15 @@
1
+ import { z } from "zod";
2
+ export declare const loginSchema: z.ZodObject<{
3
+ email: z.ZodString;
4
+ password: z.ZodString;
5
+ }, z.core.$strip>;
6
+ export declare const bugReportSchema: z.ZodObject<{
7
+ title: z.ZodString;
8
+ description: z.ZodString;
9
+ }, z.core.$strip>;
10
+ export declare const ALLOWED_FILE_TYPES: string[];
11
+ export declare function validateFileUpload(file: File): {
12
+ valid: boolean;
13
+ error?: string;
14
+ };
15
+ //# sourceMappingURL=validationSchemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validationSchemas.d.ts","sourceRoot":"","sources":["../../src/lib/validationSchemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,WAAW;;;iBAGtB,CAAC;AAEH,eAAO,MAAM,eAAe;;;iBAG1B,CAAC;AAEH,eAAO,MAAM,kBAAkB,UAK9B,CAAC;AAIF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,IAAI,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAQjF"}
@@ -0,0 +1,25 @@
1
+ import { z } from "zod";
2
+ export const loginSchema = z.object({
3
+ email: z.string().email("Ongeldig e-mailadres"),
4
+ password: z.string().min(6, "Wachtwoord moet minimaal 6 tekens bevatten"),
5
+ });
6
+ export const bugReportSchema = z.object({
7
+ title: z.string().min(1, "Titel is verplicht").max(200),
8
+ description: z.string().min(1, "Beschrijving is verplicht").max(5000),
9
+ });
10
+ export const ALLOWED_FILE_TYPES = [
11
+ "image/png",
12
+ "image/jpeg",
13
+ "image/gif",
14
+ "application/pdf",
15
+ ];
16
+ const MAX_FILE_SIZE = 10 * 1024 * 1024; // 10MB
17
+ export function validateFileUpload(file) {
18
+ if (!ALLOWED_FILE_TYPES.includes(file.type)) {
19
+ return { valid: false, error: "Bestandstype niet toegestaan" };
20
+ }
21
+ if (file.size > MAX_FILE_SIZE) {
22
+ return { valid: false, error: "Bestand is te groot (max 10MB)" };
23
+ }
24
+ return { valid: true };
25
+ }
@@ -0,0 +1 @@
1
+ @source "./";
package/package.json ADDED
@@ -0,0 +1,117 @@
1
+ {
2
+ "name": "@flowselections/layout-maker",
3
+ "version": "1.3.2",
4
+ "flowselections": {
5
+ "moduleId": "layout-maker",
6
+ "pages": [
7
+ {
8
+ "export": "LayoutsPage",
9
+ "route": "layouts-printers",
10
+ "title": "Layouts"
11
+ },
12
+ {
13
+ "export": "PrintersPage",
14
+ "route": "layouts-printers/printers",
15
+ "title": "Printers"
16
+ },
17
+ {
18
+ "export": "PrintQueuePage",
19
+ "route": "layouts-printers/wachtrij",
20
+ "title": "Printwachtrij"
21
+ },
22
+ {
23
+ "export": "LogosPage",
24
+ "route": "layouts-printers/logos",
25
+ "title": "Logo's"
26
+ },
27
+ {
28
+ "export": "PakbonBuilderPage",
29
+ "route": "layouts-printers/pakbon/$layoutId",
30
+ "title": "Pakbon opbouw"
31
+ },
32
+ {
33
+ "export": "BlokOntwerperPage",
34
+ "route": "layouts-printers/blokken/$layoutId",
35
+ "title": "Blokken ontwerpen"
36
+ },
37
+ {
38
+ "export": "ProductiebonBuilderPage",
39
+ "route": "layouts-printers/productiebon/$layoutId",
40
+ "title": "Productiebon opbouw"
41
+ }
42
+ ]
43
+ },
44
+ "private": false,
45
+ "sideEffects": false,
46
+ "type": "module",
47
+ "main": "./dist-lib/index.js",
48
+ "types": "./dist-lib/index.d.ts",
49
+ "exports": {
50
+ ".": {
51
+ "types": "./dist-lib/index.d.ts",
52
+ "default": "./dist-lib/index.js"
53
+ },
54
+ "./styles": "./dist-lib/styles.css"
55
+ },
56
+ "files": [
57
+ "dist-lib",
58
+ "public"
59
+ ],
60
+ "publishConfig": {
61
+ "access": "public"
62
+ },
63
+ "scripts": {
64
+ "dev": "vite dev",
65
+ "build": "vite build",
66
+ "build:lib": "tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json && node -e \"require('fs').writeFileSync('dist-lib/styles.css', '@source \\\"./\\\";\\n')\"",
67
+ "build:lib:watch": "tsc -p tsconfig.build.json --watch",
68
+ "build:dev": "vite build --mode development",
69
+ "preview": "vite preview",
70
+ "lint": "eslint ."
71
+ },
72
+ "peerDependencies": {
73
+ "@flowselections/core": "*",
74
+ "@tanstack/react-query": "^5.0.0",
75
+ "@tanstack/react-router": "^1.0.0",
76
+ "@tanstack/react-start": "^1.0.0",
77
+ "lucide-react": "^0.400.0",
78
+ "react": "^18 || ^19",
79
+ "react-dom": "^18 || ^19",
80
+ "sonner": "^2.0.0"
81
+ },
82
+ "dependencies": {
83
+ "@supabase/supabase-js": "^2.111.0"
84
+ },
85
+ "devDependencies": {
86
+ "@cloudflare/vite-plugin": "^1.25.5",
87
+ "@eslint/js": "^9.32.0",
88
+ "@flowselections/core": "1.0.16",
89
+ "@lovable.dev/vite-tanstack-config": "2.9.1",
90
+ "@rsbuild/core": "^1.0.0",
91
+ "@tailwindcss/vite": "^4.2.1",
92
+ "@tanstack/react-query": "^5.83.0",
93
+ "@tanstack/react-router": "^1.168.0",
94
+ "@tanstack/react-start": "^1.167.14",
95
+ "@tanstack/router-plugin": "^1.167.10",
96
+ "@types/node": "^22.16.5",
97
+ "@types/react": "^19.2.0",
98
+ "@types/react-dom": "^19.2.0",
99
+ "@vitejs/plugin-react": "^5.0.4",
100
+ "eslint": "^9.32.0",
101
+ "eslint-plugin-react-hooks": "^5.2.0",
102
+ "eslint-plugin-react-refresh": "^0.4.20",
103
+ "globals": "^15.15.0",
104
+ "lucide-react": "^0.575.0",
105
+ "react": "^19.2.0",
106
+ "react-dom": "^19.2.0",
107
+ "sonner": "^2.0.7",
108
+ "tailwindcss": "^4.2.1",
109
+ "tw-animate-css": "^1.3.4",
110
+ "typescript": "^5.8.3",
111
+ "tsc-alias": "^1.8.10",
112
+ "typescript-eslint": "^8.56.1",
113
+ "vite": "^7.3.1",
114
+ "vite-tsconfig-paths": "^6.0.2",
115
+ "nitro": "3.0.260603-beta"
116
+ }
117
+ }
Binary file