3.7 KiB
3.7 KiB
Round 2 Plan: Tabbed Admin Interface
Summary
Refactor the admin area from one long dashboard into a tabbed interface with three subsections: Main, Projects, and Contact Details. Keep the existing password-protected admin shell, reuse the current CRUD behavior, and add HTMX-powered tab loading so the interface feels fast while each tab remains accessible by URL.
Key Changes
- Add protected admin tab routes:
GET /adminredirects to/admin/main.GET /admin/mainshows homepage/about content editing.GET /admin/projectsshows project creation, project editing, gallery upload/removal.GET /admin/contact-detailsshows public contact fields and saved contact requests.
- Keep existing mutation routes but redirect or HTMX-refresh back to the relevant tab:
POST /admin/contentreturns to/admin/mainunless only contact fields were submitted.POST /admin/contact-detailsupdates email, phone, and location, then returns to/admin/contact-details.- Project mutation routes return to
/admin/projects.
- Split
web/templates/admin.htmlinto a reusable admin layout plus tab partials:- Admin layout: header, logout/view-site actions, flash message area, tab navigation, and
#admin-panelcontent target. - Main tab partial: hero title/subtitle, intro copy, about name/role/bio, hero image, about image.
- Projects tab partial: add project form, project edit forms, cover image changes, gallery images.
- Contact details tab partial: email/phone/location form plus contact request inbox.
- Admin layout: header, logout/view-site actions, flash message area, tab navigation, and
Interface Behavior
- Use a horizontal tab bar under the admin header with active state for
main,projects, andcontact details. - Tabs are normal links for direct navigation and browser refresh support.
- Add
hx-get,hx-target="#admin-panel",hx-push-url="true", andhx-swap="innerHTML transition:true"to tab links for smooth in-page tab changes. - On direct page loads, render the full admin layout with the requested tab already active.
- On HTMX requests, return only the tab panel partial and update the tab active state with an out-of-band fragment or by returning the tab nav with
hx-swap-oob. - Keep mobile behavior simple: tabs scroll horizontally if needed, forms remain single-column on small screens.
Data and Handler Notes
- Reuse the existing
adminDataloading pattern, but allow tab-specific data loading to avoid fetching project galleries on the Main tab. - Keep all admin routes behind
requireAdmin. - Add a small
AdminTabfield to page data so templates can render active tab state. - Move email, phone, and location out of the Main form into Contact Details while still storing them in the existing
site_contentrow. - Do not change the SQLite schema for this refactor.
Test Plan
- Update handler tests:
/adminredirects to/admin/main.- unauthenticated requests to each tab redirect to
/admin/login. - authenticated requests to
/admin/main,/admin/projects, and/admin/contact-detailsreturn200. - HTMX tab requests return partial content rather than the full admin document.
- content updates redirect to the correct tab.
- project create/update/delete routes still work and redirect to
/admin/projects.
- Manual checks:
- tab links work with and without JavaScript.
- HTMX tab changes update browser URL.
- active tab styling is correct after direct load, HTMX navigation, and form redirects.
- mobile tab bar and forms remain usable.
Assumptions
- "Main" means homepage/about presentation content and showcase images.
- "Projects" owns all project and gallery management.
- "Contact Details" owns public contact fields and the contact request inbox.
- This is a UI/routing refactor only; no database migration is needed.