feat(ui): migrate company relationships and save recovery

This commit is contained in:
cesnimda
2026-10-13 08:59:02 +02:00
parent 34a4d6dc6b
commit a8aba85299
14 changed files with 5717 additions and 62 deletions
+20 -2
View File
@@ -1,6 +1,6 @@
# P7-05 — Discovery, Companies, Offers and Reminders
**Discovery implemented scope CONDITIONAL GO; hygiene PASS/normal push pending. Companies, Offers and Reminders remain pending.** Follow the exact [approved handoff](../../phase-6/p6-05/PHASE7_HANDOFF.md#migration-order-and-commit-boundaries): Discovery, Companies, Offers, then Reminders as four separate normal development commits.
**Discovery implemented scope CONDITIONAL GO; hygiene PASS/normal push34a4d6d verified. Companies, Offers and Reminders remain pending.** Follow the exact [approved handoff](../../phase-6/p6-05/PHASE7_HANDOFF.md#migration-order-and-commit-boundaries): Discovery, Companies, Offers, then Reminders as four separate normal development commits.
[Entry evidence](evidence/entry.json) records the actual bfa0ab6 public push, clean direct development equality/main unchanged and13 exact committed source baselines. P7-04 implemented scope is CONDITIONAL GO: affected38/3/public native8/fidelity16/36+8/24/types/lint/build/static checks pass;18 public PNGs actually inspected. Sandbox frame-tested12 and separate settings incompletes223 remain. Whole frontend573/89/backend1,033/sidecar49 are inherited; frontend673/93/browser249/backend1,034 are derived expectations, not integrated reruns.
@@ -15,7 +15,7 @@ PRES-J01/J02/J08/J09/W11 and all57 groups remain binding;32 routes stay. No stan
## Discovery implemented result
**Discovery implemented scope CONDITIONAL GO; hygiene PASS/normal push pending. Companies, Offers and Reminders remain pending.** [Finite results](evidence/discovery-results.json) retain exact final source/build/raw outcomes and failed attempts. Fresh affected **21/1**, new ordinary browser **8**, existing ordinary browser **4**, backend **14**, app/browser TypeScript, lint and production build pass. The original12 unit cases remain; +9/0 gives **682/93 frontend derived only**. Browser+8 gives **257 derived only**; no fresh integrated totals until P7-12.
**Discovery implemented scope CONDITIONAL GO; hygiene PASS/normal push34a4d6d verified. Companies, Offers and Reminders remain pending.** [Finite results](evidence/discovery-results.json) retain exact final source/build/raw outcomes and failed attempts. Fresh affected **21/1**, new ordinary browser **8**, existing ordinary browser **4**, backend **14**, app/browser TypeScript, lint and production build pass. The original12 unit cases remain; +9/0 gives **682/93 frontend derived only**. Browser+8 gives **257 derived only**; no fresh integrated totals until P7-12.
Shell retains its H1 and intro. Saved searches use the established section title/tokens; results use a shared H2, feedback and named focusable region. Job cards are named articles with H3 headings and wrapping actions. Manual search clears saved context; switching saved sources clears old rows before the pending response. One synchronous operation guard prevents duplicate requests and locks the three draft fields and dependent mutations. Read Retry uses the exact submitted GET or bodyless saved-ID POST while preserving both later unsaved filter drafts. Mutation failures preserve their drafts/current rows and require the original action, without an unrelated manual-search Retry. Semantic fallback keys retranslate without refetching.
@@ -26,3 +26,21 @@ All **18 new final PNGs were displayed and reviewed**;13 existing-regression cap
Real owner SQLite list/create/toggle/delete and reload, crafted foreign/anonymous denial, saved-list failure recovery and provider-double runner/history/dismiss tests pass. Browser vacancy search/run are explicit fixtures and never call NAV; real missing-result Dismiss404 and two intercepted204 UI recovery paths are distinguished. Stored native counts remain unchanged for those UI-only204 responses; successful provider/history/dismiss persistence or alert delivery is not claimed from browser fixtures.
Meaningful initial unit RED11/10, peer Retry RED20/1, first native3/5 and focus RED6/2 are frozen. Exact fixture corrections account for legitimate UpdatedAt order and MUI label-plus-value accessible naming; timeout remains unchanged. Final21/1 and8+4 pass with no skipped/expected-failure/retry/relaxed assertions. All57 whole-group statuses remain56 PARTIAL/C11 DEFERRED and32 routes retained. Main stays27657f3/production NO-GO; model review remains withheld and Phase8 separate.
## Companies implemented result
**Companies implemented scope CONDITIONAL GO; hygiene PASS/normal push pending. Offers and Reminders remain pending.** [Companies entry](evidence/companies-entry.json) verifies the preceding Discovery push34a4d6d and six committed baselines. [Finite results](evidence/companies-results.json) retain exact source/export, failures, contextual triage and all raw outcomes. Fresh affected **30/4**, new ordinary browser **6**, existing company recovery **2**, named-controls **4**, backend **2**, app/browser TypeScript, lint and production build pass. +7 cases/0 suites gives **689/93 frontend derived only**; browser+6 gives **263 derived only**. Latest whole frontend573/89/backend1,033/sidecar49 remain inherited; P7-12 integrated acceptance is pending.
Shared tokens and semantic mobile articles/headings replace one-off surfaces. Desktop uses a named keyboard-scrollable table with row headers and predictable source/pipeline/date/action columns; its840px canvas scrolls within the container without app-chrome overflow. Existing nine-field PUT, trim/null/date/source semantics, existing routes and arbitrary company pipeline text stay intact. Canonical related application statuses use existing localisation. Loaded relationship title prefers fresh response metadata; selected name remains available during loading.
A synchronous save guard locks all nine draft fields and Cancel/Escape while one submitted snapshot is pending. Save error keeps the editable draft and recovers through the original Save. Named pending feedback receives focus before disabling fields; an idle empty save notice is omitted to preserve the established live-status contract. Relationship reads use selected identity and request generation; late A success/error and closed reads cannot replace B. Explicit Retry reads B without list reload; permission denial does not offer Retry. Locale changes translate fallback errors/status without fetching Companies again. Edit deep-link replacement removes onlyedit and preserves remaining query/hash/router state and Back.
Native reproduced BODY focus after dialog exit, including removal of the old invoking action across767/768. A local React effect runs after MUI removes its exiting modal and restores the current company's action only if focus is still body. MUI's valid focus return and deliberately moved focus are retained. Native evidence covers deep-link767→768 and manually opened768→767 drafts, normal relationship Close,320px Edit keyboard wrapping,1024px landscape relationship scrolling/trap, held Save and Retry focus. No shared modal framework change.
All **20 latest new PNGs were actually displayed and reviewed**;30 existing-regression captures are retained without a claimed review. Eight balanced320/360/390/767/768/1024 landscape/1440/1920 EN/Bokmål/light/dark long-record samples have root overflow0. Table/dialog scrolling is recorded separately. Earlier reviewed long-record images exposed split Source/date/header text; bounded column corrections were rebuilt and these latest images reviewed. New20 all-enabled scans retain **0 violations/91 incompletes**:20 invisible-zero badge,51 overlapping contrast,9 partial occlusion and11 open-modal focus. Existing named20 WCAG-tagged scans retain **0/163**:8 badge,124 overlap,15 partial,4 modal,8 disabled Undo/Redo wrapper labels and4 aria-labelledby shadow IDs. Old company recovery has no axe scan. Complete contexts remain; uncomputed ratio0 is not measured contrast and keyboard proof does not establish human reader/browse-mode acceptance. Sticky-shell landscape painting, full reflow/zoom, physical touch/software keyboard, fonts/photos and M01–M12 remain qualified.
Real isolated SQLite save/reload, source normalization, latest20 active contacts excluding deleted jobs, relationship projection, exact owner/foreign/anonymous denials and linked Job navigation pass. Two unchanged-binary backend Facts pass; broader filter names do not imply broader matched coverage. Readback comparisons preserve all calendar seconds despite SQLite Kind/Z formatting differences and do not claim UTC/DST qualification. Server details/free text and existing cached useCompanies consumers remain untouched. API fixture creation is distinguished from an absent standalone creation screen.
Baseline6/2, corrected RED6/7, expanded RED26/4, raw-stage/title RED11/1 and native4/2 plus focused0/1 are frozen. No skipped/expected-failure/retried tests, relaxed original assertions or disabled axe rules. All57 statuses remain56 PARTIAL/C11 DEFERRED;32 routes. Main stays27657f3/production NO-GO, P5-13 withheld and Phase8 separate.
[Final finite hygiene](evidence/companies-static-checks.json) passed four raw commands at2026-10-13 06:58:01–05UTC,12documents/425links0errors,57groups/32routes; final staged whitespace is checked after staging. Existing named-controls12 dialog scans assert all WCAG-tagged violations,8 full-page scans gate five historical rule IDs; all retained raw scanned violations are independently0. These scopes do not replace the new20 all-enabled Companies scans. Normal push receipt follows observation in the next slice.