diff --git a/src/actions/challenges.js b/src/actions/challenges.js index e41678fe..7c7e3d66 100644 --- a/src/actions/challenges.js +++ b/src/actions/challenges.js @@ -46,7 +46,8 @@ import { DELETE_CHALLENGE_PENDING, DELETE_CHALLENGE_SUCCESS, DELETE_CHALLENGE_FAILURE, - LOAD_CHALLENGE_RESOURCES + LOAD_CHALLENGE_RESOURCES, + CHALLENGE_STATUS } from '../config/constants' import { loadProject } from './projects' import { removeChallengeFromPhaseProduct, saveChallengeAsPhaseProduct } from '../services/projects' @@ -87,7 +88,7 @@ export function loadChallengesByPage (page, projectId, status, filterChallengeNa } if (selfService) { filters.selfService = true - if (userHandle) { + if (userHandle && filters.status.toUpperCase() !== CHALLENGE_STATUS.DRAFT) { filters.selfServiceCopilot = userHandle } } diff --git a/src/components/ChallengeEditor/ChallengeView/index.js b/src/components/ChallengeEditor/ChallengeView/index.js index 761bbe29..fab8d15c 100644 --- a/src/components/ChallengeEditor/ChallengeView/index.js +++ b/src/components/ChallengeEditor/ChallengeView/index.js @@ -38,7 +38,8 @@ const ChallengeView = ({ onLaunchChallenge, onCloseTask, projectPhases, - assignYourselfCopilit + assignYourselfCopilot, + showRejectChallengeModal }) => { const selectedType = _.find(metadata.challengeTypes, { id: challenge.typeId }) const challengeTrack = _.find(metadata.challengeTracks, { id: challenge.trackId }) @@ -75,7 +76,7 @@ const ChallengeView = ({ const reviewerFromResources = reviewerResource ? reviewerResource.memberHandle : '' let copilot, reviewer if (challenge) { - copilot = challenge.copilot + copilot = challenge.copilot || (challenge.legacy && challenge.legacy.selfServiceCopilot) reviewer = challenge.reviewer } copilot = copilot || copilotFromResources @@ -135,7 +136,7 @@ const ChallengeView = ({ + }} copilots={metadata.members} assignYourselfCopilot={assignYourselfCopilot} showRejectChallengeModal={showRejectChallengeModal} readOnly />
{ const [selectedTab, setSelectedTab] = useState(0) @@ -84,6 +86,7 @@ const ChallengeViewTabs = ({ const isSelfService = challenge.legacy.selfService const isDraft = challenge.status.toUpperCase() === CHALLENGE_STATUS.DRAFT const launchText = `${isSelfService && isDraft ? 'Approve and ' : ''}Launch` + const isCopilot = challenge.legacy.selfServiceCopilot === loggedInUser.handle return (
@@ -112,9 +115,9 @@ const ChallengeViewTabs = ({ styles.actionButtonsRight )} > - {(challenge.status === 'Draft' || challenge.status === 'New') && !isSelfService && + {(isDraft || challenge.status === 'New') && !isSelfService && (
)} - {challenge.status === 'Draft' && ( + {isDraft && (!isSelfService || isCopilot) && (
{challenge.legacyId || isTask ? ( )} - {isSelfService && isDraft && - ( + {isSelfService && isDraft && isCopilot && ( +
- )} +
+ )}
@@ -222,7 +226,8 @@ const ChallengeViewTabs = ({ onLaunchChallenge={onLaunchChallenge} onCloseTask={onCloseTask} projectPhases={projectPhases} - assignYourselfCopilit={assignYourselfCopilit} + assignYourselfCopilot={assignYourselfCopilot} + showRejectChallengeModal={showRejectChallengeModal} /> )} {selectedTab === 1 && ( @@ -260,7 +265,9 @@ ChallengeViewTabs.propTypes = { cancelChallenge: PropTypes.func.isRequired, onCloseTask: PropTypes.func, projectPhases: PropTypes.arrayOf(PropTypes.object), - assignYourselfCopilit: PropTypes.func.isRequired + assignYourselfCopilot: PropTypes.func.isRequired, + showRejectChallengeModal: PropTypes.func.isRequired, + loggedInUser: PropTypes.object.isRequired } export default ChallengeViewTabs diff --git a/src/components/ChallengeEditor/Copilot-Field/index.js b/src/components/ChallengeEditor/Copilot-Field/index.js index 9e89c7dd..31031b20 100644 --- a/src/components/ChallengeEditor/Copilot-Field/index.js +++ b/src/components/ChallengeEditor/Copilot-Field/index.js @@ -6,7 +6,7 @@ import cn from 'classnames' import _ from 'lodash' import CopilotCard from '../../CopilotCard' -const CopilotField = ({ copilots, challenge, onUpdateOthers, readOnly, assignYourselfCopilit }) => { +const CopilotField = ({ copilots, challenge, onUpdateOthers, readOnly, assignYourselfCopilot }) => { let errMessage = 'Please set a copilot' const selectedCopilot = _.find(copilots, { handle: challenge.copilot }) const copilotFee = _.find(challenge.prizeSets, p => p.type === 'copilot', []) @@ -20,10 +20,10 @@ const CopilotField = ({ copilots, challenge, onUpdateOthers, readOnly, assignYou
{(selectedCopilot || selfService) && (
{(selectedCopilot && )} - {(selfService && )}
)}
@@ -65,7 +65,7 @@ CopilotField.propTypes = { challenge: PropTypes.shape().isRequired, onUpdateOthers: PropTypes.func, readOnly: PropTypes.bool, - assignYourselfCopilit: PropTypes.func.isRequired + assignYourselfCopilot: PropTypes.func.isRequired } export default CopilotField diff --git a/src/components/ChallengeEditor/index.js b/src/components/ChallengeEditor/index.js index 5d2958b8..099ee7ad 100644 --- a/src/components/ChallengeEditor/index.js +++ b/src/components/ChallengeEditor/index.js @@ -1233,7 +1233,8 @@ class ChallengeEditor extends Component { projectDetail, attachments, projectPhases, - challengeId + challengeId, + assignYourselfCopilot } = this.props if (_.isEmpty(challenge)) { return
Error loading challenge
@@ -1514,7 +1515,7 @@ class ChallengeEditor extends Component { /> )} {projectDetail.version === 'v4' && } - + const challengeId = _.get(match.params, 'challengeId', null) @@ -397,11 +442,36 @@ class ChallengeEditor extends Component { onClose={this.closeSuccessModal} /> ) + const rejectModal = ( + +
+
Reject Challenge
+ Please provide a reason for rejecting "{challengeDetails.name}?" +
+
+ +
+
+ +
+
+
+
+ ) return (
{showLaunchModal && activateModal} {showCloseTaskModal && closeTaskModal} {showSuccessModal && successModal} + {showRejectModal && rejectModal} )} /> @@ -468,6 +541,7 @@ class ChallengeEditor extends Component { deleteChallenge={deleteChallenge} loggedInUser={loggedInUser} projectPhases={projectPhases} + assignYourselfCopilot={this.assignYourselfCopilot} /> )} /> @@ -493,7 +567,9 @@ class ChallengeEditor extends Component { enableEdit={enableEdit} onLaunchChallenge={this.onLaunchChallenge} onCloseTask={this.onCloseTask} - assignYourselfCopilit={this.assignYourselfCopilit} + assignYourselfCopilot={this.assignYourselfCopilot} + showRejectChallengeModal={this.showRejectChallengeModal} + loggedInUser={loggedInUser} /> )} /> @@ -503,6 +579,7 @@ class ChallengeEditor extends Component { } ChallengeEditor.propTypes = { + createResource: PropTypes.func.isRequired, match: PropTypes.shape({ path: PropTypes.string, params: PropTypes.shape({ @@ -549,7 +626,8 @@ ChallengeEditor.propTypes = { loadProject: PropTypes.func, projectPhases: PropTypes.arrayOf(PropTypes.object), isProjectPhasesLoading: PropTypes.bool, - assignYourselfCopilit: PropTypes.func.isRequired + rejectChallenge: PropTypes.func.isRequired, + showRejectChallengeModal: PropTypes.func // members: PropTypes.arrayOf(PropTypes.shape()) } @@ -607,7 +685,8 @@ const mapDispatchToProps = { deleteChallenge, createChallenge, replaceResourceInRole, - loadProject + loadProject, + createResource } export default withRouter(