import { useRef } from 'react'; import { IoChevronDown, IoChevronUp, IoDuplicateOutline, IoEllipsisHorizontal, IoFolderOpenOutline, IoReorderTwo, IoTrash, } from 'react-icons/io5'; import { IconButton, Menu, MenuButton, MenuItem, MenuList, Portal } from '@chakra-ui/react'; import { useSortable } from '@dnd-kit/sortable'; import { CSS } from '@dnd-kit/utilities'; import { EntryId, OntimeBlock } from 'ontime-types'; import { useEntryActions } from '../../../common/hooks/useEntryAction'; import { cx, getAccessibleColour } from '../../../common/utils/styleUtils'; import { formatDuration, formatTime } from '../../../common/utils/time'; import EditableBlockTitle from '../common/EditableBlockTitle'; import { canDrop } from '../rundown.utils'; import style from './BlockBlock.module.scss'; interface BlockBlockProps { data: OntimeBlock; hasCursor: boolean; collapsed: boolean; onCollapse: (collapsed: boolean, groupId: EntryId) => void; } export default function BlockBlock(props: BlockBlockProps) { const { data, hasCursor, collapsed, onCollapse } = props; const handleRef = useRef(null); const { clone, dissolveBlock, deleteEntry } = useEntryActions(); const { attributes: dragAttributes, listeners: dragListeners, setNodeRef, transform, transition, isDragging, isOver, over, } = useSortable({ id: data.id, data: { type: 'block', }, animateLayoutChanges: () => false, }); const binderColours = data.colour && getAccessibleColour(data.colour); const isValidDrop = over?.id && canDrop(over.data.current?.type, over.data.current?.parent); const dragStyle = { zIndex: isDragging ? 2 : 'inherit', transform: CSS.Translate.toString(transform), transition, cursor: isOver ? (isValidDrop ? 'grabbing' : 'no-drop') : 'default', }; const hasChildren = data.events.length > 0; return (
} color='#e2e2e2' // $gray-200 variant='ontime-ghosted' size='sm' /> } onClick={() => clone(data.id)}> Clone Block {hasChildren && ( } onClick={() => dissolveBlock(data.id)}> Dissolve Block )} } onClick={() => deleteEntry([data.id])}> Delete Block onCollapse(!collapsed, data.id)} color='#e2e2e2' // $gray-200 variant='ontime-ghosted' size='sm' > {collapsed ? : }
Start
{formatTime(data.startTime)}
End
{formatTime(data.endTime)}
Duration
{formatDuration(data.duration)}
Events
{data.events.length}
); }