16115: Refresh permission management form on tab change.
authorLucas Di Pentima <lucas.dipentima@curii.com>
Mon, 16 May 2022 12:29:40 +0000 (09:29 -0300)
committerLucas Di Pentima <lucas.dipentima@curii.com>
Mon, 16 May 2022 12:29:40 +0000 (09:29 -0300)
Arvados-DCO-1.1-Signed-off-by: Lucas Di Pentima <lucas.dipentima@curii.com>

src/store/sharing-dialog/sharing-dialog-actions.ts
src/views-components/sharing-dialog/sharing-dialog-component.tsx
src/views-components/sharing-dialog/sharing-dialog.tsx

index d734d6014dec562ec997c24f4725da8fbe010b30..3eec0b59b802a3527ae98b9f3f7c0a8defea6be5 100644 (file)
@@ -19,7 +19,6 @@ import { SHARING_MANAGEMENT_FORM_NAME } from 'store/sharing-dialog/sharing-dialo
 import { RootState } from 'store/store';
 import { getDialog } from 'store/dialog/dialog-reducer';
 import { PermissionLevel } from 'models/permission';
-import { PermissionResource } from 'models/permission';
 import { differenceWith } from "lodash";
 import { withProgress } from "store/progress-indicator/with-progress";
 import { progressIndicatorActions } from 'store/progress-indicator/progress-indicator-actions';
@@ -117,8 +116,7 @@ const loadSharingDialog = async (dispatch: Dispatch, getState: () => RootState,
         dispatch(progressIndicatorActions.START_WORKING(SHARING_DIALOG_NAME));
         try {
             const resourceUuid = dialog.data.resourceUuid;
-            const { items } = await permissionService.listResourcePermissions(resourceUuid);
-            await dispatch<any>(initializeManagementForm(items));
+            await dispatch<any>(initializeManagementForm);
             // For collections, we need to load the public sharing tokens
             if (extractUuidObjectType(resourceUuid) === ResourceObjectType.COLLECTION) {
                 const sharingTokens = await apiClientAuthorizationService.listCollectionSharingTokens(resourceUuid);
@@ -136,9 +134,15 @@ const loadSharingDialog = async (dispatch: Dispatch, getState: () => RootState,
     }
 };
 
-const initializeManagementForm = (permissionLinks: PermissionResource[]) =>
-    async (dispatch: Dispatch, getState: () => RootState, { userService, groupsService }: ServiceRepository) => {
+export const initializeManagementForm = async (dispatch: Dispatch, getState: () => RootState, { userService, groupsService, permissionService }: ServiceRepository) => {
 
+        const dialog = getDialog<SharingDialogData>(getState().dialog, SHARING_DIALOG_NAME);
+        if (!dialog) {
+            return;
+        }
+        dispatch(progressIndicatorActions.START_WORKING(SHARING_DIALOG_NAME));
+        const resourceUuid = dialog?.data.resourceUuid;
+        const { items: permissionLinks } = await permissionService.listResourcePermissions(resourceUuid);
         const filters = new FilterBuilder()
             .addIn('uuid', permissionLinks.map(({ tailUuid }) => tailUuid))
             .getFilters();
@@ -169,6 +173,7 @@ const initializeManagementForm = (permissionLinks: PermissionResource[]) =>
         };
 
         dispatch(initialize(SHARING_MANAGEMENT_FORM_NAME, managementFormData));
+        dispatch(progressIndicatorActions.STOP_WORKING(SHARING_DIALOG_NAME));
     };
 
 const saveManagementChanges = async (_: Dispatch, getState: () => RootState, { permissionService }: ServiceRepository) => {
index 4ff9150b10c49d24b1c75a12d17159fb1f0b7d23..259390aab7abfbec51188cea90479f3ac35b6b14 100644 (file)
@@ -38,6 +38,7 @@ export interface SharingDialogActionProps {
     onClose: () => void;
     onSave: () => void;
     onCreateSharingToken: () => void;
+    refreshPermissions: () => void;
 }
 enum SharingDialogTab {
     PERMISSIONS = 0,
@@ -45,7 +46,7 @@ enum SharingDialogTab {
 }
 export default (props: SharingDialogDataProps & SharingDialogActionProps) => {
     const { open, loading, saveEnabled, sharedResourceUuid,
-        onClose, onSave, onCreateSharingToken } = props;
+        onClose, onSave, onCreateSharingToken, refreshPermissions } = props;
     const showTabs = extractUuidObjectType(sharedResourceUuid) === ResourceObjectType.COLLECTION;
     const [tabNr, setTabNr] = React.useState<number>(SharingDialogTab.PERMISSIONS);
 
@@ -65,7 +66,13 @@ export default (props: SharingDialogDataProps & SharingDialogActionProps) => {
             Sharing settings
         </DialogTitle>
         { showTabs &&
-        <Tabs value={tabNr} onChange={(_, tb) => setTabNr(tb)}>
+        <Tabs value={tabNr}
+            onChange={(_, tb) => {
+                if (tb === SharingDialogTab.PERMISSIONS) {
+                    refreshPermissions();
+                }
+                setTabNr(tb)}
+            }>
             <Tab label="With users/groups" />
             <Tab label="Sharing URLs" disabled={saveEnabled} />
         </Tabs>
index a077f7ee4f00da87922885cf008a1482cc9470cb..e48983a2527315cfb3faa701359344be30cf6a85 100644 (file)
@@ -10,7 +10,8 @@ import {
     saveSharingDialogChanges,
     connectSharingDialogProgress,
     SharingDialogData,
-    createSharingToken
+    createSharingToken,
+    initializeManagementForm
 } from 'store/sharing-dialog/sharing-dialog-actions';
 import { WithDialogProps } from 'store/dialog/with-dialog';
 import SharingDialogComponent, {
@@ -44,6 +45,9 @@ const mapDispatchToProps = (dispatch: Dispatch, { ...props }: Props): SharingDia
     },
     onCreateSharingToken: () => {
         dispatch<any>(createSharingToken);
+    },
+    refreshPermissions: () => {
+        dispatch<any>(initializeManagementForm);
     }
 });