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.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});
@@ -74,22 +78,23 @@ export default class AdminTeamMembersDropdown extends React.Component {
handleRemoveFromTeam() { handleRemoveFromTeam() {
Client.removeUserFromTeam( Client.removeUserFromTeam(
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) => { },
this.setState({serverError: err.message}); (err) => {
} this.setState({serverError: err.message});
); }
);
} }
handleMakeActive(e) { handleMakeActive(e) {
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;