generated from xgeekshq/oss-template
-
Notifications
You must be signed in to change notification settings - Fork 10
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[FEATURE]: Drawer with members (#523)
* feat: add drawer layout to display members list * feat: add schema to search member form
- Loading branch information
1 parent
6b6e4a3
commit 2a26d1b
Showing
6 changed files
with
184 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
142 changes: 142 additions & 0 deletions
142
frontend/src/components/Teams/CreateTeam/ListMembers/index.tsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,142 @@ | ||
import { Dispatch, SetStateAction, useEffect, useRef } from 'react'; | ||
import { FormProvider, useForm, useWatch } from 'react-hook-form'; | ||
import { joiResolver } from '@hookform/resolvers/joi'; | ||
import { Dialog, DialogClose, DialogTrigger } from '@radix-ui/react-dialog'; | ||
|
||
import Icon from 'components/icons/Icon'; | ||
import Text from 'components/Primitives/Text'; | ||
import SchemaAddMemberForm from '../../../../schema/schemaAddMemberForm'; | ||
import { | ||
ButtonsContainer, | ||
StyledDialogCloseButton, | ||
StyledDialogContainer, | ||
StyledDialogContent, | ||
StyledDialogOverlay, | ||
StyledDialogTitle | ||
} from '../../../Board/Settings/styles'; | ||
import Button from '../../../Primitives/Button'; | ||
import Flex from '../../../Primitives/Flex'; | ||
import Input from '../../../Primitives/Input'; | ||
import { ButtonAddMember } from './styles'; | ||
|
||
type Props = { | ||
setIsOpen: Dispatch<SetStateAction<boolean>>; | ||
isOpen: boolean; | ||
}; | ||
|
||
const ListMembers = ({ isOpen, setIsOpen }: Props) => { | ||
// References | ||
const dialogContainerRef = useRef<HTMLSpanElement>(null); | ||
const submitBtnRef = useRef<HTMLButtonElement | null>(null); | ||
|
||
// Method to close dialog and reset switches state | ||
const handleClose = () => { | ||
setIsOpen(false); | ||
}; | ||
|
||
const methods = useForm<{ search: string }>({ | ||
mode: 'onBlur', | ||
reValidateMode: 'onBlur', | ||
defaultValues: { | ||
search: '' | ||
}, | ||
resolver: joiResolver(SchemaAddMemberForm) | ||
}); | ||
|
||
const searchMember = useWatch({ | ||
control: methods.control, | ||
name: 'search' | ||
}); | ||
|
||
/** | ||
* Use Effect to submit the board settings form when press enter key | ||
* (Note: Radix Dialog close when pressing enter) | ||
*/ | ||
useEffect(() => { | ||
const element = dialogContainerRef?.current; | ||
|
||
const keyDownHandler = (event: KeyboardEvent) => { | ||
if (event.key === 'Enter') { | ||
event.preventDefault(); | ||
|
||
if (submitBtnRef.current) { | ||
submitBtnRef.current.click(); | ||
} | ||
} | ||
}; | ||
|
||
element?.addEventListener('keydown', keyDownHandler); | ||
|
||
return () => element?.removeEventListener('keydown', keyDownHandler); | ||
// eslint-disable-next-line react-hooks/exhaustive-deps | ||
}, []); | ||
|
||
return ( | ||
<StyledDialogContainer ref={dialogContainerRef}> | ||
<Dialog open={isOpen} onOpenChange={setIsOpen}> | ||
<DialogTrigger asChild> | ||
<ButtonAddMember> | ||
<Icon css={{ width: '$16', height: '$16' }} name="plus" />{' '} | ||
<Text | ||
css={{ | ||
ml: '$10', | ||
fontSize: '$14', | ||
lineHeight: '$18', | ||
fontWeight: '700' | ||
}} | ||
> | ||
Add new member | ||
</Text> | ||
</ButtonAddMember> | ||
</DialogTrigger> | ||
<StyledDialogOverlay /> | ||
<StyledDialogContent> | ||
<StyledDialogTitle> | ||
<Text heading="4">Add team members</Text> | ||
<DialogClose asChild> | ||
<StyledDialogCloseButton isIcon size="lg"> | ||
<Icon css={{ color: '$primary400' }} name="close" size={24} /> | ||
</StyledDialogCloseButton> | ||
</DialogClose> | ||
</StyledDialogTitle> | ||
<FormProvider {...methods}> | ||
<Flex css={{ padding: '$24 $32 $40' }} direction="column" gap={16}> | ||
<Input | ||
currentValue={searchMember} | ||
icon="search" | ||
iconPosition="left" | ||
id="search" | ||
maxChars="30" | ||
placeholder="Search member" | ||
state="default" | ||
type="text" | ||
/> | ||
</Flex> | ||
<Text css={{ display: 'block', px: '$32', py: '$10' }} heading="4"> | ||
Teams | ||
</Text> | ||
<ButtonsContainer gap={24} justify="end"> | ||
<Button | ||
css={{ margin: '0 $24 0 auto', padding: '$16 $24' }} | ||
variant="primaryOutline" | ||
onClick={handleClose} | ||
> | ||
Cancel | ||
</Button> | ||
<Button | ||
css={{ marginRight: '$32', padding: '$16 $24' }} | ||
ref={submitBtnRef} | ||
type="submit" | ||
variant="primary" | ||
> | ||
Save | ||
</Button> | ||
</ButtonsContainer> | ||
</FormProvider> | ||
</StyledDialogContent> | ||
</Dialog> | ||
</StyledDialogContainer> | ||
); | ||
}; | ||
|
||
export { ListMembers }; |
17 changes: 17 additions & 0 deletions
17
frontend/src/components/Teams/CreateTeam/ListMembers/styles.tsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
import { styled } from '../../../../styles/stitches/stitches.config'; | ||
|
||
const ButtonAddMember = styled('button', { | ||
color: 'black', | ||
display: 'flex', | ||
alignItems: 'center', | ||
backgroundColor: 'transparent', | ||
border: 0, | ||
fontSize: '13px', | ||
'&:hover': { | ||
cursor: 'pointer', | ||
textDecoration: 'underline' | ||
}, | ||
marginTop: '10px' | ||
}); | ||
|
||
export { ButtonAddMember }; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
import Joi from 'joi'; | ||
|
||
const SchemaAddMemberForm = Joi.object({ | ||
search: Joi.string().optional().trim().max(30).messages({ | ||
'string.max': 'Maximum of 30 characters' | ||
}) | ||
}); | ||
|
||
export default SchemaAddMemberForm; |