A6 quer: rollenschonender Druck (spaltenweise Zeichenreihenfolge)
Checkbox „Rollenschonend drucken" im Druck-Popup (nur bei A6). Setzt am Job das Feld spaltenweise. Der Agent lädt das Schriftstück-SVG dann über den Download-Endpunkt mit ?reorder=column: die Glyph-<path>-Elemente werden nach x (Spalte) und y (oben→unten) permutiert – Signatur-<g>, Hintergrund und Trennstrich bleiben unangetastet. Sichtbares Ergebnis identisch, aber der rollengeführte Plotter fährt monoton in Vorschub- richtung statt je Zeile die Rolle zurückzuspulen. Nur Schriftstücke, nicht Kuverts. Neues Job-Feld jobs.spaltenweise (Bootstrap). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -459,6 +459,7 @@ const collections = [
|
|||||||
f('params', 'json', { interface: 'input-code', note: 'Maß-Übersteuerung {width,height,xpos,ypos,scale,rotation} (leer = Template).' }),
|
f('params', 'json', { interface: 'input-code', note: 'Maß-Übersteuerung {width,height,xpos,ypos,scale,rotation} (leer = Template).' }),
|
||||||
// Welche Dokumentnummern gedruckt werden (1-basiert, z. B. „1-20" oder „1,3,5-7"). Leer = alle.
|
// Welche Dokumentnummern gedruckt werden (1-basiert, z. B. „1-20" oder „1,3,5-7"). Leer = alle.
|
||||||
f('numbers', 'string', { interface: 'input', note: 'Zu druckende Briefnummern (1-basiert). Leer = alle.' }),
|
f('numbers', 'string', { interface: 'input', note: 'Zu druckende Briefnummern (1-basiert). Leer = alle.' }),
|
||||||
|
f('spaltenweise', 'boolean', { interface: 'boolean', default: false, note: 'Rollenschonende Zeichenreihenfolge (spaltenweise, für A6 quer). Der Agent lädt das SVG dann umsortiert.' }),
|
||||||
f('error', 'text', { interface: 'input-multiline', note: 'Fehlermeldung vom Agent (falls fehlgeschlagen).' }),
|
f('error', 'text', { interface: 'input-multiline', note: 'Fehlermeldung vom Agent (falls fehlgeschlagen).' }),
|
||||||
{ field: 'date_created', type: 'timestamp', meta: { interface: 'datetime', readonly: true, special: ['date-created'] }, schema: {} },
|
{ field: 'date_created', type: 'timestamp', meta: { interface: 'datetime', readonly: true, special: ['date-created'] }, schema: {} },
|
||||||
{ field: 'date_updated', type: 'timestamp', meta: { interface: 'datetime', readonly: true, special: ['date-updated'] }, schema: {} },
|
{ field: 'date_updated', type: 'timestamp', meta: { interface: 'datetime', readonly: true, special: ['date-updated'] }, schema: {} },
|
||||||
|
|||||||
@@ -1094,6 +1094,39 @@ const handler = (router, { services, getSchema, logger }) => {
|
|||||||
return res.json({ files, exists: true });
|
return res.json({ files, exists: true });
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Zeichenreihenfolge „spaltenweise": permutiert NUR die Glyph-<path>-Elemente
|
||||||
|
// nach x (Spalte, aufsteigend), innerhalb einer Spalte nach y (oben→unten).
|
||||||
|
// Andere Elemente (Hintergrund-Rect, Signatur-<g>, Trennstrich bleibt ein Pfad)
|
||||||
|
// behalten ihre Position. Das sichtbare Ergebnis ist identisch – nur die
|
||||||
|
// Druckreihenfolge ändert sich, sodass der rollengeführte Plotter monoton in
|
||||||
|
// Vorschubrichtung fährt statt je Zeile die Rolle zurückzuspulen (A6 quer).
|
||||||
|
function svgSpaltenweise(svg) {
|
||||||
|
// <g>…</g>-Blöcke (z. B. eingebettete Signaturen) als Ganzes schützen – deren
|
||||||
|
// innere Pfade dürfen NICHT umsortiert werden (sie hängen an einem eigenen
|
||||||
|
// Gruppen-Transform). Signaturen stehen hinter dem Text, daher greedy bis zum
|
||||||
|
// letzten </g>. Ohne <g> bleibt alles unverändert.
|
||||||
|
const bloecke = [];
|
||||||
|
const safe = svg.replace(/<g\b[\s\S]*<\/g>/, (m) => { bloecke.push(m); return ' | ||||||