Repository navigation
fix(frontend): thirteen small UI, validation and a11y fixes - #1132
Conversation
The server refuses non-future dates; mirror the check inline so the error shows before the round trip. Closes #50 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A stored max_amount of 0 rendered blank (|| vs ??), and the form saved 0, negative or unparsable amounts without the cap. Show the stored value and refuse anything not greater than 0 on save; blank stays no limit (owner decision 2026-10-16). Closes #133 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Skip the (account_id) suffix when the account name already contains the id. Closes #179 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The glyph-only run, pause, resume, edit and cancel buttons only had a title; add matching aria-labels. The RI Exchange settings button already has visible text. Closes #184 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The signed-in email was a span with a click listener, unreachable by keyboard or screen reader. Use a button reset to the same look; the placeholder aria-label is dropped once the email is shown so the name matches the visible text. Closes #715 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
init() now marks the sidebar item for the current path active before awaiting the user and permission fetches, instead of leaving the static Home highlight until switchTab ran. Extract setActiveNav from switchTab for this. Closes #187 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
openDrawer picked the desktop-only sidebar toggle, which is display:none below the breakpoint, so focus stayed on the hamburger. Skip the toggle so the first nav link takes focus. Closes #216 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
apiRequest swallowed every JSON parse failure as null, so a truncated or proxy-mangled 200 looked like no data. Return null only for 204 or content-length 0 and let other parse errors reject. The backend emits no 204s and returns JSON bodies, so no caller depended on the old fallback. Closes #273 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…lete Use allSettled so successful deletions are deselected and the list reloads in every case; the error toast names the users that survived. Closes #275 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
paymentOptionsFor listed monthly for AWS because the AWS branch fell through to true. Add an allow-list matching config.ValidPaymentOptionsByProvider (all-upfront, partial-upfront, no-upfront). Closes #277 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A null summary is a fulfilled result, so the non-null assertions led to a TypeError banner. Throw a named error instead and drop the assertions. Chose the explicit error over placeholder tiles since the tiles all derive from the summary. Closes #280 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…dations The per-service chart tooltip returned an empty string when a service had no recommendation stats, before reaching the Current / Committed branch. Check that dataset first. Closes #752 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The server parses start_date as midnight UTC and requires it after now, so tomorrow (UTC) is the first accepted day. Compare against the UTC day instead of the local day and say so in the message. Refs #50 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The drawer's account-action delegate closed the drawer after the profile button had opened the modal, pulling focus to the hamburger and inerting the modal's return-focus trigger. Close the drawer in the capture phase for the profile button only, so the modal records the hamburger as its trigger and keeps focus. Also hide the profile button until a user is set, since before login it was focusable and did nothing. Refs #715 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Reusing the stored-value refusal told admins to repair the API or database for something they typed. Validate Max Amount separately and say how to fix the field. Refs #133 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Set the picker min to tomorrow UTC like the submit check, and run jest in America/New_York via globalSetup so a local-date implementation fails the UTC tests even on a UTC CI runner. Drops the obsolete local-day picker tests. Refs #50 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…oard apiRequest no longer returns null for unparseable 2xx bodies; say what it does now. Refs #273 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The backend accepts only monthly for GCP and rewrites other tokens to it, but the UI also offered all-upfront and upfront. The fan-out bucket dropdown and the purchase modal both read paymentOptionsFor and isPaymentSupported, so they follow. Closes #1131 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Warning Review limit reached
This review includes 28 billable files and costs up to $7.00.
Reviews can continue after your included limit without a manual trigger. An admin must approve usage-based billing. Or wait 48 minutes for your next included review. View limit details
Comment |
Refs #216 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A number input reports unparsable text as value "" with validity.badInput, so it read as blank and saved with no cap. Treat badInput as the existing field error and test with a real type=number control. Refs #133 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The bulk gate checked every bucket against the all-upfront toolbar default, which GCP no longer supports, so a lone monthly GCP rec was sent to the fan-out modal and lost Execute Now. Also accept the rec own supported payment, which the single-bucket modal already seeds from. Refs #1131 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Merge gate at
|
Summary
Thirteen small frontend fixes, one commit per issue plus review follow-ups.
Closes #50
Closes #133
Closes #179
Closes #184
Closes #715
Closes #187
Closes #216
Closes #273
Closes #275
Closes #277
Closes #280
Closes #752
Closes #1131
apiRequestreturns null only for 204 or an empty body; other 2xx parse failures rejectallSettled, reloads and deselects in every case, and names the users that survivedmonthlyas a payment optionmonthly, matchingconfig.ValidPaymentOptionsByProviderJest now runs with
TZ=America/New_Yorkthrough aglobalSetup, so a local-date implementation of the UTC start-date rule fails even on a UTC CI runner.Verification evidence (independent reviews, local build and tests at the head SHA) is posted as PR comments.
🤖 Generated with Claude Code