Add visibility level select
authorMichal Klobukowski <michal.klobukowski@contractors.roche.com>
Tue, 30 Oct 2018 11:31:47 +0000 (12:31 +0100)
committerMichal Klobukowski <michal.klobukowski@contractors.roche.com>
Tue, 30 Oct 2018 11:31:47 +0000 (12:31 +0100)
Feature #14365

Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski <michal.klobukowski@contractors.roche.com>

src/store/sharing-dialog/sharing-dialog-actions.ts
src/store/sharing-dialog/sharing-dialog-types.ts
src/views-components/sharing-dialog/sharing-management-form.tsx
src/views-components/sharing-dialog/sharing-public-access-form.tsx
src/views-components/sharing-dialog/visibility-level-select.tsx

index 2b28668867a716f72dd2aa293ed378ceb866dd84..c2108aea26e4274d463d909d51e409e264f3b694 100644 (file)
@@ -4,7 +4,7 @@
 
 import { dialogActions } from "~/store/dialog/dialog-actions";
 import { withDialog } from "~/store/dialog/with-dialog";
-import { SHARING_DIALOG_NAME, SharingPublicAccessFormData, SHARING_PUBLIC_ACCESS_FORM_NAME, SHARING_INVITATION_FORM_NAME, SharingManagementFormData, SharingInvitationFormData, VisibilityLevel } from './sharing-dialog-types';
+import { SHARING_DIALOG_NAME, SharingPublicAccessFormData, SHARING_PUBLIC_ACCESS_FORM_NAME, SHARING_INVITATION_FORM_NAME, SharingManagementFormData, SharingInvitationFormData, VisibilityLevel, getSharingMangementFormData, getSharingPublicAccessFormData } from './sharing-dialog-types';
 import { Dispatch } from 'redux';
 import { ServiceRepository } from "~/services/services";
 import { FilterBuilder } from '~/services/api/filter-builder';
@@ -29,11 +29,9 @@ export const closeSharingDialog = () =>
 export const connectSharingDialog = withDialog(SHARING_DIALOG_NAME);
 
 export const saveSharingDialogChanges = async (dispatch: Dispatch) => {
-    await Promise.all([
-        dispatch<any>(savePublicPermissionChanges),
-        dispatch<any>(saveManagementChanges),
-        dispatch<any>(sendInvitations),
-    ]);
+    await dispatch<any>(savePublicPermissionChanges);
+    await dispatch<any>(saveManagementChanges);
+    await dispatch<any>(sendInvitations);
     dispatch(reset(SHARING_INVITATION_FORM_NAME));
     await dispatch<any>(loadSharingDialog);
 };
@@ -113,7 +111,7 @@ const savePublicPermissionChanges = async (_: Dispatch, getState: () => RootStat
     const { user } = state.auth;
     const dialog = getDialog<string>(state.dialog, SHARING_DIALOG_NAME);
     if (dialog && user) {
-        const { permissionUuid, visibility } = getFormValues(SHARING_PUBLIC_ACCESS_FORM_NAME)(state) as SharingPublicAccessFormData;
+        const { permissionUuid, visibility } = getSharingPublicAccessFormData(state);
 
         if (permissionUuid) {
             if (visibility === VisibilityLevel.PUBLIC) {
@@ -142,22 +140,32 @@ const saveManagementChanges = async (_: Dispatch, getState: () => RootState, { p
     const dialog = getDialog<string>(state.dialog, SHARING_DIALOG_NAME);
     if (dialog && user) {
 
-        const { initialPermissions, permissions } = getFormValues(SHARING_MANAGEMENT_FORM_NAME)(state) as SharingManagementFormData;
+        const { initialPermissions, permissions } = getSharingMangementFormData(state);
+        const { visibility } = getSharingPublicAccessFormData(state);
 
-        const cancelledPermissions = differenceWith(
-            initialPermissions,
-            permissions,
-            (a, b) => a.permissionUuid === b.permissionUuid
-        );
 
-        await Promise.all(cancelledPermissions.map(({ permissionUuid }) =>
-            permissionService.delete(permissionUuid)
-        ));
+        if (visibility === VisibilityLevel.PRIVATE) {
 
-        await Promise.all(permissions.map(({ permissionUuid, permissions }) =>
-            permissionService.update(permissionUuid, { name: permissions })
-        ));
+            await Promise.all(initialPermissions.map(({ permissionUuid, permissions }) =>
+                permissionService.delete(permissionUuid)
+            ));
 
+        } else {
+
+            const cancelledPermissions = differenceWith(
+                initialPermissions,
+                permissions,
+                (a, b) => a.permissionUuid === b.permissionUuid
+            );
+
+            await Promise.all(cancelledPermissions.map(({ permissionUuid }) =>
+                permissionService.delete(permissionUuid)
+            ));
+
+            await Promise.all(permissions.map(({ permissionUuid, permissions }) =>
+                permissionService.update(permissionUuid, { name: permissions })
+            ));
+        }
     }
 };
 
@@ -168,16 +176,19 @@ const sendInvitations = async (_: Dispatch, getState: () => RootState, { permiss
     if (dialog && user) {
 
         const invitations = getFormValues(SHARING_INVITATION_FORM_NAME)(state) as SharingInvitationFormData;
-
-        const promises = invitations.invitedPeople
-            .map(person => ({
-                ownerUuid: user.uuid,
-                headUuid: dialog.data,
-                tailUuid: person.uuid,
-                name: invitations.permissions
-            }))
-            .map(data => permissionService.create(data));
-
-        await Promise.all(promises);
+        const { visibility } = getSharingPublicAccessFormData(state);
+
+        if (visibility !== VisibilityLevel.PRIVATE) {
+            const promises = invitations.invitedPeople
+                .map(person => ({
+                    ownerUuid: user.uuid,
+                    headUuid: dialog.data,
+                    tailUuid: person.uuid,
+                    name: invitations.permissions
+                }))
+                .map(data => permissionService.create(data));
+
+            await Promise.all(promises);
+        }
     }
 };
index b897a9e67db78e164633bb725b8607b04d20c3a6..97e1979d20acfe3904ede4a82615c79b5aa60974 100644 (file)
@@ -3,6 +3,7 @@
 // SPDX-License-Identifier: AGPL-3.0
 
 import { PermissionLevel } from '~/models/permission';
+import { getFormValues } from 'redux-form';
 
 export const SHARING_DIALOG_NAME = 'SHARING_DIALOG_NAME';
 export const SHARING_PUBLIC_ACCESS_FORM_NAME = 'SHARING_PUBLIC_ACCESS_FORM_NAME';
@@ -40,4 +41,10 @@ export interface SharingInvitationFormPersonData {
     email: string;
     name: string;
     uuid: string;
-}
\ No newline at end of file
+}
+
+export const getSharingMangementFormData = (state: any) =>
+    getFormValues(SHARING_MANAGEMENT_FORM_NAME)(state) as SharingManagementFormData;
+
+export const getSharingPublicAccessFormData = (state: any) =>
+    getFormValues(SHARING_PUBLIC_ACCESS_FORM_NAME)(state) as SharingPublicAccessFormData;
index d4081a4a16924a31930e8ff46063eb1710550777..d78c6fe17e889745347f5913d7395d991e1a069d 100644 (file)
@@ -3,26 +3,9 @@
 // SPDX-License-Identifier: AGPL-3.0
 
 import { reduxForm } from 'redux-form';
-import { connect } from 'react-redux';
-import { compose } from 'redux';
 import SharingManagementFormComponent from './sharing-management-form-component';
 import { SHARING_MANAGEMENT_FORM_NAME } from '~/store/sharing-dialog/sharing-dialog-types';
-import { PermissionLevel } from '~/models/permission';
 
-export const SharingManagementForm = compose(
-    connect(() => ({
-        initialValues: {
-            permissions: [
-                {
-                    email: 'chrystian.klingenberg@contractors.roche.com',
-                    permissions: PermissionLevel.CAN_MANAGE,
-                },
-                {
-                    email: 'artur.janicki@contractors.roche.com',
-                    permissions: PermissionLevel.CAN_WRITE,
-                },
-            ],
-        }
-    })),
-    reduxForm({ form: SHARING_MANAGEMENT_FORM_NAME })
-)(SharingManagementFormComponent);
\ No newline at end of file
+export const SharingManagementForm = reduxForm(
+    { form: SHARING_MANAGEMENT_FORM_NAME }
+)(SharingManagementFormComponent);
index bf64ba32771433dfaf5c8b7a8adb77be18ea0731..1b39a654de8a66f0d66b9e6316da809540528469 100644 (file)
@@ -3,17 +3,9 @@
 // SPDX-License-Identifier: AGPL-3.0
 
 import { reduxForm } from 'redux-form';
-import { connect } from 'react-redux';
-import { compose } from 'redux';
 import SharingPublicAccessFormComponent from './sharing-public-access-form-component';
 import { SHARING_PUBLIC_ACCESS_FORM_NAME } from '~/store/sharing-dialog/sharing-dialog-types';
-import { PermissionLevel } from '~/models/permission';
-export const SharingPublicAccessForm = compose(
-    connect(() => ({
-        initialValues: {
-            enabled: false,
-            permissions: PermissionLevel.CAN_READ,
-        }
-    })),
-    reduxForm({ form: SHARING_PUBLIC_ACCESS_FORM_NAME })
-)(SharingPublicAccessFormComponent);
\ No newline at end of file
+
+export const SharingPublicAccessForm = reduxForm(
+    { form: SHARING_PUBLIC_ACCESS_FORM_NAME }
+)(SharingPublicAccessFormComponent);
index f03b5e99a770b788faa1b2325dab54d97ed263bf..72131551648846b6b9847d6d86cfa3cf72f9dc76 100644 (file)
@@ -20,7 +20,6 @@ const VisibilityLevelSelectStyles: StyleRulesCallback<VisibilityLevelSelectClass
         marginLeft: theme.spacing.unit,
     }
 });
-
 export const VisibilityLevelSelect = withStyles(VisibilityLevelSelectStyles)(
     ({ classes, ...props }: SelectProps & WithStyles<VisibilityLevelSelectClasses>) =>
         <Select