Fixes for the team user lists in the system console (#4294)

Этот коммит содержится в:
Joram Wilander
2016-10-24 08:50:12 -04:00
коммит произвёл GitHub
родитель 486d12e1c3
Коммит e6d26bee51
7 изменённых файлов: 52 добавлений и 31 удалений

Просмотреть файл

@@ -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;