Fixes for the team user lists in the system console (#4294)
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
486d12e1c3
Коммит
e6d26bee51
@@ -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
|
||||
|
||||
@@ -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
|
||||
};
|
||||
|
||||
@@ -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});
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -759,6 +759,8 @@ export function getTeamMember(teamId, userId) {
|
||||
|
||||
callTracker[callName] = utils.getTimestamp();
|
||||
Client.getTeamMember(
|
||||
teamId,
|
||||
userId,
|
||||
(data) => {
|
||||
callTracker[callName] = 0;
|
||||
|
||||
|
||||
Ссылка в новой задаче
Block a user