dispatch(dialogActions.OPEN_DIALOG({ id: USER_ATTRIBUTES_DIALOG, data }));
};
- (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
+export const openUserManage = (uuid: string) =>
+ (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
+ const { resources } = getState();
+ const data = getResource<UserResource>(uuid)(resources);
+ dispatch(dialogActions.OPEN_DIALOG({ id: USER_MANAGE_DIALOG, data }));
+ };
+
+export const openSetupShellAccount = (uuid: string) =>
- const data = getResource<UserResource>(uuid)(resources);
- dispatch(dialogActions.OPEN_DIALOG({ id: SETUP_SHELL_ACCOUNT_DIALOG, data }));
++ async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
+ const { resources } = getState();
++ const user = getResource<UserResource>(uuid)(resources);
++ const virtualMachines = await services.virtualMachineService.list();
++ dispatch(dialogActions.OPEN_DIALOG({ id: SETUP_SHELL_ACCOUNT_DIALOG, data: { user, ...virtualMachines } }));
+ };
+
export const openUserCreateDialog = () =>
async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
const userUuid = await services.authService.getUuid();
--- /dev/null
- label={data.email} />;
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+import * as React from 'react';
+import { compose } from "redux";
+import { reduxForm, InjectedFormProps, Field } from 'redux-form';
+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 { USER_LENGTH_VALIDATION } from '~/validators/validators';
+import { InputLabel } from '@material-ui/core';
+import { NativeSelectField } from '~/components/select-field/select-field';
+import { SETUP_SHELL_ACCOUNT_DIALOG, createUser } from '~/store/users/users-actions';
+
+interface SetupShellAccountFormDialogData {
+ email: string;
+ virtualMachineName: string;
+ groupVirtualMachine: string;
+}
+
+export const SetupShellAccountDialog = compose(
+ withDialog(SETUP_SHELL_ACCOUNT_DIALOG),
+ reduxForm<SetupShellAccountFormDialogData>({
+ form: SETUP_SHELL_ACCOUNT_DIALOG,
+ onSubmit: (data, dispatch) => {
+ dispatch(createUser(data));
+ }
+ })
+)(
+ (props: SetupShellAccountDialogComponentProps) =>
+ <FormDialog
+ dialogTitle='Setup shell account'
+ formFields={SetupShellAccountFormFields}
+ submitLabel='Submit'
+ {...props}
+ />
+);
+
+const UserEmailField = ({ data }: any) =>
+ <Field
+ name='email'
+ component={TextField}
+ disabled
++ label={data.user.email} />;
++
++const UserVirtualMachineField = ({ data }: any) =>
++ <div style={{ marginBottom: '21px' }}>
++ <InputLabel>Virtual Machine</InputLabel>
++ <Field
++ name='virtualMachine'
++ component={NativeSelectField}
++ validate={USER_LENGTH_VALIDATION}
++ items={getVirtualMachinesList(data.items)} />
++ </div>;
+
+const UserGroupsVirtualMachineField = () =>
+ <Field
+ name='groups'
+ component={TextField}
+ validate={USER_LENGTH_VALIDATION}
+ label="Groups for virtual machine (comma separated list)" />;
+
++const getVirtualMachinesList = (virtualMachines: VirtualMachinesResource[]) => {
++ const mappedVirtualMachines = virtualMachines.map(it => ({ key: it.hostname, value: it.hostname }));
++ return mappedVirtualMachines;
++};
++
+type SetupShellAccountDialogComponentProps = WithDialogProps<{}> & InjectedFormProps<SetupShellAccountFormDialogData>;
+
+const SetupShellAccountFormFields = (props: SetupShellAccountDialogComponentProps) =>
+ <>
+ <UserEmailField data={props.data}/>
++ <UserVirtualMachineField data={props.data} />
+ <UserGroupsVirtualMachineField />
+ </>;
+
+
+
import { UserAttributesDialog } from '~/views-components/user-dialog/attributes-dialog';
import { CreateUserDialog } from '~/views-components/dialog-forms/create-user-dialog';
import { HelpApiClientAuthorizationDialog } from '~/views-components/api-client-authorizations-dialog/help-dialog';
+import { UserManageDialog } from '~/views-components/user-dialog/manage-dialog';
+import { SetupShellAccountDialog } from '~/views-components/dialog-forms/setup-shell-account-dialog';
+ import { GroupsPanel } from '~/views/groups-panel/groups-panel';
+ import { CreateGroupDialog } from '~/views-components/dialog-forms/create-group-dialog';
+ import { RemoveGroupDialog } from '~/views-components/groups-dialog/remove-dialog';
+ import { GroupAttributesDialog } from '~/views-components/groups-dialog/attributes-dialog';
+ import { GroupDetailsPanel } from '~/views/group-details-panel/group-details-panel';
+ import { RemoveGroupMemberDialog } from '~/views-components/groups-dialog/member-remove-dialog';
+ import { GroupMemberAttributesDialog } from '~/views-components/groups-dialog/member-attributes-dialog';
+ import { AddGroupMembersDialog } from '~/views-components/dialog-forms/add-group-member-dialog';
type CssRules = 'root' | 'container' | 'splitter' | 'asidePanel' | 'contentWrapper' | 'content';