Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor: restructure component layers for kebab button on groupcard #389

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import { IconDelete, IconPen } from '@/assets/images/icons';
import {
DropdownMenuButton,
DropdownMenuButtonIcon,
DropdownMenuButtonText,
DropdownMenuContent,
DropdownMenuItem,
Icon,
} from '@/components/ui';

interface IGroupCardDropdownMenuContentProps {
/**
* Function to handle the rename button click.
*/
handleRenameClick: () => void;
/**
* The function to close the dropdown menu.
*/
handleDeleteClick: () => void;
}

export const GroupCardDropdownMenuContent = ({
handleRenameClick,
handleDeleteClick,
}: IGroupCardDropdownMenuContentProps) => {
return (
<DropdownMenuContent>
<DropdownMenuItem asChild>
<DropdownMenuButton onClick={handleRenameClick}>
<DropdownMenuButtonIcon>
<Icon icon={IconPen} size={5} color="primary" />
</DropdownMenuButtonIcon>
<DropdownMenuButtonText>Rename</DropdownMenuButtonText>
</DropdownMenuButton>
</DropdownMenuItem>
<DropdownMenuItem asChild>
<DropdownMenuButton onClick={handleDeleteClick}>
<DropdownMenuButtonIcon>
<Icon icon={IconDelete} size={5} color="danger" />
</DropdownMenuButtonIcon>
<DropdownMenuButtonText>Delete</DropdownMenuButtonText>
</DropdownMenuButton>
</DropdownMenuItem>
</DropdownMenuContent>
);
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
'use client';
import { IconMenuKebab } from '@/assets/images/icons';
import { Button, DialogRoot, DropdownMenu, DropdownMenuTrigger, Icon } from '@/components/ui';
import { DeleteGroupDialogContent } from '@/features/groups/components/DeleteGroupDialogContent';
import { useAutoFocus } from '@/hooks';
import { IGroup } from '@/types/definition';

import { useState } from 'react';

import { GroupCardDropdownMenuContent } from './GroupCardDropdownMenuContent';

interface IGroupCardMenuButtonProps {
/**
* The ID of the group to be deleted.
*/
groupId: IGroup['id'];
/**
* Function to handle the rename button click.
*/
handleRenameClick: () => void;
/**
* A state of renaming input field to be opened (=true) or closed(=false)
*/
isRenameFormOpen: boolean;
}

export const GroupCardDropdownMenu = ({
groupId,
handleRenameClick,
isRenameFormOpen,
}: IGroupCardMenuButtonProps) => {
const [isDropdownMenuOpen, setIsDropdownMenuOpen] = useState(false);
const [isDeleteGroupDialogOpen, setIsDeleteGroupDialogOpen] = useState(false);

const kebabRef = useAutoFocus<HTMLButtonElement>(!isDeleteGroupDialogOpen && !isRenameFormOpen);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for adding this!


const handleDeleteClick = () => {
setIsDropdownMenuOpen(false);
setIsDeleteGroupDialogOpen(true);
};
return (
<>
<DropdownMenu open={isDropdownMenuOpen} onOpenChange={setIsDropdownMenuOpen}>
<DropdownMenuTrigger asChild>
<Button variant="ghost" className="w-12" ref={kebabRef}>
<Icon icon={IconMenuKebab} size={4.5} />
</Button>
</DropdownMenuTrigger>
<GroupCardDropdownMenuContent
handleRenameClick={handleRenameClick}
handleDeleteClick={handleDeleteClick}
/>
</DropdownMenu>
<DialogRoot open={isDeleteGroupDialogOpen} onOpenChange={setIsDeleteGroupDialogOpen}>
<DeleteGroupDialogContent
groupId={groupId}
onParentClose={() => setIsDropdownMenuOpen(false)}
onDialogClose={() => setIsDeleteGroupDialogOpen(false)}
/>
</DialogRoot>
</>
);
};

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,18 +1,31 @@
'use client';
import { Card } from '@/components/ui';
import { IGroup } from '@/types/definition';

import Link from 'next/link';
import { FC, useState } from 'react';

import { ContainerCount } from './ContainerCount';
import { GroupCardDropdownMenuTriggerButton } from './GroupCardDropdownMenuTriggerButton';
import { GroupCardDropdownMenu } from './GroupCardDropdownMenu';
import { RenameGroupForm } from './RenameGroupForm';
import { UserCount } from './UserCount';

interface IGroupCardContentProps {
groupId: string;
groupName: string;
/**
* the identifier of a group
*/
groupId: IGroup['id'];
/**
* a group name used to display on each card
*/
groupName: IGroup['name'];
/**
* the number of container which belongs to a group
*/
containerCount: number;
/**
* the number of user who belongs to a group
*/
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • The ID (identifier) of ...
  • The number of ...

userCount: number;
}

Expand Down Expand Up @@ -50,7 +63,11 @@ export const GroupCardContent: FC<IGroupCardContentProps> = ({
<UserCount userCount={userCount} />
</div>
</Link>
<GroupCardDropdownMenuTriggerButton groupId={groupId} handleRenameClick={handleRenameClick} />
<GroupCardDropdownMenu
groupId={groupId}
handleRenameClick={handleRenameClick}
isRenameFormOpen={isRenameFormOpen}
/>
</Card>
);
};
Loading