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) => {
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) =>
interface ParticipantSelectProps {
items: Participant[];
+ excludedParticipants?: string[];
label?: string;
autofocus?: boolean;
onlyPeople?: boolean;
const filterUsers = new FilterBuilder()
.addILike('any', value)
+ .addNotIn('uuid', this.props.excludedParticipants)
.getFilters();
const userItems: ListResults<any> = 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();
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';
type CreateGroupDialogComponentProps = WithDialogProps<{updating: boolean}> & InjectedFormProps<AddLoginFormData>;
-const AddLoginFormFields = () =>
- <>
- <UserField />
+const AddLoginFormFields = (props) => {
+ return <>
+ <ParticipantField
+ name={VIRTUAL_MACHINE_ADD_LOGIN_USER_FIELD}
+ component={UserSelect}
+ excludedParticipants={props.data.excludedParticipants}
+ />
<GroupArrayInput
name={VIRTUAL_MACHINE_ADD_LOGIN_GROUPS_FIELD}
input={{id:"Add groups to VM login (eg: docker, sudo)", disabled:false}}
required={false}
/>
</>;
+}
+
+
+interface UserFieldProps {
+ excludedParticipants: string[];
+}
-const UserField = () =>
- <Field
- name={VIRTUAL_MACHINE_ADD_LOGIN_USER_FIELD}
- component={UserSelect}
- />;
+const ParticipantField = Field as new () => GenericField<UserFieldProps>;
-const UserSelect = ({ input, meta }: WrappedFieldProps) =>
+const UserSelect = (props) =>
<ParticipantSelect
onlyPeople
label='Search for user to grant login permission'
- items={input.value ? [input.value] : []}
- onSelect={input.onChange}
- onDelete={() => (input.onChange(''))} />;
+ items={props.input.value ? [props.input.value] : []}
+ excludedParticipants={props.excludedParticipants}
+ onSelect={props.input.onChange}
+ onDelete={() => (props.input.onChange(''))} />;