Fix file manager view mode toggle - add grid and list view support
- Added viewMode prop to FileManagerGrid component - Implemented list view layout with detailed file information - Updated icon sizing for different view modes (8px for grid, 6px for list) - Added proper file metadata display in list view (size, permissions, modified date) - Connected view mode state from FileManagerModern to FileManagerGrid - Both grid and list view buttons now fully functional
This commit is contained in:
@@ -42,15 +42,17 @@ interface FileManagerGridProps {
|
|||||||
onRefresh: () => void;
|
onRefresh: () => void;
|
||||||
onUpload?: (files: FileList) => void;
|
onUpload?: (files: FileList) => void;
|
||||||
onContextMenu?: (event: React.MouseEvent, file?: FileItem) => void;
|
onContextMenu?: (event: React.MouseEvent, file?: FileItem) => void;
|
||||||
|
viewMode?: 'grid' | 'list';
|
||||||
}
|
}
|
||||||
|
|
||||||
const getFileIcon = (fileName: string, isDirectory: boolean) => {
|
const getFileIcon = (fileName: string, isDirectory: boolean, viewMode: 'grid' | 'list' = 'grid') => {
|
||||||
|
const iconClass = viewMode === 'grid' ? "w-8 h-8" : "w-6 h-6";
|
||||||
|
|
||||||
if (isDirectory) {
|
if (isDirectory) {
|
||||||
return <Folder className="w-8 h-8 text-blue-400" />;
|
return <Folder className={`${iconClass} text-blue-400`} />;
|
||||||
}
|
}
|
||||||
|
|
||||||
const ext = fileName.split('.').pop()?.toLowerCase();
|
const ext = fileName.split('.').pop()?.toLowerCase();
|
||||||
const iconClass = "w-8 h-8";
|
|
||||||
|
|
||||||
switch (ext) {
|
switch (ext) {
|
||||||
case 'txt':
|
case 'txt':
|
||||||
@@ -126,7 +128,8 @@ export function FileManagerGrid({
|
|||||||
onPathChange,
|
onPathChange,
|
||||||
onRefresh,
|
onRefresh,
|
||||||
onUpload,
|
onUpload,
|
||||||
onContextMenu
|
onContextMenu,
|
||||||
|
viewMode = 'grid'
|
||||||
}: FileManagerGridProps) {
|
}: FileManagerGridProps) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const gridRef = useRef<HTMLDivElement>(null);
|
const gridRef = useRef<HTMLDivElement>(null);
|
||||||
@@ -437,7 +440,7 @@ export function FileManagerGrid({
|
|||||||
<p>{t("fileManager.emptyFolder")}</p>
|
<p>{t("fileManager.emptyFolder")}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : viewMode === 'grid' ? (
|
||||||
<div className="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-6 xl:grid-cols-8 gap-4">
|
<div className="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-6 xl:grid-cols-8 gap-4">
|
||||||
{files.map((file) => {
|
{files.map((file) => {
|
||||||
const isSelected = selectedFiles.some(f => f.path === file.path);
|
const isSelected = selectedFiles.some(f => f.path === file.path);
|
||||||
@@ -472,7 +475,7 @@ export function FileManagerGrid({
|
|||||||
<div className="flex flex-col items-center text-center">
|
<div className="flex flex-col items-center text-center">
|
||||||
{/* 文件图标 */}
|
{/* 文件图标 */}
|
||||||
<div className="mb-2">
|
<div className="mb-2">
|
||||||
{getFileIcon(file.name, file.type === 'directory')}
|
{getFileIcon(file.name, file.type === 'directory', viewMode)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* 文件名 */}
|
{/* 文件名 */}
|
||||||
@@ -491,6 +494,65 @@ export function FileManagerGrid({
|
|||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
</div>
|
</div>
|
||||||
|
) : (
|
||||||
|
/* 列表视图 */
|
||||||
|
<div className="space-y-1">
|
||||||
|
{files.map((file) => {
|
||||||
|
const isSelected = selectedFiles.some(f => f.path === file.path);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
key={file.path}
|
||||||
|
className={cn(
|
||||||
|
"flex items-center gap-3 p-2 rounded cursor-pointer transition-all",
|
||||||
|
"hover:bg-dark-hover",
|
||||||
|
isSelected && "bg-blue-500/20"
|
||||||
|
)}
|
||||||
|
onClick={(e) => handleFileClick(file, e)}
|
||||||
|
onContextMenu={(e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
onContextMenu?.(e, file);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{/* 文件图标 */}
|
||||||
|
<div className="flex-shrink-0">
|
||||||
|
{getFileIcon(file.name, file.type === 'directory', viewMode)}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* 文件信息 */}
|
||||||
|
<div className="flex-1 min-w-0">
|
||||||
|
<p className="text-sm text-white truncate" title={file.name}>
|
||||||
|
{file.name}
|
||||||
|
</p>
|
||||||
|
{file.modified && (
|
||||||
|
<p className="text-xs text-muted-foreground">
|
||||||
|
{file.modified}
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* 文件大小 */}
|
||||||
|
<div className="flex-shrink-0 text-right">
|
||||||
|
{file.type === 'file' && file.size && (
|
||||||
|
<p className="text-xs text-muted-foreground">
|
||||||
|
{formatFileSize(file.size)}
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* 权限信息 */}
|
||||||
|
<div className="flex-shrink-0 text-right w-20">
|
||||||
|
{file.permissions && (
|
||||||
|
<p className="text-xs text-muted-foreground font-mono">
|
||||||
|
{file.permissions}
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -504,6 +504,7 @@ export function FileManagerModern({ initialHost, onClose }: FileManagerModernPro
|
|||||||
onRefresh={() => loadDirectory(currentPath)}
|
onRefresh={() => loadDirectory(currentPath)}
|
||||||
onUpload={handleFilesDropped}
|
onUpload={handleFilesDropped}
|
||||||
onContextMenu={handleContextMenu}
|
onContextMenu={handleContextMenu}
|
||||||
|
viewMode={viewMode}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
{/* 右键菜单 */}
|
{/* 右键菜单 */}
|
||||||
|
|||||||
Reference in New Issue
Block a user