Skip to content

Commit ab2d4cf

Browse files
committed
Revert "Merge branch 'develop' into cf-jan-2021"
This reverts commit ce7f7cf, reversing changes made to ca73946.
1 parent ce7f7cf commit ab2d4cf

File tree

12 files changed

+190
-20
lines changed

12 files changed

+190
-20
lines changed

src/actions/challenges.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import {
1616
fetchGroupDetail,
1717
updateChallenge,
1818
patchChallenge,
19+
deleteChallenge as deleteChallengeAPI,
1920
createChallenge as createChallengeAPI,
2021
createResource as createResourceAPI,
2122
deleteResource as deleteResourceAPI
@@ -39,6 +40,9 @@ import {
3940
CREATE_CHALLENGE_PENDING,
4041
CREATE_CHALLENGE_SUCCESS,
4142
CREATE_CHALLENGE_FAILURE,
43+
DELETE_CHALLENGE_PENDING,
44+
DELETE_CHALLENGE_SUCCESS,
45+
DELETE_CHALLENGE_FAILURE,
4246
LOAD_CHALLENGE_RESOURCES
4347
} from '../config/constants'
4448
import { loadProject } from './projects'
@@ -276,6 +280,26 @@ export function partiallyUpdateChallengeDetails (challengeId, partialChallengeDe
276280
}
277281
}
278282

283+
export function deleteChallenge (challengeId) {
284+
return async (dispatch) => {
285+
dispatch({
286+
type: DELETE_CHALLENGE_PENDING
287+
})
288+
289+
return deleteChallengeAPI(challengeId).then((challenge) => {
290+
return dispatch({
291+
type: DELETE_CHALLENGE_SUCCESS,
292+
challengeDetails: challenge
293+
})
294+
}).catch((error) => {
295+
dispatch({
296+
type: DELETE_CHALLENGE_FAILURE
297+
})
298+
throw error
299+
})
300+
}
301+
}
302+
279303
export function loadTimelineTemplates () {
280304
return async (dispatch) => {
281305
const timelineTemplates = await fetchTimelineTemplates()

src/components/ChallengeEditor/ChallengeEditor.module.scss

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@
241241
.actionButtons {
242242
position: absolute;
243243
top: 30px;
244-
a {
244+
a,button {
245245
height: 40px;
246246
}
247247
}
@@ -251,7 +251,13 @@
251251
}
252252

253253
.actionButtonsRight {
254+
display: flex;
255+
align-items: center;
254256
right: 20px;
257+
258+
button {
259+
margin-right: 20px;
260+
}
255261
}
256262

257263
.buttonContainer {

src/components/ChallengeEditor/index.js

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ class ChallengeEditor extends Component {
6868
super(props)
6969
this.state = {
7070
isLaunch: false,
71+
isDeleteLaunch: false,
7172
isConfirm: false,
7273
isClose: false,
7374
isOpenAdvanceSettings: false,
@@ -122,6 +123,8 @@ class ChallengeEditor extends Component {
122123
this.getAvailableTimelineTemplates = this.getAvailableTimelineTemplates.bind(this)
123124
this.autoUpdateChallengeThrottled = _.throttle(this.validateAndAutoUpdateChallenge.bind(this), 3000) // 3s
124125
this.updateResource = this.updateResource.bind(this)
126+
this.onDeleteChallenge = this.onDeleteChallenge.bind(this)
127+
this.deleteModalLaunch = this.deleteModalLaunch.bind(this)
125128
}
126129

127130
componentDidMount () {
@@ -132,6 +135,27 @@ class ChallengeEditor extends Component {
132135
this.resetChallengeData(this.setState.bind(this))
133136
}
134137

138+
deleteModalLaunch () {
139+
if (!this.state.isDeleteLaunch) {
140+
this.setState({ isDeleteLaunch: true })
141+
}
142+
}
143+
144+
async onDeleteChallenge () {
145+
const { deleteChallenge, challengeDetails, history } = this.props
146+
try {
147+
this.setState({ isSaving: true })
148+
// Call action to delete the challenge
149+
await deleteChallenge(challengeDetails.id)
150+
this.setState({ isSaving: false })
151+
this.resetModal()
152+
history.push(`/projects/${challengeDetails.projectId}/challenges`)
153+
} catch (e) {
154+
const error = _.get(e, 'response.data.message', 'Unable to Delete the challenge')
155+
this.setState({ isSaving: false, error })
156+
}
157+
}
158+
135159
/**
136160
* Validates challenge and if its valid calling an autosave method
137161
*
@@ -209,7 +233,7 @@ class ChallengeEditor extends Component {
209233
}
210234

211235
resetModal () {
212-
this.setState({ isLoading: false, isConfirm: false, isLaunch: false, error: null, isCloseTask: false })
236+
this.setState({ isLoading: false, isConfirm: false, isLaunch: false, error: null, isCloseTask: false, isDeleteLaunch: false })
213237
}
214238

215239
/**
@@ -1476,6 +1500,7 @@ class ChallengeEditor extends Component {
14761500
</div>
14771501
<div className={styles.title}>{getTitle(isNew)}</div>
14781502
<div className={cn(styles.actionButtons, styles.actionButtonsRight)}>
1503+
{this.props.challengeDetails.status === 'New' && <PrimaryButton text={'Delete'} type={'danger'} onClick={this.deleteModalLaunch} />}
14791504
<PrimaryButton text={'Back'} type={'info'} submit link={`/projects/${projectDetail.id}/challenges`} />
14801505
</div>
14811506
<div className={styles.textRequired}>* Required</div>

src/components/ChallengesComponent/ChallengeCard/ChallengeCard.module.scss

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,31 @@
257257
}
258258
}
259259

260+
.deleteButton {
261+
height: 22px;
262+
width: 86px;
263+
border-radius: 11.5px;
264+
display: flex;
265+
justify-content: center;
266+
align-items: center;
267+
background-color: $tc-red;
268+
border-color: $tc-red;
269+
cursor: pointer;
270+
271+
span {
272+
@include roboto;
273+
274+
font-size: 14px;
275+
font-weight: 400;
276+
line-height: 17px;
277+
color: $white;
278+
text-transform: capitalize;
279+
display: flex;
280+
justify-content: center;
281+
align-items: center;
282+
}
283+
}
284+
260285
.icon {
261286
vertical-align: bottom;
262287
}

src/components/ChallengesComponent/ChallengeCard/index.js

Lines changed: 49 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -96,14 +96,20 @@ const getPhaseInfo = (c) => {
9696
* @param onUpdateLaunch
9797
* @returns {*}
9898
*/
99-
const hoverComponents = (challenge, onUpdateLaunch) => {
99+
const hoverComponents = (challenge, onUpdateLaunch, deleteModalLaunch) => {
100100
const communityAppUrl = `${COMMUNITY_APP_URL}/challenges/${challenge.id}`
101101
const directUrl = `${DIRECT_PROJECT_URL}/contest/detail?projectId=${challenge.legacyId}`
102102
const orUrl = `${ONLINE_REVIEW_URL}/review/actions/ViewProjectDetails?pid=${challenge.legacyId}`
103103

104104
// NEW projects never have Legacy challenge created, so don't show links and "Activate" button for them at all
105105
if (challenge.status.toUpperCase() === CHALLENGE_STATUS.NEW) {
106-
return null
106+
if (challenge.status.toUpperCase() === CHALLENGE_STATUS.NEW) {
107+
return (
108+
<button className={styles.deleteButton} onClick={deleteModalLaunch}>
109+
<span>Delete</span>
110+
</button>
111+
)
112+
}
107113
}
108114

109115
return challenge.legacyId ? (
@@ -177,10 +183,13 @@ class ChallengeCard extends React.Component {
177183
this.state = {
178184
isConfirm: false,
179185
isLaunch: false,
186+
isDeleteLaunch: false,
180187
isSaving: false
181188
}
182189
this.onUpdateConfirm = this.onUpdateConfirm.bind(this)
183190
this.onUpdateLaunch = this.onUpdateLaunch.bind(this)
191+
this.onDeleteChallenge = this.onDeleteChallenge.bind(this)
192+
this.deleteModalLaunch = this.deleteModalLaunch.bind(this)
184193
this.resetModal = this.resetModal.bind(this)
185194
this.onLaunchChallenge = this.onLaunchChallenge.bind(this)
186195
}
@@ -195,8 +204,14 @@ class ChallengeCard extends React.Component {
195204
}
196205
}
197206

207+
deleteModalLaunch () {
208+
if (!this.state.isDeleteLaunch) {
209+
this.setState({ isDeleteLaunch: true })
210+
}
211+
}
212+
198213
resetModal () {
199-
this.setState({ isConfirm: false, isLaunch: false })
214+
this.setState({ isConfirm: false, isLaunch: false, isDeleteLaunch: false })
200215
}
201216

202217
async onLaunchChallenge () {
@@ -221,12 +236,39 @@ class ChallengeCard extends React.Component {
221236
}
222237
}
223238

239+
async onDeleteChallenge () {
240+
const { deleteChallenge, challenge } = this.props
241+
try {
242+
this.setState({ isSaving: true })
243+
// Call action to delete the challenge
244+
await deleteChallenge(challenge.id)
245+
this.setState({ isSaving: false })
246+
this.resetModal()
247+
} catch (e) {
248+
const error = _.get(e, 'response.data.message', 'Unable to Delete the challenge')
249+
this.setState({ isSaving: false, error })
250+
}
251+
}
252+
224253
render () {
225-
const { isLaunch, isConfirm, isSaving } = this.state
254+
const { isLaunch, isConfirm, isSaving, isDeleteLaunch } = this.state
226255
const { challenge, shouldShowCurrentPhase, reloadChallengeList } = this.props
227256
const { phaseMessage, endTime } = getPhaseInfo(challenge)
228257
return (
229258
<div className={styles.item}>
259+
{
260+
isDeleteLaunch && !isConfirm && (
261+
<ConfirmationModal
262+
title='Confirm Delete'
263+
message={`Do you want to delete "${challenge.name}"?`}
264+
theme={theme}
265+
isProcessing={isSaving}
266+
errorMessage={this.state.error}
267+
onCancel={this.resetModal}
268+
onConfirm={this.onDeleteChallenge}
269+
/>
270+
)
271+
}
230272
{ isLaunch && !isConfirm && (
231273
<ConfirmationModal
232274
title='Confirm Launch'
@@ -268,7 +310,7 @@ class ChallengeCard extends React.Component {
268310
<span className='block light-text'>{endTime}</span>
269311
</Link>)}
270312
<div className={cn(styles.col4, styles.editingContainer)}>
271-
{hoverComponents(challenge, this.onUpdateLaunch, this.props.showError)}
313+
{hoverComponents(challenge, this.onUpdateLaunch, this.deleteModalLaunch)}
272314
</div>
273315
<div className={cn(styles.col4, styles.iconsContainer)}>
274316
<div className={styles.faIconContainer}>
@@ -287,16 +329,15 @@ class ChallengeCard extends React.Component {
287329

288330
ChallengeCard.defaultPrps = {
289331
shouldShowCurrentPhase: true,
290-
showError: () => {},
291332
reloadChallengeList: () => {}
292333
}
293334

294335
ChallengeCard.propTypes = {
295336
challenge: PropTypes.object,
296337
shouldShowCurrentPhase: PropTypes.bool,
297-
showError: PropTypes.func,
298338
reloadChallengeList: PropTypes.func,
299-
partiallyUpdateChallengeDetails: PropTypes.func.isRequired
339+
partiallyUpdateChallengeDetails: PropTypes.func.isRequired,
340+
deleteChallenge: PropTypes.func.isRequired
300341
}
301342

302343
export default withRouter(ChallengeCard)

src/components/ChallengesComponent/ChallengeList/index.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,8 @@ class ChallengeList extends Component {
102102
page,
103103
perPage,
104104
totalChallenges,
105-
partiallyUpdateChallengeDetails
105+
partiallyUpdateChallengeDetails,
106+
deleteChallenge
106107
} = this.props
107108
if (warnMessage) {
108109
return <Message warnMessage={warnMessage} />
@@ -211,9 +212,9 @@ class ChallengeList extends Component {
211212
<ChallengeCard
212213
shouldShowCurrentPhase={selectedTab === 0}
213214
challenge={c}
214-
showError={this.showError}
215215
reloadChallengeList={this.reloadChallengeList}
216216
partiallyUpdateChallengeDetails={partiallyUpdateChallengeDetails}
217+
deleteChallenge={deleteChallenge}
217218
/>
218219
</li>
219220
)
@@ -256,7 +257,8 @@ ChallengeList.propTypes = {
256257
page: PropTypes.number.isRequired,
257258
perPage: PropTypes.number.isRequired,
258259
totalChallenges: PropTypes.number.isRequired,
259-
partiallyUpdateChallengeDetails: PropTypes.func.isRequired
260+
partiallyUpdateChallengeDetails: PropTypes.func.isRequired,
261+
deleteChallenge: PropTypes.func.isRequired
260262
}
261263

262264
export default ChallengeList

src/components/ChallengesComponent/index.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ const ChallengesComponent = ({
2626
page,
2727
perPage,
2828
totalChallenges,
29-
partiallyUpdateChallengeDetails
29+
partiallyUpdateChallengeDetails,
30+
deleteChallenge
3031
}) => {
3132
return (
3233
<Sticky top={10}>
@@ -86,6 +87,7 @@ const ChallengesComponent = ({
8687
perPage={perPage}
8788
totalChallenges={totalChallenges}
8889
partiallyUpdateChallengeDetails={partiallyUpdateChallengeDetails}
90+
deleteChallenge={deleteChallenge}
8991
/>
9092
)}
9193
</div>
@@ -109,7 +111,8 @@ ChallengesComponent.propTypes = {
109111
page: PropTypes.number.isRequired,
110112
perPage: PropTypes.number.isRequired,
111113
totalChallenges: PropTypes.number.isRequired,
112-
partiallyUpdateChallengeDetails: PropTypes.func.isRequired
114+
partiallyUpdateChallengeDetails: PropTypes.func.isRequired,
115+
deleteChallenge: PropTypes.func.isRequired
113116
}
114117

115118
ChallengesComponent.defaultProps = {

src/config/constants.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,10 @@ export const CREATE_CHALLENGE_SUCCESS = 'CREATE_CHALLENGE_SUCCESS'
4848
export const CREATE_CHALLENGE_PENDING = 'CREATE_CHALLENGE_PENDING'
4949
export const CREATE_CHALLENGE_FAILURE = 'CREATE_CHALLENGE_FAILURE'
5050

51+
export const DELETE_CHALLENGE_SUCCESS = 'DELETE_CHALLENGE_SUCCESS'
52+
export const DELETE_CHALLENGE_PENDING = 'DELETE_CHALLENGE_PENDING'
53+
export const DELETE_CHALLENGE_FAILURE = 'DELETE_CHALLENGE_FAILURE'
54+
5155
export const LOAD_PROJECT_DETAILS = 'LOAD_PROJECT_DETAILS'
5256
export const LOAD_PROJECT_DETAILS_SUCCESS = 'LOAD_PROJECT_DETAILS_SUCCESS'
5357
export const LOAD_PROJECT_DETAILS_PENDING = 'LOAD_PROJECT_DETAILS_PENDING'

src/containers/ChallengeEditor/index.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import {
2525
loadResourceRoles,
2626
updateChallengeDetails,
2727
partiallyUpdateChallengeDetails,
28+
deleteChallenge,
2829
createChallenge,
2930
replaceResourceInRole
3031
} from '../../actions/challenges'
@@ -410,6 +411,7 @@ ChallengeEditor.propTypes = {
410411
updateChallengeDetails: PropTypes.func.isRequired,
411412
partiallyUpdateChallengeDetails: PropTypes.func.isRequired,
412413
createChallenge: PropTypes.func.isRequired,
414+
deleteChallenge: PropTypes.func.isRequired,
413415
replaceResourceInRole: PropTypes.func
414416
// members: PropTypes.arrayOf(PropTypes.shape())
415417
}
@@ -445,6 +447,7 @@ const mapDispatchToProps = {
445447
loadResourceRoles,
446448
updateChallengeDetails,
447449
partiallyUpdateChallengeDetails,
450+
deleteChallenge,
448451
createChallenge,
449452
replaceResourceInRole
450453
}

0 commit comments

Comments
 (0)