X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/4ea2ff188ec745966387ce8bbe14880bfeede863..0db26cfb0926f4f840d11bf85b66dfee921bf1f2:/src/store/sharing-dialog/sharing-dialog-actions.ts diff --git a/src/store/sharing-dialog/sharing-dialog-actions.ts b/src/store/sharing-dialog/sharing-dialog-actions.ts index 37de6f8c..54ad6791 100644 --- a/src/store/sharing-dialog/sharing-dialog-actions.ts +++ b/src/store/sharing-dialog/sharing-dialog-actions.ts @@ -2,23 +2,24 @@ // // SPDX-License-Identifier: AGPL-3.0 -import { dialogActions } from "~/store/dialog/dialog-actions"; -import { withDialog } from "~/store/dialog/with-dialog"; +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, getSharingMangementFormData, getSharingPublicAccessFormData } from './sharing-dialog-types'; import { Dispatch } from 'redux'; -import { ServiceRepository } from "~/services/services"; -import { FilterBuilder } from '~/services/api/filter-builder'; +import { ServiceRepository } from "services/services"; +import { FilterBuilder } from 'services/api/filter-builder'; import { initialize, getFormValues, reset } from 'redux-form'; -import { SHARING_MANAGEMENT_FORM_NAME } from '~/store/sharing-dialog/sharing-dialog-types'; -import { RootState } from '~/store/store'; -import { getDialog } from '~/store/dialog/dialog-reducer'; -import { PermissionLevel } from '~/models/permission'; -import { getPublicGroupUuid } from "~/store/workflow-panel/workflow-panel-actions"; -import { PermissionResource } from '~/models/permission'; +import { SHARING_MANAGEMENT_FORM_NAME } from 'store/sharing-dialog/sharing-dialog-types'; +import { RootState } from 'store/store'; +import { getDialog } from 'store/dialog/dialog-reducer'; +import { PermissionLevel } from 'models/permission'; +import { getPublicGroupUuid } from "store/workflow-panel/workflow-panel-actions"; +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.ts'; +import { withProgress } from "store/progress-indicator/with-progress"; +import { progressIndicatorActions } from 'store/progress-indicator/progress-indicator-actions'; import { snackbarActions, SnackbarKind } from "../snackbar/snackbar-actions"; +import { extractUuidKind, ResourceKind } from "models/resource"; export const openSharingDialog = (resourceUuid: string) => (dispatch: Dispatch) => { @@ -72,19 +73,23 @@ const loadSharingDialog = async (dispatch: Dispatch, getState: () => RootState, }; const initializeManagementForm = (permissionLinks: PermissionResource[]) => - async (dispatch: Dispatch, getState: () => RootState, { userService }: ServiceRepository) => { + async (dispatch: Dispatch, getState: () => RootState, { userService, groupsService }: ServiceRepository) => { const filters = new FilterBuilder() .addIn('uuid', permissionLinks.map(({ tailUuid }) => tailUuid)) .getFilters(); - const { items: users } = await userService.list({ filters }); + const { items: users } = await userService.list({ filters, count: "none" }); + const { items: groups } = await groupsService.list({ filters, count: "none" }); const getEmail = (tailUuid: string) => { const user = users.find(({ uuid }) => uuid === tailUuid); + const group = groups.find(({ uuid }) => uuid === tailUuid); return user ? user.email - : tailUuid; + : group + ? group.name + : tailUuid; }; const managementPermissions = permissionLinks @@ -189,15 +194,17 @@ const saveManagementChanges = async (_: Dispatch, getState: () => RootState, { p } }; -const sendInvitations = async (_: Dispatch, getState: () => RootState, { permissionService }: ServiceRepository) => { +const sendInvitations = async (_: Dispatch, getState: () => RootState, { permissionService, userService }: ServiceRepository) => { const state = getState(); const { user } = state.auth; const dialog = getDialog(state.dialog, SHARING_DIALOG_NAME); if (dialog && user) { - const invitations = getFormValues(SHARING_INVITATION_FORM_NAME)(state) as SharingInvitationFormData; - const invitationData = invitations.invitedPeople + const getGroupsFromForm = invitations.invitedPeople.filter((invitation) => extractUuidKind(invitation.uuid) === ResourceKind.GROUP); + const getUsersFromForm = invitations.invitedPeople.filter((invitation) => extractUuidKind(invitation.uuid) === ResourceKind.USER); + + const invitationDataUsers = getUsersFromForm .map(person => ({ ownerUuid: user.uuid, headUuid: dialog.data, @@ -205,9 +212,19 @@ const sendInvitations = async (_: Dispatch, getState: () => RootState, { permiss name: invitations.permissions })); - for (const invitation of invitationData) { + const invitationsDataGroups = getGroupsFromForm.map( + group => ({ + ownerUuid: user.uuid, + headUuid: dialog.data, + tailUuid: group.uuid, + name: invitations.permissions + }) + ); + + const data = invitationDataUsers.concat(invitationsDataGroups); + + for (const invitation of data) { await permissionService.create(invitation); } - } };