Skip to content

Commit

Permalink
PLT-5080 (WebApp): Channel Admin permission level. (#5047)
Browse files Browse the repository at this point in the history
* PLT-5080 (WebApp): Channel Admin permission level.

For channel management and channel deletion.

* Fix some incorrect showing/hiding of options.

* Remove incorrect client calls that was overwriting my channel members.
  • Loading branch information
grundleborg authored and crspeller committed Feb 24, 2017
1 parent bc9f3df commit 8509c2f
Show file tree
Hide file tree
Showing 8 changed files with 40 additions and 11 deletions.
2 changes: 0 additions & 2 deletions webapp/actions/channel_actions.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,6 @@ export function makeUserChannelAdmin(channelId, userId, success, error) {
userId,
'channel_user channel_admin',
() => {
AsyncClient.getChannelMember(channelId, userId);
getChannelMembersForUserIds(channelId, [userId]);

if (success) {
Expand All @@ -153,7 +152,6 @@ export function makeUserChannelMember(channelId, userId, success, error) {
userId,
'channel_user',
() => {
AsyncClient.getChannelMember(channelId, userId);
getChannelMembersForUserIds(channelId, [userId]);

if (success) {
Expand Down
4 changes: 4 additions & 0 deletions webapp/components/admin_console/policy_settings.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ export default class PolicySettings extends AdminSettings {
id='restrictPublicChannelManagement'
values={[
{value: Constants.PERMISSIONS_ALL, text: Utils.localizeMessage('admin.general.policy.permissionsAllChannel', 'All channel members')},
{value: Constants.PERMISSIONS_CHANNEL_ADMIN, text: Utils.localizeMessage('admin.general.policy.permissionsChannelAdmin', 'Channel, Team and System Admins')},
{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')}
]}
Expand All @@ -137,6 +138,7 @@ export default class PolicySettings extends AdminSettings {
id='restrictPublicChannelDeletion'
values={[
{value: Constants.PERMISSIONS_ALL, text: Utils.localizeMessage('admin.general.policy.permissionsAllChannel', 'All channel members')},
{value: Constants.PERMISSIONS_CHANNEL_ADMIN, text: Utils.localizeMessage('admin.general.policy.permissionsChannelAdmin', 'Channel, Team and System Admins')},
{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')}
]}
Expand Down Expand Up @@ -195,6 +197,7 @@ export default class PolicySettings extends AdminSettings {
id='restrictPrivateChannelManagement'
values={[
{value: Constants.PERMISSIONS_ALL, text: Utils.localizeMessage('admin.general.policy.permissionsAllChannel', 'All channel members')},
{value: Constants.PERMISSIONS_CHANNEL_ADMIN, text: Utils.localizeMessage('admin.general.policy.permissionsChannelAdmin', 'Channel, Team and System Admins')},
{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')}
]}
Expand All @@ -217,6 +220,7 @@ export default class PolicySettings extends AdminSettings {
id='restrictPrivateChannelDeletion'
values={[
{value: Constants.PERMISSIONS_ALL, text: Utils.localizeMessage('admin.general.policy.permissionsAllChannel', 'All channel members')},
{value: Constants.PERMISSIONS_CHANNEL_ADMIN, text: Utils.localizeMessage('admin.general.policy.permissionsChannelAdmin', 'Channel, Team and System Admins')},
{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')}
]}
Expand Down
5 changes: 3 additions & 2 deletions webapp/components/channel_header.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,7 @@ export default class ChannelHeader extends React.Component {
let channelTitle = channel.display_name;
const isAdmin = TeamStore.isTeamAdminForCurrentTeam() || UserStore.isSystemAdminForCurrentUser();
const isSystemAdmin = UserStore.isSystemAdminForCurrentUser();
const isChannelAdmin = ChannelStore.isChannelAdminForCurrentChannel();
const isDirect = (this.state.channel.type === 'D');
let webrtc;

Expand Down Expand Up @@ -476,7 +477,7 @@ export default class ChannelHeader extends React.Component {
</li>
);

if (ChannelUtils.showManagementOptions(channel, isAdmin, isSystemAdmin)) {
if (ChannelUtils.showManagementOptions(channel, isAdmin, isSystemAdmin, isChannelAdmin)) {
dropdownContents.push(
<li
key='set_channel_header'
Expand Down Expand Up @@ -541,7 +542,7 @@ export default class ChannelHeader extends React.Component {
);
}

if (ChannelUtils.showDeleteOption(channel, isAdmin, isSystemAdmin)) {
if (ChannelUtils.showDeleteOption(channel, isAdmin, isSystemAdmin, isChannelAdmin)) {
if (!ChannelStore.isDefault(channel)) {
dropdownContents.push(deleteOption);
}
Expand Down
10 changes: 6 additions & 4 deletions webapp/components/navbar.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,7 @@ export default class Navbar extends React.Component {
}
};

createDropdown(channel, channelTitle, isAdmin, isSystemAdmin, isDirect, popoverContent) {
createDropdown(channel, channelTitle, isAdmin, isSystemAdmin, isChannelAdmin, isDirect, popoverContent) {
if (channel) {
let channelTerm = (
<FormattedMessage
Expand Down Expand Up @@ -346,7 +346,7 @@ export default class Navbar extends React.Component {
</li>
);

if (ChannelUtils.showManagementOptions(channel, isAdmin, isSystemAdmin)) {
if (ChannelUtils.showManagementOptions(channel, isAdmin, isSystemAdmin, isChannelAdmin)) {
setChannelHeaderOption = (
<li role='presentation'>
<a
Expand Down Expand Up @@ -402,7 +402,7 @@ export default class Navbar extends React.Component {
);
}

if (ChannelUtils.showDeleteOption(channel, isAdmin, isSystemAdmin) || this.state.userCount === 1) {
if (ChannelUtils.showDeleteOption(channel, isAdmin, isSystemAdmin, isChannelAdmin) || this.state.userCount === 1) {
if (!ChannelStore.isDefault(channel)) {
deleteChannelOption = (
<li role='presentation'>
Expand Down Expand Up @@ -617,6 +617,7 @@ export default class Navbar extends React.Component {
var popoverContent;
var isAdmin = false;
var isSystemAdmin = false;
var isChannelAdmin = false;
var isDirect = false;

var editChannelHeaderModal = null;
Expand Down Expand Up @@ -647,6 +648,7 @@ export default class Navbar extends React.Component {

isAdmin = TeamStore.isTeamAdminForCurrentTeam() || UserStore.isSystemAdminForCurrentUser();
isSystemAdmin = UserStore.isSystemAdminForCurrentUser();
isChannelAdmin = ChannelStore.isChannelAdminForCurrentChannel();

if (channel.type === 'O') {
channelTitle = channel.display_name;
Expand Down Expand Up @@ -753,7 +755,7 @@ export default class Navbar extends React.Component {
</button>
);

var channelMenuDropdown = this.createDropdown(channel, channelTitle, isAdmin, isSystemAdmin, isDirect, popoverContent);
var channelMenuDropdown = this.createDropdown(channel, channelTitle, isAdmin, isSystemAdmin, isChannelAdmin, isDirect, popoverContent);

return (
<div>
Expand Down
1 change: 1 addition & 0 deletions webapp/i18n/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -322,6 +322,7 @@
"admin.general.policy.permissionsDeletePostAll": "Message authors can delete their own messages, and Administrators can delete any message",
"admin.general.policy.permissionsDeletePostSystemAdmin": "System Admins",
"admin.general.policy.permissionsSystemAdmin": "System Admins",
"admin.general.policy.permissionsChannelAdmin": "Channel, Team and System Admins",
"admin.general.policy.restrictPostDeleteDescription": "Set policy on who has permission to delete messages.",
"admin.general.policy.restrictPostDeleteTitle": "Allow which users to delete messages:",
"admin.general.policy.restrictPrivateChannelCreationDescription": "Set policy on who can create private groups.",
Expand Down
12 changes: 11 additions & 1 deletion webapp/stores/channel_store.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -377,7 +377,17 @@ class ChannelStoreClass extends EventEmitter {
}

isChannelAdminForCurrentChannel() {
return this.isChannelAdmin(UserStore.getCurrentId(), this.getCurrentId());
if (!Utils) {
Utils = require('utils/utils.jsx'); //eslint-disable-line global-require
}

const member = this.getMyMember(this.getCurrentId());

if (!member) {
return false;
}

return Utils.isChannelAdmin(member.roles);
}

isChannelAdmin(userId, channelId) {
Expand Down
16 changes: 14 additions & 2 deletions webapp/utils/channel_utils.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ export function showCreateOption(channelType, isAdmin, isSystemAdmin) {
return true;
}

export function showManagementOptions(channel, isAdmin, isSystemAdmin) {
export function showManagementOptions(channel, isAdmin, isSystemAdmin, isChannelAdmin) {
if (global.window.mm_license.IsLicensed !== 'true') {
return true;
}
Expand All @@ -138,19 +138,25 @@ export function showManagementOptions(channel, isAdmin, isSystemAdmin) {
if (global.window.mm_config.RestrictPublicChannelManagement === Constants.PERMISSIONS_TEAM_ADMIN && !isAdmin) {
return false;
}
if (global.window.mm_config.RestrictPublicChannelManagement === Constants.PERMISSIONS_CHANNEL_ADMIN && !isChannelAdmin && !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;
}
if (global.window.mm_config.RestrictPrivateChannelManagement === Constants.PERMISSIONS_CHANNEL_ADMIN && !isChannelAdmin && !isAdmin) {
return false;
}
}

return true;
}

export function showDeleteOption(channel, isAdmin, isSystemAdmin) {
export function showDeleteOption(channel, isAdmin, isSystemAdmin, isChannelAdmin) {
if (global.window.mm_license.IsLicensed !== 'true') {
return true;
}
Expand All @@ -162,13 +168,19 @@ export function showDeleteOption(channel, isAdmin, isSystemAdmin) {
if (global.window.mm_config.RestrictPublicChannelDeletion === Constants.PERMISSIONS_TEAM_ADMIN && !isAdmin) {
return false;
}
if (global.window.mm_config.RestrictPublicChannelDeletion === Constants.PERMISSIONS_CHANNEL_ADMIN && !isChannelAdmin && !isAdmin) {
return false;
}
} else if (channel.type === Constants.PRIVATE_CHANNEL) {
if (global.window.mm_config.RestrictPrivateChannelDeletion === Constants.PERMISSIONS_SYSTEM_ADMIN && !isSystemAdmin) {
return false;
}
if (global.window.mm_config.RestrictPrivateChannelDeletion === Constants.PERMISSIONS_TEAM_ADMIN && !isAdmin) {
return false;
}
if (global.window.mm_config.RestrictPrivateChannelDeletion === Constants.PERMISSIONS_CHANNEL_ADMIN && !isChannelAdmin && !isAdmin) {
return false;
}
}

return true;
Expand Down
1 change: 1 addition & 0 deletions webapp/utils/constants.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -877,6 +877,7 @@ export const Constants = {
LICENSE_EXPIRY_NOTIFICATION: 1000 * 60 * 60 * 24 * 15, // 15 days
LICENSE_GRACE_PERIOD: 1000 * 60 * 60 * 24 * 15, // 15 days
PERMISSIONS_ALL: 'all',
PERMISSIONS_CHANNEL_ADMIN: 'channel_admin',
PERMISSIONS_TEAM_ADMIN: 'team_admin',
PERMISSIONS_SYSTEM_ADMIN: 'system_admin',
PERMISSIONS_DELETE_POST_ALL: 'all',
Expand Down

0 comments on commit 8509c2f

Please sign in to comment.