Repository navigation
fix(ladder): timeline editor 409 reload, focus restore and canvas tab stop - #688
Conversation
… stop - After a 409 the editor now shows a "Reload and discard draft" action that closes the modal and reloads the timeline, so the stale expected_revision can be replaced; other errors do not offer it. - After a successful save or a reload, focus returns to the edited purchase button instead of falling to the body. - Remove tabindex from the chart canvas: it has role img, takes focus and does nothing; keyboard access is the purchase table. - Jest: three tests that fail on the previous code (409 reload and refocus, no reload on a 500, focus after save and no canvas tabindex). Refs #667
|
Warning Review limit reached
This review includes 3 billable files and costs up to $0.75.
Reviews can continue after your included limit without a manual trigger. An admin must approve usage-based billing. Or wait 43 minutes for your next included review. View limit detailsLimit details: You’ve used the included review currently available. Your 83 included PR review attempts over the past 7 days set your current allowance at 1 review per hour. Review configuration: ⚙️ Run configuration
📒 Files selected for processing (3)
Comment |
|
Independent review (ladder-graph-kimi, Claude Sonnet 5.5; full-diff pass by me, not a model-pinned Opus run) at head b1bdb53. Verdict: no actionable findings. Approve at this SHA, conditional on CI green (see limits). Checked:
Limits: Jest evidence is jsdom (mock-based). I did not run Playwright locally (disk hold, no build); at my last check Frontend E2E, Unit Tests and Lint were still pending. The gate needs CI green on this SHA; any new commit restarts it. |
…ion (#1357) The Chart.js instance behind the ladder planned-purchase timeline, with its ResizeObserver and listeners, was only destroyed when the timeline was re-initialized, so it stayed alive after the user navigated away from Settings > Purchasing. Visiting the General sub-tab also rebuilt it inside the hidden Purchasing panel, because loadGlobalSettings runs the ladder init for both sub-tabs. navigation.ts now calls disposeLadderTimeline() when switching to any top-level tab other than Settings and to any settings sub-tab other than Purchasing. Dispose destroys the chart and drops in-flight loads. initLadderTimeline skips building while its section is hidden, and the existing loadGlobalSettings call re-initializes the timeline when the Purchasing sub-tab is shown again. The other items in the issue (409 reload, focus restore after save, no tab stop on the canvas) were shipped in #688. Refs #667 Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…g loading skeletons busy (#1370) Low-severity accessibility items from the 2026-10-08 review: - UX-27: Escape in the RI Exchange column-filter popovers (Active RIs and Reshape) closed them and dropped focus to <body>. They now return focus to the column's filter button, as the History popover already does. - UX-31: with the chip-select search input showing, aria-activedescendant stayed on the unfocused trigger, so screen readers never announced the highlighted option; it now lives on whichever element holds focus (the search input, which also gets aria-controls). Picking an option from the search input hid the focused element and dropped focus to <body>; focus now returns to the chip. - UX-34: skeleton containers now carry aria-busy="true" while a skeleton shows. Success renders replace the children without calling back into lib/skeleton.ts, so a MutationObserver clears the flag once no placeholder is left; teardownSkeleton clears it directly. The ladder canvas tab stop was already removed by #688. - UX-36: #topbar-filters gets role="group" so its aria-label is exposed. The small-target links reported on Admin General could not be reproduced on this base and are left out. Refs #729 Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Summary
Part of #667 (follow-ups from PR #665), the editor and focus items:
expected_revision. Other errors do not show it; the draft-retained message is unchanged.[data-event=<id>]) instead of falling tobody.tabindex="0"(it isrole="img"); keyboard access stays on the purchase table.Not in this PR
Disposing the Chart.js instance and listeners when the user navigates away. Tabs are hidden, not unmounted, and
switchTabhas no teardown hook for the settings section, so doing it properly means adding one innavigation.tsand re-init on return. That is a separate concern; #667 stays open for it (comment to follow on the issue).What is verified
Run locally (macOS): Jest
src/__tests__/ladder*30/30,tsc --noEmitand eslint on the changed files exit 0. The three new Jest tests (409 reload and refocus, no reload on a 500, focus after save plus no canvas tabindex) fail on the previous code (stash check) and pass now.What is not proven
ladder-timeline.spec.tswas not run locally (disk hold, needs a production build); CI's Frontend E2E covers it. The spec's canvas click probe and the "draft is retained" text assertion are unaffected by these changes on reading, not by a run.Refs #667