From dee8d10496a4f6c351396f839385374489fac74a Mon Sep 17 00:00:00 2001 From: rene Date: Mon, 13 Apr 2026 20:16:36 +0200 Subject: [PATCH] UX: Modal-Rand, Icon-Farben, Adresse aufgeteilt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Tierarzt-Adresse: strasse / plz / ort statt einzeiligem Freitext - Modal: Rand in Primärfarbe + kein versehentliches Schließen beim Klick auf Hintergrund - Nav/Sidebar-Icons: inaktiv gedämpft, aktiv amber-getönt (CSS filter) - Datums-Kalender-Icon: ebenfalls amber statt Schwarz - SW-Cache → by-v8 --- backend/database.py | 8 +++++++- backend/routes/tieraerzte.py | 16 ++++++++++------ backend/static/css/components.css | 9 +++++++++ backend/static/css/layout.css | 10 ++++++++++ backend/static/js/pages/health.js | 27 ++++++++++++++++++++++----- backend/static/js/ui.js | 1 - backend/static/sw.js | 2 +- 7 files changed, 59 insertions(+), 14 deletions(-) diff --git a/backend/database.py b/backend/database.py index 95e5fef..0bb98d6 100644 --- a/backend/database.py +++ b/backend/database.py @@ -254,7 +254,9 @@ def init_db(): id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, name TEXT NOT NULL, - adresse TEXT, + strasse TEXT, + plz TEXT, + ort TEXT, telefon TEXT, notfall_telefon TEXT, email TEXT, @@ -295,6 +297,10 @@ def _migrate(conn_factory): ("health", "datei_url", "TEXT"), ("health", "datei_typ", "TEXT"), ("health", "tierarzt_id", "INTEGER"), + # Tierärzte: Adresse aufgeteilt in Strasse/PLZ/Ort + ("tieraerzte", "strasse", "TEXT"), + ("tieraerzte", "plz", "TEXT"), + ("tieraerzte", "ort", "TEXT"), ] with conn_factory() as conn: for table, column, col_type in migrations: diff --git a/backend/routes/tieraerzte.py b/backend/routes/tieraerzte.py index 3b2a340..616ea90 100644 --- a/backend/routes/tieraerzte.py +++ b/backend/routes/tieraerzte.py @@ -11,7 +11,9 @@ router = APIRouter() class TierarztCreate(BaseModel): name: str - adresse: Optional[str] = None + strasse: Optional[str] = None + plz: Optional[str] = None + ort: Optional[str] = None telefon: Optional[str] = None notfall_telefon: Optional[str] = None email: Optional[str] = None @@ -22,7 +24,9 @@ class TierarztCreate(BaseModel): class TierarztUpdate(BaseModel): name: Optional[str] = None - adresse: Optional[str] = None + strasse: Optional[str] = None + plz: Optional[str] = None + ort: Optional[str] = None telefon: Optional[str] = None notfall_telefon: Optional[str] = None email: Optional[str] = None @@ -48,11 +52,11 @@ async def create_tierarzt(data: TierarztCreate, user=Depends(get_current_user)): with db() as conn: conn.execute( """INSERT INTO tieraerzte - (user_id, name, adresse, telefon, notfall_telefon, + (user_id, name, strasse, plz, ort, telefon, notfall_telefon, email, website, notizen, ist_notfallpraxis) - VALUES (?,?,?,?,?,?,?,?,?)""", - (user["id"], data.name, data.adresse, data.telefon, - data.notfall_telefon, data.email, data.website, + VALUES (?,?,?,?,?,?,?,?,?,?,?)""", + (user["id"], data.name, data.strasse, data.plz, data.ort, + data.telefon, data.notfall_telefon, data.email, data.website, data.notizen, int(data.ist_notfallpraxis)) ) row = conn.execute( diff --git a/backend/static/css/components.css b/backend/static/css/components.css index 00aa066..ec1a8c3 100644 --- a/backend/static/css/components.css +++ b/backend/static/css/components.css @@ -239,6 +239,14 @@ .form-control::placeholder { color: var(--c-text-muted); } +/* Kalender-Icon in Datumseingaben: Amber statt Schwarz */ +input[type="date"]::-webkit-calendar-picker-indicator, +input[type="time"]::-webkit-calendar-picker-indicator { + cursor: pointer; + opacity: 0.85; + filter: sepia(0.7) saturate(1.8) hue-rotate(-8deg) brightness(0.9); +} + .form-control:focus { outline: none; border-color: var(--c-primary); @@ -450,6 +458,7 @@ textarea.form-control { .modal { background: var(--c-surface); border-radius: var(--radius-xl) var(--radius-xl) 0 0; + border: 2px solid var(--c-primary); width: 100%; max-width: 480px; max-height: 90vh; diff --git a/backend/static/css/layout.css b/backend/static/css/layout.css index 2682530..ac7d084 100644 --- a/backend/static/css/layout.css +++ b/backend/static/css/layout.css @@ -142,6 +142,11 @@ font-size: 22px; line-height: 1; position: relative; + filter: saturate(0.35) brightness(0.75); + transition: filter var(--transition-fast); +} +.nav-item.active .nav-item-icon { + filter: sepia(0.7) saturate(1.8) hue-rotate(-8deg) brightness(0.9); } /* Ungelesen-Badge auf Nav-Icon */ @@ -308,6 +313,11 @@ width: 24px; text-align: center; flex-shrink: 0; + filter: saturate(0.35) brightness(0.75); + transition: filter var(--transition-fast); +} +.sidebar-item.active .sidebar-item-icon { + filter: sepia(0.7) saturate(1.8) hue-rotate(-8deg) brightness(0.9); } .sidebar-item-badge { margin-left: auto; diff --git a/backend/static/js/pages/health.js b/backend/static/js/pages/health.js index 5a54bf8..a20b9ac 100644 --- a/backend/static/js/pages/health.js +++ b/backend/static/js/pages/health.js @@ -812,7 +812,10 @@ window.Page_health = (() => { ${_esc(p.name)} ${!p.aktiv ? ' · Ehemalig' : ''} - ${p.adresse ? `
${_esc(p.adresse)}
` : ''} + ${(p.strasse || p.plz || p.ort) ? ` +
+ ${[p.strasse, [p.plz, p.ort].filter(Boolean).join(' ')].filter(Boolean).map(_esc).join(', ')} +
` : ''}
${p.telefon ? ` { value="${_esc(praxis?.name || '')}" placeholder="Dr. Muster Tierarztpraxis" required>
- - + + +
+
+
+ + +
+
+ + +
@@ -918,7 +933,9 @@ window.Page_health = (() => { await UI.asyncButton(btn, async () => { const payload = { name: fd.name?.trim(), - adresse: fd.adresse || null, + strasse: fd.strasse || null, + plz: fd.plz || null, + ort: fd.ort || null, telefon: fd.telefon || null, notfall_telefon: fd.notfall_telefon || null, email: fd.email || null, diff --git a/backend/static/js/ui.js b/backend/static/js/ui.js index 9694fca..a3fdcc2 100644 --- a/backend/static/js/ui.js +++ b/backend/static/js/ui.js @@ -68,7 +68,6 @@ const UI = (() => { `; overlay.querySelector('.modal-close-btn')?.addEventListener('click', close); - overlay.addEventListener('click', e => { if (e.target === overlay) close(); }); document.getElementById('modal-container').appendChild(overlay); document.body.style.overflow = 'hidden'; diff --git a/backend/static/sw.js b/backend/static/sw.js index a0930cc..0d474c1 100644 --- a/backend/static/sw.js +++ b/backend/static/sw.js @@ -3,7 +3,7 @@ Offline-Cache + Push Notifications ============================================================ */ -const CACHE_VERSION = 'by-v7'; +const CACHE_VERSION = 'by-v8'; const CACHE_STATIC = `${CACHE_VERSION}-static`; // Diese Dateien werden beim Install gecacht (App Shell)