From: Stephen Smith Date: Mon, 14 Mar 2022 21:20:25 +0000 (-0400) Subject: 18559: Update the new user dialog and fix groups functionality X-Git-Tag: 2.4.0~1^2~25 X-Git-Url: https://git.arvados.org/arvados-workbench2.git/commitdiff_plain/96a705a50db3d742fd897c12a236b8a44bbcaffb 18559: Update the new user dialog and fix groups functionality Arvados-DCO-1.1-Signed-off-by: Stephen Smith --- diff --git a/src/store/users/users-actions.ts b/src/store/users/users-actions.ts index fded1140..425a2d56 100644 --- a/src/store/users/users-actions.ts +++ b/src/store/users/users-actions.ts @@ -15,7 +15,7 @@ import { getResource } from 'store/resources/resources'; import { navigateTo, navigateToUsers, navigateToRootProject } from "store/navigation/navigation-action"; import { authActions } from 'store/auth/auth-action'; import { getTokenV2 } from "models/api-client-authorization"; -import { AddLoginFormData, VIRTUAL_MACHINE_ADD_LOGIN_GROUPS_FIELD, VIRTUAL_MACHINE_ADD_LOGIN_USER_FIELD } from "store/virtual-machines/virtual-machines-actions"; +import { AddLoginFormData, VIRTUAL_MACHINE_ADD_LOGIN_GROUPS_FIELD, VIRTUAL_MACHINE_ADD_LOGIN_USER_FIELD, VIRTUAL_MACHINE_ADD_LOGIN_VM_FIELD } from "store/virtual-machines/virtual-machines-actions"; import { PermissionLevel } from "models/permission"; import { updateResources } from "store/resources/resources-actions"; @@ -27,8 +27,8 @@ export const SETUP_SHELL_ACCOUNT_DIALOG = 'setupShellAccountDialog'; export interface UserCreateFormDialogData { email: string; - virtualMachineName: string; - groupVirtualMachine: string; + [VIRTUAL_MACHINE_ADD_LOGIN_VM_FIELD]: string; + [VIRTUAL_MACHINE_ADD_LOGIN_GROUPS_FIELD]: string[]; } export const userBindedActions = bindDataExplorerActions(USERS_PANEL_ID); @@ -83,11 +83,28 @@ export const openUserProjects = (uuid: string) => dispatch(navigateTo(uuid)); }; -export const createUser = (user: UserCreateFormDialogData) => +export const createUser = (data: UserCreateFormDialogData) => async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { dispatch(startSubmit(USER_CREATE_FORM_NAME)); try { - const newUser = await services.userService.create({ ...user }); + const newUser = await services.userService.create({ + email: data.email, + }); + dispatch(updateResources([newUser])); + + if (data[VIRTUAL_MACHINE_ADD_LOGIN_VM_FIELD]) { + const permission = await services.permissionService.create({ + headUuid: data[VIRTUAL_MACHINE_ADD_LOGIN_VM_FIELD], + tailUuid: newUser.uuid, + name: PermissionLevel.CAN_LOGIN, + properties: { + username: newUser.username, + groups: data.groups, + } + }); + dispatch(updateResources([permission])); + } + dispatch(dialogActions.CLOSE_DIALOG({ id: USER_CREATE_FORM_NAME })); dispatch(reset(USER_CREATE_FORM_NAME)); dispatch(snackbarActions.OPEN_SNACKBAR({ message: "User has been successfully created.", hideDuration: 2000, kind: SnackbarKind.SUCCESS })); @@ -96,6 +113,8 @@ export const createUser = (user: UserCreateFormDialogData) => return newUser; } catch (e) { return; + } finally { + dispatch(stopSubmit(USER_CREATE_FORM_NAME)); } }; diff --git a/src/views-components/dialog-create/dialog-user-create.tsx b/src/views-components/dialog-create/dialog-user-create.tsx index d8d25da4..6be7b28f 100644 --- a/src/views-components/dialog-create/dialog-user-create.tsx +++ b/src/views-components/dialog-create/dialog-user-create.tsx @@ -7,8 +7,16 @@ import { InjectedFormProps } from 'redux-form'; import { WithDialogProps } from 'store/dialog/with-dialog'; import { FormDialog } from 'components/form-dialog/form-dialog'; import { UserEmailField, UserVirtualMachineField, UserGroupsVirtualMachineField } from 'views-components/form-fields/user-form-fields'; +import { UserCreateFormDialogData } from 'store/users/users-actions'; +import { UserResource } from 'models/user'; +import { VirtualMachinesResource } from 'models/virtual-machines'; -export type DialogUserProps = WithDialogProps<{}> & InjectedFormProps; +export type DialogUserProps = WithDialogProps<{}> & InjectedFormProps; + +interface DataProps { + user: UserResource; + items: VirtualMachinesResource[]; +} export const UserRepositoryCreate = (props: DialogUserProps) => const UserAddFields = (props: DialogUserProps) => - + ; diff --git a/src/views-components/dialog-forms/setup-shell-account-dialog.tsx b/src/views-components/dialog-forms/setup-shell-account-dialog.tsx index 666ea38e..04eae126 100644 --- a/src/views-components/dialog-forms/setup-shell-account-dialog.tsx +++ b/src/views-components/dialog-forms/setup-shell-account-dialog.tsx @@ -8,13 +8,11 @@ import { withDialog, WithDialogProps } from "store/dialog/with-dialog"; import { FormDialog } from 'components/form-dialog/form-dialog'; import { TextField } from 'components/text-field/text-field'; import { VirtualMachinesResource } from 'models/virtual-machines'; -import { CHOOSE_VM_VALIDATION } from 'validators/validators'; import { InputLabel } from '@material-ui/core'; -import { NativeSelectField } from 'components/select-field/select-field'; import { SETUP_SHELL_ACCOUNT_DIALOG, setupUserVM } from 'store/users/users-actions'; import { UserResource } from 'models/user'; -import { VIRTUAL_MACHINE_ADD_LOGIN_USER_FIELD, VIRTUAL_MACHINE_ADD_LOGIN_VM_FIELD, VIRTUAL_MACHINE_ADD_LOGIN_GROUPS_FIELD, AddLoginFormData } from 'store/virtual-machines/virtual-machines-actions'; -import { GroupArrayInput } from 'views-components/virtual-machines-dialog/group-array-input'; +import { VIRTUAL_MACHINE_ADD_LOGIN_USER_FIELD, AddLoginFormData } from 'store/virtual-machines/virtual-machines-actions'; +import { UserGroupsVirtualMachineField, RequiredUserVirtualMachineField } from 'views-components/form-fields/user-form-fields'; export const SetupShellAccountDialog = compose( withDialog(SETUP_SHELL_ACCOUNT_DIALOG), @@ -34,11 +32,6 @@ export const SetupShellAccountDialog = compose( /> ); -interface VirtualMachinesProps { - data: { - items: VirtualMachinesResource[]; - }; -} interface DataProps { user: UserResource; items: VirtualMachinesResource[]; @@ -50,33 +43,14 @@ const UserNameField = () => ; - -const UserVirtualMachineField = ({ data }: VirtualMachinesProps) => -
- Virtual Machine - -
; - -const UserGroupsVirtualMachineField = () => - - -const getVirtualMachinesList = (virtualMachines: VirtualMachinesResource[]) => - [{ key: "", value: "" }].concat(virtualMachines.map(it => ({ key: it.uuid, value: it.hostname }))); + disabled /> + ; type SetupShellAccountDialogComponentProps = WithDialogProps<{}> & InjectedFormProps; const SetupShellAccountFormFields = (props: SetupShellAccountDialogComponentProps) => <> - + ; diff --git a/src/views-components/form-fields/user-form-fields.tsx b/src/views-components/form-fields/user-form-fields.tsx index 393f29d3..12fc91e2 100644 --- a/src/views-components/form-fields/user-form-fields.tsx +++ b/src/views-components/form-fields/user-form-fields.tsx @@ -5,10 +5,18 @@ import React from "react"; import { Field } from "redux-form"; import { TextField } from "components/text-field/text-field"; -import { USER_EMAIL_VALIDATION, USER_LENGTH_VALIDATION } from "validators/validators"; +import { USER_EMAIL_VALIDATION, CHOOSE_VM_VALIDATION } from "validators/validators"; import { NativeSelectField } from "components/select-field/select-field"; import { InputLabel } from "@material-ui/core"; import { VirtualMachinesResource } from "models/virtual-machines"; +import { VIRTUAL_MACHINE_ADD_LOGIN_GROUPS_FIELD, VIRTUAL_MACHINE_ADD_LOGIN_VM_FIELD } from "store/virtual-machines/virtual-machines-actions"; +import { GroupArrayInput } from "views-components/virtual-machines-dialog/group-array-input"; + +interface VirtualMachinesProps { + data: { + items: VirtualMachinesResource[]; + }; +} export const UserEmailField = () => autoFocus={true} label="Email" />; -export const UserVirtualMachineField = ({ data }: any) => +export const RequiredUserVirtualMachineField = ({ data }: VirtualMachinesProps) => +
+ Virtual Machine + +
; + +export const UserVirtualMachineField = ({ data }: VirtualMachinesProps) =>
Virtual Machine
; export const UserGroupsVirtualMachineField = () => - ; + -const getVirtualMachinesList = (virtualMachines: VirtualMachinesResource[]) => { - const mappedVirtualMachines = virtualMachines.map(it => ({ key: it.hostname, value: it.hostname })); - return mappedVirtualMachines; -}; +const getVirtualMachinesList = (virtualMachines: VirtualMachinesResource[]) => + [{ key: "", value: "" }].concat(virtualMachines.map(it => ({ key: it.uuid, value: it.hostname })));