Einstellungen: Vorauswahl für KI-Generierung (Dokumente + Anlagen)

Zwei neue, pro Benutzer gespeicherte Konfigurationswerte:
GEN_DOKUMENTE_DEFAULT (Standard: Anschreiben + Lebenslauf) und
GEN_ANLAGEN_DEFAULT (Standard: keine). Sie belegen die Häkchen auf der
Bewerbungsseite vor; eine bereits getroffene Dokumentenauswahl der
Bewerbung gewinnt weiterhin. Die REST-API nutzt die Vorauswahl, wenn
dokumente/anlagen im Body fehlen.

Die Einstellungsseite kennt dafür jetzt Checkbox-Gruppen, deren Optionen
auch erst zur Renderzeit feststehen dürfen (die eigenen Anlagen).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-14 22:31:19 +02:00
co-authored by Claude Opus 4.8
parent d20a265ebc
commit 1dd4807ca6
7 changed files with 145 additions and 29 deletions
+39 -12
View File
@@ -31,7 +31,7 @@ const multer = require('multer');
const {
generateApplicationDocuments, generateEmailReply, generateFeinschliff, renderDesignVorschau,
DOKUMENT_TYPEN, normalizeDokumente,
DOKUMENT_TYPEN, normalizeDokumente, standardDokumente,
} = require('./lib/documents');
const chat = require('./lib/chat');
const websuche = require('./lib/websuche');
@@ -2564,16 +2564,19 @@ initializeDatabase().then(async () => {
anhaenge,
interneAnhaenge,
emails,
// Last choice of documents (defaults to both), for pre-ticking the form.
dokumentAuswahl: normalizeDokumente(
application.generierung_dokumente ? String(application.generierung_dokumente).split(',') : null
),
// Last choice of documents for this application; if there is none yet, the
// user's preselection from the settings (default: both) pre-ticks the form.
dokumentAuswahl: application.generierung_dokumente
? normalizeDokumente(String(application.generierung_dokumente).split(','))
: standardDokumente(),
mailConfigured: mailer.isConfigured(),
mailFrom: mailer.isConfigured() ? mailer.fromField() : '',
mailError: req.query.mailerror ? String(req.query.mailerror) : '',
mailOk: req.query.mailok ? String(req.query.mailok) : '',
basisCount: basisCountRow ? basisCountRow.count : 0,
basisAnhaenge,
// Vorausgewählte Anlagen aus den Einstellungen (Standard: keine).
anlagenAuswahl: config.anlagenDefaultIds(),
termine,
caldavConfigured: caldav.isConfigured(),
caldavTz: caldav.TZ,
@@ -3868,12 +3871,25 @@ initializeDatabase().then(async () => {
// Alle Konfigurationswerte (Ollama, E-Mail, CalDAV, REST-API) liegen in der
// app_state-Tabelle und sind hier editierbar. Speichern wirkt sofort, ein
// Neustart ist nicht nötig (die Libs lesen per config.get() zur Laufzeit).
app.get('/einstellungen', (req, res) => {
res.render('settings', {
felder: config.FIELDS,
werte: config.getAll(),
hideSettings: true,
});
app.get('/einstellungen', async (req, res) => {
try {
// Optionen, die erst zur Laufzeit feststehen (Feld-Definition: optionsFrom).
const anlagen = await dbAll(
'SELECT id, name, dateiname FROM basis_anhaenge WHERE user_id = ? ORDER BY id ASC',
[uid()]
);
res.render('settings', {
felder: config.FIELDS,
werte: config.getAll(),
auswahllisten: {
anlagen: anlagen.map((a) => ({ value: String(a.id), label: a.name || a.dateiname })),
},
hideSettings: true,
});
} catch (error) {
console.error('Error loading settings:', error);
res.status(500).send('Serverfehler');
}
});
app.post('/einstellungen', async (req, res) => {
@@ -3881,7 +3897,18 @@ initializeDatabase().then(async () => {
const werte = {};
for (const sektion of config.FIELDS) {
for (const f of sektion.items) {
werte[f.key] = req.body[f.key] != null ? String(req.body[f.key]) : '';
const roh = req.body[f.key];
if (f.type === 'checkboxes') {
// Checkbox-Gruppe: Express liefert je nach Anzahl Häkchen einen String
// oder ein Array (inkl. des leeren Hidden-Werts) — als Komma-Liste ablegen.
werte[f.key] = []
.concat(roh == null ? [] : roh)
.map((v) => String(v).trim())
.filter(Boolean)
.join(',');
} else {
werte[f.key] = roh != null ? String(roh) : '';
}
}
}