From 93926d5be6b62da8d8bedea1c9c3a63fd4e71b31 Mon Sep 17 00:00:00 2001 From: Stephen Smith Date: Tue, 10 May 2022 12:49:53 -0400 Subject: [PATCH] 19049: Exclude existing users with logins in create login user picker Arvados-DCO-1.1-Signed-off-by: Stephen Smith --- .../virtual-machines-actions.ts | 19 +++++++++-- .../sharing-dialog/participant-select.tsx | 3 ++ .../add-login-dialog.tsx | 33 +++++++++++-------- 3 files changed, 40 insertions(+), 15 deletions(-) diff --git a/src/store/virtual-machines/virtual-machines-actions.ts b/src/store/virtual-machines/virtual-machines-actions.ts index 35cf8d53..a7abf096 100644 --- a/src/store/virtual-machines/virtual-machines-actions.ts +++ b/src/store/virtual-machines/virtual-machines-actions.ts @@ -40,6 +40,7 @@ export const VIRTUAL_MACHINE_UPDATE_LOGIN_UUID_FIELD = 'uuid'; export const VIRTUAL_MACHINE_ADD_LOGIN_VM_FIELD = 'vmUuid'; export const VIRTUAL_MACHINE_ADD_LOGIN_USER_FIELD = 'user'; export const VIRTUAL_MACHINE_ADD_LOGIN_GROUPS_FIELD = 'groups'; +export const VIRTUAL_MACHINE_ADD_LOGIN_EXCLUDE = 'excludedPerticipants'; export const openUserVirtualMachines = () => async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { @@ -115,8 +116,22 @@ export const loadVirtualMachinesUserData = () => export const openAddVirtualMachineLoginDialog = (vmUuid: string) => async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { - dispatch(initialize(VIRTUAL_MACHINE_ADD_LOGIN_FORM, {[VIRTUAL_MACHINE_ADD_LOGIN_VM_FIELD]: vmUuid, [VIRTUAL_MACHINE_ADD_LOGIN_GROUPS_FIELD]: []})); - dispatch(dialogActions.OPEN_DIALOG( {id: VIRTUAL_MACHINE_ADD_LOGIN_DIALOG, data: {}} )); + // Get login permissions of vm + const virtualMachines = await services.virtualMachineService.list(); + dispatch(updateResources(virtualMachines.items)); + const logins = await services.permissionService.list({ + filters: new FilterBuilder() + .addIn('head_uuid', virtualMachines.items.map(item => item.uuid)) + .addEqual('name', PermissionLevel.CAN_LOGIN) + .getFilters() + }); + dispatch(updateResources(logins.items)); + + dispatch(initialize(VIRTUAL_MACHINE_ADD_LOGIN_FORM, { + [VIRTUAL_MACHINE_ADD_LOGIN_VM_FIELD]: vmUuid, + [VIRTUAL_MACHINE_ADD_LOGIN_GROUPS_FIELD]: [], + })); + dispatch(dialogActions.OPEN_DIALOG( {id: VIRTUAL_MACHINE_ADD_LOGIN_DIALOG, data: {excludedParticipants: logins.items.map(it => it.tailUuid)}} )); } export const openEditVirtualMachineLoginDialog = (permissionUuid: string) => diff --git a/src/views-components/sharing-dialog/participant-select.tsx b/src/views-components/sharing-dialog/participant-select.tsx index c7b540cd..a5d39479 100644 --- a/src/views-components/sharing-dialog/participant-select.tsx +++ b/src/views-components/sharing-dialog/participant-select.tsx @@ -24,6 +24,7 @@ type ParticipantResource = GroupResource | UserResource; interface ParticipantSelectProps { items: Participant[]; + excludedParticipants?: string[]; label?: string; autofocus?: boolean; onlyPeople?: boolean; @@ -130,11 +131,13 @@ export const ParticipantSelect = connect()( const filterUsers = new FilterBuilder() .addILike('any', value) + .addNotIn('uuid', this.props.excludedParticipants) .getFilters(); const userItems: ListResults = await userService.list({ filters: filterUsers, limit, count: "none" }); const filterGroups = new FilterBuilder() .addNotIn('group_class', [GroupClass.PROJECT, GroupClass.FILTER]) + .addNotIn('uuid', this.props.excludedParticipants) .addILike('name', value) .getFilters(); diff --git a/src/views-components/virtual-machines-dialog/add-login-dialog.tsx b/src/views-components/virtual-machines-dialog/add-login-dialog.tsx index bfc04716..d9547d7c 100644 --- a/src/views-components/virtual-machines-dialog/add-login-dialog.tsx +++ b/src/views-components/virtual-machines-dialog/add-login-dialog.tsx @@ -4,7 +4,7 @@ import React from 'react'; import { compose } from "redux"; -import { reduxForm, InjectedFormProps, WrappedFieldProps, Field } from 'redux-form'; +import { reduxForm, InjectedFormProps, WrappedFieldProps, Field, GenericField } from 'redux-form'; import { withDialog, WithDialogProps } from "store/dialog/with-dialog"; import { FormDialog } from 'components/form-dialog/form-dialog'; import { VIRTUAL_MACHINE_ADD_LOGIN_DIALOG, VIRTUAL_MACHINE_ADD_LOGIN_FORM, addUpdateVirtualMachineLogin, AddLoginFormData, VIRTUAL_MACHINE_ADD_LOGIN_USER_FIELD, VIRTUAL_MACHINE_ADD_LOGIN_GROUPS_FIELD } from 'store/virtual-machines/virtual-machines-actions'; @@ -31,26 +31,33 @@ export const VirtualMachineAddLoginDialog = compose( type CreateGroupDialogComponentProps = WithDialogProps<{updating: boolean}> & InjectedFormProps; -const AddLoginFormFields = () => - <> - +const AddLoginFormFields = (props) => { + return <> + ; +} + + +interface UserFieldProps { + excludedParticipants: string[]; +} -const UserField = () => - ; +const ParticipantField = Field as new () => GenericField; -const UserSelect = ({ input, meta }: WrappedFieldProps) => +const UserSelect = (props) => (input.onChange(''))} />; + items={props.input.value ? [props.input.value] : []} + excludedParticipants={props.excludedParticipants} + onSelect={props.input.onChange} + onDelete={() => (props.input.onChange(''))} />; -- 2.30.2