X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/2c257e34488b251e146631e12559732b3879d567..9da78c51275666c685545d29cd92ffa0d32f7b2f:/src/views-components/data-explorer/renderers.tsx?ds=sidebyside diff --git a/src/views-components/data-explorer/renderers.tsx b/src/views-components/data-explorer/renderers.tsx index e87c9f33..7cdd9b83 100644 --- a/src/views-components/data-explorer/renderers.tsx +++ b/src/views-components/data-explorer/renderers.tsx @@ -28,13 +28,14 @@ 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'; import { PermissionLevel } from 'models/permission'; import { openPermissionEditContextMenu } from 'store/context-menu/context-menu-actions'; import { getUserUuid } from 'common/getuser'; +import { VirtualMachinesResource } from 'models/virtual-machines'; const renderName = (dispatch: Dispatch, item: GroupContentsResource) => { @@ -171,7 +172,7 @@ export const ResourceFullName = connect( const renderUuid = (item: { uuid: string }) => - {item.uuid}; + {item.uuid}; export const ResourceUuid = connect( (state: RootState, props: { uuid: string }) => { @@ -188,46 +189,60 @@ export const ResourceEmail = connect( return resource || { email: '' }; })(renderEmail); -const renderIsActive = (props: { uuid: string, kind: ResourceKind, isActive: boolean, toggleIsActive: (uuid: string) => void }) => { +const renderIsActive = (props: { uuid: string, kind: ResourceKind, isActive: boolean, toggleIsActive: (uuid: string) => void, disabled?: boolean }) => { if (props.kind === ResourceKind.USER) { return props.toggleIsActive(props.uuid)} />; + disabled={!!props.disabled} + onClick={(e) => { + e.stopPropagation(); + props.toggleIsActive(props.uuid) + }} />; } else { return ; } } export const ResourceIsActive = connect( - (state: RootState, props: { uuid: string }) => { + (state: RootState, props: { uuid: string, disabled?: boolean }) => { const resource = getResource(props.uuid)(state.resources); - return resource || { isActive: false, kind: ResourceKind.NONE }; + return resource ? {...resource, disabled: !!props.disabled} : { isActive: false, kind: ResourceKind.NONE }; }, { toggleIsActive } )(renderIsActive); export const ResourceLinkTailIsActive = connect( - (state: RootState, props: { uuid: string }) => { + (state: RootState, props: { uuid: string, disabled?: boolean }) => { const link = getResource(props.uuid)(state.resources); const tailResource = getResource(link?.tailUuid || '')(state.resources); - return tailResource || { isActive: false, kind: ResourceKind.NONE }; + return tailResource ? {...tailResource, disabled: !!props.disabled} : { isActive: false, kind: ResourceKind.NONE }; }, { 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={(e) => { + e.stopPropagation(); + 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); @@ -241,10 +256,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); @@ -252,7 +269,10 @@ const renderIsAdmin = (props: { uuid: string, isAdmin: boolean, toggleIsAdmin: ( props.toggleIsAdmin(props.uuid)} />; + onClick={(e) => { + e.stopPropagation(); + props.toggleIsAdmin(props.uuid); + }} />; export const ResourceIsAdmin = connect( (state: RootState, props: { uuid: string }) => { @@ -261,15 +281,37 @@ export const ResourceIsAdmin = connect( }, { toggleIsAdmin } )(renderIsAdmin); -const renderUsername = (item: { username: string }) => - {item.username}; +const renderUsername = (item: { username: string, uuid: string }) => + {item.username || item.uuid}; export const ResourceUsername = connect( (state: RootState, props: { uuid: string }) => { const resource = getResource(props.uuid)(state.resources); - return resource || { username: '' }; + return resource || { username: '', uuid: props.uuid }; })(renderUsername); +// Virtual machine resource + +const renderHostname = (item: { hostname: string }) => + {item.hostname}; + +export const VirtualMachineHostname = connect( + (state: RootState, props: { uuid: string }) => { + const resource = getResource(props.uuid)(state.resources); + return resource || { hostname: '' }; + })(renderHostname); + +const renderVirtualMachineLogin = (login: {user: string}) => + {login.user} + +export const VirtualMachineLogin = connect( + (state: RootState, props: { linkUuid: string }) => { + const permission = getResource(props.linkUuid)(state.resources); + const user = getResource(permission?.tailUuid || '')(state.resources); + + return {user: user?.username || permission?.tailUuid || ''}; + })(renderVirtualMachineLogin); + // Common methods const renderCommonData = (data: string) => {data}; @@ -309,7 +351,7 @@ const clusterColors = [ export const ResourceCluster = (props: { uuid: string }) => { const CLUSTER_ID_LENGTH = 5; const pos = props.uuid.length > CLUSTER_ID_LENGTH ? props.uuid.indexOf('-') : 5; - const clusterId = pos >= CLUSTER_ID_LENGTH ? props.uuid.substr(0, pos) : ''; + const clusterId = pos >= CLUSTER_ID_LENGTH ? props.uuid.substring(0, pos) : ''; const ci = pos >= CLUSTER_ID_LENGTH ? ((((( (props.uuid.charCodeAt(0) * props.uuid.charCodeAt(1)) + props.uuid.charCodeAt(2)) @@ -356,7 +398,7 @@ const renderResourceLink = (dispatch: Dispatch, item: Resource) => { var displayName = getResourceDisplayName(item); return dispatch(navigateTo(item.uuid))}> - {resourceLabel(item.kind)}: {displayName || item.uuid} + {resourceLabel(item.kind, item && item.kind === ResourceKind.GROUP ? (item as GroupResource).groupClass || '' : '')}: {displayName || item.uuid} ; }; @@ -425,9 +467,11 @@ const renderLinkDelete = (dispatch: Dispatch, item: LinkResource, canManage: boo 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 }, - canManage: link && getResourceLinkCanManage(state, link), + canManage: link && getResourceLinkCanManage(state, link) && !isBuiltin, }; })((props: { item: LinkResource, canManage: boolean } & DispatchProp) => renderLinkDelete(props.dispatch, props.item, props.canManage)); @@ -452,7 +496,7 @@ const renderPermissionLevel = (dispatch: Dispatch, link: LinkResource, canManage return {formatPermissionLevel(link.name as PermissionLevel)} {canManage ? - dispatch(openPermissionEditContextMenu(event, link))}> + dispatch(openPermissionEditContextMenu(event, link))}> : '' @@ -463,10 +507,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)); @@ -474,10 +519,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));