diff --git a/adminfront/src/app/routes.tsx b/adminfront/src/app/routes.tsx
index 2117b8fe..5026833f 100644
--- a/adminfront/src/app/routes.tsx
+++ b/adminfront/src/app/routes.tsx
@@ -6,7 +6,6 @@ import AuditLogsPage from "../features/audit/AuditLogsPage";
import AuthCallbackPage from "../features/auth/AuthCallbackPage";
import AuthPage from "../features/auth/AuthPage";
import LoginPage from "../features/auth/LoginPage";
-import DashboardPage from "../features/dashboard/DashboardPage";
import GlobalOverviewPage from "../features/overview/GlobalOverviewPage";
import { TenantAdminsAndOwnersTab } from "../features/tenants/routes/TenantAdminsAndOwnersTab";
import TenantCreatePage from "../features/tenants/routes/TenantCreatePage";
@@ -35,7 +34,6 @@ export const router = createBrowserRouter(
element: ,
children: [
{ index: true, element: },
- { path: "dashboard", element: },
{ path: "audit-logs", element: },
{ path: "auth", element: },
{ path: "users", element: },
diff --git a/adminfront/src/components/layout/AppLayout.tsx b/adminfront/src/components/layout/AppLayout.tsx
index df69e221..c944f59d 100644
--- a/adminfront/src/components/layout/AppLayout.tsx
+++ b/adminfront/src/components/layout/AppLayout.tsx
@@ -24,11 +24,6 @@ import RoleSwitcher from "./RoleSwitcher";
const navItems = [
{ label: "ui.admin.nav.overview", to: "/", icon: LayoutDashboard },
- {
- label: "ui.admin.nav.tenant_dashboard",
- to: "/dashboard",
- icon: ShieldHalf,
- },
{
label: "ui.admin.nav.tenants",
to: "/tenants",
diff --git a/adminfront/src/features/dashboard/DashboardPage.tsx b/adminfront/src/features/dashboard/DashboardPage.tsx
deleted file mode 100644
index e4b29dc2..00000000
--- a/adminfront/src/features/dashboard/DashboardPage.tsx
+++ /dev/null
@@ -1,243 +0,0 @@
-import {
- Activity,
- ArrowRight,
- Building2,
- CheckCircle2,
- LineChart,
- Radio,
- ShieldCheck,
- Sparkles,
-} from "lucide-react";
-
-const guardHighlights = [
- {
- title: "Tenant isolation",
- body: "All admin calls expect X-Tenant-ID and are prepared for tenant-aware headers.",
- metric: "Header guard",
- accent: "active",
- },
- {
- title: "Admin TTL",
- body: "Session budget kept short for admins. App session vs admin session split is explicit.",
- metric: "15m default",
- accent: "ttl",
- },
- {
- title: "Audit-first",
- body: "Every management action should log to ClickHouse. Hooks in place for later wiring.",
- metric: "per-action",
- accent: "audit",
- },
-];
-
-const stackReadiness = [
- "React 19 + Vite 7, strict TS, Router v6 data router.",
- "TanStack Query 5 provider ready with sane defaults.",
- "Axios client stub with bearer + tenant header injector.",
- "Tailwind v4 tokens tuned for admin dark plane.",
- "React Hook Form + Zod planned for client forms.",
- "IdP-neutral auth hook point reserved for role guard.",
-];
-
-const nextSteps = [
- "Add IdP-neutral OIDC/OAuth auth layer and enforce admin role in RequireAuth.",
- "Persist tenant picklist and feed X-Tenant-ID for every admin call.",
- "Add shadcn/ui primitives for forms and tables; lock lint/format.",
-];
-
-function DashboardPage() {
- return (
-
-
-
-
-
-
-
- adminfront ready
-
-
- Build the admin plane with{" "}
- tenant-aware {" "}
- defaults and{" "}
-
- least privilege
- {" "}
- UX.
-
-
- Route, query, and styling scaffolds are in place. Use this canvas
- to ship RP registry, audit exploration, and guarded login aligned
- with issue #60 while keeping providers swappable.
-
-
-
- Router + Query wired
-
-
- Admin namespace only
-
-
- Auth hook pending
-
-
-
-
-
-
- Admin guard scoped to /admin
-
-
-
- Tenant selection placeholder ready
-
-
-
- Audit stream hook for ClickHouse
-
-
-
-
-
-
- {guardHighlights.map((item) => (
-
-
-
-
- {item.metric}
-
-
- {item.accent}
-
-
-
-
{item.title}
-
{item.body}
-
-
- ))}
-
-
-
-
-
-
-
- Stack readiness
-
-
Matches issue #60
-
-
- Setup notes
-
-
-
-
- {stackReadiness.map((item) => (
-
- ))}
-
-
-
-
-
- Next actions
-
-
- Ship the first guarded flows
-
-
- {nextSteps.map((item, idx) => (
-
-
- {idx + 1}
-
-
{item}
-
- ))}
-
-
-
-
-
-
-
-
- Ops board
-
-
What to prototype next
-
-
-
- Audit → ClickHouse
-
-
- RP registry
-
-
-
-
-
-
-
-
- Metrics
-
-
-
- RP registration funnel
-
-
- Visualize create → secret rotate → redirect URI edits per tenant.
-
-
-
-
-
Admin action stream
-
- Live feed of admin API calls with per-action tenant, actor, and
- rate-limit outcome.
-
-
-
-
-
-
- Access
-
-
-
Admin login journey
-
- Outline SMS + app-based MFA choice and emphasize “admin session”
- TTL with logout.
-
-
-
-
-
- );
-}
-
-export default DashboardPage;
diff --git a/adminfront/src/features/overview/GlobalOverviewPage.tsx b/adminfront/src/features/overview/GlobalOverviewPage.tsx
index 7db5a1cd..88cd6475 100644
--- a/adminfront/src/features/overview/GlobalOverviewPage.tsx
+++ b/adminfront/src/features/overview/GlobalOverviewPage.tsx
@@ -193,10 +193,10 @@ function GlobalOverviewPage() {
className="w-full justify-between"
variant="outline"
>
-
+
{t(
- "ui.admin.overview.quick_links.view_audit_logs",
- "감사 로그 보기",
+ "ui.admin.overview.quick_links.user_management",
+ "사용자 관리",
)}
@@ -206,10 +206,23 @@ function GlobalOverviewPage() {
className="w-full justify-between"
variant="outline"
>
-
+
{t(
- "ui.admin.overview.quick_links.tenant_dashboard",
- "테넌트 대시보드",
+ "ui.admin.overview.quick_links.api_key_management",
+ "API 키 관리",
+ )}
+
+
+
+
+
+ {t(
+ "ui.admin.overview.quick_links.view_audit_logs",
+ "감사 로그 보기",
)}
diff --git a/adminfront/src/locales/en.toml b/adminfront/src/locales/en.toml
index 92c43ae3..c5180e63 100644
--- a/adminfront/src/locales/en.toml
+++ b/adminfront/src/locales/en.toml
@@ -732,9 +732,10 @@ title = "Tenant-independent control plane"
title = "Admin playbook"
[ui.admin.overview.quick_links]
-add_tenant = "Tenant Add"
-tenant_dashboard = "Tenant Dashboard"
-title = "Title"
+add_tenant = "Add Tenant"
+api_key_management = "API Key Management"
+title = "Quick Links"
+user_management = "User Management"
view_audit_logs = "View Audit Logs"
[ui.admin.role]
@@ -1393,7 +1394,6 @@ auth_guard = "Auth Guard"
logout = "Logout"
overview = "Overview"
relying_parties = "Apps (RP)"
-tenant_dashboard = "Tenant Dashboard"
user_groups = "Organization"
tenants = "Tenants"
users = "Users"
diff --git a/adminfront/src/locales/ko.toml b/adminfront/src/locales/ko.toml
index 81bf79c1..ceb252ac 100644
--- a/adminfront/src/locales/ko.toml
+++ b/adminfront/src/locales/ko.toml
@@ -777,8 +777,9 @@ title = "운영 플레이북"
[ui.admin.overview.quick_links]
add_tenant = "테넌트 추가"
-tenant_dashboard = "테넌트 대시보드"
+api_key_management = "API 키 관리"
title = "빠른 이동"
+user_management = "사용자 관리"
view_audit_logs = "감사 로그 보기"
[ui.admin.overview.summary]
@@ -1485,7 +1486,6 @@ auth_guard = "인증 가드"
logout = "로그아웃"
overview = "개요"
relying_parties = "애플리케이션(RP)"
-tenant_dashboard = "테넌트 대시보드"
user_groups = "조직 관리"
tenants = "테넌트"
users = "사용자"
diff --git a/adminfront/src/locales/template.toml b/adminfront/src/locales/template.toml
index d3f46c56..88211263 100644
--- a/adminfront/src/locales/template.toml
+++ b/adminfront/src/locales/template.toml
@@ -691,7 +691,6 @@ auth_guard = ""
logout = ""
overview = ""
relying_parties = ""
-tenant_dashboard = ""
user_groups = ""
tenants = ""
users = ""
@@ -705,8 +704,9 @@ title = ""
[ui.admin.overview.quick_links]
add_tenant = ""
-tenant_dashboard = ""
+api_key_management = ""
title = ""
+user_management = ""
view_audit_logs = ""
[ui.admin.role]