geocrop-platform./apps/nextgen/.harness/changelogs/2026-07-17-p1-11-p1-ux5b.md

79 lines
3.6 KiB
Markdown

# 2026-07-17 — P1-11 vocab sweep + P1-UX-5b terminology hook
Branch: `feat/p1-11-and-ux5b-shapeshift`
Worktree: `.worktrees/feat-p1-11-and-ux5b-shapeshift`
## Why
The UI/UX feedback PDF (§5 Global terminology, §6 Teacher Dashboard, §7
Notice Board, §8 Curriculum Portfolio, §9 Course Scheme/Plan) requires
many user-facing labels to change. Hunting these down through 100+
components every time is unsustainable, so the work is in two halves:
1. A small `terminology.ts` dictionary + `useTerminology()` hook that
every UI label can route through going forward.
2. Surgical text edits to the highest-traffic teacher/notice-board
dashboards so the new language ships immediately on the Pilot UAT
deploy.
## Changes
### `client/src/lib/terminology.ts` (new)
Single source of truth for all replaced terms. Exports:
- `T` — frozen flat dictionary (`STUDENT: 'Learner'`, `MATERIAL_ASSETS:
'Learning Material'`, `VIEW_ROSTER: 'View Learners'`, `ARCHIVE_COURSE:
'Delete'`, `GRADING: 'Marking'`, `THRESHOLD: 'Average'`, `MARKED:
'Excused'`, `OUTLIERS: 'Below Average'`, `STUDENT_DRILLDOWN: 'Learner
Remedial Record'`, `BROADCAST: 'Notification'`, plus PDF §9 entries).
- `T_TIERED` — dictionary keyed by `primary` / `secondary` / `tertiary`
for entries that genuinely differ per tier.
- `TIER` / `ACTIVE_TIER` — constants. `ACTIVE_TIER` is hard-coded
`tertiary` for now; will read from `school_settings.school_tier` once
that column lands.
- `useTerminology()` — hook returning `{ tier, T, T_TIERED, term,
label }`. `label('Course')` resolves to the current tier's mapping.
### `client/src/test/terminology.test.ts` (new, 15 specs)
Vitest. Asserts every PDF § value is present and that `termFor` /
`label` resolve tiered entries correctly.
### User-facing label edits (text-only, 6 files)
| File | PDF § | Edits |
|---|---|---|
| `pages/teacher/TeacherDashboard.tsx` | §6 | `Students → Learners`, `Pending Grading → Pending Marking`, `Below Threshold → Below Average`, `Outliers (avg < 50%) → Below Average (avg < 50%)`, `Marked → Excused` (attendance callout), `Student Drill-down → Learner Remedial Record` |
| `pages/teacher/MyCourses.tsx` | §8 | `Material Assets → Learning Material`, `View Roster → View Learners`, `Archive Course → Delete` |
| `pages/Classes.tsx` | §9 | `Export Intel → Export Scheme` |
| `pages/teacher/Extracurriculars.tsx` | §7 | `Broadcast update to members → Notification update to members`, `Broadcast Update → Notification Update` button |
| `pages/teacher/Students.tsx` | §7 | `Broadcast Notice → Notification` button |
No code identifiers, SQL columns, route paths, or variable names were
touched. Identifier substitutions happen at the schema layer (separate
follow-up, not user-blocking).
## Tier switching — a note
`ACTIVE_TIER` is currently hard-coded `tertiary`. Wiring it to
`school_settings.school_tier` (or a school-wide setting) is the next
sprint. Until that lands, every tier-aware label uses the tertiary
mappings. This matches the demo state and keeps the
default-pilot-deployable promise.
## Verification
- `npx vitest run` (client) → **45 / 45 passed** (5 spec files; 15 new
from this PR).
- Manual diff review: every edit is a literal string change; no logic
changes, no API surface changes.
## Out of scope
- Tier wiring (school_settings.school_tier). Tracked separately.
- §8/§9 substitutions in pages that don't exist yet (Course Scheme/Plan,
Curriculum Portfolio). Those land in P1-UX-7.
- Identifier-level renames (variable names like `student_id` keep the
schema's choice; no PR will rename `users.id`).