Skip to content

Commit 2a17ea4

Browse files
committed
Merge branch 'dev' of github.com:topcoder-platform/platform-ui into dev
2 parents 9f5b30b + b8704a0 commit 2a17ea4

File tree

17 files changed

+102
-17
lines changed

17 files changed

+102
-17
lines changed

.circleci/config.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,6 @@ workflows:
226226
branches:
227227
only:
228228
- dev
229-
- pm-3141_3
230229

231230
- deployQa:
232231
context: org-global

src/apps/profiles/src/lib/helpers.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ export function subTrackLabelToHumanName(label: string): string {
9090
export function isValidURL(urlToValidate: string): boolean {
9191
const pattern = new RegExp(
9292
'^(https?:\\/\\/)?' // protocol
93-
+ '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|' // domain name
93+
+ '((([a-z\\d](?:[a-z\\d-]*[a-z\\d])?)\\.)+[a-z]{2,}|' // domain name, forbid leading/trailing dash in label
9494
+ '((\\d{1,3}\\.){3}\\d{1,3}))' // OR IP (v4) address
9595
+ '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*' // port and path
9696
+ '(\\?[;&a-z\\d%_.~+=-]*)?' // query string

src/apps/review/src/lib/components/ChallengeDetailsContent/ChallengeDetailsContent.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -508,6 +508,7 @@ export const ChallengeDetailsContent: FC<Props> = (props: Props) => {
508508
selectedTab={props.selectedTab}
509509
reviews={reviewTabReviews}
510510
submitterReviews={reviewTabSubmitterReviews}
511+
screeningOutcome={screeningOutcome}
511512
reviewMinimumPassingScore={props.reviewMinimumPassingScore}
512513
isLoadingReview={props.isLoadingSubmission}
513514
isDownloading={isDownloadingSubmission}

src/apps/review/src/lib/components/ChallengeDetailsContent/TabContentCheckpoint.tsx

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/**
22
* Content of checkpoint tab.
33
*/
4-
import { FC, useContext, useMemo } from 'react'
4+
import { FC, useCallback, useContext, useMemo } from 'react'
55

66
import { TableLoading } from '~/apps/admin/src/lib'
77
import { IsRemovingType } from '~/apps/admin/src/lib/models'
@@ -75,6 +75,32 @@ export const TabContentCheckpoint: FC<Props> = (props: Props) => {
7575
[props.checkpointReview, myMemberIds, props.checkpointReviewMinimumPassingScore],
7676
)
7777

78+
const checkpointScreeningOutcome = useMemo(
79+
() => {
80+
const passingSubmissionIds = new Set<string>()
81+
const failingSubmissionIds = new Set<string>()
82+
83+
props.checkpoint.forEach(entry => {
84+
if (!entry?.submissionId) {
85+
return
86+
}
87+
88+
const normalizedResult = (entry.result || '').toUpperCase()
89+
if (normalizedResult === 'PASS') {
90+
passingSubmissionIds.add(`${entry.submissionId}`)
91+
} else if (normalizedResult === 'NO PASS') {
92+
failingSubmissionIds.add(`${entry.submissionId}`)
93+
}
94+
})
95+
96+
return {
97+
failingSubmissionIds,
98+
passingSubmissionIds,
99+
}
100+
},
101+
[props.checkpoint],
102+
)
103+
78104
const filteredCheckpoint = useMemo<Screening[]>(
79105
() => {
80106
const baseRows = props.checkpoint ?? []
@@ -107,9 +133,15 @@ export const TabContentCheckpoint: FC<Props> = (props: Props) => {
107133
],
108134
)
109135

136+
const filterCheckpointReviewByScreeningResult = useCallback(
137+
(screening: Screening[]) => screening
138+
.filter(row => checkpointScreeningOutcome.passingSubmissionIds.has(`${row.submissionId}`)),
139+
[checkpointScreeningOutcome],
140+
)
141+
110142
const filteredCheckpointReview = useMemo<Screening[]>(
111143
() => {
112-
const baseRows = props.checkpointReview ?? []
144+
const baseRows = filterCheckpointReviewByScreeningResult(props.checkpointReview ?? [])
113145

114146
if (isPrivilegedRole || (isChallengeCompleted && hasPassedCheckpointReviewThreshold)) {
115147
return baseRows
@@ -135,6 +167,7 @@ export const TabContentCheckpoint: FC<Props> = (props: Props) => {
135167
hasPassedCheckpointReviewThreshold,
136168
checkpointReviewerResourceIds,
137169
myMemberIds,
170+
checkpointScreeningOutcome,
138171
],
139172
)
140173

src/apps/review/src/lib/components/ChallengeDetailsContent/TabContentReview.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@ import { hasSubmitterPassedThreshold } from '../../utils/reviewScoring'
4646
interface Props {
4747
aiReviewers?: { aiWorkflowId: string }[]
4848
selectedTab: string
49+
screeningOutcome: {
50+
failingSubmissionIds: Set<string>;
51+
passingSubmissionIds: Set<string>;
52+
}
4953
reviews: SubmissionInfo[]
5054
submitterReviews: SubmissionInfo[]
5155
reviewMinimumPassingScore?: number | null
@@ -636,6 +640,7 @@ export const TabContentReview: FC<Props> = (props: Props) => {
636640
},
637641
[resolvedReviewsWithSubmitter],
638642
)
643+
639644
const filteredSubmitterReviews = useMemo(
640645
() => {
641646
if (!resolvedSubmitterReviews.length) {
@@ -729,6 +734,7 @@ export const TabContentReview: FC<Props> = (props: Props) => {
729734
<TableReview
730735
aiReviewers={props.aiReviewers}
731736
datas={reviewRows}
737+
screeningOutcome={props.screeningOutcome}
732738
isDownloading={props.isDownloading}
733739
downloadSubmission={props.downloadSubmission}
734740
mappingReviewAppeal={props.mappingReviewAppeal}

src/apps/review/src/lib/components/FieldMarkdownEditor/FieldMarkdownEditor.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ const toggleStrategy = {
135135
},
136136
italic: (start: any, end: any) => {
137137
const startType = start.replace(/(\*|_)(?![\s\S]*(\*|_))/, '')
138-
const endType = end.replace(/(\*|_)/, '')
138+
const endType = end.replace(/(\*|_)/g, '')
139139
return { endType, startType }
140140
},
141141
strikethrough: (start: any, end: any) => {

src/apps/review/src/lib/components/Scorecard/ScorecardViewer/ScorecardQuestion/ReviewResponse/ReviewManagerComment/ReviewManagerComment.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ interface ReviewManagerCommentProps {
3131
const ReviewManagerComment: FC<ReviewManagerCommentProps> = props => {
3232
const {
3333
isManagerEdit,
34+
canAddManagerComment,
3435
isSavingManagerComment,
3536
addManagerComment,
3637
}: ScorecardViewerContextValue = useScorecardViewerContext()
@@ -118,7 +119,7 @@ const ReviewManagerComment: FC<ReviewManagerCommentProps> = props => {
118119
<div className={styles.content}>
119120
<MarkdownReview value={comment} />
120121
</div>
121-
{isManagerEdit && (
122+
{isManagerEdit && canAddManagerComment && (
122123
<button
123124
type='button'
124125
onClick={handleShowCommentForm}
@@ -131,7 +132,7 @@ const ReviewManagerComment: FC<ReviewManagerCommentProps> = props => {
131132
</div>
132133
)}
133134

134-
{!showCommentForm && !comment && isManagerEdit && (
135+
{!showCommentForm && !comment && isManagerEdit && canAddManagerComment && (
135136
<button
136137
type='button'
137138
onClick={handleShowCommentForm}

src/apps/review/src/lib/components/Scorecard/ScorecardViewer/ScorecardViewer.context.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ export interface ScorecardViewerContextProps {
2222
children: ReactNode;
2323
scorecard: Scorecard | ScorecardInfo
2424
aiFeedbackItems?: AiFeedbackItem[]
25+
canAddManagerComment?: boolean
2526
reviewInfo?: ReviewInfo
2627
isEdit?: boolean
2728
isManagerEdit?: boolean
@@ -66,6 +67,7 @@ export interface ScorecardViewerContextProps {
6667

6768
export type ScorecardViewerContextValue = {
6869
aiFeedbackItems?: AiFeedbackItem[]
70+
canAddManagerComment?: boolean
6971
toggledItems: {[key: string]: boolean}
7072
toggleItem: (id: string, toggle?: boolean) => void
7173
reviewInfo?: ReviewInfo
@@ -142,6 +144,7 @@ export const ScorecardViewerContextProvider: FC<ScorecardViewerContextProps> = p
142144
addAppealResponse: props.addAppealResponse,
143145
addManagerComment: props.addManagerComment,
144146
aiFeedbackItems: props.aiFeedbackItems,
147+
canAddManagerComment: props.canAddManagerComment,
145148
doDeleteAppeal: props.doDeleteAppeal,
146149
form: props.isEdit ? reviewFormCtx.form : undefined,
147150
formErrors: props.isEdit ? reviewFormCtx.form.formState.errors : undefined,
@@ -161,6 +164,7 @@ export const ScorecardViewerContextProvider: FC<ScorecardViewerContextProps> = p
161164
touchedAllFields: reviewFormCtx.touchedAllFields,
162165
}), [
163166
props.aiFeedbackItems,
167+
props.canAddManagerComment,
164168
props.reviewInfo,
165169
props.isEdit,
166170
props.isManagerEdit,

src/apps/review/src/lib/components/Scorecard/ScorecardViewer/ScorecardViewer.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ interface ScorecardViewerProps {
4444
isSavingAppeal?: boolean
4545
isSavingAppealResponse?: boolean
4646
isSavingManagerComment?: boolean
47+
canAddManagerComment?: boolean
4748
setReviewStatus?: (status: ReviewCtxStatus) => void
4849
setActionButtons?: (buttons?: ReactNode) => void
4950
saveReviewInfo?: (
@@ -335,6 +336,7 @@ const ScorecardViewer: FC<ScorecardViewerProps> = props => (
335336
<ScorecardViewerContextProvider
336337
scorecard={props.scorecard}
337338
aiFeedbackItems={props.aiFeedback}
339+
canAddManagerComment={props.canAddManagerComment}
338340
reviewInfo={props.reviewInfo}
339341
isEdit={props.isEdit}
340342
isManagerEdit={props.isManagerEdit}

src/apps/review/src/lib/components/TableAppeals/TableAppeals.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,7 @@ export const TableAppeals: FC<TableAppealsProps> = (props: TableAppealsProps) =>
256256
? ownedMemberIds.has(submissionOwnerId)
257257
: false
258258
},
259+
canRespondToAppeals: isAdmin || hasReviewerRole,
259260
canViewScorecard: canAccessScorecards,
260261
isAppealsTab: true,
261262
}

0 commit comments

Comments
 (0)