From aad5b533a94f7c7cae83ba1c6054f9c87e050f77 Mon Sep 17 00:00:00 2001 From: Rasul Date: Tue, 30 Jun 2026 01:06:34 +0300 Subject: [PATCH 1/4] =?UTF-8?q?feat:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=B4=D0=BE=D1=81=D0=BA=D0=B8=20=D0=B8=D0=B7=20QuickC?= =?UTF-8?q?reate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/widgets/quick-create/ui/QuickCreate.tsx | 30 +++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/src/widgets/quick-create/ui/QuickCreate.tsx b/src/widgets/quick-create/ui/QuickCreate.tsx index f1e3a4d..1ddff17 100644 --- a/src/widgets/quick-create/ui/QuickCreate.tsx +++ b/src/widgets/quick-create/ui/QuickCreate.tsx @@ -1,10 +1,12 @@ 'use client'; +import { useState } 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 { CreateBoardDialog } from 'features/boards/create'; import { Button, DropdownMenu, @@ -23,6 +25,9 @@ export function QuickCreate() { 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; return (
@@ -80,12 +85,33 @@ export function QuickCreate() { + { + e.preventDefault(); + setOpen(false); + setCreateBoardOpen(true); + }} + > + + + + + + Доска + + Создать новую доску в проекте + + + + +
); } From 7810849fac569b8028084b5879097d920dd33c8e Mon Sep 17 00:00:00 2001 From: Rasul Date: Wed, 1 Jul 2026 02:04:37 +0300 Subject: [PATCH 2/4] =?UTF-8?q?refactor:=20=D0=B2=D1=8B=D0=BD=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D0=B8=20QuickCreateItem=20=D0=B2=20=D0=BE=D1=82=D0=B4?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20=D0=BA=D0=BE=D0=BC=D0=BF?= =?UTF-8?q?=D0=BE=D0=BD=D0=B5=D0=BD=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/widgets/quick-create/ui/QuickCreate.tsx | 84 +++++-------------- .../quick-create/ui/QuickCreateItem.tsx | 43 ++++++++++ 2 files changed, 66 insertions(+), 61 deletions(-) create mode 100644 src/widgets/quick-create/ui/QuickCreateItem.tsx diff --git a/src/widgets/quick-create/ui/QuickCreate.tsx b/src/widgets/quick-create/ui/QuickCreate.tsx index 1ddff17..b3925b8 100644 --- a/src/widgets/quick-create/ui/QuickCreate.tsx +++ b/src/widgets/quick-create/ui/QuickCreate.tsx @@ -1,5 +1,4 @@ 'use client'; - import { useState } from 'react'; import { FolderPlus, Plus, UsersRound, LayoutGrid } from 'lucide-react'; import { useParams } from 'next/navigation'; @@ -7,18 +6,8 @@ import { useTeamStore } from 'entities/team'; import { CreateProjectDialog } from 'features/projects/create'; import { CreateTeamDialog } from 'features/teams/create'; import { CreateBoardDialog } from 'features/boards/create'; -import { - Button, - DropdownMenu, - DropdownMenuContent, - DropdownMenuItem, - DropdownMenuTrigger, - Item, - ItemContent, - ItemDescription, - ItemMedia, - ItemTitle, -} from 'shared/ui'; +import { Button, DropdownMenu, DropdownMenuContent, DropdownMenuTrigger } from 'shared/ui'; +import { QuickCreateItem } from './QuickCreateItem'; // ← Новый импорт export function QuickCreate() { const teamId = useTeamStore.use.teamId(); @@ -46,67 +35,40 @@ export function QuickCreate() { align="end" className="w-(--radix-dropdown-menu-trigger-width) min-w-56 rounded-lg" > - { - e.preventDefault(); + } + title="Команда" + description="Создать новую команду" + onOpenChange={() => { setOpen(false); setCreateTeamOpen(true); }} - > - - - - - - Команда - - Создать новую команду - - - - - + + } + title="Проект" + description="Создать новый проект" disabled={!teamId} - onSelect={(e) => { - e.preventDefault(); + onOpenChange={() => { setOpen(false); setCreateProjectOpen(true); }} - > - - - - - - Проект - - Создать новый проект - - - - - + + } + title="Доска" + description="Создать новую доску в проекте" disabled={!projectSlug} - onSelect={(e) => { - e.preventDefault(); + onOpenChange={() => { setOpen(false); setCreateBoardOpen(true); }} - > - - - - - - Доска - - Создать новую доску в проекте - - - - + /> + void; +} + +export function QuickCreateItem({ + icon, + title, + description, + disabled = false, + onOpenChange, +}: QuickCreateItemProps) { + return ( + { + e.preventDefault(); + onOpenChange(); + }} + > + + {icon} + + {title} + {description} + + + + ); +} From 6ef89cad6db450a09f0e0385ab353484c6ad40dc Mon Sep 17 00:00:00 2001 From: Rasul Date: Mon, 6 Jul 2026 19:12:24 +0300 Subject: [PATCH 3/4] =?UTF-8?q?refactor:=20=D0=B2=D1=8B=D0=BD=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D0=B8=20QuickCreateItem=20=D0=B2=20=D0=BE=D1=82=D0=B4?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20=D0=BA=D0=BE=D0=BC=D0=BF?= =?UTF-8?q?=D0=BE=D0=BD=D0=B5=D0=BD=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/widgets/quick-create/ui/QuickCreate.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/widgets/quick-create/ui/QuickCreate.tsx b/src/widgets/quick-create/ui/QuickCreate.tsx index b3925b8..4e5ba0e 100644 --- a/src/widgets/quick-create/ui/QuickCreate.tsx +++ b/src/widgets/quick-create/ui/QuickCreate.tsx @@ -7,7 +7,7 @@ import { CreateProjectDialog } from 'features/projects/create'; import { CreateTeamDialog } from 'features/teams/create'; import { CreateBoardDialog } from 'features/boards/create'; import { Button, DropdownMenu, DropdownMenuContent, DropdownMenuTrigger } from 'shared/ui'; -import { QuickCreateItem } from './QuickCreateItem'; // ← Новый импорт +import { QuickCreateItem } from './QuickCreateItem'; export function QuickCreate() { const teamId = useTeamStore.use.teamId(); From d7edecb068149360a6a5091df59a9264a6a6d1d6 Mon Sep 17 00:00:00 2001 From: Rasul Date: Wed, 8 Jul 2026 00:01:27 +0300 Subject: [PATCH 4/4] =?UTF-8?q?=D1=83=D0=BB=D1=83=D1=87=D1=88=D0=B8=D0=BB?= =?UTF-8?q?=20=D1=82=D0=B8=D0=BF=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8E=20Qui?= =?UTF-8?q?ckCreateItem?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/widgets/quick-create/ui/QuickCreate.tsx | 77 +++++++++++-------- .../quick-create/ui/QuickCreateItem.tsx | 10 ++- 2 files changed, 51 insertions(+), 36 deletions(-) diff --git a/src/widgets/quick-create/ui/QuickCreate.tsx b/src/widgets/quick-create/ui/QuickCreate.tsx index 4e5ba0e..37f7da9 100644 --- a/src/widgets/quick-create/ui/QuickCreate.tsx +++ b/src/widgets/quick-create/ui/QuickCreate.tsx @@ -1,5 +1,5 @@ 'use client'; -import { useState } from 'react'; +import { useState, type ComponentType } from 'react'; import { FolderPlus, Plus, UsersRound, LayoutGrid } from 'lucide-react'; import { useParams } from 'next/navigation'; import { useTeamStore } from 'entities/team'; @@ -9,15 +9,56 @@ import { CreateBoardDialog } from 'features/boards/create'; import { Button, DropdownMenu, DropdownMenuContent, DropdownMenuTrigger } from 'shared/ui'; import { QuickCreateItem } from './QuickCreateItem'; +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[] = [ + { + title: 'Команда', + description: 'Создать новую команду', + icon: UsersRound, + onOpenChange: () => { + setOpen(false); + setCreateTeamOpen(true); + }, + }, + { + title: 'Проект', + description: 'Создать новый проект', + icon: FolderPlus, + disabled: !teamId, + onOpenChange: () => { + setOpen(false); + setCreateProjectOpen(true); + }, + }, + { + title: 'Доска', + description: 'Создать новую доску в проекте', + icon: LayoutGrid, + disabled: !projectSlug, + onOpenChange: () => { + setOpen(false); + setCreateBoardOpen(true); + }, + }, + ]; + return (
@@ -35,37 +76,9 @@ export function QuickCreate() { align="end" className="w-(--radix-dropdown-menu-trigger-width) min-w-56 rounded-lg" > - } - title="Команда" - description="Создать новую команду" - onOpenChange={() => { - setOpen(false); - setCreateTeamOpen(true); - }} - /> - - } - title="Проект" - description="Создать новый проект" - disabled={!teamId} - onOpenChange={() => { - setOpen(false); - setCreateProjectOpen(true); - }} - /> - - } - title="Доска" - description="Создать новую доску в проекте" - disabled={!projectSlug} - onOpenChange={() => { - setOpen(false); - setCreateBoardOpen(true); - }} - /> + {menuItems.map((item) => ( + + ))} diff --git a/src/widgets/quick-create/ui/QuickCreateItem.tsx b/src/widgets/quick-create/ui/QuickCreateItem.tsx index d71db4e..ca72621 100644 --- a/src/widgets/quick-create/ui/QuickCreateItem.tsx +++ b/src/widgets/quick-create/ui/QuickCreateItem.tsx @@ -1,4 +1,4 @@ -import { ReactNode } from 'react'; +import { ComponentType } from 'react'; import { DropdownMenuItem, Item, @@ -9,7 +9,7 @@ import { } from 'shared/ui'; interface QuickCreateItemProps { - icon: ReactNode; + icon: ComponentType<{ className?: string }>; title: string; description: string; disabled?: boolean; @@ -17,7 +17,7 @@ interface QuickCreateItemProps { } export function QuickCreateItem({ - icon, + icon: Icon, title, description, disabled = false, @@ -32,7 +32,9 @@ export function QuickCreateItem({ }} > - {icon} + + + {title} {description}