[ARVADOS-WORKBENCH2] updated: 2.3.0-52-ge6323956

Git user git at public.arvados.org
Mon Dec 13 00:19:40 UTC 2021


Summary of changes:
 cypress/integration/group-manage.spec.js           | 10 ++---
 src/components/icon/icon.tsx                       |  8 +++-
 .../group-details-panel-actions.ts                 | 49 +++-------------------
 src/store/sharing-dialog/sharing-dialog-actions.ts | 37 +++++++++++-----
 .../dialog-forms/add-group-member-dialog.tsx       | 49 ----------------------
 .../side-panel-tree/side-panel-tree.tsx            |  4 +-
 .../group-details-panel/group-details-panel.tsx    | 16 -------
 src/views/workbench/workbench.tsx                  |  2 -
 8 files changed, 47 insertions(+), 128 deletions(-)
 delete mode 100644 src/views-components/dialog-forms/add-group-member-dialog.tsx

       via  e63239560b1393a8b306a4353719d4fe85698f04 (commit)
       via  7a84b16aa6cd37e14f5698cd51ea76b5d1805388 (commit)
       via  30e26a1c60eded910ed95c3c3f747b5cdb8774d2 (commit)
      from  5ea93d2e3c077f9cad78f8176a903ced7ceea62e (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.


commit e63239560b1393a8b306a4353719d4fe85698f04
Author: Stephen Smith <stephen at curii.com>
Date:   Sun Dec 12 19:19:18 2021 -0500

    18123: Use sharing dialog to add users to groups
    
    Arvados-DCO-1.1-Signed-off-by: Stephen Smith <stephen at curii.com>

diff --git a/cypress/integration/group-manage.spec.js b/cypress/integration/group-manage.spec.js
index d17cefe9..e638c648 100644
--- a/cypress/integration/group-manage.spec.js
+++ b/cypress/integration/group-manage.spec.js
@@ -58,13 +58,13 @@ describe('Group manage tests', function() {
     it('adds users to the group', function() {
         // Add other user to the group
         cy.get('[data-cy=group-member-add]').click();
-        cy.get('[data-cy=form-dialog]')
-            .should('contain', 'Add users')
+        cy.get('.sharing-dialog')
+            .should('contain', 'Sharing settings')
             .within(() => {
-                cy.get('input').type("other");
+                cy.get('[data-cy=invite-people-field] input').type("other");
             });
-        cy.contains('Other User').click();
-        cy.get('[data-cy=form-dialog] button[type=submit]').click();
+        cy.get('[role=tooltip]').click();
+        cy.get('.sharing-dialog').contains('Save').click();
 
         // Check that both users are present with appropriate permissions
         cy.get('[data-cy=group-members-data-explorer]')
diff --git a/src/store/group-details-panel/group-details-panel-actions.ts b/src/store/group-details-panel/group-details-panel-actions.ts
index 916d68a7..8130869f 100644
--- a/src/store/group-details-panel/group-details-panel-actions.ts
+++ b/src/store/group-details-panel/group-details-panel-actions.ts
@@ -6,24 +6,19 @@ import { bindDataExplorerActions } from 'store/data-explorer/data-explorer-actio
 import { Dispatch } from 'redux';
 import { propertiesActions } from 'store/properties/properties-actions';
 import { getProperty } from 'store/properties/properties';
-import { Participant } from 'views-components/sharing-dialog/participant-select';
 import { dialogActions } from 'store/dialog/dialog-actions';
-import { reset, startSubmit } from 'redux-form';
-import { addGroupMember, deleteGroupMember } from 'store/groups-panel/groups-panel-actions';
+import { deleteGroupMember } from 'store/groups-panel/groups-panel-actions';
 import { getResource } from 'store/resources/resources';
-import { GroupResource } from 'models/group';
 import { RootState } from 'store/store';
 import { ServiceRepository } from 'services/services';
 import { PermissionResource, PermissionLevel } from 'models/permission';
 import { snackbarActions, SnackbarKind } from 'store/snackbar/snackbar-actions';
 import { LinkResource } from 'models/link';
 import { deleteResources } from 'store/resources/resources-actions';
+import { openSharingDialog } from 'store/sharing-dialog/sharing-dialog-actions';
 
 export const GROUP_DETAILS_MEMBERS_PANEL_ID = 'groupDetailsMembersPanel';
 export const GROUP_DETAILS_PERMISSIONS_PANEL_ID = 'groupDetailsPermissionsPanel';
-export const ADD_GROUP_MEMBERS_DIALOG = 'addGroupMembers';
-export const ADD_GROUP_MEMBERS_FORM = 'addGroupMembers';
-export const ADD_GROUP_MEMBERS_USERS_FIELD_NAME = 'users';
 export const MEMBER_ATTRIBUTES_DIALOG = 'memberAttributesDialog';
 export const MEMBER_REMOVE_DIALOG = 'memberRemoveDialog';
 
@@ -40,45 +35,13 @@ export const loadGroupDetailsPanel = (groupUuid: string) =>
 
 export const getCurrentGroupDetailsPanelUuid = getProperty<string>(GROUP_DETAILS_MEMBERS_PANEL_ID);
 
-export interface AddGroupMembersFormData {
-    [ADD_GROUP_MEMBERS_USERS_FIELD_NAME]: Participant[];
-}
-
 export const openAddGroupMembersDialog = () =>
-    (dispatch: Dispatch) => {
-        dispatch(dialogActions.OPEN_DIALOG({ id: ADD_GROUP_MEMBERS_DIALOG, data: {} }));
-        dispatch(reset(ADD_GROUP_MEMBERS_FORM));
-    };
-
-export const addGroupMembers = ({ users }: AddGroupMembersFormData) =>
-
-    async (dispatch: Dispatch, getState: () => RootState, { permissionService }: ServiceRepository) => {
-
+    (dispatch: Dispatch, getState: () => RootState) => {
         const groupUuid = getCurrentGroupDetailsPanelUuid(getState().properties);
-
         if (groupUuid) {
-
-            dispatch(startSubmit(ADD_GROUP_MEMBERS_FORM));
-
-            const group = getResource<GroupResource>(groupUuid)(getState().resources);
-
-            for (const user of users) {
-
-                await addGroupMember({
-                    user,
-                    group: {
-                        uuid: groupUuid,
-                        name: group ? group.name : groupUuid,
-                    },
-                    dispatch,
-                    permissionService,
-                });
-
-            }
-
-            dispatch(dialogActions.CLOSE_DIALOG({ id: ADD_GROUP_MEMBERS_FORM }));
-            dispatch(GroupMembersPanelActions.REQUEST_ITEMS());
-
+            dispatch<any>(openSharingDialog(groupUuid, () => {
+                dispatch(GroupMembersPanelActions.REQUEST_ITEMS());
+            }));
         }
     };
 
diff --git a/src/store/sharing-dialog/sharing-dialog-actions.ts b/src/store/sharing-dialog/sharing-dialog-actions.ts
index 54ad6791..4c0b8825 100644
--- a/src/store/sharing-dialog/sharing-dialog-actions.ts
+++ b/src/store/sharing-dialog/sharing-dialog-actions.ts
@@ -21,9 +21,9 @@ import { progressIndicatorActions } from 'store/progress-indicator/progress-indi
 import { snackbarActions, SnackbarKind } from "../snackbar/snackbar-actions";
 import { extractUuidKind, ResourceKind } from "models/resource";
 
-export const openSharingDialog = (resourceUuid: string) =>
+export const openSharingDialog = (resourceUuid: string, refresh?: () => void) =>
     (dispatch: Dispatch) => {
-        dispatch(dialogActions.OPEN_DIALOG({ id: SHARING_DIALOG_NAME, data: resourceUuid }));
+        dispatch(dialogActions.OPEN_DIALOG({ id: SHARING_DIALOG_NAME, data: {resourceUuid, refresh} }));
         dispatch<any>(loadSharingDialog);
     };
 
@@ -34,16 +34,21 @@ export const connectSharingDialog = withDialog(SHARING_DIALOG_NAME);
 export const connectSharingDialogProgress = withProgress(SHARING_DIALOG_NAME);
 
 
-export const saveSharingDialogChanges = async (dispatch: Dispatch) => {
+export const saveSharingDialogChanges = async (dispatch: Dispatch, getState: () => RootState) => {
     dispatch(progressIndicatorActions.START_WORKING(SHARING_DIALOG_NAME));
     await dispatch<any>(savePublicPermissionChanges);
     await dispatch<any>(saveManagementChanges);
     await dispatch<any>(sendInvitations);
     dispatch(reset(SHARING_INVITATION_FORM_NAME));
     await dispatch<any>(loadSharingDialog);
+
+    const dialog = getDialog<SharingDialogData>(getState().dialog, SHARING_DIALOG_NAME);
+    if (dialog && dialog.data.refresh) {
+        dialog.data.refresh();
+    }
 };
 
-export const sendSharingInvitations = async (dispatch: Dispatch) => {
+export const sendSharingInvitations = async (dispatch: Dispatch, getState: () => RootState) => {
     dispatch(progressIndicatorActions.START_WORKING(SHARING_DIALOG_NAME));
     await dispatch<any>(sendInvitations);
     dispatch(closeSharingDialog());
@@ -52,15 +57,25 @@ export const sendSharingInvitations = async (dispatch: Dispatch) => {
         kind: SnackbarKind.SUCCESS,
     }));
     dispatch(progressIndicatorActions.STOP_WORKING(SHARING_DIALOG_NAME));
+    
+    const dialog = getDialog<SharingDialogData>(getState().dialog, SHARING_DIALOG_NAME);
+    if (dialog && dialog.data.refresh) {
+        dialog.data.refresh();
+    }
 };
 
+interface SharingDialogData {
+    resourceUuid: string;
+    refresh: () => void;
+}
+
 const loadSharingDialog = async (dispatch: Dispatch, getState: () => RootState, { permissionService }: ServiceRepository) => {
 
-    const dialog = getDialog<string>(getState().dialog, SHARING_DIALOG_NAME);
+    const dialog = getDialog<SharingDialogData>(getState().dialog, SHARING_DIALOG_NAME);
     if (dialog) {
         dispatch(progressIndicatorActions.START_WORKING(SHARING_DIALOG_NAME));
         try {
-            const { items } = await permissionService.listResourcePermissions(dialog.data);
+            const { items } = await permissionService.listResourcePermissions(dialog.data.resourceUuid);
             dispatch<any>(initializePublicAccessForm(items));
             await dispatch<any>(initializeManagementForm(items));
             dispatch(progressIndicatorActions.STOP_WORKING(SHARING_DIALOG_NAME));
@@ -133,7 +148,7 @@ const initializePublicAccessForm = (permissionLinks: PermissionResource[]) =>
 const savePublicPermissionChanges = async (_: Dispatch, getState: () => RootState, { permissionService }: ServiceRepository) => {
     const state = getState();
     const { user } = state.auth;
-    const dialog = getDialog<string>(state.dialog, SHARING_DIALOG_NAME);
+    const dialog = getDialog<SharingDialogData>(state.dialog, SHARING_DIALOG_NAME);
     if (dialog && user) {
         const { permissionUuid, visibility } = getSharingPublicAccessFormData(state);
 
@@ -150,7 +165,7 @@ const savePublicPermissionChanges = async (_: Dispatch, getState: () => RootStat
 
             await permissionService.create({
                 ownerUuid: user.uuid,
-                headUuid: dialog.data,
+                headUuid: dialog.data.resourceUuid,
                 tailUuid: getPublicGroupUuid(state),
                 name: PermissionLevel.CAN_READ,
             });
@@ -197,7 +212,7 @@ const saveManagementChanges = async (_: Dispatch, getState: () => RootState, { p
 const sendInvitations = async (_: Dispatch, getState: () => RootState, { permissionService, userService }: ServiceRepository) => {
     const state = getState();
     const { user } = state.auth;
-    const dialog = getDialog<string>(state.dialog, SHARING_DIALOG_NAME);
+    const dialog = getDialog<SharingDialogData>(state.dialog, SHARING_DIALOG_NAME);
     if (dialog && user) {
         const invitations = getFormValues(SHARING_INVITATION_FORM_NAME)(state) as SharingInvitationFormData;
 
@@ -207,7 +222,7 @@ const sendInvitations = async (_: Dispatch, getState: () => RootState, { permiss
         const invitationDataUsers = getUsersFromForm
             .map(person => ({
                 ownerUuid: user.uuid,
-                headUuid: dialog.data,
+                headUuid: dialog.data.resourceUuid,
                 tailUuid: person.uuid,
                 name: invitations.permissions
             }));
@@ -215,7 +230,7 @@ const sendInvitations = async (_: Dispatch, getState: () => RootState, { permiss
         const invitationsDataGroups = getGroupsFromForm.map(
             group => ({
                 ownerUuid: user.uuid,
-                headUuid: dialog.data,
+                headUuid: dialog.data.resourceUuid,
                 tailUuid: group.uuid,
                 name: invitations.permissions
             })
diff --git a/src/views-components/dialog-forms/add-group-member-dialog.tsx b/src/views-components/dialog-forms/add-group-member-dialog.tsx
deleted file mode 100644
index 443191fe..00000000
--- a/src/views-components/dialog-forms/add-group-member-dialog.tsx
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright (C) The Arvados Authors. All rights reserved.
-//
-// SPDX-License-Identifier: AGPL-3.0
-
-import React from 'react';
-import { compose } from "redux";
-import { reduxForm, InjectedFormProps, WrappedFieldArrayProps, FieldArray } from 'redux-form';
-import { withDialog, WithDialogProps } from "store/dialog/with-dialog";
-import { FormDialog } from 'components/form-dialog/form-dialog';
-import { ParticipantSelect, Participant } from 'views-components/sharing-dialog/participant-select';
-import { ADD_GROUP_MEMBERS_DIALOG, ADD_GROUP_MEMBERS_FORM, AddGroupMembersFormData, ADD_GROUP_MEMBERS_USERS_FIELD_NAME, addGroupMembers } from 'store/group-details-panel/group-details-panel-actions';
-import { minLength } from 'validators/min-length';
-
-export const AddGroupMembersDialog = compose(
-    withDialog(ADD_GROUP_MEMBERS_DIALOG),
-    reduxForm<AddGroupMembersFormData>({
-        form: ADD_GROUP_MEMBERS_FORM,
-        onSubmit: (data, dispatch) => {
-            dispatch(addGroupMembers(data));
-        },
-    })
-)(
-    (props: AddGroupMembersDialogProps) =>
-        <FormDialog
-            dialogTitle='Add users'
-            formFields={UsersField}
-            submitLabel='Add'
-            {...props}
-        />
-);
-
-type AddGroupMembersDialogProps = WithDialogProps<{}> & InjectedFormProps<AddGroupMembersFormData>;
-
-const UsersField = () =>
-    <FieldArray
-        name={ADD_GROUP_MEMBERS_USERS_FIELD_NAME}
-        component={UsersSelect as any}
-        validate={UsersFieldValidation} />;
-
-const UsersFieldValidation = [minLength(1, () => 'Select at least one user')];
-
-const UsersSelect = ({ fields }: WrappedFieldArrayProps<Participant>) =>
-    <ParticipantSelect
-        onlyPeople
-        autofocus
-        label='Enter email adresses '
-        items={fields.getAll() || []}
-        onSelect={fields.push}
-        onDelete={fields.remove} />;
diff --git a/src/views/workbench/workbench.tsx b/src/views/workbench/workbench.tsx
index 9ce93bf2..c756a7d6 100644
--- a/src/views/workbench/workbench.tsx
+++ b/src/views/workbench/workbench.tsx
@@ -88,7 +88,6 @@ import { GroupAttributesDialog } from 'views-components/groups-dialog/attributes
 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';
 import { PartialCopyToCollectionDialog } from 'views-components/dialog-forms/partial-copy-to-collection-dialog';
 import { PublicFavoritePanel } from 'views/public-favorites-panel/public-favorites-panel';
 import { LinkAccountPanel } from 'views/link-account-panel/link-account-panel';
@@ -212,7 +211,6 @@ export const WorkbenchPanel =
             <Grid item>
                 <DetailsPanel />
             </Grid>
-            <AddGroupMembersDialog />
             <AdvancedTabDialog />
             <AttributesApiClientAuthorizationDialog />
             <AttributesKeepServiceDialog />

commit 7a84b16aa6cd37e14f5698cd51ea76b5d1805388
Author: Stephen Smith <stephen at curii.com>
Date:   Sun Dec 12 17:20:11 2021 -0500

    18123: Use fa-users icon for groups
    
    Arvados-DCO-1.1-Signed-off-by: Stephen Smith <stephen at curii.com>

diff --git a/src/components/icon/icon.tsx b/src/components/icon/icon.tsx
index f4a1b1f3..4543d8d9 100644
--- a/src/components/icon/icon.tsx
+++ b/src/components/icon/icon.tsx
@@ -66,10 +66,11 @@ import Computer from '@material-ui/icons/Computer';
 
 // Import FontAwesome icons
 import { library } from '@fortawesome/fontawesome-svg-core';
-import { faPencilAlt, faSlash } from '@fortawesome/free-solid-svg-icons';
+import { faPencilAlt, faSlash, faUsers } from '@fortawesome/free-solid-svg-icons';
 library.add(
     faPencilAlt,
     faSlash,
+    faUsers,
 );
 
 export const ReadOnlyIcon = (props: any) =>
@@ -81,6 +82,11 @@ export const ReadOnlyIcon = (props: any) =>
         </div>
     </span>;
 
+export const GroupsIcon = (props: any) =>
+    <span {...props}>
+        <span className="fas fa-users" />
+    </span>;
+
 export const CollectionOldVersionIcon = (props: any) =>
     <Tooltip title='Old version'>
         <Badge badgeContent={<History fontSize='small' />}>
diff --git a/src/views-components/side-panel-tree/side-panel-tree.tsx b/src/views-components/side-panel-tree/side-panel-tree.tsx
index 95efee8c..e8294834 100644
--- a/src/views-components/side-panel-tree/side-panel-tree.tsx
+++ b/src/views-components/side-panel-tree/side-panel-tree.tsx
@@ -9,7 +9,7 @@ import { TreePicker, TreePickerProps } from "../tree-picker/tree-picker";
 import { TreeItem } from "components/tree/tree";
 import { ProjectResource } from "models/project";
 import { ListItemTextIcon } from "components/list-item-text-icon/list-item-text-icon";
-import { ProcessIcon, ProjectIcon, FilterGroupIcon, FavoriteIcon, ProjectsIcon, ShareMeIcon, TrashIcon, PublicFavoriteIcon } from 'components/icon/icon';
+import { ProcessIcon, ProjectIcon, FilterGroupIcon, FavoriteIcon, ProjectsIcon, ShareMeIcon, TrashIcon, PublicFavoriteIcon, GroupsIcon } from 'components/icon/icon';
 import { WorkflowIcon } from 'components/icon/icon';
 import { activateSidePanelTreeItem, toggleSidePanelTreeItemCollapse, SIDE_PANEL_TREE, SidePanelTreeCategory } from 'store/side-panel-tree/side-panel-tree-actions';
 import { openSidePanelContextMenu } from 'store/context-menu/context-menu-actions';
@@ -82,6 +82,8 @@ const getSidePanelIcon = (category: string) => {
             return PublicFavoriteIcon;
         case SidePanelTreeCategory.ALL_PROCESSES:
             return ProcessIcon;
+        case SidePanelTreeCategory.GROUPS:
+            return GroupsIcon;
         default:
             return ProjectIcon;
     }

commit 30e26a1c60eded910ed95c3c3f747b5cdb8774d2
Author: Stephen Smith <stephen at curii.com>
Date:   Tue Dec 7 10:36:37 2021 -0500

    18123: Free up space in group member list by removing email/uuid
    
    Arvados-DCO-1.1-Signed-off-by: Stephen Smith <stephen at curii.com>

diff --git a/src/views/group-details-panel/group-details-panel.tsx b/src/views/group-details-panel/group-details-panel.tsx
index ae64b628..51107b6b 100644
--- a/src/views/group-details-panel/group-details-panel.tsx
+++ b/src/views/group-details-panel/group-details-panel.tsx
@@ -22,11 +22,9 @@ import { GroupResource, isBuiltinGroup } from 'models/group';
 export enum GroupDetailsPanelMembersColumnNames {
     FULL_NAME = "Name",
     USERNAME = "Username",
-    EMAIL = "Email",
     ACTIVE = "User Active",
     HIDDEN = "Member Hidden",
     PERMISSION = "Permission",
-    UUID = "UUID",
     REMOVE = "Remove",
 }
 
@@ -52,13 +50,6 @@ export const groupDetailsMembersPanelColumns: DataColumns<string> = [
         filters: createTree(),
         render: uuid => <ResourceLinkTailUsername uuid={uuid} />
     },
-    {
-        name: GroupDetailsPanelMembersColumnNames.EMAIL,
-        selected: true,
-        configurable: true,
-        filters: createTree(),
-        render: uuid => <ResourceLinkTailEmail uuid={uuid} />
-    },
     {
         name: GroupDetailsPanelMembersColumnNames.ACTIVE,
         selected: true,
@@ -80,13 +71,6 @@ export const groupDetailsMembersPanelColumns: DataColumns<string> = [
         filters: createTree(),
         render: uuid => <ResourceLinkTailPermissionLevel uuid={uuid} />
     },
-    {
-        name: GroupDetailsPanelMembersColumnNames.UUID,
-        selected: true,
-        configurable: true,
-        filters: createTree(),
-        render: uuid => <ResourceLinkTailUuid uuid={uuid} />
-    },
     {
         name: GroupDetailsPanelMembersColumnNames.REMOVE,
         selected: true,

-----------------------------------------------------------------------


hooks/post-receive
-- 




More information about the arvados-commits mailing list