@@ -722,44 +722,57 @@ class ChallengeReviewerField extends Component {
722722 onChange = { ( e ) => this . updateReviewer ( index , 'phaseId' , e . target . value ) }
723723 >
724724 < option value = '' > Select Phase</ option >
725- { challenge . phases && challenge . phases
726- . filter ( phase => {
727- const rawName = phase . name ? phase . name : ''
728- const phaseName = rawName . toLowerCase ( )
729- const norm = phaseName . replace ( / [ - \s ] / g, '' )
730- const isReviewPhase = phaseName . includes ( 'review' )
731- const isSubmissionPhase = phaseName . includes ( 'submission' )
732- const isScreeningPhase = norm === 'screening' || norm === 'checkpointscreening'
733- const isApprovalPhase = norm === 'approval'
734- const isPostMortemPhase = norm === 'postmortem'
735- const isCurrentlySelected = reviewer . phaseId && ( ( phase . id === reviewer . phaseId ) || ( phase . phaseId === reviewer . phaseId ) ) && ! isSubmissionPhase
736-
737- // For AI reviewers, allow review, submission, and other required phases
738- // For member reviewers, allow review and other required phases
739- if ( this . isAIReviewer ( reviewer ) ) {
740- return (
741- isReviewPhase ||
742- isSubmissionPhase ||
743- isScreeningPhase ||
744- isApprovalPhase ||
745- isPostMortemPhase ||
746- isCurrentlySelected
747- )
748- } else {
749- return (
750- isReviewPhase ||
751- isScreeningPhase ||
752- isApprovalPhase ||
753- isPostMortemPhase ||
754- isCurrentlySelected
755- )
756- }
757- } )
758- . map ( phase => (
759- < option key = { phase . id || phase . phaseId } value = { phase . phaseId || phase . id } >
760- { phase . name || `Phase ${ phase . phaseId || phase . id } ` }
761- </ option >
762- ) ) }
725+ { challenge . phases && challenge . phases
726+ . filter ( phase => {
727+ const rawName = phase . name ? phase . name : ''
728+ const phaseName = rawName . toLowerCase ( )
729+ const norm = phaseName . replace ( / [ - \s ] / g, '' )
730+ const isReviewPhase = phaseName . includes ( 'review' )
731+ const isSubmissionPhase = phaseName . includes ( 'submission' )
732+ const isScreeningPhase = norm === 'screening' || norm === 'checkpointscreening'
733+ const isApprovalPhase = norm === 'approval'
734+ const isPostMortemPhase = norm === 'postmortem'
735+ const isCurrentlySelected = reviewer . phaseId && ( ( phase . id === reviewer . phaseId ) || ( phase . phaseId === reviewer . phaseId ) ) && ! isSubmissionPhase
736+
737+ // Collect phases already assigned to other reviewers (excluding current reviewer)
738+ const assignedPhaseIds = new Set (
739+ ( challenge . reviewers || [ ] )
740+ . filter ( ( r , i ) => i !== index )
741+ . map ( r => r . phaseId )
742+ . filter ( id => id !== undefined && id !== null )
743+ )
744+
745+ // Exclude phases already assigned to other reviewers, except the currently selected phase
746+ if ( assignedPhaseIds . has ( phase . phaseId || phase . id ) && ! isCurrentlySelected ) {
747+ return false
748+ }
749+
750+ // For AI reviewers, allow review, submission, and other required phases
751+ // For member reviewers, allow review and other required phases
752+ if ( this . isAIReviewer ( reviewer ) ) {
753+ return (
754+ isReviewPhase ||
755+ isSubmissionPhase ||
756+ isScreeningPhase ||
757+ isApprovalPhase ||
758+ isPostMortemPhase ||
759+ isCurrentlySelected
760+ )
761+ } else {
762+ return (
763+ isReviewPhase ||
764+ isScreeningPhase ||
765+ isApprovalPhase ||
766+ isPostMortemPhase ||
767+ isCurrentlySelected
768+ )
769+ }
770+ } )
771+ . map ( phase => (
772+ < option key = { phase . id || phase . phaseId } value = { phase . phaseId || phase . id } >
773+ { phase . name || `Phase ${ phase . phaseId || phase . id } ` }
774+ </ option >
775+ ) ) }
763776 </ select >
764777 ) }
765778 { ! readOnly && challenge . submitTriggered && validationErrors . phaseId && (
0 commit comments