Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
89 commits
Select commit Hold shift + click to select a range
035de8e
PM-4970: Correct BA challenge fee split
jmgasper Apr 29, 2026
cf82cc0
PM-4973: Restrict project user management actions
jmgasper Apr 29, 2026
211bdc6
PM-4393: Guard project workspace routes
jmgasper Apr 29, 2026
52dea34
PM-4961 View Billing Accountdetails
himaniraghav3 Apr 30, 2026
333abcc
fix linting
himaniraghav3 Apr 30, 2026
2a1e7eb
Fix Report Params view
himaniraghav3 Apr 30, 2026
6cc4b30
Fix devin feedback
himaniraghav3 Apr 30, 2026
331f6f3
Fix tooltip content
himaniraghav3 Apr 30, 2026
1264c09
Merge pull request #1794 from topcoder-platform/PM-4961
himaniraghav3 Apr 30, 2026
be475d4
Merge pull request #1789 from topcoder-platform/PM-4973
jmgasper May 1, 2026
2de89ee
Fix project guard revalidation access
jmgasper May 1, 2026
8502466
PM-4970: Fix copilot challenge line item amounts
jmgasper May 1, 2026
73da2ea
Merge pull request #1788 from topcoder-platform/PM-4970
jmgasper May 1, 2026
920b95a
Merge pull request #1790 from topcoder-platform/PM-4393-3
jmgasper May 1, 2026
864c4e6
PM-4684 - challenge budget approval flow
vas3a May 1, 2026
cca16a4
Merge branch 'dev' of github.com:topcoder-platform/platform-ui into P…
vas3a May 1, 2026
9f5a20d
UPdates to ba display
jmgasper May 3, 2026
322bdbb
Re-enable BA details display
jmgasper May 3, 2026
e088cb5
Merge pull request #1798 from topcoder-platform/ba-exposure
jmgasper May 3, 2026
30571b7
PM-4988: Hide project detail editing for copilots
jmgasper May 4, 2026
2ce2b0f
Merge pull request #1799 from topcoder-platform/PM-4988
jmgasper May 4, 2026
2d83fbc
Merge branch 'dev' of github.com:topcoder-platform/platform-ui into P…
vas3a May 4, 2026
bbd7e05
Merge pull request #1797 from topcoder-platform/PM-4684_challenge-app…
vas3a May 4, 2026
f436508
Fix reset in BA accounts view
himaniraghav3 May 4, 2026
4bd024f
Merge pull request #1800 from topcoder-platform/PM-4961
himaniraghav3 May 4, 2026
aa29288
PM-4393: Link project access support email
jmgasper May 4, 2026
e603aa4
PM-4954: Hide copilot billing details modal when flag is off
jmgasper May 4, 2026
afd0aa6
PM-4988: Hide project header edit for copilots
jmgasper May 4, 2026
c8a388a
PM-4999 Persist match state on clearing filter
himaniraghav3 May 4, 2026
b6f6a69
Merge pull request #1804 from topcoder-platform/PM-4999
himaniraghav3 May 4, 2026
bffdbde
Merge pull request #1801 from topcoder-platform/PM-4393-4
jmgasper May 4, 2026
63bcfd8
Merge pull request #1802 from topcoder-platform/PM-4954-2
jmgasper May 4, 2026
369f1e9
Merge pull request #1803 from topcoder-platform/PM-4988-1
jmgasper May 4, 2026
3af086d
Delete .github/workflows/code_reviewer.yml
kkartunov May 4, 2026
d07ea9f
PM-4931 Fix tooltips for 0wins or submissions
himaniraghav3 May 4, 2026
56189a1
Merge pull request #1805 from topcoder-platform/PM-4931
himaniraghav3 May 4, 2026
fbe7b3e
Show ECS logs for marathon match managers
jmgasper May 5, 2026
5588559
Tweaks to ECS logs and Rerun Scores button to the work app for marath…
jmgasper May 5, 2026
0da1e39
PM-4684 - save all data on budget approval
vas3a May 5, 2026
b58fd2e
PM-4684 - improve UX for approve budget
vas3a May 5, 2026
bad03fc
lint
vas3a May 5, 2026
eba864f
Expose marathon match submission test status and progress in work app
jmgasper May 5, 2026
f268f07
Add message for BA view when no dates specified
himaniraghav3 May 7, 2026
0348a65
Merge pull request #1817 from topcoder-platform/Patch-4961
himaniraghav3 May 7, 2026
453a894
Merge pull request #1818 from topcoder-platform/PM-4684_challenge-app…
jmgasper May 7, 2026
0200af7
Add pagination to BA view
himaniraghav3 May 7, 2026
dc9716f
Merge pull request #1819 from topcoder-platform/Patch-4961
himaniraghav3 May 7, 2026
88f9d76
PM-4962: Block expired or inactive BA payments
jmgasper May 7, 2026
941f8c4
PM-4971: Left align member payments header
jmgasper May 7, 2026
7384112
PM-5003: Show BA spent totals for PMs
jmgasper May 7, 2026
04b4d32
Review App: Update Submission locked message
May 7, 2026
960b1f2
PM-4989: Add billing account details to payment history
jmgasper May 7, 2026
b632bdf
Merge pull request #1823 from topcoder-platform/PM-4806
Harshitchudasama May 7, 2026
9aafff0
Merge pull request #1821 from topcoder-platform/PM-4971
jmgasper May 7, 2026
a0631b0
Merge pull request #1820 from topcoder-platform/PM-4962
jmgasper May 7, 2026
32cf2e8
Merge pull request #1822 from topcoder-platform/PM-5003
jmgasper May 7, 2026
b2e1552
Merge pull request #1824 from topcoder-platform/PM-4989
jmgasper May 7, 2026
87d80c5
1. The initial and final score display isn't quite right. The initi…
jmgasper May 8, 2026
aab9659
Merge pull request #1825 from topcoder-platform/mm_updates
jmgasper May 8, 2026
bafc87d
Updated Review App
May 8, 2026
d04fc65
Merge pull request #1826 from topcoder-platform/PM-4806
Harshitchudasama May 8, 2026
a3e9bc9
PM-5032 Wallet Admin updates
himaniraghav3 May 8, 2026
6b8a9a4
PM-4802: Review App-Page misaligned in mobile view
May 8, 2026
2568696
Patch lost commits from 5014
himaniraghav3 May 11, 2026
af8515f
Merge pull request #1829 from topcoder-platform/Patch-5014
himaniraghav3 May 11, 2026
ad92f8c
PM-5043: Correct billing line item member payments
jmgasper May 11, 2026
eb7bc7a
Review App-Page misaligned in mobile view
Harshitchudasama May 11, 2026
19917d9
PM-5038: Fix copilot challenge member payment rows
jmgasper May 11, 2026
10eee11
Merge pull request #1832 from topcoder-platform/PM-4684_challenge-app…
vas3a May 11, 2026
6de9fc9
Merge pull request #1830 from topcoder-platform/PM-5043
jmgasper May 11, 2026
25e7012
Merge branch 'dev' into PM-5038
jmgasper May 11, 2026
d916e1a
Merge pull request #1831 from topcoder-platform/PM-5038
jmgasper May 11, 2026
987b6b6
Merge pull request #1828 from topcoder-platform/PM-4802
Harshitchudasama May 11, 2026
f17f2cb
Merge pull request #1827 from topcoder-platform/PM-5032
himaniraghav3 May 11, 2026
b19e798
PM-5040 - ui updates for challenge approval flow
vas3a May 11, 2026
1dabf98
PM-5036 - notify copilot about budget approval
vas3a May 11, 2026
188b293
lint
vas3a May 11, 2026
08c75a1
Merge pull request #1833 from topcoder-platform/PM-4684_challenge-app…
vas3a May 11, 2026
e1a47e6
Always show approval status & reason
vas3a May 11, 2026
e7d3db0
Merge pull request #1834 from topcoder-platform/PM-4684_challenge-app…
vas3a May 11, 2026
fa32704
Fix skill deletedAt prop
vas3a May 11, 2026
97ce912
Merge pull request #1835 from topcoder-platform/PM-5022_skills-admin
vas3a May 11, 2026
e6d579b
Fix member payment calculation
jmgasper May 12, 2026
ae317ae
PM-5052 - launch btn fix
vas3a May 12, 2026
143d299
Fixes for PM / admin role on billing account popup calculation
jmgasper May 12, 2026
13c4496
lint fix
vas3a May 12, 2026
0daadb6
Merge pull request #1836 from topcoder-platform/PM-5052_launch-btn-fix
vas3a May 12, 2026
73eb41e
Fix up BA details for consumed amounts and specific roles - attempt t…
jmgasper May 12, 2026
73f0757
Merge branch 'dev' of github.com:topcoder-platform/platform-ui into dev
jmgasper May 12, 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
22 changes: 0 additions & 22 deletions .github/workflows/code_reviewer.yml

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ const SkillModal: FC<SkillModalProps> = props => {
setIsLoading(true)

// eslint-disable-next-line unicorn/no-null
return restoreArchivedStandardizedSkill({ ...props.skill, deleted_at: null })
return restoreArchivedStandardizedSkill({ ...props.skill, deletedAt: null })
.then(() => {
refetchSkills()
setEditSkill()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ export const SkillsManagerContext: FC<SkillsManagerContextProps> = props => {
}: SWRResponse<StandardizedSkillCategory[]> = useFetchCategories()

const filteredSkills = useMemo(() => (
showArchivedSkills ? allSkills : allSkills.filter(s => !s.deleted_at)
showArchivedSkills ? allSkills : allSkills.filter(s => !s.deletedAt)
), [allSkills, showArchivedSkills])

const skills = useMemo(() => findSkillsMatches(filteredSkills, skillsFilter), [filteredSkills, skillsFilter])
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ export interface GroupedSkills {
}

export const isSkillArchived = (skill: StandardizedSkill): boolean => (
!!skill.deleted_at
!!skill.deletedAt
)

export const groupSkillsByCategory = (skills: StandardizedSkill[]): GroupedSkills => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { UserSkill, xhrDeleteAsync, xhrGetAsync, xhrPostAsync, xhrPutAsync } fro
const baseUrl = `${EnvironmentConfig.STANDARDIZED_SKILLS_API}/skills`

export interface StandardizedSkill extends UserSkill {
deleted_at: string | null
deletedAt: string | null
categoryId?: string
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ export const TalentSearchPage: FC = () => {
const [totalResults, setTotalResults] = useState<number>(0)
const [currentPage, setCurrentPage] = useState<number>(1)
const [lastAppliedSearchSignature, setLastAppliedSearchSignature] = useState<string>('')
const [showSkillMatchOnCards, setShowSkillMatchOnCards] = useState<boolean>(false)
const countryNameByCode = useMemo((): Map<string, string> => new Map(
(countryLookup || [])
.filter(country => country.countryCode && country.country)
Expand All @@ -71,7 +72,6 @@ export const TalentSearchPage: FC = () => {
[selectedCountries],
)

const hasSkillSearch = selectedSkills.length > 0
const shouldShowIntroState = !hasSearched
const currentSearchSignature = useMemo(
(): string => JSON.stringify({
Expand Down Expand Up @@ -312,6 +312,7 @@ export const TalentSearchPage: FC = () => {
}

setHasSearched(true)
const hadSkills = selectedSkills.length > 0
const searchSucceeded = await runMemberSearch(selectedSkills, {
countries: selectedCountryCodesList,
openToWork: onlyOpenToWork,
Expand All @@ -321,6 +322,7 @@ export const TalentSearchPage: FC = () => {
})
if (searchSucceeded) {
setLastAppliedSearchSignature(currentSearchSignature)
setShowSkillMatchOnCards(hadSkills)
}
}, [
currentSearchSignature,
Expand Down Expand Up @@ -547,7 +549,7 @@ export const TalentSearchPage: FC = () => {
<TalentResultCard
key={talent.id}
talent={talent}
showSkillMatch={hasSkillSearch}
showSkillMatch={showSkillMatchOnCards}
/>
))}
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,19 @@ function getUniqueMatchedSkills(talent: TalentResultCardTalent): TalentResultCar
})
}

function matchedSkillStatsLabel(skill: MatchedSkill): string {
const parts: string[] = []
if (skill.wins > 0) {
parts.push(`${skill.wins} wins`)
}

if (skill.submitted > 0) {
parts.push(`${skill.submitted} submissions`)
}

return parts.length > 0 ? `: ${parts.join(', ')}` : ''
}

function buildMatchedSkillsTooltipContent(
count: number,
skills: MatchedSkill[],
Expand All @@ -59,7 +72,7 @@ function buildMatchedSkillsTooltipContent(
{skills.map((skill: MatchedSkill) => (
<li key={`${skill.id}-${skill.name}`} className={styles.tooltipSkillLine}>
<span className={styles.tooltipSkillName}>{skill.name}</span>
{`: ${skill.wins} wins, ${skill.submitted} submissions`}
{matchedSkillStatsLabel(skill)}
</li>
))}
</ul>
Expand Down
1 change: 1 addition & 0 deletions src/apps/reports/src/config/routes.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,4 @@ export const rootRoute: string

export const reportsPageRouteId = 'reports'
export const bulkMemberLookupRouteId = 'bulk-member-lookup'
export const billingAccountsPageRouteId = 'billing-accounts'
10 changes: 9 additions & 1 deletion src/apps/reports/src/lib/components/NavTabs/NavTabs.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,11 @@ import classNames from 'classnames'
import { useClickOutside } from '~/libs/shared/lib/hooks'
import { TabsNavItem } from '~/libs/ui'

import { bulkMemberLookupRouteId, reportsPageRouteId } from '../../../config/routes.config'
import {
billingAccountsPageRouteId,
bulkMemberLookupRouteId,
reportsPageRouteId,
} from '../../../config/routes.config'

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

Expand All @@ -34,6 +38,10 @@ const NavTabs: FC = () => {
id: bulkMemberLookupRouteId,
title: 'Bulk Member Lookup',
},
{
id: billingAccountsPageRouteId,
title: 'Billing Accounts',
},
], [])

const activeTabPathName: string = useMemo<string>(() => {
Expand Down
5 changes: 5 additions & 0 deletions src/apps/reports/src/lib/services/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ export {
downloadBlobFile,
downloadReportAsCsv,
downloadReportAsJson,
fetchReportJson,
fetchReportsIndex,
postReportAsCsv,
postReportAsJson,
Expand All @@ -10,8 +11,12 @@ export {
} from './reports.service'

export type {
BillingAccountDetail,
BillingAccountProfileResponse,
BillingAccountsViewData,
ReportDefinition,
ReportGroup,
ReportParameter,
ReportsIndexResponse,
SfdcBillingAccountPaymentRow,
} from './reports.service'
50 changes: 50 additions & 0 deletions src/apps/reports/src/lib/services/reports.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,46 @@ export type ReportGroup = {

export type ReportsIndexResponse = Record<string, ReportGroup>

export type BillingAccountDetail = {
name: string
description: string | null
subcontractingEndCustomer: string | null
status: string
startDate: string | null
endDate: string | null
budget: string | number
markup: string | number
}

export type SfdcBillingAccountPaymentRow = {
paymentId: string
paymentDate: string
billingAccountId: string
paymentStatus: string
challengeFee: string | number
paymentAmount: string | number
challengeId: string
category: string
isTask: boolean
challengeName: string | null
challengeStatus: string | null
winnerHandle: string
winnerId: string
winnerFirstName: string
winnerLastName: string
}

/** Response from GET /sfdc/billing-accounts */
export type BillingAccountProfileResponse = {
billingAccount?: BillingAccountDetail
}

/** Billing Accounts in-app view: profile + rows from GET /sfdc/payments */
export type BillingAccountsViewData = {
billingAccount?: BillingAccountDetail
payments: SfdcBillingAccountPaymentRow[]
}

const reportsDownloadClient: AxiosInstance = xhrCreateInstance()

const buildReportUrl = (path: string): string => {
Expand Down Expand Up @@ -137,6 +177,16 @@ export const downloadReportAsJson = (path: string): Promise<Blob> => (
downloadReportBlob(path, 'application/json')
)

export const fetchReportJson = async <T>(path: string): Promise<T> => {
if (!path) {
throw new Error('Report path is required')
}

const normalizedPath = path.startsWith('/') ? path : `/${path}`
const url = `${EnvironmentConfig.API.V6}/reports${normalizedPath}`
return xhrGetAsync<T>(url, reportsDownloadClient)
}

export const downloadReportAsCsv = (path: string): Promise<Blob> => (
downloadReportBlob(path, 'text/csv')
)
Expand Down
3 changes: 3 additions & 0 deletions src/apps/reports/src/pages/reports/BillingAccountsPage.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import { BillingAccountsPage } from './ReportsPage'

export default BillingAccountsPage
Loading
Loading