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(