From 352e8d13baae99e7f4e9f1b88253d6988541fecb Mon Sep 17 00:00:00 2001 From: Stephen Smith Date: Tue, 29 Mar 2022 23:32:11 -0400 Subject: [PATCH] 18559: Re-use account status renderer code for group details panel Arvados-DCO-1.1-Signed-off-by: Stephen Smith --- src/store/users/users-actions.ts | 15 ---- .../data-explorer/renderers.tsx | 74 +++++++------------ .../group-details-panel.tsx | 8 +- 3 files changed, 29 insertions(+), 68 deletions(-) diff --git a/src/store/users/users-actions.ts b/src/store/users/users-actions.ts index e3c965bd..d74e05ee 100644 --- a/src/store/users/users-actions.ts +++ b/src/store/users/users-actions.ts @@ -133,21 +133,6 @@ export const openUserPanel = () => } }; -export const toggleIsActive = (uuid: string) => - async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { - const { resources } = getState(); - const data = getResource(uuid)(resources); - const isActive = data!.isActive; - let newActivity; - if (isActive) { - newActivity = await services.userService.unsetup(uuid); - } else { - newActivity = await services.userService.update(uuid, { isActive: true }); - } - dispatch(loadUsersPanel()); - return newActivity; - }; - export const toggleIsAdmin = (uuid: string) => async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { const { resources } = getState(); diff --git a/src/views-components/data-explorer/renderers.tsx b/src/views-components/data-explorer/renderers.tsx index 70508628..51b7dcc8 100644 --- a/src/views-components/data-explorer/renderers.tsx +++ b/src/views-components/data-explorer/renderers.tsx @@ -35,7 +35,7 @@ import { ResourceStatus as WorkflowStatus } from 'views/workflow-panel/workflow- import { getUuidPrefix, openRunProcess } from 'store/workflow-panel/workflow-panel-actions'; import { openSharingDialog } from 'store/sharing-dialog/sharing-dialog-actions'; import { getUserFullname, getUserDisplayName, User, UserResource } from 'models/user'; -import { toggleIsActive, toggleIsAdmin } from 'store/users/users-actions'; +import { toggleIsAdmin } from 'store/users/users-actions'; import { LinkClass, LinkResource } from 'models/link'; import { navigateTo, navigateToGroupDetails, navigateToUserProfile } from 'store/navigation/navigation-action'; import { withResourceData } from 'views-components/data-explorer/with-resources'; @@ -211,33 +211,11 @@ export const ResourceEmail = connect( return resource || { email: '' }; })(renderEmail); -const renderIsActive = (props: { uuid: string, kind: ResourceKind, isActive: boolean, toggleIsActive: (uuid: string) => void, disabled?: boolean }) => { - if (props.kind === ResourceKind.USER) { - return { - e.stopPropagation(); - props.toggleIsActive(props.uuid) - }} />; - } else { - return ; - } -} - -export const ResourceIsActive = connect( - (state: RootState, props: { uuid: string, disabled?: boolean }) => { - const resource = getResource(props.uuid)(state.resources); - return resource ? {...resource, disabled: !!props.disabled} : { isActive: false, kind: ResourceKind.NONE }; - }, { toggleIsActive } -)(renderIsActive); - enum UserAccountStatus { ACTIVE = 'Active', INACTIVE = 'Inactive', SETUP = 'Setup', - UNKNOWN = 'UNKNOWN' + UNKNOWN = '' } const renderAccountStatus = (props: {status: UserAccountStatus}) => @@ -252,7 +230,7 @@ const renderAccountStatus = (props: {status: UserAccountStatus}) => case UserAccountStatus.INACTIVE: return ; default: - return ; + return <>; } })()} @@ -263,33 +241,31 @@ const renderAccountStatus = (props: {status: UserAccountStatus}) => ; -export const UserResourceAccountStatus = connect( - (state: RootState, props: { uuid: string }) => { - const user = getResource(props.uuid)(state.resources); - // Get membership links for all users group - const allUsersGroupUuid = getBuiltinGroupUuid(state.auth.localCluster, BuiltinGroups.ALL); - const permissions = filterResources((resource: LinkResource) => - resource.kind === ResourceKind.LINK && - resource.linkClass === LinkClass.PERMISSION && - resource.headUuid === allUsersGroupUuid && - resource.tailUuid === props.uuid - )(state.resources); - - if (user) { - return user.isActive ? {status: UserAccountStatus.ACTIVE} : permissions.length > 0 ? {status: UserAccountStatus.SETUP} : {status: UserAccountStatus.INACTIVE}; - } else { - return {status: UserAccountStatus.UNKNOWN}; - } - })(renderAccountStatus); +const getUserAccountStatus = (state: RootState, props: { uuid: string }) => { + const user = getResource(props.uuid)(state.resources); + // Get membership links for all users group + const allUsersGroupUuid = getBuiltinGroupUuid(state.auth.localCluster, BuiltinGroups.ALL); + const permissions = filterResources((resource: LinkResource) => + resource.kind === ResourceKind.LINK && + resource.linkClass === LinkClass.PERMISSION && + resource.headUuid === allUsersGroupUuid && + resource.tailUuid === props.uuid + )(state.resources); + + if (user) { + return user.isActive ? {status: UserAccountStatus.ACTIVE} : permissions.length > 0 ? {status: UserAccountStatus.SETUP} : {status: UserAccountStatus.INACTIVE}; + } else { + return {status: UserAccountStatus.UNKNOWN}; + } +} -export const ResourceLinkTailIsActive = connect( - (state: RootState, props: { uuid: string, disabled?: boolean }) => { +export const ResourceLinkTailAccountStatus = connect( + (state: RootState, props: { uuid: string }) => { const link = getResource(props.uuid)(state.resources); - const tailResource = getResource(link?.tailUuid || '')(state.resources); + return link && link.tailKind === ResourceKind.USER ? getUserAccountStatus(state, {uuid: link.tailUuid}) : {status: UserAccountStatus.UNKNOWN}; + })(renderAccountStatus); - return tailResource ? {...tailResource, disabled: !!props.disabled} : { isActive: false, kind: ResourceKind.NONE }; - }, { toggleIsActive } -)(renderIsActive); +export const UserResourceAccountStatus = connect(getUserAccountStatus)(renderAccountStatus); const renderIsHidden = (props: { memberLinkUuid: string, diff --git a/src/views/group-details-panel/group-details-panel.tsx b/src/views/group-details-panel/group-details-panel.tsx index ce3f34c7..9cee3cbc 100644 --- a/src/views/group-details-panel/group-details-panel.tsx +++ b/src/views/group-details-panel/group-details-panel.tsx @@ -7,7 +7,7 @@ import { connect } from 'react-redux'; import { DataExplorer } from "views-components/data-explorer/data-explorer"; import { DataColumns } from 'components/data-table/data-table'; -import { ResourceLinkHeadUuid, ResourceLinkTailUsername, ResourceLinkHeadPermissionLevel, ResourceLinkTailPermissionLevel, ResourceLinkHead, ResourceLinkTail, ResourceLinkDelete, ResourceLinkTailIsActive, ResourceLinkTailIsVisible } from 'views-components/data-explorer/renderers'; +import { ResourceLinkHeadUuid, ResourceLinkTailUsername, ResourceLinkHeadPermissionLevel, ResourceLinkTailPermissionLevel, ResourceLinkHead, ResourceLinkTail, ResourceLinkDelete, ResourceLinkTailAccountStatus, ResourceLinkTailIsVisible } from 'views-components/data-explorer/renderers'; import { createTree } from 'models/tree'; import { noop } from 'lodash/fp'; import { RootState } from 'store/store'; @@ -31,7 +31,7 @@ const styles: StyleRulesCallback = (theme: ArvadosTheme) => ({ export enum GroupDetailsPanelMembersColumnNames { FULL_NAME = "Name", USERNAME = "Username", - ACTIVE = "User Active", + STATUS = "Account Status", VISIBLE = "Visible to other members", PERMISSION = "Permission", REMOVE = "Remove", @@ -60,11 +60,11 @@ export const groupDetailsMembersPanelColumns: DataColumns = [ render: uuid => }, { - name: GroupDetailsPanelMembersColumnNames.ACTIVE, + name: GroupDetailsPanelMembersColumnNames.STATUS, selected: true, configurable: true, filters: createTree(), - render: uuid => + render: uuid => }, { name: GroupDetailsPanelMembersColumnNames.VISIBLE, -- 2.30.2