PLT-11 adding config for logs to UI
Этот коммит содержится в:
@@ -1,14 +1,12 @@
|
|||||||
// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved.
|
// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved.
|
||||||
// See License.txt for license information.
|
// See License.txt for license information.
|
||||||
|
|
||||||
var Navbar = require('../../components/navbar.jsx');
|
|
||||||
var AdminSidebar = require('./admin_sidebar.jsx');
|
var AdminSidebar = require('./admin_sidebar.jsx');
|
||||||
var AdminStore = require('../../stores/admin_store.jsx');
|
var AdminStore = require('../../stores/admin_store.jsx');
|
||||||
var AsyncClient = require('../../utils/async_client.jsx');
|
var AsyncClient = require('../../utils/async_client.jsx');
|
||||||
var LoadingScreen = require('../loading_screen.jsx');
|
var LoadingScreen = require('../loading_screen.jsx');
|
||||||
|
|
||||||
var EmailSettingsTab = require('./email_settings.jsx');
|
var EmailSettingsTab = require('./email_settings.jsx');
|
||||||
var JobsSettingsTab = require('./jobs_settings.jsx');
|
|
||||||
var LogSettingsTab = require('./log_settings.jsx');
|
var LogSettingsTab = require('./log_settings.jsx');
|
||||||
var LogsTab = require('./logs.jsx');
|
var LogsTab = require('./logs.jsx');
|
||||||
|
|
||||||
@@ -51,12 +49,10 @@ export default class AdminController extends React.Component {
|
|||||||
if (this.state.config != null) {
|
if (this.state.config != null) {
|
||||||
if (this.state.selected === 'email_settings') {
|
if (this.state.selected === 'email_settings') {
|
||||||
tab = <EmailSettingsTab config={this.state.config} />;
|
tab = <EmailSettingsTab config={this.state.config} />;
|
||||||
} else if (this.state.selected === 'job_settings') {
|
|
||||||
tab = <JobsSettingsTab config={this.state.config} />;
|
|
||||||
} else if (this.state.selected === 'logs') {
|
|
||||||
tab = <LogsTab />;
|
|
||||||
} else if (this.state.selected === 'log_settings') {
|
} else if (this.state.selected === 'log_settings') {
|
||||||
tab = <LogSettingsTab config={this.state.config} />;
|
tab = <LogSettingsTab config={this.state.config} />;
|
||||||
|
} else if (this.state.selected === 'logs') {
|
||||||
|
tab = <LogsTab />;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -72,7 +68,6 @@ export default class AdminController extends React.Component {
|
|||||||
/>
|
/>
|
||||||
<div className='inner__wrap channel__wrap'>
|
<div className='inner__wrap channel__wrap'>
|
||||||
<div className='row header'>
|
<div className='row header'>
|
||||||
<Navbar teamDisplayName='Admin Console' />
|
|
||||||
</div>
|
</div>
|
||||||
<div className='row main'>
|
<div className='row main'>
|
||||||
<div
|
<div
|
||||||
|
|||||||
102
web/react/components/admin_console/admin_navbar_dropdown.jsx
Обычный файл
102
web/react/components/admin_console/admin_navbar_dropdown.jsx
Обычный файл
@@ -0,0 +1,102 @@
|
|||||||
|
// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved.
|
||||||
|
// See License.txt for license information.
|
||||||
|
|
||||||
|
var Utils = require('../../utils/utils.jsx');
|
||||||
|
var Client = require('../../utils/client.jsx');
|
||||||
|
var TeamStore = require('../../stores/team_store.jsx');
|
||||||
|
|
||||||
|
var Constants = require('../../utils/constants.jsx');
|
||||||
|
|
||||||
|
function getStateFromStores() {
|
||||||
|
return {currentTeam: TeamStore.getCurrent()};
|
||||||
|
}
|
||||||
|
|
||||||
|
export default class AdminNavbarDropdown extends React.Component {
|
||||||
|
constructor(props) {
|
||||||
|
super(props);
|
||||||
|
this.blockToggle = false;
|
||||||
|
|
||||||
|
this.handleLogoutClick = this.handleLogoutClick.bind(this);
|
||||||
|
|
||||||
|
this.state = getStateFromStores();
|
||||||
|
}
|
||||||
|
|
||||||
|
handleLogoutClick(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
Client.logout();
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidMount() {
|
||||||
|
$(React.findDOMNode(this.refs.dropdown)).on('hide.bs.dropdown', () => {
|
||||||
|
this.blockToggle = true;
|
||||||
|
setTimeout(() => {
|
||||||
|
this.blockToggle = false;
|
||||||
|
}, 100);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
componentWillUnmount() {
|
||||||
|
$(React.findDOMNode(this.refs.dropdown)).off('hide.bs.dropdown');
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
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={Utils.getWindowLocationOrigin() + '/' + this.state.currentTeam.name}
|
||||||
|
>
|
||||||
|
{'Switch to ' + this.state.currentTeam.display_name}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a
|
||||||
|
href='#'
|
||||||
|
onClick={this.handleLogoutClick}
|
||||||
|
>
|
||||||
|
{'Logout'}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li className='divider'></li>
|
||||||
|
<li>
|
||||||
|
<a
|
||||||
|
target='_blank'
|
||||||
|
href='/static/help/help.html'
|
||||||
|
>
|
||||||
|
{'Help'}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a
|
||||||
|
target='_blank'
|
||||||
|
href='/static/help/report_problem.html'
|
||||||
|
>
|
||||||
|
{'Report a Problem'}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved.
|
// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved.
|
||||||
// See License.txt for license information.
|
// See License.txt for license information.
|
||||||
|
|
||||||
var SidebarHeader = require('../sidebar_header.jsx');
|
var AdminSidebarHeader = require('./admin_sidebar_header.jsx');
|
||||||
|
|
||||||
export default class AdminSidebar extends React.Component {
|
export default class AdminSidebar extends React.Component {
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
@@ -14,7 +14,8 @@ export default class AdminSidebar extends React.Component {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
handleClick(name) {
|
handleClick(name, e) {
|
||||||
|
e.preventDefault();
|
||||||
this.props.selectTab(name);
|
this.props.selectTab(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -27,46 +28,13 @@ export default class AdminSidebar extends React.Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
// $('.nav__menu-item').on('click', function clickme(e) {
|
|
||||||
// e.preventDefault();
|
|
||||||
// $(this).closest('.sidebar--collapsable').find('.nav__menu-item').removeClass('active');
|
|
||||||
// $(this).addClass('active');
|
|
||||||
// $(this).closest('.sidebar--collapsable').find('.nav__sub-menu').addClass('hide');
|
|
||||||
// $(this).next('.nav__sub-menu').removeClass('hide');
|
|
||||||
// });
|
|
||||||
|
|
||||||
// $('.nav__sub-menu a').on('click', function clickme(e) {
|
|
||||||
// e.preventDefault();
|
|
||||||
// $(this).closest('.nav__sub-menu').find('a').removeClass('active');
|
|
||||||
// $(this).addClass('active');
|
|
||||||
// });
|
|
||||||
|
|
||||||
// $('.nav__sub-menu-item').on('click', function clickme(e) {
|
|
||||||
// e.preventDefault();
|
|
||||||
// $(this).closest('.sidebar--collapsable').find('.nav__inner-menu').addClass('hide');
|
|
||||||
// $(this).closest('li').next('li').find('.nav__inner-menu').removeClass('hide');
|
|
||||||
// $(this).closest('li').next('li').find('.nav__inner-menu li:first a').addClass('active');
|
|
||||||
// });
|
|
||||||
|
|
||||||
// $('.nav__inner-menu a').on('click', function clickme() {
|
|
||||||
// $(this).closest('.nav__inner-menu').closest('li').prev('li').find('a').addClass('active');
|
|
||||||
// });
|
|
||||||
|
|
||||||
// $('.nav__sub-menu .menu__close').on('click', function close() {
|
|
||||||
// var menuItem = $(this).closest('li');
|
|
||||||
// menuItem.next('li').remove();
|
|
||||||
// menuItem.remove();
|
|
||||||
// });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
return (
|
return (
|
||||||
<div className='sidebar--left sidebar--collapsable'>
|
<div className='sidebar--left sidebar--collapsable'>
|
||||||
<div>
|
<div>
|
||||||
<SidebarHeader
|
<AdminSidebarHeader />
|
||||||
teamDisplayName='Admin Console'
|
|
||||||
teamType='I'
|
|
||||||
/>
|
|
||||||
<ul className='nav nav-pills nav-stacked'>
|
<ul className='nav nav-pills nav-stacked'>
|
||||||
<li>
|
<li>
|
||||||
<ul className='nav nav__sub-menu'>
|
<ul className='nav nav__sub-menu'>
|
||||||
@@ -74,7 +42,7 @@ export default class AdminSidebar extends React.Component {
|
|||||||
<a
|
<a
|
||||||
href='#'
|
href='#'
|
||||||
className={this.isSelected('email_settings')}
|
className={this.isSelected('email_settings')}
|
||||||
onClick={this.handleClick.bind(null, 'email_settings')}
|
onClick={this.handleClick.bind(this, 'email_settings')}
|
||||||
>
|
>
|
||||||
{'Email Settings'}
|
{'Email Settings'}
|
||||||
</a>
|
</a>
|
||||||
@@ -83,7 +51,7 @@ export default class AdminSidebar extends React.Component {
|
|||||||
<a
|
<a
|
||||||
href='#'
|
href='#'
|
||||||
className={this.isSelected('log_settings')}
|
className={this.isSelected('log_settings')}
|
||||||
onClick={this.handleClick.bind(null, 'log_settings')}
|
onClick={this.handleClick.bind(this, 'log_settings')}
|
||||||
>
|
>
|
||||||
{'Log Settings'}
|
{'Log Settings'}
|
||||||
</a>
|
</a>
|
||||||
@@ -92,20 +60,11 @@ export default class AdminSidebar extends React.Component {
|
|||||||
<a
|
<a
|
||||||
href='#'
|
href='#'
|
||||||
className={this.isSelected('logs')}
|
className={this.isSelected('logs')}
|
||||||
onClick={this.handleClick.bind(null, 'logs')}
|
onClick={this.handleClick.bind(this, 'logs')}
|
||||||
>
|
>
|
||||||
{'Logs'}
|
{'Logs'}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a
|
|
||||||
href='#'
|
|
||||||
className={this.isSelected('job_settings')}
|
|
||||||
onClick={this.handleClick.bind(null, 'job_settings')}
|
|
||||||
>
|
|
||||||
{'Job Settings'}
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved.
|
// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved.
|
||||||
// See License.txt for license information.
|
// See License.txt for license information.
|
||||||
|
|
||||||
var NavbarDropdown = require('./navbar_dropdown.jsx');
|
var AdminNavbarDropdown = require('./admin_navbar_dropdown.jsx');
|
||||||
var UserStore = require('../stores/user_store.jsx');
|
var UserStore = require('../../stores/user_store.jsx');
|
||||||
|
|
||||||
export default class SidebarHeader extends React.Component {
|
export default class SidebarHeader extends React.Component {
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
@@ -12,13 +12,18 @@ export default class SidebarHeader extends React.Component {
|
|||||||
|
|
||||||
this.state = {};
|
this.state = {};
|
||||||
}
|
}
|
||||||
toggleDropdown() {
|
|
||||||
|
toggleDropdown(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
|
||||||
if (this.refs.dropdown.blockToggle) {
|
if (this.refs.dropdown.blockToggle) {
|
||||||
this.refs.dropdown.blockToggle = false;
|
this.refs.dropdown.blockToggle = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$('.team__header').find('.dropdown-toggle').dropdown('toggle');
|
$('.team__header').find('.dropdown-toggle').dropdown('toggle');
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
var me = UserStore.getCurrentUser();
|
var me = UserStore.getCurrentUser();
|
||||||
var profilePicture = null;
|
var profilePicture = null;
|
||||||
@@ -45,23 +50,11 @@ export default class SidebarHeader extends React.Component {
|
|||||||
{profilePicture}
|
{profilePicture}
|
||||||
<div className='header__info'>
|
<div className='header__info'>
|
||||||
<div className='user__name'>{'@' + me.username}</div>
|
<div className='user__name'>{'@' + me.username}</div>
|
||||||
<div className='team__name'>{this.props.teamDisplayName}</div>
|
<div className='team__name'>{'System Console'}</div>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
<NavbarDropdown
|
<AdminNavbarDropdown ref='dropdown' />
|
||||||
ref='dropdown'
|
|
||||||
teamType={this.props.teamType}
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SidebarHeader.defaultProps = {
|
|
||||||
teamDisplayName: global.window.config.SiteName,
|
|
||||||
teamType: ''
|
|
||||||
};
|
|
||||||
SidebarHeader.propTypes = {
|
|
||||||
teamDisplayName: React.PropTypes.string,
|
|
||||||
teamType: React.PropTypes.string
|
|
||||||
};
|
|
||||||
|
|||||||
@@ -1,183 +0,0 @@
|
|||||||
// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved.
|
|
||||||
// See License.txt for license information.
|
|
||||||
|
|
||||||
export default class Jobs extends React.Component {
|
|
||||||
constructor(props) {
|
|
||||||
super(props);
|
|
||||||
|
|
||||||
this.state = {
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
render() {
|
|
||||||
return (
|
|
||||||
<div className='wrapper--fixed'>
|
|
||||||
<h3>{' ************** JOB Settings'}</h3>
|
|
||||||
<form
|
|
||||||
className='form-horizontal'
|
|
||||||
role='form'
|
|
||||||
>
|
|
||||||
<div className='form-group'>
|
|
||||||
<label
|
|
||||||
className='control-label col-sm-4'
|
|
||||||
htmlFor='email'
|
|
||||||
>
|
|
||||||
{'Bypass Email: '}
|
|
||||||
<a
|
|
||||||
href='#'
|
|
||||||
data-trigger='hover click'
|
|
||||||
data-toggle='popover'
|
|
||||||
data-position='bottom'
|
|
||||||
data-content={'Here\'s some more help text inside a popover for the Bypass Email field just to show how popovers look.'}
|
|
||||||
>
|
|
||||||
{'(?)'}
|
|
||||||
</a>
|
|
||||||
</label>
|
|
||||||
<div className='col-sm-8'>
|
|
||||||
<label className='radio-inline'>
|
|
||||||
<input
|
|
||||||
type='radio'
|
|
||||||
name='byPassEmail'
|
|
||||||
value='option1'
|
|
||||||
/>
|
|
||||||
{'True'}
|
|
||||||
</label>
|
|
||||||
<label className='radio-inline'>
|
|
||||||
<input
|
|
||||||
type='radio'
|
|
||||||
name='byPassEmail'
|
|
||||||
value='option2'
|
|
||||||
/>
|
|
||||||
{'False'}
|
|
||||||
</label>
|
|
||||||
<p className='help-text'>{'This is some sample help text for the Bypass Email field'}</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div className='form-group'>
|
|
||||||
<label
|
|
||||||
className='control-label col-sm-4'
|
|
||||||
htmlFor='smtpUsername'
|
|
||||||
>
|
|
||||||
{'SMTP Username:'}
|
|
||||||
</label>
|
|
||||||
<div className='col-sm-8'>
|
|
||||||
<input
|
|
||||||
type='email'
|
|
||||||
className='form-control'
|
|
||||||
id='smtpUsername'
|
|
||||||
placeholder='Enter your SMTP username'
|
|
||||||
value=''
|
|
||||||
/>
|
|
||||||
<div className='help-text'>
|
|
||||||
<div className='alert alert-warning'><i className='fa fa-warning'></i>{' This is some error text for the Bypass Email field'}</div>
|
|
||||||
</div>
|
|
||||||
<p className='help-text'>{'This is some sample help text for the SMTP username field'}</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
className='panel-group'
|
|
||||||
id='accordion'
|
|
||||||
role='tablist'
|
|
||||||
aria-multiselectable='true'
|
|
||||||
>
|
|
||||||
<div className='panel panel-default'>
|
|
||||||
<div
|
|
||||||
className='panel-heading'
|
|
||||||
role='tab'
|
|
||||||
id='headingOne'
|
|
||||||
>
|
|
||||||
<h3 className='panel-title'>
|
|
||||||
<a
|
|
||||||
className='collapsed'
|
|
||||||
role='button'
|
|
||||||
data-toggle='collapse'
|
|
||||||
data-parent='#accordion'
|
|
||||||
href='#collapseOne'
|
|
||||||
aria-expanded='true'
|
|
||||||
aria-controls='collapseOne'
|
|
||||||
>
|
|
||||||
{'Advanced Settings '}
|
|
||||||
<i className='fa fa-plus'></i>
|
|
||||||
<i className='fa fa-minus'></i>
|
|
||||||
</a>
|
|
||||||
</h3>
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
id='collapseOne'
|
|
||||||
className='panel-collapse collapse'
|
|
||||||
role='tabpanel'
|
|
||||||
aria-labelledby='headingOne'
|
|
||||||
>
|
|
||||||
<div className='panel-body'>
|
|
||||||
<div className='form-group'>
|
|
||||||
<label
|
|
||||||
className='control-label col-sm-4'
|
|
||||||
htmlFor='feedbackUsername'
|
|
||||||
>
|
|
||||||
{'Apple push server:'}
|
|
||||||
</label>
|
|
||||||
<div className='col-sm-8'>
|
|
||||||
<input
|
|
||||||
type='text'
|
|
||||||
className='form-control'
|
|
||||||
id='feedbackUsername'
|
|
||||||
placeholder='Enter your Apple push server'
|
|
||||||
value=''
|
|
||||||
/>
|
|
||||||
<p className='help-text'>{'This is some sample help text for the Apple push server field'}</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div className='form-group'>
|
|
||||||
<label
|
|
||||||
className='control-label col-sm-4'
|
|
||||||
htmlFor='feedbackUsername'
|
|
||||||
>
|
|
||||||
{'Apple push certificate public:'}
|
|
||||||
</label>
|
|
||||||
<div className='col-sm-8'>
|
|
||||||
<input
|
|
||||||
type='text'
|
|
||||||
className='form-control'
|
|
||||||
id='feedbackUsername'
|
|
||||||
placeholder='Enter your public apple push certificate'
|
|
||||||
value=''
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div className='form-group'>
|
|
||||||
<label
|
|
||||||
className='control-label col-sm-4'
|
|
||||||
htmlFor='feedbackUsername'
|
|
||||||
>
|
|
||||||
{'Apple push certificate private:'}
|
|
||||||
</label>
|
|
||||||
<div className='col-sm-8'>
|
|
||||||
<input
|
|
||||||
type='text'
|
|
||||||
className='form-control'
|
|
||||||
id='feedbackUsername'
|
|
||||||
placeholder='Enter your private apple push certificate'
|
|
||||||
value=''
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className='form-group'>
|
|
||||||
<div className='col-sm-12'>
|
|
||||||
<button
|
|
||||||
type='submit'
|
|
||||||
className='btn btn-primary'
|
|
||||||
>
|
|
||||||
{'Save'}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -111,7 +111,7 @@ export default class ChannelHeader extends React.Component {
|
|||||||
const popoverContent = React.renderToString(<MessageWrapper message={channel.description}/>);
|
const popoverContent = React.renderToString(<MessageWrapper message={channel.description}/>);
|
||||||
let channelTitle = channel.display_name;
|
let channelTitle = channel.display_name;
|
||||||
const currentId = UserStore.getCurrentId();
|
const currentId = UserStore.getCurrentId();
|
||||||
const isAdmin = this.state.memberChannel.roles.indexOf('admin') > -1 || this.state.memberTeam.roles.indexOf('admin') > -1;
|
const isAdmin = Utils.isAdmin(this.state.memberChannel.roles) || Utils.isAdmin(this.state.memberTeam.roles);
|
||||||
const isDirect = (this.state.channel.type === 'D');
|
const isDirect = (this.state.channel.type === 'D');
|
||||||
|
|
||||||
if (isDirect) {
|
if (isDirect) {
|
||||||
|
|||||||
@@ -121,7 +121,7 @@ export default class ChannelInviteModal extends React.Component {
|
|||||||
var currentMember = ChannelStore.getCurrentMember();
|
var currentMember = ChannelStore.getCurrentMember();
|
||||||
var isAdmin = false;
|
var isAdmin = false;
|
||||||
if (currentMember) {
|
if (currentMember) {
|
||||||
isAdmin = currentMember.roles.indexOf('admin') > -1 || UserStore.getCurrentUser().roles.indexOf('admin') > -1;
|
isAdmin = utils.isAdmin(currentMember.roles) || utils.isAdmin(UserStore.getCurrentUser().roles);
|
||||||
}
|
}
|
||||||
|
|
||||||
var content;
|
var content;
|
||||||
|
|||||||
@@ -130,7 +130,7 @@ export default class ChannelMembers extends React.Component {
|
|||||||
const currentMember = ChannelStore.getCurrentMember();
|
const currentMember = ChannelStore.getCurrentMember();
|
||||||
let isAdmin = false;
|
let isAdmin = false;
|
||||||
if (currentMember) {
|
if (currentMember) {
|
||||||
isAdmin = currentMember.roles.indexOf('admin') > -1 || UserStore.getCurrentUser().roles.indexOf('admin') > -1;
|
isAdmin = Utils.isAdmin(currentMember.roles) || Utils.isAdmin(UserStore.getCurrentUser().roles);
|
||||||
}
|
}
|
||||||
|
|
||||||
var memberList = null;
|
var memberList = null;
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
// See License.txt for license information.
|
// See License.txt for license information.
|
||||||
|
|
||||||
var UserStore = require('../stores/user_store.jsx');
|
var UserStore = require('../stores/user_store.jsx');
|
||||||
|
const Utils = require('../utils/utils.jsx');
|
||||||
|
|
||||||
export default class MemberListItem extends React.Component {
|
export default class MemberListItem extends React.Component {
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
@@ -26,7 +27,7 @@ export default class MemberListItem extends React.Component {
|
|||||||
render() {
|
render() {
|
||||||
var member = this.props.member;
|
var member = this.props.member;
|
||||||
var isAdmin = this.props.isAdmin;
|
var isAdmin = this.props.isAdmin;
|
||||||
var isMemberAdmin = member.roles.indexOf('admin') > -1;
|
var isMemberAdmin = Utils.isAdmin(member.roles);
|
||||||
var timestamp = UserStore.getCurrentUser().update_at;
|
var timestamp = UserStore.getCurrentUser().update_at;
|
||||||
|
|
||||||
var invite;
|
var invite;
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ var ChannelStore = require('../stores/channel_store.jsx');
|
|||||||
var TeamStore = require('../stores/team_store.jsx');
|
var TeamStore = require('../stores/team_store.jsx');
|
||||||
var MessageWrapper = require('./message_wrapper.jsx');
|
var MessageWrapper = require('./message_wrapper.jsx');
|
||||||
var NotifyCounts = require('./notify_counts.jsx');
|
var NotifyCounts = require('./notify_counts.jsx');
|
||||||
|
const Utils = require('../utils/utils.jsx');
|
||||||
|
|
||||||
var Constants = require('../utils/constants.jsx');
|
var Constants = require('../utils/constants.jsx');
|
||||||
var ActionTypes = Constants.ActionTypes;
|
var ActionTypes = Constants.ActionTypes;
|
||||||
@@ -335,7 +336,7 @@ export default class Navbar extends React.Component {
|
|||||||
options={{singleline: true, mentionHighlight: false}}
|
options={{singleline: true, mentionHighlight: false}}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
isAdmin = this.state.member.roles.indexOf('admin') > -1;
|
isAdmin = Utils.isAdmin(this.state.member.roles);
|
||||||
|
|
||||||
if (channel.type === 'O') {
|
if (channel.type === 'O') {
|
||||||
channelTitle = channel.display_name;
|
channelTitle = channel.display_name;
|
||||||
|
|||||||
@@ -30,12 +30,12 @@ export default class NavbarDropdown extends React.Component {
|
|||||||
UserStore.addTeamsChangeListener(this.onListenerChange);
|
UserStore.addTeamsChangeListener(this.onListenerChange);
|
||||||
TeamStore.addChangeListener(this.onListenerChange);
|
TeamStore.addChangeListener(this.onListenerChange);
|
||||||
|
|
||||||
$(React.findDOMNode(this.refs.dropdown)).on('hide.bs.dropdown', function resetDropdown() {
|
$(React.findDOMNode(this.refs.dropdown)).on('hide.bs.dropdown', () => {
|
||||||
this.blockToggle = true;
|
this.blockToggle = true;
|
||||||
setTimeout(function blockTimeout() {
|
setTimeout(() => {
|
||||||
this.blockToggle = false;
|
this.blockToggle = false;
|
||||||
}.bind(this), 100);
|
}, 100);
|
||||||
}.bind(this));
|
});
|
||||||
}
|
}
|
||||||
componentWillUnmount() {
|
componentWillUnmount() {
|
||||||
UserStore.removeTeamsChangeListener(this.onListenerChange);
|
UserStore.removeTeamsChangeListener(this.onListenerChange);
|
||||||
@@ -53,12 +53,16 @@ export default class NavbarDropdown extends React.Component {
|
|||||||
var teamLink = '';
|
var teamLink = '';
|
||||||
var inviteLink = '';
|
var inviteLink = '';
|
||||||
var manageLink = '';
|
var manageLink = '';
|
||||||
|
var sysAdminLink = '';
|
||||||
|
var adminDivider = '';
|
||||||
var currentUser = UserStore.getCurrentUser();
|
var currentUser = UserStore.getCurrentUser();
|
||||||
var isAdmin = false;
|
var isAdmin = false;
|
||||||
|
var isSystemAdmin = false;
|
||||||
var teamSettings = null;
|
var teamSettings = null;
|
||||||
|
|
||||||
if (currentUser != null) {
|
if (currentUser != null) {
|
||||||
isAdmin = currentUser.roles.indexOf('admin') > -1;
|
isAdmin = Utils.isAdmin(currentUser.roles);
|
||||||
|
isSystemAdmin = Utils.isInRole(currentUser.roles, 'system_admin');
|
||||||
|
|
||||||
inviteLink = (
|
inviteLink = (
|
||||||
<li>
|
<li>
|
||||||
@@ -67,7 +71,7 @@ export default class NavbarDropdown extends React.Component {
|
|||||||
data-toggle='modal'
|
data-toggle='modal'
|
||||||
data-target='#invite_member'
|
data-target='#invite_member'
|
||||||
>
|
>
|
||||||
Invite New Member
|
{'Invite New Member'}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
);
|
);
|
||||||
@@ -82,7 +86,7 @@ export default class NavbarDropdown extends React.Component {
|
|||||||
data-title='Team Invite'
|
data-title='Team Invite'
|
||||||
data-value={Utils.getWindowLocationOrigin() + '/signup_user_complete/?id=' + currentUser.team_id}
|
data-value={Utils.getWindowLocationOrigin() + '/signup_user_complete/?id=' + currentUser.team_id}
|
||||||
>
|
>
|
||||||
Get Team Invite Link
|
{'Get Team Invite Link'}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
);
|
);
|
||||||
@@ -97,19 +101,36 @@ export default class NavbarDropdown extends React.Component {
|
|||||||
data-toggle='modal'
|
data-toggle='modal'
|
||||||
data-target='#team_members'
|
data-target='#team_members'
|
||||||
>
|
>
|
||||||
Manage Team
|
{'Manage Team'}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
);
|
||||||
|
|
||||||
|
adminDivider = (<li className='divider'></li>);
|
||||||
|
|
||||||
|
teamSettings = (
|
||||||
|
<li>
|
||||||
|
<a
|
||||||
|
href='#'
|
||||||
|
data-toggle='modal'
|
||||||
|
data-target='#team_settings'
|
||||||
|
>
|
||||||
|
{'Team Settings'}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isSystemAdmin) {
|
||||||
|
sysAdminLink = (
|
||||||
|
<li>
|
||||||
|
<a
|
||||||
|
href='/admin_console'
|
||||||
|
>
|
||||||
|
{'System Console'}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
);
|
);
|
||||||
teamSettings = (<li>
|
|
||||||
<a
|
|
||||||
href='#'
|
|
||||||
data-toggle='modal'
|
|
||||||
data-target='#team_settings'
|
|
||||||
>
|
|
||||||
Team Settings
|
|
||||||
</a>
|
|
||||||
</li>);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var teams = [];
|
var teams = [];
|
||||||
@@ -123,9 +144,9 @@ export default class NavbarDropdown extends React.Component {
|
|||||||
);
|
);
|
||||||
if (this.state.teams.length > 1 && this.state.currentTeam) {
|
if (this.state.teams.length > 1 && this.state.currentTeam) {
|
||||||
var curTeamName = this.state.currentTeam.name;
|
var curTeamName = this.state.currentTeam.name;
|
||||||
this.state.teams.forEach(function listTeams(teamName) {
|
this.state.teams.forEach((teamName) => {
|
||||||
if (teamName !== curTeamName) {
|
if (teamName !== curTeamName) {
|
||||||
teams.push(<li key={teamName}><a href={Utils.getWindowLocationOrigin() + '/' + teamName}>Switch to {teamName}</a></li>);
|
teams.push(<li key={teamName}><a href={Utils.getWindowLocationOrigin() + '/' + teamName}>{'Switch to ' + teamName}</a></li>);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -135,7 +156,7 @@ export default class NavbarDropdown extends React.Component {
|
|||||||
target='_blank'
|
target='_blank'
|
||||||
href={Utils.getWindowLocationOrigin() + '/signup_team'}
|
href={Utils.getWindowLocationOrigin() + '/signup_team'}
|
||||||
>
|
>
|
||||||
Create a New Team
|
{'Create a New Team'}
|
||||||
</a>
|
</a>
|
||||||
</li>);
|
</li>);
|
||||||
|
|
||||||
@@ -167,29 +188,31 @@ export default class NavbarDropdown extends React.Component {
|
|||||||
data-toggle='modal'
|
data-toggle='modal'
|
||||||
data-target='#user_settings'
|
data-target='#user_settings'
|
||||||
>
|
>
|
||||||
Account Settings
|
{'Account Settings'}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
{teamSettings}
|
|
||||||
{inviteLink}
|
{inviteLink}
|
||||||
{teamLink}
|
{teamLink}
|
||||||
|
{adminDivider}
|
||||||
|
{teamSettings}
|
||||||
{manageLink}
|
{manageLink}
|
||||||
|
{sysAdminLink}
|
||||||
|
{teams}
|
||||||
|
<li className='divider'></li>
|
||||||
<li>
|
<li>
|
||||||
<a
|
<a
|
||||||
href='#'
|
href='#'
|
||||||
onClick={this.handleLogoutClick}
|
onClick={this.handleLogoutClick}
|
||||||
>
|
>
|
||||||
Logout
|
{'Logout'}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
{teams}
|
|
||||||
<li className='divider'></li>
|
|
||||||
<li>
|
<li>
|
||||||
<a
|
<a
|
||||||
target='_blank'
|
target='_blank'
|
||||||
href='/static/help/help.html'
|
href='/static/help/help.html'
|
||||||
>
|
>
|
||||||
Help
|
{'Help'}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@@ -197,7 +220,7 @@ export default class NavbarDropdown extends React.Component {
|
|||||||
target='_blank'
|
target='_blank'
|
||||||
href='/static/help/report_problem.html'
|
href='/static/help/report_problem.html'
|
||||||
>
|
>
|
||||||
Report a Problem
|
{'Report a Problem'}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ export default class PostInfo extends React.Component {
|
|||||||
createDropdown() {
|
createDropdown() {
|
||||||
var post = this.props.post;
|
var post = this.props.post;
|
||||||
var isOwner = UserStore.getCurrentId() === post.user_id;
|
var isOwner = UserStore.getCurrentId() === post.user_id;
|
||||||
var isAdmin = UserStore.getCurrentUser().roles.indexOf('admin') > -1;
|
var isAdmin = utils.isAdmin(UserStore.getCurrentUser().roles);
|
||||||
|
|
||||||
if (post.state === Constants.POST_FAILED || post.state === Constants.POST_LOADING || post.state === Constants.POST_DELETED) {
|
if (post.state === Constants.POST_FAILED || post.state === Constants.POST_LOADING || post.state === Constants.POST_DELETED) {
|
||||||
return '';
|
return '';
|
||||||
|
|||||||
@@ -419,7 +419,7 @@ export default class PostList extends React.Component {
|
|||||||
|
|
||||||
var members = ChannelStore.getExtraInfo(channel.id).members;
|
var members = ChannelStore.getExtraInfo(channel.id).members;
|
||||||
for (var i = 0; i < members.length; i++) {
|
for (var i = 0; i < members.length; i++) {
|
||||||
if (members[i].roles.indexOf('admin') > -1) {
|
if (utils.isAdmin(members[i].roles)) {
|
||||||
return members[i].username;
|
return members[i].username;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,8 @@ export default class SidebarHeader extends React.Component {
|
|||||||
|
|
||||||
this.state = {};
|
this.state = {};
|
||||||
}
|
}
|
||||||
toggleDropdown() {
|
toggleDropdown(e) {
|
||||||
|
e.preventDefault();
|
||||||
if (this.refs.dropdown.blockToggle) {
|
if (this.refs.dropdown.blockToggle) {
|
||||||
this.refs.dropdown.blockToggle = false;
|
this.refs.dropdown.blockToggle = false;
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ export default class SidebarRightMenu extends React.Component {
|
|||||||
var isAdmin = false;
|
var isAdmin = false;
|
||||||
|
|
||||||
if (currentUser != null) {
|
if (currentUser != null) {
|
||||||
isAdmin = currentUser.roles.indexOf('admin') > -1;
|
isAdmin = utils.isAdmin(currentUser.roles);
|
||||||
|
|
||||||
inviteLink = (
|
inviteLink = (
|
||||||
<li>
|
<li>
|
||||||
|
|||||||
@@ -54,6 +54,29 @@ export function isTestDomain() {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function isInRole(roles, inRole) {
|
||||||
|
var parts = roles.split(' ');
|
||||||
|
for (var i = 0; i < parts.length; i++) {
|
||||||
|
if (parts[i] === inRole) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isAdmin(roles) {
|
||||||
|
if (isInRole(roles, 'admin')) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isInRole(roles, 'system_admin')) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
export function getDomainWithOutSub() {
|
export function getDomainWithOutSub() {
|
||||||
var parts = window.location.host.split('.');
|
var parts = window.location.host.split('.');
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
padding-top: 44px;
|
padding-top: 44px;
|
||||||
}
|
}
|
||||||
.dropdown-menu {
|
.dropdown-menu {
|
||||||
max-height: 300px;
|
max-height: 400px;
|
||||||
overflow-x: hidden;
|
overflow-x: hidden;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
max-width: 200px;
|
max-width: 200px;
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user