PLT-3346/PLT-3342/PLT-3360 EE: Add the ability to restrict channel management permissions (#3453)
* EE: Add the ability to restrict channel management permissions * Always allow last user in a channel to delete that channel
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
19d452c74e
Коммит
5f7cb8cfbf
@@ -21,12 +21,16 @@ export default class PolicySettings extends AdminSettings {
|
||||
this.renderSettings = this.renderSettings.bind(this);
|
||||
|
||||
this.state = Object.assign(this.state, {
|
||||
restrictTeamInvite: props.config.TeamSettings.RestrictTeamInvite
|
||||
restrictTeamInvite: props.config.TeamSettings.RestrictTeamInvite,
|
||||
restrictPublicChannelManagement: props.config.TeamSettings.RestrictPublicChannelManagement,
|
||||
restrictPrivateChannelManagement: props.config.TeamSettings.RestrictPrivateChannelManagement
|
||||
});
|
||||
}
|
||||
|
||||
getConfigFromState(config) {
|
||||
config.TeamSettings.RestrictTeamInvite = this.state.restrictTeamInvite;
|
||||
config.TeamSettings.RestrictPublicChannelManagement = this.state.restrictPublicChannelManagement;
|
||||
config.TeamSettings.RestrictPrivateChannelManagement = this.state.restrictPrivateChannelManagement;
|
||||
|
||||
return config;
|
||||
}
|
||||
@@ -48,9 +52,9 @@ export default class PolicySettings extends AdminSettings {
|
||||
<DropdownSetting
|
||||
id='restrictTeamInvite'
|
||||
values={[
|
||||
{value: Constants.TEAM_INVITE_ALL, text: Utils.localizeMessage('admin.general.policy.teamInviteAll', 'All team members')},
|
||||
{value: Constants.TEAM_INVITE_TEAM_ADMIN, text: Utils.localizeMessage('admin.general.policy.teamInviteAdmin', 'Team and System Admins')},
|
||||
{value: Constants.TEAM_INVITE_SYSTEM_ADMIN, text: Utils.localizeMessage('admin.general.policy.teamInviteSystemAdmin', 'System Admins')}
|
||||
{value: Constants.PERMISSIONS_ALL, text: Utils.localizeMessage('admin.general.policy.permissionsAll', 'All team members')},
|
||||
{value: Constants.PERMISSIONS_TEAM_ADMIN, text: Utils.localizeMessage('admin.general.policy.permissionsAdmin', 'Team and System Admins')},
|
||||
{value: Constants.PERMISSIONS_SYSTEM_ADMIN, text: Utils.localizeMessage('admin.general.policy.permissionsSystemAdmin', 'System Admins')}
|
||||
]}
|
||||
label={
|
||||
<FormattedMessage
|
||||
@@ -67,6 +71,50 @@ export default class PolicySettings extends AdminSettings {
|
||||
/>
|
||||
}
|
||||
/>
|
||||
<DropdownSetting
|
||||
id='restrictPublicChannelManagement'
|
||||
values={[
|
||||
{value: Constants.PERMISSIONS_ALL, text: Utils.localizeMessage('admin.general.policy.permissionsAll', 'All team members')},
|
||||
{value: Constants.PERMISSIONS_TEAM_ADMIN, text: Utils.localizeMessage('admin.general.policy.permissionsAdmin', 'Team and System Admins')},
|
||||
{value: Constants.PERMISSIONS_SYSTEM_ADMIN, text: Utils.localizeMessage('admin.general.policy.permissionsSystemAdmin', 'System Admins')}
|
||||
]}
|
||||
label={
|
||||
<FormattedMessage
|
||||
id='admin.general.policy.restrictPublicChannelManagementTitle'
|
||||
defaultMessage='Enable public channel management permissions for:'
|
||||
/>
|
||||
}
|
||||
value={this.state.restrictPublicChannelManagement}
|
||||
onChange={this.handleChange}
|
||||
helpText={
|
||||
<FormattedHTMLMessage
|
||||
id='admin.general.policy.restrictPublicChannelManagementDescription'
|
||||
defaultMessage='Selecting "All team members" allows any team members to create, delete, rename, and set the header or purpose for public channels.<br/><br/>Selecting "Team and System Admins" restricts channel management permissions for public channels to Team and System Admins, including creating, deleting, renaming, and setting the channel header or purpose.<br/><br/>Selecting "System Admins" restricts channel management permissions for public channels to System Admins, including creating, deleting, renaming, and setting the channel header or purpose.'
|
||||
/>
|
||||
}
|
||||
/>
|
||||
<DropdownSetting
|
||||
id='restrictPrivateChannelManagement'
|
||||
values={[
|
||||
{value: Constants.PERMISSIONS_ALL, text: Utils.localizeMessage('admin.general.policy.permissionsAll', 'All team members')},
|
||||
{value: Constants.PERMISSIONS_TEAM_ADMIN, text: Utils.localizeMessage('admin.general.policy.permissionsAdmin', 'Team and System Admins')},
|
||||
{value: Constants.PERMISSIONS_SYSTEM_ADMIN, text: Utils.localizeMessage('admin.general.policy.permissionsSystemAdmin', 'System Admins')}
|
||||
]}
|
||||
label={
|
||||
<FormattedMessage
|
||||
id='admin.general.policy.restrictPrivateChannelManagementTitle'
|
||||
defaultMessage='Enable private group management permissions for:'
|
||||
/>
|
||||
}
|
||||
value={this.state.restrictPrivateChannelManagement}
|
||||
onChange={this.handleChange}
|
||||
helpText={
|
||||
<FormattedHTMLMessage
|
||||
id='admin.general.policy.restrictPrivateChannelManagementDescription'
|
||||
defaultMessage='Selecting "All team members" allows any team members to create, delete, rename, and set the header or purpose for private groups.<br/><br/>Selecting "Team and System Admins" restricts group management permissions for private groups to Team and System Admins, including creating, deleting, renaming, and setting the group header or purpose.<br/><br/>Selecting "System Admins" restricts group management permissions for private groups to System Admins, including creating, deleting, renaming, and setting the group header or purpose.'
|
||||
/>
|
||||
}
|
||||
/>
|
||||
</SettingsGroup>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -56,6 +56,7 @@ export default class ChannelHeader extends React.Component {
|
||||
state.showRenameChannelModal = false;
|
||||
this.state = state;
|
||||
}
|
||||
|
||||
getStateFromStores() {
|
||||
const extraInfo = ChannelStore.getExtraInfo(this.props.channelId);
|
||||
|
||||
@@ -67,6 +68,7 @@ export default class ChannelHeader extends React.Component {
|
||||
currentUser: UserStore.getCurrentUser()
|
||||
};
|
||||
}
|
||||
|
||||
validState() {
|
||||
if (!this.state.channel ||
|
||||
!this.state.memberChannel ||
|
||||
@@ -77,6 +79,7 @@ export default class ChannelHeader extends React.Component {
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
componentDidMount() {
|
||||
ChannelStore.addChangeListener(this.onListenerChange);
|
||||
ChannelStore.addExtraInfoChangeListener(this.onListenerChange);
|
||||
@@ -87,6 +90,7 @@ export default class ChannelHeader extends React.Component {
|
||||
$('.sidebar--left .dropdown-menu').perfectScrollbar();
|
||||
document.addEventListener('keydown', this.openRecentMentions);
|
||||
}
|
||||
|
||||
componentWillUnmount() {
|
||||
ChannelStore.removeChangeListener(this.onListenerChange);
|
||||
ChannelStore.removeExtraInfoChangeListener(this.onListenerChange);
|
||||
@@ -96,6 +100,7 @@ export default class ChannelHeader extends React.Component {
|
||||
UserStore.removeStatusesChangeListener(this.onListenerChange);
|
||||
document.removeEventListener('keydown', this.openRecentMentions);
|
||||
}
|
||||
|
||||
onListenerChange() {
|
||||
const newState = this.getStateFromStores();
|
||||
if (!Utils.areObjectsEqual(newState, this.state)) {
|
||||
@@ -103,6 +108,7 @@ export default class ChannelHeader extends React.Component {
|
||||
}
|
||||
$('.channel-header__info .description').popover({placement: 'bottom', trigger: 'hover', html: true, delay: {show: 500, hide: 500}});
|
||||
}
|
||||
|
||||
handleLeave() {
|
||||
Client.leaveChannel(this.state.channel.id,
|
||||
() => {
|
||||
@@ -119,6 +125,7 @@ export default class ChannelHeader extends React.Component {
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
searchMentions(e) {
|
||||
e.preventDefault();
|
||||
|
||||
@@ -146,12 +153,14 @@ export default class ChannelHeader extends React.Component {
|
||||
is_mention_search: true
|
||||
});
|
||||
}
|
||||
|
||||
openRecentMentions(e) {
|
||||
if ((e.ctrlKey || e.metaKey) && e.shiftKey && e.keyCode === Constants.KeyCodes.M) {
|
||||
e.preventDefault();
|
||||
this.searchMentions(e);
|
||||
}
|
||||
}
|
||||
|
||||
showRenameChannelModal(e) {
|
||||
e.preventDefault();
|
||||
|
||||
@@ -159,6 +168,7 @@ export default class ChannelHeader extends React.Component {
|
||||
showRenameChannelModal: true
|
||||
});
|
||||
}
|
||||
|
||||
hideRenameChannelModal() {
|
||||
this.setState({
|
||||
showRenameChannelModal: false
|
||||
@@ -179,6 +189,30 @@ export default class ChannelHeader extends React.Component {
|
||||
return null;
|
||||
}
|
||||
|
||||
showManagementOptions(channel, isAdmin, isSystemAdmin) {
|
||||
if (global.window.mm_license.IsLicensed !== 'true') {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (channel.type === Constants.OPEN_CHANNEL) {
|
||||
if (global.window.mm_config.RestrictPublicChannelManagement === Constants.PERMISSIONS_SYSTEM_ADMIN && !isSystemAdmin) {
|
||||
return false;
|
||||
}
|
||||
if (global.window.mm_config.RestrictPublicChannelManagement === Constants.PERMISSIONS_TEAM_ADMIN && !isAdmin) {
|
||||
return false;
|
||||
}
|
||||
} else if (channel.type === Constants.PRIVATE_CHANNEL) {
|
||||
if (global.window.mm_config.RestrictPrivateChannelManagement === Constants.PERMISSIONS_SYSTEM_ADMIN && !isSystemAdmin) {
|
||||
return false;
|
||||
}
|
||||
if (global.window.mm_config.RestrictPrivateChannelManagement === Constants.PERMISSIONS_TEAM_ADMIN && !isAdmin) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
render() {
|
||||
if (!this.validState()) {
|
||||
return null;
|
||||
@@ -210,7 +244,8 @@ export default class ChannelHeader extends React.Component {
|
||||
);
|
||||
let channelTitle = channel.display_name;
|
||||
const currentId = this.state.currentUser.id;
|
||||
const isAdmin = Utils.isAdmin(this.state.memberChannel.roles) || TeamStore.isTeamAdminForCurrentTeam() || UserStore.isSystemAdminForCurrentUser();
|
||||
const isAdmin = TeamStore.isTeamAdminForCurrentTeam() || UserStore.isSystemAdminForCurrentUser();
|
||||
const isSystemAdmin = UserStore.isSystemAdminForCurrentUser();
|
||||
const isDirect = (this.state.channel.type === 'D');
|
||||
|
||||
if (isDirect) {
|
||||
@@ -329,46 +364,6 @@ export default class ChannelHeader extends React.Component {
|
||||
}
|
||||
}
|
||||
|
||||
dropdownContents.push(
|
||||
<li
|
||||
key='set_channel_header'
|
||||
role='presentation'
|
||||
>
|
||||
<ToggleModalButton
|
||||
role='menuitem'
|
||||
dialogType={EditChannelHeaderModal}
|
||||
dialogProps={{channel}}
|
||||
>
|
||||
<FormattedMessage
|
||||
id='channel_header.setHeader'
|
||||
defaultMessage='Set {term} Header...'
|
||||
values={{
|
||||
term: (channelTerm)
|
||||
}}
|
||||
/>
|
||||
</ToggleModalButton>
|
||||
</li>
|
||||
);
|
||||
dropdownContents.push(
|
||||
<li
|
||||
key='set_channel_purpose'
|
||||
role='presentation'
|
||||
>
|
||||
<a
|
||||
role='menuitem'
|
||||
href='#'
|
||||
onClick={() => this.setState({showEditChannelPurposeModal: true})}
|
||||
>
|
||||
<FormattedMessage
|
||||
id='channel_header.setPurpose'
|
||||
defaultMessage='Set {term} Purpose...'
|
||||
values={{
|
||||
term: (channelTerm)
|
||||
}}
|
||||
/>
|
||||
</a>
|
||||
</li>
|
||||
);
|
||||
dropdownContents.push(
|
||||
<li
|
||||
key='notification_preferences'
|
||||
@@ -391,7 +386,70 @@ export default class ChannelHeader extends React.Component {
|
||||
</li>
|
||||
);
|
||||
|
||||
if (isAdmin) {
|
||||
const deleteOption = (
|
||||
<li
|
||||
key='delete_channel'
|
||||
role='presentation'
|
||||
>
|
||||
<ToggleModalButton
|
||||
role='menuitem'
|
||||
dialogType={DeleteChannelModal}
|
||||
dialogProps={{channel}}
|
||||
>
|
||||
<FormattedMessage
|
||||
id='channel_header.delete'
|
||||
defaultMessage='Delete {term}...'
|
||||
values={{
|
||||
term: (channelTerm)
|
||||
}}
|
||||
/>
|
||||
</ToggleModalButton>
|
||||
</li>
|
||||
);
|
||||
|
||||
if (this.showManagementOptions(channel, isAdmin, isSystemAdmin)) {
|
||||
dropdownContents.push(
|
||||
<li
|
||||
key='set_channel_header'
|
||||
role='presentation'
|
||||
>
|
||||
<ToggleModalButton
|
||||
role='menuitem'
|
||||
dialogType={EditChannelHeaderModal}
|
||||
dialogProps={{channel}}
|
||||
>
|
||||
<FormattedMessage
|
||||
id='channel_header.setHeader'
|
||||
defaultMessage='Set {term} Header...'
|
||||
values={{
|
||||
term: (channelTerm)
|
||||
}}
|
||||
/>
|
||||
</ToggleModalButton>
|
||||
</li>
|
||||
);
|
||||
|
||||
dropdownContents.push(
|
||||
<li
|
||||
key='set_channel_purpose'
|
||||
role='presentation'
|
||||
>
|
||||
<a
|
||||
role='menuitem'
|
||||
href='#'
|
||||
onClick={() => this.setState({showEditChannelPurposeModal: true})}
|
||||
>
|
||||
<FormattedMessage
|
||||
id='channel_header.setPurpose'
|
||||
defaultMessage='Set {term} Purpose...'
|
||||
values={{
|
||||
term: (channelTerm)
|
||||
}}
|
||||
/>
|
||||
</a>
|
||||
</li>
|
||||
);
|
||||
|
||||
dropdownContents.push(
|
||||
<li
|
||||
key='rename_channel'
|
||||
@@ -414,27 +472,10 @@ export default class ChannelHeader extends React.Component {
|
||||
);
|
||||
|
||||
if (!ChannelStore.isDefault(channel)) {
|
||||
dropdownContents.push(
|
||||
<li
|
||||
key='delete_channel'
|
||||
role='presentation'
|
||||
>
|
||||
<ToggleModalButton
|
||||
role='menuitem'
|
||||
dialogType={DeleteChannelModal}
|
||||
dialogProps={{channel}}
|
||||
>
|
||||
<FormattedMessage
|
||||
id='channel_header.delete'
|
||||
defaultMessage='Delete {term}...'
|
||||
values={{
|
||||
term: (channelTerm)
|
||||
}}
|
||||
/>
|
||||
</ToggleModalButton>
|
||||
</li>
|
||||
);
|
||||
dropdownContents.push(deleteOption);
|
||||
}
|
||||
} else if (this.state.userCount === 1) {
|
||||
dropdownContents.push(deleteOption);
|
||||
}
|
||||
|
||||
const canLeave = channel.type === Constants.PRIVATE_CHANNEL ? this.state.userCount > 1 : true;
|
||||
|
||||
@@ -6,8 +6,11 @@ import LoadingScreen from './loading_screen.jsx';
|
||||
import NewChannelFlow from './new_channel_flow.jsx';
|
||||
|
||||
import ChannelStore from 'stores/channel_store.jsx';
|
||||
import UserStore from 'stores/user_store.jsx';
|
||||
import TeamStore from 'stores/team_store.jsx';
|
||||
|
||||
import * as Utils from 'utils/utils.jsx';
|
||||
import Constants from 'utils/constants.jsx';
|
||||
import * as AsyncClient from 'utils/async_client.jsx';
|
||||
import * as GlobalActions from 'actions/global_actions.jsx';
|
||||
|
||||
@@ -132,6 +135,41 @@ export default class MoreChannels extends React.Component {
|
||||
serverError = <div className='form-group has-error'><label className='control-label'>{this.state.serverError}</label></div>;
|
||||
}
|
||||
|
||||
let createNewChannelButton = (
|
||||
<button
|
||||
type='button'
|
||||
className='btn btn-primary channel-create-btn'
|
||||
onClick={this.handleNewChannel}
|
||||
>
|
||||
<FormattedMessage
|
||||
id='more_channels.create'
|
||||
defaultMessage='Create New Channel'
|
||||
/>
|
||||
</button>
|
||||
);
|
||||
|
||||
let createChannelHelpText = (
|
||||
<p className='secondary-message'>
|
||||
<FormattedMessage
|
||||
id='more_channels.createClick'
|
||||
defaultMessage="Click 'Create New Channel' to make a new one"
|
||||
/>
|
||||
</p>
|
||||
);
|
||||
|
||||
const isAdmin = TeamStore.isTeamAdminForCurrentTeam() || UserStore.isSystemAdminForCurrentUser();
|
||||
const isSystemAdmin = UserStore.isSystemAdminForCurrentUser();
|
||||
|
||||
if (global.window.mm_license.IsLicensed === 'true') {
|
||||
if (global.window.mm_config.RestrictPublicChannelManagement === Constants.PERMISSIONS_SYSTEM_ADMIN && !isSystemAdmin) {
|
||||
createNewChannelButton = null;
|
||||
createChannelHelpText = null;
|
||||
} else if (global.window.mm_config.RestrictPublicChannelManagement === Constants.PERMISSIONS_TEAM_ADMIN && !isAdmin) {
|
||||
createNewChannelButton = null;
|
||||
createChannelHelpText = null;
|
||||
}
|
||||
}
|
||||
|
||||
var moreChannels;
|
||||
|
||||
if (this.state.channels != null) {
|
||||
@@ -153,12 +191,7 @@ export default class MoreChannels extends React.Component {
|
||||
defaultMessage='No more channels to join'
|
||||
/>
|
||||
</p>
|
||||
<p className='secondary-message'>
|
||||
<FormattedMessage
|
||||
id='more_channels.createClick'
|
||||
defaultMessage="Click 'Create New Channel' to make a new one"
|
||||
/>
|
||||
</p>
|
||||
{createChannelHelpText}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -195,16 +228,7 @@ export default class MoreChannels extends React.Component {
|
||||
defaultMessage='More Channels'
|
||||
/>
|
||||
</h4>
|
||||
<button
|
||||
type='button'
|
||||
className='btn btn-primary channel-create-btn'
|
||||
onClick={this.handleNewChannel}
|
||||
>
|
||||
<FormattedMessage
|
||||
id='more_channels.create'
|
||||
defaultMessage='Create New Channel'
|
||||
/>
|
||||
</button>
|
||||
{createNewChannelButton}
|
||||
<NewChannelFlow
|
||||
show={this.state.showNewChannelModal}
|
||||
channelType={this.state.channelType}
|
||||
|
||||
@@ -122,10 +122,10 @@ export default class NavbarDropdown extends React.Component {
|
||||
}
|
||||
|
||||
if (global.window.mm_license.IsLicensed === 'true') {
|
||||
if (global.window.mm_config.RestrictTeamInvite === Constants.TEAM_INVITE_SYSTEM_ADMIN && !isSystemAdmin) {
|
||||
if (global.window.mm_config.RestrictTeamInvite === Constants.PERMISSIONS_SYSTEM_ADMIN && !isSystemAdmin) {
|
||||
teamLink = null;
|
||||
inviteLink = null;
|
||||
} else if (global.window.mm_config.RestrictTeamInvite === Constants.TEAM_INVITE_TEAM_ADMIN && !isAdmin) {
|
||||
} else if (global.window.mm_config.RestrictTeamInvite === Constants.PERMISSIONS_TEAM_ADMIN && !isAdmin) {
|
||||
teamLink = null;
|
||||
inviteLink = null;
|
||||
}
|
||||
|
||||
@@ -3,8 +3,12 @@
|
||||
|
||||
import $ from 'jquery';
|
||||
import ReactDOM from 'react-dom';
|
||||
|
||||
import * as Utils from 'utils/utils.jsx';
|
||||
import Constants from 'utils/constants.jsx';
|
||||
|
||||
import UserStore from 'stores/user_store.jsx';
|
||||
import TeamStore from 'stores/team_store.jsx';
|
||||
import PreferenceStore from 'stores/preference_store.jsx';
|
||||
|
||||
import {intlShape, injectIntl, defineMessages, FormattedMessage} from 'react-intl';
|
||||
@@ -113,6 +117,47 @@ class NewChannelModal extends React.Component {
|
||||
serverError = <div className='form-group has-error'><p className='input__help error'>{this.props.serverError}</p></div>;
|
||||
}
|
||||
|
||||
let createPublicChannelLink = (
|
||||
<a
|
||||
href='#'
|
||||
onClick={this.props.onTypeSwitched}
|
||||
>
|
||||
<FormattedMessage
|
||||
id='channel_modal.publicChannel1'
|
||||
defaultMessage='Create a public channel'
|
||||
/>
|
||||
</a>
|
||||
);
|
||||
|
||||
let createPrivateChannelLink = (
|
||||
<a
|
||||
href='#'
|
||||
onClick={this.props.onTypeSwitched}
|
||||
>
|
||||
<FormattedMessage
|
||||
id='channel_modal.privateGroup2'
|
||||
defaultMessage='Create a private group'
|
||||
/>
|
||||
</a>
|
||||
);
|
||||
|
||||
const isAdmin = TeamStore.isTeamAdminForCurrentTeam() || UserStore.isSystemAdminForCurrentUser();
|
||||
const isSystemAdmin = UserStore.isSystemAdminForCurrentUser();
|
||||
|
||||
if (global.window.mm_license.IsLicensed === 'true') {
|
||||
if (global.window.mm_config.RestrictPublicChannelManagement === Constants.PERMISSIONS_SYSTEM_ADMIN && !isSystemAdmin) {
|
||||
createPublicChannelLink = null;
|
||||
} else if (global.window.mm_config.RestrictPublicChannelManagement === Constants.PERMISSIONS_TEAM_ADMIN && !isAdmin) {
|
||||
createPublicChannelLink = null;
|
||||
}
|
||||
|
||||
if (global.window.mm_config.RestrictPrivateChannelManagement === Constants.PERMISSIONS_SYSTEM_ADMIN && !isSystemAdmin) {
|
||||
createPrivateChannelLink = null;
|
||||
} else if (global.window.mm_config.RestrictPrivateChannelManagement === Constants.PERMISSIONS_TEAM_ADMIN && !isAdmin) {
|
||||
createPrivateChannelLink = null;
|
||||
}
|
||||
}
|
||||
|
||||
var channelTerm = '';
|
||||
var channelSwitchText = '';
|
||||
switch (this.props.channelType) {
|
||||
@@ -129,15 +174,7 @@ class NewChannelModal extends React.Component {
|
||||
id='channel_modal.privateGroup1'
|
||||
defaultMessage='Create a new private group with restricted membership. '
|
||||
/>
|
||||
<a
|
||||
href='#'
|
||||
onClick={this.props.onTypeSwitched}
|
||||
>
|
||||
<FormattedMessage
|
||||
id='channel_modal.publicChannel1'
|
||||
defaultMessage='Create a public channel'
|
||||
/>
|
||||
</a>
|
||||
{createPublicChannelLink}
|
||||
</div>
|
||||
);
|
||||
break;
|
||||
@@ -154,15 +191,7 @@ class NewChannelModal extends React.Component {
|
||||
id='channel_modal.publicChannel2'
|
||||
defaultMessage='Create a new public channel anyone can join. '
|
||||
/>
|
||||
<a
|
||||
href='#'
|
||||
onClick={this.props.onTypeSwitched}
|
||||
>
|
||||
<FormattedMessage
|
||||
id='channel_modal.privateGroup2'
|
||||
defaultMessage='Create a private group'
|
||||
/>
|
||||
</a>
|
||||
{createPrivateChannelLink}
|
||||
</div>
|
||||
);
|
||||
break;
|
||||
|
||||
@@ -682,6 +682,55 @@ export default class Sidebar extends React.Component {
|
||||
/>
|
||||
);
|
||||
|
||||
const isAdmin = TeamStore.isTeamAdminForCurrentTeam() || UserStore.isSystemAdminForCurrentUser();
|
||||
const isSystemAdmin = UserStore.isSystemAdminForCurrentUser();
|
||||
|
||||
let createPublicChannelIcon = (
|
||||
<OverlayTrigger
|
||||
delayShow={500}
|
||||
placement='top'
|
||||
overlay={createChannelTootlip}
|
||||
>
|
||||
<a
|
||||
className='add-channel-btn'
|
||||
href='#'
|
||||
onClick={this.showNewChannelModal.bind(this, Constants.OPEN_CHANNEL)}
|
||||
>
|
||||
{'+'}
|
||||
</a>
|
||||
</OverlayTrigger>
|
||||
);
|
||||
|
||||
let createPrivateChannelIcon = (
|
||||
<OverlayTrigger
|
||||
delayShow={500}
|
||||
placement='top'
|
||||
overlay={createGroupTootlip}
|
||||
>
|
||||
<a
|
||||
className='add-channel-btn'
|
||||
href='#'
|
||||
onClick={this.showNewChannelModal.bind(this, Constants.PRIVATE_CHANNEL)}
|
||||
>
|
||||
{'+'}
|
||||
</a>
|
||||
</OverlayTrigger>
|
||||
);
|
||||
|
||||
if (global.window.mm_license.IsLicensed === 'true') {
|
||||
if (global.window.mm_config.RestrictPublicChannelManagement === Constants.PERMISSIONS_SYSTEM_ADMIN && !isSystemAdmin) {
|
||||
createPublicChannelIcon = null;
|
||||
} else if (global.window.mm_config.RestrictPublicChannelManagement === Constants.PERMISSIONS_TEAM_ADMIN && !isAdmin) {
|
||||
createPublicChannelIcon = null;
|
||||
}
|
||||
|
||||
if (global.window.mm_config.RestrictPrivateChannelManagement === Constants.PERMISSIONS_SYSTEM_ADMIN && !isSystemAdmin) {
|
||||
createPrivateChannelIcon = null;
|
||||
} else if (global.window.mm_config.RestrictPrivateChannelManagement === Constants.PERMISSIONS_TEAM_ADMIN && !isAdmin) {
|
||||
createPrivateChannelIcon = null;
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<div
|
||||
className='sidebar--left'
|
||||
@@ -728,19 +777,7 @@ export default class Sidebar extends React.Component {
|
||||
id='sidebar.channels'
|
||||
defaultMessage='Channels'
|
||||
/>
|
||||
<OverlayTrigger
|
||||
delayShow={500}
|
||||
placement='top'
|
||||
overlay={createChannelTootlip}
|
||||
>
|
||||
<a
|
||||
className='add-channel-btn'
|
||||
href='#'
|
||||
onClick={this.showNewChannelModal.bind(this, 'O')}
|
||||
>
|
||||
{'+'}
|
||||
</a>
|
||||
</OverlayTrigger>
|
||||
{createPublicChannelIcon}
|
||||
</h4>
|
||||
</li>
|
||||
{publicChannelItems}
|
||||
@@ -765,19 +802,7 @@ export default class Sidebar extends React.Component {
|
||||
id='sidebar.pg'
|
||||
defaultMessage='Private Groups'
|
||||
/>
|
||||
<OverlayTrigger
|
||||
delayShow={500}
|
||||
placement='top'
|
||||
overlay={createGroupTootlip}
|
||||
>
|
||||
<a
|
||||
className='add-channel-btn'
|
||||
href='#'
|
||||
onClick={this.showNewChannelModal.bind(this, 'P')}
|
||||
>
|
||||
{'+'}
|
||||
</a>
|
||||
</OverlayTrigger>
|
||||
{createPrivateChannelIcon}
|
||||
</h4>
|
||||
</li>
|
||||
{privateChannelItems}
|
||||
|
||||
@@ -186,10 +186,10 @@ export default class SidebarRightMenu extends React.Component {
|
||||
}
|
||||
|
||||
if (global.window.mm_license.IsLicensed === 'true') {
|
||||
if (global.window.mm_config.RestrictTeamInvite === Constants.TEAM_INVITE_SYSTEM_ADMIN && !isSystemAdmin) {
|
||||
if (global.window.mm_config.RestrictTeamInvite === Constants.PERMISSIONS_SYSTEM_ADMIN && !isSystemAdmin) {
|
||||
teamLink = null;
|
||||
inviteLink = null;
|
||||
} else if (global.window.mm_config.RestrictTeamInvite === Constants.TEAM_INVITE_TEAM_ADMIN && !isAdmin) {
|
||||
} else if (global.window.mm_config.RestrictTeamInvite === Constants.PERMISSIONS_TEAM_ADMIN && !isAdmin) {
|
||||
teamLink = null;
|
||||
inviteLink = null;
|
||||
}
|
||||
|
||||
@@ -108,7 +108,7 @@ export default class TutorialIntroScreens extends React.Component {
|
||||
let inviteModalLink;
|
||||
let inviteText;
|
||||
|
||||
if (global.window.mm_license.IsLicensed !== 'true' || global.window.mm_config.RestrictTeamInvite === Constants.TEAM_INVITE_ALL) {
|
||||
if (global.window.mm_license.IsLicensed !== 'true' || global.window.mm_config.RestrictTeamInvite === Constants.PERMISSIONS_ALL) {
|
||||
if (team.type === Constants.INVITE_TEAM) {
|
||||
inviteModalLink = (
|
||||
<a
|
||||
|
||||
Ссылка в новой задаче
Block a user