Skip to content

Commit 93f960a

Browse files
authored
Merge pull request #1693 from topcoder-platform/pm-2456
fix(PM-2456): Assigned reviewers update and repopulation logic
2 parents ab56ef2 + f40c129 commit 93f960a

File tree

1 file changed

+69
-5
lines changed
  • src/components/ChallengeEditor/ChallengeReviewer-Field

1 file changed

+69
-5
lines changed

src/components/ChallengeEditor/ChallengeReviewer-Field/index.js

Lines changed: 69 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,14 @@ import styles from './ChallengeReviewer-Field.module.scss'
99
import { validateValue } from '../../../util/input-check'
1010
import AssignedMemberField from '../AssignedMember-Field'
1111
import { getResourceRoleByName } from '../../../util/tc'
12+
import { isEqual } from 'lodash'
13+
14+
const ResourceToPhaseNameMap = {
15+
Reviewer: 'Review',
16+
Approver: 'Approval',
17+
Screener: 'Screening',
18+
'Iterative Reviewer': 'Iterative Review'
19+
}
1220

1321
class ChallengeReviewerField extends Component {
1422
constructor (props) {
@@ -31,6 +39,8 @@ class ChallengeReviewerField extends Component {
3139
this.syncAssignmentsOnCountChange = this.syncAssignmentsOnCountChange.bind(this)
3240
this.handlePhaseChangeWithReassign = this.handlePhaseChangeWithReassign.bind(this)
3341
this.handleToggleShouldOpen = this.handleToggleShouldOpen.bind(this)
42+
this.updateAssignedMembers = this.updateAssignedMembers.bind(this)
43+
this.doUpdateAssignedMembers = true
3444
}
3545

3646
isAIReviewer (reviewer) {
@@ -95,8 +105,50 @@ class ChallengeReviewerField extends Component {
95105
this.loadWorkflows()
96106
}
97107

108+
updateAssignedMembers (challengeResources, challenge) {
109+
const reviewersWithPhaseName = challenge.reviewers.map(item => {
110+
const phase = challenge.phases && challenge.phases.find(p => p.phaseId === item.phaseId)
111+
return {
112+
...item,
113+
name: phase.name
114+
}
115+
})
116+
117+
const reviewerIndex = {}
118+
reviewersWithPhaseName.forEach((reviewer, index) => {
119+
if (!reviewerIndex[reviewer.name]) {
120+
reviewerIndex[reviewer.name] = index
121+
}
122+
})
123+
124+
const assignedMembers = {}
125+
126+
challengeResources.forEach((resource) => {
127+
const index = reviewerIndex[ResourceToPhaseNameMap[resource.roleName]]
128+
129+
if (!assignedMembers[index]) {
130+
assignedMembers[index] = [{
131+
handle: resource.memberHandle,
132+
userId: resource.memberId
133+
}]
134+
return
135+
}
136+
137+
assignedMembers[index].push({
138+
handle: resource.memberHandle,
139+
userId: resource.memberId
140+
})
141+
})
142+
143+
if (!isEqual(this.state.assignedMembers, assignedMembers)) {
144+
this.setState({
145+
assignedMembers
146+
})
147+
}
148+
}
149+
98150
componentDidUpdate (prevProps) {
99-
const { challenge } = this.props
151+
const { challenge, challengeResources } = this.props
100152
const prevChallenge = prevProps.challenge
101153

102154
if (challenge && prevChallenge &&
@@ -106,6 +158,10 @@ class ChallengeReviewerField extends Component {
106158
}
107159
}
108160

161+
if (challenge && this.doUpdateAssignedMembers) {
162+
this.updateAssignedMembers(challengeResources, challenge)
163+
}
164+
109165
if (challenge && prevChallenge &&
110166
(challenge.typeId !== prevChallenge.typeId || challenge.trackId !== prevChallenge.trackId)) {
111167
this.loadDefaultReviewers()
@@ -157,13 +213,18 @@ class ChallengeReviewerField extends Component {
157213
const oldHandle = prevMember && prevMember.handle
158214
// replaceResourceInRole gracefully handles deletion when newMember is falsy
159215
replaceResourceInRole(challenge.id, role.id, newMemberHandle, oldHandle)
160-
216+
this.doUpdateAssignedMembers = false
161217
return {
162218
assignedMembers: {
163219
...prev.assignedMembers,
164220
[reviewerIndex]: newHandles
165221
}
166222
}
223+
}, () => {
224+
const n = this
225+
setTimeout(() => {
226+
n.doUpdateAssignedMembers = true
227+
}, 1000)
167228
})
168229
}
169230

@@ -343,7 +404,8 @@ class ChallengeReviewerField extends Component {
343404
incrementalCoefficient: (defaultReviewer && defaultReviewer.incrementalCoefficient) || 0,
344405
type: isAIReviewer
345406
? undefined
346-
: (defaultReviewer && defaultReviewer.opportunityType) || REVIEW_OPPORTUNITY_TYPES.REGULAR_REVIEW
407+
: (defaultReviewer && defaultReviewer.opportunityType) || REVIEW_OPPORTUNITY_TYPES.REGULAR_REVIEW,
408+
shouldOpenOpportunity: false
347409
}
348410

349411
if (isAIReviewer) {
@@ -901,12 +963,14 @@ ChallengeReviewerField.propTypes = {
901963
loadWorkflows: PropTypes.func.isRequired,
902964
replaceResourceInRole: PropTypes.func.isRequired,
903965
createResource: PropTypes.func.isRequired,
904-
deleteResource: PropTypes.func.isRequired
966+
deleteResource: PropTypes.func.isRequired,
967+
challengeResources: PropTypes.array.isRequired
905968
}
906969

907970
const mapStateToProps = (state) => ({
908971
metadata: state.challenges.metadata || {},
909-
isLoading: state.challenges.isLoading
972+
isLoading: state.challenges.isLoading,
973+
challengeResources: state.challenges.challengeResources
910974
})
911975

912976
const mapDispatchToProps = {

0 commit comments

Comments
 (0)