diff --git a/frontend/app/components/Client/ManageUsers/ManageUsers.js b/frontend/app/components/Client/ManageUsers/ManageUsers.js index ccac283dd..cd634a8cd 100644 --- a/frontend/app/components/Client/ManageUsers/ManageUsers.js +++ b/frontend/app/components/Client/ManageUsers/ManageUsers.js @@ -22,7 +22,7 @@ const LIMIT_WARNING = 'You have reached users limit.'; errors: state.getIn([ 'members', 'saveRequest', 'errors' ]), loading: state.getIn([ 'members', 'loading' ]), saving: state.getIn([ 'members', 'saveRequest', 'loading' ]), - roles: state.getIn(['roles', 'list']).map(r => ({ text: r.name, value: r.roleId })).toJS(), + roles: state.getIn(['roles', 'list']).filter(r => !r.protected).map(r => ({ text: r.name, value: r.roleId })).toJS(), isEnterprise: state.getIn([ 'user', 'client', 'edition' ]) === 'ee', }), { init, @@ -127,7 +127,7 @@ class ManageUsers extends React.PureComponent { onChange={ this.onChangeCheckbox } disabled={member.superAdmin} /> - { 'Admin' } + { 'Admin Privileges' }
{ 'Can manage Projects and team members.' }
@@ -220,7 +220,7 @@ class ManageUsers extends React.PureComponent { /> } - // disabled={ canAddUsers } + disabled={ canAddUsers } content={ `${ !canAddUsers ? (!isAdmin ? PERMISSION_WARNING : LIMIT_WARNING) : 'Add team member' }` } size="tiny" inverted diff --git a/frontend/app/components/Client/PreferencesMenu/PreferencesMenu.js b/frontend/app/components/Client/PreferencesMenu/PreferencesMenu.js index f139afbe9..fa3d51db9 100644 --- a/frontend/app/components/Client/PreferencesMenu/PreferencesMenu.js +++ b/frontend/app/components/Client/PreferencesMenu/PreferencesMenu.js @@ -50,7 +50,6 @@ function PreferencesMenu({ activeTab, appearance, history, isEnterprise }) { {
- void, fetchList: () => Promise, + account: any, + permissionsMap: any } function Roles(props: Props) { - const { loading, instance, roles, init, edit, deleteRole } = props + const { loading, instance, roles, init, edit, deleteRole, account, permissionsMap } = props const [showModal, setShowmModal] = useState(false) + const isAdmin = account.admin || account.superAdmin; + + console.log('permissionsMap', permissionsMap) + useEffect(() => { props.fetchList() @@ -69,10 +75,12 @@ function Roles(props: Props) { circle icon="plus" outline + disabled={ !isAdmin } onClick={ () => setShowmModal(true) } />
} + disabled={ isAdmin } size="tiny" inverted position="top left" @@ -90,6 +98,7 @@ function Roles(props: Props) { {roles.map(role => ( @@ -102,8 +111,17 @@ function Roles(props: Props) { ) } -export default connect(state => ({ - instance: state.getIn(['roles', 'instance']) || null, - roles: state.getIn(['roles', 'list']), - loading: state.getIn(['roles', 'fetchRequest', 'loading']), -}), { init, edit, fetchList, deleteRole })(Roles) \ No newline at end of file +export default connect(state => { + const permissions = state.getIn(['roles', 'permissions']) + const permissionsMap = {} + permissions.forEach(p => { + permissionsMap[p.value] = p.name + }); + return { + instance: state.getIn(['roles', 'instance']) || null, + permissionsMap: permissionsMap, + roles: state.getIn(['roles', 'list']), + loading: state.getIn(['roles', 'fetchRequest', 'loading']), + account: state.getIn([ 'user', 'account' ]) + } +}, { init, edit, fetchList, deleteRole })(Roles) \ No newline at end of file diff --git a/frontend/app/components/Client/Roles/components/RoleForm/RoleForm.tsx b/frontend/app/components/Client/Roles/components/RoleForm/RoleForm.tsx index d12b60269..7b79f6651 100644 --- a/frontend/app/components/Client/Roles/components/RoleForm/RoleForm.tsx +++ b/frontend/app/components/Client/Roles/components/RoleForm/RoleForm.tsx @@ -97,4 +97,5 @@ const RoleForm = ({ role, closeModal, edit, save, saving, permissions }: Props) export default connect(state => ({ role: state.getIn(['roles', 'instance']), permissions: state.getIn(['roles', 'permissions']), + saving: state.getIn([ 'roles', 'saveRequest', 'loading' ]), }), { edit, save })(RoleForm); \ No newline at end of file diff --git a/frontend/app/components/Client/Roles/components/RoleItem/RoleItem.tsx b/frontend/app/components/Client/Roles/components/RoleItem/RoleItem.tsx index a242ea6f2..c4cdb7a25 100644 --- a/frontend/app/components/Client/Roles/components/RoleItem/RoleItem.tsx +++ b/frontend/app/components/Client/Roles/components/RoleItem/RoleItem.tsx @@ -1,18 +1,33 @@ -import React from 'react'; +import React from 'react' import { Icon } from 'UI' import stl from './roleItem.css' import cn from 'classnames' +function PermisionLabel({ permission }: any) { + return ( +
{ permission }
+ ); +} + interface Props { role: any, deleteHandler?: (role: any) => void, editHandler?: (role: any) => void, + permissions: any } -function RoleItem({ role, deleteHandler, editHandler }: Props) { +function RoleItem({ role, deleteHandler, editHandler, permissions }: Props) { return (
- { role.name } +
+ { role.name } +
+ {role.permissions.map((permission: any) => ( + + // { permissions[permission].name } + ))} +
+
{ !!deleteHandler && diff --git a/frontend/app/components/Client/Roles/components/RoleItem/roleItem.css b/frontend/app/components/Client/Roles/components/RoleItem/roleItem.css index 50a56afb4..7173d1c33 100644 --- a/frontend/app/components/Client/Roles/components/RoleItem/roleItem.css +++ b/frontend/app/components/Client/Roles/components/RoleItem/roleItem.css @@ -34,4 +34,14 @@ pointer-events: none; opacity: 0.5; } +} + +.label { + margin-left: 10px; + padding: 0 10px; + border-radius: 3px; + background-color: $gray-lightest; + font-size: 12px; + border: solid thin $gray-light; + width: fit-content; } \ No newline at end of file diff --git a/frontend/app/types/member.js b/frontend/app/types/member.js index 4c064e90d..03495784c 100644 --- a/frontend/app/types/member.js +++ b/frontend/app/types/member.js @@ -12,6 +12,7 @@ export default Record({ joined: false, expiredInvitation: false, roleId: undefined, + roleName: undefined, invitationLink: '', }, { idKey: 'id',