import React from 'react'; import { FolderIcon, EditIcon, DownloadIcon, TrashIcon, } from '../ui/icons'; import { getTagColorStyle } from '../utils/colors'; import DocumentThumbnailImage from './DocumentThumbnailImage'; import CorrespondentLinks from './CorrespondentLinks'; import { resolveCorrespondents } from './correspondents'; import { writeTagTransferData } from './tagTransfer'; const DocumentsList = ({ entries, focusedRowKey, selectedDocumentIdsSet, selectedFolderIdsSet, draggingDocumentIdsSet, draggedFolderId, ensureAssetUrl, getDocumentAsset, getDownloadHref, onFolderClick, onFolderSelect, onFolderDragOver, onFolderDragLeave, onFolderDrop, onFolderDragStart, onFolderDragEnd, onFolderRename, onFolderDelete, onDocumentClick, onDocumentOpen, onDocumentDragStart, onDocumentDragEnd, onDocumentTagDragOver, onDocumentTagDragLeave, onDocumentTagDrop, onDocumentRename, onDocumentDelete, tagLookupById, onTagClick, onCorrespondentClick, activeCorrespondentIdSet, scrollRef, }) => ( {entries.map((entry) => { if (entry.type === 'folder') { const folder = entry.folder; if (!folder) { return null; } const canDragFolder = folder.id !== 'root'; const isDraggingFolder = draggedFolderId === folder.id; const isSelectedFolder = selectedFolderIdsSet?.has(folder.id); const rowKey = `folder:${folder.id}`; return ( onFolderClick?.(folder, event)} onDoubleClick={(event) => { event.preventDefault(); onFolderSelect?.(folder.id); }} onDragOver={(event) => onFolderDragOver?.(event, folder.id)} onDragLeave={onFolderDragLeave} onDrop={(event) => onFolderDrop?.(event, folder.id)} draggable={canDragFolder} onDragStart={(event) => { if (canDragFolder) { onFolderDragStart?.(event, folder.id); } }} onDragEnd={(event) => { if (canDragFolder) { onFolderDragEnd?.(event); } }} > ); } const doc = entry.document; if (!doc) { return null; } const isSelected = selectedDocumentIdsSet?.has(doc.id); const isDraggingDoc = draggingDocumentIdsSet?.has(doc.id); const rowClasses = ['document']; if (isSelected) rowClasses.push('selected'); if (isDraggingDoc) rowClasses.push('is-dragging'); const downloadHref = getDownloadHref?.(doc) || null; const correspondents = resolveCorrespondents(doc); return ( onDocumentClick?.(doc, event)} onDoubleClick={() => onDocumentOpen?.(doc.id)} draggable onDragStart={(event) => onDocumentDragStart?.(event, doc)} onDragEnd={(event) => onDocumentDragEnd?.(event)} onDragOver={onDocumentTagDragOver} onDragLeave={onDocumentTagDragLeave} onDrop={(event) => onDocumentTagDrop?.(event, doc.id)} > ); })}
Name Issued Actions
{folder.name}
{folder.id !== 'root' && onFolderRename && ( )}
{correspondents.length > 0 ? ( ) : null} {doc.title}
{(doc.tags || []).length > 0 && (
{(doc.tags || []).map((tag) => { const colorSource = tag?.color || tagLookupById?.get(tag.id)?.color; const style = getTagColorStyle(colorSource); return ( { event.stopPropagation(); onTagClick?.(tag.id); }} draggable onDragStart={(event) => { event.stopPropagation(); try { if (event.dataTransfer) { event.dataTransfer.effectAllowed = 'copyMove'; } } catch (error) { console.warn('[documents] Failed to configure drag effect', error); } writeTagTransferData(event.dataTransfer, tag, doc.id); }} onDragEnd={(event) => { event.stopPropagation(); }} onKeyDown={(event) => { if (event.key === 'Enter' || event.key === ' ') { event.preventDefault(); event.stopPropagation(); onTagClick?.(tag.id); } }} > {tag.label} ); })}
)}
{(() => { const issuedAt = doc.issued_at || null; if (!issuedAt) { return '—'; } const timestamp = Date.parse(issuedAt); if (Number.isNaN(timestamp)) { return '—'; } return new Date(timestamp).toLocaleDateString(); })()}
{onDocumentRename && ( )} {downloadHref ? ( event.stopPropagation()} onAuxClick={(event) => event.stopPropagation()} onContextMenu={(event) => event.stopPropagation()} > ) : ( No download )}
); export default DocumentsList;