Skip to content

Commit f716a88

Browse files
committed
Additional QA fixes
#1487 #1486 #1485 #1484
1 parent 944bde3 commit f716a88

File tree

5 files changed

+48
-67
lines changed

5 files changed

+48
-67
lines changed

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

+4
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@
2626
flex: 2;
2727
flex-direction: column;
2828
justify-content: center;
29+
30+
span {
31+
word-break: break-all;
32+
}
2933
}
3034

3135
.col3 {

src/components/ChallengesComponent/ChallengeList/index.js

+30-22
Original file line numberDiff line numberDiff line change
@@ -23,27 +23,39 @@ import SortIcon from '../../../assets/images/sort-icon.svg'
2323
import Select from '../../Select'
2424
import Loader from '../../Loader'
2525

26-
import { CHALLENGE_STATUS, PAGE_SIZE, PAGINATION_PER_PAGE_OPTIONS } from '../../../config/constants'
27-
import { checkAdmin } from '../../../util/tc'
26+
import { CHALLENGE_STATUS, PAGE_SIZE, PAGINATION_PER_PAGE_OPTIONS, PROJECT_ROLES } from '../../../config/constants'
27+
import { checkAdmin, checkReadOnlyRoles } from '../../../util/tc'
2828

2929
require('bootstrap/scss/bootstrap.scss')
3030

31+
const defaultSearchParam = {
32+
searchText: '',
33+
challengeProjectOption: null,
34+
challengeStatus: '',
35+
challengeType: null,
36+
sortBy: 'startDate',
37+
sortOrder: 'desc',
38+
challengeDate: {}
39+
}
40+
3141
const theme = {
3242
container: styles.modalContainer
3343
}
3444

3545
class ChallengeList extends Component {
3646
constructor (props) {
3747
super(props)
48+
49+
const defaultSearchParamClone = _.cloneDeep(defaultSearchParam)
3850
this.state = {
39-
searchText: this.props.filterChallengeName,
51+
searchText: this.props.filterChallengeName || defaultSearchParamClone.searchText,
4052
errorMessage: null,
41-
sortBy: this.props.filterSortBy || 'startDate',
42-
sortOrder: this.props.filterSortOrder || 'desc',
43-
challengeProjectOption: this.props.filterProjectOption,
44-
challengeStatus: this.props.status,
45-
challengeType: this.props.filterChallengeType,
46-
challengeDate: this.props.filterDate
53+
sortBy: this.props.filterSortBy || defaultSearchParamClone.sortBy,
54+
sortOrder: this.props.filterSortOrder || defaultSearchParamClone.sortOrder,
55+
challengeProjectOption: this.props.filterProjectOption || defaultSearchParamClone.challengeProjectOption,
56+
challengeStatus: this.props.status || defaultSearchParamClone.challengeStatus,
57+
challengeType: this.props.filterChallengeType || defaultSearchParamClone.challengeType,
58+
challengeDate: this.props.filterDate || defaultSearchParamClone.challengeDate
4759
}
4860
this.directUpdateSearchParam = this.updateSearchParam.bind(this) // update search param without debounce
4961
this.handlePageChange = this.handlePageChange.bind(this) // update search param without debounce
@@ -312,22 +324,14 @@ class ChallengeList extends Component {
312324
loadChallengesByPage
313325
} = this.props
314326

315-
this.setState({
316-
searchText: '',
317-
challengeProjectOption: null,
318-
challengeStatus: '',
319-
challengeType: null,
320-
sortBy: '',
321-
sortOrder: 'asc',
322-
challengeDate: {}
323-
})
327+
this.setState(_.cloneDeep(defaultSearchParam))
324328

325329
let projectId = dashboard ? filterProjectOption : activeProjectId
326330

327331
loadChallengesByPage(
328332
1,
329333
projectId,
330-
null,
334+
'all',
331335
'',
332336
selfService,
333337
this.getHandle(),
@@ -372,6 +376,8 @@ class ChallengeList extends Component {
372376
challengeTypes,
373377
loginUserRoleInProject
374378
} = this.props
379+
const isReadOnly = checkReadOnlyRoles(this.props.auth.token) || loginUserRoleInProject === PROJECT_ROLES.READ
380+
375381
if (warnMessage) {
376382
return <Message warnMessage={warnMessage} />
377383
}
@@ -688,7 +694,8 @@ class ChallengeList extends Component {
688694
</div>
689695
<div className={styles.header}>
690696
<div
691-
className={cn(styles.col5)}
697+
className={cn(styles.col5, styles.sortable)}
698+
onClick={() => this.updateSort('type')}
692699
>
693700
<span className={styles.filterItem}>
694701
Type
@@ -741,14 +748,15 @@ class ChallengeList extends Component {
741748
</span>
742749
</div>
743750
<div
744-
className={cn(styles.col3)}
751+
className={cn(styles.col3, styles.sortable)}
752+
onClick={() => this.updateSort('status')}
745753
>
746754
<span className={styles.filterItem}>
747755
Status
748756
{this.renderSortIcon('status')}
749757
</span>
750758
</div>
751-
<div className={styles.col6}>&nbsp;</div>
759+
{!isReadOnly ? (<div className={styles.col6}>&nbsp;</div>) : null}
752760
<div className={styles.col6}>&nbsp;</div>
753761
<div className={styles.col6}>&nbsp;</div>
754762
</div>

src/containers/Challenges/index.js

+8-41
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import React, { Component, Fragment } from 'react'
66
// import { Redirect } from 'react-router-dom'
77
import PropTypes from 'prop-types'
88
import { connect } from 'react-redux'
9-
import { DebounceInput } from 'react-debounce-input'
109
import ChallengesComponent from '../../components/ChallengesComponent'
1110
import ProjectCard from '../../components/ProjectCard'
1211
// import Loader from '../../components/Loader'
@@ -29,11 +28,8 @@ class Challenges extends Component {
2928
constructor (props) {
3029
super(props)
3130
this.state = {
32-
searchProjectName: '',
3331
onlyMyProjects: true
3432
}
35-
this.updateProjectName = this.updateProjectName.bind(this)
36-
this.toggleMyProjects = this.toggleMyProjects.bind(this)
3733
}
3834

3935
componentDidMount () {
@@ -104,20 +100,6 @@ class Challenges extends Component {
104100
}
105101
}
106102

107-
updateProjectName (val) {
108-
this.setState({ searchProjectName: val })
109-
this.props.loadProjects(val, this.state.onlyMyProjects)
110-
}
111-
112-
toggleMyProjects (evt) {
113-
this.setState({ onlyMyProjects: evt.target.checked }, () => {
114-
this.props.loadProjects(
115-
this.state.searchProjectName,
116-
this.state.onlyMyProjects
117-
)
118-
})
119-
}
120-
121103
render () {
122104
const {
123105
challenges,
@@ -150,7 +132,6 @@ class Challenges extends Component {
150132
auth,
151133
metadata
152134
} = this.props
153-
const { searchProjectName } = this.state
154135
const { challengeTypes = [] } = metadata
155136
const projectInfo = _.find(projects, { id: activeProjectId }) || {}
156137
const projectComponents =
@@ -167,29 +148,16 @@ class Challenges extends Component {
167148
))
168149
return (
169150
<Fragment>
170-
<div className={!dashboard && styles.projectSearch}>
171-
{!selfService && (
172-
<div className={styles.projectSearchHeader}>
173-
{!dashboard && <label>Switch Project</label>}
174-
{!dashboard && (
175-
<DebounceInput
176-
minLength={2}
177-
debounceTimeout={300}
178-
placeholder='Search projects (Enter project id or project title in double quotes or any text from project)'
179-
onChange={e => this.updateProjectName(e.target.value)}
180-
value={searchProjectName}
181-
/>
151+
{!dashboard &&
152+
(!!projectComponents.length ||
153+
(activeProjectId === -1 && !selfService)) ? (
154+
<div className={!dashboard && styles.projectSearch}>
155+
{activeProjectId === -1 && !selfService && (
156+
<div>No project selected. Select one below</div>
182157
)}
183-
</div>
184-
)}
185-
{!dashboard && activeProjectId === -1 && !selfService && (
186-
<div>No project selected. Select one below</div>
187-
)}
188-
{dashboard ? null
189-
: (
190158
<ul>{projectComponents}</ul>
191-
)}
192-
</div>
159+
</div>
160+
) : null}
193161
{(dashboard || activeProjectId !== -1 || selfService) && (
194162
<ChallengesComponent
195163
activeProject={{
@@ -259,7 +227,6 @@ Challenges.propTypes = {
259227
page: PropTypes.number.isRequired,
260228
perPage: PropTypes.number.isRequired,
261229
totalChallenges: PropTypes.number.isRequired,
262-
loadProjects: PropTypes.func.isRequired,
263230
setActiveProject: PropTypes.func.isRequired,
264231
partiallyUpdateChallengeDetails: PropTypes.func.isRequired,
265232
deleteChallenge: PropTypes.func.isRequired,

src/containers/Tab/index.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class TabContainer extends Component {
3333
}
3434

3535
componentWillReceiveProps (nextProps) {
36-
const { projectId, isLoading, selfService, projects } = nextProps
36+
const { projectId, isLoading, selfService, projects, isLoadProjectsSuccess } = nextProps
3737

3838
if (nextProps.history.location.pathname === '/') {
3939
this.setState({ currentTab: 1 })
@@ -61,7 +61,7 @@ class TabContainer extends Component {
6161

6262
// if we already have projects in the list,
6363
// don't load the projects again
64-
if (!!projects && !!projects.length) {
64+
if ((!!projects && !!projects.length) || isLoadProjectsSuccess) {
6565
return
6666
}
6767

@@ -100,6 +100,7 @@ class TabContainer extends Component {
100100
TabContainer.propTypes = {
101101
projects: PropTypes.arrayOf(PropTypes.shape()),
102102
isLoading: PropTypes.bool,
103+
isLoadProjectsSuccess: PropTypes.bool,
103104
loadProjects: PropTypes.func,
104105
unloadProjects: PropTypes.func,
105106
activeProjectId: PropTypes.number,

src/reducers/sidebar.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,16 @@ import {
1212
const initialState = {
1313
activeProjectId: -1,
1414
isLoading: false,
15-
projects: []
15+
projects: [],
16+
isLoadProjectsSuccess: false
1617
}
1718

1819
export default function (state = initialState, action) {
1920
switch (action.type) {
2021
case SET_ACTIVE_PROJECT:
2122
return { ...state, activeProjectId: action.projectId, projects: [], isLoading: false }
2223
case LOAD_PROJECTS_SUCCESS:
23-
return { ...state, projects: action.projects, isLoading: false, isLoggedIn: true }
24+
return { ...state, projects: action.projects, isLoading: false, isLoggedIn: true, isLoadProjectsSuccess: true }
2425
case LOAD_PROJECTS_PENDING:
2526
return { ...state, isLoading: true }
2627
case LOAD_PROJECTS_FAILURE:

0 commit comments

Comments
 (0)