@flowselections/layout-maker 1.3.3 → 1.6.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -24
- package/dist-lib/components/AfdrukKnop.d.ts +3 -1
- package/dist-lib/components/AfdrukKnop.d.ts.map +1 -1
- package/dist-lib/components/AfdrukKnop.js +24 -3
- package/dist-lib/components/ComputersLijst.d.ts +23 -0
- package/dist-lib/components/ComputersLijst.d.ts.map +1 -0
- package/dist-lib/components/ComputersLijst.js +75 -0
- package/dist-lib/components/LayoutsPage.d.ts.map +1 -1
- package/dist-lib/components/LayoutsPage.js +2 -0
- package/dist-lib/components/LogosPage.d.ts.map +1 -1
- package/dist-lib/components/LogosPage.js +2 -0
- package/dist-lib/components/NetwerkPrintersDialog.d.ts +8 -0
- package/dist-lib/components/NetwerkPrintersDialog.d.ts.map +1 -0
- package/dist-lib/components/NetwerkPrintersDialog.js +79 -0
- package/dist-lib/components/PrintProgrammaUitleg.d.ts +5 -0
- package/dist-lib/components/PrintProgrammaUitleg.d.ts.map +1 -0
- package/dist-lib/components/PrintProgrammaUitleg.js +19 -0
- package/dist-lib/components/PrintQueuePage.d.ts.map +1 -1
- package/dist-lib/components/PrintQueuePage.js +37 -3
- package/dist-lib/components/PrinterKaart.d.ts +17 -0
- package/dist-lib/components/PrinterKaart.d.ts.map +1 -0
- package/dist-lib/components/PrinterKaart.js +14 -0
- package/dist-lib/components/PrinterSetupWizard.d.ts +11 -1
- package/dist-lib/components/PrinterSetupWizard.d.ts.map +1 -1
- package/dist-lib/components/PrinterSetupWizard.js +134 -64
- package/dist-lib/components/PrinterStatsKaarten.d.ts +11 -0
- package/dist-lib/components/PrinterStatsKaarten.d.ts.map +1 -0
- package/dist-lib/components/PrinterStatsKaarten.js +8 -0
- package/dist-lib/components/PrintersPage.d.ts.map +1 -1
- package/dist-lib/components/PrintersPage.js +120 -49
- package/dist-lib/components/WerkplekConfiguratiePage.d.ts +2 -0
- package/dist-lib/components/WerkplekConfiguratiePage.d.ts.map +1 -0
- package/dist-lib/components/WerkplekConfiguratiePage.js +101 -0
- package/dist-lib/components/WerkplekkenTabel.d.ts +14 -0
- package/dist-lib/components/WerkplekkenTabel.d.ts.map +1 -0
- package/dist-lib/components/WerkplekkenTabel.js +16 -0
- package/dist-lib/index.d.ts +11 -0
- package/dist-lib/index.d.ts.map +1 -1
- package/dist-lib/index.js +11 -0
- package/dist-lib/integrations/supabase/auth-middleware.d.ts +925 -34
- package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.server.d.ts +925 -34
- package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/types.d.ts +920 -29
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/types.js +12 -1
- package/dist-lib/lib/aiLayout.functions.d.ts +925 -34
- package/dist-lib/lib/aiLayout.functions.d.ts.map +1 -1
- package/dist-lib/lib/aiLayout.server.js +9 -9
- package/dist-lib/lib/browserPrint.d.ts +1 -0
- package/dist-lib/lib/browserPrint.d.ts.map +1 -1
- package/dist-lib/lib/browserPrint.js +6 -6
- package/dist-lib/lib/centralAuth.server.d.ts +13 -0
- package/dist-lib/lib/centralAuth.server.d.ts.map +1 -0
- package/dist-lib/lib/centralAuth.server.js +60 -0
- package/dist-lib/lib/directPrint.d.ts +26 -0
- package/dist-lib/lib/directPrint.d.ts.map +1 -0
- package/dist-lib/lib/directPrint.js +65 -0
- package/dist-lib/lib/documentPdf.d.ts +11 -0
- package/dist-lib/lib/documentPdf.d.ts.map +1 -0
- package/dist-lib/lib/documentPdf.js +62 -0
- package/dist-lib/lib/htmlNaarPdf.server.d.ts +14 -0
- package/dist-lib/lib/htmlNaarPdf.server.d.ts.map +1 -0
- package/dist-lib/lib/htmlNaarPdf.server.js +34 -0
- package/dist-lib/lib/htmlPdf.server.d.ts +29 -0
- package/dist-lib/lib/htmlPdf.server.d.ts.map +1 -0
- package/dist-lib/lib/htmlPdf.server.js +1009 -0
- package/dist-lib/lib/layoutPreview.d.ts +1 -1
- package/dist-lib/lib/layoutPreview.d.ts.map +1 -1
- package/dist-lib/lib/layoutPreview.js +9 -9
- package/dist-lib/lib/logoLibrary.d.ts +1 -1
- package/dist-lib/lib/logoLibrary.js +5 -3
- package/dist-lib/lib/orderData.server.d.ts +15 -0
- package/dist-lib/lib/orderData.server.d.ts.map +1 -0
- package/dist-lib/lib/orderData.server.js +194 -0
- package/dist-lib/lib/pakbonBuilder.d.ts.map +1 -1
- package/dist-lib/lib/pakbonBuilder.js +22 -2
- package/dist-lib/lib/pakbonHtml.js +50 -50
- package/dist-lib/lib/printQueue.server.d.ts +31 -0
- package/dist-lib/lib/printQueue.server.d.ts.map +1 -0
- package/dist-lib/lib/printQueue.server.js +435 -0
- package/dist-lib/lib/printService.functions.d.ts +103742 -0
- package/dist-lib/lib/printService.functions.d.ts.map +1 -0
- package/dist-lib/lib/printService.functions.js +94 -0
- package/dist-lib/lib/printService.server.d.ts +31 -0
- package/dist-lib/lib/printService.server.d.ts.map +1 -0
- package/dist-lib/lib/printService.server.js +110 -0
- package/dist-lib/lib/productiebonHtml.d.ts +18 -0
- package/dist-lib/lib/productiebonHtml.d.ts.map +1 -0
- package/dist-lib/lib/productiebonHtml.js +166 -0
- package/dist-lib/lib/profielHtml.d.ts +14 -0
- package/dist-lib/lib/profielHtml.d.ts.map +1 -0
- package/dist-lib/lib/profielHtml.js +256 -0
- package/dist-lib/lib/runnerRegistry.server.d.ts +10 -0
- package/dist-lib/lib/runnerRegistry.server.d.ts.map +1 -0
- package/dist-lib/lib/runnerRegistry.server.js +79 -0
- package/dist-lib/lib/supabaseAdmin.server.d.ts +6 -0
- package/dist-lib/lib/supabaseAdmin.server.d.ts.map +1 -0
- package/dist-lib/lib/supabaseAdmin.server.js +43 -0
- package/dist-lib/lib/testpagina.d.ts +2 -0
- package/dist-lib/lib/testpagina.d.ts.map +1 -0
- package/dist-lib/lib/testpagina.js +31 -0
- package/dist-lib/lib/useAutoRefresh.d.ts +8 -0
- package/dist-lib/lib/useAutoRefresh.d.ts.map +1 -0
- package/dist-lib/lib/useAutoRefresh.js +44 -0
- package/dist-lib/lib/useDocumentData.d.ts +4 -3
- package/dist-lib/lib/useDocumentData.d.ts.map +1 -1
- package/dist-lib/lib/useDocumentData.js +10 -7
- package/dist-lib/lib/useNetwerkPrinters.d.ts +12 -0
- package/dist-lib/lib/useNetwerkPrinters.d.ts.map +1 -0
- package/dist-lib/lib/useNetwerkPrinters.js +26 -0
- package/package.json +11 -3
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// src/lib/profielHtml.ts — universele print-HTML op basis van het documentprofiel.
|
|
3
|
+
// ----------------------------------------------------------------------------
|
|
4
|
+
// Pakbonnen en productiebonnen hebben een eigen renderer. Alle andere
|
|
5
|
+
// documentsoorten (sticker, verzendlabel, factuur, etiket, magazijnlijst, ...)
|
|
6
|
+
// worden opgeslagen als profielinstellingen: per groep een reeks vinkjes en
|
|
7
|
+
// keuzes. Deze renderer zet die instellingen om naar print-HTML, zodat élke
|
|
8
|
+
// bestaande én toekomstige layout meteen afdrukbaar is zonder extra werk.
|
|
9
|
+
// ============================================================================
|
|
10
|
+
import { configWaarde, documentProfiel, } from "./documentProfiles";
|
|
11
|
+
import { esc } from "./pakbonHtml";
|
|
12
|
+
const arr = (v) => (Array.isArray(v) ? v : []);
|
|
13
|
+
/** Instellingen die geen losse regel opleveren maar een eigen weergave hebben. */
|
|
14
|
+
const SPECIAAL = new Set([
|
|
15
|
+
"logo",
|
|
16
|
+
"barcode",
|
|
17
|
+
"qrcode",
|
|
18
|
+
"qr_handleiding",
|
|
19
|
+
"qr_video",
|
|
20
|
+
"toon_afbeelding",
|
|
21
|
+
"afbeelding",
|
|
22
|
+
"regeltabel",
|
|
23
|
+
"totalen",
|
|
24
|
+
"voettekst",
|
|
25
|
+
"handtekening",
|
|
26
|
+
"vrije_tekst",
|
|
27
|
+
"eigen_pictogrammen",
|
|
28
|
+
"adresblok",
|
|
29
|
+
]);
|
|
30
|
+
/** Markeringen die als korte waarschuwingstekst worden afgedrukt. */
|
|
31
|
+
const MARKERINGEN = {
|
|
32
|
+
fragile: "FRAGILE — breekbaar",
|
|
33
|
+
niet_stapelen: "NIET STAPELEN",
|
|
34
|
+
koel: "KOEL BEWAREN",
|
|
35
|
+
adr: "ADR",
|
|
36
|
+
};
|
|
37
|
+
/** Waar mag een instelling zijn waarde vandaan halen? */
|
|
38
|
+
const SYNONIEMEN = {
|
|
39
|
+
bedrijfsnaam: ["bedrijf.naam", "afzender.naam", "bedrijfsnaam"],
|
|
40
|
+
adres: ["bedrijf.adres", "afzender.adres", "adres"],
|
|
41
|
+
telefoon: ["bedrijf.telefoon", "afzender.telefoon", "telefoon"],
|
|
42
|
+
email: ["bedrijf.email", "afzender.email", "email"],
|
|
43
|
+
naam: ["ontvanger.naam", "klant.contactpersoon", "klant.naam", "naam"],
|
|
44
|
+
bedrijf: ["ontvanger.bedrijf", "klant.naam", "klant.bedrijf"],
|
|
45
|
+
straat: ["ontvanger.straat", "klant.straat", "adres.straat"],
|
|
46
|
+
huisnummer: ["ontvanger.huisnummer", "klant.huisnummer", "adres.huisnummer"],
|
|
47
|
+
postcode: ["ontvanger.postcode", "klant.postcode", "adres.postcode"],
|
|
48
|
+
plaats: ["ontvanger.plaats", "klant.plaats", "adres.plaats"],
|
|
49
|
+
land: ["ontvanger.land", "klant.land", "adres.land"],
|
|
50
|
+
klantnaam: ["klant.naam", "ontvanger.bedrijf", "klantnaam"],
|
|
51
|
+
transporteur: ["verzending.transporteur", "order.transporteur", "transporteur"],
|
|
52
|
+
verzendmethode: ["verzending.methode", "order.verzendmethode", "verzendmethode"],
|
|
53
|
+
route: ["verzending.route", "order.route", "route"],
|
|
54
|
+
track_trace: ["verzending.track_trace", "order.track_trace", "trackTrace"],
|
|
55
|
+
ordernummer: ["order.nummer", "order.ordernummer", "ordernummer", "order_number"],
|
|
56
|
+
referentie: ["order.referentie", "referentie", "klantreferentie"],
|
|
57
|
+
gewicht: ["verzending.gewicht", "order.gewicht", "gewicht"],
|
|
58
|
+
colli: ["verzending.colli", "order.colli", "colli", "aantal_colli"],
|
|
59
|
+
artikelnaam: ["regel.artikelnaam", "product.naam", "artikelnaam"],
|
|
60
|
+
artikelcode: ["regel.artikelcode", "product.code", "artikelcode", "artikelnummer"],
|
|
61
|
+
artikelnummer: ["regel.artikelnummer", "product.artikelnummer", "artikelnummer"],
|
|
62
|
+
aantal: ["regel.aantal", "product.aantal", "aantal"],
|
|
63
|
+
potmaat: ["regel.potmaat", "product.potmaat", "potmaat"],
|
|
64
|
+
productgroep: ["regel.productgroep", "product.productgroep", "productgroep"],
|
|
65
|
+
productomschrijving: ["regel.omschrijving", "product.omschrijving", "productomschrijving"],
|
|
66
|
+
};
|
|
67
|
+
/** Maakt van geneste gegevens een platte tabel met puntnotatie. */
|
|
68
|
+
function plat(bron, pad = "", uit = {}, diepte = 0) {
|
|
69
|
+
if (diepte > 4 || bron === null || bron === undefined)
|
|
70
|
+
return uit;
|
|
71
|
+
if (typeof bron === "object") {
|
|
72
|
+
if (Array.isArray(bron))
|
|
73
|
+
return uit;
|
|
74
|
+
for (const [k, v] of Object.entries(bron))
|
|
75
|
+
plat(v, pad ? `${pad}.${k}` : k, uit, diepte + 1);
|
|
76
|
+
return uit;
|
|
77
|
+
}
|
|
78
|
+
if (pad)
|
|
79
|
+
uit[pad] = String(bron);
|
|
80
|
+
return uit;
|
|
81
|
+
}
|
|
82
|
+
function waardeVoor(velden, inst) {
|
|
83
|
+
const kandidaten = [...(SYNONIEMEN[inst.key] ?? []), inst.key];
|
|
84
|
+
for (const k of kandidaten) {
|
|
85
|
+
const direct = velden[k];
|
|
86
|
+
if (direct !== undefined && String(direct).trim() !== "")
|
|
87
|
+
return String(direct);
|
|
88
|
+
}
|
|
89
|
+
// Laatste kans: eender welk veld dat op deze sleutel eindigt.
|
|
90
|
+
const staart = Object.entries(velden).find(([k, v]) => k.toLowerCase().endsWith(`.${inst.key}`) && String(v).trim() !== "");
|
|
91
|
+
return staart ? String(staart[1]) : "";
|
|
92
|
+
}
|
|
93
|
+
const kv = (label, waarde) => `<div class="kv"><span class="k">${esc(label)}</span><span class="v">${esc(waarde === "" ? "—" : waarde)}</span></div>`;
|
|
94
|
+
/** Zoekt de regels van het document (orderregels, producten, materialen, ...). */
|
|
95
|
+
function zoekRegels(data) {
|
|
96
|
+
for (const sleutel of ["regels", "orderregels", "items", "producten", "lines", "onderdelen"]) {
|
|
97
|
+
const lijst = arr(data[sleutel]);
|
|
98
|
+
if (lijst.length)
|
|
99
|
+
return lijst;
|
|
100
|
+
}
|
|
101
|
+
return [];
|
|
102
|
+
}
|
|
103
|
+
function regeltabel(regels) {
|
|
104
|
+
if (!regels.length)
|
|
105
|
+
return "";
|
|
106
|
+
const rij = (r) => {
|
|
107
|
+
const omschrijving = r["omschrijving"] ?? r["artikelnaam"] ?? r["naam"] ?? r["product"] ?? r["titel"] ?? "";
|
|
108
|
+
const code = r["artikelcode"] ?? r["artikelnummer"] ?? r["code"] ?? "";
|
|
109
|
+
const aantal = r["aantal"] ?? r["hoeveelheid"] ?? r["qty"] ?? "";
|
|
110
|
+
const eenheid = r["eenheid"] ?? "";
|
|
111
|
+
return `<tr><td>${esc(code)}</td><td>${esc(omschrijving)}</td><td style="text-align:right">${esc(aantal)}</td><td>${esc(eenheid)}</td></tr>`;
|
|
112
|
+
};
|
|
113
|
+
return `<table class="tabel"><colgroup><col style="width:20%" /><col style="width:52%" /><col style="width:16%" /><col style="width:12%" /></colgroup>
|
|
114
|
+
<thead><tr class="onder"><th>Code</th><th>Omschrijving</th><th style="text-align:right">Aantal</th><th>Eenheid</th></tr></thead>
|
|
115
|
+
<tbody>${regels.map(rij).join("")}</tbody></table>`;
|
|
116
|
+
}
|
|
117
|
+
function totalenBlok(regels, velden) {
|
|
118
|
+
const totaalAantal = regels.reduce((s, r) => s + (Number(r["aantal"] ?? 0) || 0), 0);
|
|
119
|
+
const bedrag = velden["order.totaal"] ?? velden["totaal"] ?? "";
|
|
120
|
+
const delen = [
|
|
121
|
+
`<div class="kv totalen"><span class="k">Aantal regels</span><span class="v">${regels.length}</span></div>`,
|
|
122
|
+
totaalAantal
|
|
123
|
+
? `<div class="kv totalen"><span class="k">Totaal aantal</span><span class="v">${totaalAantal}</span></div>`
|
|
124
|
+
: "",
|
|
125
|
+
bedrag ? `<div class="kv totalen"><span class="k">Totaal</span><span class="v">${esc(bedrag)}</span></div>` : "",
|
|
126
|
+
];
|
|
127
|
+
return delen.join("");
|
|
128
|
+
}
|
|
129
|
+
/** Bouwt één instelgroep om naar HTML. */
|
|
130
|
+
function groepHtml(groep, config, velden, data, opties) {
|
|
131
|
+
const delen = [];
|
|
132
|
+
const markeringen = [];
|
|
133
|
+
for (const inst of groep.instellingen) {
|
|
134
|
+
const waarde = configWaarde(config, groep, inst);
|
|
135
|
+
if (inst.type === "schakelaar") {
|
|
136
|
+
if (waarde !== true)
|
|
137
|
+
continue;
|
|
138
|
+
if (MARKERINGEN[inst.key]) {
|
|
139
|
+
markeringen.push(MARKERINGEN[inst.key]);
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
if (SPECIAAL.has(inst.key)) {
|
|
143
|
+
if (inst.key === "logo" && opties.logoUrl) {
|
|
144
|
+
delen.push(`<img src="${esc(opties.logoUrl)}" style="height:14mm" />`);
|
|
145
|
+
}
|
|
146
|
+
else if (inst.key === "barcode") {
|
|
147
|
+
const code = velden["order.nummer"] ?? velden["ordernummer"] ?? velden["barcode"] ?? "";
|
|
148
|
+
delen.push(`<div class="streepjes" style="height:12mm"></div>`);
|
|
149
|
+
if (code)
|
|
150
|
+
delen.push(`<div class="klein">${esc(code)}</div>`);
|
|
151
|
+
}
|
|
152
|
+
else if (inst.key.startsWith("qr")) {
|
|
153
|
+
delen.push(`<div class="qr" style="width:22mm;height:22mm"></div>`);
|
|
154
|
+
}
|
|
155
|
+
else if (inst.key === "regeltabel") {
|
|
156
|
+
delen.push(regeltabel(zoekRegels(data)));
|
|
157
|
+
}
|
|
158
|
+
else if (inst.key === "totalen") {
|
|
159
|
+
delen.push(totalenBlok(zoekRegels(data), velden));
|
|
160
|
+
}
|
|
161
|
+
else if (inst.key === "toon_afbeelding" || inst.key === "afbeelding") {
|
|
162
|
+
const url = velden["afbeelding"] ?? velden["regel.afbeelding"] ?? velden["product.afbeelding"] ?? "";
|
|
163
|
+
delen.push(url
|
|
164
|
+
? `<img src="${esc(url)}" style="height:35mm" />`
|
|
165
|
+
: `<div class="lijnveld hoog"></div>`);
|
|
166
|
+
}
|
|
167
|
+
else if (inst.key === "handtekening") {
|
|
168
|
+
delen.push(`<div class="klein">Handtekening</div><div class="lijnveld hoog"></div>`);
|
|
169
|
+
}
|
|
170
|
+
else if (inst.key === "voettekst" || inst.key === "vrije_tekst") {
|
|
171
|
+
const tekst = velden["voettekst"] ?? velden["opmerking"] ?? velden["order.opmerking"] ?? "";
|
|
172
|
+
if (tekst)
|
|
173
|
+
delen.push(`<div class="klein">${esc(tekst)}</div>`);
|
|
174
|
+
}
|
|
175
|
+
else if (inst.key === "adresblok") {
|
|
176
|
+
const regels = [
|
|
177
|
+
velden["klant.naam"] ?? velden["ontvanger.bedrijf"] ?? "",
|
|
178
|
+
velden["klant.straat"] ?? velden["ontvanger.straat"] ?? "",
|
|
179
|
+
[velden["klant.postcode"] ?? "", velden["klant.plaats"] ?? ""].filter(Boolean).join(" "),
|
|
180
|
+
velden["klant.land"] ?? "",
|
|
181
|
+
].filter((r) => String(r).trim() !== "");
|
|
182
|
+
if (regels.length)
|
|
183
|
+
delen.push(regels.map((r) => `<div>${esc(r)}</div>`).join(""));
|
|
184
|
+
}
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
delen.push(kv(inst.label, waardeVoor(velden, inst)));
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
if (inst.type === "meerkeuze") {
|
|
191
|
+
const keuzes = arr(waarde);
|
|
192
|
+
if (!keuzes.length)
|
|
193
|
+
continue;
|
|
194
|
+
const labels = keuzes.map((k) => inst.opties?.find((o) => o.value === k)?.label ?? k);
|
|
195
|
+
delen.push(kv(inst.label, labels.join(", ")));
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
if (inst.type === "tekst" && String(waarde ?? "").trim() !== "") {
|
|
199
|
+
delen.push(kv(inst.label, String(waarde)));
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
if (markeringen.length) {
|
|
203
|
+
delen.push(`<div class="vet">${esc(markeringen.join(" · "))}</div>`);
|
|
204
|
+
}
|
|
205
|
+
const inhoud = delen.filter(Boolean).join("");
|
|
206
|
+
if (!inhoud)
|
|
207
|
+
return "";
|
|
208
|
+
return `<div class="blok"><div class="sectitel">${esc(groep.label)}</div>${inhoud}</div>`;
|
|
209
|
+
}
|
|
210
|
+
/** Heeft deze layout überhaupt iets aanstaan om af te drukken? */
|
|
211
|
+
export function profielHeeftInhoud(documenttype, config) {
|
|
212
|
+
const profiel = documentProfiel(String(documenttype));
|
|
213
|
+
const cfg = (config ?? {});
|
|
214
|
+
return profiel.groepen.some((groep) => groep.instellingen.some((inst) => {
|
|
215
|
+
const w = configWaarde(cfg, groep, inst);
|
|
216
|
+
if (inst.type === "schakelaar")
|
|
217
|
+
return w === true;
|
|
218
|
+
if (inst.type === "meerkeuze")
|
|
219
|
+
return arr(w).length > 0;
|
|
220
|
+
return false;
|
|
221
|
+
}));
|
|
222
|
+
}
|
|
223
|
+
/** Bouwt de complete print-HTML van een profielgestuurde layout. */
|
|
224
|
+
export function renderProfielDocument(documenttype, config, gegevens, opties = {}) {
|
|
225
|
+
const profiel = documentProfiel(String(documenttype));
|
|
226
|
+
const cfg = (config ?? {});
|
|
227
|
+
const data = (gegevens && typeof gegevens === "object" ? gegevens : {});
|
|
228
|
+
const velden = plat(data);
|
|
229
|
+
const b = opties.breedteMm ?? 210;
|
|
230
|
+
const h = opties.hoogteMm ?? 297;
|
|
231
|
+
const marge = opties.margeMm ?? Math.min(10, Math.max(3, Math.round(b / 20)));
|
|
232
|
+
const nummer = velden["order.nummer"] ?? velden["ordernummer"] ?? velden["documentnummer"] ?? "";
|
|
233
|
+
const kop = `<div class="blok kop"><div class="vet">${esc(opties.kop ?? profiel.label)}</div>${nummer ? `<div class="klein">${esc(nummer)}</div>` : ""}</div>`;
|
|
234
|
+
const body = profiel.groepen
|
|
235
|
+
.filter((groep) => groep.key !== "klantlayout")
|
|
236
|
+
.map((groep) => groepHtml(groep, cfg, velden, data, opties))
|
|
237
|
+
.filter(Boolean)
|
|
238
|
+
.join("");
|
|
239
|
+
return `<!doctype html><html lang="nl"><head><meta charset="utf-8" />
|
|
240
|
+
<title>${esc(opties.titel ?? profiel.label)}</title>
|
|
241
|
+
<style>
|
|
242
|
+
@page { size: ${b}mm ${h}mm; margin: ${marge}mm; }
|
|
243
|
+
* { box-sizing: border-box; }
|
|
244
|
+
html, body { margin: 0; padding: 0; }
|
|
245
|
+
body { font-family: Arial, Helvetica, sans-serif; font-size: 9pt; color: #111827; line-height: 1.35; }
|
|
246
|
+
.blok { margin-bottom: 2.5mm; }
|
|
247
|
+
.kop { border-bottom: 0.3mm solid #d1d5db; padding-bottom: 1mm; }
|
|
248
|
+
.sectitel { font-size: 90%; font-weight: 600; text-transform: uppercase; color: #6b7280; margin-bottom: 0.6mm; }
|
|
249
|
+
.vet { font-weight: 600; }
|
|
250
|
+
.klein { font-size: 85%; color: #6b7280; }
|
|
251
|
+
.kv { display: flex; justify-content: space-between; gap: 3mm; }
|
|
252
|
+
.kv .k { color: #6b7280; }
|
|
253
|
+
.tabel { width: 100%; border-collapse: collapse; table-layout: fixed; }
|
|
254
|
+
.tabel th { text-align: left; font-weight: 600; }
|
|
255
|
+
</style></head><body>${kop}${body}</body></html>`;
|
|
256
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** Het eigen webadres, afgeleid uit het inkomende verzoek. */
|
|
2
|
+
export declare function eigenBasisUrl(): string | null;
|
|
3
|
+
/**
|
|
4
|
+
* Meldt deze shell aan (of houdt hem levend). Doet hooguit één keer per tien
|
|
5
|
+
* minuten iets en laat fouten nooit doorwerken in de aanroeper.
|
|
6
|
+
*/
|
|
7
|
+
export declare function meldRunnerAan(): Promise<void>;
|
|
8
|
+
/** Controleert of de meegegeven sleutel bij een geregistreerde shell hoort. */
|
|
9
|
+
export declare function isRunnerSleutel(sleutel: string): Promise<boolean>;
|
|
10
|
+
//# sourceMappingURL=runnerRegistry.server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runnerRegistry.server.d.ts","sourceRoot":"","sources":["../../src/lib/runnerRegistry.server.ts"],"names":[],"mappings":"AAYA,8DAA8D;AAC9D,wBAAgB,aAAa,IAAI,MAAM,GAAG,IAAI,CAS7C;AAED;;;GAGG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAkCnD;AAED,+EAA+E;AAC/E,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAcvE"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// src/lib/runnerRegistry.server.ts — de module meldt zichzelf aan in de
|
|
3
|
+
// gedeelde database. Zo weet de cron-taak welke shells de printwachtrij
|
|
4
|
+
// kunnen verwerken, zonder dat er ergens een webadres hardcoded staat.
|
|
5
|
+
// ============================================================================
|
|
6
|
+
import { getRequestUrl } from "@tanstack/react-start/server";
|
|
7
|
+
const THROTTLE_MS = 10 * 60 * 1000;
|
|
8
|
+
let laatsteMelding = 0;
|
|
9
|
+
let laatsteUrl = "";
|
|
10
|
+
/** Het eigen webadres, afgeleid uit het inkomende verzoek. */
|
|
11
|
+
export function eigenBasisUrl() {
|
|
12
|
+
try {
|
|
13
|
+
const url = getRequestUrl({ xForwardedHost: true, xForwardedProto: true });
|
|
14
|
+
if (!url?.host)
|
|
15
|
+
return null;
|
|
16
|
+
if (/^(localhost|127\.0\.0\.1|\[::1\])(:|$)/i.test(url.host))
|
|
17
|
+
return null;
|
|
18
|
+
return `${url.protocol}//${url.host}`.replace(/\/+$/, "");
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Meldt deze shell aan (of houdt hem levend). Doet hooguit één keer per tien
|
|
26
|
+
* minuten iets en laat fouten nooit doorwerken in de aanroeper.
|
|
27
|
+
*/
|
|
28
|
+
export async function meldRunnerAan() {
|
|
29
|
+
const basis = eigenBasisUrl();
|
|
30
|
+
if (!basis)
|
|
31
|
+
return;
|
|
32
|
+
const nu = Date.now();
|
|
33
|
+
if (basis === laatsteUrl && nu - laatsteMelding < THROTTLE_MS)
|
|
34
|
+
return;
|
|
35
|
+
laatsteUrl = basis;
|
|
36
|
+
laatsteMelding = nu;
|
|
37
|
+
try {
|
|
38
|
+
const { adminDb: supabaseAdmin } = await import("./supabaseAdmin.server");
|
|
39
|
+
const { data } = await supabaseAdmin
|
|
40
|
+
.from("print_queue_runners")
|
|
41
|
+
.select("id")
|
|
42
|
+
.eq("basis_url", basis)
|
|
43
|
+
.maybeSingle();
|
|
44
|
+
if (data?.id) {
|
|
45
|
+
await supabaseAdmin
|
|
46
|
+
.from("print_queue_runners")
|
|
47
|
+
.update({ laatst_gezien: new Date().toISOString(), actief: true })
|
|
48
|
+
.eq("id", data.id);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
await supabaseAdmin.from("print_queue_runners").insert({
|
|
52
|
+
basis_url: basis,
|
|
53
|
+
laatst_gezien: new Date().toISOString(),
|
|
54
|
+
actief: true,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
// Aanmelden mag nooit een printactie blokkeren.
|
|
59
|
+
laatsteMelding = 0;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/** Controleert of de meegegeven sleutel bij een geregistreerde shell hoort. */
|
|
63
|
+
export async function isRunnerSleutel(sleutel) {
|
|
64
|
+
if (!sleutel || sleutel.length < 20)
|
|
65
|
+
return false;
|
|
66
|
+
try {
|
|
67
|
+
const { adminDb: supabaseAdmin } = await import("./supabaseAdmin.server");
|
|
68
|
+
const { data } = await supabaseAdmin
|
|
69
|
+
.from("print_queue_runners")
|
|
70
|
+
.select("id")
|
|
71
|
+
.eq("tick_sleutel", sleutel)
|
|
72
|
+
.eq("actief", true)
|
|
73
|
+
.maybeSingle();
|
|
74
|
+
return !!data?.id;
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type SupabaseClient } from "@supabase/supabase-js";
|
|
2
|
+
/** Uitleg voor de gebruiker als de serverinstellingen ontbreken. */
|
|
3
|
+
export declare function adminConfiguratieFout(): string | null;
|
|
4
|
+
/** Lazy adminclient: pas bij het eerste gebruik worden de instellingen gelezen. */
|
|
5
|
+
export declare const adminDb: SupabaseClient<any, any, any, any, any>;
|
|
6
|
+
//# sourceMappingURL=supabaseAdmin.server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supabaseAdmin.server.d.ts","sourceRoot":"","sources":["../../src/lib/supabaseAdmin.server.ts"],"names":[],"mappings":"AAMA,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAU1E,oEAAoE;AACpE,wBAAgB,qBAAqB,IAAI,MAAM,GAAG,IAAI,CAQrD;AAaD,mFAAmF;AACnF,eAAO,MAAM,OAAO,yCAKlB,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// src/lib/supabaseAdmin.server.ts — adminclient die in elke shell werkt.
|
|
3
|
+
// Leest de service-role sleutel uit meerdere mogelijke namen, zodat de module
|
|
4
|
+
// niet afhankelijk is van hoe een shell zijn omgeving heeft ingericht.
|
|
5
|
+
// ============================================================================
|
|
6
|
+
import { createClient } from "@supabase/supabase-js";
|
|
7
|
+
function lees(...namen) {
|
|
8
|
+
for (const naam of namen) {
|
|
9
|
+
const waarde = process.env[naam];
|
|
10
|
+
if (waarde && waarde.trim().length > 0)
|
|
11
|
+
return waarde.trim();
|
|
12
|
+
}
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
/** Uitleg voor de gebruiker als de serverinstellingen ontbreken. */
|
|
16
|
+
export function adminConfiguratieFout() {
|
|
17
|
+
const url = lees("SUPABASE_URL", "VITE_SUPABASE_URL");
|
|
18
|
+
const key = lees("SERVICE_ROLE_KEY", "SUPABASE_SERVICE_ROLE_KEY");
|
|
19
|
+
if (url && key)
|
|
20
|
+
return null;
|
|
21
|
+
const mist = [!url ? "SUPABASE_URL" : null, !key ? "SERVICE_ROLE_KEY" : null]
|
|
22
|
+
.filter(Boolean)
|
|
23
|
+
.join(" en ");
|
|
24
|
+
return `Achtergrondprinten is niet ingesteld: ${mist} ontbreekt in deze omgeving.`;
|
|
25
|
+
}
|
|
26
|
+
function maakClient() {
|
|
27
|
+
const url = lees("SUPABASE_URL", "VITE_SUPABASE_URL");
|
|
28
|
+
const key = lees("SERVICE_ROLE_KEY", "SUPABASE_SERVICE_ROLE_KEY");
|
|
29
|
+
if (!url || !key)
|
|
30
|
+
throw new Error(adminConfiguratieFout() ?? "Serverinstellingen ontbreken.");
|
|
31
|
+
return createClient(url, key, {
|
|
32
|
+
auth: { storage: undefined, persistSession: false, autoRefreshToken: false },
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
let _client;
|
|
36
|
+
/** Lazy adminclient: pas bij het eerste gebruik worden de instellingen gelezen. */
|
|
37
|
+
export const adminDb = new Proxy({}, {
|
|
38
|
+
get(_t, prop, receiver) {
|
|
39
|
+
if (!_client)
|
|
40
|
+
_client = maakClient();
|
|
41
|
+
return Reflect.get(_client, prop, receiver);
|
|
42
|
+
},
|
|
43
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testpagina.d.ts","sourceRoot":"","sources":["../../src/lib/testpagina.ts"],"names":[],"mappings":"AAQA,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,iBAsBrE"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// src/lib/testpagina.ts — een testpagina naar een printer sturen
|
|
3
|
+
// ============================================================================
|
|
4
|
+
import { toast } from "@flowselections/core";
|
|
5
|
+
import { drukAf } from "./browserPrint";
|
|
6
|
+
import { printDirect } from "./directPrint";
|
|
7
|
+
export async function drukTestpaginaAf(printerId, naam) {
|
|
8
|
+
const html = `<div style="padding:20mm;font-size:14pt"><h1 style="font-size:20pt">Testpagina</h1>
|
|
9
|
+
<p>Deze pagina hoort uit: <strong>${naam}</strong></p></div>`;
|
|
10
|
+
const opdracht = {
|
|
11
|
+
documenttype: "pakbon",
|
|
12
|
+
formaatCode: "A4",
|
|
13
|
+
orientatie: "portrait",
|
|
14
|
+
documentnaam: "Testpagina",
|
|
15
|
+
html,
|
|
16
|
+
printerId,
|
|
17
|
+
};
|
|
18
|
+
try {
|
|
19
|
+
const direct = await printDirect(opdracht);
|
|
20
|
+
if (direct.gelukt) {
|
|
21
|
+
toast.success(`Testpagina verstuurd naar ${direct.printernaam ?? naam}`);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
if (direct.reden)
|
|
25
|
+
toast.error(direct.reden);
|
|
26
|
+
await drukAf(opdracht);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
toast.error("De testpagina kon niet worden afgedrukt");
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Roept `fn` elke `intervalMs` aan, maar alleen wanneer het tabblad zichtbaar is
|
|
3
|
+
* en er niet gepauzeerd wordt (bijvoorbeeld tijdens een open dialoog).
|
|
4
|
+
* Geeft het tijdstip van de laatste geslaagde ronde terug.
|
|
5
|
+
*/
|
|
6
|
+
export declare function useAutoRefresh(fn: () => void | Promise<unknown>, intervalMs: number, pauze?: boolean): Date | null;
|
|
7
|
+
export declare function bijgewerktTekst(d: Date | null): string;
|
|
8
|
+
//# sourceMappingURL=useAutoRefresh.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAutoRefresh.d.ts","sourceRoot":"","sources":["../../src/lib/useAutoRefresh.ts"],"names":[],"mappings":"AAMA;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,EAAE,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,EACjC,UAAU,EAAE,MAAM,EAClB,KAAK,UAAQ,eA2Bd;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,UAG7C"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// src/lib/useAutoRefresh.ts — periodiek stil vernieuwen van lijsten
|
|
3
|
+
// ============================================================================
|
|
4
|
+
import { useEffect, useRef, useState } from "react";
|
|
5
|
+
/**
|
|
6
|
+
* Roept `fn` elke `intervalMs` aan, maar alleen wanneer het tabblad zichtbaar is
|
|
7
|
+
* en er niet gepauzeerd wordt (bijvoorbeeld tijdens een open dialoog).
|
|
8
|
+
* Geeft het tijdstip van de laatste geslaagde ronde terug.
|
|
9
|
+
*/
|
|
10
|
+
export function useAutoRefresh(fn, intervalMs, pauze = false) {
|
|
11
|
+
const fnRef = useRef(fn);
|
|
12
|
+
fnRef.current = fn;
|
|
13
|
+
const bezig = useRef(false);
|
|
14
|
+
const [bijgewerkt, setBijgewerkt] = useState(null);
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
if (pauze || intervalMs <= 0)
|
|
17
|
+
return;
|
|
18
|
+
const tik = async () => {
|
|
19
|
+
if (bezig.current)
|
|
20
|
+
return;
|
|
21
|
+
if (typeof document !== "undefined" && document.visibilityState !== "visible")
|
|
22
|
+
return;
|
|
23
|
+
bezig.current = true;
|
|
24
|
+
try {
|
|
25
|
+
await fnRef.current();
|
|
26
|
+
setBijgewerkt(new Date());
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
/* stil: de gebruiker ziet de vorige gegevens */
|
|
30
|
+
}
|
|
31
|
+
finally {
|
|
32
|
+
bezig.current = false;
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
const timer = setInterval(() => void tik(), intervalMs);
|
|
36
|
+
return () => clearInterval(timer);
|
|
37
|
+
}, [intervalMs, pauze]);
|
|
38
|
+
return bijgewerkt;
|
|
39
|
+
}
|
|
40
|
+
export function bijgewerktTekst(d) {
|
|
41
|
+
if (!d)
|
|
42
|
+
return "";
|
|
43
|
+
return `Bijgewerkt om ${d.toLocaleTimeString("nl-NL", { hour: "2-digit", minute: "2-digit" })}`;
|
|
44
|
+
}
|
|
@@ -29,11 +29,12 @@ export interface PrintJobModel {
|
|
|
29
29
|
gebruiker_naam: string | null;
|
|
30
30
|
created_at: string;
|
|
31
31
|
voltooid_op: string | null;
|
|
32
|
+
extern_job_id?: string | null;
|
|
32
33
|
}
|
|
33
34
|
export declare function useLayouts(): {
|
|
34
35
|
layouts: LayoutModel[];
|
|
35
36
|
loading: boolean;
|
|
36
|
-
reload: () => Promise<void>;
|
|
37
|
+
reload: (stil?: boolean) => Promise<void>;
|
|
37
38
|
};
|
|
38
39
|
export declare function maakLayout(input: {
|
|
39
40
|
naam: string;
|
|
@@ -75,7 +76,7 @@ export declare function usePrinters(): {
|
|
|
75
76
|
printer_id: string;
|
|
76
77
|
}[];
|
|
77
78
|
loading: boolean;
|
|
78
|
-
reload: () => Promise<void>;
|
|
79
|
+
reload: (stil?: boolean) => Promise<void>;
|
|
79
80
|
};
|
|
80
81
|
export declare function bewaarPrinter(input: Record<string, unknown>, id?: string): Promise<void>;
|
|
81
82
|
export declare function verwijderPrinter(id: string): Promise<void>;
|
|
@@ -83,7 +84,7 @@ export declare function toggleKoppeling(layoutId: string, printerId: string, aan
|
|
|
83
84
|
export declare function usePrintJobs(): {
|
|
84
85
|
jobs: PrintJobModel[];
|
|
85
86
|
loading: boolean;
|
|
86
|
-
reload: () => Promise<void>;
|
|
87
|
+
reload: (stil?: boolean) => Promise<void>;
|
|
87
88
|
};
|
|
88
89
|
export declare function updateJobStatus(id: string, status: string): Promise<void>;
|
|
89
90
|
export declare function maakPrintJob(input: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDocumentData.d.ts","sourceRoot":"","sources":["../../src/lib/useDocumentData.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAIrF,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"useDocumentData.d.ts","sourceRoot":"","sources":["../../src/lib/useDocumentData.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,13 +9,14 @@ const arr = (v) => (Array.isArray(v) ? v : []);
|
|
|
9
9
|
export function useLayouts() {
|
|
10
10
|
const [layouts, setLayouts] = useState([]);
|
|
11
11
|
const [loading, setLoading] = useState(true);
|
|
12
|
-
const load = useCallback(async () => {
|
|
13
|
-
|
|
12
|
+
const load = useCallback(async (stil = false) => {
|
|
13
|
+
if (!stil)
|
|
14
|
+
setLoading(true);
|
|
14
15
|
const { data, error } = await supabase
|
|
15
16
|
.from("document_layouts")
|
|
16
17
|
.select("*")
|
|
17
18
|
.order("updated_at", { ascending: false });
|
|
18
|
-
if (error)
|
|
19
|
+
if (error && !stil)
|
|
19
20
|
toast.error("Layouts laden mislukt");
|
|
20
21
|
setLayouts(arr(data));
|
|
21
22
|
setLoading(false);
|
|
@@ -209,8 +210,9 @@ export function usePrinters() {
|
|
|
209
210
|
const [printers, setPrinters] = useState([]);
|
|
210
211
|
const [koppelingen, setKoppelingen] = useState([]);
|
|
211
212
|
const [loading, setLoading] = useState(true);
|
|
212
|
-
const load = useCallback(async () => {
|
|
213
|
-
|
|
213
|
+
const load = useCallback(async (stil = false) => {
|
|
214
|
+
if (!stil)
|
|
215
|
+
setLoading(true);
|
|
214
216
|
const [{ data: p }, { data: m }] = await Promise.all([
|
|
215
217
|
supabase.from("printers").select("*").order("naam"),
|
|
216
218
|
supabase.from("printer_mappings").select("layout_id, printer_id"),
|
|
@@ -252,8 +254,9 @@ export async function toggleKoppeling(layoutId, printerId, aan) {
|
|
|
252
254
|
export function usePrintJobs() {
|
|
253
255
|
const [jobs, setJobs] = useState([]);
|
|
254
256
|
const [loading, setLoading] = useState(true);
|
|
255
|
-
const load = useCallback(async () => {
|
|
256
|
-
|
|
257
|
+
const load = useCallback(async (stil = false) => {
|
|
258
|
+
if (!stil)
|
|
259
|
+
setLoading(true);
|
|
257
260
|
const { data } = await supabase
|
|
258
261
|
.from("print_jobs")
|
|
259
262
|
.select("*")
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface GevondenPrinter {
|
|
2
|
+
id: string;
|
|
3
|
+
naam: string;
|
|
4
|
+
computer: string;
|
|
5
|
+
online: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function useNetwerkPrinters(): {
|
|
8
|
+
gevonden: GevondenPrinter[];
|
|
9
|
+
bezig: boolean;
|
|
10
|
+
zoek: () => Promise<void>;
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=useNetwerkPrinters.d.ts.map
|
|
@@ -0,0 +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;;;;EAqBjC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// src/lib/useNetwerkPrinters.ts — printers die in het netwerk gevonden worden
|
|
3
|
+
// ============================================================================
|
|
4
|
+
import { useCallback, useEffect, useState } from "react";
|
|
5
|
+
import { netwerkPrinters } from "./printService.functions";
|
|
6
|
+
export function useNetwerkPrinters() {
|
|
7
|
+
const [gevonden, setGevonden] = useState([]);
|
|
8
|
+
const [bezig, setBezig] = useState(false);
|
|
9
|
+
const zoek = useCallback(async () => {
|
|
10
|
+
setBezig(true);
|
|
11
|
+
try {
|
|
12
|
+
const res = await netwerkPrinters({ data: undefined });
|
|
13
|
+
setGevonden(res.ok && Array.isArray(res.printers) ? res.printers : []);
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
setGevonden([]);
|
|
17
|
+
}
|
|
18
|
+
finally {
|
|
19
|
+
setBezig(false);
|
|
20
|
+
}
|
|
21
|
+
}, []);
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
void zoek();
|
|
24
|
+
}, [zoek]);
|
|
25
|
+
return { gevonden, bezig, zoek };
|
|
26
|
+
}
|