# 2026-08-07 — UI: 3-tab layout per spec (admin overview w/ date filter, personal dashboard, training, settings) ## Spec (from user) 1. Settings page: user/profile settings + change password. 2. 3-tab UI: - 2.1 Dashboard ภาพรวม (admin only): overall user stats + DATE FILTER. - 2.2 Personal dashboard: per-user results (admin also has it — admins train too). - 2.3 Training: product list -> persona list w/ difficulty; admin sees full persona data + edit + "add product" button (generate new personas). ## Implemented (commit `b05907a`) - **Tab 1 Admin overview (`/`)** = Analytics.vue: headline stats (sessions/wins/losses/close rate/avg score/trainees) + **date filter** (`?from=YYYY-MM-DD&to=YYYY-MM-DD` on session `created_at`) + hardest personas + admin quick actions (Users / + Add product). - **Tab 2 My dashboard (`/my/board`)** = MyBoard.vue: win/lose/not-tried summary + recent sessions. Backend `/api/me/board` + `/api/chat/sessions` now allow ANY authenticated user (so admins can view their personal dashboard too), not just role=user. - **Tab 3 Training (`/training`)** = Training.vue: product list w/ status badge + persona count; admins see ALL groups (draft -> analyze/edit, ready -> manage), trainees see ready only; on product click -> personas list showing **difficulty** (1-5 stars); admins get the Manage-personas route (`/admin/groups/:gid/edit`). - **Settings (`/settings`)** = Settings.vue: profile (name/email) + change password + language. Added self-service `PATCH /api/auth/profile` (updates name/email for any authed user) + `UserStore.set_name`. ## Backend changes - analytics_routes: date-range filter (`from`/`to`) on session created_at. - auth_routes: `PATCH /api/auth/profile`. - users.py: `set_name`. - me_routes / chat_routes: removed strict `require_roles("user")` on /api/me/board and /api/chat/sessions (still auth-gated + self-scoped). ## Verification - Frontend `npm run build` ok (fixed a duplicate `style` attr in Analytics.vue that broke parse). - Backend tests m0 / setup / e2e all pass. - Live server: `/api/analytics?from&to` returns filtered results; `PATCH /api/auth/profile` updates name (200); served SPA references the fresh chunk. - Pushed to `git.moreminimore.com/kunthawat/sales-trainer` (`b05907a`).