diff options
author | George Goldberg <george@gberg.me> | 2017-02-24 01:15:10 +0000 |
---|---|---|
committer | Christopher Speller <crspeller@gmail.com> | 2017-02-23 20:15:10 -0500 |
commit | 8509c2f0b0893f8a7936a1943cc924db09bb62f4 (patch) | |
tree | 9b52c232fbc96fadaec26f0694ffc7e764651757 /webapp | |
parent | bc9f3dfa240b2a197859de006baf2eceaafe0fcf (diff) | |
download | chat-8509c2f0b0893f8a7936a1943cc924db09bb62f4.tar.gz chat-8509c2f0b0893f8a7936a1943cc924db09bb62f4.tar.bz2 chat-8509c2f0b0893f8a7936a1943cc924db09bb62f4.zip |
PLT-5080 (WebApp): Channel Admin permission level. (#5047)
* 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.
Diffstat (limited to 'webapp')
-rw-r--r-- | webapp/actions/channel_actions.jsx | 2 | ||||
-rw-r--r-- | webapp/components/admin_console/policy_settings.jsx | 4 | ||||
-rw-r--r-- | webapp/components/channel_header.jsx | 5 | ||||
-rw-r--r-- | webapp/components/navbar.jsx | 10 | ||||
-rw-r--r-- | webapp/i18n/en.json | 1 | ||||
-rw-r--r-- | webapp/stores/channel_store.jsx | 12 | ||||
-rw-r--r-- | webapp/utils/channel_utils.jsx | 16 | ||||
-rw-r--r-- | webapp/utils/constants.jsx | 1 |
8 files changed, 40 insertions, 11 deletions
diff --git a/webapp/actions/channel_actions.jsx b/webapp/actions/channel_actions.jsx index 4b4e3e10c..08d8f1486 100644 --- a/webapp/actions/channel_actions.jsx +++ b/webapp/actions/channel_actions.jsx @@ -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) { @@ -153,7 +152,6 @@ export function makeUserChannelMember(channelId, userId, success, error) { userId, 'channel_user', () => { - AsyncClient.getChannelMember(channelId, userId); getChannelMembersForUserIds(channelId, [userId]); if (success) { diff --git a/webapp/components/admin_console/policy_settings.jsx b/webapp/components/admin_console/policy_settings.jsx index 391726a93..5d82fc69c 100644 --- a/webapp/components/admin_console/policy_settings.jsx +++ b/webapp/components/admin_console/policy_settings.jsx @@ -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')} ]} @@ -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')} ]} @@ -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')} ]} @@ -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')} ]} diff --git a/webapp/components/channel_header.jsx b/webapp/components/channel_header.jsx index 54e73cda5..ee060577c 100644 --- a/webapp/components/channel_header.jsx +++ b/webapp/components/channel_header.jsx @@ -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; @@ -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' @@ -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); } diff --git a/webapp/components/navbar.jsx b/webapp/components/navbar.jsx index b54b8701e..486c5d565 100644 --- a/webapp/components/navbar.jsx +++ b/webapp/components/navbar.jsx @@ -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 @@ -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 @@ -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'> @@ -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; @@ -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; @@ -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> diff --git a/webapp/i18n/en.json b/webapp/i18n/en.json index c460c19aa..eeb29cc39 100644 --- a/webapp/i18n/en.json +++ b/webapp/i18n/en.json @@ -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.", diff --git a/webapp/stores/channel_store.jsx b/webapp/stores/channel_store.jsx index c46e17016..f303b0190 100644 --- a/webapp/stores/channel_store.jsx +++ b/webapp/stores/channel_store.jsx @@ -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) { diff --git a/webapp/utils/channel_utils.jsx b/webapp/utils/channel_utils.jsx index 67dcfac67..22c428cb8 100644 --- a/webapp/utils/channel_utils.jsx +++ b/webapp/utils/channel_utils.jsx @@ -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; } @@ -138,6 +138,9 @@ 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; @@ -145,12 +148,15 @@ export function showManagementOptions(channel, isAdmin, isSystemAdmin) { 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; } @@ -162,6 +168,9 @@ 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; @@ -169,6 +178,9 @@ export function showDeleteOption(channel, isAdmin, isSystemAdmin) { 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; diff --git a/webapp/utils/constants.jsx b/webapp/utils/constants.jsx index 6ad4a9e92..ff26a0c7f 100644 --- a/webapp/utils/constants.jsx +++ b/webapp/utils/constants.jsx @@ -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', |