Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
71 commits
Select commit Hold shift + click to select a range
d330935
PM-5850: restore support rich text formatting
jmgasper Aug 12, 2026
83093cb
PM-5845: Refresh support ticket assignments
jmgasper Aug 12, 2026
0862248
PM-5844: Require assignment before support replies
jmgasper Aug 12, 2026
bf34436
Merge pull request #2127 from topcoder-platform/PM-5844
jmgasper Aug 12, 2026
489ec92
Merge pull request #2125 from topcoder-platform/PM-5850
jmgasper Aug 12, 2026
54a2926
Merge origin/dev into PM-5845
jmgasper Aug 12, 2026
151667b
PM-5194: Allow Fun challenges to launch without approval
jmgasper Aug 12, 2026
8f65509
PM-5851: Scope unread indicators to assigned support tickets
jmgasper Aug 12, 2026
f8f7e18
Merge pull request #2128 from topcoder-platform/PM-5194
jmgasper Aug 12, 2026
2027593
Merge pull request #2126 from topcoder-platform/PM-5845
jmgasper Aug 12, 2026
4097a5a
Merge pull request #2129 from topcoder-platform/PM-5851
jmgasper Aug 12, 2026
fe01311
PM-5848: Refresh support ticket details after read
jmgasper Aug 12, 2026
3baab7a
PM-5858: Require assignment before ticket closure
jmgasper Aug 12, 2026
0f9a4e7
PM-5861: Add totals to dashboard report tooltips
jmgasper Aug 12, 2026
3cc3f03
PM-4621 minor fixes
vas3a Aug 12, 2026
c24d418
PM-5866 - allow user to manually create review context
vas3a Aug 12, 2026
b9721e5
Merge pull request #2133 from topcoder-platform/PM-5866_manual-creati…
vas3a Aug 12, 2026
c54f074
PM-5755: Simplify design screener assignment
jmgasper Aug 12, 2026
86ba781
PM-5787: Allow deferred checkpoint screener assignment
jmgasper Aug 12, 2026
fd56ffe
Merge branch 'dev' of github.com:topcoder-platform/platform-ui into P…
vas3a Aug 12, 2026
fa6d3c3
PM-4621 - tooltip position
vas3a Aug 12, 2026
97fa02d
PM-4621 - tooltip
vas3a Aug 12, 2026
b6da27c
PM-5462 Preferred roles dropdown updates
himaniraghav3 Aug 12, 2026
393bab7
lint fix
vas3a Aug 12, 2026
1004f45
Merge pull request #2136 from topcoder-platform/PM-4621_general-stati…
vas3a Aug 12, 2026
371b549
Merge pull request #2137 from topcoder-platform/PM-5462
himaniraghav3 Aug 12, 2026
c03b5dc
PM-5839: Render SFDC payment dates consistently
jmgasper Aug 12, 2026
8c13697
Fix member profile rating chart
himaniraghav3 Aug 12, 2026
730f5a4
Merge pull request #2139 from topcoder-platform/PM-5462
himaniraghav3 Aug 12, 2026
4ea6c82
PM-5758: finish design submission limit handling
jmgasper Aug 12, 2026
9eafb1f
PM-5857: Label support team replies
jmgasper Aug 12, 2026
a1393b2
PM-4621 - minor updates
vas3a Aug 12, 2026
d116824
Merge pull request #2142 from topcoder-platform/PM-4621_general-stati…
vas3a Aug 12, 2026
bc710c2
PM-5854: Make challenge link visually distinct
jmgasper Aug 12, 2026
e6ad419
PM-5853: Rename active challenge label
jmgasper Aug 12, 2026
d2ffa7a
PM-5852: Open support description links in new tabs
jmgasper Aug 12, 2026
e1a95bd
PM-5466 Add a min stub for empty buckets in ratings chart
himaniraghav3 Aug 12, 2026
74a7d76
Merge pull request #2146 from topcoder-platform/PM-5462
himaniraghav3 Aug 12, 2026
484b3f8
Merge pull request #2132 from topcoder-platform/PM-5861
jmgasper Aug 13, 2026
a4938ed
Merge pull request #2131 from topcoder-platform/PM-5858
jmgasper Aug 13, 2026
4ea0ffd
Merge pull request #2145 from topcoder-platform/PM-5852
jmgasper Aug 13, 2026
d27e284
Merge pull request #2144 from topcoder-platform/PM-5853
jmgasper Aug 13, 2026
12a043e
PM-5381 Add Member not found page for non existing handles
himaniraghav3 Aug 13, 2026
84915e9
Merge pull request #2148 from topcoder-platform/PM-5381
himaniraghav3 Aug 13, 2026
ebb2b98
PM-5879 Fix rating charts label
himaniraghav3 Aug 13, 2026
78816b0
Merge pull request #2149 from topcoder-platform/PM-5879
himaniraghav3 Aug 13, 2026
d0078fd
PM-5819 Fix engagement details styling
himaniraghav3 Aug 13, 2026
13572d3
Merge pull request #2150 from topcoder-platform/PM-5819
himaniraghav3 Aug 13, 2026
45a6496
PM-5820 Show N/A daysLeftInEngagement for terminated assignments
himaniraghav3 Aug 13, 2026
1d238d7
Merge pull request #2151 from topcoder-platform/PM-5820
himaniraghav3 Aug 13, 2026
258fa37
Merge pull request #2134 from topcoder-platform/PM-5755
jmgasper Aug 14, 2026
599e1cb
Merge branch 'dev' into PM-5787-2
jmgasper Aug 14, 2026
78d9986
Merge pull request #2135 from topcoder-platform/PM-5787-2
jmgasper Aug 14, 2026
d04dbf5
Merge pull request #2138 from topcoder-platform/PM-5839
jmgasper Aug 14, 2026
656dbd8
Merge pull request #2140 from topcoder-platform/PM-5758-1
jmgasper Aug 14, 2026
b847b62
Merge dev into PM-5857
jmgasper Aug 14, 2026
03b20d6
Merge pull request #2141 from topcoder-platform/PM-5857
jmgasper Aug 14, 2026
cffa992
Merge dev into PM-5848
jmgasper Aug 14, 2026
3cabeb8
Merge pull request #2130 from topcoder-platform/PM-5848
jmgasper Aug 14, 2026
dd84a92
Merge dev into PM-5854
jmgasper Aug 14, 2026
0bc8ba0
Merge pull request #2143 from topcoder-platform/PM-5854
jmgasper Aug 14, 2026
dda59ad
PM-5755: Show the simplified Design review section for every role
jmgasper Aug 14, 2026
3ced780
PM-5878: Add Show Dashboard flag to Marathon Match advanced settings
jmgasper Aug 14, 2026
af68a62
Merge pull request #2154 from topcoder-platform/PM-5755-1
jmgasper Aug 17, 2026
6d9dcf1
PM-5755: Preserve hidden reviewer defaults
jmgasper Aug 18, 2026
b8e73e7
Merge pull request #2156 from topcoder-platform/agent/pm-5755-reviewe…
jmgasper Aug 18, 2026
5d7e411
Merge pull request #2155 from topcoder-platform/PM-5878
jmgasper Aug 18, 2026
ba8339b
PM-5755: Assign private reviewers to copilot
jmgasper Aug 18, 2026
b524d8d
Merge pull request #2157 from topcoder-platform/agent/pm-5755-reviewe…
jmgasper Aug 18, 2026
0850969
PM-5755: Allow copilot handles through validation
jmgasper Aug 18, 2026
45658e4
Merge pull request #2159 from topcoder-platform/agent/pm-5755-handle-…
jmgasper Aug 18, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -157,11 +157,6 @@ function normalizeCountryRows(
return
}

if (row['country.country_name'] === 'Taiwan') {
console.log('here', row)

}

const code = toAlpha2CountryCode(lookup.countryCode)
const current = countries.get(code)
const topWinners = (row.topWinners || [])
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -296,6 +296,12 @@
}
}

:global(.highcharts-tooltip) {
position: fixed !important;
transform: none !important;
z-index: 20;
}

&:fullscreen {
height: 100vh;
min-height: 100vh;
Expand All @@ -306,6 +312,12 @@
height: 100vh !important;
}
}

@include ltesm {
:global(.highcharts-legend-item text) {
font-size: 10px !important;
}
}
}

.mapFullscreenButton {
Expand Down Expand Up @@ -367,6 +379,9 @@
top: 100%;
transform: translateX(-50%);
width: 0;
@include ltemd {
display: none;
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -237,7 +237,7 @@ const StatisticsPage: FC = () => {
</span>
</td>
<td>
<div>
<div title={country.name}>
{country.code && (
<span
aria-hidden='true'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,30 @@ function renderCountryTooltip(point: StatisticsMapPoint): string {
`
}

function getFixedTooltipPosition(
labelWidth: number,
labelHeight: number,
point: Highcharts.Point,
chart: Highcharts.Chart,
): Highcharts.PositionObject {
const chartRenderTo = (chart as unknown as { renderTo: HTMLElement }).renderTo
const chartRect = chartRenderTo.getBoundingClientRect()
const plotX = (point.plotX ?? 0) + chart.plotLeft
const plotY = (point.plotY ?? 0) + chart.plotTop
const pointX = chartRect.left + plotX
const pointY = chartRect.top + plotY
const minOffset = 12
const offsetAbove = 14

return {
x: Math.min(
Math.max(pointX - Math.round(labelWidth / 2), minOffset),
window.innerWidth - labelWidth - minOffset,
),
y: Math.max(pointY - labelHeight - offsetAbove, minOffset),
}
}

function createTooltipFormatter(
props: Pick<WorldMapProps, 'showWinnerDetails'>,
): Highcharts.TooltipFormatterCallbackFunction {
Expand Down Expand Up @@ -481,14 +505,14 @@ const WorldMap: FC<WorldMapProps> = props => {
margin: [0, 0, 80, 0],
},
legend: {
itemDistance: 24,
itemDistance: 16,
itemMarginBottom: 4,
itemStyle: {
fontSize: '12px',
fontSize: '9px',
},
symbolHeight: 12,
symbolWidth: 12,
width: 340,
width: 360,
},
},
condition: {
Expand All @@ -515,7 +539,28 @@ const WorldMap: FC<WorldMapProps> = props => {
showWinnerDetails: props.showWinnerDetails,
}),
padding: 0,
positioner: (
labelWidth: number,
labelHeight: number,
point: Highcharts.Point,
): Highcharts.PositionObject => {
const chart = chartRef.current?.chart as Highcharts.Chart | undefined

if (!chart) {
return { x: 0, y: 0 }
}

return getFixedTooltipPosition(
labelWidth,
labelHeight,
point,
chart,
)
},
shadow: false,
style: {
position: 'fixed',
},
useHTML: true,
},
}),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
@import "@libs/ui/styles/includes";

.container {
min-height: 60vh;
display: flex;
align-items: center;
justify-content: center;
}

.content {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
text-align: center;
gap: $sp-6;
padding: $sp-15 $sp-8;
color: $black-100;

svg {
color: $black-60;
}
}

.title {
@include font-barlow;
font-weight: 600;
font-size: 28px;
line-height: 34px;
margin: 0;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import { FC, useCallback } from 'react'
import { useNavigate } from 'react-router-dom'

import { Button, ContentLayout, IconOutline, IconSolid, PageTitle } from '~/libs/ui'

import styles from './MemberNotFound.module.scss'

interface MemberNotFoundProps {
memberHandle?: string
}

const MemberNotFound: FC<MemberNotFoundProps> = (props: MemberNotFoundProps) => {
const navigate = useNavigate()

const handleBack = useCallback(() => {
navigate(-1)
}, [navigate])

return (
<ContentLayout outerClass={styles.container}>
<PageTitle>Profile Not Found | Topcoder</PageTitle>

<div className={styles.content} role='alert'>
<IconOutline.ExclamationCircleIcon className='icon-xxxl' />
<h2 className={styles.title}>We were unable to locate that profile</h2>
{props.memberHandle && (
<p className='body-main'>
No member was found with the handle
{' '}
<strong>{props.memberHandle}</strong>
.
</p>
)}
<Button
link
size='lg'
iconToLeft
icon={IconSolid.ArrowLeftIcon}
onClick={handleBack}
>
Go back
</Button>
</div>
</ContentLayout>
)
}

export default MemberNotFound
1 change: 1 addition & 0 deletions src/apps/profiles/src/components/MemberNotFound/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { default as MemberNotFound } from './MemberNotFound'
1 change: 1 addition & 0 deletions src/apps/profiles/src/components/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ export * from './tc-achievements/SRMView/ChallengesGrid'
export * from './EditMemberPropertyBtn'
export * from './AddButton'
export * from './EmptySection'
export * from './MemberNotFound'
23 changes: 19 additions & 4 deletions src/apps/profiles/src/member-badges/MemberBadgesPage.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import { Dispatch, FC, SetStateAction, useCallback, useEffect, useState } from 'react'
import { Params, useNavigate, useParams } from 'react-router-dom'
import { AxiosError } from 'axios'
import { bind } from 'lodash'

import { profileGetPublicAsync, useMemberBadges, UserBadge, UserBadgesResponse, UserProfile } from '~/libs/core'
import { Button, ContentLayout, IconSolid, LoadingSpinner } from '~/libs/ui'

import { MemberBadgeModal } from '../components'
import { MemberBadgeModal, MemberNotFound } from '../components'

import styles from './MemberBadgesPage.module.scss'

Expand All @@ -19,6 +20,7 @@ const MemberBadgesPage: FC<{}> = () => {
] = useState()

const [profileReady, setProfileReady]: [boolean, Dispatch<SetStateAction<boolean>>] = useState<boolean>(false)
const [notFound, setNotFound]: [boolean, Dispatch<SetStateAction<boolean>>] = useState<boolean>(false)

const memberBadges: UserBadgesResponse | undefined = useMemberBadges(profile?.userId as number, { limit: 100 })

Expand All @@ -39,12 +41,21 @@ const MemberBadgesPage: FC<{}> = () => {

useEffect(() => {
if (routeParams.memberHandle) {
setProfileReady(false)
setNotFound(false)
setProfile(undefined)

profileGetPublicAsync(routeParams.memberHandle)
.then(userProfile => {
setProfile(userProfile)
setProfileReady(true)
})
// TODO: NOT FOUND PAGE redirect/dispaly via catch
.catch((e: AxiosError) => {
if (e.code === AxiosError.ERR_BAD_REQUEST && e.response?.status === 404) {
setNotFound(true)
setProfileReady(true)
}
})
}
}, [routeParams.memberHandle])

Expand All @@ -54,9 +65,13 @@ const MemberBadgesPage: FC<{}> = () => {

return (
<>
<LoadingSpinner hide={profileReady && !!memberBadges} />
<LoadingSpinner hide={profileReady && (notFound || !!memberBadges)} />

{profileReady && notFound && (
<MemberNotFound memberHandle={routeParams.memberHandle} />
)}

{profileReady && profile && !!memberBadges && (
{profileReady && profile && !notFound && !!memberBadges && (
<ContentLayout
outerClass={styles.container}
>
Expand Down
16 changes: 13 additions & 3 deletions src/apps/profiles/src/member-profile/MemberProfilePage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { AxiosError } from 'axios'
import { profileContext, ProfileContextData, profileGetPublicAsync, UserProfile } from '~/libs/core'
import { LoadingSpinner } from '~/libs/ui'

import { rootRoute } from '../profiles.routes'
import { MemberNotFound } from '../components'
import { notifyUniNavi } from '../lib'

import { ProfilePageLayout } from './page-layout'
Expand All @@ -21,6 +21,7 @@ const MemberProfilePage: FC<{}> = () => {
] = useState()

const [profileReady, setProfileReady]: [boolean, Dispatch<SetStateAction<boolean>>] = useState<boolean>(false)
const [notFound, setNotFound]: [boolean, Dispatch<SetStateAction<boolean>>] = useState<boolean>(false)
const { isTalentSearch }: MemberProfileContextValue = useMemberProfileContext()

const { profile: authProfile }: ProfileContextData = useContext(profileContext)
Expand All @@ -31,14 +32,19 @@ const MemberProfilePage: FC<{}> = () => {

useEffect(() => {
if (routeParams.memberHandle) {
setProfileReady(false)
setNotFound(false)
setProfile(undefined)

profileGetPublicAsync(routeParams.memberHandle)
.then(userProfile => {
setProfile({ ...userProfile } as UserProfile)
setProfileReady(true)
})
.catch((e: AxiosError) => {
if (e.code === AxiosError.ERR_BAD_REQUEST && e.response?.status === 404) {
navigate(rootRoute)
setNotFound(true)
setProfileReady(true)
}
})
}
Expand All @@ -58,7 +64,11 @@ const MemberProfilePage: FC<{}> = () => {
<>
<LoadingSpinner hide={profileReady} />

{profileReady && profile && (
{profileReady && notFound && (
<MemberNotFound memberHandle={routeParams.memberHandle} />
)}

{profileReady && profile && !notFound && (
<ProfilePageLayout
handleBackBtn={handleBackBtn}
isTalentSearch={isTalentSearch}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,12 @@
width: 100%;
}

.preferredRolesAddButton {
display: flex;
justify-content: center;
width: 100%;
}

.preferredRolesList {
display: flex;
align-items: center;
Expand Down Expand Up @@ -150,25 +156,6 @@
}
}

.preferredRolesPlaceholder {
appearance: none;
background: transparent;
border: 0;
color: $black-60;
cursor: pointer;
font-family: "Nunito Sans", sans-serif;
font-size: 14px;
font-weight: $font-weight-medium;
line-height: 20px;
padding: 0;
text-align: center;

&:hover {
color: $black-100;
text-decoration: underline;
}
}

.preferredRolesEditButton {
color: $black-100;
padding-left: $sp-2 !important;
Expand Down
Loading
Loading