Files
sales-trainer/docs/engineering-log/2026-08-07-ui-tablayout.md

39 lines
2.3 KiB
Markdown

# 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`).