Skip to content

Commit 944bde3

Browse files
committed
Read only user fix - don’t allow them to remove users
1 parent 62ea935 commit 944bde3

File tree

4 files changed

+74
-20
lines changed

4 files changed

+74
-20
lines changed

src/components/UserCard/UserCard.module.scss

+4
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@
4040
display: none;
4141
}
4242

43+
.isDisabled {
44+
pointer-events: none;
45+
}
46+
4347
label {
4448
@include roboto-light();
4549

src/components/UserCard/index.js

+9-8
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ class UserCard extends Component {
6060
}
6161

6262
render () {
63-
const { user, onRemoveClick } = this.props
63+
const { user, onRemoveClick, isEditable } = this.props
6464
const showRadioButtons = _.includes(_.values(PROJECT_ROLES), user.role)
6565
return (
6666
<div>
@@ -103,7 +103,7 @@ class UserCard extends Component {
103103
checked={user.role === PROJECT_ROLES.READ}
104104
onChange={(e) => e.target.checked && this.updatePermission(PROJECT_ROLES.READ)}
105105
/>
106-
<label htmlFor={`read-${user.id}`}>
106+
<label className={cn({ [styles.isDisabled]: !isEditable })} htmlFor={`read-${user.id}`}>
107107
<div>
108108
Read
109109
</div>
@@ -120,7 +120,7 @@ class UserCard extends Component {
120120
checked={user.role === PROJECT_ROLES.WRITE}
121121
onChange={(e) => e.target.checked && this.updatePermission(PROJECT_ROLES.WRITE)}
122122
/>
123-
<label htmlFor={`write-${user.id}`}>
123+
<label className={cn({ [styles.isDisabled]: !isEditable })} htmlFor={`write-${user.id}`}>
124124
<div>
125125
Write
126126
</div>
@@ -137,7 +137,7 @@ class UserCard extends Component {
137137
checked={user.role === PROJECT_ROLES.MANAGER}
138138
onChange={(e) => e.target.checked && this.updatePermission(PROJECT_ROLES.MANAGER)}
139139
/>
140-
<label htmlFor={`full-access-${user.id}`}>
140+
<label className={cn({ [styles.isDisabled]: !isEditable })} htmlFor={`full-access-${user.id}`}>
141141
<div>
142142
Full Access
143143
</div>
@@ -154,20 +154,20 @@ class UserCard extends Component {
154154
checked={user.role === PROJECT_ROLES.COPILOT}
155155
onChange={(e) => e.target.checked && this.updatePermission(PROJECT_ROLES.COPILOT)}
156156
/>
157-
<label htmlFor={`copilot-${user.id}`}>
157+
<label className={cn({ [styles.isDisabled]: !isEditable })} htmlFor={`copilot-${user.id}`}>
158158
<div>
159159
Copilot
160160
</div>
161161
<input type='hidden' />
162162
</label>
163163
</div>)}
164164
</div>
165-
<div className={cn(styles.col5)}>
165+
{isEditable ? (<div className={cn(styles.col5)}>
166166
<PrimaryButton
167167
text={'Remove'}
168168
type={'danger'}
169169
onClick={() => { onRemoveClick(user) }} />
170-
</div>
170+
</div>) : null}
171171
</div>
172172
</div>
173173
)
@@ -177,7 +177,8 @@ class UserCard extends Component {
177177
UserCard.propTypes = {
178178
user: PropTypes.object,
179179
reloadProjectMembers: PropTypes.func.isRequired,
180-
onRemoveClick: PropTypes.func.isRequired
180+
onRemoveClick: PropTypes.func.isRequired,
181+
isEditable: PropTypes.bool
181182
}
182183

183184
export default UserCard

src/components/Users/index.js

+4-3
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ class Users extends Component {
196196
}
197197

198198
render () {
199-
const { projects, projectMembers, reloadProjectMembers } = this.props
199+
const { projects, projectMembers, reloadProjectMembers, isEditable } = this.props
200200
const projectOptions = projects.map(p => {
201201
return {
202202
label: p.name,
@@ -207,7 +207,7 @@ class Users extends Component {
207207
const membersExist = projectMembers && projectMembers.length > 0
208208
const isCopilotOrManager = this.checkIsCopilotOrManager(projectMembers, loggedInHandle)
209209
const isAdmin = checkAdmin(this.props.auth.token)
210-
const showAddUser = this.state.projectOption && (isCopilotOrManager || isAdmin)
210+
const showAddUser = isEditable && this.state.projectOption && (isCopilotOrManager || isAdmin)
211211

212212
return (
213213
<div className={styles.contentContainer}>
@@ -402,7 +402,7 @@ class Users extends Component {
402402
_.map(projectMembers, (member) => {
403403
return (
404404
<li className={styles.userItem} key={`user-card-${member.id}`}>
405-
<UserCard user={member} onRemoveClick={this.onRemoveClick} reloadProjectMembers={reloadProjectMembers} />
405+
<UserCard user={member} onRemoveClick={this.onRemoveClick} reloadProjectMembers={reloadProjectMembers} isEditable={isEditable} />
406406
</li>
407407
)
408408
})
@@ -421,6 +421,7 @@ Users.propTypes = {
421421
loadProject: PropTypes.func.isRequired,
422422
reloadProjectMembers: PropTypes.func.isRequired,
423423
auth: PropTypes.object,
424+
isEditable: PropTypes.bool,
424425
projects: PropTypes.arrayOf(PropTypes.object),
425426
projectMembers: PropTypes.arrayOf(PropTypes.object)
426427
}

src/containers/Users/index.js

+57-9
Original file line numberDiff line numberDiff line change
@@ -4,27 +4,73 @@ import _ from 'lodash'
44
import PT from 'prop-types'
55
import UsersComponent from '../../components/Users'
66
import { loadProjects } from '../../actions/sidebar'
7-
import {
8-
loadProject,
9-
reloadProjectMembers
10-
} from '../../actions/projects'
7+
import { loadProject, reloadProjectMembers } from '../../actions/projects'
8+
import { PROJECT_ROLES } from '../../config/constants'
119

1210
class Users extends Component {
11+
constructor (props) {
12+
super(props)
13+
14+
this.state = {
15+
loginUserRoleInProject: ''
16+
}
17+
}
18+
1319
componentDidMount () {
1420
this.props.loadProjects()
1521
}
1622

23+
isEditable () {
24+
const { loginUserRoleInProject } = this.state
25+
if (loginUserRoleInProject === PROJECT_ROLES.READ) {
26+
return false
27+
}
28+
return true
29+
}
30+
31+
componentWillReceiveProps (nextProps) {
32+
const { projectDetail, loggedInUser } = nextProps
33+
if (projectDetail && loggedInUser) {
34+
const projectMembers = projectDetail.members
35+
const loginUserProjectInfo = _.find(projectMembers, { userId: loggedInUser.userId })
36+
if (loginUserProjectInfo && this.state.loginUserRoleInProject !== loginUserProjectInfo.role) {
37+
this.setState({
38+
loginUserRoleInProject: loginUserProjectInfo.role
39+
})
40+
}
41+
}
42+
}
43+
1744
render () {
18-
const { projects, loadProject, projectMembers, auth, reloadProjectMembers } = this.props
19-
return <UsersComponent projects={projects} loadProject={loadProject} projectMembers={projectMembers} auth={auth} reloadProjectMembers={reloadProjectMembers} />
45+
const {
46+
projects,
47+
loadProject,
48+
projectMembers,
49+
auth,
50+
reloadProjectMembers,
51+
projectDetail
52+
} = this.props
53+
return (
54+
<UsersComponent
55+
projectDetail={projectDetail}
56+
projects={projects}
57+
loadProject={loadProject}
58+
projectMembers={projectMembers}
59+
auth={auth}
60+
reloadProjectMembers={reloadProjectMembers}
61+
isEditable={this.isEditable()}
62+
/>
63+
)
2064
}
2165
}
2266

23-
const mapStateToProps = ({ sidebar, challenges, auth }) => {
67+
const mapStateToProps = ({ sidebar, challenges, auth, projects }) => {
2468
return {
2569
projects: sidebar.projects,
2670
projectMembers: _.get(challenges, 'metadata.members'),
27-
auth
71+
projectDetail: projects.projectDetail,
72+
auth,
73+
loggedInUser: auth.user
2874
}
2975
}
3076

@@ -40,7 +86,9 @@ Users.propTypes = {
4086
reloadProjectMembers: PT.func.isRequired,
4187
projects: PT.arrayOf(PT.object),
4288
projectMembers: PT.arrayOf(PT.object),
43-
auth: PT.object
89+
auth: PT.object,
90+
projectDetail: PT.object,
91+
loggedInUser: PT.object
4492
}
4593

4694
export default connect(mapStateToProps, mapDispatchToProps)(Users)

0 commit comments

Comments
 (0)