Контекст
В шапке приложения (SidebarLayout) есть виджет быстрого создания — кнопка «+» с выпадающим меню. Сейчас в нём два пункта: Команда и Проект (см. src/widgets/quick-create/ui/QuickCreate.tsx).
Функционал создания доски уже реализован отдельно:
features/boards/create — CreateBoardDialog, CreateBoardForm, useCreateBoardForm, useCreateBoard
- На странице проекта (
ProjectBoards.tsx) диалог уже используется через кнопку «Создать доску»
Нужно добавить третий пункт в QuickCreate, чтобы пользователь мог создать доску из шапки, не возвращаясь на страницу проекта.
Важно: доска всегда принадлежит проекту. API: POST /projects/{projectSlug}/area. Форма берёт projectSlug из URL через useParams() в useCreateBoardForm.ts — это работает только на маршруте /team/projects/[slug].
Технические требования
- Локация логики:
src/widgets/quick-create/ui/QuickCreate.tsx (основные изменения), при необходимости — src/features/boards/create/ui/CreateBoardDialog.tsx
- Инструменты: React, shadcn/ui (
DropdownMenu, Dialog), lucide-react, существующий feature features/boards/create, useParams из next/navigation
- Логика работы:
- Открыть
QuickCreate.tsx и изучить, как сделаны пункты «Команда» и «Проект» — новый пункт делается по тому же шаблону
- Добавить
useState для createBoardOpen и импорт CreateBoardDialog из features/boards/create
- Получить
projectSlug из useParams<{ slug: string }>() — тот же способ, что в useCreateBoardForm.ts
- Добавить
DropdownMenuItem «Доска» с иконкой (например, LayoutGrid или Kanban из lucide-react), описанием «Создать новую доску в проекте»
- Пункт disabled, если
!projectSlug — аналогично тому, как «Проект» disabled при !teamId
- По клику: закрыть dropdown (
setOpen(false)), открыть CreateBoardDialog через controlled props: dialog={{ open: createBoardOpen, onOpenChange: setCreateBoardOpen }}
- Доработка диалога (если нужно):
CreateProjectDialog рендерит DialogTrigger только при наличии children. В CreateBoardDialog триггер рендерится всегда — при использовании из QuickCreate без children это сломает UI. Приведи CreateBoardDialog к тому же паттерну, что CreateProjectDialog.tsx
- Новую логику создания доски не писать — переиспользовать готовый
CreateBoardDialog + CreateBoardForm
Цель и критерии приемки (Definition of Done)
Важные указания
- Производительность: дополнительных запросов не нужно — форма отправляет один
POST, кеш досок обновляется через invalidateQueries в useCreateBoard
- Ошибки: валидация и отображение ошибок уже в
useCreateBoardForm через setFormErrors — дублировать не нужно
- Безопасность: отдельной авторизации на фронте не требуется — API защищён на бэкенде; достаточно не давать открыть диалог без
projectSlug
- Не делать в рамках задачи: выбор проекта из списка в диалоге, создание колонок, рефакторинг
useCreateBoardForm — это отдельные задачи
- Как проверить: выбрать команду → открыть проект → нажать «+» в шапке → «Доска» → ввести название → «Создать доску» → доска появилась в табах проекта
Контекст
В шапке приложения (
SidebarLayout) есть виджет быстрого создания — кнопка «+» с выпадающим меню. Сейчас в нём два пункта: Команда и Проект (см.src/widgets/quick-create/ui/QuickCreate.tsx).Функционал создания доски уже реализован отдельно:
features/boards/create—CreateBoardDialog,CreateBoardForm,useCreateBoardForm,useCreateBoardProjectBoards.tsx) диалог уже используется через кнопку «Создать доску»Нужно добавить третий пункт в QuickCreate, чтобы пользователь мог создать доску из шапки, не возвращаясь на страницу проекта.
Важно: доска всегда принадлежит проекту. API:
POST /projects/{projectSlug}/area. Форма берётprojectSlugиз URL черезuseParams()вuseCreateBoardForm.ts— это работает только на маршруте/team/projects/[slug].Технические требования
src/widgets/quick-create/ui/QuickCreate.tsx(основные изменения), при необходимости —src/features/boards/create/ui/CreateBoardDialog.tsxDropdownMenu,Dialog),lucide-react, существующий featurefeatures/boards/create,useParamsизnext/navigationQuickCreate.tsxи изучить, как сделаны пункты «Команда» и «Проект» — новый пункт делается по тому же шаблонуuseStateдляcreateBoardOpenи импортCreateBoardDialogизfeatures/boards/createprojectSlugизuseParams<{ slug: string }>()— тот же способ, что вuseCreateBoardForm.tsDropdownMenuItem«Доска» с иконкой (например,LayoutGridилиKanbanизlucide-react), описанием «Создать новую доску в проекте»!projectSlug— аналогично тому, как «Проект» disabled при!teamIdsetOpen(false)), открытьCreateBoardDialogчерез controlled props:dialog={{ open: createBoardOpen, onOpenChange: setCreateBoardOpen }}CreateProjectDialogрендеритDialogTriggerтолько при наличииchildren. ВCreateBoardDialogтриггер рендерится всегда — при использовании из QuickCreate безchildrenэто сломает UI. ПриведиCreateBoardDialogк тому же паттерну, чтоCreateProjectDialog.tsxCreateBoardDialog+CreateBoardFormЦель и критерии приемки (Definition of Done)
QuickCreate.tsxдобавлены импортCreateBoardDialog, statecreateBoardOpen, получениеprojectSlugчерезuseParams/team/projects/[slug]) клик открывает диалог «Новая доска»; после успешного создания доска появляется в списке досок проекта (инвалидация уже вuseCreateBoard.ts)slugв URL) пункт «Доска» неактивен — как «Проект» без выбранной командыCreateBoardDialogкорректно работает в controlled-режиме безDialogTrigger; визуальный стиль пункта меню совпадает с «Команда» / «Проект» (Item,ItemMedia,ItemTitle,ItemDescription)Важные указания
POST, кеш досок обновляется черезinvalidateQueriesвuseCreateBoarduseCreateBoardFormчерезsetFormErrors— дублировать не нужноprojectSluguseCreateBoardForm— это отдельные задачи