feat(jobs): redesign table and mobile cards with preserved workflows

This commit is contained in:
cesnimda
2026-09-28 23:30:43 +02:00
parent 0f54007015
commit 7127005e48
20 changed files with 192 additions and 63 deletions
+3 -3
View File
@@ -10,16 +10,16 @@ Reconciled against [P4-06](../phase-4/p4-06/README.md#opendeferred-issue-reconci
| P4-03-D01 light Redo Tooltip 3.89:1 | Addressed in P5-00 shared opaque semantic pair; narrow old exception removed | Tooltip gate ready for tested loaded targets; not universal accessibility certification |
| P4-04-O01 toast covers bottom action | Addressed in P5-00: bottom feedback clearance, native success toast tested while open | Feedback gate ready for the defined Connections action; not a universal overlay manager or company-modal error repair |
| P5-00-D01 fixed worker data with system clock | **Closed 2026-09-21**: test now injects its existing fixed clock; complete backend rerun 916/916 | P5-01 baseline gate satisfied; production worker unchanged, no skip/expected annotation |
| P5-00-D02 browser Back loses Jobs row focus | **Open** existing route behavior exposed by waiting for the actual workspace before Back; all four locale/theme cases. Explicit workspace Back passes `focusJobId` and remains protected | **Blocks affected P5-03/08 navigation accessibility acceptance**, not unchanged shell. Browser query and local-density reset plus explicit-button focus have separate oracles; no route/table application fix in P5-00 |
| P5-00-D02 browser Back loses Jobs row focus | **Closed for Jobs in [P5-03](p5-03/README.md)**: originating list history entry retains only the numeric row focus target; all four locale/theme real-browser cases return after workspace load and focus the row. Explicit workspace Back remains protected | P5-03 Jobs navigation gate met. Revalidate the same contract if P5-08 changes workspace navigation or route behavior |
| P3-O02 command error→empty / late query results | **Addressed in P5-02**: failed search has Retry, aborted/late results are discarded after a newer query or close; focused and real-browser regressions pass | Search-state gate closed locally; manual screen-reader acceptance is separately open below |
| P5-02-D01 utility screen-reader operation | Automated axe and keyboard checks pass, but no human screen-reader command/notification task has been recorded | **Blocks P5-02 accessibility acceptance and automatic P5-03 progression** under the approved P5-02 plan. Operator steps and evidence request are in [P5-02](p5-02/README.md) |
| P5-02-D01 utility screen-reader operation | Automated axe and keyboard checks and command/notification semantic regressions pass; spoken names and live/state announcements have not been manually verified | **Open mandatory P5-15 accessibility acceptance item**. It does not block independent P5-03 Jobs work under Connor's explicit scope clarification. Operator steps and evidence request are in [P5-02](p5-02/README.md) |
| P3-O02 workspace search replacement loses `followMode` | Source-confirmed `setParams({section})` | **Blocks later slice P5-08b** adapter migration until retained-query proof |
| P4-02-D03 mobile progress scroll not focusable | Open loaded axe finding | **Blocks P5-08a affected Overview migration**, not shell; targeted G-WORKSPACE proof |
| P4-02-D04 literal AI context `{name}` | Open both locales | **Blocks P5-08b affected application AI labels**; correct interpolation without changing context/API |
| P4-02-D02 company-save error outside accessible modal | Open; draft retained, transient toast hidden by modal isolation | **Does not block Phase 5 shell/navigation**. Company form/Phase 7 owner; direct company-form restructuring requires durable in-modal error. P5-00 toast position does not close this |
| P4-04-O02 concurrent SQLite notification save | Open, earlier 2/10 native attempts HTTP 500 / database locked | **Separate backend reliability**; no shell/visual blocker with unchanged calls, but any increased polling/write concurrency waits for proof. Sequential passing test does not close it |
| P2-O01 isolated rules-save 500 | Historical unconfirmed, cause not established | **Separate reliability triage** if recurrent; keep successful native oracle, no generic retry mask |
| P4-05-O01 English status actions/browser-locale dates | Open display debt; status values must stay stable | **Blocks P5-03 localized table acceptance**; display-only standard status/date formatting, preserve custom text/date meaning |
| P4-05-O01 English status actions/browser-locale dates | **Closed for Jobs/Trash in [P5-03](p5-03/README.md)**: standard status display uses existing translations, custom status text and raw API keys remain stable, and applied/deadline display follows UI language | P5-03 localized table gate met in English/Bokmål; stored date/time semantics are unchanged |
| P2-D01 native SQLite tailoring/capture | Open expected browser failure; archived-binary assertions unreached | **Blocks P5-08b and package/tailoring relationship changes**, future Documents; separate provider-compatible repair plus native archive proof. Does not gate independent shell/board/dashboard |
| F01 / audit D01 stale CV revision (related profile/job revisions distinct) | Open version increments without expected revision guard | **Blocks P5-09–14 broad CV**; separately authorized integrity work with cross-client proof. Profile/job persistence changes likewise gated, but their unchanged page links are safe. No automatic B07 |
| Creation-intent idempotency | Open independent contract; not B02 identity or stale revision | **Separate backend/product work**; no Add/import/POST-on-mount expansion in Phase 5. Existing create review/no-write navigation must remain |
+1 -1
View File
@@ -37,7 +37,7 @@ Supply-chain, model-evaluation harness and browser-extension local checks passed
The final production-browser run and a focused repeat passed four utility journeys: light/English and dark/English at 1440px; light/Bokmål and dark/Bokmål at 390px. They exercised search outage, keyboard command activation, unread/read/dismiss and captured both utility overlays. Scoped axe scans of the command error and notification panel had zero violations; their incomplete nodes are not counted as passes. Eight final-build captures are under `visual/`. Direct review confirmed the light desktop error alert remains readable and the dark Bokmål phone notification panel fits below the app bar without covering its own actions. Manual screen-reader operation, zoom/forced-colour behavior and provider outage timing remain explicit validation gaps.
**Acceptance status: conditional.** The [approved plan](../PHASE5_PLAN.md#p5-02--global-shell-utilities) requires a manual screen-reader command and notification task, or explicit blocking of accessibility acceptance pending operator proof. Automated axe and keyboard tests do not substitute for that task. A Windows operator should use Narrator/Edge or NVDA/Chrome on the committed build: open search with Ctrl+K, hear the dialog/search name and settled count, move between grouped actions with arrow/Home/End and Tab, activate a job/company result, close with Escape and confirm focus return; open the bell, hear loading/error/unread state, then read, dismiss and open an operation link. Repeat representative English/Bokmål and light/dark states. Record the spoken names/order, any silent state transition, and screenshot or short recording with credentials hidden. Until this passes, P5-02 is committed but **P5-03 progression is blocked** under the sequential gate.
**Acceptance status: conditional.** The [approved plan](../PHASE5_PLAN.md#p5-02--global-shell-utilities) requires a manual screen-reader command and notification task, or explicit blocking of accessibility acceptance pending operator proof. Automated axe and keyboard tests do not substitute for that task. A Windows operator should use Narrator/Edge or NVDA/Chrome on the committed build: open search with Ctrl+K, hear the dialog/search name and settled count, move between grouped actions with arrow/Home/End and Tab, activate a job/company result, close with Escape and confirm focus return; open the bell, hear loading/error/unread state, then read, dismiss and open an operation link. Repeat representative English/Bokmål and light/dark states. Record the spoken names/order, any silent state transition, and screenshot or short recording with credentials hidden. Connor subsequently clarified that this remains a mandatory P5-15 accessibility acceptance item but does not block independent P5-03 Jobs work; no manual screen-reader pass is claimed here.
## Remaining boundaries
+34
View File
@@ -0,0 +1,34 @@
# P5-03 — Jobs Table and mobile cards
Source: [approved Phase 5 plan](../PHASE5_PLAN.md#p5-03--jobs-table-and-mobile-cards). Checkpoint starts at `0f54007` and changes the shared `/jobs` and `/trash` renderer only. It does not start Board presentation or Table/Board integration.
## Scope and preservation
The existing `JobTable` remains the list, filter, sort, selection, bulk-action, paging, density and Trash owner. `SavedViewsMenu` retains account-scoped browser storage. The redesign gives the filter toolbar, selection bar, table and phone cards restrained semantic surfaces, borders and typography; desktop remains a table, phones remain cards. P4-05 Comfortable/Compact spacing remains local to the mounted view. All optional columns, status labels, row actions, listing links, workflow chips, 15/20/25 page sizes, native API mutations and route/query contracts remain available. The Add/import, Board and dedicated job workspace implementations are unchanged.
| Contracts | Retained behavior → P5-03 change | Automated evidence | Visual evidence |
|---|---|---|---|
| PRES-J05/J06, PRES-S03 | Filters/saved views, owner scope, sort/page/columns/density, selection and partial bulk retry, edit/status/delete/Trash restore → clearer existing controls without new data contract | `job-table-density.test.tsx`, `e2e/table-density.spec.ts`, backend Jobs authorization/controller tests | Four locale/theme Jobs captures in both densities and desktop/phone; selected, error and Trash states |
| PRES-W01/W02 | Job opening, workflow signals and explicit workspace Back → browser Back now restores the originating list row after the workspace unmounts | Real-App browser Back and explicit Back assertions; job workspace tests | Focused row/scroll captures |
| PRES-E07/E08/E09 | Shell navigation, EN/Bokmål, light/dark and owner-private saved views → existing shell remains; table labels and dates use UI language | Saved-view account switch, locale/status API-value regression, shell and session suites | Four theme/language combinations |
| PRES-J03/J04/J08–J10 | Existing capture and nearby navigation entry points → no workflow changes | Existing quick-capture, account, import and link tests | Shell destination visibility in Jobs captures |
Browser Back focus previously depended on the explicit workspace Back button passing `focusJobId`. Opening a row now stores only its numeric focus target on the *current list history entry* before navigation; on return the existing row-focus effect consumes that target after data loads. The latest opened row wins when a user re-enters a different job. The query, scroll target and ordinary browser history remain intact. This is navigation metadata only, never owner identity or job data.
P4-05-O01 is addressed at the display boundary: standard status names in filter, bulk/quick actions, toast and saved-view summaries use existing `pipeline.statusLabel`; API values remain raw keys and custom labels remain raw. Applied/deadline dates use the current EN/Bokmål UI locale; no stored timestamp or timezone conversion contract changed. Custom status deep links retain their raw filter value and an explicit dropdown option. Result-changing filter/sort/page transitions clear selection before old IDs can be bulk-mutated. A partial bulk outcome refreshes successful mutations and keeps only failed, still-visible IDs selected for retry.
## Validation and visual review
The inherited backend count **916→918** is accounted for by the two tests in commit `57a6bd0` (`Concurrent_rule_reads_share_the_single_created_settings_row` and `Concurrent_checklist_reads_share_the_single_default_item_set`), added before P5-01. The inherited P5-02 baseline is backend **918**, frontend **373**, browser **74 actual passes + unchanged P2-D01 expected failure**, rate-limit **9**, ingress **6**, PDF **1**, configuration **3**.
Final post-change results: backend **918/918**, frontend **377/377** (**+4** focused Jobs tests), and production-static Playwright **74 actual passes + unchanged P2-D01 expected failure** (75 reported passed, zero unexpected failures). Rate-limit **9/9**, ingress **6/6**, PDF admission **1/1**, configuration **3/3**. TypeScript (app and E2E), ESLint, frontend production build and API Release build passed. Supply-chain **3/3**, model eval **5/5**, browser-extension **3/3**, tracked secret scan and `git diff --check` passed. The first rate-limit invocation could not find the local .NET SDK; rerun with `DOTNET_ROOT=C:/Users/Connor/.dotnet` and `DOTNET_HOST_PATH=C:/Users/Connor/.dotnet/dotnet.exe` passed 9/9. No application code changed after the successful full rerun.
The browser fixture exercises the actual `/jobs` and `/trash` routes with 18 native owner-created jobs, a long Norwegian title, a custom status, all optional columns, a page boundary, both densities, status mutation, listing-link isolation, keyboard row opening, browser and explicit Back, soft delete/restore, loading, 503/Retry, 1440/1024/768 table and 390/320 card widths. It runs light/dark × English/Bokmål and checks 32px desktop/44px phone targets, overflow, semantic sort, visible scroll focus and scoped axe. Screenshots and manual review: pending final production-build run.
Manual review of the final rendered production build found the populated table and phone cards readable in light/dark and EN/Bokmål, with the original data density intact. The selected phone action bar now groups the five unchanged status mutations in one labelled menu instead of pushing the first job card far below the fold. The 320px Compact capture retains labelled actions and wraps long titles; desktop Compact retains all columns. The error capture keeps Retry visible. Keyboard focus on the quick-status action is visibly outlined; Browser Back restores the originating row after data reload. The browser fixture checks no page-level overflow at 1440/1024/768/390/320px and scoped axe in the tested states. The horizontally scrollable desktop table can show its far-edge actions only after horizontal scroll; this existing density/column trade-off was retained rather than dropping data. The occasional malformed Norwegian glyph in headless captures is the pre-existing screenshot-font limitation, not a changed stored value or DOM text.
Visual evidence: [light English desktop](visual/jobs-desktop-light-en.png), [light English phone](visual/jobs-phone-light-en.png), [light Bokmål desktop](visual/jobs-desktop-light-nb.png), [light Bokmål phone](visual/jobs-phone-light-nb.png), [dark English desktop](visual/jobs-desktop-dark-en.png), [dark English phone](visual/jobs-phone-dark-en.png), [dark Bokmål desktop](visual/jobs-desktop-dark-nb.png), [dark Bokmål phone](visual/jobs-phone-dark-nb.png), [desktop Compact](visual/desktop-compact-light-en.png), [320px Compact](visual/phone-320-compact-light-en.png), [error/retry](visual/list-error-light-en.png), [focused row action](visual/row-action-focus-light-en.png).
P5-00-D02 Browser Back focus and P4-05-O01 table display-localisation debt are closed for the tested Jobs/Trash boundary; Table/Board parity remains for P5-04b. Automated axe results are not manual screen-reader proof. P5-02-D01 remains an explicitly open command/notification spoken-name and live-announcement acceptance item for P5-15. P2-D01 remains an expected native-package browser failure, and F04 remains open pending production ingress evidence. SQLite contention, CV rendering fidelity and other separately owned debt are unchanged.
Rollback boundary: revert `JobTable` presentation/display/focus/selection changes and `SavedViewsMenu` status display together. There is no schema, API, provider or route migration.
Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB