neuauftrag: Kuverts-Haken default an, extra Haken 'Absender aufs Kuvert' + Absender-Groesse (%); envelope_sender_scale gespeichert/durchgereicht; bootstrap-Feld

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
s4luorth
2026-09-03 11:04:29 +02:00
parent d6c92dc8c6
commit a44515de89
3 changed files with 25 additions and 10 deletions

View File

@@ -278,6 +278,7 @@ const collections = [
dropdown('envelope_labeling', ['empfaenger', 'freitext', 'keine']),
f('envelope_text', 'text', { interface: 'input-multiline', note: 'Individueller Kuverttext (bei envelope_labeling = freitext).' }),
f('envelope_sender', 'text', { interface: 'input-multiline', note: 'Absender fürs Kuvert (oben links, 5 Zeilen); manuelle Aufträge. Empfänger rutscht dann unten rechts.' }),
f('envelope_sender_scale', 'float', { interface: 'input', default: 1, note: 'Relative Größe des Kuvert-Absenders (0.5–2, 1 = 100%).' }),
dropdown('envelope_format', ['c6', 'dinlang'], { note: 'Automatisch aus Format.' }),
dropdown('motif_mode', ['katalog', 'upload', 'ohne', 'eigene_karten']),
m2o('motif', 'motifs'),

View File

@@ -78,14 +78,16 @@ const NeuAuftrag = defineComponent({
// Mehrseitiges Schriftstück (Auto-Fluss über mehrere A4-Seiten).
mehrseitig: false, seitenInfo: '',
// Kuvert-Adresse je Empfänger: '5zeilen' (5 Zeilen) oder 'individuell' (einzeilig).
adressModus: '5zeilen', kuverts: false, envelopeSender: '', realistic: true, customer_email: '', text: '', rows: [leereZeile()],
adressModus: '5zeilen', kuverts: true, absenderAufKuvert: false, envelopeSender: '', envelopeSenderScale: 100, realistic: true, customer_email: '', text: '', rows: [leereZeile()],
importOpen: false, importText: '',
docs: [], previewSession: null, pLaedt: false, msg: '', err: '', hinweis: '', lb: '', lbDoc: null,
});
// Kuverts nur generieren, wenn angehakt (Beschriftung aus der Empfängeradresse).
const kuvertPayload = () => (neu.kuverts
? { needs_envelope: true, envelope_labeling: 'empfaenger', envelope_text: '', envelope_sender: (neu.envelopeSender || '').trim() }
: { needs_envelope: false, envelope_labeling: 'keine', envelope_text: '', envelope_sender: '' });
? { needs_envelope: true, envelope_labeling: 'empfaenger', envelope_text: '',
envelope_sender: neu.absenderAufKuvert ? (neu.envelopeSender || '').trim() : '',
envelope_sender_scale: (Number(neu.envelopeSenderScale) || 100) / 100 }
: { needs_envelope: false, envelope_labeling: 'keine', envelope_text: '', envelope_sender: '', envelope_sender_scale: 1 });
async function laden() {
try {
@@ -266,7 +268,7 @@ const NeuAuftrag = defineComponent({
const kv = kuvertPayload();
const res = await api.post('/skrift-orders/preview', {
text: neu.text, font: neu.font, format: neu.format, realistic: neu.realistic,
envelope_labeling: kv.envelope_labeling, envelope_text: kv.envelope_text, envelope_sender: kv.envelope_sender,
envelope_labeling: kv.envelope_labeling, envelope_text: kv.envelope_text, envelope_sender: kv.envelope_sender, envelope_sender_scale: kv.envelope_sender_scale,
font_scale_letter: neu.fontSizeLetter / 100, font_scale_envelope: neu.fontSizeEnvelope / 100,
multi_page: neu.mehrseitig,
...briefSigPayload(),
@@ -347,7 +349,7 @@ const NeuAuftrag = defineComponent({
font_scale_letter: neu.fontSizeLetter / 100, font_scale_envelope: neu.fontSizeEnvelope / 100,
multi_page: neu.mehrseitig,
...briefSigPayload(),
needs_envelope: kv.needs_envelope, envelope_labeling: kv.envelope_labeling, envelope_text: kv.envelope_text, envelope_sender: kv.envelope_sender,
needs_envelope: kv.needs_envelope, envelope_labeling: kv.envelope_labeling, envelope_text: kv.envelope_text, envelope_sender: kv.envelope_sender, envelope_sender_scale: kv.envelope_sender_scale,
shipping_type: 'sammel',
customer_email: neu.customer_email.trim() || undefined,
text_template: neu.text, preview_session: neu.previewSession || undefined,
@@ -367,7 +369,7 @@ const NeuAuftrag = defineComponent({
product: produkte.value[0]?.key || 'briefe', format: neuFormate()[0]?.key || '', font: 'tilda',
fontSizeLetter: 100, fontSizeEnvelope: 100,
sigSvg: '', sigLabel: '', sigX: 0, sigY: 0, sigScale: 100, mehrseitig: false, seitenInfo: '',
adressModus: '5zeilen', kuverts: false, envelopeSender: '', realistic: true, customer_email: '', text: '', rows: [leereZeile()],
adressModus: '5zeilen', kuverts: true, absenderAufKuvert: false, envelopeSender: '', envelopeSenderScale: 100, realistic: true, customer_email: '', text: '', rows: [leereZeile()],
importOpen: false, importText: '',
docs: [], previewSession: null, pLaedt: false, msg: '', err: '', hinweis: '', lb: '',
});
@@ -508,17 +510,27 @@ const NeuAuftrag = defineComponent({
h('input', { type: 'checkbox', checked: neu.kuverts, onChange: (e) => { neu.kuverts = e.target.checked; neu.previewSession = null; }, style: 'width:16px;height:16px;' }),
'Kuverts generieren',
]),
h('div', { style: 'margin-top:14px;' }, [
label('Absender aufs Kuvert (oben links, max. 5 Zeilen, optional)'),
neu.kuverts ? h('label', { style: 'display:flex;align-items:center;gap:8px;font-size:14px;cursor:pointer;margin-top:8px;' }, [
h('input', { type: 'checkbox', checked: neu.absenderAufKuvert, onChange: (e) => { neu.absenderAufKuvert = e.target.checked; neu.previewSession = null; }, style: 'width:16px;height:16px;' }),
'Absender aufs Kuvert (oben links)',
]) : null,
(neu.kuverts && neu.absenderAufKuvert) ? h('div', { style: 'margin-top:10px;' }, [
label('Absender (max. 5 Zeilen)'),
h('textarea', {
value: neu.envelopeSender, rows: 5,
placeholder: 'Max Mustermann\nMusterstraße 1\n12345 Musterstadt',
style: WFELD + 'width:100%;font-family:var(--family-monospace,monospace);',
onInput: (e) => { neu.envelopeSender = saeubere(String(e.target.value)).split('\n').slice(0, 5).join('\n'); neu.previewSession = null; },
}),
h('div', { style: 'margin-top:8px;max-width:170px;' }, [
label('Absender-Größe (%)'),
h('input', { type: 'number', min: 50, max: 200, step: 5, value: neu.envelopeSenderScale, style: WFELD + 'width:100%;',
onInput: (e) => { neu.envelopeSenderScale = e.target.value; neu.previewSession = null; },
onBlur: (e) => { const n = Math.round(Number(e.target.value)); neu.envelopeSenderScale = (Number.isFinite(n) && n) ? Math.max(50, Math.min(200, n)) : 100; } }),
]),
h('div', { style: 'font-size:11px;color:var(--foreground-subdued,#888);margin-top:4px;line-height:1.5;' },
'Ist ein Absender gesetzt, rutscht der Empfänger auf dem Kuvert automatisch nach unten rechts. Wirkt nur, wenn „Kuverts generieren" aktiv ist.'),
]),
'Der Empfänger rutscht dann auf dem Kuvert automatisch nach unten rechts.'),
]) : null,
neu.importOpen ? h('div', { style: 'margin-top:12px;' }, [
subdued('Aus Excel kopieren und einfügen – eine Zeile pro Empfänger, Spalten mit Tab/Semikolon/Komma. '
+ 'Reihenfolge: erst individuelle Platzhalter, dann ' + (neu.adressModus === 'individuell' ? 'die eine Adresszeile.' : 'Zeile 1–5.'), 'margin-bottom:6px;'),

View File

@@ -695,6 +695,7 @@ const handler = (router, { services, getSchema, logger }) => {
placeholders: platzhalterVon(e, i), fontScale: fsEnv,
// Absender aufs Kuvert (oben links); Empfänger rutscht dann unten rechts.
sender: clean(String(body.envelope_sender || '')),
senderScale: Number(body.envelope_sender_scale) || 1,
});
}
});
@@ -1620,6 +1621,7 @@ const handler = (router, { services, getSchema, logger }) => {
envelope_text: clean(body.envelope_text) ?? null,
envelope_format: envelopeFormat,
envelope_sender: clean(body.envelope_sender) ?? null,
envelope_sender_scale: Math.max(0.5, Math.min(2, Number(body.envelope_sender_scale) || 1)),
text_template: clean(body.text_template) ?? null,
preview_session: typeof body.preview_session === 'string' ? body.preview_session : null,
entries_count: entries.length,