Skip to content

Commit 0ff512f

Browse files
Merge pull request #1294 from doctorhilarius/self-service-fixes
Unassign copilot
2 parents 9e185ad + ce6fa30 commit 0ff512f

File tree

6 files changed

+42
-27
lines changed

6 files changed

+42
-27
lines changed

src/components/ChallengeEditor/ChallengeView/index.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ const ChallengeView = ({
3939
onCloseTask,
4040
projectPhases,
4141
assignYourselfCopilot,
42-
showRejectChallengeModal
42+
showRejectChallengeModal,
43+
loggedInUser
4344
}) => {
4445
const selectedType = _.find(metadata.challengeTypes, { id: challenge.typeId })
4546
const challengeTrack = _.find(metadata.challengeTracks, { id: challenge.trackId })
@@ -136,7 +137,7 @@ const ChallengeView = ({
136137
<CopilotField challenge={{
137138
copilot,
138139
selfService: challenge.legacy.selfService
139-
}} copilots={challengeResources} assignYourselfCopilot={assignYourselfCopilot} showRejectChallengeModal={showRejectChallengeModal} readOnly />
140+
}} copilots={challengeResources} assignYourselfCopilot={assignYourselfCopilot} showRejectChallengeModal={showRejectChallengeModal} readOnly loggedInUser={loggedInUser} />
140141
<div className={cn(styles.row, styles.topRow)}>
141142
<div className={styles.col}>
142143
<span><span
@@ -264,7 +265,8 @@ ChallengeView.propTypes = {
264265
onCloseTask: PropTypes.func,
265266
projectPhases: PropTypes.arrayOf(PropTypes.object),
266267
assignYourselfCopilot: PropTypes.func.isRequired,
267-
showRejectChallengeModal: PropTypes.func.isRequired
268+
showRejectChallengeModal: PropTypes.func.isRequired,
269+
loggedInUser: PropTypes.object
268270
}
269271

270272
export default withRouter(ChallengeView)

src/components/ChallengeEditor/ChallengeViewTabs/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,7 @@ const ChallengeViewTabs = ({
250250
assignYourselfCopilot={assignYourselfCopilot}
251251
showRejectChallengeModal={showRejectChallengeModal}
252252
onApproveChallenge={onApproveChallenge}
253+
loggedInUser={loggedInUser}
253254
/>
254255
)}
255256
{selectedTab === 1 && (

src/components/ChallengeEditor/Copilot-Field/Copilot-Field.module.scss

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
display: flex;
4545
flex-direction: row;
4646
flex-wrap: wrap;
47+
width: 100%;
4748

4849
div {
4950
margin-right: 13px;

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

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,23 @@
1-
import React from 'react'
2-
import PropTypes from 'prop-types'
3-
import { PrimaryButton } from '../../Buttons'
4-
import styles from './Copilot-Field.module.scss'
51
import cn from 'classnames'
62
import _ from 'lodash'
3+
import PropTypes from 'prop-types'
4+
import React from 'react'
5+
6+
import { PrimaryButton } from '../../Buttons'
77
import CopilotCard from '../../CopilotCard'
88

9-
const CopilotField = ({ copilots, challenge, onUpdateOthers, readOnly, assignYourselfCopilot }) => {
9+
import styles from './Copilot-Field.module.scss'
10+
11+
const CopilotField = ({ copilots, challenge, onUpdateOthers, readOnly, assignYourselfCopilot, loggedInUser }) => {
1012
let errMessage = 'Please set a copilot'
1113
const handleProperty = copilots.handle ? 'handle' : 'memberHandle'
1214
const selectedCopilot = _.find(copilots, { [handleProperty]: challenge.copilot })
1315
const selectedCopilotHandle = selectedCopilot ? selectedCopilot[handleProperty] : undefined
1416
const copilotFee = _.find(challenge.prizeSets, p => p.type === 'copilot', [])
1517
const selfService = challenge.selfService
18+
const copilotIsSelf = loggedInUser && selectedCopilotHandle === loggedInUser.handle
19+
const assignButtonText = `${selectedCopilot && copilotIsSelf ? 'Una' : 'A'}ssign Yourself`
20+
const showAssignButton = loggedInUser && (!selectedCopilotHandle || copilotIsSelf)
1621

1722
if (readOnly) {
1823
return (
@@ -22,11 +27,13 @@ const CopilotField = ({ copilots, challenge, onUpdateOthers, readOnly, assignYou
2227
</div>
2328
{(selectedCopilot || selfService) && (<div className={cn(styles.field, styles.col2)}>
2429
{(selectedCopilot && <CopilotCard copilot={selectedCopilot} selectedCopilot={challenge.copilot} key={selectedCopilotHandle} />)}
25-
{(selfService && !selectedCopilot && <PrimaryButton
26-
text='Assign Yourself'
27-
type='info'
28-
onClick={assignYourselfCopilot}
29-
/>)}
30+
{((selfService && showAssignButton) && <div>
31+
<PrimaryButton
32+
text={assignButtonText}
33+
type='info'
34+
onClick={assignYourselfCopilot}
35+
/>
36+
</div>)}
3037
</div>)}
3138
</div>
3239
)
@@ -67,7 +74,8 @@ CopilotField.propTypes = {
6774
challenge: PropTypes.shape().isRequired,
6875
onUpdateOthers: PropTypes.func,
6976
readOnly: PropTypes.bool,
70-
assignYourselfCopilot: PropTypes.func.isRequired
77+
assignYourselfCopilot: PropTypes.func.isRequired,
78+
loggedInUser: PropTypes.object
7179
}
7280

7381
export default CopilotField

src/components/ChallengeEditor/index.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1235,7 +1235,8 @@ class ChallengeEditor extends Component {
12351235
projectPhases,
12361236
challengeId,
12371237
assignYourselfCopilot,
1238-
challengeResources
1238+
challengeResources,
1239+
loggedInUser
12391240
} = this.props
12401241
if (_.isEmpty(challenge)) {
12411242
return <div>Error loading challenge</div>
@@ -1517,7 +1518,7 @@ class ChallengeEditor extends Component {
15171518
/>
15181519
)}
15191520
{projectDetail.version === 'v4' && <MilestoneField milestones={activeProjectMilestones} onUpdateSelect={this.onUpdateSelect} projectId={projectDetail.id} selectedMilestoneId={selectedMilestoneId} />}
1520-
<CopilotField challenge={challenge} copilots={copilotResources} onUpdateOthers={this.onUpdateOthers} assignYourselfCopilot={assignYourselfCopilot} />
1521+
<CopilotField challenge={challenge} copilots={copilotResources} onUpdateOthers={this.onUpdateOthers} assignYourselfCopilot={assignYourselfCopilot} loggedInUser={loggedInUser} />
15211522
<ReviewTypeField
15221523
reviewers={metadata.members}
15231524
challenge={challenge}

src/containers/ChallengeEditor/index.js

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,7 @@ import {
2828
partiallyUpdateChallengeDetails,
2929
deleteChallenge,
3030
createChallenge,
31-
replaceResourceInRole,
32-
createResource
31+
replaceResourceInRole
3332
} from '../../actions/challenges'
3433

3534
import { loadSubmissions } from '../../actions/challengeSubmissions'
@@ -338,23 +337,28 @@ class ChallengeEditor extends Component {
338337
}
339338

340339
async assignYourselfCopilot () {
341-
const { challengeDetails, loggedInUser, metadata, createResource } = this.props
340+
const { challengeDetails, loggedInUser, metadata, replaceResourceInRole } = this.props
342341

343-
// create the role resource
342+
// get the resource roles and new/old resource values
344343
const copilotRole = getResourceRoleByName(metadata.resourceRoles, 'Copilot')
345344
const approverRole = getResourceRoleByName(metadata.resourceRoles, 'Approver')
346345
const screenerRole = getResourceRoleByName(metadata.resourceRoles, 'Primary Screener')
347346
const copilotHandle = loggedInUser.handle
348-
await createResource(challengeDetails.id, copilotRole.id, copilotHandle)
349-
await createResource(challengeDetails.id, approverRole.id, copilotHandle)
350-
await createResource(challengeDetails.id, screenerRole.id, copilotHandle)
347+
const challengeId = challengeDetails.id
348+
const oldPilot = challengeDetails.legacy.selfServiceCopilot
349+
const newPilot = oldPilot === copilotHandle ? null : copilotHandle
350+
351+
// replace the roles
352+
await replaceResourceInRole(challengeId, copilotRole.id, newPilot, oldPilot)
353+
await replaceResourceInRole(challengeId, approverRole.id, newPilot, oldPilot)
354+
await replaceResourceInRole(challengeId, screenerRole.id, newPilot, oldPilot)
351355

352356
this.setState({
353357
challengeDetails: {
354358
...challengeDetails,
355359
legacy: {
356360
...challengeDetails.legacy,
357-
selfServiceCopilot: copilotHandle
361+
selfServiceCopilot: newPilot
358362
}
359363
}
360364
})
@@ -608,7 +612,6 @@ class ChallengeEditor extends Component {
608612
}
609613

610614
ChallengeEditor.propTypes = {
611-
createResource: PropTypes.func.isRequired,
612615
match: PropTypes.shape({
613616
path: PropTypes.string,
614617
params: PropTypes.shape({
@@ -713,8 +716,7 @@ const mapDispatchToProps = {
713716
deleteChallenge,
714717
createChallenge,
715718
replaceResourceInRole,
716-
loadProject,
717-
createResource
719+
loadProject
718720
}
719721

720722
export default withRouter(

0 commit comments

Comments
 (0)