summaryrefslogtreecommitdiffstats
path: root/webapp/components
diff options
context:
space:
mode:
Diffstat (limited to 'webapp/components')
-rw-r--r--webapp/components/admin_console/team_users.jsx4
-rw-r--r--webapp/components/admin_console/user_item.jsx35
-rw-r--r--webapp/components/filtered_user_list.jsx15
-rw-r--r--webapp/components/leave_team_modal.jsx115
-rw-r--r--webapp/components/navbar_dropdown.jsx14
-rw-r--r--webapp/components/needs_team.jsx2
-rw-r--r--webapp/components/team_members_dropdown.jsx36
7 files changed, 217 insertions, 4 deletions
diff --git a/webapp/components/admin_console/team_users.jsx b/webapp/components/admin_console/team_users.jsx
index b6bba3182..3ec375627 100644
--- a/webapp/components/admin_console/team_users.jsx
+++ b/webapp/components/admin_console/team_users.jsx
@@ -186,6 +186,10 @@ export default class UserList extends React.Component {
var memberList = this.state.users.map((user) => {
var teamMember = this.getTeamMemberForUser(user.id);
+ if (teamMember.delete_at > 0) {
+ return null;
+ }
+
return (
<UserItem
team={this.state.team}
diff --git a/webapp/components/admin_console/user_item.jsx b/webapp/components/admin_console/user_item.jsx
index edded5aab..e6c4f637c 100644
--- a/webapp/components/admin_console/user_item.jsx
+++ b/webapp/components/admin_console/user_item.jsx
@@ -18,6 +18,7 @@ export default class UserItem extends React.Component {
super(props);
this.handleMakeMember = this.handleMakeMember.bind(this);
+ this.handleRemoveFromTeam = this.handleRemoveFromTeam.bind(this);
this.handleMakeActive = this.handleMakeActive.bind(this);
this.handleMakeNotActive = this.handleMakeNotActive.bind(this);
this.handleMakeAdmin = this.handleMakeAdmin.bind(this);
@@ -56,6 +57,19 @@ export default class UserItem extends React.Component {
}
}
+ handleRemoveFromTeam() {
+ Client.removeUserFromTeam(
+ this.props.team.id,
+ this.props.user.id,
+ () => {
+ this.props.refreshProfiles();
+ },
+ (err) => {
+ this.setState({serverError: err.message});
+ }
+ );
+ }
+
handleMakeActive(e) {
e.preventDefault();
Client.updateActive(this.props.user.id, true,
@@ -222,6 +236,7 @@ export default class UserItem extends React.Component {
);
}
+ const me = UserStore.getCurrentUser();
const email = user.email;
let showMakeMember = teamMember.roles === 'admin' || user.roles === 'system_admin';
let showMakeAdmin = teamMember.roles === '' && user.roles !== 'system_admin';
@@ -299,6 +314,24 @@ export default class UserItem extends React.Component {
);
}
+ let removeFromTeam = null;
+ if (this.props.user.id !== me.id) {
+ removeFromTeam = (
+ <li role='presentation'>
+ <a
+ role='menuitem'
+ href='#'
+ onClick={this.handleRemoveFromTeam}
+ >
+ <FormattedMessage
+ id='team_members_dropdown.leave_team'
+ defaultMessage='Remove From Team'
+ />
+ </a>
+ </li>
+ );
+ }
+
let makeActive = null;
if (showMakeActive) {
makeActive = (
@@ -428,7 +461,6 @@ export default class UserItem extends React.Component {
passwordReset = null;
}
- const me = UserStore.getCurrentUser();
let makeDemoteModal = null;
if (this.props.user.id === me.id) {
const title = (
@@ -511,6 +543,7 @@ export default class UserItem extends React.Component {
className='dropdown-menu member-menu'
role='menu'
>
+ {removeFromTeam}
{makeAdmin}
{makeMember}
{makeActive}
diff --git a/webapp/components/filtered_user_list.jsx b/webapp/components/filtered_user_list.jsx
index b6d8f11f9..67d038fd9 100644
--- a/webapp/components/filtered_user_list.jsx
+++ b/webapp/components/filtered_user_list.jsx
@@ -39,17 +39,24 @@ class FilteredUserList extends React.Component {
this.state = {
filter: '',
users: this.filterUsers(props.teamMembers, props.users),
- selected: 'team'
+ selected: 'team',
+ teamMembers: props.teamMembers
};
}
- componentWillUpdate(nextProps) {
+ componentWillReceiveProps(nextProps) {
// assume the user list is immutable
if (this.props.users !== nextProps.users) {
this.setState({
users: this.filterUsers(nextProps.teamMembers, nextProps.users)
});
}
+
+ if (this.props.teamMembers !== nextProps.teamMembers) {
+ this.setState({
+ users: this.filterUsers(nextProps.teamMembers, nextProps.users)
+ });
+ }
}
componentDidMount() {
@@ -70,6 +77,10 @@ class FilteredUserList extends React.Component {
var filteredUsers = users.filter((user) => {
for (const index in teamMembers) {
if (teamMembers.hasOwnProperty(index) && teamMembers[index].user_id === user.id) {
+ if (teamMembers[index].delete_at > 0) {
+ return false;
+ }
+
return true;
}
}
diff --git a/webapp/components/leave_team_modal.jsx b/webapp/components/leave_team_modal.jsx
new file mode 100644
index 000000000..7263f23d4
--- /dev/null
+++ b/webapp/components/leave_team_modal.jsx
@@ -0,0 +1,115 @@
+// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved.
+// See License.txt for license information.
+
+import Constants from 'utils/constants.jsx';
+const ActionTypes = Constants.ActionTypes;
+import * as GlobalActions from 'actions/global_actions.jsx';
+import ModalStore from 'stores/modal_store.jsx';
+import UserStore from 'stores/user_store.jsx';
+
+import {intlShape, injectIntl, FormattedMessage} from 'react-intl';
+
+import {Modal} from 'react-bootstrap';
+
+import React from 'react';
+
+class LeaveTeamModal extends React.Component {
+ constructor(props) {
+ super(props);
+
+ this.handleToggle = this.handleToggle.bind(this);
+ this.handleSubmit = this.handleSubmit.bind(this);
+ this.handleHide = this.handleHide.bind(this);
+
+ this.state = {
+ show: false
+ };
+ }
+
+ componentDidMount() {
+ ModalStore.addModalListener(ActionTypes.TOGGLE_LEAVE_TEAM_MODAL, this.handleToggle);
+ }
+
+ componentWillUnmount() {
+ ModalStore.removeModalListener(ActionTypes.TOGGLE_LEAVE_TEAM_MODAL, this.handleToggle);
+ }
+
+ handleToggle(value) {
+ this.setState({
+ show: value
+ });
+ }
+
+ handleSubmit() {
+ GlobalActions.emitLeaveTeam();
+
+ this.setState({
+ show: false
+ });
+ }
+
+ handleHide() {
+ this.setState({
+ show: false
+ });
+ }
+
+ render() {
+ var currentUser = UserStore.getCurrentUser();
+
+ if (currentUser != null) {
+ return (
+ <Modal
+ className='modal-confirm'
+ show={this.state.show}
+ onHide={this.handleHide}
+ >
+ <Modal.Header closeButton={false}>
+ <Modal.Title>
+ <FormattedMessage
+ id='leave_team_modal.title'
+ defaultMessage='Leave the team?'
+ />
+ </Modal.Title>
+ </Modal.Header>
+ <Modal.Body>
+ <FormattedMessage
+ id='leave_team_modal.desc'
+ defaultMessage='You will be removed from all public channels and private groups. If the team is private you will not be able to rejoin the team. Are you sure?'
+ />
+ </Modal.Body>
+ <Modal.Footer>
+ <button
+ type='button'
+ className='btn btn-default'
+ onClick={this.handleHide}
+ >
+ <FormattedMessage
+ id='leave_team_modal.no'
+ defaultMessage='No'
+ />
+ </button>
+ <button
+ type='button'
+ className='btn btn-danger'
+ onClick={this.handleSubmit}
+ >
+ <FormattedMessage
+ id='leave_team_modal.yes'
+ defaultMessage='Yes'
+ />
+ </button>
+ </Modal.Footer>
+ </Modal>
+ );
+ }
+
+ return null;
+ }
+}
+
+LeaveTeamModal.propTypes = {
+ intl: intlShape.isRequired
+};
+
+export default injectIntl(LeaveTeamModal);
diff --git a/webapp/components/navbar_dropdown.jsx b/webapp/components/navbar_dropdown.jsx
index ab228dcb3..c660bc164 100644
--- a/webapp/components/navbar_dropdown.jsx
+++ b/webapp/components/navbar_dropdown.jsx
@@ -236,6 +236,20 @@ export default class NavbarDropdown extends React.Component {
);
}
+ teams.push(
+ <li key='leaveTeam_li'>
+ <a
+ href='#'
+ onClick={GlobalActions.showLeaveTeamModal}
+ >
+ <FormattedMessage
+ id='navbar_dropdown.leave'
+ defaultMessage='Leave Team'
+ />
+ </a>
+ </li>
+ );
+
if (this.state.teamMembers && this.state.teamMembers.length > 1) {
teams.push(
<li
diff --git a/webapp/components/needs_team.jsx b/webapp/components/needs_team.jsx
index 19ad38887..07b90636d 100644
--- a/webapp/components/needs_team.jsx
+++ b/webapp/components/needs_team.jsx
@@ -34,6 +34,7 @@ import RemovedFromChannelModal from 'components/removed_from_channel_modal.jsx';
import RegisterAppModal from 'components/register_app_modal.jsx';
import ImportThemeModal from 'components/user_settings/import_theme_modal.jsx';
import InviteMemberModal from 'components/invite_member_modal.jsx';
+import LeaveTeamModal from 'components/leave_team_modal.jsx';
import SelectTeamModal from 'components/admin_console/select_team_modal.jsx';
export default class NeedsTeam extends React.Component {
@@ -129,6 +130,7 @@ export default class NeedsTeam extends React.Component {
<GetPublicLinkModal/>
<GetTeamInviteLinkModal/>
<InviteMemberModal/>
+ <LeaveTeamModal/>
<ImportThemeModal/>
<TeamSettingsModal/>
<MoreChannelsModal/>
diff --git a/webapp/components/team_members_dropdown.jsx b/webapp/components/team_members_dropdown.jsx
index 2b40da9cf..43449635d 100644
--- a/webapp/components/team_members_dropdown.jsx
+++ b/webapp/components/team_members_dropdown.jsx
@@ -19,6 +19,7 @@ export default class TeamMembersDropdown extends React.Component {
super(props);
this.handleMakeMember = this.handleMakeMember.bind(this);
+ this.handleRemoveFromTeam = this.handleRemoveFromTeam.bind(this);
this.handleMakeActive = this.handleMakeActive.bind(this);
this.handleMakeNotActive = this.handleMakeNotActive.bind(this);
this.handleMakeAdmin = this.handleMakeAdmin.bind(this);
@@ -52,6 +53,19 @@ export default class TeamMembersDropdown extends React.Component {
);
}
}
+ handleRemoveFromTeam() {
+ Client.removeUserFromTeam(
+ '',
+ this.props.user.id,
+ () => {
+ AsyncClient.getTeamMembers(TeamStore.getCurrentId());
+ AsyncClient.getProfiles();
+ },
+ (err) => {
+ this.setState({serverError: err.message});
+ }
+ );
+ }
handleMakeActive() {
Client.updateActive(this.props.user.id, true,
() => {
@@ -171,6 +185,7 @@ export default class TeamMembersDropdown extends React.Component {
);
}
+ const me = UserStore.getCurrentUser();
let showMakeMember = teamMember.roles === 'admin' || user.roles === 'system_admin';
let showMakeAdmin = teamMember.roles === '' && user.roles !== 'system_admin';
let showMakeActive = false;
@@ -225,6 +240,24 @@ export default class TeamMembersDropdown extends React.Component {
);
}
+ let removeFromTeam = null;
+ if (this.props.user.id !== me.id) {
+ removeFromTeam = (
+ <li role='presentation'>
+ <a
+ role='menuitem'
+ href='#'
+ onClick={this.handleRemoveFromTeam}
+ >
+ <FormattedMessage
+ id='team_members_dropdown.leave_team'
+ defaultMessage='Remove From Team'
+ />
+ </a>
+ </li>
+ );
+ }
+
let makeActive = null;
if (showMakeActive) {
// makeActive = (
@@ -260,7 +293,7 @@ export default class TeamMembersDropdown extends React.Component {
// </li>
// );
}
- const me = UserStore.getCurrentUser();
+
let makeDemoteModal = null;
if (this.props.user.id === me.id) {
const title = (
@@ -321,6 +354,7 @@ export default class TeamMembersDropdown extends React.Component {
className='dropdown-menu member-menu'
role='menu'
>
+ {removeFromTeam}
{makeAdmin}
{makeMember}
{makeActive}