Skip to content

Commit c2347cf

Browse files
Merge pull request #1272 from doctorhilarius/self-service-opps
Self-Service Opportunities List
2 parents edfb775 + ff1d86b commit c2347cf

File tree

11 files changed

+25166
-122
lines changed

11 files changed

+25166
-122
lines changed

package-lock.json

Lines changed: 25030 additions & 61 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/actions/challenges.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ import { removeChallengeFromPhaseProduct, saveChallengeAsPhaseProduct } from '..
5858
/**
5959
* Loads active challenges of project by page
6060
*/
61-
export function loadChallengesByPage (page, projectId, status, filterChallengeName = null) {
61+
export function loadChallengesByPage (page, projectId, status, filterChallengeName = null, selfService = false) {
6262
return (dispatch, getState) => {
6363
dispatch({
6464
type: LOAD_CHALLENGES_PENDING,
@@ -85,6 +85,9 @@ export function loadChallengesByPage (page, projectId, status, filterChallengeNa
8585
} else if (!(_.isInteger(projectId) && projectId > 0)) {
8686
filters['status'] = 'Active'
8787
}
88+
if (selfService) {
89+
filters.selfService = true
90+
}
8891

8992
return fetchChallenges(filters, {
9093
page,

src/actions/sidebar.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,18 @@ export function loadProjects (filterProjectName = '', myProjects = true) {
5252
}
5353
}
5454

55+
/**
56+
* Unlads projects of the authenticated user
57+
*/
58+
export function unloadProjects () {
59+
return (dispatch) => {
60+
dispatch({
61+
type: LOAD_PROJECTS_SUCCESS,
62+
projects: []
63+
})
64+
}
65+
}
66+
5567
/**
5668
* Reset active params. e.g activeProjectId
5769
*/

src/components/ChallengesComponent/ChallengeCard/index.js

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ class ChallengeCard extends React.Component {
276276

277277
render () {
278278
const { isLaunch, isConfirm, isSaving, isDeleteLaunch, isCheckChalengePermission, hasEditChallengePermission } = this.state
279-
const { challenge, shouldShowCurrentPhase, reloadChallengeList, isBillingAccountExpired } = this.props
279+
const { challenge, shouldShowCurrentPhase, reloadChallengeList, isBillingAccountExpired, disableHover } = this.props
280280
const { phaseMessage, endTime } = getPhaseInfo(challenge)
281281
const deleteMessage = isCheckChalengePermission
282282
? 'Checking permissions...'
@@ -313,7 +313,7 @@ class ChallengeCard extends React.Component {
313313
/>
314314
)
315315
}
316-
{ isLaunch && isConfirm && (
316+
{isLaunch && isConfirm && (
317317
<AlertModal
318318
title='Success'
319319
message={`Challenge "${challenge.name}" is activated successfuly`}
@@ -324,7 +324,7 @@ class ChallengeCard extends React.Component {
324324
okLink={`/projects/${challenge.projectId}/challenges/${challenge.id}/view`}
325325
onClose={this.resetModal}
326326
/>
327-
) }
327+
)}
328328

329329
<Link className={styles.col1} to={`/projects/${challenge.projectId}/challenges/${challenge.id}/view`}>
330330
<div className={styles.name}>
@@ -342,7 +342,7 @@ class ChallengeCard extends React.Component {
342342
<span className='block light-text'>{endTime}</span>
343343
</Link>)}
344344
<div className={cn(styles.col4, styles.editingContainer)}>
345-
{hoverComponents(challenge, this.onUpdateLaunch, this.deleteModalLaunch)}
345+
{(!disableHover && hoverComponents(challenge, this.onUpdateLaunch, this.deleteModalLaunch))}
346346
</div>
347347
<div className={cn(styles.col4, styles.iconsContainer)}>
348348
<div className={styles.faIconContainer}>
@@ -361,7 +361,7 @@ class ChallengeCard extends React.Component {
361361

362362
ChallengeCard.defaultPrps = {
363363
shouldShowCurrentPhase: true,
364-
reloadChallengeList: () => {}
364+
reloadChallengeList: () => { }
365365
}
366366

367367
ChallengeCard.propTypes = {
@@ -370,7 +370,8 @@ ChallengeCard.propTypes = {
370370
reloadChallengeList: PropTypes.func,
371371
partiallyUpdateChallengeDetails: PropTypes.func.isRequired,
372372
deleteChallenge: PropTypes.func.isRequired,
373-
isBillingAccountExpired: PropTypes.bool
373+
isBillingAccountExpired: PropTypes.bool,
374+
disableHover: PropTypes.bool
374375
}
375376

376377
export default withRouter(ChallengeCard)

src/components/ChallengesComponent/ChallengeList/index.js

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,10 @@ class ChallengeList extends Component {
4848
* @param {String} projectStatus project status
4949
*/
5050
updateSearchParam (searchText, projectStatus) {
51-
const { status, filterChallengeName, loadChallengesByPage, activeProjectId } = this.props
51+
const { status, filterChallengeName, loadChallengesByPage, activeProjectId, selfService } = this.props
5252
this.setState({ searchText }, () => {
5353
if (status !== projectStatus || searchText !== filterChallengeName) {
54-
loadChallengesByPage(1, activeProjectId, projectStatus, searchText)
54+
loadChallengesByPage(1, activeProjectId, projectStatus, searchText, selfService)
5555
}
5656
})
5757
}
@@ -62,9 +62,9 @@ class ChallengeList extends Component {
6262
*/
6363
handlePageChange (pageNumber) {
6464
const { searchText } = this.state
65-
const { page, loadChallengesByPage, activeProjectId, status } = this.props
65+
const { page, loadChallengesByPage, activeProjectId, status, selfService } = this.props
6666
if (page !== pageNumber) {
67-
loadChallengesByPage(pageNumber, activeProjectId, status, searchText)
67+
loadChallengesByPage(pageNumber, activeProjectId, status, searchText, selfService)
6868
}
6969
}
7070

@@ -73,8 +73,8 @@ class ChallengeList extends Component {
7373
*/
7474
reloadChallengeList () {
7575
const { searchText } = this.state
76-
const { page, loadChallengesByPage, activeProjectId, status } = this.props
77-
loadChallengesByPage(page, activeProjectId, status, searchText)
76+
const { page, loadChallengesByPage, activeProjectId, status, selfService } = this.props
77+
loadChallengesByPage(page, activeProjectId, status, searchText, selfService)
7878
}
7979

8080
/**
@@ -104,7 +104,8 @@ class ChallengeList extends Component {
104104
totalChallenges,
105105
partiallyUpdateChallengeDetails,
106106
deleteChallenge,
107-
isBillingAccountExpired
107+
isBillingAccountExpired,
108+
selfService
108109
} = this.props
109110
if (warnMessage) {
110111
return <Message warnMessage={warnMessage} />
@@ -167,7 +168,8 @@ class ChallengeList extends Component {
167168
break
168169
}
169170
case 1: {
170-
this.directUpdateSearchParam(searchText, CHALLENGE_STATUS.NEW)
171+
const status = selfService ? CHALLENGE_STATUS.DRAFT : CHALLENGE_STATUS.NEW
172+
this.directUpdateSearchParam(searchText, status)
171173
break
172174
}
173175
case 2: {
@@ -186,18 +188,21 @@ class ChallengeList extends Component {
186188
}}>
187189
<TabList>
188190
<Tab>Active</Tab>
189-
<Tab>New</Tab>
191+
{(!selfService && <Tab>New</Tab>)}
190192
<Tab>Draft</Tab>
191-
<Tab>Completed</Tab>
192-
<Tab>Cancelled</Tab>
193+
{(!selfService && <Tab>Completed</Tab>)}
194+
{(!selfService && <Tab>Cancelled</Tab>)}
193195
</TabList>
194196
<TabPanel />
195197
<TabPanel />
196198
<TabPanel />
197199
</Tabs>)}
198200
{
199201
challenges.length === 0 && (
200-
<NoChallenge activeProject={activeProject} />
202+
<NoChallenge
203+
activeProject={activeProject}
204+
selfService={selfService}
205+
/>
201206
)
202207
}
203208
{
@@ -225,6 +230,7 @@ class ChallengeList extends Component {
225230
partiallyUpdateChallengeDetails={partiallyUpdateChallengeDetails}
226231
deleteChallenge={deleteChallenge}
227232
isBillingAccountExpired={isBillingAccountExpired}
233+
disableHover={selfService}
228234
/>
229235
</li>
230236
)
@@ -269,7 +275,8 @@ ChallengeList.propTypes = {
269275
totalChallenges: PropTypes.number.isRequired,
270276
partiallyUpdateChallengeDetails: PropTypes.func.isRequired,
271277
deleteChallenge: PropTypes.func.isRequired,
272-
isBillingAccountExpired: PropTypes.bool
278+
isBillingAccountExpired: PropTypes.bool,
279+
selfService: PropTypes.bool
273280
}
274281

275282
export default ChallengeList

src/components/ChallengesComponent/NoChallenge/index.js

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,21 @@ import React from 'react'
55
import PropTypes from 'prop-types'
66
import styles from './NoChallenge.module.scss'
77

8-
const NoChallenge = ({ activeProject }) => {
8+
const NoChallenge = ({
9+
activeProject,
10+
selfService
11+
}) => {
12+
let noChallengeMessage
13+
if (selfService || !!activeProject) {
14+
noChallengeMessage = selfService ? 'There are' : 'You have'
15+
noChallengeMessage += ' no challenges at the moment'
16+
} else {
17+
noChallengeMessage = 'Please select a project to view challenges'
18+
}
19+
920
return (
1021
<div className={styles.noChallenge}>
11-
{
12-
activeProject
13-
? (<p>You have no challenges at the moment</p>) : (<p>Please select a project to view challenges</p>)
14-
}
22+
<p>{noChallengeMessage}</p>
1523
</div>
1624
)
1725
}
@@ -24,7 +32,8 @@ NoChallenge.propTypes = {
2432
activeProject: PropTypes.shape({
2533
id: PropTypes.number,
2634
name: PropTypes.string
27-
})
35+
}),
36+
selfService: PropTypes.bool
2837
}
2938

3039
export default NoChallenge

src/components/ChallengesComponent/index.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ const ChallengesComponent = ({
2727
totalChallenges,
2828
partiallyUpdateChallengeDetails,
2929
deleteChallenge,
30-
isBillingAccountExpired
30+
isBillingAccountExpired,
31+
selfService
3132
}) => {
3233
return (
3334
<Sticky top={10}>
@@ -41,7 +42,7 @@ const ChallengesComponent = ({
4142
__html: xss(activeProject ? activeProject.name : '')
4243
}}
4344
/>
44-
{ activeProject && activeProject.id && (
45+
{activeProject && activeProject.id && (
4546
<span>
4647
(<a href={`${CONNECT_APP_URL}/projects/${activeProject.id}`} target='_blank' rel='noopener noreferrer'>View Project</a>)
4748
</span>
@@ -76,6 +77,7 @@ const ChallengesComponent = ({
7677
partiallyUpdateChallengeDetails={partiallyUpdateChallengeDetails}
7778
deleteChallenge={deleteChallenge}
7879
isBillingAccountExpired={isBillingAccountExpired}
80+
selfService={selfService}
7981
/>
8082
)}
8183
</div>
@@ -101,7 +103,8 @@ ChallengesComponent.propTypes = {
101103
totalChallenges: PropTypes.number.isRequired,
102104
partiallyUpdateChallengeDetails: PropTypes.func.isRequired,
103105
deleteChallenge: PropTypes.func.isRequired,
104-
isBillingAccountExpired: PropTypes.bool
106+
isBillingAccountExpired: PropTypes.bool,
107+
selfService: PropTypes.bool
105108
}
106109

107110
ChallengesComponent.defaultProps = {

src/components/Sidebar/index.js

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ import styles from './Sidebar.module.scss'
1111
import { isBetaMode } from '../../util/cookie'
1212

1313
const Sidebar = ({
14-
projectId, resetSidebarActiveParams
14+
projectId,
15+
resetSidebarActiveParams,
16+
selfService
1517
}) => {
1618
return (
1719
<div className={styles.sidebar}>
@@ -21,12 +23,17 @@ const Sidebar = ({
2123
{isBetaMode() && <span className={styles.beta}>beta</span>}
2224
</div>
2325
<Link to='/'>
24-
<div className={cn(styles.homeLink, { [styles.active]: !projectId })} onClick={resetSidebarActiveParams}>
26+
<div className={cn(styles.homeLink, { [styles.active]: !projectId && !selfService })} onClick={resetSidebarActiveParams}>
2527
All Work
2628
</div>
2729
</Link>
30+
<Link to='/self-service'>
31+
<div className={cn(styles.homeLink, { [styles.active]: !projectId && selfService })} onClick={resetSidebarActiveParams}>
32+
Self-Service Opportunities
33+
</div>
34+
</Link>
2835
<a href='https://github.com/topcoder-platform/work-manager/issues/new' target='_blank' rel='noopener noreferrer' className='chameleon-feedback'>
29-
<div className={cn(styles.homeLink, { [styles.active]: !projectId })}>
36+
<div className={cn(styles.homeLink, {})}>
3037
Give Application Feedback
3138
</div>
3239
</a>
@@ -40,7 +47,8 @@ const Sidebar = ({
4047

4148
Sidebar.propTypes = {
4249
projectId: PropTypes.string,
43-
resetSidebarActiveParams: PropTypes.func
50+
resetSidebarActiveParams: PropTypes.func,
51+
selfService: PropTypes.bool
4452
}
4553

4654
export default Sidebar

0 commit comments

Comments
 (0)