Skip to content

September 2026 release 3 - #2397

Merged
jmgasper merged 139 commits into
masterfrom
dev
Sep 24, 2026
Merged

jmgasper merged 139 commits into
masterfrom
dev

Conversation

@jmgasper

Copy link
Copy Markdown
Collaborator

https://topcoder.atlassian.net/browse/PM-6392
https://topcoder.atlassian.net/browse/PM-6311
https://topcoder.atlassian.net/browse/PM-6335
https://topcoder.atlassian.net/browse/PM-6369
https://topcoder.atlassian.net/browse/PM-6316
https://topcoder.atlassian.net/browse/PM-6340
https://topcoder.atlassian.net/browse/PM-6335
https://topcoder.atlassian.net/browse/PM-6328
https://topcoder.atlassian.net/browse/PM-6325
https://topcoder.atlassian.net/browse/PM-6336
https://topcoder.atlassian.net/browse/PM-6337
https://topcoder.atlassian.net/browse/PM-6338
https://topcoder.atlassian.net/browse/PM-6339
https://topcoder.atlassian.net/browse/PM-6342
https://topcoder.atlassian.net/browse/PM-6345
https://topcoder.atlassian.net/browse/PM-6351
https://topcoder.atlassian.net/browse/PM-6352
https://topcoder.atlassian.net/browse/PM-6374
https://topcoder.atlassian.net/browse/PM-6375
https://topcoder.atlassian.net/browse/PM-6382
https://topcoder.atlassian.net/browse/PM-6383
https://topcoder.atlassian.net/browse/PM-6384
https://topcoder.atlassian.net/browse/PM-6385
https://topcoder.atlassian.net/browse/PM-6386
https://topcoder.atlassian.net/browse/PM-6387
https://topcoder.atlassian.net/browse/PM-6388
https://topcoder.atlassian.net/browse/PM-6389
https://topcoder.atlassian.net/browse/PM-6390
https://topcoder.atlassian.net/browse/PM-6391
https://topcoder.atlassian.net/browse/PM-6325
https://topcoder.atlassian.net/browse/PS-616
https://topcoder.atlassian.net/browse/PM-6402
https://topcoder.atlassian.net/browse/PM-6406
https://topcoder.atlassian.net/browse/PM-6403
https://topcoder.atlassian.net/browse/PM-6407
https://topcoder.atlassian.net/browse/PM-6401
https://topcoder.atlassian.net/browse/PM-6405
https://topcoder.atlassian.net/browse/PM-6408
https://topcoder.atlassian.net/browse/PM-6400

jmgasper and others added 30 commits September 1, 2026 10:02
topgear.topcoder-dev.com still resolves to community-app, which redirects the
TopGear subdomain to wipro.topcoder-dev.com and shows that community's
access-denied page instead of the challenge list. Platform UI now owns the
TopGear community on the `topgear` host:

- add the `topgear` AppSubdomain and a `TOPGEAR.GROUP_ID` config defaulting
  to community-app's TopGear group (`REACT_APP_TOPGEAR_GROUP_ID`)
- redirect the host root to `/opportunities`; the legacy `/challenges`
  aliases keep redirecting as before
- render community-app's TopGear challenge-listing banner in place of the
  "Find your next opportunity" masthead, the four category cells, and the
  public summary request
- offer competitions only: other `/opportunities/:kind` categories redirect
  to the listing, and Browse Competitions with its filters, sorting, and
  pagination is unchanged
- send the TopGear group through the Challenge API `groups[]` parameter so
  the listing matches community-app's group-restricted community

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Opportunities: serve the TopGear community from the topgear host
Table: show ten columns in the PM-6392 order (Stage, Opportunity Name, Account
Name, Subcontracting End Customer, Reporting SMU, Amount, Expected Revenue,
Created Date, Close Date, Opportunity Owner) and drop Reporting Account, Close
Month, Expected Revenue (Converted), Amount (Converted) and Forecast Alert.
Selection and ordering are a display concern, so the API response and the WIN
contract are untouched, a column the report adds later is kept behind the
ordered ones, and each column keeps the cell index it has in row.cells.
Numeric cells are right-aligned and non-wrapping, dates non-wrapping, and
padding and type sizes are tightened so the table fits a laptop width.

Summary: four fixed cards below the title — Total Opportunities, Total Amount,
Total Expected Revenue and Total WON SOW Signed — reading the snapshot-wide
summary, with an em dash for a column the report does not provide.

Stage breakdown: a compact grid of clickable tiles, one per stage, each showing
its count, Amount and Expected Revenue, ordered down the pipeline. A tile
drills the table into that stage via the new Reports API drilldown, which
leaves the summary intact so the breakdown does not collapse to the selected
stage; the tile is highlighted and aria-pressed, and clicking it again or
Clear stage releases it.

Layout: the stage breakdown and the date range filter now share a two-column
row beneath the cards, stacking below 1100px.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
QA verified the desktop scrollbar was gone but asked for more room between
the Submission ID and Submission Date values, which ran together when a
submission id and month name were both long.

Rebalance the Marathon My Submissions fixed-layout column widths toward those
two columns and raise the cell padding from 8px to 12px. The total column
budget stays at 1040px, so the scroll-free threshold proven in the original
PM-6311 fix is unchanged.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The engagements Status facet offered "Open for application" and "Completed".
The Aug 2026 Opportunities design asks for "Open for application" and
"My engagements" instead, covering the member's open, in-progress, and
completed engagements in one list.

Swap the second engagements status option, drop the now-duplicated ownership
checkbox for that domain only, and translate the new option into an
ownership-scoped, status-unrestricted query so no lifecycle stage is hidden.
Anonymous visitors never see the option.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Opening a topic from the challenge Forum tab swaps the panel contents without
changing the route, so the browser kept the previous scroll offset and a member
who opened a topic from far down the list landed past the end of the
discussion.

Reset the vertical scroll when a topic is opened, when one is created, and when
the member returns to the topic list.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Editing a saved private engagement could not add or replace a member. Picking a
member opens the Assign Member dialog, but the editor's autosave (and any SWR
revalidation of the engagement) calls reset() with the API's view of the
engagement. The API cannot report a member whose assignment details are still
being entered, so the reset cleared the handle underneath the open dialog - the
dialog's Member line changed to "-", its Save wrote an empty member handle, the
row fell back to "No details added", and the final save dropped the member.

Suspend autosave and defer engagement-driven resets while the Assign Member
dialog is open, applying the deferred reset only when the incoming engagement,
lead prefill, or project actually changed so unrelated edits survive. Also
merge any not-yet-persisted assignment slot back in on every reset.

No engagements-api-v6 change is needed: the update endpoint already creates the
assignment and sends the offer email once assignmentDetails names the member.

Also add the missing ~/config mock that kept EngagementPrivateSection.spec.tsx
from running.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
PM-6392 Sales dashboard redesign: compact table, summary cards and stage filtering
The checkpoint tabs were the only submitter-facing tabs deciding "is this row
mine?" from the challenge resource list rather than the signed-in member id,
which every other tab uses. Match the rest of the app and add the signed-in
member id, so an unresolved or incomplete resource list cannot empty the
Checkpoint Submission, Checkpoint Screening, and Checkpoint Review tabs.

Also add the two role flags and the screening-result callback that were missing
from the filter memo dependency lists, which could leave a stale filtered list
after roles resolve.

The underlying PM-6340 defect is in review-api-v6; this is hardening.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
PM-6316: Allow adding/replacing members on a saved private engagement
PM-6311: More spacing between MM Submission ID and Submission Date
The ticket asks for "My engagements" to carry Applied and Accepted tags. The
accepted state already rendered as an accepted-styled pill, but its label read
"Selected" while My Work called the same state "Accepted".

Map accepted, approved, and selected to "Accepted" so the browse cards, the
design, and My Work agree. The pill styling is unchanged: the normalized state
key is already in the accepted group, so it keeps the green treatment and check
icon. Assignment bucketing is unaffected because it keys off the raw status
rather than the label.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
PM-6369: Reset the scroll position when a forum post is opened
PM-6335: Engagements list filter shows Open for application and My engagements
PM-6340: Harden the review app checkpoint tabs for submitters
Resolve conflicts in package.json and yarn.lock:
- package.json: keep the Storybook 8.6.18 upgrade from this branch while
  dropping @sprig-technologies/sprig-browser, which dev removed.
- yarn.lock: rebased onto dev's lockfile and regenerated with yarn so the
  security pins (@topcoder-platform/tc-auth-lib,
  @topcoder-platform/remark-gfm-v4, postcss/nanoid 3.3.18, Storybook 8)
  apply on top of dev's new dependencies.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
fix: remediate September 2026 security findings
Request Copilot is needed during the initial phase of a project, before a
Salesforce opportunity or billing account exists, so the project challenges
page no longer hides it when the project has no billing account. The action
stays gated on the admin/manager role and on the project not being cancelled
or completed.

Adds a "View Request" action beside it that opens a modal listing the copilot
opportunities created for the project, each linking to its Copilots app
details page. The list is read from GET /projects/copilots/opportunities
filtered by projectId, which already supports that filter, so no API change
is needed.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
PM-6328 Request Copilot & View Request from Work App
Key Win was rendered inside the grey summary grid at the top of the
showcase preview and the published showcase page. Move it out of that
grid and render it as a body section after Business Impact Realised, so
it reads like the rest of the story content.

Key Win is a plain text field (FormTextField, max 255), so
ShowcasePostStorySection now carries an isRichText flag and both
consumers render plain text sections directly instead of passing them
through renderRichTextToHtml, which would markdown-parse the value.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…enge

Marathon Match challenge details were already public, but the leaderboard
that makes a running match worth watching was not: the Submissions tab
needed a signed-in member and the Dashboard tab needed registration or an
administrator role. Anyone following a live match had to sign in first.

Marathon Matches now list the Submissions leaderboard for signed out
visitors, and the metadata-gated Dashboard tab no longer requires member
tab access. Other challenge types keep the existing sign-in handoff.

Review API stays the authority for what a visitor may read: it re-checks
challenge whitelist and group visibility, and it withholds member-private
submission fields from anonymous callers.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
PM-6367 Move Key Win below Business Impact Realised in showcase
The gig apply page kept the scroll offset carried over from the gig
details page, so clicking Apply after scrolling opened the form
mid-page. Reset the window scroll on mount, matching the gig details
page behavior.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The competition card metric column was 195px wide and the count cell was
the flexible column, so a three-digit registrants count was truncated to
"1...". Widen the metric column and size the value column to its content
so the label absorbs any shortfall instead of the number.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
PM-6293: Make MM Leaderboard Public during the challenge
PM-6404: Include H4 sections in challenge table of contents
…ore-completion

PM-6234: Withhold final score during system testing
…-my-role

PM-6398: Show My Role to review submitters
…ngagement-details

PM-6335: Open assigned private engagement details
…t-awards

PM-6294: Show checkpoint awards in challenge header
…search

PM-6409: Search engagements by assigned member handle
PM-6406 PM-6401: fix QA timeline and winners header issues
…ties

PM-6411 Fix unintended challenge timeline scrollbar
…ties

PM-6410 Show stalled status on competition cards
…ties

PM-6413 Keep second-place winner badge circular
…ties

PM-6414 Remove completed engagement listing filter
…ties

PM-6412 Show zero final scores on winner podium cards
…al-icon

PM-6389: Center Approval phase checkmark
…ments

PM-6335: Filter ended engagements and restore private details
@jmgasper
jmgasper requested a review from kkartunov as a code owner September 24, 2026 00:39
@jmgasper
jmgasper merged commit 8d98416 into master Sep 24, 2026
9 of 10 checks passed
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.

2 participants