diff --git a/app/web/app.js b/app/web/app.js index 3393495..f8313f0 100644 --- a/app/web/app.js +++ b/app/web/app.js @@ -330,6 +330,27 @@ async function copyText(text, btn) { const ALL_LANGS = [["de","DE"],["en","EN"],["fr","FR"],["es","ES"],["it","IT"], ["pt","PT"],["pl","PL"],["ar","AR"],["ru","RU"],["zh","ZH"]]; +// --- Format-Validierung der Notfall-Profil-Felder ------------------------ +const _isEmail = (v) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v); +const _isPhone = (v) => /^\+?[\d\s/().\-]{6,20}$/.test(v); +function _isGermanDate(v) { + const m = /^(\d{2})\.(\d{2})\.(\d{4})$/.exec(v); + if (!m) return false; + const d = +m[1], mo = +m[2], y = +m[3]; + const dt = new Date(y, mo - 1, d); + return dt.getDate() === d && dt.getMonth() === mo - 1 && dt.getFullYear() === y && y >= 1900 && y <= 2100; +} +const _csvAll = (v, fn) => v.split(",").map((s) => s.trim()).filter(Boolean).every(fn); +// pro Feld: ok(wert) wird NUR bei nicht-leerem Wert geprüft + Meckertext. +const PROF_VALIDATORS = { + postal_code: { ok: (v) => /^\d{5}$/.test(v), msg: "PLZ: genau 5 Ziffern" }, + phone_mobile: { ok: _isPhone, msg: "Mobil: gültige Telefonnummer (z. B. +49 151 …)" }, + phone_landline: { ok: _isPhone, msg: "Festnetz: gültige Telefonnummer" }, + birth_date: { ok: _isGermanDate, msg: "Geburtsdatum: TT.MM.JJJJ" }, + emergency_contacts: { ok: (v) => _csvAll(v, _isEmail), msg: "Kontakt-E-Mail(s): gültige Adressen (Komma-getrennt)" }, + emergency_phones: { ok: (v) => _csvAll(v, _isPhone), msg: "Kontakt-Telefon(e): gültige Nummern (Komma-getrennt)" }, +}; + // Wendet die vom Admin erlaubten Sprachen auf das Sprachmenü an. Leer = alle erlaubt. // Genau eine erlaubte Sprache -> Menü ausblenden (kein Stress für den Nutzer). function applyAllowedLanguages(prefs) { @@ -1100,20 +1121,22 @@ function buildUserCard(u) { - + -
- - -
+ +
+ + +
+