diff --git a/package-lock.json b/package-lock.json index 2c61a7d0..4d9c938e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14513,6 +14513,96 @@ "react-lifecycles-compat": "^3.0.4" } }, + "rc-dropdown": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-3.2.2.tgz", + "integrity": "sha512-oA9VYYg+jQaPRdFoYFfBn5EAQk2NlL6H0vR2v6JG/8i4HEfUq8p1TTt6HyQ/dGxLe8lpnK+nM7WCjgZT/cpSRQ==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6", + "rc-trigger": "^5.0.4" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz", + "integrity": "sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "rc-align": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-4.0.11.tgz", + "integrity": "sha512-n9mQfIYQbbNTbefyQnRHZPWuTEwG1rY4a9yKlIWHSTbgwI+XUMGRYd0uJ5pE2UbrNX0WvnMBA1zJ3Lrecpra/A==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "dom-align": "^1.7.0", + "lodash": "^4.17.21", + "rc-util": "^5.3.0", + "resize-observer-polyfill": "^1.5.1" + } + }, + "rc-trigger": { + "version": "5.2.10", + "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-5.2.10.tgz", + "integrity": "sha512-FkUf4H9BOFDaIwu42fvRycXMAvkttph9AlbCZXssZDVzz2L+QZ0ERvfB/4nX3ZFPh1Zd+uVGr1DEDeXxq4J1TA==", + "requires": { + "@babel/runtime": "^7.11.2", + "classnames": "^2.2.6", + "rc-align": "^4.0.0", + "rc-motion": "^2.0.0", + "rc-util": "^5.5.0" + } + }, + "rc-util": { + "version": "5.16.1", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.16.1.tgz", + "integrity": "sha512-kSCyytvdb3aRxQacS/71ta6c+kBWvM1v8/2h9d/HaNWauc3qB8pLnF20PJ8NajkNN8gb+rR1l0eWO+D4Pz+LLQ==", + "requires": { + "@babel/runtime": "^7.12.5", + "react-is": "^16.12.0", + "shallowequal": "^1.1.0" + } + } + } + }, + "rc-motion": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.4.4.tgz", + "integrity": "sha512-ms7n1+/TZQBS0Ydd2Q5P4+wJTSOrhIrwNxLXCZpR7Fa3/oac7Yi803HDALc2hLAKaCTQtw9LmQeB58zcwOsqlQ==", + "requires": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.2.1" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz", + "integrity": "sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "rc-util": { + "version": "5.16.1", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.16.1.tgz", + "integrity": "sha512-kSCyytvdb3aRxQacS/71ta6c+kBWvM1v8/2h9d/HaNWauc3qB8pLnF20PJ8NajkNN8gb+rR1l0eWO+D4Pz+LLQ==", + "requires": { + "@babel/runtime": "^7.12.5", + "react-is": "^16.12.0", + "shallowequal": "^1.1.0" + } + } + } + }, "rc-time-picker": { "version": "3.7.3", "resolved": "https://registry.npmjs.org/rc-time-picker/-/rc-time-picker-3.7.3.tgz", @@ -15388,6 +15478,11 @@ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, + "resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, "resolve": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", diff --git a/src/actions/challenges.js b/src/actions/challenges.js index ffc82956..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' @@ -58,7 +59,7 @@ import { removeChallengeFromPhaseProduct, saveChallengeAsPhaseProduct } from '.. /** * Loads active challenges of project by page */ -export function loadChallengesByPage (page, projectId, status, filterChallengeName = null) { +export function loadChallengesByPage (page, projectId, status, filterChallengeName = null, selfService = false, userHandle = null) { return (dispatch, getState) => { dispatch({ type: LOAD_CHALLENGES_PENDING, @@ -85,6 +86,12 @@ export function loadChallengesByPage (page, projectId, status, filterChallengeNa } else if (!(_.isInteger(projectId) && projectId > 0)) { filters['status'] = 'Active' } + if (selfService) { + filters.selfService = true + if (userHandle && filters.status.toUpperCase() !== CHALLENGE_STATUS.DRAFT) { + filters.selfServiceCopilot = userHandle + } + } return fetchChallenges(filters, { page, diff --git a/src/actions/sidebar.js b/src/actions/sidebar.js index 1abd3c90..2a463df4 100644 --- a/src/actions/sidebar.js +++ b/src/actions/sidebar.js @@ -52,6 +52,18 @@ export function loadProjects (filterProjectName = '', myProjects = true) { } } +/** + * Unloads projects of the authenticated user + */ +export function unloadProjects () { + return (dispatch) => { + dispatch({ + type: LOAD_PROJECTS_SUCCESS, + projects: [] + }) + } +} + /** * Reset active params. e.g activeProjectId */ diff --git a/src/components/ChallengeEditor/ChallengeSchedule-Field/index.js b/src/components/ChallengeEditor/ChallengeSchedule-Field/index.js index 8fca8678..328477d2 100644 --- a/src/components/ChallengeEditor/ChallengeSchedule-Field/index.js +++ b/src/components/ChallengeEditor/ChallengeSchedule-Field/index.js @@ -100,14 +100,12 @@ class ChallengeScheduleField extends Component { phase.scheduledStartDate = startDate phase.scheduledEndDate = moment(startDate).add(phase.duration || 0, 'hours').toDate() phase.actualStartDate = phase.scheduledStartDate - phase.actualEndDate = phase.scheduledEndDate } else { const preIndex = _.findIndex(phases, (p) => p.id === phase.predecessor) // `Invalid phase predecessor: ${phase.predecessor}` phase.scheduledStartDate = phases[preIndex].scheduledEndDate phase.scheduledEndDate = moment(phase.scheduledStartDate).add(phase.duration || 0, 'hours').toDate() phase.actualStartDate = phase.scheduledStartDate - phase.actualEndDate = phase.scheduledEndDate } } diff --git a/src/components/ChallengeEditor/ChallengeView/index.js b/src/components/ChallengeEditor/ChallengeView/index.js index fa9adddb..aa7141b3 100644 --- a/src/components/ChallengeEditor/ChallengeView/index.js +++ b/src/components/ChallengeEditor/ChallengeView/index.js @@ -37,7 +37,10 @@ const ChallengeView = ({ enableEdit, onLaunchChallenge, onCloseTask, - projectPhases + projectPhases, + assignYourselfCopilot, + showRejectChallengeModal, + loggedInUser }) => { const selectedType = _.find(metadata.challengeTypes, { id: challenge.typeId }) const challengeTrack = _.find(metadata.challengeTracks, { id: challenge.trackId }) @@ -74,7 +77,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 @@ -103,18 +106,18 @@ const ChallengeView = ({ {selectedMilestone && -
You have no challenges at the moment
) : (Please select a project to view challenges
) - } +{noChallengeMessage}