From 08fc6cf2ff4c6b287fecf06d2c70a8ec4d09cd44 Mon Sep 17 00:00:00 2001 From: Hentry Martin Date: Tue, 4 Nov 2025 15:08:09 +0100 Subject: [PATCH 1/7] fix: remove the phase name which is already added --- .../ChallengeReviewer-Field/index.js | 89 +++++++++++-------- 1 file changed, 51 insertions(+), 38 deletions(-) diff --git a/src/components/ChallengeEditor/ChallengeReviewer-Field/index.js b/src/components/ChallengeEditor/ChallengeReviewer-Field/index.js index 56b070db..964add1b 100644 --- a/src/components/ChallengeEditor/ChallengeReviewer-Field/index.js +++ b/src/components/ChallengeEditor/ChallengeReviewer-Field/index.js @@ -722,44 +722,57 @@ class ChallengeReviewerField extends Component { onChange={(e) => this.updateReviewer(index, 'phaseId', e.target.value)} > - {challenge.phases && challenge.phases - .filter(phase => { - const rawName = phase.name ? phase.name : '' - const phaseName = rawName.toLowerCase() - const norm = phaseName.replace(/[-\s]/g, '') - const isReviewPhase = phaseName.includes('review') - const isSubmissionPhase = phaseName.includes('submission') - const isScreeningPhase = norm === 'screening' || norm === 'checkpointscreening' - const isApprovalPhase = norm === 'approval' - const isPostMortemPhase = norm === 'postmortem' - const isCurrentlySelected = reviewer.phaseId && ((phase.id === reviewer.phaseId) || (phase.phaseId === reviewer.phaseId)) && !isSubmissionPhase - - // For AI reviewers, allow review, submission, and other required phases - // For member reviewers, allow review and other required phases - if (this.isAIReviewer(reviewer)) { - return ( - isReviewPhase || - isSubmissionPhase || - isScreeningPhase || - isApprovalPhase || - isPostMortemPhase || - isCurrentlySelected - ) - } else { - return ( - isReviewPhase || - isScreeningPhase || - isApprovalPhase || - isPostMortemPhase || - isCurrentlySelected - ) - } - }) - .map(phase => ( - - ))} + {challenge.phases && challenge.phases + .filter(phase => { + const rawName = phase.name ? phase.name : '' + const phaseName = rawName.toLowerCase() + const norm = phaseName.replace(/[-\s]/g, '') + const isReviewPhase = phaseName.includes('review') + const isSubmissionPhase = phaseName.includes('submission') + const isScreeningPhase = norm === 'screening' || norm === 'checkpointscreening' + const isApprovalPhase = norm === 'approval' + const isPostMortemPhase = norm === 'postmortem' + const isCurrentlySelected = reviewer.phaseId && ((phase.id === reviewer.phaseId) || (phase.phaseId === reviewer.phaseId)) && !isSubmissionPhase + + // Collect phases already assigned to other reviewers (excluding current reviewer) + const assignedPhaseIds = new Set( + (challenge.reviewers || []) + .filter((r, i) => i !== index) + .map(r => r.phaseId) + .filter(id => id !== undefined && id !== null) + ) + + // Exclude phases already assigned to other reviewers, except the currently selected phase + if (assignedPhaseIds.has(phase.phaseId || phase.id) && !isCurrentlySelected) { + return false + } + + // For AI reviewers, allow review, submission, and other required phases + // For member reviewers, allow review and other required phases + if (this.isAIReviewer(reviewer)) { + return ( + isReviewPhase || + isSubmissionPhase || + isScreeningPhase || + isApprovalPhase || + isPostMortemPhase || + isCurrentlySelected + ) + } else { + return ( + isReviewPhase || + isScreeningPhase || + isApprovalPhase || + isPostMortemPhase || + isCurrentlySelected + ) + } + }) + .map(phase => ( + + ))} )} {!readOnly && challenge.submitTriggered && validationErrors.phaseId && ( From 4d76def38c7cbc1be6e650a6f479e8478268cc6d Mon Sep 17 00:00:00 2001 From: Hentry Martin Date: Wed, 5 Nov 2025 11:22:23 +0100 Subject: [PATCH 2/7] fix: lint --- .../ChallengeReviewer-Field/index.js | 80 +++++++++---------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/src/components/ChallengeEditor/ChallengeReviewer-Field/index.js b/src/components/ChallengeEditor/ChallengeReviewer-Field/index.js index 3ddb96b6..b582fc57 100644 --- a/src/components/ChallengeEditor/ChallengeReviewer-Field/index.js +++ b/src/components/ChallengeEditor/ChallengeReviewer-Field/index.js @@ -760,57 +760,57 @@ class ChallengeReviewerField extends Component { onChange={(e) => this.updateReviewer(index, 'phaseId', e.target.value)} > - {challenge.phases && challenge.phases - .filter(phase => { - const rawName = phase.name ? phase.name : '' - const phaseName = rawName.toLowerCase() - const norm = phaseName.replace(/[-\s]/g, '') - const isReviewPhase = phaseName.includes('review') - const isSubmissionPhase = phaseName.includes('submission') - const isScreeningPhase = norm === 'screening' || norm === 'checkpointscreening' - const isApprovalPhase = norm === 'approval' - const isPostMortemPhase = norm === 'postmortem' - const isCurrentlySelected = reviewer.phaseId && ((phase.id === reviewer.phaseId) || (phase.phaseId === reviewer.phaseId)) && !isSubmissionPhase - - // Collect phases already assigned to other reviewers (excluding current reviewer) - const assignedPhaseIds = new Set( - (challenge.reviewers || []) - .filter((r, i) => i !== index) - .map(r => r.phaseId) - .filter(id => id !== undefined && id !== null) - ) + {challenge.phases && challenge.phases + .filter(phase => { + const rawName = phase.name ? phase.name : '' + const phaseName = rawName.toLowerCase() + const norm = phaseName.replace(/[-\s]/g, '') + const isReviewPhase = phaseName.includes('review') + const isSubmissionPhase = phaseName.includes('submission') + const isScreeningPhase = norm === 'screening' || norm === 'checkpointscreening' + const isApprovalPhase = norm === 'approval' + const isPostMortemPhase = norm === 'postmortem' + const isCurrentlySelected = reviewer.phaseId && ((phase.id === reviewer.phaseId) || (phase.phaseId === reviewer.phaseId)) && !isSubmissionPhase + + // Collect phases already assigned to other reviewers (excluding current reviewer) + const assignedPhaseIds = new Set( + (challenge.reviewers || []) + .filter((r, i) => i !== index) + .map(r => r.phaseId) + .filter(id => id !== undefined && id !== null) + ) - // Exclude phases already assigned to other reviewers, except the currently selected phase - if (assignedPhaseIds.has(phase.phaseId || phase.id) && !isCurrentlySelected) { - return false - } + // Exclude phases already assigned to other reviewers, except the currently selected phase + if (assignedPhaseIds.has(phase.phaseId || phase.id) && !isCurrentlySelected) { + return false + } - // For AI reviewers, allow review, submission, and other required phases - // For member reviewers, allow review and other required phases - if (this.isAIReviewer(reviewer)) { - return ( - isReviewPhase || + // For AI reviewers, allow review, submission, and other required phases + // For member reviewers, allow review and other required phases + if (this.isAIReviewer(reviewer)) { + return ( + isReviewPhase || isSubmissionPhase || isScreeningPhase || isApprovalPhase || isPostMortemPhase || isCurrentlySelected - ) - } else { - return ( - isReviewPhase || + ) + } else { + return ( + isReviewPhase || isScreeningPhase || isApprovalPhase || isPostMortemPhase || isCurrentlySelected - ) - } - }) - .map(phase => ( - - ))} + ) + } + }) + .map(phase => ( + + ))} )} {!readOnly && challenge.submitTriggered && validationErrors.phaseId && ( From a1a80fc75dbfb694278583b385be41a07abdf429 Mon Sep 17 00:00:00 2001 From: Kiril Kartunov Date: Thu, 6 Nov 2025 16:25:45 +0200 Subject: [PATCH 3/7] Change tc-auth-lib dependency to use master branch --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 46f40f28..e1851241 100644 --- a/package.json +++ b/package.json @@ -114,7 +114,7 @@ "sass-loader": "^13.3.2", "standard": "^12.0.1", "style-loader": "^3.3.4", - "tc-auth-lib": "topcoder-platform/tc-auth-lib#1.0.4", + "tc-auth-lib": "topcoder-platform/tc-auth-lib#master", "terser": "^5.31.0", "terser-webpack-plugin": "^5.3.10", "topcoder-healthcheck-dropin": "^1.0.3", From 2a3b3911eee6cdde3314f44a648e9d27865173a4 Mon Sep 17 00:00:00 2001 From: Justin Gasper Date: Mon, 17 Nov 2025 15:14:24 +1100 Subject: [PATCH 4/7] Additional logging for login errors --- src/routes.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/routes.js b/src/routes.js index 61a2e197..e3a500d1 100644 --- a/src/routes.js +++ b/src/routes.js @@ -86,11 +86,8 @@ class Routes extends React.Component { getFreshToken().then((token) => { this.props.saveToken(token) }).catch((error) => { - if (process.env.NODE_ENV === 'development') { - console.error(error) - } else { - console.error('An unexpected error occurred while getting auth token') - } + const errorMessage = error && error.message ? error.message : error + console.error('An unexpected error occurred while getting auth token', errorMessage) const redirectBackToUrl = encodeURIComponent(window.location.origin + this.props.location.pathname + this.props.location.search) window.location = `${ACCOUNTS_APP_LOGIN_URL}?retUrl=${redirectBackToUrl}` }) From 387b20803a85e6185aaca0033efa77d6b8263f00 Mon Sep 17 00:00:00 2001 From: Justin Gasper Date: Mon, 17 Nov 2025 15:49:46 +1100 Subject: [PATCH 5/7] Fix to use 2.0 for auth lib that has less cookies --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e1851241..fc87fffb 100644 --- a/package.json +++ b/package.json @@ -114,7 +114,7 @@ "sass-loader": "^13.3.2", "standard": "^12.0.1", "style-loader": "^3.3.4", - "tc-auth-lib": "topcoder-platform/tc-auth-lib#master", + "tc-auth-lib": "topcoder-platform/tc-auth-lib#v2.0", "terser": "^5.31.0", "terser-webpack-plugin": "^5.3.10", "topcoder-healthcheck-dropin": "^1.0.3", From 3dac9af672440b116baf5e976441ba78e8d1a32f Mon Sep 17 00:00:00 2001 From: Hentry Martin Date: Mon, 17 Nov 2025 19:10:03 +0100 Subject: [PATCH 6/7] fix: remove unneccessary prop for ai reviewer --- .circleci/config.yml | 2 +- src/components/ChallengeEditor/index.js | 14 +++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 02fc2b25..39899074 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -160,7 +160,7 @@ workflows: context: org-global filters: &filters-dev branches: - only: ["develop"] + only: ["develop", "pm-2917"] # Production builds are exectuted only on tagged commits to the # master branch. diff --git a/src/components/ChallengeEditor/index.js b/src/components/ChallengeEditor/index.js index 2c6be99b..da51eb04 100644 --- a/src/components/ChallengeEditor/index.js +++ b/src/components/ChallengeEditor/index.js @@ -1314,9 +1314,21 @@ class ChallengeEditor extends Component { const { updateChallengeDetails, assignedMemberDetails: oldAssignedMember, projectDetail, challengeDetails } = this.props if (this.state.isSaving) return this.setState({ isSaving: true }, async () => { - const challenge = this.collectChallengeData(status) + let challenge = this.collectChallengeData(status) let newChallenge = _.cloneDeep(this.state.challenge) newChallenge.status = status + + if (challenge.reviewers && Array.isArray(challenge.reviewers)) { + challenge.reviewers = challenge.reviewers.map(reviewer => { + if (reviewer.isMemberReview === false) { + const copy = { ...reviewer } + delete copy.type + return copy + } + return reviewer + }) + } + try { const challengeId = this.getCurrentChallengeId() // state can have updated assigned member (in cases where user changes assignments without refreshing the page) From 33070c718387edc8138dd6b06c1385a1db122ec9 Mon Sep 17 00:00:00 2001 From: Hentry Martin Date: Mon, 17 Nov 2025 23:16:39 +0100 Subject: [PATCH 7/7] fix: exclude assigned phases for ai reviewers --- .../ChallengeEditor/ChallengeReviewer-Field/index.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/ChallengeEditor/ChallengeReviewer-Field/index.js b/src/components/ChallengeEditor/ChallengeReviewer-Field/index.js index b582fc57..218e6bf0 100644 --- a/src/components/ChallengeEditor/ChallengeReviewer-Field/index.js +++ b/src/components/ChallengeEditor/ChallengeReviewer-Field/index.js @@ -780,8 +780,9 @@ class ChallengeReviewerField extends Component { .filter(id => id !== undefined && id !== null) ) - // Exclude phases already assigned to other reviewers, except the currently selected phase - if (assignedPhaseIds.has(phase.phaseId || phase.id) && !isCurrentlySelected) { + // If current reviewer is a member review, allow selecting phases even if already assigned to others. + // Only exclude assigned phases for ai reviewers. + if (!!reviewer.isMemberReview && assignedPhaseIds.has(phase.phaseId || phase.id) && !isCurrentlySelected) { return false }