Repository navigation
Conversation
confirmDialog focuses Cancel for destructive dialogs (or when a caller passes initialFocus: 'cancel'), names the dialog via aria-labelledby / aria-describedby, and cycles focus backwards on Shift+Tab. The native confirm() calls in navigation (unsaved settings guard) and bulk add to group, and the native prompt() in registration reject, now use the styled dialog. Refs #705, #731 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
Warning Review limit reached
This review includes 19 billable files and costs up to $4.75.
Reviews can continue after your included limit without a manual trigger. An admin must approve usage-based billing. Or wait 52 minutes for your next included review. View limit detailsLimit details: You’ve used the included review currently available. Your 86 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 (19)
Comment |
Tab now cycles every focusable in the dialog in DOM order, so the registration reject reason textarea is reachable. The textarea width moves from an inline style to a class. Refs #705 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
3781335 to
1895d71
Compare
…nter Destructive confirm dialogs now open with Cancel focused, so the specs that confirmed by pressing Enter (and asserted Confirm had focus) now click the action button and assert the safe-action focus. Refs #705 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Execute now, Run now and the RI exchange execute confirm now show a shared stat band (charged today, monthly, total over term) plus the commitment lines with account and region, focus Cancel first, and Run now ignores a second click while its dialog or request is open. The RI exchange confirm names source and target instance types instead of offering UUIDs and shows the hourly price change from the quote. Refs #707, #709, #701, #711 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The confirm shows the instance type first and the offering id next to it, so the exact target stays verifiable. Refs #709 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
1895d71 to
0857a56
Compare
Independent review (rv-ux-visual): PR #764 at
|
| Dialog | Base | Head |
|---|---|---|
| Execute now (direct) | "This will charge the full upfront amount immediately." | intro + band Charged today $8,400.00 / Monthly $0.00 / Total over term $8,400.00 + "3 × ec2 m5.large · 3 Years, All upfront · AWS Staging, eu-west-1"; focus Cancel; reflex Enter sends no POST |
| Run now, step with recs | "Run purchase now? This will immediately execute the purchase." | "Run step 2/5 of "Compute ladder" now?", scheduled date, $5,400.00, 4 × ec2 m5.large; focus Cancel |
| Run now, step without recs | same generic copy as above (implies a buy) | "This step has no recommendations attached, so running it will not buy anything." |
| Run now, two clicks on the row button | 2 stacked dialogs; confirming one leaves the second open | 1 dialog, exactly 1 POST …/pp-1/run |
- The band never overflows the dialog (
scrollWidth - clientWidth = 0at all widths). At 390 it wraps to 2 + 1. - Dialog axe: approval clean. Execute and Run now show only
color-contraston the red confirm button (pre-existing, fix(frontend): core color tokens fail WCAG AA contrast #696). - Pages: 11 pages x 3 widths pixel-diffed against base under the same mock. All are 0.00% except Admin Purchasing (0.2 to 0.7%, ±2px width). I reproduced that same delta by serving the same base build from a second server: the ladder timestamps are fixed at mock-server start. So it is an artifact of my harness, not this PR. Page axe results and horizontal-overflow numbers are otherwise identical, and there are no console errors.
Findings
- Medium: the approval dialog says nothing is charged, then shows "Charged today $8,400.00" (
frontend/src/app.tsapproval branch,withIntro(...)+commitmentSummary.tsstat('Charged today', …)).- Live text: "This emails an approval request to the configured approver. Nothing is charged until the approver clicks the link in that email." followed by Charged today $8,400.00.
- On the money path, two statements that contradict each other read as either a bug or a trap.
- Fix: let
buildCommitmentSummarytake the first stat's label (or amode: 'approval' | 'now'). Use "Upfront on approval" (or "Upfront") for the approval dialog, and keep "Charged today" for Execute now, Run now and the exchange. Add a jest case asserting the approval body does not contain "Charged today".
- Low: a partial-upfront Run now step shows two of three stats as "Not reported" / "Not available".
- Planned purchases carry no monthly field, so this is honest. But a 3-year partial-upfront commitment has a recurring fee, and the band's empty boxes do not say so.
- Fix: when
monthly === nulland the payment is not all-upfront, replace the two boxes with one line: "Plus monthly charges for 3 years (amount not available for planned purchases)". Or drop the empty stats and keep the line.
- Nit: the exchange monthly delta has no currency (source format in
buildExchangeConfirmBody:`${CurrencyCode} ${src} → ${tgt} (${sign}${abs}/hr, about ${sign}${abs*730}/month)`, so the code appears once, before the source price only). Prefix the delta with the code, or format both throughformatCurrencywhen the code is USD. - Nit: money here uses 2 decimals ($8,400.00) while the Opportunities and purchase modal behind it use 0 ($8,400). Fine to keep cents in a confirm, but it is the formatter split from audit M5 / fix(frontend): three money formatters, mixed placeholders, left-aligned money columns #739.
Out of scope, seen while testing: while the confirm is open, the purchase modal's own button behind it already reads "Sending...", because it is pre-disabled for #644 and reset on Cancel (audit UX-08 / #754).
Evidence (local, review host): /tmp/claude/ux-pr/shots-764/ (confirm-{approval,direct,runnow}-{base,head,head2}-{1280,768,390}.png, flows-*.json, axe-*.json, page shots and *-diff-*.png). Scripts: /tmp/claude/ux-run/{pr764-flows.js,pr764-dblclick.js,review-shoot.js,review-diff.js}.
…y fees The approval confirm shows "Upfront on approval" instead of "Charged today", since nothing is charged until the approver acts. A line that is not all upfront with no monthly figure says monthly fees apply. The exchange price change names its currency. Refs #707, #709 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…ange confirm Refs #709 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Independent review, round 2 (rv-ux-visual): PR #764 at
|
Refs #707 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Independent review, round 3 (rv-ux-visual): PR #764 at
|
What
Part 2 of the confirm-dialog series (stacked on #763; base is
fix/ux-confirm-dialogs, retarget to main once #763 merges).commitmentSummary.ts: shared stat band (Charged today / Monthly / Total over term) and commitment lines (count, service, type, term, payment, account, region).Total over term= upfront + monthly x 12 x years; shows "Not reported" / "Not available" instead of a fake$0when the provider has no monthly cost.app.ts): replaces the misleading "full upfront amount" sentence with the real numbers; focuses Cancel.plans.ts): title names the step and plan, body shows what is bought and the scheduled date, a step with no recommendations says nothing will be bought; a per-purchase in-flight guard prevents a second dialog or request from a second click.riexchange.ts): source and target instance types (from the loaded offerings or the suggested alternative) instead of offering UUIDs, quoted payment, hourly price change source -> target with an approximate monthly figure (730 h), Cancel focused.Not in this PR: the multi-account fan-out modal totals (#711 bulk
Total upfront $0), approver-side numbers, UX-08 button label. #711 and #701 are partly addressed (confirm dialogs only).Refs #707, #709, #701, #711.
Verification
tsc --noEmitclean, eslint clean on touched files, full jest 100 suites / 3161 passed (new: commitmentSummary totals/labels/truncation, Run now title+amount+double click, exchange confirm instance types and hourly delta)./tmp/claude/ux-fixes/shots/:execute-now-{main,pr1b}-{1280,768,390}.png,run-now-{main,pr1b}-{1280,768,390}.png.aria-dialog-name+color-contrast. After: focus on Cancel, "Charged today $8,400.00 / Monthly $0.00 / Total over term $8,400.00", axecolor-contrastonly.color-contrastis the token issue (fix(frontend): core color tokens fail WCAG AA contrast #696).confirmDialog), which still shows upfront only.🤖 Generated with Claude Code