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";
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);
dispatch<any>(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 }));
return newUser;
} catch (e) {
return;
+ } finally {
+ dispatch(stopSubmit(USER_CREATE_FORM_NAME));
}
};
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<any>;
+export type DialogUserProps = WithDialogProps<{}> & InjectedFormProps<UserCreateFormDialogData>;
+
+interface DataProps {
+ user: UserResource;
+ items: VirtualMachinesResource[];
+}
export const UserRepositoryCreate = (props: DialogUserProps) =>
<FormDialog
const UserAddFields = (props: DialogUserProps) => <span>
<UserEmailField />
- <UserVirtualMachineField data={props.data}/>
+ <UserVirtualMachineField data={props.data as DataProps}/>
<UserGroupsVirtualMachineField />
</span>;
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),
/>
);
-interface VirtualMachinesProps {
- data: {
- items: VirtualMachinesResource[];
- };
-}
interface DataProps {
user: UserResource;
items: VirtualMachinesResource[];
<Field
name={`${VIRTUAL_MACHINE_ADD_LOGIN_USER_FIELD}.username`}
component={TextField as any}
- disabled /></span>;
-
-const UserVirtualMachineField = ({ data }: VirtualMachinesProps) =>
- <div style={{ marginBottom: '21px' }}>
- <InputLabel>Virtual Machine</InputLabel>
- <Field
- name={VIRTUAL_MACHINE_ADD_LOGIN_VM_FIELD}
- component={NativeSelectField as any}
- validate={CHOOSE_VM_VALIDATION}
- items={getVirtualMachinesList(data.items)} />
- </div>;
-
-const UserGroupsVirtualMachineField = () =>
- <GroupArrayInput
- name={VIRTUAL_MACHINE_ADD_LOGIN_GROUPS_FIELD}
- input={{id:"Add groups to VM login (eg: docker, sudo)", disabled:false}}
- required={false}
- />
-
-const getVirtualMachinesList = (virtualMachines: VirtualMachinesResource[]) =>
- [{ key: "", value: "" }].concat(virtualMachines.map(it => ({ key: it.uuid, value: it.hostname })));
+ disabled />
+ </span>;
type SetupShellAccountDialogComponentProps = WithDialogProps<{}> & InjectedFormProps<AddLoginFormData>;
const SetupShellAccountFormFields = (props: SetupShellAccountDialogComponentProps) =>
<>
<UserNameField />
- <UserVirtualMachineField data={props.data as DataProps} />
+ <RequiredUserVirtualMachineField data={props.data as DataProps} />
<UserGroupsVirtualMachineField />
</>;
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 = () =>
<Field
autoFocus={true}
label="Email" />;
-export const UserVirtualMachineField = ({ data }: any) =>
+export const RequiredUserVirtualMachineField = ({ data }: VirtualMachinesProps) =>
+ <div style={{ marginBottom: '21px' }}>
+ <InputLabel>Virtual Machine</InputLabel>
+ <Field
+ name={VIRTUAL_MACHINE_ADD_LOGIN_VM_FIELD}
+ component={NativeSelectField as any}
+ validate={CHOOSE_VM_VALIDATION}
+ items={getVirtualMachinesList(data.items)} />
+ </div>;
+
+export const UserVirtualMachineField = ({ data }: VirtualMachinesProps) =>
<div style={{ marginBottom: '21px' }}>
<InputLabel>Virtual Machine</InputLabel>
<Field
- name='virtualMachine'
+ name={VIRTUAL_MACHINE_ADD_LOGIN_VM_FIELD}
component={NativeSelectField as any}
- validate={USER_LENGTH_VALIDATION}
items={getVirtualMachinesList(data.items)} />
</div>;
export const UserGroupsVirtualMachineField = () =>
- <Field
- name='groups'
- component={TextField as any}
- validate={USER_LENGTH_VALIDATION}
- label="Groups for virtual machine (comma separated list)" />;
+ <GroupArrayInput
+ name={VIRTUAL_MACHINE_ADD_LOGIN_GROUPS_FIELD}
+ input={{id:"Add groups to VM login (eg: docker, sudo)", disabled:false}}
+ required={false}
+ />
-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 })));