diff --git a/bootstrap/bootstrap.mjs b/bootstrap/bootstrap.mjs index d71b75d..7b75699 100644 --- a/bootstrap/bootstrap.mjs +++ b/bootstrap/bootstrap.mjs @@ -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'), diff --git a/extensions/directus-extension-skrift-neuauftrag/dist/index.js b/extensions/directus-extension-skrift-neuauftrag/dist/index.js index 64418f2..a9558ef 100644 --- a/extensions/directus-extension-skrift-neuauftrag/dist/index.js +++ b/extensions/directus-extension-skrift-neuauftrag/dist/index.js @@ -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;'), diff --git a/extensions/directus-extension-skrift-orders/dist/index.js b/extensions/directus-extension-skrift-orders/dist/index.js index 4bf2015..71657b6 100644 --- a/extensions/directus-extension-skrift-orders/dist/index.js +++ b/extensions/directus-extension-skrift-orders/dist/index.js @@ -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,