X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/416d4f0f57336b2225bcc82b0f4db8873adf8cd2..7e1669d2263cdf8e9066057fd126007b755ba7f5:/src/views-components/data-explorer/renderers.tsx diff --git a/src/views-components/data-explorer/renderers.tsx b/src/views-components/data-explorer/renderers.tsx index 39893392..2ec4bf51 100644 --- a/src/views-components/data-explorer/renderers.tsx +++ b/src/views-components/data-explorer/renderers.tsx @@ -28,7 +28,7 @@ import { withResourceData } from 'views-components/data-explorer/with-resources' import { CollectionResource } from 'models/collection'; import { IllegalNamingWarning } from 'components/warning/warning'; import { loadResource } from 'store/resources/resources-actions'; -import { GroupClass, GroupResource } from 'models/group'; +import { GroupClass, GroupResource, isBuiltinGroup } from 'models/group'; import { openRemoveGroupMemberDialog } from 'store/group-details-panel/group-details-panel-actions'; import { setMemberIsHidden } from 'store/group-details-panel/group-details-panel-actions'; import { formatPermissionLevel } from 'views-components/sharing-dialog/permission-select'; @@ -171,7 +171,7 @@ export const ResourceFullName = connect( const renderUuid = (item: { uuid: string }) => - {item.uuid}; + {item.uuid}; export const ResourceUuid = connect( (state: RootState, props: { uuid: string }) => { @@ -215,18 +215,26 @@ export const ResourceLinkTailIsActive = connect( }, { toggleIsActive } )(renderIsActive); -const renderIsHidden = (props: { memberLinkUuid: string, permissionLinkUuid: string, hidden: boolean, setMemberIsHidden: (memberLinkUuid: string, permissionLinkUuid: string, hide: boolean) => void }) => { +const renderIsHidden = (props: { + memberLinkUuid: string, + permissionLinkUuid: string, + visible: boolean, + canManage: boolean, + setMemberIsHidden: (memberLinkUuid: string, permissionLinkUuid: string, hide: boolean) => void + }) => { if (props.memberLinkUuid) { return props.setMemberIsHidden(props.memberLinkUuid, props.permissionLinkUuid, !props.hidden)} />; + checked={props.visible} + disabled={!props.canManage} + onClick={() => props.setMemberIsHidden(props.memberLinkUuid, props.permissionLinkUuid, !props.visible)} />; } else { return ; } } -export const ResourceLinkTailIsHidden = connect( +export const ResourceLinkTailIsVisible = connect( (state: RootState, props: { uuid: string }) => { const link = getResource(props.uuid)(state.resources); const member = getResource(link?.tailUuid || '')(state.resources); @@ -240,10 +248,12 @@ export const ResourceLinkTailIsHidden = connect( const permissionLinkUuid = permissions.length > 0 ? permissions[0].uuid : ''; const isVisible = link && group && permissions.length > 0; + // Consider whether the current user canManage this resurce in addition when it's possible + const isBuiltin = isBuiltinGroup(link?.headUuid || ''); return member?.kind === ResourceKind.USER - ? { memberLinkUuid: link?.uuid, permissionLinkUuid, hidden: !isVisible } - : { memberLinkUuid: '', permissionLinkUuid: '', hidden: false}; + ? { memberLinkUuid: link?.uuid, permissionLinkUuid, visible: isVisible, canManage: !isBuiltin } + : { memberLinkUuid: '', permissionLinkUuid: '', visible: false, canManage: false }; }, { setMemberIsHidden } )(renderIsHidden); @@ -403,13 +413,19 @@ export const ResourceLinkTailUuid = connect( return tailResource || { uuid: '' }; })(renderUuid); -const renderLinkDelete = (dispatch: Dispatch, item: LinkResource) => { +const renderLinkDelete = (dispatch: Dispatch, item: LinkResource, canManage: boolean) => { if (item.uuid) { - return - dispatch(openRemoveGroupMemberDialog(item.uuid))}> - - - ; + return canManage ? + + dispatch(openRemoveGroupMemberDialog(item.uuid))}> + + + : + + + + + ; } else { return ; } @@ -418,11 +434,14 @@ const renderLinkDelete = (dispatch: Dispatch, item: LinkResource) => { export const ResourceLinkDelete = connect( (state: RootState, props: { uuid: string }) => { const link = getResource(props.uuid)(state.resources); + const isBuiltin = isBuiltinGroup(link?.headUuid || '') || isBuiltinGroup(link?.tailUuid || ''); + return { - item: link || { uuid: '', kind: ResourceKind.NONE } + item: link || { uuid: '', kind: ResourceKind.NONE }, + canManage: link && getResourceLinkCanManage(state, link) && !isBuiltin, }; - })((props: { item: LinkResource } & DispatchProp) => - renderLinkDelete(props.dispatch, props.item)); + })((props: { item: LinkResource, canManage: boolean } & DispatchProp) => + renderLinkDelete(props.dispatch, props.item, props.canManage)); export const ResourceLinkTailEmail = connect( (state: RootState, props: { uuid: string }) => { @@ -444,7 +463,7 @@ const renderPermissionLevel = (dispatch: Dispatch, link: LinkResource, canManage return {formatPermissionLevel(link.name as PermissionLevel)} {canManage ? - dispatch(openPermissionEditContextMenu(event, link))}> + dispatch(openPermissionEditContextMenu(event, link))}> : '' @@ -455,10 +474,11 @@ const renderPermissionLevel = (dispatch: Dispatch, link: LinkResource, canManage export const ResourceLinkHeadPermissionLevel = connect( (state: RootState, props: { uuid: string }) => { const link = getResource(props.uuid)(state.resources); + const isBuiltin = isBuiltinGroup(link?.headUuid || '') || isBuiltinGroup(link?.tailUuid || ''); return { link: link || { uuid: '', name: '', kind: ResourceKind.NONE }, - canManage: link && getResourceLinkCanManage(state, link), + canManage: link && getResourceLinkCanManage(state, link) && !isBuiltin, }; })((props: { link: LinkResource, canManage: boolean } & DispatchProp) => renderPermissionLevel(props.dispatch, props.link, props.canManage)); @@ -466,10 +486,11 @@ export const ResourceLinkHeadPermissionLevel = connect( export const ResourceLinkTailPermissionLevel = connect( (state: RootState, props: { uuid: string }) => { const link = getResource(props.uuid)(state.resources); + const isBuiltin = isBuiltinGroup(link?.headUuid || '') || isBuiltinGroup(link?.tailUuid || ''); return { link: link || { uuid: '', name: '', kind: ResourceKind.NONE }, - canManage: link && getResourceLinkCanManage(state, link), + canManage: link && getResourceLinkCanManage(state, link) && !isBuiltin, }; })((props: { link: LinkResource, canManage: boolean } & DispatchProp) => renderPermissionLevel(props.dispatch, props.link, props.canManage));