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]')
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';
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());
+ }));
}
};
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);
};
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());
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));
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);
await permissionService.create({
ownerUuid: user.uuid,
- headUuid: dialog.data,
+ headUuid: dialog.data.resourceUuid,
tailUuid: getPublicGroupUuid(state),
name: PermissionLevel.CAN_READ,
});
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;
const invitationDataUsers = getUsersFromForm
.map(person => ({
ownerUuid: user.uuid,
- headUuid: dialog.data,
+ headUuid: dialog.data.resourceUuid,
tailUuid: person.uuid,
name: invitations.permissions
}));
const invitationsDataGroups = getGroupsFromForm.map(
group => ({
ownerUuid: user.uuid,
- headUuid: dialog.data,
+ headUuid: dialog.data.resourceUuid,
tailUuid: group.uuid,
name: invitations.permissions
})
+++ /dev/null
-// 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} />;
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';
<Grid item>
<DetailsPanel />
</Grid>
- <AddGroupMembersDialog />
<AdvancedTabDialog />
<AttributesApiClientAuthorizationDialog />
<AttributesKeepServiceDialog />