diff --git a/src/features/boards/create/ui/CreateBoardDialog.tsx b/src/features/boards/create/ui/CreateBoardDialog.tsx index 258b542..347e595 100644 --- a/src/features/boards/create/ui/CreateBoardDialog.tsx +++ b/src/features/boards/create/ui/CreateBoardDialog.tsx @@ -14,11 +14,11 @@ import { } from 'shared/ui'; import { CreateBoardForm } from './CreateBoardForm'; -interface CreateProjectDialogProps extends ComponentProps { +interface CreateBoardDialogProps extends ComponentProps { dialog?: ComponentProps; } -export function CreateBoardDialog({ dialog = {}, ...props }: CreateProjectDialogProps) { +export function CreateBoardDialog({ dialog = {}, ...props }: CreateBoardDialogProps) { const [open, setOpen] = useControllableState({ defaultValue: dialog.defaultOpen, value: dialog.open, diff --git a/src/widgets/quick-create/ui/QuickCreate.tsx b/src/widgets/quick-create/ui/QuickCreate.tsx index f1e3a4d..6f7f4af 100644 --- a/src/widgets/quick-create/ui/QuickCreate.tsx +++ b/src/widgets/quick-create/ui/QuickCreate.tsx @@ -1,28 +1,60 @@ 'use client'; - +import { useState, type ComponentType } from 'react'; +import { FolderPlus, Plus, UsersRound, LayoutGrid } from 'lucide-react'; +import { useParams } from 'next/navigation'; import { useTeamStore } from 'entities/team'; import { CreateProjectDialog } from 'features/projects/create'; import { CreateTeamDialog } from 'features/teams/create'; -import { FolderPlus, Plus, UsersRound } from 'lucide-react'; -import { useState } from 'react'; -import { - Button, - DropdownMenu, - DropdownMenuContent, - DropdownMenuItem, - DropdownMenuTrigger, - Item, - ItemContent, - ItemDescription, - ItemMedia, - ItemTitle, -} from 'shared/ui'; +import { CreateBoardDialog } from 'features/boards/create'; +import { Button, DropdownMenu, DropdownMenuContent, DropdownMenuTrigger } from 'shared/ui'; +import { QuickCreateItem } from './QuickCreateItem'; + +const MENU_CONFIG = [ + { id: 'team', title: 'Команда', description: 'Создать новую команду', icon: UsersRound }, + { id: 'project', title: 'Проект', description: 'Создать новый проект', icon: FolderPlus }, + { id: 'board', title: 'Доска', description: 'Создать новую доску в проекте', icon: LayoutGrid }, +] as const; + +interface MenuItemConfig { + title: string; + description: string; + icon: ComponentType<{ className?: string }>; + disabled?: boolean; + onOpenChange: () => void; +} export function QuickCreate() { const teamId = useTeamStore.use.teamId(); const [open, setOpen] = useState(false); const [createTeamOpen, setCreateTeamOpen] = useState(false); const [createProjectOpen, setCreateProjectOpen] = useState(false); + const [createBoardOpen, setCreateBoardOpen] = useState(false); + + const params = useParams<{ projectSlug: string }>(); + const projectSlug = params?.projectSlug; + + const menuItems: MenuItemConfig[] = MENU_CONFIG.map((item) => { + let disabled = false; + let onOpenChange = () => {}; + + if (item.id === 'team') { + onOpenChange = () => setCreateTeamOpen(true); + } else if (item.id === 'project') { + disabled = !teamId; + onOpenChange = () => setCreateProjectOpen(true); + } else if (item.id === 'board') { + disabled = !projectSlug; + onOpenChange = () => setCreateBoardOpen(true); + } + + return { + title: item.title, + description: item.description, + icon: item.icon, + disabled, + onOpenChange, + }; + }); return (
@@ -41,51 +73,17 @@ export function QuickCreate() { align="end" className="w-(--radix-dropdown-menu-trigger-width) min-w-56 rounded-lg" > - { - e.preventDefault(); - setOpen(false); - setCreateTeamOpen(true); - }} - > - - - - - - Команда - - Создать новую команду - - - - - { - e.preventDefault(); - setOpen(false); - setCreateProjectOpen(true); - }} - > - - - - - - Проект - - Создать новый проект - - - - + {menuItems.map((item) => ( + + ))} + +
); } diff --git a/src/widgets/quick-create/ui/QuickCreateItem.tsx b/src/widgets/quick-create/ui/QuickCreateItem.tsx new file mode 100644 index 0000000..10480b9 --- /dev/null +++ b/src/widgets/quick-create/ui/QuickCreateItem.tsx @@ -0,0 +1,44 @@ +import { ComponentType } from 'react'; +import { + DropdownMenuItem, + Item, + ItemContent, + ItemDescription, + ItemMedia, + ItemTitle, +} from 'shared/ui'; + +interface QuickCreateItemProps { + icon: ComponentType<{ className?: string }>; + title: string; + description: string; + disabled?: boolean; + onOpenChange: () => void; +} + +export function QuickCreateItem({ + icon: Icon, + title, + description, + disabled = false, + onOpenChange, +}: QuickCreateItemProps) { + return ( + { + onOpenChange(); + }} + > + + + + + + {title} + {description} + + + + ); +}