import { useEffect } from 'react' import { useDroppable } from '@dnd-kit/core' import { SortableContext, verticalListSortingStrategy, } from '@dnd-kit/sortable' import { PlusIcon } from 'lucide-react' import { ServiceGroupHeader } from '@/components/services-board/service-group-header' import { ServiceRow } from '@/components/services-board/service-row' import type { BoardColumn } from '@/components/services-board/types' import type { ServiceGroupView, ServiceView } from '@/lib/schemas' import { AppAccordionContent, AppAccordionItem, } from '@/components/app-accordion' import { AppButton } from '@/components/app-button' import { Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyTitle, } from '@cfdm/ui/components/empty' import { AppItemGroup, AppItemSeparator } from '@/components/app-item' import { cn } from '@cfdm/ui/lib/utils' interface ServiceGroupItemProps { column: BoardColumn isOpen?: boolean isDragging?: boolean onExpandColumn?: (columnId: string) => void onGroupToggle?: (groupId: number, enabled: boolean) => void onEditGroup?: (group: ServiceGroupView) => void onDeleteGroup?: (group: ServiceGroupView) => void onAddService?: (groupId: number | null) => void onServiceToggle: (serviceId: number, enabled: boolean) => void onEditService: (service: ServiceView) => void onDeleteService: (service: ServiceView) => void togglingGroupId?: number | null togglingServiceId?: number | null dragDisabled?: boolean showCheckbox?: boolean isSelected?: (id: number) => boolean onSelectedChange?: (id: number, selected: boolean) => void isAllSelected?: (ids: number[]) => boolean isSomeSelected?: (ids: number[]) => boolean onSelectAllInGroup?: (ids: number[]) => void onDeselectAllInGroup?: (ids: number[]) => void } export function ServiceGroupItem({ column, isOpen = true, isDragging = false, onExpandColumn, onGroupToggle, onEditGroup, onDeleteGroup, onAddService, onServiceToggle, onEditService, onDeleteService, togglingGroupId = null, togglingServiceId = null, dragDisabled = false, showCheckbox = false, isSelected, onSelectedChange, isAllSelected, isSomeSelected, onSelectAllInGroup, onDeselectAllInGroup, }: ServiceGroupItemProps) { const { setNodeRef, isOver } = useDroppable({ id: column.id, disabled: dragDisabled, }) const isGroupToggling = column.groupId !== null && togglingGroupId === column.groupId const serviceDisabled = Boolean(column.domain) && !column.enabled const serviceIds = column.items.map((s) => s.id) const groupAllSelected = isAllSelected?.(serviceIds) ?? false const groupSomeSelected = isSomeSelected?.(serviceIds) ?? false useEffect(() => { if (isOver && isDragging && !dragDisabled) { onExpandColumn?.(column.id) } }, [isOver, isDragging, dragDisabled, column.id, onExpandColumn]) return (
String(service.id))} strategy={verticalListSortingStrategy} > {column.items.length > 0 ? ( {column.items.map((service, index) => (
{index > 0 ? : null} onSelectedChange?.(service.id, selected) } />
))}
) : ( Нет сервисов в группе {dragDisabled ? 'Сервисы не найдены' : 'Перетащите сервис сюда или добавьте новый'} {onAddService ? ( onAddService(column.groupId)} > Добавить сервис ) : null} )}
{column.items.length > 0 && onAddService ? ( onAddService(column.groupId)} > Добавить сервис ) : null}
) }