Manueller Druck: Textvorlage überschreibt Inhalt; Zeile1–5 als Platzhalter

- Mustertext-Auswahl ersetzt den bisherigen Brieftext (statt anzuhängen).
- Vorschau: [[Zeile1]]..[[Zeile5]] aus den 5 Adresszeilen verfügbar; Tipp im UI.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
s4luorth
2026-09-11 20:55:32 +02:00
parent cc39dade9e
commit 365158c43b
2 changed files with 23 additions and 15 deletions

View File

@@ -420,7 +420,8 @@ const NeuAuftrag = defineComponent({
if (wert === 'du' || wert === 'sie') t = wert === 'du' ? musterTexte.value.text_du : musterTexte.value.text_sie;
else t = (musterListe.value.find((m) => String(m.id) === String(wert)) || {}).text || '';
if (!t) return;
neu.text = neu.text.trim() ? `${neu.text}\n\n${t}` : t;
// Vorlage ersetzt den bisherigen Inhalt (nicht anhängen).
neu.text = t;
neu.previewSession = null;
};
@@ -607,7 +608,8 @@ const NeuAuftrag = defineComponent({
requestAnimationFrame(() => { try { ta.selectionStart = ta.selectionEnd = s + 1; } catch {} });
} }),
h('div', { style: 'font-size:11px;color:var(--foreground-subdued,#888);margin-top:4px;line-height:1.5;' },
'Tipp: [[seitenumbruch]] erzwingt an dieser Stelle eine neue Seite (mehrseitiger Brief). [[signatur1]] setzt die Unterschrift.'),
'Tipp: [[seitenumbruch]] erzwingt an dieser Stelle eine neue Seite (mehrseitiger Brief). [[signatur1]] setzt die Unterschrift. '
+ 'Platzhalter: [[Vorname]], [[Nachname]], [[Anrede]], [[Strasse]], [[PLZ]], [[Ort]] – im 5-Zeilen-Modus außerdem [[Zeile1]]…[[Zeile5]].'),
// ── Unterschrift auf den Brief ─────────────────────────────────────
h('div', { style: 'margin-top:16px;border-top:1px solid rgba(30,80,165,.15);padding-top:14px;' }, [
label('Unterschrift auf den Brief (optional) · Platzhalter [[signatur1]]'),

View File

@@ -691,19 +691,25 @@ const handler = (router, { services, getSchema, logger }) => {
filter: { key: { _eq: briefFormat } }, limit: 1, fields: ['kind'],
}))?.[0]?.kind === 'postkarte';
const platzhalterVon = (e, i) => ({
Anrede: clean(e.salutation || ''),
Vorname: clean(e.first_name || ''),
Nachname: clean(e.last_name || ''),
Strasse: clean([e.street, e.house_no].filter(Boolean).join(' ')),
PLZ: clean(e.zip || ''),
Ort: clean(e.city || ''),
Land: clean(e.country || ''),
Briefnummer: String(i + 1),
...(e.placeholders && typeof e.placeholders === 'object'
? Object.fromEntries(Object.entries(e.placeholders).map(([k, v]) => [k, clean(String(v))]))
: {}),
});
const platzhalterVon = (e, i) => {
// 5 Adresszeilen (5-Zeilen-Modus) auch als [[Zeile1]]..[[Zeile5]].
const zeilen = String(e.free_text || '').split('\n');
return {
Anrede: clean(e.salutation || ''),
Vorname: clean(e.first_name || ''),
Nachname: clean(e.last_name || ''),
Strasse: clean([e.street, e.house_no].filter(Boolean).join(' ')),
PLZ: clean(e.zip || ''),
Ort: clean(e.city || ''),
Land: clean(e.country || ''),
Briefnummer: String(i + 1),
Zeile1: clean(zeilen[0] || ''), Zeile2: clean(zeilen[1] || ''), Zeile3: clean(zeilen[2] || ''),
Zeile4: clean(zeilen[3] || ''), Zeile5: clean(zeilen[4] || ''),
...(e.placeholders && typeof e.placeholders === 'object'
? Object.fromEntries(Object.entries(e.placeholders).map(([k, v]) => [k, clean(String(v))]))
: {}),
};
};
const adressBlock = (e) => {
if (e.free_text) return clean(String(e.free_text));