From ec34b85c4308b6ceab80f2f2735336e299e8ea3c Mon Sep 17 00:00:00 2001
From: Tatsuya Niwa <tty.niwa@gmail.com>
Date: Thu, 11 Feb 2016 20:02:49 +0900
Subject: Add a warning when demoting yourself from System Administrator from
 the team Manage Members menu

---
 web/react/components/member_list_team_item.jsx | 127 +++++++++++++++++++++----
 1 file changed, 110 insertions(+), 17 deletions(-)

(limited to 'web/react/components/member_list_team_item.jsx')

diff --git a/web/react/components/member_list_team_item.jsx b/web/react/components/member_list_team_item.jsx
index 30086d1b2..7b1f6170d 100644
--- a/web/react/components/member_list_team_item.jsx
+++ b/web/react/components/member_list_team_item.jsx
@@ -5,8 +5,29 @@ import UserStore from '../stores/user_store.jsx';
 import * as Client from '../utils/client.jsx';
 import * as AsyncClient from '../utils/async_client.jsx';
 import * as Utils from '../utils/utils.jsx';
+import ConfirmModal from './confirm_modal.jsx';
+import TeamStore from '../stores/team_store.jsx';
 
-import {FormattedMessage} from 'mm-intl';
+import {injectIntl, intlShape, defineMessages, FormattedMessage} from 'mm-intl';
+
+var holders = defineMessages({
+    confirmDemoteRoleTitle: {
+        id: 'member_team_item.confirmDemoteRoleTitle',
+        defaultMessage: 'Confirm demotion from System Admin role'
+    },
+    confirmDemotion: {
+        id: 'member_team_item.confirmDemotion',
+        defaultMessage: 'Confirm Demotion'
+    },
+    confirmDemoteDescription: {
+        id: 'member_team_item.confirmDemoteDescription',
+        defaultMessage: 'If you demote yourself from the System Admin role and there is not another user with System Admin privileges, you\'ll need to re-assign a System Admin by accessing the Mattermost server through a terminal and running the following command.'
+    },
+    confirmDemotionCmd: {
+        id: 'member_team_item.confirmDemotionCmd',
+        defaultMessage: 'platform -assign_role -team_name="yourteam" -email="name@yourcompany.com" -role="system_admin"'
+    }
+});
 
 export default class MemberListTeamItem extends React.Component {
     constructor(props) {
@@ -16,23 +37,35 @@ export default class MemberListTeamItem extends React.Component {
         this.handleMakeActive = this.handleMakeActive.bind(this);
         this.handleMakeNotActive = this.handleMakeNotActive.bind(this);
         this.handleMakeAdmin = this.handleMakeAdmin.bind(this);
+        this.handleDemote = this.handleDemote.bind(this);
+        this.handleDemoteSubmit = this.handleDemoteSubmit.bind(this);
+        this.handleDemoteCancel = this.handleDemoteCancel.bind(this);
 
-        this.state = {};
+        this.state = {
+            serverError: null,
+            showDemoteModal: false,
+            user: null,
+            role: null
+        };
     }
     handleMakeMember() {
-        const data = {
-            user_id: this.props.user.id,
-            new_roles: ''
-        };
-
-        Client.updateRoles(data,
-            () => {
-                AsyncClient.getProfiles();
-            },
-            (err) => {
-                this.setState({serverError: err.message});
-            }
-        );
+        const me = UserStore.getCurrentUser();
+        if (this.props.user.id === me.id) {
+            this.handleDemote(this.props.user, '');
+        } else {
+            const data = {
+                user_id: this.props.user.id,
+                new_roles: ''
+            };
+            Client.updateRoles(data,
+                () => {
+                    AsyncClient.getProfiles();
+                },
+                (err) => {
+                    this.setState({serverError: err.message});
+                }
+            );
+        }
     }
     handleMakeActive() {
         Client.updateActive(this.props.user.id, true,
@@ -55,14 +88,55 @@ export default class MemberListTeamItem extends React.Component {
         );
     }
     handleMakeAdmin() {
+        const me = UserStore.getCurrentUser();
+        if (this.props.user.id === me.id) {
+            this.handleDemote(this.props.user, 'admin');
+        } else {
+            const data = {
+                user_id: this.props.user.id,
+                new_roles: 'admin'
+            };
+
+            Client.updateRoles(data,
+                () => {
+                    AsyncClient.getProfiles();
+                },
+                (err) => {
+                    this.setState({serverError: err.message});
+                }
+            );
+        }
+    }
+    handleDemote(user, role) {
+        this.setState({
+            serverError: this.state.serverError,
+            showDemoteModal: true,
+            user,
+            role
+        });
+    }
+    handleDemoteCancel() {
+        this.setState({
+            serverError: null,
+            showDemoteModal: false,
+            user: null,
+            role: null
+        });
+    }
+    handleDemoteSubmit() {
         const data = {
             user_id: this.props.user.id,
-            new_roles: 'admin'
+            new_roles: this.state.role
         };
 
         Client.updateRoles(data,
             () => {
-                AsyncClient.getProfiles();
+                const teamUrl = TeamStore.getCurrentTeamUrl();
+                if (teamUrl) {
+                    window.location.href = teamUrl;
+                } else {
+                    window.location.href = '/';
+                }
             },
             (err) => {
                 this.setState({serverError: err.message});
@@ -198,6 +272,21 @@ export default class MemberListTeamItem extends React.Component {
                 </li>
             );
         }
+        const me = UserStore.getCurrentUser();
+        const {formatMessage} = this.props.intl;
+        let makeDemoteModal = null;
+        if (this.props.user.id === me.id) {
+            makeDemoteModal = (
+                <ConfirmModal
+                    show={this.state.showDemoteModal}
+                    title={formatMessage(holders.confirmDemoteRoleTitle)}
+                    message={[formatMessage(holders.confirmDemoteDescription), React.createElement('br'), React.createElement('br'), formatMessage(holders.confirmDemotionCmd), serverError]}
+                    confirm_button={formatMessage(holders.confirmDemotion)}
+                    onConfirm={this.handleDemoteSubmit}
+                    onCancel={this.handleDemoteCancel}
+                />
+            );
+        }
 
         return (
             <tr>
@@ -231,6 +320,7 @@ export default class MemberListTeamItem extends React.Component {
                             {makeNotActive}
                         </ul>
                     </div>
+                    {makeDemoteModal}
                     {serverError}
                 </td>
             </tr>
@@ -239,5 +329,8 @@ export default class MemberListTeamItem extends React.Component {
 }
 
 MemberListTeamItem.propTypes = {
+    intl: intlShape.isRequired,
     user: React.PropTypes.object.isRequired
 };
+
+export default injectIntl(MemberListTeamItem);
-- 
cgit v1.2.3-1-g7c22

