import { useMemo, useState } from 'react' import { StatusBadge } from './StatusBadge.jsx' import { PriorityBadge } from './PriorityBadge.jsx' import { EmptyState } from './EmptyState.jsx' import { Modal } from './Modal.jsx' import { BacklogItemForm } from './BacklogItemForm.jsx' import { ReorderControls } from './ReorderControls.jsx' import { gateTitleById } from './GateSelect.jsx' import { computeDropPatches, computeMovePatches, sortByOrder } from '../utils/reorder.js' import { useMinWidth } from '../hooks/useMinWidth.js' export function BacklogSection({ items, roadmapItems = [], canManage, onCreate, onUpdate, onReorder, onConvert, onDelete, busy, }) { const [modalMode, setModalMode] = useState(null) const [dragItemId, setDragItemId] = useState('') const [dropTargetId, setDropTargetId] = useState('') const isDesktop = useMinWidth(1024) const canReorder = canManage && typeof onReorder === 'function' const sortedItems = useMemo( () => sortByOrder(items.filter((item) => item.status !== 'converted')), [items], ) function closeModal() { setModalMode(null) } async function handleCreateSubmit(payload) { await onCreate({ title: payload.title, description: payload.description, priority: payload.priority, roadmap_item_id: payload.roadmap_item_id, status: payload.status || 'new', }) closeModal() } async function handleEditSubmit(payload) { if (!modalMode?.item) return const ok = await onUpdate(modalMode.item.id, { title: payload.title, description: payload.description, status: payload.status, priority: payload.priority, roadmap_item_id: payload.roadmap_item_id, clear_roadmap_item: payload.clear_roadmap_item, }) if (ok !== false) closeModal() } async function applyPatches(patches) { if (!patches.length) return await onReorder(patches) } async function handleMove(itemId, direction) { const patches = computeMovePatches(sortedItems, itemId, direction) await applyPatches(patches) } function handleDragStart(event, itemId) { if (!canReorder || !isDesktop) return setDragItemId(itemId) event.dataTransfer.effectAllowed = 'move' event.dataTransfer.setData('text/plain', itemId) } function handleDragEnd() { setDragItemId('') setDropTargetId('') } function handleDragOver(event, itemId) { if (!canReorder || !isDesktop || !dragItemId) return event.preventDefault() event.dataTransfer.dropEffect = 'move' setDropTargetId(itemId) } async function handleDrop(event, targetId) { event.preventDefault() if (!canReorder || !isDesktop || !dragItemId) { handleDragEnd() return } const patches = computeDropPatches(sortedItems, dragItemId, targetId) handleDragEnd() await applyPatches(patches) } const modalTitle = modalMode?.kind === 'create' ? 'Backlog-Item anlegen' : 'Backlog-Item bearbeiten' return (

Backlog

Reihenfolge per Drag & Drop (Desktop) oder ↑/↓ (Mobile).

{canManage && ( )}
{items.length === 0 && } {modalMode?.kind === 'create' && ( )} {modalMode?.kind === 'edit' && modalMode.item && ( )}
) }