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.Password = ""
|
||||||
u.AuthData = new(string)
|
u.AuthData = new(string)
|
||||||
*u.AuthData = ""
|
*u.AuthData = ""
|
||||||
u.MfaActive = false
|
|
||||||
u.MfaSecret = ""
|
u.MfaSecret = ""
|
||||||
u.EmailVerified = false
|
u.EmailVerified = false
|
||||||
u.AllowMarketing = false
|
u.AllowMarketing = false
|
||||||
|
|||||||
@@ -1,12 +1,15 @@
|
|||||||
// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved.
|
// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved.
|
||||||
// See License.txt for license information.
|
// 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 Client from 'client/web_client.jsx';
|
||||||
import Constants from 'utils/constants.jsx';
|
import Constants from 'utils/constants.jsx';
|
||||||
import * as Utils from 'utils/utils.jsx';
|
import * as Utils from 'utils/utils.jsx';
|
||||||
import UserStore from 'stores/user_store.jsx';
|
import * as AsyncClient from 'utils/async_client.jsx';
|
||||||
import ConfirmModal from '../confirm_modal.jsx';
|
|
||||||
import TeamStore from 'stores/team_store.jsx';
|
|
||||||
|
|
||||||
import {FormattedMessage} from 'react-intl';
|
import {FormattedMessage} from 'react-intl';
|
||||||
|
|
||||||
@@ -43,18 +46,19 @@ export default class AdminTeamMembersDropdown extends React.Component {
|
|||||||
this.props.user.id,
|
this.props.user.id,
|
||||||
'system_user',
|
'system_user',
|
||||||
() => {
|
() => {
|
||||||
this.props.refreshProfiles();
|
AsyncClient.getUser(this.props.user.id);
|
||||||
},
|
},
|
||||||
(err) => {
|
(err) => {
|
||||||
this.setState({serverError: err.message});
|
this.setState({serverError: err.message});
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
Client.updateTeamMemberRoles(
|
Client.updateTeamMemberRoles(
|
||||||
this.props.teamMember.team_id,
|
this.props.teamMember.team_id,
|
||||||
this.props.user.id,
|
this.props.user.id,
|
||||||
'team_user',
|
'team_user',
|
||||||
() => {
|
() => {
|
||||||
this.props.refreshProfiles();
|
AsyncClient.getTeamMember(this.props.teamMember.team_id, this.props.user.id);
|
||||||
},
|
},
|
||||||
(err) => {
|
(err) => {
|
||||||
this.setState({serverError: err.message});
|
this.setState({serverError: err.message});
|
||||||
@@ -77,7 +81,8 @@ export default class AdminTeamMembersDropdown extends React.Component {
|
|||||||
this.props.teamMember.team_id,
|
this.props.teamMember.team_id,
|
||||||
this.props.user.id,
|
this.props.user.id,
|
||||||
() => {
|
() => {
|
||||||
this.props.refreshProfiles();
|
UserStore.removeProfileFromTeam(this.props.teamMember.team_id, this.props.user.id);
|
||||||
|
UserStore.emitInTeamChange();
|
||||||
},
|
},
|
||||||
(err) => {
|
(err) => {
|
||||||
this.setState({serverError: err.message});
|
this.setState({serverError: err.message});
|
||||||
@@ -89,7 +94,7 @@ export default class AdminTeamMembersDropdown extends React.Component {
|
|||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
Client.updateActive(this.props.user.id, true,
|
Client.updateActive(this.props.user.id, true,
|
||||||
() => {
|
() => {
|
||||||
this.props.refreshProfiles();
|
AsyncClient.getUser(this.props.user.id);
|
||||||
},
|
},
|
||||||
(err) => {
|
(err) => {
|
||||||
this.setState({serverError: err.message});
|
this.setState({serverError: err.message});
|
||||||
@@ -101,7 +106,7 @@ export default class AdminTeamMembersDropdown extends React.Component {
|
|||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
Client.updateActive(this.props.user.id, false,
|
Client.updateActive(this.props.user.id, false,
|
||||||
() => {
|
() => {
|
||||||
this.props.refreshProfiles();
|
AsyncClient.getUser(this.props.user.id);
|
||||||
},
|
},
|
||||||
(err) => {
|
(err) => {
|
||||||
this.setState({serverError: err.message});
|
this.setState({serverError: err.message});
|
||||||
@@ -115,7 +120,7 @@ export default class AdminTeamMembersDropdown extends React.Component {
|
|||||||
this.props.user.id,
|
this.props.user.id,
|
||||||
'team_user team_admin',
|
'team_user team_admin',
|
||||||
() => {
|
() => {
|
||||||
this.props.refreshProfiles();
|
AsyncClient.getTeamMember(this.props.teamMember.team_id, this.props.user.id);
|
||||||
},
|
},
|
||||||
(err) => {
|
(err) => {
|
||||||
this.setState({serverError: err.message});
|
this.setState({serverError: err.message});
|
||||||
@@ -140,7 +145,7 @@ export default class AdminTeamMembersDropdown extends React.Component {
|
|||||||
this.props.user.id,
|
this.props.user.id,
|
||||||
'system_user system_admin',
|
'system_user system_admin',
|
||||||
() => {
|
() => {
|
||||||
this.props.refreshProfiles();
|
AsyncClient.getUser(this.props.user.id);
|
||||||
},
|
},
|
||||||
(err) => {
|
(err) => {
|
||||||
this.setState({serverError: err.message});
|
this.setState({serverError: err.message});
|
||||||
@@ -158,7 +163,7 @@ export default class AdminTeamMembersDropdown extends React.Component {
|
|||||||
|
|
||||||
Client.adminResetMfa(this.props.user.id,
|
Client.adminResetMfa(this.props.user.id,
|
||||||
() => {
|
() => {
|
||||||
this.props.refreshProfiles();
|
AsyncClient.getUser(this.props.user.id);
|
||||||
},
|
},
|
||||||
(err) => {
|
(err) => {
|
||||||
this.setState({serverError: err.message});
|
this.setState({serverError: err.message});
|
||||||
@@ -526,6 +531,5 @@ export default class AdminTeamMembersDropdown extends React.Component {
|
|||||||
AdminTeamMembersDropdown.propTypes = {
|
AdminTeamMembersDropdown.propTypes = {
|
||||||
user: React.PropTypes.object.isRequired,
|
user: React.PropTypes.object.isRequired,
|
||||||
teamMember: React.PropTypes.object.isRequired,
|
teamMember: React.PropTypes.object.isRequired,
|
||||||
refreshProfiles: React.PropTypes.func.isRequired,
|
|
||||||
doPasswordReset: React.PropTypes.func.isRequired
|
doPasswordReset: React.PropTypes.func.isRequired
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved.
|
// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved.
|
||||||
// See License.txt for license information.
|
// See License.txt for license information.
|
||||||
|
|
||||||
import ReactDOM from 'react-dom';
|
|
||||||
import Client from 'client/web_client.jsx';
|
import Client from 'client/web_client.jsx';
|
||||||
import * as Utils from 'utils/utils.jsx';
|
import * as Utils from 'utils/utils.jsx';
|
||||||
import {Modal} from 'react-bootstrap';
|
import {Modal} from 'react-bootstrap';
|
||||||
@@ -37,7 +36,7 @@ class ResetPasswordModal extends React.Component {
|
|||||||
this.props.user.id,
|
this.props.user.id,
|
||||||
password,
|
password,
|
||||||
() => {
|
() => {
|
||||||
this.props.onModalSubmit(ReactDOM.findDOMNode(this.refs.password).value);
|
this.props.onModalSubmit(this.props.user);
|
||||||
},
|
},
|
||||||
(err) => {
|
(err) => {
|
||||||
this.setState({serverError: err.message});
|
this.setState({serverError: err.message});
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import TeamStore from 'stores/team_store.jsx';
|
|||||||
import UserStore from 'stores/user_store.jsx';
|
import UserStore from 'stores/user_store.jsx';
|
||||||
|
|
||||||
import {searchUsers, loadProfilesAndTeamMembers, loadTeamMembersForProfilesList} from 'actions/user_actions.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 Constants from 'utils/constants.jsx';
|
||||||
import * as Utils from 'utils/utils.jsx';
|
import * as Utils from 'utils/utils.jsx';
|
||||||
@@ -59,6 +59,7 @@ export default class UserList extends React.Component {
|
|||||||
|
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
AdminStore.addAllTeamsChangeListener(this.onAllTeamsChange);
|
AdminStore.addAllTeamsChangeListener(this.onAllTeamsChange);
|
||||||
|
UserStore.addChangeListener(this.onUsersChange);
|
||||||
UserStore.addInTeamChangeListener(this.onUsersChange);
|
UserStore.addInTeamChangeListener(this.onUsersChange);
|
||||||
TeamStore.addChangeListener(this.onTeamChange);
|
TeamStore.addChangeListener(this.onTeamChange);
|
||||||
TeamStore.addStatsChangeListener(this.onStatsChange);
|
TeamStore.addStatsChangeListener(this.onStatsChange);
|
||||||
@@ -83,6 +84,7 @@ export default class UserList extends React.Component {
|
|||||||
|
|
||||||
componentWillUnmount() {
|
componentWillUnmount() {
|
||||||
AdminStore.removeAllTeamsChangeListener(this.onAllTeamsChange);
|
AdminStore.removeAllTeamsChangeListener(this.onAllTeamsChange);
|
||||||
|
UserStore.removeChangeListener(this.onUsersChange);
|
||||||
UserStore.removeInTeamChangeListener(this.onUsersChange);
|
UserStore.removeInTeamChangeListener(this.onUsersChange);
|
||||||
TeamStore.removeChangeListener(this.onTeamChange);
|
TeamStore.removeChangeListener(this.onTeamChange);
|
||||||
TeamStore.removeStatsChangeListener(this.onStatsChange);
|
TeamStore.removeStatsChangeListener(this.onStatsChange);
|
||||||
@@ -129,8 +131,8 @@ export default class UserList extends React.Component {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
doPasswordResetSubmit() {
|
doPasswordResetSubmit(user) {
|
||||||
this.getCurrentTeamProfiles();
|
getUser(user.id);
|
||||||
this.setState({
|
this.setState({
|
||||||
showPasswordModal: false,
|
showPasswordModal: false,
|
||||||
user: null
|
user: null
|
||||||
@@ -203,6 +205,7 @@ export default class UserList extends React.Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (mfaEnabled) {
|
if (mfaEnabled) {
|
||||||
|
info.push(', ');
|
||||||
if (user.mfa_active) {
|
if (user.mfa_active) {
|
||||||
info.push(
|
info.push(
|
||||||
<FormattedHTMLMessage
|
<FormattedHTMLMessage
|
||||||
@@ -252,7 +255,6 @@ export default class UserList extends React.Component {
|
|||||||
search={this.search}
|
search={this.search}
|
||||||
actions={[AdminTeamMembersDropdown]}
|
actions={[AdminTeamMembersDropdown]}
|
||||||
actionProps={{
|
actionProps={{
|
||||||
refreshProfiles: this.getCurrentTeamProfiles,
|
|
||||||
doPasswordReset: this.doPasswordReset
|
doPasswordReset: this.doPasswordReset
|
||||||
}}
|
}}
|
||||||
actionUserProps={actionUserProps}
|
actionUserProps={actionUserProps}
|
||||||
|
|||||||
@@ -205,7 +205,7 @@ class TeamStoreClass extends EventEmitter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getMembersInTeam(teamId = this.getCurrentId()) {
|
getMembersInTeam(teamId = this.getCurrentId()) {
|
||||||
return this.members_in_team[teamId] || {};
|
return Object.assign({}, this.members_in_team[teamId]) || {};
|
||||||
}
|
}
|
||||||
|
|
||||||
hasActiveMemberInTeam(teamId = this.getCurrentId(), userId) {
|
hasActiveMemberInTeam(teamId = this.getCurrentId(), userId) {
|
||||||
|
|||||||
@@ -169,11 +169,12 @@ class UserStoreClass extends EventEmitter {
|
|||||||
// System-Wide Profiles
|
// System-Wide Profiles
|
||||||
|
|
||||||
saveProfiles(profiles) {
|
saveProfiles(profiles) {
|
||||||
|
const newProfiles = Object.assign({}, profiles);
|
||||||
const currentId = this.getCurrentId();
|
const currentId = this.getCurrentId();
|
||||||
if (profiles[currentId]) {
|
if (newProfiles[currentId]) {
|
||||||
Reflect.deleteProperty(profiles, currentId);
|
Reflect.deleteProperty(newProfiles, currentId);
|
||||||
}
|
}
|
||||||
this.profiles = Object.assign({}, this.profiles, profiles);
|
this.profiles = Object.assign({}, this.profiles, newProfiles);
|
||||||
}
|
}
|
||||||
|
|
||||||
getProfiles() {
|
getProfiles() {
|
||||||
@@ -331,6 +332,20 @@ class UserStoreClass extends EventEmitter {
|
|||||||
return profiles;
|
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
|
// Channel-Wide Profiles
|
||||||
|
|
||||||
saveProfilesInChannel(channelId = ChannelStore.getCurrentId(), profiles) {
|
saveProfilesInChannel(channelId = ChannelStore.getCurrentId(), profiles) {
|
||||||
|
|||||||
@@ -759,6 +759,8 @@ export function getTeamMember(teamId, userId) {
|
|||||||
|
|
||||||
callTracker[callName] = utils.getTimestamp();
|
callTracker[callName] = utils.getTimestamp();
|
||||||
Client.getTeamMember(
|
Client.getTeamMember(
|
||||||
|
teamId,
|
||||||
|
userId,
|
||||||
(data) => {
|
(data) => {
|
||||||
callTracker[callName] = 0;
|
callTracker[callName] = 0;
|
||||||
|
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user