Produktion: Suche-Reiter + Sammel-Druck mit editierbaren Maßen

Suche-Reiter (ganz oben, vor Neu): großes Suchfeld über alle aktiven
Stufen (Neu, Warteschlange, Im Druck, Kuvertierung, Versandfertig),
empfängergenau – Einzelaufträge zeigen den Namen, Mehrfachaufträge den
Empfänger an der richtigen Briefnummer. Über dem Feld ein Typ-Umschalter
(Schriftstück / Kuvert / Druckobjekte) mit je eigenem, im Reiter
einstellbarem Standard-Template + Maschine (lokal gespeichert). Der
Druck-Button gibt genau diesen Empfänger mit dem Standard-Template in die
Warteschlange; Druckobjekte öffnet die Dateien zum Herunterladen.

Sammel-Druck (Mass-Select): pro Format nicht nur Template + Maschine,
sondern auch Maße/Position (Breite, Höhe, X, Y, Scale, Rotation)
editierbar – übersteuert die Template-Werte wie beim Einzeldruck
(enqueue-bulk reicht die params jetzt an die Jobs durch).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
s4luorth
2026-09-21 17:07:44 +02:00
parent af63fd66be
commit a364f07035
2 changed files with 176 additions and 13 deletions

View File

@@ -1267,6 +1267,17 @@ const handler = (router, { services, getSchema, logger }) => {
const mode = body.mode === 'direct' ? 'direct' : 'queue';
const prioFor = (m) => (mode === 'direct' && !busySet.has(String(m))) ? 100 : 0;
// Reinigt eine Maß-Übersteuerung auf erlaubte Zahlenfelder (oder null) –
// wie in /enqueue, damit der Sammel-Druck Template-Werte übersteuern kann.
const clampParams = (p) => {
if (!p || typeof p !== 'object') return null;
const out = {};
for (const k of ['width', 'height', 'xpos', 'ypos', 'scale', 'rotation']) {
if (p[k] !== undefined && p[k] !== null && p[k] !== '' && !isNaN(Number(p[k]))) out[k] = Number(p[k]);
}
return Object.keys(out).length ? out : null;
};
const jobs = [];
const uebersprungen = [];
const mkJob = async (order, typ, fmt) => {
@@ -1277,7 +1288,8 @@ const handler = (router, { services, getSchema, logger }) => {
}
jobs.push(await svc('jobs').createOne({
order: order.id, machine: cfg.machine, type: typ, template: cfg.template,
format: fmt.key, format_label: cfg.label || fmt.label, status: 'queued', priority: prioFor(cfg.machine),
format: fmt.key, format_label: cfg.label || fmt.label, params: clampParams(cfg.params),
status: 'queued', priority: prioFor(cfg.machine),
}));
};
for (const order of orders) {