@@ -760,44 +760,57 @@ class ChallengeReviewerField extends Component {
760760 onChange = { ( e ) => this . updateReviewer ( index , 'phaseId' , e . target . value ) }
761761 >
762762 < option value = '' > Select Phase</ option >
763- { challenge . phases && challenge . phases
764- . filter ( phase => {
765- const rawName = phase . name ? phase . name : ''
766- const phaseName = rawName . toLowerCase ( )
767- const norm = phaseName . replace ( / [ - \s ] / g, '' )
768- const isReviewPhase = phaseName . includes ( 'review' )
769- const isSubmissionPhase = phaseName . includes ( 'submission' )
770- const isScreeningPhase = norm === 'screening' || norm === 'checkpointscreening'
771- const isApprovalPhase = norm === 'approval'
772- const isPostMortemPhase = norm === 'postmortem'
773- const isCurrentlySelected = reviewer . phaseId && ( ( phase . id === reviewer . phaseId ) || ( phase . phaseId === reviewer . phaseId ) ) && ! isSubmissionPhase
774-
775- // For AI reviewers, allow review, submission, and other required phases
776- // For member reviewers, allow review and other required phases
777- if ( this . isAIReviewer ( reviewer ) ) {
778- return (
779- isReviewPhase ||
780- isSubmissionPhase ||
781- isScreeningPhase ||
782- isApprovalPhase ||
783- isPostMortemPhase ||
784- isCurrentlySelected
785- )
786- } else {
787- return (
788- isReviewPhase ||
789- isScreeningPhase ||
790- isApprovalPhase ||
791- isPostMortemPhase ||
792- isCurrentlySelected
793- )
794- }
795- } )
796- . map ( phase => (
797- < option key = { phase . id || phase . phaseId } value = { phase . phaseId || phase . id } >
798- { phase . name || `Phase ${ phase . phaseId || phase . id } ` }
799- </ option >
800- ) ) }
763+ { challenge . phases && challenge . phases
764+ . filter ( phase => {
765+ const rawName = phase . name ? phase . name : ''
766+ const phaseName = rawName . toLowerCase ( )
767+ const norm = phaseName . replace ( / [ - \s ] / g, '' )
768+ const isReviewPhase = phaseName . includes ( 'review' )
769+ const isSubmissionPhase = phaseName . includes ( 'submission' )
770+ const isScreeningPhase = norm === 'screening' || norm === 'checkpointscreening'
771+ const isApprovalPhase = norm === 'approval'
772+ const isPostMortemPhase = norm === 'postmortem'
773+ const isCurrentlySelected = reviewer . phaseId && ( ( phase . id === reviewer . phaseId ) || ( phase . phaseId === reviewer . phaseId ) ) && ! isSubmissionPhase
774+
775+ // Collect phases already assigned to other reviewers (excluding current reviewer)
776+ const assignedPhaseIds = new Set (
777+ ( challenge . reviewers || [ ] )
778+ . filter ( ( r , i ) => i !== index )
779+ . map ( r => r . phaseId )
780+ . filter ( id => id !== undefined && id !== null )
781+ )
782+
783+ // Exclude phases already assigned to other reviewers, except the currently selected phase
784+ if ( assignedPhaseIds . has ( phase . phaseId || phase . id ) && ! isCurrentlySelected ) {
785+ return false
786+ }
787+
788+ // For AI reviewers, allow review, submission, and other required phases
789+ // For member reviewers, allow review and other required phases
790+ if ( this . isAIReviewer ( reviewer ) ) {
791+ return (
792+ isReviewPhase ||
793+ isSubmissionPhase ||
794+ isScreeningPhase ||
795+ isApprovalPhase ||
796+ isPostMortemPhase ||
797+ isCurrentlySelected
798+ )
799+ } else {
800+ return (
801+ isReviewPhase ||
802+ isScreeningPhase ||
803+ isApprovalPhase ||
804+ isPostMortemPhase ||
805+ isCurrentlySelected
806+ )
807+ }
808+ } )
809+ . map ( phase => (
810+ < option key = { phase . id || phase . phaseId } value = { phase . phaseId || phase . id } >
811+ { phase . name || `Phase ${ phase . phaseId || phase . id } ` }
812+ </ option >
813+ ) ) }
801814 </ select >
802815 ) }
803816 { ! readOnly && challenge . submitTriggered && validationErrors . phaseId && (
0 commit comments