Skip to content

[PROD RELEASE] - May fixes & updates#1891

Merged
kkartunov merged 93 commits into
masterfrom
dev
May 28, 2026
Merged

[PROD RELEASE] - May fixes & updates#1891
kkartunov merged 93 commits into
masterfrom
dev

Conversation

@kkartunov
Copy link
Copy Markdown
Collaborator

Related JIRA Ticket:

https://topcoder.atlassian.net/browse/

What's in this PR?

kkartunov and others added 30 commits May 18, 2026 13:33
PM- 5030 Fix task description in wallet admin UI
Updates for history display on profiles page
What was broken
Marathon matches and development challenges were always treated as rated from the work app because the challenge editor did not expose an opt-out control.

Root cause (if identifiable)
Member API already honors challenge metadata named isRated with value false, but platform-ui never let users set or clear that metadata during challenge setup.

What was changed
Added a Rate this challenge checkbox in Advanced Options for marathon match and development challenge forms. The checkbox defaults to checked, writes metadata isRated=false when unchecked, and removes that metadata when checked again so rated remains the default.

Any added/updated tests
Added RateChallengeField tests covering the default checked state, writing isRated=false when unchecked, and removing the metadata when rechecked.
What was broken
The Topgear submission reprocess icon in the review app sent the reprocess request immediately when clicked.

Root cause
The click handler directly called the Topgear reprocess service without a confirmation step.

What was changed
Added a confirmation dialog that asks whether to reprocess the selected Topgear submission, with Yes continuing the reprocess request and No closing the dialog.

Any added/updated tests
Added a focused TabContentSubmissions component test covering that the dialog opens, No does not reprocess, and Yes calls the reprocess service.
PM-5105: Add rated challenge toggle
PM-5104: Add TG reprocess confirmation
What was broken
The Work app submissions table could show an older raw Marathon Match score while community-app showed the updated relative provisional score.

Root cause
The Work app score helper returned the first matching Review API summation, and legacy nested scores were preferred before summations, so later relative-score rewrites could be ignored.

What was changed
Marathon provisional and system score helpers now pick the latest valid matching review summation by timestamp and use legacy nested scores only as a fallback.

Any added/updated tests
Added regression coverage for provisional and system scores where a later relative summation must override a stale raw score.
What was broken
Marathon Match review rows displayed scorecard-derived review scores, so submitters could see 0.00 and a Fail result after winners were announced even when review summations had the final aggregate score.

Root cause
The review app's shared review table helpers preferred per-review scorecard averages over submission aggregate scores, and the score cell always linked through the scorecard path. Marathon Match system reviews do not have a scorecard to open.

What was changed
Added Marathon Match challenge detection in the review app and routed review tables to prefer review summation aggregate scores for Marathon Match submissions. The Review Score and Score cells now display the aggregate score as plain text for Marathon Match rows, and pass/fail resolution can use the aggregate score before scorecard averages.

Any added/updated tests
Added tests for Marathon Match challenge detection, aggregate-score pass/fail resolution, and aggregate score rendering without a scorecard link.
PM-5113: Use marathon aggregate review scores
PM-5112: show latest relative marathon scores
…ayment-cycles

PM-4669 engagements payment cycles
jmgasper and others added 25 commits May 26, 2026 11:19
What was broken
Challenge prize amount inputs could lose focus after a digit was entered, interrupting continuous typing in the Work Manager challenge editor.

Root cause
Prize row updates are driven through React Hook Form as nested prize values change. The active placement-prize input was not tracked or restored when those controlled updates re-rendered the row.

What was changed
Track the active placement-prize row in ChallengePrizesField and allow PrizeInput to restore focus and caret position for that active row after value updates. Updated the challenge editor documentation for the focus-preservation behavior.

Any added/updated tests
Updated the ChallengePrizesField test to exercise the real PrizeInput and added coverage for continuously typing multiple digits into an empty prize input.
PM-5116: Preserve challenge prize input focus
What was broken
The Work app could become unresponsive after closing the public review opportunity and adjusting the reviewer count, because that count directly controlled how many member assignment selectors were rendered.

Root cause (if identifiable)
Manual reviewer count input only stripped non-digits and had no upper bound. Large values could flow into the form state and force the human review tab to render an unbounded number of controlled autocomplete fields.

What was changed
Added a shared maximum manual reviewer count, clamped the Work human-review count input and rendered assignment slots to that limit, added min/max support to the shared text field, and applied the same limit in reviewer validation, reviewer cost, summary, and launch validation paths.

Any added/updated tests
Added HumanReviewTab coverage for capped closed-opportunity assignment fields and schema coverage for rejecting counts above the manual reviewer limit.
What was broken
Project invitation email links can open /projects/:projectId/invitation/accepted or /projects/:projectId/invitation/refused, but the work app only routed the plural invitations path and older accept/decline links with invite IDs. Those email links landed on an empty partially loaded page and never updated the invite.

Root cause
The work app route table did not include the legacy singular invitation URL shape emitted by the email flow.

What was changed
Added the singular /projects/:projectId/invitation/:action? route to the work app and routed it to the existing ProjectInvitationsPage flow so it can resolve the current user's pending invite and update its status.

Any added/updated tests
Added a ProjectInvitationsPage spec covering the refused email route with source=email and verifying the current user's pending invite is updated to refused.
What was broken
TM/PM users could see pending budget approval challenges for projects where their project membership was copilot-only.

Root cause
BudgetApprovalsPage treated both manager and copilot project memberships as full-write access when scoping non-admin budget approval queries.

What was changed
Non-admin budget approval project scoping now includes only manager project memberships. Copilot and customer/write memberships are excluded from project options and challenge query projectIds.

Any added/updated tests
Added BudgetApprovalsPage coverage for a project manager with manager, copilot, and customer memberships to verify only the manager project is queried.
PM-5048: Support project invitation email routes
PM-5121: Cap manual reviewer count
PM-5103: Restrict budget approvals to full-access projects
What was broken
The review table rendered the current reviewer action only on the first reviewer row for a submission. When a copilot reviewer was the second reviewer, Complete Review appeared beside the other reviewer.

Root cause
The actions cell looked up the current user's review across the whole submission while the table only rendered actions for the first flattened reviewer row.

What was changed
Reviewer-owned actions now resolve against the flattened row's reviewer index, so Complete Review, Review Complete, and Reopen Review render on the row for the matching reviewer resource. Submission-level actions still render only on the first row to avoid duplicates.

Any added/updated tests
Added regression coverage for a two-reviewer row set where the current reviewer is not first, ensuring only that reviewer row is action-eligible.
What was broken
Project edit passed a project id into the billing-account selector, which made typed searches filter only the project-scoped billing-account list. Billing accounts created in system admin and granted to the user could be selected during project creation, but disappeared from edit search after the project billing account was cleared.

Root cause
Create and edit were using different billing-account sources. Create searched the Billing Accounts API by user id, while edit searched only the legacy project-scoped list when a project id was present.

What was changed
Updated the billing-account autocomplete so a user-scoped selector preloads and searches the Billing Accounts API, including edit flows. The project-scoped list remains as a fallback when no user id is available.

Any added/updated tests
Updated the autocomplete spec to verify edit mode with both project id and user id searches the user-scoped Billing Accounts API and returns matching billing accounts.
PM-4836: Place review action on reviewer row
PM-5027: Search user billing accounts in project edit
What was broken
The prior PM-5121 fix capped large reviewer counts, but the Work app could still freeze after the public review opportunity was closed and the Reviewer Count native stepper was decremented.

Root cause (if identifiable)
Closed-opportunity member selectors can leave blank additionalMemberIds slots registered in react-hook-form. When the count dropped, the trimming effect wrote those blank slots back during validation instead of unregistering them, allowing the form watcher to re-enter the same cleanup path.

What was changed
Unregistered additional member fields that are no longer visible when reviewer count shrinks, and only write/delete additional members when an actual assigned member value is being removed or preserved.

Any added/updated tests
Added HumanReviewTab coverage for decreasing reviewer count with a blank extra assignment slot and asserting no reviewer resource deletion is attempted.
PM-5121: Stop reviewer count stepper loop
What was broken

After closing the public review opportunity, clicking the Reviewer Count down stepper could leave a hidden blank additional member slot in form state and the Work app could become unresponsive.

Root cause (if identifiable)

The prior follow-up unregistered hidden blank additional member fields but returned before clearing the parent additionalMemberIds value. React Hook Form could keep the stale blank array value watched by the reviewer cleanup effect, allowing that cleanup path to run repeatedly.

What was changed

The reviewer-count shrink cleanup now always writes the trimmed additionalMemberIds value back to the form so hidden blank slots are removed from state. Resource deletion remains gated to cases where an actual assigned member id was removed.

Any added/updated tests

Updated the HumanReviewTab regression to follow QA's public-opportunity toggle path, decrease the reviewer count, assert the hidden blank slot is cleared from form state, and confirm no reviewer resource deletion is attempted for blank slots.
PM-5121: Clear hidden reviewer slots
@kkartunov kkartunov requested a review from jmgasper as a code owner May 28, 2026 06:01
@kkartunov kkartunov requested a review from Copilot May 28, 2026 06:04
@kkartunov kkartunov merged commit d6b0d18 into master May 28, 2026
8 of 10 checks passed
@kkartunov kkartunov review requested due to automatic review settings May 28, 2026 06:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants