[ARVADOS-WORKBENCH2] created: 2.4.0-48-g38e6956f
Git user
git at public.arvados.org
Thu May 12 20:14:16 UTC 2022
at 38e6956f75e723cf5c442188c0e570e282d04395 (commit)
commit 38e6956f75e723cf5c442188c0e570e282d04395
Author: Stephen Smith <stephen at curii.com>
Date: Thu May 12 16:13:37 2022 -0400
19049: Clean up 404 error handling on add vm login
Arvados-DCO-1.1-Signed-off-by: Stephen Smith <stephen at curii.com>
diff --git a/src/store/virtual-machines/virtual-machines-actions.ts b/src/store/virtual-machines/virtual-machines-actions.ts
index a7abf096..e4b17ea0 100644
--- a/src/store/virtual-machines/virtual-machines-actions.ts
+++ b/src/store/virtual-machines/virtual-machines-actions.ts
@@ -18,7 +18,7 @@ import { PermissionLevel } from "models/permission";
import { deleteResources, updateResources } from 'store/resources/resources-actions';
import { Participant } from "views-components/sharing-dialog/participant-select";
import { initialize, reset } from "redux-form";
-import { getUserDisplayName } from "models/user";
+import { getUserDisplayName, UserResource } from "models/user";
export const virtualMachinesActions = unionize({
SET_REQUESTED_DATE: ofType<string>(),
@@ -156,10 +156,15 @@ export interface AddLoginFormData {
export const addUpdateVirtualMachineLogin = ({uuid, vmUuid, user, groups}: AddLoginFormData) =>
async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
+ let userResource: UserResource | undefined = undefined;
try {
// Get user
- const userResource = await services.userService.get(user.uuid);
-
+ userResource = await services.userService.get(user.uuid, false);
+ } catch (e) {
+ dispatch(snackbarActions.OPEN_SNACKBAR({ message: "Failed to get user details.", hideDuration: 2000, kind: SnackbarKind.ERROR }));
+ return;
+ }
+ try {
if (uuid) {
const permission = await services.permissionService.update(uuid, {
tailUuid: userResource.uuid,
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 51773418..93fe8485 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, GenericField } from 'redux-form';
+import { reduxForm, InjectedFormProps, 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';
commit 8da1b3425ad850194d473df1436ac61b6312d452
Author: Stephen Smith <stephen at curii.com>
Date: Thu May 12 13:35:52 2022 -0400
19049: Make participant select read only when editing vm logins
Arvados-DCO-1.1-Signed-off-by: Stephen Smith <stephen at curii.com>
diff --git a/src/components/autocomplete/autocomplete.tsx b/src/components/autocomplete/autocomplete.tsx
index cc184336..0044807b 100644
--- a/src/components/autocomplete/autocomplete.tsx
+++ b/src/components/autocomplete/autocomplete.tsx
@@ -175,7 +175,7 @@ export class Autocomplete<Value, Suggestion> extends React.Component<Autocomplet
<Chip
label={this.renderChipValue(item)}
key={index}
- onDelete={() => onDelete ? onDelete(item, index) : undefined} />
+ onDelete={onDelete && !this.props.disabled ? (() => onDelete(item, index)) : undefined} />
);
}
diff --git a/src/views-components/sharing-dialog/participant-select.tsx b/src/views-components/sharing-dialog/participant-select.tsx
index a5d39479..eb7e8d10 100644
--- a/src/views-components/sharing-dialog/participant-select.tsx
+++ b/src/views-components/sharing-dialog/participant-select.tsx
@@ -28,6 +28,7 @@ interface ParticipantSelectProps {
label?: string;
autofocus?: boolean;
onlyPeople?: boolean;
+ disabled?: boolean;
onBlur?: (event: React.FocusEvent<HTMLInputElement>) => void;
onFocus?: (event: React.FocusEvent<HTMLInputElement>) => void;
@@ -72,11 +73,12 @@ export const ParticipantSelect = connect()(
onChange={this.handleChange}
onCreate={this.handleCreate}
onSelect={this.handleSelect}
- onDelete={this.handleDelete}
+ onDelete={this.props.onDelete && !this.props.disabled ? this.handleDelete : undefined}
onFocus={this.props.onFocus}
onBlur={this.props.onBlur}
renderChipValue={this.renderChipValue}
- renderSuggestion={this.renderSuggestion} />
+ renderSuggestion={this.renderSuggestion}
+ disabled={this.props.disabled}/>
);
}
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 d9547d7c..51773418 100644
--- a/src/views-components/virtual-machines-dialog/add-login-dialog.tsx
+++ b/src/views-components/virtual-machines-dialog/add-login-dialog.tsx
@@ -35,7 +35,7 @@ const AddLoginFormFields = (props) => {
return <>
<ParticipantField
name={VIRTUAL_MACHINE_ADD_LOGIN_USER_FIELD}
- component={UserSelect}
+ component={props.data.updating ? ReadOnlyUserSelect : UserSelect}
excludedParticipants={props.data.excludedParticipants}
/>
<GroupArrayInput
@@ -46,7 +46,6 @@ const AddLoginFormFields = (props) => {
</>;
}
-
interface UserFieldProps {
excludedParticipants: string[];
}
@@ -61,3 +60,10 @@ const UserSelect = (props) =>
excludedParticipants={props.excludedParticipants}
onSelect={props.input.onChange}
onDelete={() => (props.input.onChange(''))} />;
+
+const ReadOnlyUserSelect = (props) =>
+ <ParticipantSelect
+ onlyPeople
+ label='User'
+ items={props.input.value ? [props.input.value] : []}
+ disabled={true} />;
commit 93926d5be6b62da8d8bedea1c9c3a63fd4e71b31
Author: Stephen Smith <stephen at curii.com>
Date: Tue May 10 12:49:53 2022 -0400
19049: Exclude existing users with logins in create login user picker
Arvados-DCO-1.1-Signed-off-by: Stephen Smith <stephen at curii.com>
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<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();
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<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(''))} />;
commit 5248f137a53e981e6c6207c212688fbd08e2cdc9
Author: Stephen Smith <stephen at curii.com>
Date: Mon May 9 23:39:57 2022 -0400
19049: Clean up participant select display, show UUIDs
Arvados-DCO-1.1-Signed-off-by: Stephen Smith <stephen at curii.com>
diff --git a/src/models/user.ts b/src/models/user.ts
index 2857bce6..9b3d97d8 100644
--- a/src/models/user.ts
+++ b/src/models/user.ts
@@ -32,12 +32,16 @@ export const getUserFullname = (user: User) => {
: "";
};
-export const getUserDisplayName = (user: User, withEmail = false) => {
+export const getUserDisplayName = (user: User, withEmail = false, withUuid = false) => {
const displayName = getUserFullname(user) || user.email || user.username || user.uuid;
+ let parts: string[] = [displayName];
if (withEmail && user.email && displayName !== user.email) {
- return `${displayName} <<${user.email}>>`;
+ parts.push(`<${user.email}>`);
}
- return displayName;
+ if (withUuid) {
+ parts.push(`(${user.uuid})`);
+ }
+ return parts.join(' ');
};
export interface UserResource extends Resource, User {
diff --git a/src/store/virtual-machines/virtual-machines-actions.ts b/src/store/virtual-machines/virtual-machines-actions.ts
index 7034b4a5..35cf8d53 100644
--- a/src/store/virtual-machines/virtual-machines-actions.ts
+++ b/src/store/virtual-machines/virtual-machines-actions.ts
@@ -125,7 +125,7 @@ export const openEditVirtualMachineLoginDialog = (permissionUuid: string) =>
const user = await services.userService.get(login.tailUuid);
dispatch(initialize(VIRTUAL_MACHINE_ADD_LOGIN_FORM, {
[VIRTUAL_MACHINE_UPDATE_LOGIN_UUID_FIELD]: permissionUuid,
- [VIRTUAL_MACHINE_ADD_LOGIN_USER_FIELD]: {name: getUserDisplayName(user, true), uuid: login.tailUuid},
+ [VIRTUAL_MACHINE_ADD_LOGIN_USER_FIELD]: {name: getUserDisplayName(user, true, true), uuid: login.tailUuid},
[VIRTUAL_MACHINE_ADD_LOGIN_GROUPS_FIELD]: login.properties.groups,
}));
dispatch(dialogActions.OPEN_DIALOG( {id: VIRTUAL_MACHINE_ADD_LOGIN_DIALOG, data: {updating: true}} ));
diff --git a/src/views-components/sharing-dialog/participant-select.tsx b/src/views-components/sharing-dialog/participant-select.tsx
index 402faa7f..c7b540cd 100644
--- a/src/views-components/sharing-dialog/participant-select.tsx
+++ b/src/views-components/sharing-dialog/participant-select.tsx
@@ -43,9 +43,9 @@ interface ParticipantSelectState {
const getDisplayName = (item: GroupResource | UserResource) => {
switch (item.kind) {
case ResourceKind.USER:
- return getUserDisplayName(item, true);
+ return getUserDisplayName(item, true, true);
case ResourceKind.GROUP:
- return item.name;
+ return item.name + `(${`(${(item as Resource).uuid})`})`;
default:
return (item as Resource).uuid;
}
-----------------------------------------------------------------------
hooks/post-receive
--
More information about the arvados-commits
mailing list