diff --git a/api/user.go b/api/user.go
index 5be703bfbe..2edbde3e2f 100644
--- a/api/user.go
+++ b/api/user.go
@@ -938,8 +938,8 @@ func updateRoles(c *Context, w http.ResponseWriter, r *http.Request) {
return
}
- if model.IsInRole(new_roles, model.ROLE_SYSTEM_ADMIN) {
- c.Err = model.NewAppError("updateRoles", "The system_admin role can only be set from the command line", "")
+ if model.IsInRole(new_roles, model.ROLE_SYSTEM_ADMIN) && !c.IsSystemAdmin() {
+ c.Err = model.NewAppError("updateRoles", "The system_admin role can only be set by another system admin", "")
c.Err.StatusCode = http.StatusForbidden
return
}
diff --git a/web/react/components/admin_console/admin_sidebar.jsx b/web/react/components/admin_console/admin_sidebar.jsx
index 375a6a8e99..cebb3ff208 100644
--- a/web/react/components/admin_console/admin_sidebar.jsx
+++ b/web/react/components/admin_console/admin_sidebar.jsx
@@ -192,15 +192,6 @@ export default class AdminSidebar extends React.Component {
{'Log Settings'}
-
-
- {'Logs'}
-
-
{teams}
+
+
+
+ {'OTHER'}
+
+
+
+
+ {'Logs'}
+
+
diff --git a/web/react/components/admin_console/reset_password_modal.jsx b/web/react/components/admin_console/reset_password_modal.jsx
index 4aa86dfcbe..0b83edb170 100644
--- a/web/react/components/admin_console/reset_password_modal.jsx
+++ b/web/react/components/admin_console/reset_password_modal.jsx
@@ -21,13 +21,11 @@ export default class ResetPasswordModal extends React.Component {
var password = React.findDOMNode(this.refs.password).value;
if (!password || password.length < 5) {
- this.state.serverError = 'Please enter at least 5 characters.';
- this.setState(this.state);
+ this.setState({serverError: 'Please enter at least 5 characters.'});
return;
}
- this.state.serverError = null;
- this.setState(this.state);
+ this.setState({serverError: null});
var data = {};
data.new_password = password;
@@ -39,15 +37,13 @@ export default class ResetPasswordModal extends React.Component {
this.props.onModalSubmit(React.findDOMNode(this.refs.password).value);
},
(err) => {
- this.state.serverError = err.message;
- this.setState(this.state);
+ this.setState({serverError: err.message});
}
);
}
doCancel() {
- this.state.serverError = null;
- this.setState(this.state);
+ this.setState({serverError: null});
this.props.onModalDismissed();
}
diff --git a/web/react/components/admin_console/team_users.jsx b/web/react/components/admin_console/team_users.jsx
index 088a449324..0a971ff159 100644
--- a/web/react/components/admin_console/team_users.jsx
+++ b/web/react/components/admin_console/team_users.jsx
@@ -33,6 +33,14 @@ export default class UserList extends React.Component {
this.getTeamProfiles(this.props.team.id);
}
+ // this.setState({
+ // teamId: this.state.teamId,
+ // users: this.state.users,
+ // serverError: this.state.serverError,
+ // showPasswordModal: this.state.showPasswordModal,
+ // user: this.state.user
+ // });
+
getTeamProfiles(teamId) {
Client.getProfilesForTeam(
teamId,
@@ -56,33 +64,56 @@ export default class UserList extends React.Component {
return 0;
});
- this.state.users = memberList;
- this.setState(this.state);
+ this.setState({
+ teamId: this.state.teamId,
+ users: memberList,
+ serverError: this.state.serverError,
+ showPasswordModal: this.state.showPasswordModal,
+ user: this.state.user
+ });
},
(err) => {
- this.state.serverError = err.message;
- this.state.users = null;
- this.setState(this.state);
+ this.setState({
+ teamId: this.state.teamId,
+ users: null,
+ serverError: err.message,
+ showPasswordModal: this.state.showPasswordModal,
+ user: this.state.user
+ });
}
);
}
doPasswordReset(user) {
- this.state.showPasswordModal = true;
- this.state.user = user;
- this.setState(this.state);
+ this.setState({
+ teamId: this.state.teamId,
+ users: this.state.users,
+ serverError: this.state.serverError,
+ showPasswordModal: true,
+ user
+ });
}
doPasswordResetDismiss() {
this.state.showPasswordModal = false;
this.state.user = null;
- this.setState(this.state);
+ this.setState({
+ teamId: this.state.teamId,
+ users: this.state.users,
+ serverError: this.state.serverError,
+ showPasswordModal: false,
+ user: null
+ });
}
doPasswordResetSubmit() {
- this.state.showPasswordModal = false;
- this.state.user = null;
- this.setState(this.state);
+ this.setState({
+ teamId: this.state.teamId,
+ users: this.state.users,
+ serverError: this.state.serverError,
+ showPasswordModal: false,
+ user: null
+ });
}
componentWillReceiveProps(newProps) {
diff --git a/web/react/components/admin_console/user_item.jsx b/web/react/components/admin_console/user_item.jsx
index ff204e1d9a..32812e875b 100644
--- a/web/react/components/admin_console/user_item.jsx
+++ b/web/react/components/admin_console/user_item.jsx
@@ -12,6 +12,7 @@ export default class UserItem extends React.Component {
this.handleMakeActive = this.handleMakeActive.bind(this);
this.handleMakeNotActive = this.handleMakeNotActive.bind(this);
this.handleMakeAdmin = this.handleMakeAdmin.bind(this);
+ this.handleMakeSystemAdmin = this.handleMakeSystemAdmin.bind(this);
this.handleResetPassword = this.handleResetPassword.bind(this);
this.state = {};
@@ -75,6 +76,23 @@ export default class UserItem extends React.Component {
);
}
+ handleMakeSystemAdmin(e) {
+ e.preventDefault();
+ const data = {
+ user_id: this.props.user.id,
+ new_roles: 'system_admin'
+ };
+
+ Client.updateRoles(data,
+ () => {
+ this.props.refreshProfiles();
+ },
+ (err) => {
+ this.setState({serverError: err.message});
+ }
+ );
+ }
+
handleResetPassword(e) {
e.preventDefault();
this.props.doPasswordReset(this.props.user);
@@ -101,8 +119,9 @@ export default class UserItem extends React.Component {
}
const email = user.email;
- let showMakeMember = (user.roles === 'admin') || user.roles === 'system_admin';
- let showMakeAdmin = (user.roles === '') || user.roles === 'system_admin';
+ let showMakeMember = user.roles === 'admin' || user.roles === 'system_admin';
+ let showMakeAdmin = user.roles === '' || user.roles === 'system_admin';
+ let showMakeSystemAdmin = user.roles === '' || user.roles === 'admin';
let showMakeActive = false;
let showMakeNotActive = user.roles !== 'system_admin';
@@ -111,10 +130,26 @@ export default class UserItem extends React.Component {
currentRoles = 'Inactive';
showMakeMember = false;
showMakeAdmin = false;
+ showMakeSystemAdmin = false;
showMakeActive = true;
showMakeNotActive = false;
}
+ let makeSystemAdmin = null;
+ if (showMakeSystemAdmin) {
+ makeSystemAdmin = (
+
+
+ {'Make System Admin'}
+
+
+ );
+ }
+
let makeAdmin = null;
if (showMakeAdmin) {
makeAdmin = (
@@ -206,6 +241,7 @@ export default class UserItem extends React.Component {
{makeMember}
{makeActive}
{makeNotActive}
+ {makeSystemAdmin}