@flowselections/layout-maker 1.45.9 → 1.45.19

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 (65) hide show
  1. package/README.md +139 -139
  2. package/dist-lib/components/AfdrukKnop.d.ts +19 -19
  3. package/dist-lib/components/AfdrukKnop.js +64 -64
  4. package/dist-lib/components/NetwerkPrintersDialog.d.ts +7 -7
  5. package/dist-lib/components/NetwerkPrintersDialog.js +79 -79
  6. package/dist-lib/components/PakbonPreview.d.ts.map +1 -1
  7. package/dist-lib/components/PakbonPreview.js +2 -2
  8. package/dist-lib/components/PrintQueuePage.d.ts.map +1 -1
  9. package/dist-lib/components/PrintQueuePage.js +42 -5
  10. package/dist-lib/components/PrinterSetupWizard.js +3 -3
  11. package/dist-lib/components/PrintersRedirectPage.d.ts +1 -1
  12. package/dist-lib/components/PrintersRedirectPage.js +14 -14
  13. package/dist-lib/index.d.ts +1 -0
  14. package/dist-lib/index.d.ts.map +1 -1
  15. package/dist-lib/index.js +1 -0
  16. package/dist-lib/integrations/supabase/auth-middleware.d.ts +4489 -277
  17. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  18. package/dist-lib/integrations/supabase/client.server.d.ts +4489 -277
  19. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  20. package/dist-lib/integrations/supabase/client.server.js +1 -1
  21. package/dist-lib/integrations/supabase/moduleClient.d.ts +4489 -277
  22. package/dist-lib/integrations/supabase/moduleClient.d.ts.map +1 -1
  23. package/dist-lib/integrations/supabase/types.d.ts +4506 -253
  24. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  25. package/dist-lib/lib/aiLayout.functions.d.ts +4489 -277
  26. package/dist-lib/lib/aiLayout.functions.d.ts.map +1 -1
  27. package/dist-lib/lib/aiLayout.server.js +9 -9
  28. package/dist-lib/lib/browserPrint.js +1 -1
  29. package/dist-lib/lib/fieldRegistry.js +1 -0
  30. package/dist-lib/lib/layoutPreview.js +7 -7
  31. package/dist-lib/lib/logoLibrary.d.ts +2 -1
  32. package/dist-lib/lib/logoLibrary.d.ts.map +1 -1
  33. package/dist-lib/lib/logoLibrary.js +42 -2
  34. package/dist-lib/lib/orderData.server.d.ts.map +1 -1
  35. package/dist-lib/lib/orderData.server.js +13 -0
  36. package/dist-lib/lib/pakbonBuilder.d.ts +26 -0
  37. package/dist-lib/lib/pakbonBuilder.d.ts.map +1 -1
  38. package/dist-lib/lib/pakbonBuilder.js +37 -0
  39. package/dist-lib/lib/pakbonContent.d.ts.map +1 -1
  40. package/dist-lib/lib/pakbonContent.js +2 -2
  41. package/dist-lib/lib/pakbonHtml.d.ts.map +1 -1
  42. package/dist-lib/lib/pakbonHtml.js +60 -60
  43. package/dist-lib/lib/pakbonPresentation.d.ts.map +1 -1
  44. package/dist-lib/lib/pakbonPresentation.js +2 -4
  45. package/dist-lib/lib/pdfJobSaver.d.ts.map +1 -1
  46. package/dist-lib/lib/pdfJobSaver.js +31 -2
  47. package/dist-lib/lib/pdfMap.d.ts +7 -0
  48. package/dist-lib/lib/pdfMap.d.ts.map +1 -1
  49. package/dist-lib/lib/pdfMap.js +17 -0
  50. package/dist-lib/lib/printQueue.server.d.ts.map +1 -1
  51. package/dist-lib/lib/printQueue.server.js +142 -15
  52. package/dist-lib/lib/printService.functions.d.ts +47214 -52
  53. package/dist-lib/lib/printService.functions.d.ts.map +1 -1
  54. package/dist-lib/lib/printService.functions.js +69 -0
  55. package/dist-lib/lib/printService.server.d.ts +2 -0
  56. package/dist-lib/lib/printService.server.d.ts.map +1 -1
  57. package/dist-lib/lib/printService.server.js +10 -0
  58. package/dist-lib/lib/productiebonHtml.js +15 -15
  59. package/dist-lib/lib/profielHtml.d.ts.map +1 -1
  60. package/dist-lib/lib/profielHtml.js +22 -19
  61. package/dist-lib/lib/supabaseAdmin.server.d.ts +5 -5
  62. package/dist-lib/lib/supabaseAdmin.server.js +43 -43
  63. package/dist-lib/lib/testpagina.js +3 -3
  64. package/dist-lib/lib/testprint.js +4 -4
  65. package/package.json +3 -3
package/README.md CHANGED
@@ -1,139 +1,139 @@
1
- # Layout maker (pakbonnen, verzendbrieven, ectra)
2
-
3
- blank project start
4
-
5
- This project was built with [Lovable](https://lovable.dev).
6
-
7
- ## Build with Lovable
8
-
9
- Continue developing this project in the [Lovable editor](https://lovable.dev/projects/4735fccb-b385-4b48-b4f8-ef135f63f4f7).
10
-
11
- - **Ship faster**: describe what you want to build and Lovable handles the code.
12
- - **Stay in sync**: every change made in Lovable is committed straight to this repository.
13
- - **Full ownership**: this code is yours. Push to `main` on GitHub and your changes sync back into Lovable, ready for your next prompt.
14
-
15
- ## Development
16
-
17
- Prefer working locally? You need Node.js and npm — [install with nvm](https://github.com/nvm-sh/nvm#installing-and-updating).
18
-
19
- ```sh
20
- git clone <this-repository-url>
21
- cd <repository-name>
22
- npm i
23
- npm run dev
24
- ```
25
-
26
- ## Installeren in een andere shell
27
-
28
- 1. Draai `sql/print-schema.sql` één keer in de Supabase-database van die shell
29
- (SQL editor). Het script is idempotent en zet tabellen, rechten, RLS,
30
- functies, de geplande taken én de opslagmap `layout-logos` voor de Logo
31
- Bibliotheek klaar. Zorg dat de extensies `pg_cron` en `pg_net` aan staan.
32
-
33
- 2. Zet in de omgeving van de shell:
34
- - `SUPABASE_URL` en `SERVICE_ROLE_KEY` — nodig voor achtergrondprinten
35
- - `CENTRAL_AUTH_URL` en `CENTRAL_AUTH_SECRET` — nodig voor de printdienst
36
- 3. Zorg dat de shell het tick-eindpunt host. De setup-CLI doet dit automatisch
37
- op basis van `flowselections.serverRoutes` in `package.json`. Handmatig
38
- opgezette shells maken zelf dit bestand aan:
39
-
40
- ```ts
41
- // src/routes/api/public/print/queue-tick.ts
42
- import { createFileRoute } from "@tanstack/react-router";
43
- import { behandelQueueTick } from "@flowselections/layout-maker/print";
44
-
45
- export const Route = createFileRoute("/api/public/print/queue-tick")({
46
- server: {
47
- handlers: {
48
- POST: async ({ request }) => {
49
- // De shell levert de databaseverbinding; de module maakt er nooit zelf een.
50
- const { supabaseAdmin } = await import(
51
- "../../../../integrations/supabase/client.server"
52
- );
53
- return behandelQueueTick(request, supabaseAdmin);
54
- },
55
- },
56
- },
57
- });
58
- ```
59
-
60
- Het eindpunt accepteert drie toegangsbewijzen: een runner-sleutel uit
61
- `print_queue_runners.tick_sleutel`, `SUPABASE_PUBLISHABLE_KEY` (de cron) of
62
- het sessietoken van een ingelogde gebruiker (de knop in de Printwachtrij).
63
-
64
-
65
- 4. Klaar. Zodra de module in de shell draait meldt hij zichzelf aan als
66
- verwerker van de printwachtrij. Een nieuwe printopdracht wordt meteen
67
- opgepakt; daarnaast verwerkt de geplande taak `print-queue-tick` elke minuut
68
- de wachtende opdrachten. Reageert een shell een uur lang niet, dan wordt hij
69
- automatisch op inactief gezet. De taak `print-queue-cleanup` ruimt dagelijks
70
- oude opdrachten en bestanden op.
71
-
72
- ## Printen vanuit een andere module
73
-
74
- Andere modules in dezelfde shell gebruiken uitsluitend de print-API van deze
75
- module; zij hoeven de printtabellen niet te kennen en mogen er ook niet zelf in
76
- schrijven (dan blijft de opdracht wachten tot de volgende cronronde).
77
-
78
- ```ts
79
- import {
80
- printDocument, printPdf, printHtml,
81
- printerVoorWerkplek, printerVoorDocumenttype, volgJobStatus,
82
- } from "@flowselections/layout-maker";
83
-
84
- // 1. Document dat via een ontwerp uit deze module wordt opgemaakt
85
- const { jobId } = await printDocument({
86
- documenttype: "pakbon", // moet een bestaande documentsoort zijn
87
- documentnaam: "PB-2601284",
88
- payload: { order, order_id: order.id }, // order_id: verplicht kenmerk
89
- });
90
-
91
- // 2. Kant-en-klare PDF (Floriday-document, klantsticker, externe factuur)
92
- // Zonder printerId wordt de printer bepaald via de gekoppelde layout van
93
- // de documentsoort (of de koppeling op papierformaat).
94
- await printPdf({
95
- documenttype: "factuur",
96
- documentnaam: "F-2026-00123",
97
- pdfBase64, // met of zonder data:-voorvoegsel
98
- payload: { order_id: factuur.id },
99
- });
100
-
101
- // Geef in payload altijd een order-kenmerk mee: queue_item_id, order_id of
102
- // ordernummer. De wachtrij gebruikt dat om dubbele aanvragen te herkennen;
103
- // zonder kenmerk kunnen twee orders met dezelfde documentnaam binnen tien
104
- // minuten als dubbel worden gezien.
105
-
106
-
107
- // Of expliciet per werkplek:
108
- const printerId = await printerVoorWerkplek("PICKSTATION-1", "A4");
109
- await printPdf({
110
- documenttype: "afleverbrief",
111
- documentnaam: "AFL-12345",
112
- pdfBase64,
113
- printerId: printerId!,
114
- });
115
-
116
-
117
- // 3. Eigen opmaak afdrukken (geen layout, anders wint de layout)
118
- await printHtml({
119
- documenttype: "controlelijst",
120
- documentnaam: "Controlelijst kar 12",
121
- html,
122
- printerId: printerId!,
123
- });
124
-
125
- // Status live volgen (realtime staat aan op print_jobs)
126
- const stop = volgJobStatus(jobId, (s) => console.log(s.status, s.foutmelding));
127
- ```
128
-
129
- Belangrijk:
130
-
131
- - **Documentsoorten** liggen vast in de database: pakbon, factuur, offerte,
132
- orderbevestiging, etiket, verzendlabel, productlabel, barcode_label,
133
- magazijnlijst, controlelijst, transportdocument, sticker, productiebon,
134
- veilingbon, afleverbrief, veilingbrief en vrij.
135
- - **Beslisvolgorde bij het afdrukken**: kant-en-klare PDF > gekoppelde layout >
136
- meegestuurde opmaak > actieve layout van de documentsoort.
137
- - **Dubbelbeveiliging**: een identieke aanvraag binnen 10 minuten wordt
138
- genegeerd; de aanroep werpt dan `DubbeleAanvraagFout`. Geef bij bulkprints per
139
- document een eigen `documentnaam` zodat elke opdracht uniek is.
1
+ # Layout maker (pakbonnen, verzendbrieven, ectra)
2
+
3
+ blank project start
4
+
5
+ This project was built with [Lovable](https://lovable.dev).
6
+
7
+ ## Build with Lovable
8
+
9
+ Continue developing this project in the [Lovable editor](https://lovable.dev/projects/4735fccb-b385-4b48-b4f8-ef135f63f4f7).
10
+
11
+ - **Ship faster**: describe what you want to build and Lovable handles the code.
12
+ - **Stay in sync**: every change made in Lovable is committed straight to this repository.
13
+ - **Full ownership**: this code is yours. Push to `main` on GitHub and your changes sync back into Lovable, ready for your next prompt.
14
+
15
+ ## Development
16
+
17
+ Prefer working locally? You need Node.js and npm — [install with nvm](https://github.com/nvm-sh/nvm#installing-and-updating).
18
+
19
+ ```sh
20
+ git clone <this-repository-url>
21
+ cd <repository-name>
22
+ npm i
23
+ npm run dev
24
+ ```
25
+
26
+ ## Installeren in een andere shell
27
+
28
+ 1. Draai `sql/print-schema.sql` één keer in de Supabase-database van die shell
29
+ (SQL editor). Het script is idempotent en zet tabellen, rechten, RLS,
30
+ functies, de geplande taken én de opslagmap `layout-logos` voor de Logo
31
+ Bibliotheek klaar. Zorg dat de extensies `pg_cron` en `pg_net` aan staan.
32
+
33
+ 2. Zet in de omgeving van de shell:
34
+ - `SUPABASE_URL` en `SERVICE_ROLE_KEY` — nodig voor achtergrondprinten
35
+ - `CENTRAL_AUTH_URL` en `CENTRAL_AUTH_SECRET` — nodig voor de printdienst
36
+ 3. Zorg dat de shell het tick-eindpunt host. De setup-CLI doet dit automatisch
37
+ op basis van `flowselections.serverRoutes` in `package.json`. Handmatig
38
+ opgezette shells maken zelf dit bestand aan:
39
+
40
+ ```ts
41
+ // src/routes/api/public/print/queue-tick.ts
42
+ import { createFileRoute } from "@tanstack/react-router";
43
+ import { behandelQueueTick } from "@flowselections/layout-maker/print";
44
+
45
+ export const Route = createFileRoute("/api/public/print/queue-tick")({
46
+ server: {
47
+ handlers: {
48
+ POST: async ({ request }) => {
49
+ // De shell levert de databaseverbinding; de module maakt er nooit zelf een.
50
+ const { supabaseAdmin } = await import(
51
+ "../../../../integrations/supabase/client.server"
52
+ );
53
+ return behandelQueueTick(request, supabaseAdmin);
54
+ },
55
+ },
56
+ },
57
+ });
58
+ ```
59
+
60
+ Het eindpunt accepteert drie toegangsbewijzen: een runner-sleutel uit
61
+ `print_queue_runners.tick_sleutel`, `SUPABASE_PUBLISHABLE_KEY` (de cron) of
62
+ het sessietoken van een ingelogde gebruiker (de knop in de Printwachtrij).
63
+
64
+
65
+ 4. Klaar. Zodra de module in de shell draait meldt hij zichzelf aan als
66
+ verwerker van de printwachtrij. Een nieuwe printopdracht wordt meteen
67
+ opgepakt; daarnaast verwerkt de geplande taak `print-queue-tick` elke minuut
68
+ de wachtende opdrachten. Reageert een shell een uur lang niet, dan wordt hij
69
+ automatisch op inactief gezet. De taak `print-queue-cleanup` ruimt dagelijks
70
+ oude opdrachten en bestanden op.
71
+
72
+ ## Printen vanuit een andere module
73
+
74
+ Andere modules in dezelfde shell gebruiken uitsluitend de print-API van deze
75
+ module; zij hoeven de printtabellen niet te kennen en mogen er ook niet zelf in
76
+ schrijven (dan blijft de opdracht wachten tot de volgende cronronde).
77
+
78
+ ```ts
79
+ import {
80
+ printDocument, printPdf, printHtml,
81
+ printerVoorWerkplek, printerVoorDocumenttype, volgJobStatus,
82
+ } from "@flowselections/layout-maker";
83
+
84
+ // 1. Document dat via een ontwerp uit deze module wordt opgemaakt
85
+ const { jobId } = await printDocument({
86
+ documenttype: "pakbon", // moet een bestaande documentsoort zijn
87
+ documentnaam: "PB-2601284",
88
+ payload: { order, order_id: order.id }, // order_id: verplicht kenmerk
89
+ });
90
+
91
+ // 2. Kant-en-klare PDF (Floriday-document, klantsticker, externe factuur)
92
+ // Zonder printerId wordt de printer bepaald via de gekoppelde layout van
93
+ // de documentsoort (of de koppeling op papierformaat).
94
+ await printPdf({
95
+ documenttype: "factuur",
96
+ documentnaam: "F-2026-00123",
97
+ pdfBase64, // met of zonder data:-voorvoegsel
98
+ payload: { order_id: factuur.id },
99
+ });
100
+
101
+ // Geef in payload altijd een order-kenmerk mee: queue_item_id, order_id of
102
+ // ordernummer. De wachtrij gebruikt dat om dubbele aanvragen te herkennen;
103
+ // zonder kenmerk kunnen twee orders met dezelfde documentnaam binnen tien
104
+ // minuten als dubbel worden gezien.
105
+
106
+
107
+ // Of expliciet per werkplek:
108
+ const printerId = await printerVoorWerkplek("PICKSTATION-1", "A4");
109
+ await printPdf({
110
+ documenttype: "afleverbrief",
111
+ documentnaam: "AFL-12345",
112
+ pdfBase64,
113
+ printerId: printerId!,
114
+ });
115
+
116
+
117
+ // 3. Eigen opmaak afdrukken (geen layout, anders wint de layout)
118
+ await printHtml({
119
+ documenttype: "controlelijst",
120
+ documentnaam: "Controlelijst kar 12",
121
+ html,
122
+ printerId: printerId!,
123
+ });
124
+
125
+ // Status live volgen (realtime staat aan op print_jobs)
126
+ const stop = volgJobStatus(jobId, (s) => console.log(s.status, s.foutmelding));
127
+ ```
128
+
129
+ Belangrijk:
130
+
131
+ - **Documentsoorten** liggen vast in de database: pakbon, factuur, offerte,
132
+ orderbevestiging, etiket, verzendlabel, productlabel, barcode_label,
133
+ magazijnlijst, controlelijst, transportdocument, sticker, productiebon,
134
+ veilingbon, afleverbrief, veilingbrief en vrij.
135
+ - **Beslisvolgorde bij het afdrukken**: kant-en-klare PDF > gekoppelde layout >
136
+ meegestuurde opmaak > actieve layout van de documentsoort.
137
+ - **Dubbelbeveiliging**: een identieke aanvraag binnen 10 minuten wordt
138
+ genegeerd; de aanroep werpt dan `DubbeleAanvraagFout`. Geef bij bulkprints per
139
+ document een eigen `documentnaam` zodat elke opdracht uniek is.
@@ -1,20 +1,20 @@
1
- import { type Orientatie } from "../lib/browserPrint.js";
2
- export interface AfdrukKnopProps {
3
- documenttype: string;
4
- formaatCode: string | null;
5
- orientatie: Orientatie;
6
- /** Levert de HTML van het document aan op het moment van afdrukken. */
7
- getHtml: () => string;
8
- css?: string;
9
- documentnaam?: string;
10
- label?: string;
11
- layoutId?: string | null;
12
- kopieen?: number;
13
- }
14
- /**
15
- * @deprecated Verouderd — deze knop gebruikt het browser-printvenster als
16
- * terugval. Gebruik `printHtml()` / `printPdf()` uit `printApi` zodat alles
17
- * via PrintNode loopt.
18
- */
19
- export declare function AfdrukKnop({ documenttype, formaatCode, orientatie, getHtml, css, documentnaam, label, layoutId, kopieen, }: AfdrukKnopProps): import("react/jsx-runtime").JSX.Element;
1
+ import { type Orientatie } from "../lib/browserPrint.js";
2
+ export interface AfdrukKnopProps {
3
+ documenttype: string;
4
+ formaatCode: string | null;
5
+ orientatie: Orientatie;
6
+ /** Levert de HTML van het document aan op het moment van afdrukken. */
7
+ getHtml: () => string;
8
+ css?: string;
9
+ documentnaam?: string;
10
+ label?: string;
11
+ layoutId?: string | null;
12
+ kopieen?: number;
13
+ }
14
+ /**
15
+ * @deprecated Verouderd — deze knop gebruikt het browser-printvenster als
16
+ * terugval. Gebruik `printHtml()` / `printPdf()` uit `printApi` zodat alles
17
+ * via PrintNode loopt.
18
+ */
19
+ export declare function AfdrukKnop({ documenttype, formaatCode, orientatie, getHtml, css, documentnaam, label, layoutId, kopieen, }: AfdrukKnopProps): import("react/jsx-runtime").JSX.Element;
20
20
  //# sourceMappingURL=AfdrukKnop.d.ts.map
@@ -1,64 +1,64 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- // ============================================================================
3
- // src/components/AfdrukKnop.tsx — afdrukken met automatisch ingesteld
4
- // papierformaat, stand en de bedoelde printer. Waar mogelijk gaat het
5
- // document direct naar de printer; anders opent het printvenster.
6
- // ============================================================================
7
- import { useState } from "react";
8
- import { Button, toast } from "@flowselections/core";
9
- import { Loader2, Printer } from "lucide-react";
10
- import { drukAf } from "../lib/browserPrint.js";
11
- import { printDirect } from "../lib/directPrint.js";
12
- /**
13
- * @deprecated Verouderd — deze knop gebruikt het browser-printvenster als
14
- * terugval. Gebruik `printHtml()` / `printPdf()` uit `printApi` zodat alles
15
- * via PrintNode loopt.
16
- */
17
- export function AfdrukKnop({ documenttype, formaatCode, orientatie, getHtml, css, documentnaam, label = "Afdrukken", layoutId, kopieen, }) {
18
- const [bezig, setBezig] = useState(false);
19
- const afdrukken = async () => {
20
- setBezig(true);
21
- try {
22
- const html = getHtml();
23
- const direct = await printDirect({
24
- documenttype,
25
- formaatCode,
26
- orientatie,
27
- html,
28
- css,
29
- documentnaam,
30
- layoutId: layoutId ?? null,
31
- kopieen,
32
- });
33
- if (direct.gelukt) {
34
- toast.success(direct.printernaam
35
- ? `Verstuurd naar ${direct.printernaam}`
36
- : "Het document is naar de printer verstuurd");
37
- return;
38
- }
39
- if (direct.reden)
40
- toast.error(direct.reden);
41
- const { printer } = await drukAf({
42
- documenttype,
43
- formaatCode,
44
- orientatie,
45
- html,
46
- css,
47
- documentnaam,
48
- });
49
- if (printer) {
50
- toast.info(`Kies in het printvenster: ${printer.systeemnaam ?? printer.naam}`);
51
- }
52
- else {
53
- toast.info("Er is nog geen vaste printer ingesteld voor dit document.");
54
- }
55
- }
56
- catch {
57
- toast.error("Afdrukken mislukt");
58
- }
59
- finally {
60
- setBezig(false);
61
- }
62
- };
63
- return (_jsxs(Button, { variant: "outline", disabled: bezig, onClick: () => void afdrukken(), children: [bezig ? _jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }) : _jsx(Printer, { className: "mr-2 h-4 w-4" }), label] }));
64
- }
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // ============================================================================
3
+ // src/components/AfdrukKnop.tsx — afdrukken met automatisch ingesteld
4
+ // papierformaat, stand en de bedoelde printer. Waar mogelijk gaat het
5
+ // document direct naar de printer; anders opent het printvenster.
6
+ // ============================================================================
7
+ import { useState } from "react";
8
+ import { Button, toast } from "@flowselections/core";
9
+ import { Loader2, Printer } from "lucide-react";
10
+ import { drukAf } from "../lib/browserPrint.js";
11
+ import { printDirect } from "../lib/directPrint.js";
12
+ /**
13
+ * @deprecated Verouderd — deze knop gebruikt het browser-printvenster als
14
+ * terugval. Gebruik `printHtml()` / `printPdf()` uit `printApi` zodat alles
15
+ * via PrintNode loopt.
16
+ */
17
+ export function AfdrukKnop({ documenttype, formaatCode, orientatie, getHtml, css, documentnaam, label = "Afdrukken", layoutId, kopieen, }) {
18
+ const [bezig, setBezig] = useState(false);
19
+ const afdrukken = async () => {
20
+ setBezig(true);
21
+ try {
22
+ const html = getHtml();
23
+ const direct = await printDirect({
24
+ documenttype,
25
+ formaatCode,
26
+ orientatie,
27
+ html,
28
+ css,
29
+ documentnaam,
30
+ layoutId: layoutId ?? null,
31
+ kopieen,
32
+ });
33
+ if (direct.gelukt) {
34
+ toast.success(direct.printernaam
35
+ ? `Verstuurd naar ${direct.printernaam}`
36
+ : "Het document is naar de printer verstuurd");
37
+ return;
38
+ }
39
+ if (direct.reden)
40
+ toast.error(direct.reden);
41
+ const { printer } = await drukAf({
42
+ documenttype,
43
+ formaatCode,
44
+ orientatie,
45
+ html,
46
+ css,
47
+ documentnaam,
48
+ });
49
+ if (printer) {
50
+ toast.info(`Kies in het printvenster: ${printer.systeemnaam ?? printer.naam}`);
51
+ }
52
+ else {
53
+ toast.info("Er is nog geen vaste printer ingesteld voor dit document.");
54
+ }
55
+ }
56
+ catch {
57
+ toast.error("Afdrukken mislukt");
58
+ }
59
+ finally {
60
+ setBezig(false);
61
+ }
62
+ };
63
+ return (_jsxs(Button, { variant: "outline", disabled: bezig, onClick: () => void afdrukken(), children: [bezig ? _jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }) : _jsx(Printer, { className: "mr-2 h-4 w-4" }), label] }));
64
+ }
@@ -1,8 +1,8 @@
1
- export declare function NetwerkPrintersDialog({ open, onOpenChange, huidigePrinterId, huidigePrinterNaam, onKlaar, }: {
2
- open: boolean;
3
- onOpenChange: (v: boolean) => void;
4
- huidigePrinterId?: string | null;
5
- huidigePrinterNaam?: string | null;
6
- onKlaar?: () => void;
7
- }): import("react/jsx-runtime").JSX.Element;
1
+ export declare function NetwerkPrintersDialog({ open, onOpenChange, huidigePrinterId, huidigePrinterNaam, onKlaar, }: {
2
+ open: boolean;
3
+ onOpenChange: (v: boolean) => void;
4
+ huidigePrinterId?: string | null;
5
+ huidigePrinterNaam?: string | null;
6
+ onKlaar?: () => void;
7
+ }): import("react/jsx-runtime").JSX.Element;
8
8
  //# sourceMappingURL=NetwerkPrintersDialog.d.ts.map
@@ -1,79 +1,79 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- // ============================================================================
3
- // src/components/NetwerkPrintersDialog.tsx — printers uit het netwerk zoeken,
4
- // toevoegen of koppelen aan een bestaande printer.
5
- // ============================================================================
6
- import { useCallback, useEffect, useState } from "react";
7
- import { Button, Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, toast, } from "@flowselections/core";
8
- import { Loader2, Printer, RefreshCw } from "lucide-react";
9
- import { supabase } from "../lib/supabaseClient.js";
10
- import { netwerkPrinters } from "../lib/printService.functions.js";
11
- export function NetwerkPrintersDialog({ open, onOpenChange, huidigePrinterId, huidigePrinterNaam, onKlaar, }) {
12
- const [bezig, setBezig] = useState(false);
13
- const [fout, setFout] = useState(null);
14
- const [lijst, setLijst] = useState([]);
15
- const zoeken = useCallback(async () => {
16
- setBezig(true);
17
- setFout(null);
18
- try {
19
- const res = await netwerkPrinters({ data: undefined });
20
- if (!res.ok) {
21
- setFout(res.fout);
22
- setLijst([]);
23
- }
24
- else {
25
- setLijst(Array.isArray(res.printers) ? res.printers : []);
26
- }
27
- }
28
- catch {
29
- setFout("Er kon niet in het netwerk worden gezocht. Probeer het zo opnieuw.");
30
- }
31
- finally {
32
- setBezig(false);
33
- }
34
- }, []);
35
- useEffect(() => {
36
- if (open)
37
- void zoeken();
38
- }, [open, zoeken]);
39
- const toevoegen = async (p) => {
40
- try {
41
- const { error } = await supabase.from("printers").insert({
42
- naam: p.naam,
43
- systeemnaam: p.naam,
44
- locatie: p.computer,
45
- omschrijving: p.omschrijving,
46
- online: p.online,
47
- actief: true,
48
- extern_printer_id: p.id,
49
- });
50
- if (error)
51
- throw error;
52
- toast.success(`${p.naam} is toegevoegd`);
53
- onKlaar?.();
54
- onOpenChange(false);
55
- }
56
- catch {
57
- toast.error("Toevoegen mislukt");
58
- }
59
- };
60
- const koppelen = async (p) => {
61
- if (!huidigePrinterId)
62
- return;
63
- try {
64
- const { error } = await supabase
65
- .from("printers")
66
- .update({ extern_printer_id: p.id, systeemnaam: p.naam, locatie: p.computer })
67
- .eq("id", huidigePrinterId);
68
- if (error)
69
- throw error;
70
- toast.success("Printer gekoppeld");
71
- onKlaar?.();
72
- onOpenChange(false);
73
- }
74
- catch {
75
- toast.error("Koppelen mislukt");
76
- }
77
- };
78
- return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(DialogContent, { className: "max-w-lg", children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: "Printers in het netwerk" }), _jsx(DialogDescription, { children: "Kies een printer om toe te voegen. Staat een printer er niet bij? Zet dan de computer aan waar de printer op is aangesloten." })] }), _jsxs("div", { className: "space-y-2", children: [bezig && (_jsxs("p", { className: "text-muted-foreground flex items-center gap-2 text-sm", children: [_jsx(Loader2, { className: "h-4 w-4 animate-spin" }), " Zoeken\u2026"] })), !bezig && fout && _jsx("p", { className: "text-destructive text-sm", children: fout }), !bezig && !fout && lijst.length === 0 && (_jsx("p", { className: "text-muted-foreground text-sm", children: "Er zijn geen printers gevonden." })), lijst.map((p) => (_jsxs("div", { className: "flex items-center gap-3 rounded-lg border p-3", children: [_jsx(Printer, { className: "text-muted-foreground h-5 w-5" }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("p", { className: "truncate text-sm font-medium", children: p.naam }), _jsxs("p", { className: "text-muted-foreground truncate text-xs", children: [p.computer || "Onbekende computer", " \u00B7 ", p.online ? "online" : "offline"] })] }), huidigePrinterId && (_jsxs(Button, { variant: "outline", size: "sm", onClick: () => void koppelen(p), children: ["Koppelen aan ", huidigePrinterNaam ?? "printer"] })), _jsx(Button, { size: "sm", onClick: () => void toevoegen(p), children: "Toevoegen" })] }, p.id)))] }), _jsx("div", { className: "flex justify-end", children: _jsxs(Button, { variant: "ghost", onClick: () => void zoeken(), disabled: bezig, children: [_jsx(RefreshCw, { className: "mr-2 h-4 w-4" }), " Opnieuw zoeken"] }) })] }) }));
79
- }
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // ============================================================================
3
+ // src/components/NetwerkPrintersDialog.tsx — printers uit het netwerk zoeken,
4
+ // toevoegen of koppelen aan een bestaande printer.
5
+ // ============================================================================
6
+ import { useCallback, useEffect, useState } from "react";
7
+ import { Button, Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, toast, } from "@flowselections/core";
8
+ import { Loader2, Printer, RefreshCw } from "lucide-react";
9
+ import { supabase } from "../lib/supabaseClient.js";
10
+ import { netwerkPrinters } from "../lib/printService.functions.js";
11
+ export function NetwerkPrintersDialog({ open, onOpenChange, huidigePrinterId, huidigePrinterNaam, onKlaar, }) {
12
+ const [bezig, setBezig] = useState(false);
13
+ const [fout, setFout] = useState(null);
14
+ const [lijst, setLijst] = useState([]);
15
+ const zoeken = useCallback(async () => {
16
+ setBezig(true);
17
+ setFout(null);
18
+ try {
19
+ const res = await netwerkPrinters({ data: undefined });
20
+ if (!res.ok) {
21
+ setFout(res.fout);
22
+ setLijst([]);
23
+ }
24
+ else {
25
+ setLijst(Array.isArray(res.printers) ? res.printers : []);
26
+ }
27
+ }
28
+ catch {
29
+ setFout("Er kon niet in het netwerk worden gezocht. Probeer het zo opnieuw.");
30
+ }
31
+ finally {
32
+ setBezig(false);
33
+ }
34
+ }, []);
35
+ useEffect(() => {
36
+ if (open)
37
+ void zoeken();
38
+ }, [open, zoeken]);
39
+ const toevoegen = async (p) => {
40
+ try {
41
+ const { error } = await supabase.from("printers").insert({
42
+ naam: p.naam,
43
+ systeemnaam: p.naam,
44
+ locatie: p.computer,
45
+ omschrijving: p.omschrijving,
46
+ online: p.online,
47
+ actief: true,
48
+ extern_printer_id: p.id,
49
+ });
50
+ if (error)
51
+ throw error;
52
+ toast.success(`${p.naam} is toegevoegd`);
53
+ onKlaar?.();
54
+ onOpenChange(false);
55
+ }
56
+ catch {
57
+ toast.error("Toevoegen mislukt");
58
+ }
59
+ };
60
+ const koppelen = async (p) => {
61
+ if (!huidigePrinterId)
62
+ return;
63
+ try {
64
+ const { error } = await supabase
65
+ .from("printers")
66
+ .update({ extern_printer_id: p.id, systeemnaam: p.naam, locatie: p.computer })
67
+ .eq("id", huidigePrinterId);
68
+ if (error)
69
+ throw error;
70
+ toast.success("Printer gekoppeld");
71
+ onKlaar?.();
72
+ onOpenChange(false);
73
+ }
74
+ catch {
75
+ toast.error("Koppelen mislukt");
76
+ }
77
+ };
78
+ return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(DialogContent, { className: "max-w-lg", children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: "Printers in het netwerk" }), _jsx(DialogDescription, { children: "Kies een printer om toe te voegen. Staat een printer er niet bij? Zet dan de computer aan waar de printer op is aangesloten." })] }), _jsxs("div", { className: "space-y-2", children: [bezig && (_jsxs("p", { className: "text-muted-foreground flex items-center gap-2 text-sm", children: [_jsx(Loader2, { className: "h-4 w-4 animate-spin" }), " Zoeken\u2026"] })), !bezig && fout && _jsx("p", { className: "text-destructive text-sm", children: fout }), !bezig && !fout && lijst.length === 0 && (_jsx("p", { className: "text-muted-foreground text-sm", children: "Er zijn geen printers gevonden." })), lijst.map((p) => (_jsxs("div", { className: "flex items-center gap-3 rounded-lg border p-3", children: [_jsx(Printer, { className: "text-muted-foreground h-5 w-5" }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("p", { className: "truncate text-sm font-medium", children: p.naam }), _jsxs("p", { className: "text-muted-foreground truncate text-xs", children: [p.computer || "Onbekende computer", " \u00B7 ", p.online ? "online" : "offline"] })] }), huidigePrinterId && (_jsxs(Button, { variant: "outline", size: "sm", onClick: () => void koppelen(p), children: ["Koppelen aan ", huidigePrinterNaam ?? "printer"] })), _jsx(Button, { size: "sm", onClick: () => void toevoegen(p), children: "Toevoegen" })] }, p.id)))] }), _jsx("div", { className: "flex justify-end", children: _jsxs(Button, { variant: "ghost", onClick: () => void zoeken(), disabled: bezig, children: [_jsx(RefreshCw, { className: "mr-2 h-4 w-4" }), " Opnieuw zoeken"] }) })] }) }));
79
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"PakbonPreview.d.ts","sourceRoot":"","sources":["../../src/components/PakbonPreview.tsx"],"names":[],"mappings":"AAKA,OAAO,EAyBL,KAAK,YAAY,EAEjB,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACzB,MAAM,sBAAsB,CAAC;AA6B9B,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,SAAe,EACf,QAAc,EACd,OAAc,GACf,EAAE;IACD,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oFAAoF;IACpF,OAAO,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;CACtC,+BAiJA;AAiLD,oEAAoE;AACpE,wBAAgB,mBAAmB,CAAC,EAClC,MAAM,EACN,MAAM,EACN,SAAS,GACV,EAAE;IACD,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,+BAmCA"}
1
+ {"version":3,"file":"PakbonPreview.d.ts","sourceRoot":"","sources":["../../src/components/PakbonPreview.tsx"],"names":[],"mappings":"AAKA,OAAO,EA0BL,KAAK,YAAY,EAEjB,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACzB,MAAM,sBAAsB,CAAC;AA6B9B,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,SAAe,EACf,QAAc,EACd,OAAc,GACf,EAAE;IACD,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oFAAoF;IACpF,OAAO,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;CACtC,+BAiJA;AAiLD,oEAAoE;AACpE,wBAAgB,mBAAmB,CAAC,EAClC,MAAM,EACN,MAAM,EACN,SAAS,GACV,EAAE;IACD,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,+BAmCA"}