diff --git a/smoosense-gui/src/components/folder-browser/FolderTreeView.tsx b/smoosense-gui/src/components/folder-browser/FolderTreeView.tsx index 2b028ea..b69f2ca 100644 --- a/smoosense-gui/src/components/folder-browser/FolderTreeView.tsx +++ b/smoosense-gui/src/components/folder-browser/FolderTreeView.tsx @@ -68,6 +68,7 @@ export default function FolderTreeView() { isDir: false, size: 0, lastModified: 0, + isBrokenSymlink: false, isLoaded: false, loading: false, isExpanded: false, @@ -85,6 +86,8 @@ export default function FolderTreeView() { isDir: node.isDir, size: node.size, lastModified: node.lastModified, + isBrokenSymlink: node.isBrokenSymlink, + symlinkTarget: node.symlinkTarget, isLoaded: node.isLoaded, loading: node.loading, isExpanded: node.isExpanded, diff --git a/smoosense-gui/src/components/folder-browser/TreeNodeComponent.tsx b/smoosense-gui/src/components/folder-browser/TreeNodeComponent.tsx index a650c91..53c7608 100644 --- a/smoosense-gui/src/components/folder-browser/TreeNodeComponent.tsx +++ b/smoosense-gui/src/components/folder-browser/TreeNodeComponent.tsx @@ -17,6 +17,8 @@ export interface ArboristNodeData { isDir: boolean size: number lastModified: number + isBrokenSymlink: boolean + symlinkTarget?: string isLoaded: boolean loading: boolean isExpanded: boolean @@ -114,6 +116,10 @@ export default function TreeNodeComponent({ node, style }: TreeNodeComponentProp }, [nodeData.path, dispatch]) const renderIcon = () => { + if (nodeData.isBrokenSymlink) { + return ICONS.BROKEN_SYMLINK + } + if (nodeData.isDir) { return node.isOpen ? ICONS.FOLDER_OPEN : ICONS.FOLDER_CLOSED } @@ -228,8 +234,19 @@ export default function TreeNodeComponent({ node, style }: TreeNodeComponentProp > {renderExpandIcon()} {renderIcon()} - - {nodeData.name} + + {nodeData.symlinkTarget + ? `${nodeData.name} (→ ${nodeData.symlinkTarget})` + : nodeData.name} {/* File info display */} diff --git a/smoosense-gui/src/lib/features/folderTree/folderTreeSlice.ts b/smoosense-gui/src/lib/features/folderTree/folderTreeSlice.ts index c27acf6..2772966 100644 --- a/smoosense-gui/src/lib/features/folderTree/folderTreeSlice.ts +++ b/smoosense-gui/src/lib/features/folderTree/folderTreeSlice.ts @@ -10,6 +10,8 @@ export interface FSItem { size: number lastModified: number isDir: boolean + isBrokenSymlink?: boolean + symlinkTarget?: string } export type SortBy = 'name' | 'size' | 'modified' @@ -22,6 +24,8 @@ export interface TreeNode { isDir: boolean size: number lastModified: number + isBrokenSymlink: boolean + symlinkTarget: string children?: TreeNode[] childrenTotal: number // 0 = unknown/not loaded yet isLoaded: boolean @@ -107,6 +111,8 @@ function createTreeNode(item: FSItem, parentPath: string): TreeNode { isDir: item.isDir, size: item.size, lastModified: item.lastModified, + isBrokenSymlink: item.isBrokenSymlink ?? false, + symlinkTarget: item.symlinkTarget ?? '', children: item.isDir ? [] : undefined, childrenTotal: 0, isLoaded: false, diff --git a/smoosense-gui/src/lib/utils/iconUtils.tsx b/smoosense-gui/src/lib/utils/iconUtils.tsx index 5d46908..19a1282 100644 --- a/smoosense-gui/src/lib/utils/iconUtils.tsx +++ b/smoosense-gui/src/lib/utils/iconUtils.tsx @@ -2,6 +2,7 @@ import { Folder, FolderOpen, File, + FileX, Braces, Columns3, Rows3, @@ -29,6 +30,7 @@ export const ICONS = { VIDEO: