feat: complete phase 2 UX improvements
This commit is contained in:
@@ -158,19 +158,24 @@ Until then they remain behind the toggle so no tested functionality is lost.
|
||||
component and per-section actionable empty-state copy ("No work experience added yet" → the Add button
|
||||
already present). Neither is blocking; both are cosmetic.
|
||||
|
||||
### Phase 2 — Import CV review screen
|
||||
Add a post-upload "New information found" review (Experience / Skills / Languages / Education) with
|
||||
`[Accept all] · [Review individually] · [Discard]`, diffing the extracted profile against the current
|
||||
one **client-side** (no backend change — the extraction API already returns the structured result and
|
||||
field metadata). Nothing is written until the user accepts. Relocate run history to Settings →
|
||||
Advanced → Import history.
|
||||
### Phase 2 — Import CV review screen (DONE 2026-07-30)
|
||||
Extraction runs now stop at `pending_review`; they no longer overwrite the career profile. A backend diff
|
||||
and conservative merge preserve curated/unmatched data, stable item IDs and non-empty values. The
|
||||
Career Profile shows additions/updates by category with Apply/Discard actions. Low-confidence changes
|
||||
have stable change IDs, are excluded by default in the API, and require individual checkbox confirmation.
|
||||
Projects, certifications, languages-from-prose, grouped skill prefixes, glued date/title text, common
|
||||
mojibake, and nested earlier/part-time roles are covered by regression tests. Part-time roles are separate
|
||||
experience entries. No schema migration was required; pending profiles already fit `CvExtractionRun`.
|
||||
|
||||
### Phase 3 — Remove the second CV builder
|
||||
Delete the rewrite-template + PDF-carousel flow from `CareerProfilePage`. Confirm the CV Builder
|
||||
(`/career/builder`) covers templates/layout/styling/variants/PDF first (it does). Verify public CV and
|
||||
PDF generation still work end to end.
|
||||
### Phase 3 — Remove the second CV builder (DONE 2026-07-30)
|
||||
The hidden template/rewrite/PDF-carousel block and all of its state, helpers, saved-job fetch, preview
|
||||
dialog, and obsolete tests were deleted from `CareerProfilePage`. Career Profile now links directly to
|
||||
`/career/builder`, the single owner of templates, layout, variants, previews and PDF generation. The
|
||||
raw import section parser remains under Advanced CV tools as a recovery path.
|
||||
|
||||
### Phase 4 — WYSIWYG for long-form fields (DONE 2026-07-30)
|
||||
Reused the existing dependency-free Markdown toolbar for the professional summary, work and education details, custom/project sections, and cover letters. Native textarea undo/redo remains available and stored payloads remain clean strings/string arrays.
|
||||
|
||||
### Phase 4 — WYSIWYG for long-form fields
|
||||
Rich editor (bold, lists, links, undo/redo) for professional summary, work descriptions, achievements,
|
||||
projects, cover letters. **Store clean HTML or Markdown only** — no editor-specific state — and the
|
||||
renderer consumes the same format. Choose a small dependency already compatible with the stack, or a
|
||||
|
||||
@@ -50,21 +50,21 @@ Goal: finish surfacing the pre-application workflow in the UI, and close the sec
|
||||
|
||||
---
|
||||
|
||||
## Phase 2 — UX improvements
|
||||
## Phase 2 — UX improvements ✅ DONE (2026-07-30)
|
||||
|
||||
Goal: the guide's "users should always understand where they are, what they can do, what happens next."
|
||||
|
||||
| # | Task | Priority | Difficulty | Dependencies | Expected value |
|
||||
|---|---|---|---|---|---|
|
||||
| 2.1 | ~~Split `/profile` and `/career`~~ ✅ **DONE (2026-07-17, commit `66cc6a7`)** — `/profile` = identity + security + preferences; `/career` = master career profile. The two saves are now scoped (partial-update-safe `PUT /auth/profile`) so neither wipes the other; the inert CV-Builder tab and dead `careerView` prop are gone. **The master profile is the source of truth; generated docs reference snapshots (not built yet).** | **P1** | **M** | none | Fixed the guide's "everything should have one obvious place". Functional separation via the existing `careerOnly` fork + scoped saves. |
|
||||
| 2.2 | **Decompose `ProfilePage.tsx` (still ~1370 lines) into two real components** | **P1** | **M** | 2.1 | Phase 2 delivered the *functional* split via the `careerOnly` fork + scoped saves, but it is still one file behind a boolean. Extracting `ProfilePage` (identity/security) and a `CareerWorkspace` content component (master profile) is the remaining cleanup — mechanical, deferred so Phase 2 stayed low-risk. Blocks nothing; do before heavy Phase 3/4 edits. |
|
||||
| 2.3 | **Real onboarding flow** — `Signup → Verify → Profile → Import CV → Connect email → First job` replacing the 2-item checklist | **P1** | **M** | 2.1 | Currently a dismissible checkbox pair. **Surface the Gmail connect step** — the strongest differentiator is buried in `/settings/connected-accounts`. |
|
||||
| 2.4 | **Dedicated `/register` screen** | **P2** | **S** | none | Endpoint exists but returns 403 by default and has no route; signup is hidden inside `LoginPage`. Required for Phase 7; harmless now. |
|
||||
| 2.5 | **Introduce a server-cache layer** (React Query or equivalent) | **P2** | **M** | none | Root cause of the 600–1400-line components and the hand-rolled `refreshToken` prop-threading. Pays for itself across Phases 3–6. Adopt incrementally, not as a rewrite. |
|
||||
| 2.6 | **Decompose `JobDetailsDialog.tsx` (1400 lines)** | **P2** | **M** | 2.5 | A dialog carrying an entire workspace. |
|
||||
| 2.7 | **Interview prep hub screen** | **P2** | **S** | none | `/jobapplications/{id}/interview-prep` already works and is invisible. Cheap win — a shipped feature nobody can reach. |
|
||||
| 2.8 | **Retire `react-scripts` as test runner** (move to Jest+SWC or Vitest) | **P2** | **M** | none | Removes one of three frontend toolchains. Do not touch the router in the same change. |
|
||||
| 2.9 | **Expand analytics** — funnel, response rate, time-in-stage | **P3** | **M** | 1.3 | The paid feature at Teal/Huntr. Needs correct prospect-vs-applied accounting from 1.3 first. |
|
||||
| 2.2 | ✅ **DONE (2026-07-30)** — decomposed identity/security and Career Workspace into separate `ProfilePage` and `CareerProfilePage` components, with career sections extracted into focused presentational components. | **P1** | **M** | 2.1 | Phase 2 delivered the *functional* split via the `careerOnly` fork + scoped saves, but it is still one file behind a boolean. Extracting `ProfilePage` (identity/security) and a `CareerWorkspace` content component (master profile) is the remaining cleanup — mechanical, deferred so Phase 2 stayed low-risk. Blocks nothing; do before heavy Phase 3/4 edits. |
|
||||
| 2.3 | ✅ **DONE (2026-07-30)** — `Signup → Verify → Profile → Import CV → Connect email → First job`; the dashboard progress flow reuses existing signup/verification screens, reads structured career data, detects Gmail/Outlook/IMAP connections, and disappears when complete. | **P1** | **M** | 2.1 | Currently a dismissible checkbox pair. **Surface the Gmail connect step** — the strongest differentiator is buried in `/settings/connected-accounts`. |
|
||||
| 2.4 | ✅ **DONE (2026-07-30)** — dedicated `/register` route reuses the hardened auth form and clearly disables submission when registration is unavailable. | **P2** | **S** | none | Endpoint exists but returns 403 by default and has no route; signup is hidden inside `LoginPage`. Required for Phase 7; harmless now. |
|
||||
| 2.5 | ✅ **DONE** — incremental cache equivalents ship through `useViewResource` for shared server state and `useWorkspaceTabCache` for expensive workspace tabs; no dependency added. | **P2** | **M** | none | Root cause of the 600–1400-line components and the hand-rolled `refreshToken` prop-threading. Pays for itself across Phases 3–6. Adopt incrementally, not as a rewrite. |
|
||||
| 2.6 | ✅ **DONE (2026-07-30)** — extracted shared presentation cards and four intelligence tab panels into `JobDetailsPanels` and `JobInsightTabs`; the dialog remains the orchestration boundary. | **P2** | **M** | 2.5 | A dialog carrying an entire workspace. |
|
||||
| 2.7 | ✅ **DONE** — user-owned interview preparation is exposed in `ApplicationWorkspacePage`, reachable from workflow signals and reminders, with grouped editable prep items. | **P2** | **S** | none | `/jobapplications/{id}/interview-prep` already works and is invisible. Cheap win — a shipped feature nobody can reach. |
|
||||
| 2.8 | ✅ **DONE (2026-07-30)** — direct Jest + Babel configuration replaces `react-scripts`; packages were promoted from the existing lockfile without a new download. | **P2** | **M** | none | Removes one of three frontend toolchains. Do not touch the router in the same change. |
|
||||
| 2.9 | ✅ **DONE** — dashboard analytics include funnel, response rate by source, top companies, and time-in-stage backed by `AnalyticsService`. | **P3** | **M** | 1.3 | The paid feature at Teal/Huntr. Needs correct prospect-vs-applied accounting from 1.3 first. |
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user