--- phase: "09" plan: "02" subsystem: frontend-admin-shell tags: [admin, layout, vue, routing] dependency_graph: requires: [09-01] provides: [AdminLayout.vue, AdminSidebar.vue, AdminOverviewView.vue, getAdminOverview] affects: [frontend/src/api/admin.js, frontend/src/layouts/, frontend/src/components/admin/, frontend/src/views/admin/] tech_stack: added: [] patterns: [layout-as-route-component, single-fetch-view, scoped-css-apply] key_files: created: - frontend/src/layouts/AdminLayout.vue - frontend/src/components/admin/AdminSidebar.vue - frontend/src/views/admin/AdminOverviewView.vue modified: - frontend/src/api/admin.js decisions: - "Four stat cards chosen (Users, Storage, Processing, Ready) — ADMIN-11 lists 4 stats explicitly; D-01 allows 3-4 cards so 4 was chosen as the natural number matching the backend response fields" - "No Pinia store for AdminOverviewView — single-fetch component consistent with all existing admin tab patterns (confirmed by RESEARCH.md open question 2)" - "D-06 applied: no Back-to-app link anywhere in AdminSidebar" - "AdminOverviewView has no top-level padding — AdminLayout owns p-8 max-w-5xl mx-auto (Pitfall 9 avoided)" metrics: duration: "18 minutes" completed: "2026-06-12" tasks_completed: 3 tasks_total: 3 files_created: 3 files_modified: 1 --- # Phase 09 Plan 02: Admin Route Shell — Layout, Sidebar, Overview View Summary **One-liner:** AdminLayout (flex sidebar shell), AdminSidebar (5 nav links, indigo Admin badge, no Back-to-app), AdminOverviewView (4-card stats + 10-row audit table fetching GET /api/admin/overview). ## Tasks Completed | Task | Name | Commit | Files | |------|------|--------|-------| | 1 | Add getAdminOverview() to api/admin.js | fd12ee2 | frontend/src/api/admin.js | | 2 | Create AdminLayout.vue + AdminSidebar.vue | 4eb489f | frontend/src/layouts/AdminLayout.vue, frontend/src/components/admin/AdminSidebar.vue | | 3 | Create AdminOverviewView.vue | 1e14e15 | frontend/src/views/admin/AdminOverviewView.vue | ## What Was Built ### Task 1 — getAdminOverview() Added `export async function getAdminOverview()` to `frontend/src/api/admin.js`. The function calls `request('/api/admin/overview')` using the pre-existing `request` import from `utils.js`. No new import added. The function is automatically re-exported by `client.js` via the barrel export pattern established in Phase 8 CODE-04. ### Task 2 — AdminLayout.vue + AdminSidebar.vue `AdminLayout.vue` is a minimal flex-row shell: `
` wrapping `` and a `
` with the content padding wrapper (`p-8 max-w-5xl mx-auto`) that contains ``. Uses `