diff options
-rw-r--r-- | model/user.go | 1 | ||||
-rw-r--r-- | webapp/components/admin_console/admin_team_members_dropdown.jsx | 44 | ||||
-rw-r--r-- | webapp/components/admin_console/reset_password_modal.jsx | 3 | ||||
-rw-r--r-- | webapp/components/admin_console/team_users.jsx | 10 | ||||
-rw-r--r-- | webapp/stores/team_store.jsx | 2 | ||||
-rw-r--r-- | webapp/stores/user_store.jsx | 21 | ||||
-rw-r--r-- | webapp/utils/async_client.jsx | 2 |
7 files changed, 52 insertions, 31 deletions
diff --git a/model/user.go b/model/user.go index e713444ba..f5edf302f 100644 --- a/model/user.go +++ b/model/user.go @@ -241,7 +241,6 @@ func (u *User) ClearNonProfileFields() { u.Password = "" u.AuthData = new(string) *u.AuthData = "" - u.MfaActive = false u.MfaSecret = "" u.EmailVerified = false u.AllowMarketing = false diff --git a/webapp/components/admin_console/admin_team_members_dropdown.jsx b/webapp/components/admin_console/admin_team_members_dropdown.jsx index 85daa86ba..141e85857 100644 --- a/webapp/components/admin_console/admin_team_members_dropdown.jsx +++ b/webapp/components/admin_console/admin_team_members_dropdown.jsx @@ -1,12 +1,15 @@ // Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. +import ConfirmModal from '../confirm_modal.jsx'; + +import UserStore from 'stores/user_store.jsx'; +import TeamStore from 'stores/team_store.jsx'; + import Client from 'client/web_client.jsx'; import Constants from 'utils/constants.jsx'; import * as Utils from 'utils/utils.jsx'; -import UserStore from 'stores/user_store.jsx'; -import ConfirmModal from '../confirm_modal.jsx'; -import TeamStore from 'stores/team_store.jsx'; +import * as AsyncClient from 'utils/async_client.jsx'; import {FormattedMessage} from 'react-intl'; @@ -43,18 +46,19 @@ export default class AdminTeamMembersDropdown extends React.Component { this.props.user.id, 'system_user', () => { - this.props.refreshProfiles(); + AsyncClient.getUser(this.props.user.id); }, (err) => { this.setState({serverError: err.message}); } ); + Client.updateTeamMemberRoles( this.props.teamMember.team_id, this.props.user.id, 'team_user', () => { - this.props.refreshProfiles(); + AsyncClient.getTeamMember(this.props.teamMember.team_id, this.props.user.id); }, (err) => { this.setState({serverError: err.message}); @@ -74,22 +78,23 @@ export default class AdminTeamMembersDropdown extends React.Component { handleRemoveFromTeam() { Client.removeUserFromTeam( - this.props.teamMember.team_id, - this.props.user.id, - () => { - this.props.refreshProfiles(); - }, - (err) => { - this.setState({serverError: err.message}); - } - ); + this.props.teamMember.team_id, + this.props.user.id, + () => { + UserStore.removeProfileFromTeam(this.props.teamMember.team_id, this.props.user.id); + UserStore.emitInTeamChange(); + }, + (err) => { + this.setState({serverError: err.message}); + } + ); } handleMakeActive(e) { e.preventDefault(); Client.updateActive(this.props.user.id, true, () => { - this.props.refreshProfiles(); + AsyncClient.getUser(this.props.user.id); }, (err) => { this.setState({serverError: err.message}); @@ -101,7 +106,7 @@ export default class AdminTeamMembersDropdown extends React.Component { e.preventDefault(); Client.updateActive(this.props.user.id, false, () => { - this.props.refreshProfiles(); + AsyncClient.getUser(this.props.user.id); }, (err) => { this.setState({serverError: err.message}); @@ -115,7 +120,7 @@ export default class AdminTeamMembersDropdown extends React.Component { this.props.user.id, 'team_user team_admin', () => { - this.props.refreshProfiles(); + AsyncClient.getTeamMember(this.props.teamMember.team_id, this.props.user.id); }, (err) => { this.setState({serverError: err.message}); @@ -140,7 +145,7 @@ export default class AdminTeamMembersDropdown extends React.Component { this.props.user.id, 'system_user system_admin', () => { - this.props.refreshProfiles(); + AsyncClient.getUser(this.props.user.id); }, (err) => { this.setState({serverError: err.message}); @@ -158,7 +163,7 @@ export default class AdminTeamMembersDropdown extends React.Component { Client.adminResetMfa(this.props.user.id, () => { - this.props.refreshProfiles(); + AsyncClient.getUser(this.props.user.id); }, (err) => { this.setState({serverError: err.message}); @@ -526,6 +531,5 @@ export default class AdminTeamMembersDropdown extends React.Component { AdminTeamMembersDropdown.propTypes = { user: React.PropTypes.object.isRequired, teamMember: React.PropTypes.object.isRequired, - refreshProfiles: React.PropTypes.func.isRequired, doPasswordReset: React.PropTypes.func.isRequired }; diff --git a/webapp/components/admin_console/reset_password_modal.jsx b/webapp/components/admin_console/reset_password_modal.jsx index dee04b87c..e3fd2bf00 100644 --- a/webapp/components/admin_console/reset_password_modal.jsx +++ b/webapp/components/admin_console/reset_password_modal.jsx @@ -1,7 +1,6 @@ // Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. -import ReactDOM from 'react-dom'; import Client from 'client/web_client.jsx'; import * as Utils from 'utils/utils.jsx'; import {Modal} from 'react-bootstrap'; @@ -37,7 +36,7 @@ class ResetPasswordModal extends React.Component { this.props.user.id, password, () => { - this.props.onModalSubmit(ReactDOM.findDOMNode(this.refs.password).value); + this.props.onModalSubmit(this.props.user); }, (err) => { this.setState({serverError: err.message}); diff --git a/webapp/components/admin_console/team_users.jsx b/webapp/components/admin_console/team_users.jsx index 8fa73b084..1d0886737 100644 --- a/webapp/components/admin_console/team_users.jsx +++ b/webapp/components/admin_console/team_users.jsx @@ -11,7 +11,7 @@ import TeamStore from 'stores/team_store.jsx'; import UserStore from 'stores/user_store.jsx'; import {searchUsers, loadProfilesAndTeamMembers, loadTeamMembersForProfilesList} from 'actions/user_actions.jsx'; -import {getTeamStats} from 'utils/async_client.jsx'; +import {getTeamStats, getUser} from 'utils/async_client.jsx'; import Constants from 'utils/constants.jsx'; import * as Utils from 'utils/utils.jsx'; @@ -59,6 +59,7 @@ export default class UserList extends React.Component { componentDidMount() { AdminStore.addAllTeamsChangeListener(this.onAllTeamsChange); + UserStore.addChangeListener(this.onUsersChange); UserStore.addInTeamChangeListener(this.onUsersChange); TeamStore.addChangeListener(this.onTeamChange); TeamStore.addStatsChangeListener(this.onStatsChange); @@ -83,6 +84,7 @@ export default class UserList extends React.Component { componentWillUnmount() { AdminStore.removeAllTeamsChangeListener(this.onAllTeamsChange); + UserStore.removeChangeListener(this.onUsersChange); UserStore.removeInTeamChangeListener(this.onUsersChange); TeamStore.removeChangeListener(this.onTeamChange); TeamStore.removeStatsChangeListener(this.onStatsChange); @@ -129,8 +131,8 @@ export default class UserList extends React.Component { }); } - doPasswordResetSubmit() { - this.getCurrentTeamProfiles(); + doPasswordResetSubmit(user) { + getUser(user.id); this.setState({ showPasswordModal: false, user: null @@ -203,6 +205,7 @@ export default class UserList extends React.Component { } if (mfaEnabled) { + info.push(', '); if (user.mfa_active) { info.push( <FormattedHTMLMessage @@ -252,7 +255,6 @@ export default class UserList extends React.Component { search={this.search} actions={[AdminTeamMembersDropdown]} actionProps={{ - refreshProfiles: this.getCurrentTeamProfiles, doPasswordReset: this.doPasswordReset }} actionUserProps={actionUserProps} diff --git a/webapp/stores/team_store.jsx b/webapp/stores/team_store.jsx index 3a4ae73b9..8a3457a4d 100644 --- a/webapp/stores/team_store.jsx +++ b/webapp/stores/team_store.jsx @@ -205,7 +205,7 @@ class TeamStoreClass extends EventEmitter { } getMembersInTeam(teamId = this.getCurrentId()) { - return this.members_in_team[teamId] || {}; + return Object.assign({}, this.members_in_team[teamId]) || {}; } hasActiveMemberInTeam(teamId = this.getCurrentId(), userId) { diff --git a/webapp/stores/user_store.jsx b/webapp/stores/user_store.jsx index d93848670..9ac8540f9 100644 --- a/webapp/stores/user_store.jsx +++ b/webapp/stores/user_store.jsx @@ -169,11 +169,12 @@ class UserStoreClass extends EventEmitter { // System-Wide Profiles saveProfiles(profiles) { + const newProfiles = Object.assign({}, profiles); const currentId = this.getCurrentId(); - if (profiles[currentId]) { - Reflect.deleteProperty(profiles, currentId); + if (newProfiles[currentId]) { + Reflect.deleteProperty(newProfiles, currentId); } - this.profiles = Object.assign({}, this.profiles, profiles); + this.profiles = Object.assign({}, this.profiles, newProfiles); } getProfiles() { @@ -331,6 +332,20 @@ class UserStoreClass extends EventEmitter { return profiles; } + removeProfileFromTeam(teamId, userId) { + const userIds = this.profiles_in_team[teamId]; + if (!userIds) { + return; + } + + const index = userIds.indexOf(userId); + if (index === -1) { + return; + } + + userIds.splice(index, 1); + } + // Channel-Wide Profiles saveProfilesInChannel(channelId = ChannelStore.getCurrentId(), profiles) { diff --git a/webapp/utils/async_client.jsx b/webapp/utils/async_client.jsx index 24d540929..ee9d1a4f0 100644 --- a/webapp/utils/async_client.jsx +++ b/webapp/utils/async_client.jsx @@ -759,6 +759,8 @@ export function getTeamMember(teamId, userId) { callTracker[callName] = utils.getTimestamp(); Client.getTeamMember( + teamId, + userId, (data) => { callTracker[callName] = 0; |