mirror of
https://github.com/mattermost/mattermost.git
synced 2025-02-25 18:55:24 -06:00
363 lines
13 KiB
JavaScript
363 lines
13 KiB
JavaScript
// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved.
|
|
// See License.txt for license information.
|
|
|
|
import $ from 'jquery';
|
|
import ReactDOM from 'react-dom';
|
|
import * as Utils from 'utils/utils.jsx';
|
|
import * as GlobalActions from 'actions/global_actions.jsx';
|
|
|
|
import TeamStore from 'stores/team_store.jsx';
|
|
import UserStore from 'stores/user_store.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 Constants from 'utils/constants.jsx';
|
|
|
|
import {FormattedMessage} from 'react-intl';
|
|
import {Link} from 'react-router';
|
|
|
|
import React from 'react';
|
|
|
|
export default class NavbarDropdown extends React.Component {
|
|
constructor(props) {
|
|
super(props);
|
|
this.blockToggle = false;
|
|
|
|
this.handleAboutModal = this.handleAboutModal.bind(this);
|
|
this.aboutModalDismissed = this.aboutModalDismissed.bind(this);
|
|
this.onTeamChange = this.onTeamChange.bind(this);
|
|
this.openAccountSettings = this.openAccountSettings.bind(this);
|
|
|
|
this.state = {
|
|
showUserSettingsModal: false,
|
|
showAboutModal: false,
|
|
teams: TeamStore.getAll(),
|
|
teamMembers: TeamStore.getTeamMembers()
|
|
};
|
|
}
|
|
handleAboutModal() {
|
|
this.setState({showAboutModal: true});
|
|
}
|
|
aboutModalDismissed() {
|
|
this.setState({showAboutModal: false});
|
|
}
|
|
|
|
componentDidMount() {
|
|
$(ReactDOM.findDOMNode(this.refs.dropdown)).on('hide.bs.dropdown', () => {
|
|
$('.sidebar--left .dropdown-menu').scrollTop(0);
|
|
this.blockToggle = true;
|
|
setTimeout(() => {
|
|
this.blockToggle = false;
|
|
}, 100);
|
|
});
|
|
|
|
TeamStore.addChangeListener(this.onTeamChange);
|
|
document.addEventListener('keydown', this.openAccountSettings);
|
|
}
|
|
|
|
onTeamChange() {
|
|
this.setState({
|
|
teams: TeamStore.getAll(),
|
|
teamMembers: TeamStore.getTeamMembers()
|
|
});
|
|
}
|
|
|
|
componentWillUnmount() {
|
|
$(ReactDOM.findDOMNode(this.refs.dropdown)).off('hide.bs.dropdown');
|
|
TeamStore.removeChangeListener(this.onTeamChange);
|
|
document.removeEventListener('keydown', this.openAccountSettings);
|
|
}
|
|
openAccountSettings(e) {
|
|
if ((e.ctrlKey || e.metaKey) && e.shiftKey && e.keyCode === Constants.KeyCodes.A) {
|
|
e.preventDefault();
|
|
this.setState({showUserSettingsModal: true});
|
|
}
|
|
}
|
|
render() {
|
|
var teamLink = '';
|
|
var inviteLink = '';
|
|
var manageLink = '';
|
|
var sysAdminLink = '';
|
|
var currentUser = this.props.currentUser;
|
|
var isAdmin = false;
|
|
var isSystemAdmin = false;
|
|
var teamSettings = null;
|
|
let integrationsLink = null;
|
|
|
|
if (currentUser != null) {
|
|
isAdmin = TeamStore.isTeamAdminForCurrentTeam() || UserStore.isSystemAdminForCurrentUser();
|
|
isSystemAdmin = UserStore.isSystemAdminForCurrentUser();
|
|
|
|
inviteLink = (
|
|
<li>
|
|
<a
|
|
href='#'
|
|
onClick={GlobalActions.showInviteMemberModal}
|
|
>
|
|
<FormattedMessage
|
|
id='navbar_dropdown.inviteMember'
|
|
defaultMessage='Invite New Member'
|
|
/>
|
|
</a>
|
|
</li>
|
|
);
|
|
|
|
if (this.props.teamType === Constants.OPEN_TEAM && global.window.mm_config.EnableUserCreation === 'true') {
|
|
teamLink = (
|
|
<li>
|
|
<a
|
|
href='#'
|
|
onClick={GlobalActions.showGetTeamInviteLinkModal}
|
|
>
|
|
<FormattedMessage
|
|
id='navbar_dropdown.teamLink'
|
|
defaultMessage='Get Team Invite Link'
|
|
/>
|
|
</a>
|
|
</li>
|
|
);
|
|
}
|
|
}
|
|
|
|
if (isAdmin) {
|
|
manageLink = (
|
|
<li>
|
|
<ToggleModalButton dialogType={TeamMembersModal}>
|
|
<FormattedMessage
|
|
id='navbar_dropdown.manageMembers'
|
|
defaultMessage='Manage Members'
|
|
/>
|
|
</ToggleModalButton>
|
|
</li>
|
|
);
|
|
|
|
teamSettings = (
|
|
<li>
|
|
<a
|
|
href='#'
|
|
data-toggle='modal'
|
|
data-target='#team_settings'
|
|
>
|
|
<FormattedMessage
|
|
id='navbar_dropdown.teamSettings'
|
|
defaultMessage='Team Settings'
|
|
/>
|
|
</a>
|
|
</li>
|
|
);
|
|
}
|
|
|
|
const integrationsEnabled =
|
|
window.mm_config.EnableIncomingWebhooks === 'true' ||
|
|
window.mm_config.EnableOutgoingWebhooks === 'true' ||
|
|
window.mm_config.EnableCommands === 'true';
|
|
if (integrationsEnabled && (isAdmin || window.mm_config.EnableOnlyAdminIntegrations !== 'true')) {
|
|
integrationsLink = (
|
|
<li>
|
|
<Link to={'/' + Utils.getTeamNameFromUrl() + '/settings/integrations'}>
|
|
<FormattedMessage
|
|
id='navbar_dropdown.integrations'
|
|
defaultMessage='Integrations'
|
|
/>
|
|
</Link>
|
|
</li>
|
|
);
|
|
}
|
|
|
|
if (isSystemAdmin) {
|
|
sysAdminLink = (
|
|
<li>
|
|
<Link
|
|
to={'/admin_console'}
|
|
>
|
|
<FormattedMessage
|
|
id='navbar_dropdown.console'
|
|
defaultMessage='System Console'
|
|
/>
|
|
</Link>
|
|
</li>
|
|
);
|
|
}
|
|
|
|
var teams = [];
|
|
|
|
if (global.window.mm_config.EnableTeamCreation === 'true') {
|
|
teams.push(
|
|
<li key='newTeam_li'>
|
|
<Link
|
|
key='newTeam_a'
|
|
to='/create_team'
|
|
>
|
|
<FormattedMessage
|
|
id='navbar_dropdown.create'
|
|
defaultMessage='Create a New Team'
|
|
/>
|
|
</Link>
|
|
</li>
|
|
);
|
|
}
|
|
|
|
if (this.state.teamMembers && this.state.teamMembers.length > 1) {
|
|
teams.push(
|
|
<li
|
|
key='teamDiv'
|
|
className='divider'
|
|
></li>
|
|
);
|
|
|
|
for (var index in this.state.teamMembers) {
|
|
if (this.state.teamMembers.hasOwnProperty(index)) {
|
|
var teamMember = this.state.teamMembers[index];
|
|
var team = this.state.teams[teamMember.team_id];
|
|
|
|
if (team.name !== this.props.teamName) {
|
|
teams.push(
|
|
<li key={'team_' + team.name}>
|
|
<Link
|
|
to={'/' + team.name + '/channels/town-square'}
|
|
>
|
|
<FormattedMessage
|
|
id='navbar_dropdown.switchTo'
|
|
defaultMessage='Switch to '
|
|
/>
|
|
{team.display_name}
|
|
</Link>
|
|
</li>
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
let helpLink = null;
|
|
if (global.window.mm_config.HelpLink) {
|
|
helpLink = (
|
|
<li>
|
|
<Link
|
|
target='_blank'
|
|
rel='noopener noreferrer'
|
|
to={global.window.mm_config.HelpLink}
|
|
>
|
|
<FormattedMessage
|
|
id='navbar_dropdown.help'
|
|
defaultMessage='Help'
|
|
/>
|
|
</Link>
|
|
</li>
|
|
);
|
|
}
|
|
|
|
let reportLink = null;
|
|
if (global.window.mm_config.ReportAProblemLink) {
|
|
reportLink = (
|
|
<li>
|
|
<Link
|
|
target='_blank'
|
|
rel='noopener noreferrer'
|
|
to={global.window.mm_config.ReportAProblemLink}
|
|
>
|
|
<FormattedMessage
|
|
id='navbar_dropdown.report'
|
|
defaultMessage='Report a Problem'
|
|
/>
|
|
</Link>
|
|
</li>
|
|
);
|
|
}
|
|
|
|
return (
|
|
<ul className='nav navbar-nav navbar-right'>
|
|
<li
|
|
ref='dropdown'
|
|
className='dropdown'
|
|
>
|
|
<a
|
|
href='#'
|
|
className='dropdown-toggle'
|
|
data-toggle='dropdown'
|
|
role='button'
|
|
aria-expanded='false'
|
|
>
|
|
<span
|
|
className='dropdown__icon'
|
|
dangerouslySetInnerHTML={{__html: Constants.MENU_ICON}}
|
|
/>
|
|
</a>
|
|
<ul
|
|
className='dropdown-menu'
|
|
role='menu'
|
|
>
|
|
<li>
|
|
<a
|
|
href='#'
|
|
onClick={(e) => {
|
|
e.preventDefault();
|
|
this.setState({showUserSettingsModal: true});
|
|
}}
|
|
>
|
|
<FormattedMessage
|
|
id='navbar_dropdown.accountSettings'
|
|
defaultMessage='Account Settings'
|
|
/>
|
|
</a>
|
|
</li>
|
|
{inviteLink}
|
|
{teamLink}
|
|
<li>
|
|
<a
|
|
href='#'
|
|
onClick={GlobalActions.emitUserLoggedOutEvent}
|
|
>
|
|
<FormattedMessage
|
|
id='navbar_dropdown.logout'
|
|
defaultMessage='Logout'
|
|
/>
|
|
</a>
|
|
</li>
|
|
<li className='divider'></li>
|
|
{teamSettings}
|
|
{integrationsLink}
|
|
{manageLink}
|
|
{sysAdminLink}
|
|
{teams}
|
|
<li className='divider'></li>
|
|
{helpLink}
|
|
{reportLink}
|
|
<li>
|
|
<a
|
|
href='#'
|
|
onClick={this.handleAboutModal}
|
|
>
|
|
<FormattedMessage
|
|
id='navbar_dropdown.about'
|
|
defaultMessage='About Mattermost'
|
|
/>
|
|
</a>
|
|
</li>
|
|
<UserSettingsModal
|
|
show={this.state.showUserSettingsModal}
|
|
onModalDismissed={() => this.setState({showUserSettingsModal: false})}
|
|
/>
|
|
<AboutBuildModal
|
|
show={this.state.showAboutModal}
|
|
onModalDismissed={this.aboutModalDismissed}
|
|
/>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
);
|
|
}
|
|
}
|
|
|
|
NavbarDropdown.defaultProps = {
|
|
teamType: ''
|
|
};
|
|
NavbarDropdown.propTypes = {
|
|
teamType: React.PropTypes.string,
|
|
teamDisplayName: React.PropTypes.string,
|
|
teamName: React.PropTypes.string,
|
|
currentUser: React.PropTypes.object
|
|
};
|