Ported UserSettingsModal to React-Bootstrap

Этот коммит содержится в:
hmhealey
2015-10-30 11:13:56 -04:00
родитель 1675adcc7a
Коммит 738568e5a9
8 изменённых файлов: 78 добавлений и 48 удалений

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

@@ -8,6 +8,7 @@ var TeamStore = require('../stores/team_store.jsx');
var AboutBuildModal = require('./about_build_modal.jsx'); var AboutBuildModal = require('./about_build_modal.jsx');
var InviteMemberModal = require('./invite_member_modal.jsx'); var InviteMemberModal = require('./invite_member_modal.jsx');
var UserSettingsModal = require('./user_settings/user_settings_modal.jsx');
var Constants = require('../utils/constants.jsx'); var Constants = require('../utils/constants.jsx');
@@ -43,6 +44,7 @@ export default class NavbarDropdown extends React.Component {
this.aboutModalDismissed = this.aboutModalDismissed.bind(this); this.aboutModalDismissed = this.aboutModalDismissed.bind(this);
const state = getStateFromStores(); const state = getStateFromStores();
state.showUserSettingsModal = false;
state.showAboutModal = false; state.showAboutModal = false;
state.showInviteMemberModal = false; state.showInviteMemberModal = false;
this.state = state; this.state = state;
@@ -221,8 +223,7 @@ export default class NavbarDropdown extends React.Component {
<li> <li>
<a <a
href='#' href='#'
data-toggle='modal' onClick={() => this.setState({showUserSettingsModal: true})}
data-target='#user_settings'
> >
{'Account Settings'} {'Account Settings'}
</a> </a>
@@ -267,6 +268,10 @@ export default class NavbarDropdown extends React.Component {
{'About Mattermost'} {'About Mattermost'}
</a> </a>
</li> </li>
<UserSettingsModal
show={this.state.showUserSettingsModal}
onModalDismissed={() => this.setState({showUserSettingsModal: false})}
/>
<AboutBuildModal <AboutBuildModal
show={this.state.showAboutModal} show={this.state.showAboutModal}
onModalDismissed={this.aboutModalDismissed} onModalDismissed={this.aboutModalDismissed}

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

@@ -2,6 +2,7 @@
// See License.txt for license information. // See License.txt for license information.
var InviteMemberModal = require('./invite_member_modal.jsx'); var InviteMemberModal = require('./invite_member_modal.jsx');
var UserSettingsModal = require('./user_settings/user_settings_modal.jsx');
var UserStore = require('../stores/user_store.jsx'); var UserStore = require('../stores/user_store.jsx');
var TeamStore = require('../stores/team_store.jsx'); var TeamStore = require('../stores/team_store.jsx');
var client = require('../utils/client.jsx'); var client = require('../utils/client.jsx');
@@ -18,6 +19,7 @@ export default class SidebarRightMenu extends React.Component {
this.handleLogoutClick = this.handleLogoutClick.bind(this); this.handleLogoutClick = this.handleLogoutClick.bind(this);
this.state = { this.state = {
showUserSettingsModal: false,
showInviteMemberModal: false showInviteMemberModal: false
}; };
} }
@@ -122,9 +124,11 @@ export default class SidebarRightMenu extends React.Component {
<li> <li>
<a <a
href='#' href='#'
data-toggle='modal' onClick={() => this.setState({showUserSettingsModal: true})}
data-target='#user_settings' >
><i className='glyphicon glyphicon-cog'></i>Account Settings</a></li> <i className='glyphicon glyphicon-cog'></i>Account Settings
</a>
</li>
{teamSettingsLink} {teamSettingsLink}
{inviteLink} {inviteLink}
{teamLink} {teamLink}
@@ -148,6 +152,10 @@ export default class SidebarRightMenu extends React.Component {
><i className='glyphicon glyphicon-earphone'></i>Report a Problem</a></li> ><i className='glyphicon glyphicon-earphone'></i>Report a Problem</a></li>
</ul> </ul>
</div> </div>
<UserSettingsModal
show={this.state.showUserSettingsModal}
onModalDismissed={() => this.setState({showUserSettingsModal: false})}
/>
<InviteMemberModal <InviteMemberModal
show={this.state.showInviteMemberModal} show={this.state.showInviteMemberModal}
onModalDismissed={() => this.setState({showInviteMemberModal: false})} onModalDismissed={() => this.setState({showInviteMemberModal: false})}

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

@@ -74,7 +74,6 @@ export default class ImportThemeModal extends React.Component {
this.setState({show: false}); this.setState({show: false});
Utils.applyTheme(theme); Utils.applyTheme(theme);
$('#user_settings').modal('show');
}, },
(err) => { (err) => {
var state = this.getStateFromStores(); var state = this.getStateFromStores();

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

@@ -32,7 +32,7 @@ export default class UserSettings extends React.Component {
onListenerChange() { onListenerChange() {
var user = UserStore.getCurrentUser(); var user = UserStore.getCurrentUser();
if (!utils.areStatesEqual(this.state.user, user)) { if (!utils.areStatesEqual(this.state.user, user)) {
this.setState({user: user}); this.setState({user});
} }
} }

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

@@ -126,10 +126,8 @@ export default class UserSettingsAppearance extends React.Component {
$('.ps-container.modal-body').scrollTop(0); $('.ps-container.modal-body').scrollTop(0);
$('.ps-container.modal-body').perfectScrollbar('update'); $('.ps-container.modal-body').perfectScrollbar('update');
$('#user_settings').modal('hide');
} }
handleImportModal() { handleImportModal() {
$('#user_settings').modal('hide');
AppDispatcher.handleViewAction({ AppDispatcher.handleViewAction({
type: ActionTypes.TOGGLE_IMPORT_THEME_MODAL, type: ActionTypes.TOGGLE_IMPORT_THEME_MODAL,
value: true value: true

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

@@ -1,6 +1,7 @@
// 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.
const Modal = ReactBootstrap.Modal;
var SettingsSidebar = require('../settings_sidebar.jsx'); var SettingsSidebar = require('../settings_sidebar.jsx');
var UserSettings = require('./user_settings.jsx'); var UserSettings = require('./user_settings.jsx');
@@ -8,27 +9,61 @@ export default class UserSettingsModal extends React.Component {
constructor(props) { constructor(props) {
super(props); super(props);
this.handleHide = this.handleHide.bind(this);
this.handleHidden = this.handleHidden.bind(this);
this.updateTab = this.updateTab.bind(this); this.updateTab = this.updateTab.bind(this);
this.updateSection = this.updateSection.bind(this); this.updateSection = this.updateSection.bind(this);
this.state = {active_tab: 'general', active_section: ''}; this.state = {
active_tab: 'general',
active_section: ''
};
} }
componentDidMount() { componentDidMount() {
$('body').on('click', '.modal-back', function changeDisplay() { $('body').on('click', '.settings-content .modal-back', () => {
$(this).closest('.modal-dialog').removeClass('display--content'); $(this).closest('.modal-dialog').removeClass('display--content');
}); });
$('body').on('click', '.modal-header .close', () => { $('body').on('click', '.settings-content .modal-header .close', () => {
this.handleHide();
setTimeout(() => { setTimeout(() => {
$('.modal-dialog.display--content').removeClass('display--content'); $('.modal-dialog.display--content').removeClass('display--content');
}, 500); }, 500);
}); });
} }
componentDidUpdate(prevProps) {
if (!prevProps.show && this.props.show) {
$(ReactDOM.findDOMNode(this.refs.modalBody)).css('max-height', $(window).height() - 300);
if ($(window).width() > 768) {
$(ReactDOM.findDOMNode(this.refs.modalBody)).perfectScrollbar();
}
}
}
handleHide() {
// called when the close button is pressed
this.props.onModalDismissed();
}
handleHidden() {
// called after the dialog is fully hidden and faded out
this.setState({
active_tag: 'general',
active_section: ''
});
}
updateTab(tab) { updateTab(tab) {
this.setState({active_tab: tab}); this.setState({active_tab: tab});
} }
updateSection(section) { updateSection(section) {
this.setState({active_section: section}); this.setState({active_section: section});
} }
render() { render() {
var tabs = []; var tabs = [];
tabs.push({name: 'general', uiName: 'General', icon: 'glyphicon glyphicon-cog'}); tabs.push({name: 'general', uiName: 'General', icon: 'glyphicon glyphicon-cog'});
@@ -46,33 +81,16 @@ export default class UserSettingsModal extends React.Component {
tabs.push({name: 'advanced', uiName: 'Advanced', icon: 'glyphicon glyphicon-list-alt'}); tabs.push({name: 'advanced', uiName: 'Advanced', icon: 'glyphicon glyphicon-list-alt'});
return ( return (
<div <Modal
className='modal fade' dialogClassName='settings-modal'
ref='modal' show={this.props.show}
id='user_settings' onHide={this.handleHide}
role='dialog' onExited={this.handleHidden}
tabIndex='-1'
aria-hidden='true'
> >
<div className='modal-dialog settings-modal'> <Modal.Header closeButton={true}>
<div className='modal-content'> <Modal.Title>{'Account Settings'}</Modal.Title>
<div className='modal-header'> </Modal.Header>
<button <Modal.Body ref='modalBody'>
type='button'
className='close'
data-dismiss='modal'
aria-label='Close'
>
<span aria-hidden='true'>{'×'}</span>
</button>
<h4
className='modal-title'
ref='title'
>
{'Account Settings'}
</h4>
</div>
<div className='modal-body'>
<div className='settings-table'> <div className='settings-table'>
<div className='settings-links'> <div className='settings-links'>
<SettingsSidebar <SettingsSidebar
@@ -83,6 +101,7 @@ export default class UserSettingsModal extends React.Component {
</div> </div>
<div className='settings-content minimize-settings'> <div className='settings-content minimize-settings'>
<UserSettings <UserSettings
ref='userSettings'
activeTab={this.state.active_tab} activeTab={this.state.active_tab}
activeSection={this.state.active_section} activeSection={this.state.active_section}
updateSection={this.updateSection} updateSection={this.updateSection}
@@ -90,10 +109,13 @@ export default class UserSettingsModal extends React.Component {
/> />
</div> </div>
</div> </div>
</div> </Modal.Body>
</div> </Modal>
</div>
</div>
); );
} }
} }
UserSettingsModal.propTypes = {
show: React.PropTypes.bool.isRequired,
onModalDismissed: React.PropTypes.func.isRequired
};

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

@@ -17,7 +17,6 @@ var DeletePostModal = require('../components/delete_post_modal.jsx');
var MoreChannelsModal = require('../components/more_channels.jsx'); var MoreChannelsModal = require('../components/more_channels.jsx');
var PostDeletedModal = require('../components/post_deleted_modal.jsx'); var PostDeletedModal = require('../components/post_deleted_modal.jsx');
var ChannelNotificationsModal = require('../components/channel_notifications.jsx'); var ChannelNotificationsModal = require('../components/channel_notifications.jsx');
var UserSettingsModal = require('../components/user_settings/user_settings_modal.jsx');
var TeamSettingsModal = require('../components/team_settings_modal.jsx'); var TeamSettingsModal = require('../components/team_settings_modal.jsx');
var ChannelMembersModal = require('../components/channel_members.jsx'); var ChannelMembersModal = require('../components/channel_members.jsx');
var ChannelInviteModal = require('../components/channel_invite_modal.jsx'); var ChannelInviteModal = require('../components/channel_invite_modal.jsx');
@@ -79,11 +78,6 @@ function setupChannelPage(props) {
document.getElementById('get_link_modal') document.getElementById('get_link_modal')
); );
ReactDOM.render(
<UserSettingsModal />,
document.getElementById('user_settings_modal')
);
ReactDOM.render( ReactDOM.render(
<ImportThemeModal />, <ImportThemeModal />,
document.getElementById('import_theme_modal') document.getElementById('import_theme_modal')

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

@@ -13,6 +13,10 @@
.settings-modal { .settings-modal {
width:800px; width:800px;
max-width: 100%; max-width: 100%;
.modal-content {
width:800px;
max-width: 100%;
}
.modal-back { .modal-back {
width: 40px; width: 40px;
height: 56px; height: 56px;