From f66499467c5011bdea813cfbeef00b4bb35069fe Mon Sep 17 00:00:00 2001 From: tlartem Date: Mon, 4 Aug 2025 20:43:43 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=B8=D0=B7=D0=B0=D0=B9=D0=BD=20=D0=B3?= =?UTF-8?q?=D1=80=D1=83=D0=BF=D0=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TemplateManager/TemplateGroup.tsx | 153 +++-- src/page/templates/Page.tsx | 560 +++++++++++------- 2 files changed, 426 insertions(+), 287 deletions(-) diff --git a/src/component/TemplateManager/TemplateGroup.tsx b/src/component/TemplateManager/TemplateGroup.tsx index d745d09..321548b 100644 --- a/src/component/TemplateManager/TemplateGroup.tsx +++ b/src/component/TemplateManager/TemplateGroup.tsx @@ -36,7 +36,12 @@ interface DropZoneProps { isDragActive?: boolean } -const DropZone: React.FC = ({ id, position, isVisible = true, isDragActive = false }) => { +const DropZone: React.FC = ({ + id, + position, + isVisible = true, + isDragActive = false, +}) => { const { setNodeRef, isOver } = useDroppable({ id, }) @@ -47,7 +52,7 @@ const DropZone: React.FC = ({ id, position, isVisible = true, isD
= ({ id, position, isVisible = true, isD {/* Активный индикатор только при drag over */} {isOver && (
-
+
{/* Индикатор направления вставки */} -
-
+
+
@@ -105,7 +114,9 @@ const DraggableDroppableTemplateCard: React.FC = ({ }) const style = { - transform: dragTransform ? `translate3d(${dragTransform.x}px, ${dragTransform.y}px, 0)` : undefined, + transform: dragTransform + ? `translate3d(${dragTransform.x}px, ${dragTransform.y}px, 0)` + : undefined, zIndex: isDragging ? 1000 : 'auto', opacity: isDragging ? 0.5 : 1, } @@ -114,7 +125,7 @@ const DraggableDroppableTemplateCard: React.FC = ({
{/* Drop зона слева */} - + {/* Основная карточка */}
= ({ {...dragAttributes} {...dragListeners} className={clsx( - 'transition-shadow duration-200 cursor-grab active:cursor-grabbing relative', + 'relative cursor-grab transition-shadow duration-200 active:cursor-grabbing', isDragging && 'shadow-xl' )} > @@ -137,7 +148,7 @@ const DraggableDroppableTemplateCard: React.FC = ({ activeFilters={activeFilters} />
- + {/* Drop зона справа */}
@@ -179,11 +190,11 @@ const DroppableGroup: React.FC = ({
{templates.length > 0 ? ( @@ -203,21 +214,25 @@ const DroppableGroup: React.FC = ({ )) ) : ( /* Минималистичный placeholder для пустой группы */ -
+
{isOver ? ( -
-
+
+
Отпустите чтобы добавить в группу
) : ( @@ -267,20 +282,21 @@ export const TemplateGroup: React.FC = ({ showEmptyState = false, }) => { const [internalIsExpanded, setInternalIsExpanded] = useState(true) - + // Используем внешнее состояние если передано, иначе внутреннее - const isExpanded = externalIsExpanded !== undefined ? externalIsExpanded : internalIsExpanded + const isExpanded = + externalIsExpanded !== undefined ? externalIsExpanded : internalIsExpanded // Отладка: логируем получение шаблонов в группе console.log(`🏗️ TemplateGroup render for "${group?.name || 'Без группы'}":`, { groupId: group?.id || 'ungrouped', templatesCount: templates.length, - templates: templates.map(t => ({ - id: t.id, - name: t.name, + templates: templates.map(t => ({ + id: t.id, + name: t.name, order: t.order, - group_id: t.group_id - })) + group_id: t.group_id, + })), }) const toggleExpanded = useCallback(() => { @@ -316,14 +332,24 @@ export const TemplateGroup: React.FC = ({ const groupId = group?.id || 'ungrouped' return ( -
+
{/* Заголовок группы */} -
-
+
+
- + {isExpanded ? ( - + ) : ( - + )} - +

{groupName}

- - + + {templates.length} - {showEmptyState && templates.length === 0 && " (отфильтровано)"} + {showEmptyState && templates.length === 0 && ' (отфильтровано)'}
@@ -405,9 +436,7 @@ export const TemplateGroup: React.FC = ({

Нет результатов

-

- Попробуйте изменить фильтры -

+

Попробуйте изменить фильтры

@@ -428,4 +457,4 @@ export const TemplateGroup: React.FC = ({ )}
) -} \ No newline at end of file +} diff --git a/src/page/templates/Page.tsx b/src/page/templates/Page.tsx index c3371c0..10377dd 100644 --- a/src/page/templates/Page.tsx +++ b/src/page/templates/Page.tsx @@ -6,7 +6,10 @@ import { TemplateFilters, } from '@/component/TemplateManager/TemplateFilterSidebar' import { TemplateGroup } from '@/component/TemplateManager/TemplateGroup' -import { GroupProvider, useGroupContext } from '@/entity/group/model/GroupContext' +import { + GroupProvider, + useGroupContext, +} from '@/entity/group/model/GroupContext' import { apiTemplateWithAttributesToTemplate, getTemplateWithAttributesApi, @@ -14,7 +17,10 @@ import { import { useCategoryContext } from '@/entity/template/model/CategoryContext' import { useTemplateContext } from '@/entity/template/model/TemplateContext' import { useTemplateOrderState } from '@/hook/useTemplateOrderState' -import { generateInitialOrder, groupTemplatesByGroup } from '@/lib/template-order' +import { + generateInitialOrder, + groupTemplatesByGroup, +} from '@/lib/template-order' import { Group, Template, TemplateAttributeDetail } from '@/type/template' import TemplateCard from '@/widget/template/ui/TemplateCard' import { @@ -29,10 +35,7 @@ import { useSensor, useSensors, } from '@dnd-kit/core' -import { - arrayMove, - sortableKeyboardCoordinates, -} from '@dnd-kit/sortable' +import { arrayMove, sortableKeyboardCoordinates } from '@dnd-kit/sortable' import clsx from 'clsx' import { CheckSquare, @@ -55,7 +58,7 @@ import { DialogContent, DialogDescription, DialogHeader, - DialogTitle + DialogTitle, } from 'shared/ui/dialog' import { Input } from 'shared/ui/input' import { @@ -216,14 +219,18 @@ const TemplateForm: React.FC = ({ className="h-9" />
- + {/* Селектор группы */} {showGroupSelector && onGroupChange && (
- +