import React, { useMemo } from 'react'; import { useDroppable } from '@dnd-kit/core'; import { clsx } from 'clsx'; import { differenceInHours } from 'date-fns'; import { calculateLayout, Event } from '../../lib/layoutAlgorithm'; import { DraggableEvent } from './DraggableEvent'; import { getPosition } from '../../lib/timelineUtils'; interface ResourceRowProps { resourceId: number; resourceName: string; events: Event[]; startTime: Date; endTime: Date; hourWidth: number; eventHeight: number; onResizeStart: (e: React.MouseEvent, direction: 'left' | 'right', id: number) => void; } const ResourceRow: React.FC = ({ resourceId, resourceName, events, startTime, endTime, hourWidth, eventHeight, onResizeStart, }) => { const { setNodeRef, isOver } = useDroppable({ id: `resource-${resourceId}`, data: { resourceId }, }); const eventsWithLanes = useMemo(() => calculateLayout(events), [events]); const maxLane = Math.max(0, ...eventsWithLanes.map(e => e.laneIndex || 0)); const rowHeight = (maxLane + 1) * eventHeight + 20; const totalWidth = getPosition(endTime, startTime, hourWidth); // Calculate total hours for grid lines const totalHours = Math.ceil(differenceInHours(endTime, startTime)); return (
{resourceName}
{/* Grid Lines */}
{Array.from({ length: totalHours }).map((_, i) => (
))}
{/* Events */} {eventsWithLanes.map((event) => { const left = getPosition(event.start, startTime, hourWidth); const width = getPosition(event.end, startTime, hourWidth) - left; const top = (event.laneIndex || 0) * eventHeight + 10; return ( ); })}
); }; export default ResourceRow;