summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoram Wilander <jwawilander@gmail.com>2016-10-24 08:50:12 -0400
committerGitHub <noreply@github.com>2016-10-24 08:50:12 -0400
commite6d26bee51067d65480925593d1610404ff9d5e3 (patch)
treede88b96d8345e9c1e411b4e299ab202388739be6
parent486d12e1c3a5d6658ca0ebd8fd28bec9f6753ce9 (diff)
downloadchat-e6d26bee51067d65480925593d1610404ff9d5e3.tar.gz
chat-e6d26bee51067d65480925593d1610404ff9d5e3.tar.bz2
chat-e6d26bee51067d65480925593d1610404ff9d5e3.zip
Fixes for the team user lists in the system console (#4294)
-rw-r--r--model/user.go1
-rw-r--r--webapp/components/admin_console/admin_team_members_dropdown.jsx44
-rw-r--r--webapp/components/admin_console/reset_password_modal.jsx3
-rw-r--r--webapp/components/admin_console/team_users.jsx10
-rw-r--r--webapp/stores/team_store.jsx2
-rw-r--r--webapp/stores/user_store.jsx21
-rw-r--r--webapp/utils/async_client.jsx2
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;