function Profil({ accent }) {
const [loading, setLoading] = React.useState(true);
const [saving, setSaving] = React.useState(false);
const [savedAt, setSavedAt] = React.useState(null);
const [error, setError] = React.useState(null);
const [activeTab, setActiveTab] = React.useState('schule');
const [form, setForm] = React.useState({
schule_name: '',
schule_strasse: '',
schule_plz: '',
schule_ort: '',
schule_telefon: '',
schule_email: '',
schulleiter_name: '',
schule_iban: '',
schule_bic: '',
schule_bank: '',
schuljahr_aktuell: '',
schuljahr_naechster_beginn: '',
versetzung_sperre_aktiv: 'true',
mail_smtp_host: '',
mail_smtp_port: '587',
mail_smtp_username: '',
mail_smtp_password: '',
mail_smtp_use_starttls: 'true',
mail_smtp_use_ssl: 'false',
mail_from_email: '',
mail_from_name: '',
mail_reply_to: '',
mail_subject_template: '',
mail_body_template: '',
});
React.useEffect(() => {
let alive = true;
setLoading(true);
setError(null);
window.api.einstellungen.get()
.then((data) => {
if (!alive) return;
setForm((prev) => ({
...prev,
...pickProfileFields(data || {}),
}));
})
.catch((err) => {
if (!alive) return;
setError(err.message || 'Einstellungen konnten nicht geladen werden.');
})
.finally(() => {
if (alive) setLoading(false);
});
return () => { alive = false; };
}, []);
const setField = (key, value) => {
setForm((prev) => ({ ...prev, [key]: value }));
};
const save = async () => {
setSaving(true);
setError(null);
try {
const payload = sanitizeForm(form);
await window.api.einstellungen.update(payload);
setSavedAt(new Date());
} catch (err) {
setError(err.message || 'Speichern fehlgeschlagen.');
} finally {
setSaving(false);
}
};
if (loading) {
return
Lade Einstellungen...
;
}
const fieldStyle = {
width: '100%',
padding: '9px 11px',
border: '1px solid #e2e8f0',
borderRadius: 8,
background: '#fff',
color: '#0f172a',
fontSize: 13.5,
fontFamily: 'inherit',
outline: 'none',
};
const labelStyle = {
fontSize: 11.5,
color: '#475569',
fontWeight: 500,
marginBottom: 5,
display: 'block',
};
const textAreaStyle = {
...fieldStyle,
minHeight: 96,
resize: 'vertical',
lineHeight: 1.45,
whiteSpace: 'pre-wrap',
};
const hintStyle = {
fontSize: 11,
color: '#94a3b8',
marginTop: 3,
};
const TABS = [
{ id: 'schule', label: 'Schule' },
{ id: 'bank', label: 'Bankdaten' },
{ id: 'email', label: 'E-Mail-Konfiguration' },
{ id: 'info', label: 'Info' },
];
return (
{/* Header */}
Einstellungen
Schuldaten, Bankverbindung und E-Mail-Versand konfigurieren.
{saving ? 'Speichern...' : 'Speichern'}
{/* Meldungen */}
{error && (
{error}
)}
{savedAt && (
Gespeichert um {savedAt.toLocaleTimeString('de-DE')} Uhr.
)}
{/* Tab-Leiste */}
{TABS.map((tab) => {
const active = activeTab === tab.id;
return (
);
})}
{/* Tab: Schule */}
{activeTab === 'schule' && (
Schulinformationen
Schuljahr
)}
{/* Tab: Bankdaten */}
{activeTab === 'bank' && (
Bankverbindung
)}
{/* Tab: Info */}
{activeTab === 'info' && (
App-Informationen
Details zur installierten Anwendung.
Name
Libera
Version
1.0.0
Entwickler
Entwickelt und betreut von BP Mediawork GmbH.
Unternehmen
BP Mediawork GmbH
Website
www.bpmediawork.de
Support
Bei Fragen oder Problemen wenden Sie sich direkt an den Support.
)}
{/* Tab: E-Mail & Versand */}
{activeTab === 'email' && (
SMTP-Zugangsdaten
Ausgehender Mailserver für den Rechnungsversand aus der Buchhaltung.
Absender & Templates
setField('mail_subject_template', e.target.value)} style={fieldStyle} />
Verfügbare Platzhalter:{' '}
{'{{ schueler.name }}'}, {'{{ schueler.vorname }}'}, {'{{ schueler.nachname }}'},{' '}
{'{{ schueler.klasse }}'}, {'{{ rechnung.id }}'}, {'{{ rechnung.datum }}'},{' '}
{'{{ rechnung.summe_eur }}'}, {'{{ rechnung.zu_zahlen_eur }}'}, {'{{ schule.name }}'}.
)}
);
}
function pickProfileFields(data) {
return {
schule_name: data.schule_name || '',
schule_strasse: data.schule_strasse || '',
schule_plz: data.schule_plz || '',
schule_ort: data.schule_ort || '',
schule_telefon: data.schule_telefon || '',
schule_email: data.schule_email || '',
schulleiter_name: data.schulleiter_name || '',
schule_iban: data.schule_iban || '',
schule_bic: data.schule_bic || '',
schule_bank: data.schule_bank || '',
schuljahr_aktuell: data.schuljahr_aktuell || '',
schuljahr_naechster_beginn: data.schuljahr_naechster_beginn || '',
versetzung_sperre_aktiv: data.versetzung_sperre_aktiv ?? 'true',
mail_smtp_host: data.mail_smtp_host || '',
mail_smtp_port: data.mail_smtp_port || '587',
mail_smtp_username: data.mail_smtp_username || '',
mail_smtp_password: data.mail_smtp_password || '',
mail_smtp_use_starttls: data.mail_smtp_use_starttls ?? 'true',
mail_smtp_use_ssl: data.mail_smtp_use_ssl ?? 'false',
mail_from_email: data.mail_from_email || '',
mail_from_name: data.mail_from_name || '',
mail_reply_to: data.mail_reply_to || '',
mail_subject_template: data.mail_subject_template || '',
mail_body_template: data.mail_body_template || '',
};
}
function sanitizeForm(form) {
const out = {};
Object.entries(form).forEach(([key, value]) => {
out[key] = (value ?? '').toString().trim();
});
return out;
}
window.Profil = Profil;