From 4d7783dd8b1239ed2e9ed92d259afb53fd179708 Mon Sep 17 00:00:00 2001 From: Hendrik Date: Fri, 17 Apr 2026 15:35:20 +0200 Subject: [PATCH] feat(ui): add admin area (domains, profiles, backup) with gear link in header Co-Authored-By: Claude Opus 4.7 (1M context) --- src/routes/+layout.svelte | 23 ++- src/routes/admin/+layout.svelte | 58 ++++++++ src/routes/admin/+page.svelte | 15 ++ src/routes/admin/backup/+page.svelte | 78 ++++++++++ src/routes/admin/domains/+page.svelte | 168 ++++++++++++++++++++++ src/routes/admin/profiles/+page.svelte | 191 +++++++++++++++++++++++++ 6 files changed, 532 insertions(+), 1 deletion(-) create mode 100644 src/routes/admin/+layout.svelte create mode 100644 src/routes/admin/+page.svelte create mode 100644 src/routes/admin/backup/+page.svelte create mode 100644 src/routes/admin/domains/+page.svelte create mode 100644 src/routes/admin/profiles/+page.svelte diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index e5a463f..e1e042f 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -12,7 +12,10 @@
Kochwas - +
+ ⚙️ + +
@@ -51,6 +54,24 @@ text-decoration: none; color: #2b6a3d; } + .bar-right { + display: flex; + align-items: center; + gap: 0.5rem; + } + .admin-link { + display: inline-flex; + align-items: center; + justify-content: center; + width: 40px; + height: 40px; + border-radius: 999px; + text-decoration: none; + font-size: 1.15rem; + } + .admin-link:hover { + background: #f4f8f5; + } main { padding: 0 1rem 4rem; max-width: 760px; diff --git a/src/routes/admin/+layout.svelte b/src/routes/admin/+layout.svelte new file mode 100644 index 0000000..dadf18d --- /dev/null +++ b/src/routes/admin/+layout.svelte @@ -0,0 +1,58 @@ + + + + +
+ {@render children()} +
+ + diff --git a/src/routes/admin/+page.svelte b/src/routes/admin/+page.svelte new file mode 100644 index 0000000..e19d5b4 --- /dev/null +++ b/src/routes/admin/+page.svelte @@ -0,0 +1,15 @@ + + +

Weiterleitung…

+ + diff --git a/src/routes/admin/backup/+page.svelte b/src/routes/admin/backup/+page.svelte new file mode 100644 index 0000000..43809c1 --- /dev/null +++ b/src/routes/admin/backup/+page.svelte @@ -0,0 +1,78 @@ + + +

Backup

+

+ Lade ein ZIP-Archiv mit der Datenbank und allen Bildern herunter. Bewahre es an einem + sicheren Ort auf — damit sind alle Rezepte, Bewertungen, Kommentare und Kochjournal-Einträge gesichert. +

+ + + +
+

Hinweis

+

+ Die Wiederherstellung aus einem ZIP folgt in Phase 5b — fürs Erste ersetze den Inhalt + des data/-Ordners manuell. +

+
+ + diff --git a/src/routes/admin/domains/+page.svelte b/src/routes/admin/domains/+page.svelte new file mode 100644 index 0000000..c14c476 --- /dev/null +++ b/src/routes/admin/domains/+page.svelte @@ -0,0 +1,168 @@ + + +

Erlaubte Domains

+

+ Nur Rezepte von diesen Domains können importiert werden. Jeder darf pflegen. +

+ +
{ + e.preventDefault(); + void add(); + }} +> + + + +
+ +{#if errored} +

{errored}

+{/if} + +{#if loading} +

Lädt…

+{:else if domains.length === 0} +

Noch keine Domains. Füge Chefkoch, Emmi kocht einfach o.ä. hinzu.

+{:else} +
    + {#each domains as d (d.id)} +
  • +
    +
    {d.domain}
    + {#if d.display_name}
    {d.display_name}
    {/if} +
    + +
  • + {/each} +
+{/if} + + diff --git a/src/routes/admin/profiles/+page.svelte b/src/routes/admin/profiles/+page.svelte new file mode 100644 index 0000000..c7bacc8 --- /dev/null +++ b/src/routes/admin/profiles/+page.svelte @@ -0,0 +1,191 @@ + + +

Profile

+

+ Profile werden ohne Passwort verwendet. Beim App-Start wählt man einfach aus. +

+ +
{ + e.preventDefault(); + void add(); + }} +> + + + +
+ +{#if errored} +

{errored}

+{/if} + +{#if !profileStore.loaded} +

Lädt…

+{:else if profileStore.profiles.length === 0} +

Noch keine Profile.

+{:else} +
    + {#each profileStore.profiles as p (p.id)} +
  • +
    + {p.avatar_emoji ?? '🙂'} + {p.name} + {#if profileStore.activeId === p.id} + aktiv + {/if} +
    +
    + + +
    +
  • + {/each} +
+{/if} + +