feat: tenants admin surface

Adds the first admin screen — /tenants — listing tenants from
GET /api/v1/admin/tenants with search, status badges, plan, created
date, and a per-row menu with suspend / activate / deactivate actions.

Hand-typed shapes in app/lib/arcadia/tenants.ts because arcadia's admin
endpoints aren't yet covered by /api/openapi (same 'ok'-placeholder
issue documented in lib-arcadia-client/scripts/sync-spec.mjs). When
the spec gains coverage, switch to arcadia.typed.GET(...) and drop the
manual types.

Trims the inherited consumer-app sidenav (Resources / Assistant / AI /
Library) down to admin-shaped items: Overview, Tenants, Audit log,
Settings. The unused route files stay in place; they just aren't linked.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
jules
2026-04-29 21:36:42 +10:00
parent f8cbf142b5
commit 080597d046
4 changed files with 373 additions and 5 deletions

View File

@@ -7,6 +7,7 @@ import {
LayoutDashboard,
Boxes,
Activity,
Building2,
Sparkles,
Bot,
BookOpen,
@@ -86,11 +87,8 @@ type NavItem = {
const navItems: NavItem[] = [
{ to: "/", icon: LayoutDashboard, label: "Overview", end: true },
{ to: "/resources", icon: Boxes, label: "Resources" },
{ to: "/activity", icon: Activity, label: "Activity" },
{ to: "/assistant", icon: Sparkles, label: "Assistant" },
{ to: "/ai", icon: Bot, label: "AI" },
{ to: "/library", icon: BookOpen, label: "Library" },
{ to: "/tenants", icon: Building2, label: "Tenants" },
{ to: "/activity", icon: Activity, label: "Audit log" },
{ to: "/settings", icon: Settings, label: "Settings" },
// CREMA:NAV-ITEMS
]