From 43b4570e697aa35f6b08dc06cfd2f0173e815adc Mon Sep 17 00:00:00 2001 From: Till JS Date: Wed, 22 Apr 2026 15:04:12 +0200 Subject: [PATCH] refactor(admin): fuse admin-* cards into one tabbed admin card MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit User feedback: four separate admin cards (admin-users, admin-system, admin-user-data + admin) bloated the scene-picker without adding value — they're one logical power-user surface split four ways. Fuse them into a single admin card with an internal tab switcher. - lib/modules/admin/tabs/{Overview,Users,System,UserData}Tab.svelte — each tab owns its own data + styles - lib/modules/admin/ListView.svelte is now a tabbed container: one role-guard, one pill-row, deep-linkable via `initialTab` prop - /admin, /admin/users, /admin/system, /admin/user-data routes pass the corresponding initialTab so direct URLs still land on the right section - Delete lib/modules/admin-{users,system,user-data}/ + three registerApp entries - Complexity stays a separate card (different shape — iframe-heavy, was already its own card before this batch) Smoketest: all 5 /admin/* routes respond 200; type-check clean. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../apps/web/src/lib/app-registry/apps.ts | 30 -- .../web/src/lib/modules/admin/ListView.svelte | 358 ++++++------------ .../lib/modules/admin/tabs/OverviewTab.svelte | 239 ++++++++++++ .../tabs/SystemTab.svelte} | 198 ++++------ .../tabs/UserDataTab.svelte} | 265 ++++++------- .../tabs/UsersTab.svelte} | 118 ++---- .../web/src/routes/(app)/admin/+page.svelte | 6 +- .../routes/(app)/admin/system/+page.svelte | 8 +- .../routes/(app)/admin/user-data/+page.svelte | 8 +- .../src/routes/(app)/admin/users/+page.svelte | 8 +- 10 files changed, 597 insertions(+), 641 deletions(-) create mode 100644 apps/mana/apps/web/src/lib/modules/admin/tabs/OverviewTab.svelte rename apps/mana/apps/web/src/lib/modules/{admin-system/ListView.svelte => admin/tabs/SystemTab.svelte} (59%) rename apps/mana/apps/web/src/lib/modules/{admin-user-data/ListView.svelte => admin/tabs/UserDataTab.svelte} (63%) rename apps/mana/apps/web/src/lib/modules/{admin-users/ListView.svelte => admin/tabs/UsersTab.svelte} (63%) diff --git a/apps/mana/apps/web/src/lib/app-registry/apps.ts b/apps/mana/apps/web/src/lib/app-registry/apps.ts index 2740031c3..c40b57c7b 100644 --- a/apps/mana/apps/web/src/lib/app-registry/apps.ts +++ b/apps/mana/apps/web/src/lib/app-registry/apps.ts @@ -1165,36 +1165,6 @@ registerApp({ }, }); -registerApp({ - id: 'admin-users', - name: 'Admin · Users', - color: '#EF4444', - icon: AddressBook, - views: { - list: { load: () => import('$lib/modules/admin-users/ListView.svelte') }, - }, -}); - -registerApp({ - id: 'admin-system', - name: 'Admin · System', - color: '#EF4444', - icon: HardDrives, - views: { - list: { load: () => import('$lib/modules/admin-system/ListView.svelte') }, - }, -}); - -registerApp({ - id: 'admin-user-data', - name: 'Admin · User Data', - color: '#EF4444', - icon: File, - views: { - list: { load: () => import('$lib/modules/admin-user-data/ListView.svelte') }, - }, -}); - registerApp({ id: 'complexity', name: 'Complexity', diff --git a/apps/mana/apps/web/src/lib/modules/admin/ListView.svelte b/apps/mana/apps/web/src/lib/modules/admin/ListView.svelte index f7c462763..5b85776a7 100644 --- a/apps/mana/apps/web/src/lib/modules/admin/ListView.svelte +++ b/apps/mana/apps/web/src/lib/modules/admin/ListView.svelte @@ -1,264 +1,150 @@ -
- -
- - - - +{#if !isAdmin} +
+ +

Admin-only

+

Das Admin-Dashboard ist nur für Admin-Nutzer sichtbar.

+{:else} +
+
+ {#each tabs as tab} + + {/each} +
- -
- -
-

Security (Last 7 Days)

- {#if loading} -
-
-
-
- {:else if stats} -
-
-
- - Successful Logins -
- {stats.loginSuccess7d} -
-
-
- - Failed Logins -
- {stats.loginFailed7d} -
-
-
- Success Rate - - {stats.loginSuccess7d + stats.loginFailed7d > 0 - ? Math.round( - (stats.loginSuccess7d / (stats.loginSuccess7d + stats.loginFailed7d)) * 100 - ) - : '—'}% - -
-
+
+ {#if activeTab === 'overview'} + + {:else if activeTab === 'users'} + + {:else if activeTab === 'system'} + + {:else if activeTab === 'user-data'} + {/if}
- -
- - {#if error} -
-

{error}

-
- {/if} -
+{/if} diff --git a/apps/mana/apps/web/src/lib/modules/admin/tabs/OverviewTab.svelte b/apps/mana/apps/web/src/lib/modules/admin/tabs/OverviewTab.svelte new file mode 100644 index 000000000..db95b6e34 --- /dev/null +++ b/apps/mana/apps/web/src/lib/modules/admin/tabs/OverviewTab.svelte @@ -0,0 +1,239 @@ + + + +
+
+ + + + +
+ +
+
+

Security (Last 7 Days)

+ {#if loading} +
+
+
+
+ {:else if stats} +
+
+
+ + Successful Logins +
+ {stats.loginSuccess7d} +
+
+
+ + Failed Logins +
+ {stats.loginFailed7d} +
+
+
+ Success Rate + + {stats.loginSuccess7d + stats.loginFailed7d > 0 + ? Math.round( + (stats.loginSuccess7d / (stats.loginSuccess7d + stats.loginFailed7d)) * 100 + ) + : '—'}% + +
+
+ {/if} +
+ + +
+ + {#if error} +

{error}

+ {/if} +
+ + diff --git a/apps/mana/apps/web/src/lib/modules/admin-system/ListView.svelte b/apps/mana/apps/web/src/lib/modules/admin/tabs/SystemTab.svelte similarity index 59% rename from apps/mana/apps/web/src/lib/modules/admin-system/ListView.svelte rename to apps/mana/apps/web/src/lib/modules/admin/tabs/SystemTab.svelte index ecdcfa961..0e48a394c 100644 --- a/apps/mana/apps/web/src/lib/modules/admin-system/ListView.svelte +++ b/apps/mana/apps/web/src/lib/modules/admin/tabs/SystemTab.svelte @@ -1,16 +1,10 @@ -{#if !isAdmin} -
- -

Admin-only

-

Die System-Übersicht ist nur für Admin-Nutzer sichtbar.

-
-{:else} -
-
-
-

System Status

- {#if !loading} -
- - {healthyCount}/{totalCount} healthy -
- {/if} -
- - {#if loading} -
- {#each Array(8) as _} -
- {/each} -
- {:else} -
- {#each services as service} -
- -
-

{service.name}

-

{statusLabels[service.status]}

-
- {#if service.url !== '-'} - - - - {/if} -
- {/each} +
+
+
+

System Status

+ {#if !loading} +
+ + {healthyCount}/{totalCount} healthy
{/if} -
+ - + {#if loading} +
+ {#each Array(8) as _} +
+ {/each} +
+ {:else} +
+ {#each services as service} +
+ +
+

{service.name}

+

{statusLabels[service.status]}

+
+ {#if service.url !== '-'} + + + + {/if} +
+ {/each} +
+ {/if} +
-
-

Environment

-
-
-
- Server - Mac Mini (mana.how) -
-
- Domain - *.mana.how -
-
- SSL - Caddy (Auto) -
+ + +
+

Environment

+
+
+
+ Server + Mac Mini (mana.how)
-
-
- Database - PostgreSQL 16 -
-
- Cache - Redis 7 -
-
- Tunnel - Cloudflare -
+
+ Domain + *.mana.how +
+
+ SSL + Caddy (Auto)
-
-
-{/if} +
+
+ Database + PostgreSQL 16 +
+
+ Cache + Redis 7 +
+
+ Tunnel + Cloudflare +
+
+
+
+