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:
s4luorth
2026-09-24 09:09:37 +02:00
parent 65b826dc83
commit 08e12180b6
3 changed files with 2304 additions and 2246 deletions

View File

@@ -459,6 +459,7 @@ const collections = [
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.
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).' }),
{ 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: {} },

File diff suppressed because it is too large Load Diff

View File

@@ -194,7 +194,7 @@ const Board = defineComponent({
const musterListe = ref([]);
// ── Modale ──
const druck = reactive({ open: false, order: null, machine: null, mode: 'queue', busy: false, brief: null, umschlag: null, msg: '', err: '', deNums: '', intNums: '', deN: 0, intN: 0 });
const druck = reactive({ open: false, order: null, machine: null, mode: 'queue', busy: false, brief: null, umschlag: null, spaltenweise: false, msg: '', err: '', deNums: '', intNums: '', deN: 0, intN: 0 });
const manuell = reactive({ open: false, req: null, form: 'sie', vorlageId: '', roh: '', font: 'tilda', format: 'a4', template: null, machine: null, mode: 'queue', text: '',
// Adresse automatisch aufs Kuvert (Standard an) + eigenes Kuvert-Template/-Format.
kuvert: true, envFormat: 'dinlang', envTemplate: null, msg: '', err: '' });
@@ -756,6 +756,8 @@ const Board = defineComponent({
druck.order = order;
druck.machine = aktiveMaschinen.value[0]?.id ?? null;
druck.mode = 'queue'; druck.msg = ''; druck.err = '';
// Rollenschonende Zeichenreihenfolge nur bei A6 anbieten (Default aus).
druck.spaltenweise = false;
druck.brief = { enabled: true, numbers: `1-${n}`, done: !!order.brief_gedruckt, ...tplToFelder(bt) };
druck.umschlag = wantsEnv ? { enabled: true, numbers: `1-${n}`, done: !!order.kuvert_gedruckt, ...tplToFelder(et) } : null;
druck.deNums = ''; druck.intNums = ''; druck.deN = 0; druck.intN = 0;
@@ -789,7 +791,7 @@ const Board = defineComponent({
const sections = {};
const bau = (sec) => ({ enabled: true, template: sec.tplId, numbers: sec.numbers || '',
params: { width: sec.width, height: sec.height, xpos: sec.xpos, ypos: sec.ypos, scale: sec.scale, rotation: sec.rotation } });
if (druck.brief?.enabled) sections.brief = bau(druck.brief);
if (druck.brief?.enabled) sections.brief = { ...bau(druck.brief), spaltenweise: !!druck.spaltenweise };
if (druck.umschlag?.enabled) sections.umschlag = bau(druck.umschlag);
if (!Object.keys(sections).length) { druck.err = 'Kein Abschnitt gewählt.'; return; }
druck.err = ''; druck.msg = 'Wird eingereiht …';
@@ -1478,6 +1480,14 @@ const Board = defineComponent({
]),
druckSektion('brief', 'Briefe', '📄', 'brief'),
druckSektion('umschlag', 'Kuverts', '✉', 'umschlag'),
// Rollenschonende Zeichenreihenfolge – nur bei A6 sinnvoll (Karte quer).
String(druck.order.format?.key || '').startsWith('a6') ? h('div', { style: SECTION + 'margin-bottom:12px;' }, [
h('label', { style: 'display:flex;align-items:center;gap:10px;font-size:14px;cursor:pointer;' }, [
h('input', { type: 'checkbox', checked: druck.spaltenweise, onChange: (e) => { druck.spaltenweise = e.target.checked; }, style: 'width:18px;height:18px;' }),
h('span', { style: 'font-weight:600;' }, 'Rollenschonend drucken (spaltenweise)'),
]),
subdued('Für A6 quer: Zeichen werden spaltenweise (kurze Seite, oben→unten) gedruckt, damit die Rolle nicht je Zeile zurückfährt. Das sichtbare Ergebnis auf der Karte bleibt gleich – nur die Schriftstücke (nicht die Kuverts).', 'margin-top:6px;'),
]) : null,
h('div', { style: 'margin:12px 0 4px;' }, [
segToggle(busy ? 'queue' : druck.mode, [
{ key: 'direct', label: '⚡ Direktdruck', disabled: busy },