mirror of
https://github.com/siteboon/claudecodeui.git
synced 2026-06-11 00:06:00 +08:00
# Features - File drag and drop upload: Support uploading files and folders via drag and drop - Binary file handling: Detect binary files and display a friendly message instead of trying to edit them - Folder download: Download folders as ZIP files (using JSZip library) - Context menu integration: Full right-click context menu for file operations (rename, delete, copy path, download, new file/folder)
85 lines
2.4 KiB
TypeScript
85 lines
2.4 KiB
TypeScript
import type { ReactNode, RefObject } from 'react';
|
|
import type { FileTreeNode as FileTreeNodeType, FileTreeViewMode } from '../types/types';
|
|
import FileTreeNode from './FileTreeNode';
|
|
|
|
type FileTreeListProps = {
|
|
items: FileTreeNodeType[];
|
|
viewMode: FileTreeViewMode;
|
|
expandedDirs: Set<string>;
|
|
onItemClick: (item: FileTreeNodeType) => void;
|
|
renderFileIcon: (filename: string) => ReactNode;
|
|
formatFileSize: (bytes?: number) => string;
|
|
formatRelativeTime: (date?: string) => string;
|
|
onRename?: (item: FileTreeNodeType) => void;
|
|
onDelete?: (item: FileTreeNodeType) => void;
|
|
onNewFile?: (path: string) => void;
|
|
onNewFolder?: (path: string) => void;
|
|
onCopyPath?: (item: FileTreeNodeType) => void;
|
|
onDownload?: (item: FileTreeNodeType) => void;
|
|
onRefresh?: () => void;
|
|
// Rename state for inline editing
|
|
renamingItem?: FileTreeNodeType | null;
|
|
renameValue?: string;
|
|
setRenameValue?: (value: string) => void;
|
|
handleConfirmRename?: () => void;
|
|
handleCancelRename?: () => void;
|
|
renameInputRef?: RefObject<HTMLInputElement>;
|
|
operationLoading?: boolean;
|
|
};
|
|
|
|
export default function FileTreeList({
|
|
items,
|
|
viewMode,
|
|
expandedDirs,
|
|
onItemClick,
|
|
renderFileIcon,
|
|
formatFileSize,
|
|
formatRelativeTime,
|
|
onRename,
|
|
onDelete,
|
|
onNewFile,
|
|
onNewFolder,
|
|
onCopyPath,
|
|
onDownload,
|
|
onRefresh,
|
|
renamingItem,
|
|
renameValue,
|
|
setRenameValue,
|
|
handleConfirmRename,
|
|
handleCancelRename,
|
|
renameInputRef,
|
|
operationLoading,
|
|
}: FileTreeListProps) {
|
|
return (
|
|
<div>
|
|
{items.map((item) => (
|
|
<FileTreeNode
|
|
key={item.path}
|
|
item={item}
|
|
level={0}
|
|
viewMode={viewMode}
|
|
expandedDirs={expandedDirs}
|
|
onItemClick={onItemClick}
|
|
renderFileIcon={renderFileIcon}
|
|
formatFileSize={formatFileSize}
|
|
formatRelativeTime={formatRelativeTime}
|
|
onRename={onRename}
|
|
onDelete={onDelete}
|
|
onNewFile={onNewFile}
|
|
onNewFolder={onNewFolder}
|
|
onCopyPath={onCopyPath}
|
|
onDownload={onDownload}
|
|
onRefresh={onRefresh}
|
|
renamingItem={renamingItem}
|
|
renameValue={renameValue}
|
|
setRenameValue={setRenameValue}
|
|
handleConfirmRename={handleConfirmRename}
|
|
handleCancelRename={handleCancelRename}
|
|
renameInputRef={renameInputRef}
|
|
operationLoading={operationLoading}
|
|
/>
|
|
))}
|
|
</div>
|
|
);
|
|
}
|