import React, { useEffect, useRef, useState, useCallback } from 'react'; import BookmarkRow from './BookmarkRow.jsx'; import AddBookmarkForm from './AddBookmarkForm.jsx'; export default function Column({ column, columns, tabs, bookmarks, claudeAvailable, inspectRevision, recentColors, buttonVisibility, canMoveLeft, canMoveRight, onAdd, onEdit, onRemove, onMoveBookmark, onRenameColumn, onRemoveColumn, onMoveColumnToTab, onMoveLeft, onMoveRight, onRequestConfirm, }) { const [renaming, setRenaming] = useState(false); const [draftName, setDraftName] = useState(column.name); const [menuOpen, setMenuOpen] = useState(false); const [moveTabOpen, setMoveTabOpen] = useState(false); const [addOpen, setAddOpen] = useState(false); const menuRef = useRef(null); const handleAddSubmitted = useCallback(async (payload) => { await onAdd(payload); setAddOpen(false); }, [onAdd]); useEffect(() => { setDraftName(column.name); }, [column.name]); useEffect(() => { if (!menuOpen) return undefined; const onClick = (e) => { if (menuRef.current && !menuRef.current.contains(e.target)) { setMenuOpen(false); setMoveTabOpen(false); } }; document.addEventListener('mousedown', onClick); return () => document.removeEventListener('mousedown', onClick); }, [menuOpen]); const submitRename = async () => { const name = draftName.trim(); if (!name || name === column.name) { setRenaming(false); setDraftName(column.name); return; } await onRenameColumn(column.id, name); setRenaming(false); }; const handleDelete = () => { setMenuOpen(false); const count = bookmarks.length; const otherCols = columns.filter((c) => c.id !== column.id); const ask = onRequestConfirm || ((opts) => { if (window.confirm(`${opts.title}\n\n${opts.message || ''}`)) opts.onConfirm(); }); if (count === 0) { ask({ title: `Delete column "${column.name}"?`, message: 'This column has no bookmarks. It will be removed.', confirmLabel: 'Delete column', confirmKind: 'danger', onConfirm: () => onRemoveColumn(column.id), }); return; } if (otherCols.length === 0) { const word = count === 1 ? 'bookmark' : 'bookmarks'; ask({ title: `Delete column "${column.name}"?`, message: `This will permanently delete ${count} ${word}.`, confirmLabel: 'Delete everything', confirmKind: 'danger', onConfirm: () => onRemoveColumn(column.id), }); return; } const target = otherCols[0]; const word = count === 1 ? 'bookmark' : 'bookmarks'; ask({ title: `Delete column "${column.name}"?`, message: `This column has ${count} ${word}. Move them to "${target.name}", or delete everything?`, confirmLabel: `Move to "${target.name}"`, confirmKind: 'primary', extraActions: [ { label: 'Delete with bookmarks', kind: 'danger', onClick: () => onRemoveColumn(column.id), }, ], onConfirm: () => onRemoveColumn(column.id, target.id), }); }; const otherTabs = (tabs || []).filter((t) => t.id !== column.tabId); return (
{!renaming ? (

setRenaming(true)} >{column.name}

) : ( setDraftName(e.target.value)} onBlur={submitRename} onKeyDown={(e) => { if (e.key === 'Enter') submitRename(); else if (e.key === 'Escape') { setRenaming(false); setDraftName(column.name); } }} /> )}
{menuOpen && (
{otherTabs.length > 0 && onMoveColumnToTab && ( moveTabOpen ? (
Move to tab
{otherTabs.map((t) => ( ))}
) : ( ) )}
)}
{bookmarks.length === 0 ? (
No bookmarks here yet.
) : ( )} {addOpen ? ( setAddOpen(false)} /> ) : ( )}
); }