Merge pull request #1488 from hmhealey/plt1259
PLT-1259 Converted TeamMembersModal to React-Bootstrap
Этот коммит содержится в:
@@ -2,17 +2,56 @@
|
|||||||
// See License.txt for license information.
|
// See License.txt for license information.
|
||||||
|
|
||||||
import MemberListTeamItem from './member_list_team_item.jsx';
|
import MemberListTeamItem from './member_list_team_item.jsx';
|
||||||
|
import UserStore from '../stores/user_store.jsx';
|
||||||
|
|
||||||
export default class MemberListTeam extends React.Component {
|
export default class MemberListTeam extends React.Component {
|
||||||
|
constructor(props) {
|
||||||
|
super(props);
|
||||||
|
|
||||||
|
this.getUsers = this.getUsers.bind(this);
|
||||||
|
this.onChange = this.onChange.bind(this);
|
||||||
|
|
||||||
|
this.state = {
|
||||||
|
users: this.getUsers()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidMount() {
|
||||||
|
UserStore.addChangeListener(this.onChange);
|
||||||
|
}
|
||||||
|
|
||||||
|
componentWillUnmount() {
|
||||||
|
UserStore.removeChangeListener(this.onChange);
|
||||||
|
}
|
||||||
|
|
||||||
|
getUsers() {
|
||||||
|
const profiles = UserStore.getProfiles();
|
||||||
|
const users = [];
|
||||||
|
|
||||||
|
for (const id of Object.keys(profiles)) {
|
||||||
|
users.push(profiles[id]);
|
||||||
|
}
|
||||||
|
|
||||||
|
users.sort((a, b) => a.username.localeCompare(b.username));
|
||||||
|
|
||||||
|
return users;
|
||||||
|
}
|
||||||
|
|
||||||
|
onChange() {
|
||||||
|
this.setState({
|
||||||
|
users: this.getUsers()
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const memberList = this.props.users.map(function makeListItem(user) {
|
const memberList = this.state.users.map((user) => {
|
||||||
return (
|
return (
|
||||||
<MemberListTeamItem
|
<MemberListTeamItem
|
||||||
key={user.id}
|
key={user.id}
|
||||||
user={user}
|
user={user}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}, this);
|
});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<table className='table more-table member-list-holder'>
|
<table className='table more-table member-list-holder'>
|
||||||
@@ -23,7 +62,3 @@ export default class MemberListTeam extends React.Component {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MemberListTeam.propTypes = {
|
|
||||||
users: React.PropTypes.arrayOf(React.PropTypes.object).isRequired
|
|
||||||
};
|
|
||||||
|
|||||||
@@ -8,6 +8,8 @@ import TeamStore from '../stores/team_store.jsx';
|
|||||||
import * as EventHelpers from '../dispatcher/event_helpers.jsx';
|
import * as EventHelpers from '../dispatcher/event_helpers.jsx';
|
||||||
|
|
||||||
import AboutBuildModal from './about_build_modal.jsx';
|
import AboutBuildModal from './about_build_modal.jsx';
|
||||||
|
import TeamMembersModal from './team_members_modal.jsx';
|
||||||
|
import ToggleModalButton from './toggle_modal_button.jsx';
|
||||||
import UserSettingsModal from './user_settings/user_settings_modal.jsx';
|
import UserSettingsModal from './user_settings/user_settings_modal.jsx';
|
||||||
|
|
||||||
import Constants from '../utils/constants.jsx';
|
import Constants from '../utils/constants.jsx';
|
||||||
@@ -117,13 +119,9 @@ export default class NavbarDropdown extends React.Component {
|
|||||||
if (isAdmin) {
|
if (isAdmin) {
|
||||||
manageLink = (
|
manageLink = (
|
||||||
<li>
|
<li>
|
||||||
<a
|
<ToggleModalButton dialogType={TeamMembersModal}>
|
||||||
href='#'
|
|
||||||
data-toggle='modal'
|
|
||||||
data-target='#team_members'
|
|
||||||
>
|
|
||||||
{'Manage Members'}
|
{'Manage Members'}
|
||||||
</a>
|
</ToggleModalButton>
|
||||||
</li>
|
</li>
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
// 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 TeamMembersModal from './team_members_modal.jsx';
|
||||||
|
import ToggleModalButton from './toggle_modal_button.jsx';
|
||||||
import UserSettingsModal from './user_settings/user_settings_modal.jsx';
|
import UserSettingsModal from './user_settings/user_settings_modal.jsx';
|
||||||
import UserStore from '../stores/user_store.jsx';
|
import UserStore from '../stores/user_store.jsx';
|
||||||
import * as client from '../utils/client.jsx';
|
import * as client from '../utils/client.jsx';
|
||||||
@@ -78,12 +80,9 @@ export default class SidebarRightMenu extends React.Component {
|
|||||||
);
|
);
|
||||||
manageLink = (
|
manageLink = (
|
||||||
<li>
|
<li>
|
||||||
<a
|
<ToggleModalButton dialogType={TeamMembersModal}>
|
||||||
href='#'
|
<i className='fa fa-users'></i>{'Manage Members'}
|
||||||
data-toggle='modal'
|
</ToggleModalButton>
|
||||||
data-target='#team_members'
|
|
||||||
>
|
|
||||||
<i className='fa fa-users'></i>Manage Members</a>
|
|
||||||
</li>
|
</li>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,130 +0,0 @@
|
|||||||
// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved.
|
|
||||||
// See License.txt for license information.
|
|
||||||
|
|
||||||
import UserStore from '../stores/user_store.jsx';
|
|
||||||
import MemberListTeam from './member_list_team.jsx';
|
|
||||||
import * as utils from '../utils/utils.jsx';
|
|
||||||
|
|
||||||
function getStateFromStores() {
|
|
||||||
var users = UserStore.getProfiles();
|
|
||||||
var memberList = [];
|
|
||||||
for (var id in users) {
|
|
||||||
if (users.hasOwnProperty(id)) {
|
|
||||||
memberList.push(users[id]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
memberList.sort(function sort(a, b) {
|
|
||||||
if (a.username < b.username) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (a.username > b.username) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
});
|
|
||||||
|
|
||||||
return {
|
|
||||||
member_list: memberList
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
export default class TeamMembers extends React.Component {
|
|
||||||
constructor(props) {
|
|
||||||
super(props);
|
|
||||||
|
|
||||||
this.onChange = this.onChange.bind(this);
|
|
||||||
|
|
||||||
this.state = getStateFromStores();
|
|
||||||
}
|
|
||||||
|
|
||||||
componentDidMount() {
|
|
||||||
UserStore.addChangeListener(this.onChange);
|
|
||||||
|
|
||||||
var self = this;
|
|
||||||
$(ReactDOM.findDOMNode(this.refs.modal)).on('hidden.bs.modal', function show() {
|
|
||||||
self.setState({render_members: false});
|
|
||||||
});
|
|
||||||
|
|
||||||
$(ReactDOM.findDOMNode(this.refs.modal)).on('show.bs.modal', function hide() {
|
|
||||||
self.setState({render_members: true});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
componentWillUnmount() {
|
|
||||||
UserStore.removeChangeListener(this.onChange);
|
|
||||||
}
|
|
||||||
|
|
||||||
onChange() {
|
|
||||||
var newState = getStateFromStores();
|
|
||||||
if (!utils.areObjectsEqual(newState, this.state)) {
|
|
||||||
this.setState(newState);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
render() {
|
|
||||||
var serverError = null;
|
|
||||||
|
|
||||||
if (this.state.server_error) {
|
|
||||||
serverError = <label className='has-error control-label'>{this.state.server_error}</label>;
|
|
||||||
}
|
|
||||||
|
|
||||||
var renderMembers = '';
|
|
||||||
|
|
||||||
if (this.state.render_members) {
|
|
||||||
renderMembers = <MemberListTeam users={this.state.member_list} />;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div
|
|
||||||
className='modal fade more-modal'
|
|
||||||
ref='modal'
|
|
||||||
id='team_members'
|
|
||||||
tabIndex='-1'
|
|
||||||
role='dialog'
|
|
||||||
aria-hidden='true'
|
|
||||||
>
|
|
||||||
<div className='modal-dialog'>
|
|
||||||
<div className='modal-content'>
|
|
||||||
<div className='modal-header'>
|
|
||||||
<button
|
|
||||||
type='button'
|
|
||||||
className='close'
|
|
||||||
data-dismiss='modal'
|
|
||||||
aria-label='Close'
|
|
||||||
>
|
|
||||||
<span aria-hidden='true'>×</span>
|
|
||||||
</button>
|
|
||||||
<h4
|
|
||||||
className='modal-title'
|
|
||||||
id='myModalLabel'
|
|
||||||
>{this.props.teamDisplayName + ' Members'}</h4>
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
ref='modalBody'
|
|
||||||
className='modal-body'
|
|
||||||
>
|
|
||||||
<div className='team-member-list'>
|
|
||||||
{renderMembers}
|
|
||||||
</div>
|
|
||||||
{serverError}
|
|
||||||
</div>
|
|
||||||
<div className='modal-footer'>
|
|
||||||
<button
|
|
||||||
type='button'
|
|
||||||
className='btn btn-default'
|
|
||||||
data-dismiss='modal'
|
|
||||||
>Close</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TeamMembers.propTypes = {
|
|
||||||
teamDisplayName: React.PropTypes.string
|
|
||||||
};
|
|
||||||
69
web/react/components/team_members_modal.jsx
Обычный файл
69
web/react/components/team_members_modal.jsx
Обычный файл
@@ -0,0 +1,69 @@
|
|||||||
|
// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved.
|
||||||
|
// See License.txt for license information.
|
||||||
|
|
||||||
|
import MemberListTeam from './member_list_team.jsx';
|
||||||
|
import TeamStore from '../stores/team_store.jsx';
|
||||||
|
|
||||||
|
const Modal = ReactBootstrap.Modal;
|
||||||
|
|
||||||
|
export default class TeamMembersModal extends React.Component {
|
||||||
|
constructor(props) {
|
||||||
|
super(props);
|
||||||
|
|
||||||
|
this.onShow = this.onShow.bind(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidMount() {
|
||||||
|
if (this.props.show) {
|
||||||
|
this.onShow();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidUpdate(prevProps) {
|
||||||
|
if (this.props.show && !prevProps.show) {
|
||||||
|
this.onShow();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onShow() {
|
||||||
|
$(ReactDOM.findDOMNode(this.refs.modalBody)).css('max-height', $(window).height() - 300);
|
||||||
|
if ($(window).width() > 768) {
|
||||||
|
$(ReactDOM.findDOMNode(this.refs.modalBody)).perfectScrollbar();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const team = TeamStore.getCurrent();
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Modal
|
||||||
|
dialogClassName='team-members-modal'
|
||||||
|
show={this.props.show}
|
||||||
|
onHide={this.props.onHide}
|
||||||
|
>
|
||||||
|
<Modal.Header closeButton={true}>
|
||||||
|
{team.display_name + ' Members'}
|
||||||
|
</Modal.Header>
|
||||||
|
<Modal.Body ref='modalBody'>
|
||||||
|
<div className='team-member-list'>
|
||||||
|
<MemberListTeam />
|
||||||
|
</div>
|
||||||
|
</Modal.Body>
|
||||||
|
<Modal.Footer>
|
||||||
|
<button
|
||||||
|
type='button'
|
||||||
|
className='btn btn-default'
|
||||||
|
onClick={this.props.onHide}
|
||||||
|
>
|
||||||
|
{'Close'}
|
||||||
|
</button>
|
||||||
|
</Modal.Footer>
|
||||||
|
</Modal>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TeamMembersModal.propTypes = {
|
||||||
|
show: React.PropTypes.bool.isRequired,
|
||||||
|
onHide: React.PropTypes.func.isRequired
|
||||||
|
};
|
||||||
@@ -14,7 +14,6 @@ import DeletePostModal from '../components/delete_post_modal.jsx';
|
|||||||
import MoreChannelsModal from '../components/more_channels.jsx';
|
import MoreChannelsModal from '../components/more_channels.jsx';
|
||||||
import PostDeletedModal from '../components/post_deleted_modal.jsx';
|
import PostDeletedModal from '../components/post_deleted_modal.jsx';
|
||||||
import TeamSettingsModal from '../components/team_settings_modal.jsx';
|
import TeamSettingsModal from '../components/team_settings_modal.jsx';
|
||||||
import TeamMembersModal from '../components/team_members.jsx';
|
|
||||||
import RemovedFromChannelModal from '../components/removed_from_channel_modal.jsx';
|
import RemovedFromChannelModal from '../components/removed_from_channel_modal.jsx';
|
||||||
import RegisterAppModal from '../components/register_app_modal.jsx';
|
import RegisterAppModal from '../components/register_app_modal.jsx';
|
||||||
import ImportThemeModal from '../components/user_settings/import_theme_modal.jsx';
|
import ImportThemeModal from '../components/user_settings/import_theme_modal.jsx';
|
||||||
@@ -86,11 +85,6 @@ function setupChannelPage(props, team, channel) {
|
|||||||
document.getElementById('team_settings_modal')
|
document.getElementById('team_settings_modal')
|
||||||
);
|
);
|
||||||
|
|
||||||
ReactDOM.render(
|
|
||||||
<TeamMembersModal teamDisplayName={props.TeamDisplayName} />,
|
|
||||||
document.getElementById('team_members_modal')
|
|
||||||
);
|
|
||||||
|
|
||||||
ReactDOM.render(
|
ReactDOM.render(
|
||||||
<RenameChannelModal />,
|
<RenameChannelModal />,
|
||||||
document.getElementById('rename_channel_modal')
|
document.getElementById('rename_channel_modal')
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user