import React from 'react'; import { FolderIcon, CheckIcon, CloseIcon } from '../ui/icons'; import { getTagColorStyle } from '../utils/colors'; import DocumentThumbnailImage from './DocumentThumbnailImage'; import CorrespondentLinks from './CorrespondentLinks'; import { resolveCorrespondents } from './correspondents'; import { writeTagTransferData } from './tagTransfer'; import useInlineRename from './useInlineRename'; const formatDate = (value) => { if (!value) { return "—"; } const timestamp = Date.parse(value); if (Number.isNaN(timestamp)) { return "—"; } return new Date(timestamp).toLocaleDateString(); }; const DocumentsList = ({ entries, focusedRowKey, selectedDocumentIdsSet, selectedFolderIdsSet, draggingDocumentIdsSet, draggedFolderId, ensureAssetUrl, getDocumentAsset, onFolderClick, onFolderSelect, onFolderDragOver, onFolderDragLeave, onFolderDrop, onFolderDragStart, onFolderDragEnd, onFolderRename, onDocumentClick, onDocumentOpen, onDocumentDragStart, onDocumentDragEnd, onDocumentTagDragOver, onDocumentTagDragLeave, onDocumentTagDrop, onDocumentRename, tagLookupById, onTagClick, onCorrespondentClick, activeCorrespondentIdSet, scrollRef, onClearSelection, }) => { const { editingId: editingDocumentId, draftValue: documentDraft, setDraftValue: setDocumentDraft, beginEditing: beginDocumentEditing, cancelEditing: cancelDocumentEditing, submitEditing: submitDocumentEditing, savingId: savingDocumentId, attachInputRef: attachDocumentInputRef, } = useInlineRename(onDocumentRename, { getCurrentValue: (doc) => doc?.title ?? '', getEntityId: (doc) => doc?.id ?? null, }); const { editingId: editingFolderId, draftValue: folderDraft, setDraftValue: setFolderDraft, beginEditing: beginFolderEditing, cancelEditing: cancelFolderEditing, submitEditing: submitFolderEditing, savingId: savingFolderId, attachInputRef: attachFolderInputRef, } = useInlineRename(onFolderRename, { getCurrentValue: (folder) => folder?.name ?? '', getEntityId: (folder) => folder?.id ?? null, }); const documentSelectionCount = selectedDocumentIdsSet?.size ?? 0; const folderSelectionCount = selectedFolderIdsSet?.size ?? 0; const totalSelectionCount = documentSelectionCount + folderSelectionCount; return (
| Name | Issued | Added | |
|---|---|---|---|
|
|
{isFolderEditing ? (
setFolderDraft(event.target.value)}
onClick={(event) => event.stopPropagation()}
onKeyDown={(event) => {
if (event.key === 'Enter') {
event.preventDefault();
submitFolderEditing(folder);
} else if (event.key === 'Escape') {
event.preventDefault();
cancelFolderEditing(event);
}
}}
onBlur={(event) => {
const nextFocus = event.relatedTarget;
if (!nextFocus || !event.currentTarget.parentElement?.contains(nextFocus)) {
cancelFolderEditing();
}
}}
/>
) : (
{
if (!allowInlineFolderEdit) {
return;
}
event.preventDefault();
event.stopPropagation();
beginFolderEditing(folder);
}}
onKeyDown={(event) => {
if (!allowInlineFolderEdit) {
return;
}
if (event.key === 'Enter') {
event.preventDefault();
event.stopPropagation();
beginFolderEditing(folder);
}
}}
>
{folder.name}
)}
|
— | — |
|
|
{correspondents.length > 0 ? (
{(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}
);
})}
)}
|
{issuedLabel} | {addedLabel} |