Refactor: Collaborator Project Settings (#197)

### TL;DR

AddMemberDialog component now uses a Select dropdown for permissions instead of Checkboxes. CollaboratorsTabPanel now includes dismiss functionality for toasts.

### What changed?

- Updated AddMemberDialog to use a Select dropdown for permissions
- Added dismiss functionality for toasts in CollaboratorsTabPanel

### How to test?

Test the functionality of selecting permissions using the dropdown and toast dismissal in CollaboratorsTabPanel.

### Why make this change?

To improve user experience and UI consistency in permissions selection and toast management.
This commit is contained in:
Vivian Phung 2024-05-22 14:58:47 -04:00 committed by GitHub
parent 306d3235b3
commit b35f4033c5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 40 additions and 35 deletions

View File

@ -1,13 +1,13 @@
import { useCallback } from 'react'; import { useCallback } from 'react';
import { useForm } from 'react-hook-form'; import { useForm } from 'react-hook-form';
import { AddProjectMemberInput, Permission } from 'gql-client';
import { Typography } from '@snowballtools/material-tailwind-react-fork'; import { Typography } from '@snowballtools/material-tailwind-react-fork';
import { Button } from 'components/shared/Button'; import { Button } from 'components/shared/Button';
import { Modal } from 'components/shared/Modal'; import { Modal } from 'components/shared/Modal';
import { Input } from 'components/shared/Input'; import { Input } from 'components/shared/Input';
import { Checkbox } from 'components/shared/Checkbox'; import { Select, SelectOption } from 'components/shared/Select';
import { AddProjectMemberInput, Permission } from 'gql-client';
interface AddMemberDialogProp { interface AddMemberDialogProp {
open: boolean; open: boolean;
@ -17,18 +17,30 @@ interface AddMemberDialogProp {
interface formData { interface formData {
emailAddress: string; emailAddress: string;
permissions: { canEdit: boolean;
view: boolean;
edit: boolean;
};
} }
const permissionViewOptions: SelectOption = {
value: Permission.View,
label: Permission.View,
};
const permissionEditOptions: SelectOption = {
value: Permission.Edit,
label: Permission.Edit,
};
const permissionsDropdownOptions: SelectOption[] = [
permissionViewOptions,
permissionEditOptions,
];
const AddMemberDialog = ({ const AddMemberDialog = ({
open, open,
handleOpen, handleOpen,
handleAddMember, handleAddMember,
}: AddMemberDialogProp) => { }: AddMemberDialogProp) => {
const { const {
watch,
setValue,
handleSubmit, handleSubmit,
register, register,
reset, reset,
@ -36,10 +48,7 @@ const AddMemberDialog = ({
} = useForm({ } = useForm({
defaultValues: { defaultValues: {
emailAddress: '', emailAddress: '',
permissions: { canEdit: false,
view: true,
edit: false,
},
}, },
}); });
@ -47,11 +56,7 @@ const AddMemberDialog = ({
reset(); reset();
handleOpen(); handleOpen();
const permissions = Object.entries(data.permissions) const permissions = [data.canEdit ? Permission.Edit : Permission.View];
.filter(([, value]) => value)
.map(
([key]) => key.charAt(0).toUpperCase() + key.slice(1),
) as Permission[];
await handleAddMember({ email: data.emailAddress, permissions }); await handleAddMember({ email: data.emailAddress, permissions });
}, []); }, []);
@ -72,19 +77,19 @@ const AddMemberDialog = ({
required: 'email field cannot be empty', required: 'email field cannot be empty',
})} })}
/> />
<Typography variant="small">Permissions</Typography> <Select
<Typography variant="small"> label="Permissions"
You can change this later if required. description="You can change this later if required."
</Typography> options={permissionsDropdownOptions}
<Checkbox value={
label={Permission.View} watch('canEdit') ? permissionEditOptions : permissionViewOptions
{...register(`permissions.view`)} }
color="blue" onChange={(value) =>
/> setValue(
<Checkbox 'canEdit',
label={Permission.Edit} (value as SelectOption)!.value === Permission.Edit,
{...register(`permissions.edit`)} )
color="blue" }
/> />
</Modal.Body> </Modal.Body>
<Modal.Footer> <Modal.Footer>

View File

@ -16,7 +16,7 @@ const FIRST_MEMBER_CARD = 0;
const CollaboratorsTabPanel = () => { const CollaboratorsTabPanel = () => {
const client = useGQLClient(); const client = useGQLClient();
const { toast } = useToast(); const { toast, dismiss } = useToast();
const { project } = useOutletContext<OutletContextType>(); const { project } = useOutletContext<OutletContextType>();
const [addmemberDialogOpen, setAddMemberDialogOpen] = useState(false); const [addmemberDialogOpen, setAddMemberDialogOpen] = useState(false);
@ -39,14 +39,14 @@ const CollaboratorsTabPanel = () => {
id: 'member_added', id: 'member_added',
title: 'Member added to project', title: 'Member added to project',
variant: 'success', variant: 'success',
onDismiss() {}, onDismiss: dismiss,
}); });
} else { } else {
toast({ toast({
id: 'member_not_added', id: 'member_not_added',
title: 'Invitation not sent', title: 'Invitation not sent',
variant: 'error', variant: 'error',
onDismiss() {}, onDismiss: dismiss,
}); });
} }
}, },
@ -63,14 +63,14 @@ const CollaboratorsTabPanel = () => {
id: 'member_removed', id: 'member_removed',
title: 'Member removed from project', title: 'Member removed from project',
variant: 'success', variant: 'success',
onDismiss() {}, onDismiss: dismiss,
}); });
} else { } else {
toast({ toast({
id: 'member_not_removed', id: 'member_not_removed',
title: 'Not able to remove member', title: 'Not able to remove member',
variant: 'error', variant: 'error',
onDismiss() {}, onDismiss: dismiss,
}); });
} }
}; };
@ -86,14 +86,14 @@ const CollaboratorsTabPanel = () => {
id: 'member_permission_updated', id: 'member_permission_updated',
title: 'Project member permission updated', title: 'Project member permission updated',
variant: 'success', variant: 'success',
onDismiss() {}, onDismiss: dismiss,
}); });
} else { } else {
toast({ toast({
id: 'member_permission_not_updated', id: 'member_permission_not_updated',
title: 'Project member permission not updated', title: 'Project member permission not updated',
variant: 'error', variant: 'error',
onDismiss() {}, onDismiss: dismiss,
}); });
} }
}, },