@flowselections/layout-maker 1.23.2 → 1.24.0
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 +139 -139
- package/dist-lib/components/AfdrukKnop.d.ts +19 -19
- package/dist-lib/components/DocumentRouteringPage.js +1 -1
- package/dist-lib/components/DocumentSettingsPanel.d.ts.map +1 -1
- package/dist-lib/components/DocumentSettingsPanel.js +26 -2
- package/dist-lib/components/NetwerkPrintersDialog.d.ts +7 -7
- package/dist-lib/components/PakbonBuilderPage.d.ts.map +1 -1
- package/dist-lib/components/PakbonBuilderPage.js +7 -26
- package/dist-lib/components/PrinterSetupWizard.js +3 -3
- package/dist-lib/components/PrintersRedirectPage.d.ts +1 -1
- package/dist-lib/components/PrintersRedirectPage.js +14 -14
- package/dist-lib/components/ProductiebonBuilderPage.d.ts.map +1 -1
- package/dist-lib/components/ProductiebonBuilderPage.js +25 -2
- package/dist-lib/index.d.ts +2 -1
- package/dist-lib/index.d.ts.map +1 -1
- package/dist-lib/index.js +2 -1
- package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
- 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.js +1 -1
- package/dist-lib/lib/layoutPreview.js +7 -7
- package/dist-lib/lib/pakbonHtml.js +50 -50
- package/dist-lib/lib/printApi.d.ts +10 -0
- package/dist-lib/lib/printApi.d.ts.map +1 -1
- package/dist-lib/lib/printApi.js +9 -0
- package/dist-lib/lib/printQueue.server.d.ts +2 -0
- package/dist-lib/lib/printQueue.server.d.ts.map +1 -1
- package/dist-lib/lib/printQueue.server.js +42 -10
- package/dist-lib/lib/printService.functions.d.ts.map +1 -1
- package/dist-lib/lib/productiebonHtml.js +15 -15
- package/dist-lib/lib/profielHtml.js +18 -18
- package/dist-lib/lib/supabaseAdmin.server.d.ts +5 -5
- package/dist-lib/lib/supabaseAdmin.server.js +43 -43
- package/dist-lib/lib/testpagina.js +3 -3
- package/dist-lib/lib/testprint.js +4 -4
- package/dist-lib/lib/voorbeeldPrint.d.ts +12 -0
- package/dist-lib/lib/voorbeeldPrint.d.ts.map +1 -0
- package/dist-lib/lib/voorbeeldPrint.js +42 -0
- package/package.json +139 -139
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
|
|
@@ -19,7 +19,7 @@ const GEEN = "geen";
|
|
|
19
19
|
* zelf geen printer meer, dus zonder standaardregel blijft zo'n opdracht
|
|
20
20
|
* liggen. Daarom staan ze altijd bovenaan met een waarschuwing.
|
|
21
21
|
*/
|
|
22
|
-
const ENGINE_TYPES = ["pakbon", "sticker", "
|
|
22
|
+
const ENGINE_TYPES = ["pakbon", "sticker", "afleverbrief", "productiebon"];
|
|
23
23
|
export function DocumentRouteringPage({ ingebed = false } = {}) {
|
|
24
24
|
const { printers } = usePrinters();
|
|
25
25
|
const { koppelingen: standaard, reload: herlaadStandaard } = useAlleFormaatPrinters();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DocumentSettingsPanel.d.ts","sourceRoot":"","sources":["../../src/components/DocumentSettingsPanel.tsx"],"names":[],"mappings":"AAeA,OAAO,EAIL,KAAK,cAAc,EAGpB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"DocumentSettingsPanel.d.ts","sourceRoot":"","sources":["../../src/components/DocumentSettingsPanel.tsx"],"names":[],"mappings":"AAeA,OAAO,EAIL,KAAK,cAAc,EAGpB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAKxD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,MAAM,EACN,YAAY,GACb,EAAE;IACD,MAAM,EAAE,WAAW,GAAG;QAAE,MAAM,CAAC,EAAE,cAAc,CAAA;KAAE,CAAC;IAClD,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC;CACjD,+BAiGA"}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useEffect, useMemo, useState } from "react";
|
|
3
3
|
import { Badge, Button, Label, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Separator, Switch, toast, } from "@flowselections/core";
|
|
4
|
-
import { Save } from "lucide-react";
|
|
4
|
+
import { Loader2, Printer, Save } from "lucide-react";
|
|
5
5
|
import { configWaarde, documentProfiel, standaardConfig, } from "../lib/documentProfiles.js";
|
|
6
6
|
import { updateLayout, usePrinters } from "../lib/useDocumentData.js";
|
|
7
7
|
import { useFormaatPrinters, zetFormaatPrinter } from "../lib/formaatPrinters.js";
|
|
8
|
+
import { renderProfielDocument } from "../lib/profielHtml.js";
|
|
9
|
+
import { voorbeeldContext } from "../lib/layoutPreview.js";
|
|
10
|
+
import { voorbeeldPrint } from "../lib/voorbeeldPrint.js";
|
|
8
11
|
/**
|
|
9
12
|
* Documentspecifieke instellingen. Wat hier verschijnt komt volledig uit het
|
|
10
13
|
* profiel van het documenttype — nieuwe documentsoorten werken automatisch.
|
|
@@ -13,6 +16,7 @@ export function DocumentSettingsPanel({ layout, onOpgeslagen, }) {
|
|
|
13
16
|
const profiel = useMemo(() => documentProfiel(layout.documenttype), [layout.documenttype]);
|
|
14
17
|
const [config, setConfig] = useState(() => layout.config ?? standaardConfig(profiel));
|
|
15
18
|
const [bezig, setBezig] = useState(false);
|
|
19
|
+
const [printen, setPrinten] = useState(false);
|
|
16
20
|
useEffect(() => {
|
|
17
21
|
setConfig(layout.config ?? standaardConfig(profiel));
|
|
18
22
|
}, [layout.id, layout.config, profiel]);
|
|
@@ -31,7 +35,27 @@ export function DocumentSettingsPanel({ layout, onOpgeslagen, }) {
|
|
|
31
35
|
setBezig(false);
|
|
32
36
|
}
|
|
33
37
|
};
|
|
34
|
-
|
|
38
|
+
const voorbeeldPrinten = async () => {
|
|
39
|
+
setPrinten(true);
|
|
40
|
+
try {
|
|
41
|
+
const liggend = String(layout.orientatie ?? "portrait") === "landscape";
|
|
42
|
+
const b = Number(layout.breedte_mm ?? 210);
|
|
43
|
+
const h = Number(layout.hoogte_mm ?? 297);
|
|
44
|
+
const html = renderProfielDocument(layout.documenttype, config, voorbeeldContext(), {
|
|
45
|
+
breedteMm: liggend ? h : b,
|
|
46
|
+
hoogteMm: liggend ? b : h,
|
|
47
|
+
titel: layout.naam ?? profiel.label,
|
|
48
|
+
});
|
|
49
|
+
await voorbeeldPrint(layout, html);
|
|
50
|
+
}
|
|
51
|
+
catch (e) {
|
|
52
|
+
toast.error(e instanceof Error ? e.message : "Voorbeeld printen mislukt");
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
setPrinten(false);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
return (_jsxs("div", { className: "space-y-5", children: [_jsx("div", { className: "rounded-md border bg-muted/40 p-3", children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Badge, { variant: "secondary", children: profiel.label }), _jsx("span", { className: "text-xs text-muted-foreground", children: profiel.omschrijving })] }) }), profiel.groepen.map((groep) => (_jsxs("div", { className: "space-y-3", children: [_jsxs("div", { children: [_jsx(Label, { className: "text-xs uppercase text-muted-foreground", children: groep.label }), groep.omschrijving && (_jsx("p", { className: "text-xs text-muted-foreground", children: groep.omschrijving }))] }), groep.instellingen.map((inst) => (_jsx(Instelling, { inst: inst, waarde: configWaarde(config, groep, inst), onChange: (v) => zet(groep.key, inst.key, v) }, inst.key))), _jsx(Separator, {})] }, groep.key))), profiel.printerPerFormaat && _jsx(FormaatPrinters, { documenttype: profiel.id }), _jsxs(Button, { className: "w-full", onClick: opslaan, disabled: bezig, children: [_jsx(Save, { className: "mr-2 h-4 w-4" }), " Instellingen opslaan"] }), _jsxs(Button, { variant: "outline", className: "w-full", onClick: voorbeeldPrinten, disabled: printen, children: [printen ? (_jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" })) : (_jsx(Printer, { className: "mr-2 h-4 w-4" })), "Voorbeeld printen"] })] }));
|
|
35
59
|
}
|
|
36
60
|
function Instelling({ inst, waarde, onChange, }) {
|
|
37
61
|
if (inst.type === "schakelaar") {
|
|
@@ -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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PakbonBuilderPage.d.ts","sourceRoot":"","sources":["../../src/components/PakbonBuilderPage.tsx"],"names":[],"mappings":"AAyBA,iFAAiF;AACjF,wBAAgB,iBAAiB,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,+
|
|
1
|
+
{"version":3,"file":"PakbonBuilderPage.d.ts","sourceRoot":"","sources":["../../src/components/PakbonBuilderPage.tsx"],"names":[],"mappings":"AAyBA,iFAAiF;AACjF,wBAAgB,iBAAiB,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,+BAqJvF"}
|
|
@@ -8,7 +8,7 @@ import { PakbonPreview } from "./PakbonPreview.js";
|
|
|
8
8
|
import { FormaatOrientatieBar } from "./FormaatOrientatieBar.js";
|
|
9
9
|
import { leesPakbonConfig } from "../lib/pakbonBuilder.js";
|
|
10
10
|
import { renderPakbonDocument, voorbeeldPakbonOrder } from "../lib/pakbonHtml.js";
|
|
11
|
-
import {
|
|
11
|
+
import { voorbeeldPrint } from "../lib/voorbeeldPrint.js";
|
|
12
12
|
import { haalPrintLogos } from "../lib/logoLibrary.js";
|
|
13
13
|
import { updateLayout, useLayoutDetail } from "../lib/useDocumentData.js";
|
|
14
14
|
import { useLayoutIdParam } from "../lib/useLayoutIdParam.js";
|
|
@@ -45,11 +45,6 @@ export function PakbonBuilderPage({ layoutId: layoutIdProp } = {}) {
|
|
|
45
45
|
return;
|
|
46
46
|
setPrinten(true);
|
|
47
47
|
try {
|
|
48
|
-
const printerId = await printerVoorDocumenttype("pakbon", layout?.papierformaat ?? undefined);
|
|
49
|
-
if (!printerId) {
|
|
50
|
-
toast.error("Nog geen printer gekoppeld aan Pakbon — stel dit in bij Layouts & printers > Routering.");
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
48
|
const logos = await haalPrintLogos();
|
|
54
49
|
const html = renderPakbonDocument(config, voorbeeldPakbonOrder(), {
|
|
55
50
|
logos,
|
|
@@ -57,26 +52,12 @@ export function PakbonBuilderPage({ layoutId: layoutIdProp } = {}) {
|
|
|
57
52
|
hoogteMm: hoogte,
|
|
58
53
|
titel: layout?.naam ?? "Pakbon",
|
|
59
54
|
});
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
isHerprint: true,
|
|
67
|
-
});
|
|
68
|
-
toast.success("Voorbeeld naar de printer verstuurd");
|
|
69
|
-
const stop = volgJobStatus(jobId, (s) => {
|
|
70
|
-
if (s.status === "klaar") {
|
|
71
|
-
toast.success("Voorbeeld afgedrukt");
|
|
72
|
-
stop();
|
|
73
|
-
}
|
|
74
|
-
else if (s.status === "mislukt") {
|
|
75
|
-
toast.error(s.foutmelding ?? "Voorbeeld printen mislukt");
|
|
76
|
-
stop();
|
|
77
|
-
}
|
|
78
|
-
});
|
|
79
|
-
window.setTimeout(() => stop(), 120000);
|
|
55
|
+
await voorbeeldPrint({
|
|
56
|
+
id: layout?.id ?? layoutId,
|
|
57
|
+
naam: layout?.naam,
|
|
58
|
+
documenttype: layout?.documenttype ?? "pakbon",
|
|
59
|
+
papierformaat: layout?.papierformaat,
|
|
60
|
+
}, html);
|
|
80
61
|
}
|
|
81
62
|
catch (e) {
|
|
82
63
|
toast.error(e instanceof Error ? e.message : "Voorbeeld printen mislukt");
|
|
@@ -183,9 +183,9 @@ export function PrinterSetupWizard({ open, onOpenChange, onKlaar, computerFilter
|
|
|
183
183
|
setTestStatus("bezig");
|
|
184
184
|
setTestMelding("");
|
|
185
185
|
const maat = gekozenFormaat ? `${gekozenFormaat.breedte} × ${gekozenFormaat.hoogte} mm` : "standaardformaat";
|
|
186
|
-
const html = `<div style="padding:15mm;font-family:Arial,Helvetica,sans-serif;font-size:12pt">
|
|
187
|
-
<h1 style="font-size:20pt;margin:0 0 6mm">Testpagina</h1>
|
|
188
|
-
<p style="margin:0 0 3mm">Deze pagina hoort uit: <strong>${naam}</strong></p>
|
|
186
|
+
const html = `<div style="padding:15mm;font-family:Arial,Helvetica,sans-serif;font-size:12pt">
|
|
187
|
+
<h1 style="font-size:20pt;margin:0 0 6mm">Testpagina</h1>
|
|
188
|
+
<p style="margin:0 0 3mm">Deze pagina hoort uit: <strong>${naam}</strong></p>
|
|
189
189
|
<p style="margin:0">Papier: ${maat} — ${new Date().toLocaleString("nl-NL")}</p></div>`;
|
|
190
190
|
try {
|
|
191
191
|
const { jobId } = await printHtml({
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare function PrintersRedirectPage(): import("react").JSX.Element;
|
|
1
|
+
export declare function PrintersRedirectPage(): import("react").JSX.Element;
|
|
2
2
|
//# sourceMappingURL=PrintersRedirectPage.d.ts.map
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
// ============================================================================
|
|
3
|
-
// src/components/PrintersRedirectPage.tsx — oude URL /layouts-printers/printers
|
|
4
|
-
// stuurt door naar de samengevoegde pagina Printplekken.
|
|
5
|
-
// ============================================================================
|
|
6
|
-
import { useEffect } from "react";
|
|
7
|
-
import { useNavigate } from "@tanstack/react-router";
|
|
8
|
-
export function PrintersRedirectPage() {
|
|
9
|
-
const navigate = useNavigate();
|
|
10
|
-
useEffect(() => {
|
|
11
|
-
void navigate({ to: "/layouts-printers/printplekken", replace: true });
|
|
12
|
-
}, [navigate]);
|
|
13
|
-
return _jsx("p", { className: "text-muted-foreground p-6 text-sm", children: "Doorsturen naar Printplekken\u2026" });
|
|
14
|
-
}
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
// ============================================================================
|
|
3
|
+
// src/components/PrintersRedirectPage.tsx — oude URL /layouts-printers/printers
|
|
4
|
+
// stuurt door naar de samengevoegde pagina Printplekken.
|
|
5
|
+
// ============================================================================
|
|
6
|
+
import { useEffect } from "react";
|
|
7
|
+
import { useNavigate } from "@tanstack/react-router";
|
|
8
|
+
export function PrintersRedirectPage() {
|
|
9
|
+
const navigate = useNavigate();
|
|
10
|
+
useEffect(() => {
|
|
11
|
+
void navigate({ to: "/layouts-printers/printplekken", replace: true });
|
|
12
|
+
}, [navigate]);
|
|
13
|
+
return _jsx("p", { className: "text-muted-foreground p-6 text-sm", children: "Doorsturen naar Printplekken\u2026" });
|
|
14
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProductiebonBuilderPage.d.ts","sourceRoot":"","sources":["../../src/components/ProductiebonBuilderPage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ProductiebonBuilderPage.d.ts","sourceRoot":"","sources":["../../src/components/ProductiebonBuilderPage.tsx"],"names":[],"mappings":"AAsBA,+EAA+E;AAC/E,wBAAgB,uBAAuB,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,+BA0I7F"}
|
|
@@ -2,19 +2,22 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { useEffect, useMemo, useState } from "react";
|
|
3
3
|
import { Link } from "@tanstack/react-router";
|
|
4
4
|
import { Badge, Button, Card, CardContent, CardDescription, CardHeader, CardTitle, toast, } from "@flowselections/core";
|
|
5
|
-
import { ArrowLeft, Save } from "lucide-react";
|
|
5
|
+
import { ArrowLeft, Loader2, Printer, Save } from "lucide-react";
|
|
6
6
|
import { ProductiebonBlokkenPanel } from "./ProductiebonBlokkenPanel.js";
|
|
7
7
|
import { ProductiebonPreview } from "./ProductiebonPreview.js";
|
|
8
8
|
import { FormaatOrientatieBar } from "./FormaatOrientatieBar.js";
|
|
9
9
|
import { leesProductiebonConfig } from "../lib/productiebonBuilder.js";
|
|
10
10
|
import { updateLayout, useLayoutDetail } from "../lib/useDocumentData.js";
|
|
11
11
|
import { useLayoutIdParam } from "../lib/useLayoutIdParam.js";
|
|
12
|
+
import { renderProductiebonDocument } from "../lib/productiebonHtml.js";
|
|
13
|
+
import { voorbeeldPrint } from "../lib/voorbeeldPrint.js";
|
|
12
14
|
/** Eigen editor voor de productiebon: modulaire blokken met live voorbeeld. */
|
|
13
15
|
export function ProductiebonBuilderPage({ layoutId: layoutIdProp } = {}) {
|
|
14
16
|
const layoutId = useLayoutIdParam(layoutIdProp);
|
|
15
17
|
const { layout, setLayout, loading } = useLayoutDetail(layoutId ?? "");
|
|
16
18
|
const [config, setConfig] = useState(null);
|
|
17
19
|
const [bezig, setBezig] = useState(false);
|
|
20
|
+
const [printen, setPrinten] = useState(false);
|
|
18
21
|
useEffect(() => {
|
|
19
22
|
if (layout)
|
|
20
23
|
setConfig(leesProductiebonConfig(layout.config));
|
|
@@ -38,11 +41,31 @@ export function ProductiebonBuilderPage({ layoutId: layoutIdProp } = {}) {
|
|
|
38
41
|
setBezig(false);
|
|
39
42
|
}
|
|
40
43
|
};
|
|
44
|
+
const voorbeeldPrinten = async () => {
|
|
45
|
+
if (!config)
|
|
46
|
+
return;
|
|
47
|
+
setPrinten(true);
|
|
48
|
+
try {
|
|
49
|
+
const html = renderProductiebonDocument({ productiebon: config }, {}, { breedteMm: breedte, hoogteMm: hoogte, titel: layout?.naam ?? "Productiebon" });
|
|
50
|
+
await voorbeeldPrint({
|
|
51
|
+
id: layout?.id ?? layoutId,
|
|
52
|
+
naam: layout?.naam,
|
|
53
|
+
documenttype: layout?.documenttype ?? "productiebon",
|
|
54
|
+
papierformaat: layout?.papierformaat,
|
|
55
|
+
}, html);
|
|
56
|
+
}
|
|
57
|
+
catch (e) {
|
|
58
|
+
toast.error(e instanceof Error ? e.message : "Voorbeeld printen mislukt");
|
|
59
|
+
}
|
|
60
|
+
finally {
|
|
61
|
+
setPrinten(false);
|
|
62
|
+
}
|
|
63
|
+
};
|
|
41
64
|
if (!layoutId)
|
|
42
65
|
return (_jsxs("main", { className: "p-6 text-sm text-muted-foreground", children: ["Kies eerst een layout via ", _jsx(Link, { to: "/layouts-printers", className: "underline", children: "Layouts" }), "."] }));
|
|
43
66
|
if (loading)
|
|
44
67
|
return _jsx("main", { className: "p-6 text-sm text-muted-foreground", children: "Layout laden\u2026" });
|
|
45
68
|
if (!layout || !config)
|
|
46
69
|
return _jsx("main", { className: "p-6 text-sm text-muted-foreground", children: "Layout niet gevonden." });
|
|
47
|
-
return (_jsxs("main", { className: "space-y-4 p-6", children: [_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-3", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsx(Button, { variant: "ghost", size: "sm", asChild: true, children: _jsxs(Link, { to: "/layouts-printers", children: [_jsx(ArrowLeft, { className: "mr-2 h-4 w-4" }), " Layouts"] }) }), _jsxs("div", { children: [_jsx("h1", { className: "text-lg font-semibold", children: layout.naam }), _jsxs("p", { className: "text-xs text-muted-foreground", children: ["Productiebon opbouwen uit blokken \u00B7 ", config.blokken.length, " blokken"] })] })] }), _jsxs(Button, { size: "sm", onClick: opslaan, disabled: bezig, children: [_jsx(Save, { className: "mr-2 h-4 w-4" }), " Opslaan"] })] }), _jsx(FormaatOrientatieBar, { layout: layout, onChange: (patch) => setLayout((l) => (l ? { ...l, ...patch } : l)) }), _jsxs("div", { className: "grid items-start gap-4 lg:grid-cols-[400px_1fr]", children: [_jsxs(Card, { className: "flex h-[calc(100vh-14rem)] min-h-[420px] flex-col overflow-hidden lg:sticky lg:top-4", children: [_jsxs(CardHeader, { className: "pb-3", children: [_jsx(CardTitle, { className: "text-base", children: "Blokken" }), _jsx(CardDescription, { children: "Voeg blokken toe, wijzig de volgorde en stel elk blok afzonderlijk in." })] }), _jsx(CardContent, { className: "min-h-0 flex-1 overflow-y-auto", children: _jsx(ProductiebonBlokkenPanel, { config: config, onChange: setConfig }) })] }), _jsxs(Card, { className: "flex h-[calc(100vh-14rem)] min-h-[420px] flex-col overflow-hidden", children: [_jsxs(CardHeader, { className: "flex-row items-center justify-between space-y-0 pb-3", children: [_jsxs("div", { children: [_jsx(CardTitle, { className: "text-base", children: "Live voorbeeld" }), _jsx(CardDescription, { children: "Voorbeeldproductieorder met samenstelling en belading." })] }), _jsx(Badge, { variant: "secondary", children: "Direct bijgewerkt" })] }), _jsx(CardContent, { className: "min-h-0 flex-1 overflow-hidden", children: _jsx("div", { className: "h-full overflow-auto rounded-md border bg-muted/30 p-2", children: _jsx(ProductiebonPreview, { config: config, breedteMm: breedte, hoogteMm: hoogte }) }) })] })] })] }));
|
|
70
|
+
return (_jsxs("main", { className: "space-y-4 p-6", children: [_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-3", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsx(Button, { variant: "ghost", size: "sm", asChild: true, children: _jsxs(Link, { to: "/layouts-printers", children: [_jsx(ArrowLeft, { className: "mr-2 h-4 w-4" }), " Layouts"] }) }), _jsxs("div", { children: [_jsx("h1", { className: "text-lg font-semibold", children: layout.naam }), _jsxs("p", { className: "text-xs text-muted-foreground", children: ["Productiebon opbouwen uit blokken \u00B7 ", config.blokken.length, " blokken"] })] })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsxs(Button, { size: "sm", variant: "outline", onClick: voorbeeldPrinten, disabled: printen, children: [printen ? (_jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" })) : (_jsx(Printer, { className: "mr-2 h-4 w-4" })), "Voorbeeld printen"] }), _jsxs(Button, { size: "sm", onClick: opslaan, disabled: bezig, children: [_jsx(Save, { className: "mr-2 h-4 w-4" }), " Opslaan"] })] })] }), _jsx(FormaatOrientatieBar, { layout: layout, onChange: (patch) => setLayout((l) => (l ? { ...l, ...patch } : l)) }), _jsxs("div", { className: "grid items-start gap-4 lg:grid-cols-[400px_1fr]", children: [_jsxs(Card, { className: "flex h-[calc(100vh-14rem)] min-h-[420px] flex-col overflow-hidden lg:sticky lg:top-4", children: [_jsxs(CardHeader, { className: "pb-3", children: [_jsx(CardTitle, { className: "text-base", children: "Blokken" }), _jsx(CardDescription, { children: "Voeg blokken toe, wijzig de volgorde en stel elk blok afzonderlijk in." })] }), _jsx(CardContent, { className: "min-h-0 flex-1 overflow-y-auto", children: _jsx(ProductiebonBlokkenPanel, { config: config, onChange: setConfig }) })] }), _jsxs(Card, { className: "flex h-[calc(100vh-14rem)] min-h-[420px] flex-col overflow-hidden", children: [_jsxs(CardHeader, { className: "flex-row items-center justify-between space-y-0 pb-3", children: [_jsxs("div", { children: [_jsx(CardTitle, { className: "text-base", children: "Live voorbeeld" }), _jsx(CardDescription, { children: "Voorbeeldproductieorder met samenstelling en belading." })] }), _jsx(Badge, { variant: "secondary", children: "Direct bijgewerkt" })] }), _jsx(CardContent, { className: "min-h-0 flex-1 overflow-hidden", children: _jsx("div", { className: "h-full overflow-auto rounded-md border bg-muted/30 p-2", children: _jsx(ProductiebonPreview, { config: config, breedteMm: breedte, hoogteMm: hoogte }) }) })] })] })] }));
|
|
48
71
|
}
|
package/dist-lib/index.d.ts
CHANGED
|
@@ -58,7 +58,7 @@ export { bewaarElementen, bewaarPrinter, bewaarVersie, dupliceerLayout, maakLayo
|
|
|
58
58
|
export { jobPickstation, jobPlekLabel, jobPrintPlekId, jobWerkplek } from './lib/printQueue.js';
|
|
59
59
|
export type { PlekNamen } from './lib/printQueue.js';
|
|
60
60
|
export type { PrintJobModel, PrinterModel } from './lib/useDocumentData.js';
|
|
61
|
-
export { beschikbareLayouts, beschikbarePrinters, printDocument, printPdf, printHtml, printerVoorWerkplek, printerVoorDocumenttype, volgJobStatus, DubbeleAanvraagFout, } from './lib/printApi.js';
|
|
61
|
+
export { beschikbareLayouts, beschikbarePrinters, printDocument, printPdf, printHtml, printerVoorWerkplek, printerVoorDocumenttype, printerVoorLayout, volgJobStatus, DubbeleAanvraagFout, } from './lib/printApi.js';
|
|
62
62
|
export type { PrintDocumentInput, PrintDocumentResult, PrintPdfInput, PrintHtmlInput, JobStatus, } from './lib/printApi.js';
|
|
63
63
|
export { printDirect } from './lib/directPrint.js';
|
|
64
64
|
export type { DirectPrintOpdracht, DirectPrintResultaat } from './lib/directPrint.js';
|
|
@@ -79,4 +79,5 @@ export { bewerkPrintplek, koppelBronAanPrintplek, koppelComputerAanPrintplek, ma
|
|
|
79
79
|
export type { Printplek, PrintplekComputer, PrintplekDocumentPrinter, PrintplekKoppeling, } from './lib/printplekken.js';
|
|
80
80
|
export { GeenPrinterFout } from './lib/printApi.js';
|
|
81
81
|
export declare const layoutmodule: FlowModule;
|
|
82
|
+
export { voorbeeldPrint } from './lib/voorbeeldPrint.js';
|
|
82
83
|
//# sourceMappingURL=index.d.ts.map
|