From 0db150eed7fbb75e13ac87d239a69adca33ed974 Mon Sep 17 00:00:00 2001 From: Col0ring <1561999073@qq.com> Date: Tue, 15 Sep 2026 17:37:25 +0800 Subject: [PATCH 1/3] feat(webui): expand the file-type icon set - add language, config, data and framework icons and drop the merged `web` icon - tighten the existing java, js, py and txt icons and the media badges --- webui/frontend/app/assets/files/c.svg | 1 + webui/frontend/app/assets/files/config.svg | 1 + webui/frontend/app/assets/files/cpp.svg | 1 + webui/frontend/app/assets/files/csharp.svg | 1 + webui/frontend/app/assets/files/css.svg | 1 + webui/frontend/app/assets/files/database.svg | 1 + webui/frontend/app/assets/files/docker.svg | 1 + webui/frontend/app/assets/files/git.svg | 1 + webui/frontend/app/assets/files/go.svg | 1 + webui/frontend/app/assets/files/html.svg | 1 + webui/frontend/app/assets/files/java.svg | 2 +- webui/frontend/app/assets/files/js.svg | 2 +- webui/frontend/app/assets/files/json.svg | 1 + webui/frontend/app/assets/files/kotlin.svg | 1 + webui/frontend/app/assets/files/less.svg | 1 + webui/frontend/app/assets/files/php.svg | 1 + webui/frontend/app/assets/files/py.svg | 2 +- webui/frontend/app/assets/files/ruby.svg | 1 + webui/frontend/app/assets/files/rust.svg | 1 + webui/frontend/app/assets/files/sass.svg | 1 + webui/frontend/app/assets/files/shell.svg | 1 + webui/frontend/app/assets/files/svelte.svg | 1 + webui/frontend/app/assets/files/swift.svg | 1 + webui/frontend/app/assets/files/ts.svg | 1 + webui/frontend/app/assets/files/txt.svg | 2 +- webui/frontend/app/assets/files/vue.svg | 1 + webui/frontend/app/assets/files/web.svg | 1 - webui/frontend/app/assets/files/xml.svg | 1 + webui/frontend/app/assets/files/yaml.svg | 1 + webui/frontend/app/assets/icons/audio.svg | 2 +- webui/frontend/app/assets/icons/image.svg | 2 +- webui/frontend/app/assets/icons/video.svg | 2 +- 32 files changed, 31 insertions(+), 8 deletions(-) create mode 100644 webui/frontend/app/assets/files/c.svg create mode 100644 webui/frontend/app/assets/files/config.svg create mode 100644 webui/frontend/app/assets/files/cpp.svg create mode 100644 webui/frontend/app/assets/files/csharp.svg create mode 100644 webui/frontend/app/assets/files/css.svg create mode 100644 webui/frontend/app/assets/files/database.svg create mode 100644 webui/frontend/app/assets/files/docker.svg create mode 100644 webui/frontend/app/assets/files/git.svg create mode 100644 webui/frontend/app/assets/files/go.svg create mode 100644 webui/frontend/app/assets/files/html.svg create mode 100644 webui/frontend/app/assets/files/json.svg create mode 100644 webui/frontend/app/assets/files/kotlin.svg create mode 100644 webui/frontend/app/assets/files/less.svg create mode 100644 webui/frontend/app/assets/files/php.svg create mode 100644 webui/frontend/app/assets/files/ruby.svg create mode 100644 webui/frontend/app/assets/files/rust.svg create mode 100644 webui/frontend/app/assets/files/sass.svg create mode 100644 webui/frontend/app/assets/files/shell.svg create mode 100644 webui/frontend/app/assets/files/svelte.svg create mode 100644 webui/frontend/app/assets/files/swift.svg create mode 100644 webui/frontend/app/assets/files/ts.svg create mode 100644 webui/frontend/app/assets/files/vue.svg delete mode 100644 webui/frontend/app/assets/files/web.svg create mode 100644 webui/frontend/app/assets/files/xml.svg create mode 100644 webui/frontend/app/assets/files/yaml.svg diff --git a/webui/frontend/app/assets/files/c.svg b/webui/frontend/app/assets/files/c.svg new file mode 100644 index 000000000..fe76cf6c4 --- /dev/null +++ b/webui/frontend/app/assets/files/c.svg @@ -0,0 +1 @@ +C diff --git a/webui/frontend/app/assets/files/config.svg b/webui/frontend/app/assets/files/config.svg new file mode 100644 index 000000000..f9a5d9c31 --- /dev/null +++ b/webui/frontend/app/assets/files/config.svg @@ -0,0 +1 @@ +CFG diff --git a/webui/frontend/app/assets/files/cpp.svg b/webui/frontend/app/assets/files/cpp.svg new file mode 100644 index 000000000..6cdd95e06 --- /dev/null +++ b/webui/frontend/app/assets/files/cpp.svg @@ -0,0 +1 @@ +C++ diff --git a/webui/frontend/app/assets/files/csharp.svg b/webui/frontend/app/assets/files/csharp.svg new file mode 100644 index 000000000..57a6247de --- /dev/null +++ b/webui/frontend/app/assets/files/csharp.svg @@ -0,0 +1 @@ +C# diff --git a/webui/frontend/app/assets/files/css.svg b/webui/frontend/app/assets/files/css.svg new file mode 100644 index 000000000..795af688f --- /dev/null +++ b/webui/frontend/app/assets/files/css.svg @@ -0,0 +1 @@ +CSS diff --git a/webui/frontend/app/assets/files/database.svg b/webui/frontend/app/assets/files/database.svg new file mode 100644 index 000000000..0e1a6d4ec --- /dev/null +++ b/webui/frontend/app/assets/files/database.svg @@ -0,0 +1 @@ +SQL diff --git a/webui/frontend/app/assets/files/docker.svg b/webui/frontend/app/assets/files/docker.svg new file mode 100644 index 000000000..231b437d7 --- /dev/null +++ b/webui/frontend/app/assets/files/docker.svg @@ -0,0 +1 @@ + diff --git a/webui/frontend/app/assets/files/git.svg b/webui/frontend/app/assets/files/git.svg new file mode 100644 index 000000000..4e51543b7 --- /dev/null +++ b/webui/frontend/app/assets/files/git.svg @@ -0,0 +1 @@ + diff --git a/webui/frontend/app/assets/files/go.svg b/webui/frontend/app/assets/files/go.svg new file mode 100644 index 000000000..18127d882 --- /dev/null +++ b/webui/frontend/app/assets/files/go.svg @@ -0,0 +1 @@ +GO diff --git a/webui/frontend/app/assets/files/html.svg b/webui/frontend/app/assets/files/html.svg new file mode 100644 index 000000000..a9b268c46 --- /dev/null +++ b/webui/frontend/app/assets/files/html.svg @@ -0,0 +1 @@ +HTML diff --git a/webui/frontend/app/assets/files/java.svg b/webui/frontend/app/assets/files/java.svg index b0158a127..9a275e628 100644 --- a/webui/frontend/app/assets/files/java.svg +++ b/webui/frontend/app/assets/files/java.svg @@ -1 +1 @@ - \ No newline at end of file +JAVA diff --git a/webui/frontend/app/assets/files/js.svg b/webui/frontend/app/assets/files/js.svg index b966fdbc0..962b4de8c 100644 --- a/webui/frontend/app/assets/files/js.svg +++ b/webui/frontend/app/assets/files/js.svg @@ -1 +1 @@ - \ No newline at end of file +JS diff --git a/webui/frontend/app/assets/files/json.svg b/webui/frontend/app/assets/files/json.svg new file mode 100644 index 000000000..fb074665f --- /dev/null +++ b/webui/frontend/app/assets/files/json.svg @@ -0,0 +1 @@ +{} diff --git a/webui/frontend/app/assets/files/kotlin.svg b/webui/frontend/app/assets/files/kotlin.svg new file mode 100644 index 000000000..e171021e6 --- /dev/null +++ b/webui/frontend/app/assets/files/kotlin.svg @@ -0,0 +1 @@ +KT diff --git a/webui/frontend/app/assets/files/less.svg b/webui/frontend/app/assets/files/less.svg new file mode 100644 index 000000000..3371cbccd --- /dev/null +++ b/webui/frontend/app/assets/files/less.svg @@ -0,0 +1 @@ +LESS diff --git a/webui/frontend/app/assets/files/php.svg b/webui/frontend/app/assets/files/php.svg new file mode 100644 index 000000000..ffc988285 --- /dev/null +++ b/webui/frontend/app/assets/files/php.svg @@ -0,0 +1 @@ +PHP diff --git a/webui/frontend/app/assets/files/py.svg b/webui/frontend/app/assets/files/py.svg index 663c0430d..0611ed0ea 100644 --- a/webui/frontend/app/assets/files/py.svg +++ b/webui/frontend/app/assets/files/py.svg @@ -1 +1 @@ - \ No newline at end of file +PY diff --git a/webui/frontend/app/assets/files/ruby.svg b/webui/frontend/app/assets/files/ruby.svg new file mode 100644 index 000000000..719d27cf0 --- /dev/null +++ b/webui/frontend/app/assets/files/ruby.svg @@ -0,0 +1 @@ +RB diff --git a/webui/frontend/app/assets/files/rust.svg b/webui/frontend/app/assets/files/rust.svg new file mode 100644 index 000000000..94fbb0283 --- /dev/null +++ b/webui/frontend/app/assets/files/rust.svg @@ -0,0 +1 @@ +RS diff --git a/webui/frontend/app/assets/files/sass.svg b/webui/frontend/app/assets/files/sass.svg new file mode 100644 index 000000000..6baf76444 --- /dev/null +++ b/webui/frontend/app/assets/files/sass.svg @@ -0,0 +1 @@ +SASS diff --git a/webui/frontend/app/assets/files/shell.svg b/webui/frontend/app/assets/files/shell.svg new file mode 100644 index 000000000..d2216c85b --- /dev/null +++ b/webui/frontend/app/assets/files/shell.svg @@ -0,0 +1 @@ +>_ diff --git a/webui/frontend/app/assets/files/svelte.svg b/webui/frontend/app/assets/files/svelte.svg new file mode 100644 index 000000000..53e34bebd --- /dev/null +++ b/webui/frontend/app/assets/files/svelte.svg @@ -0,0 +1 @@ +SV diff --git a/webui/frontend/app/assets/files/swift.svg b/webui/frontend/app/assets/files/swift.svg new file mode 100644 index 000000000..e55bc0f03 --- /dev/null +++ b/webui/frontend/app/assets/files/swift.svg @@ -0,0 +1 @@ +SW diff --git a/webui/frontend/app/assets/files/ts.svg b/webui/frontend/app/assets/files/ts.svg new file mode 100644 index 000000000..ffd4a58a2 --- /dev/null +++ b/webui/frontend/app/assets/files/ts.svg @@ -0,0 +1 @@ +TS diff --git a/webui/frontend/app/assets/files/txt.svg b/webui/frontend/app/assets/files/txt.svg index 148398ea3..1d6e14a2a 100644 --- a/webui/frontend/app/assets/files/txt.svg +++ b/webui/frontend/app/assets/files/txt.svg @@ -1 +1 @@ - \ No newline at end of file +TXT diff --git a/webui/frontend/app/assets/files/vue.svg b/webui/frontend/app/assets/files/vue.svg new file mode 100644 index 000000000..7ae688718 --- /dev/null +++ b/webui/frontend/app/assets/files/vue.svg @@ -0,0 +1 @@ +VUE diff --git a/webui/frontend/app/assets/files/web.svg b/webui/frontend/app/assets/files/web.svg deleted file mode 100644 index 2c4596185..000000000 --- a/webui/frontend/app/assets/files/web.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/webui/frontend/app/assets/files/xml.svg b/webui/frontend/app/assets/files/xml.svg new file mode 100644 index 000000000..225972d2f --- /dev/null +++ b/webui/frontend/app/assets/files/xml.svg @@ -0,0 +1 @@ +XML diff --git a/webui/frontend/app/assets/files/yaml.svg b/webui/frontend/app/assets/files/yaml.svg new file mode 100644 index 000000000..92d1d71f3 --- /dev/null +++ b/webui/frontend/app/assets/files/yaml.svg @@ -0,0 +1 @@ +YAML diff --git a/webui/frontend/app/assets/icons/audio.svg b/webui/frontend/app/assets/icons/audio.svg index e0627595c..143509b84 100644 --- a/webui/frontend/app/assets/icons/audio.svg +++ b/webui/frontend/app/assets/icons/audio.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/webui/frontend/app/assets/icons/image.svg b/webui/frontend/app/assets/icons/image.svg index f4c2a37b7..83e010717 100644 --- a/webui/frontend/app/assets/icons/image.svg +++ b/webui/frontend/app/assets/icons/image.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/webui/frontend/app/assets/icons/video.svg b/webui/frontend/app/assets/icons/video.svg index 185d7d9e0..5ae3686b2 100644 --- a/webui/frontend/app/assets/icons/video.svg +++ b/webui/frontend/app/assets/icons/video.svg @@ -1 +1 @@ - \ No newline at end of file + From a77bfb289d8466c8a0d182b4ef67bca0314befa4 Mon Sep 17 00:00:00 2001 From: Col0ring <1561999073@qq.com> Date: Tue, 15 Sep 2026 17:37:43 +0800 Subject: [PATCH 2/3] feat(webui): map file icons from one shared resolver - export `getFileIcon` from FileCard with extension and full-name lookups - reuse it in the folder tree instead of a second mapping - size the workspace row icons up to match --- .../app/components/common/FileCard.tsx | 165 ++++++++++++++++-- .../app/components/common/FolderTree.tsx | 84 ++------- .../project/ProjectOverviewView.tsx | 4 +- 3 files changed, 165 insertions(+), 88 deletions(-) diff --git a/webui/frontend/app/components/common/FileCard.tsx b/webui/frontend/app/components/common/FileCard.tsx index 6207740a8..adccbda5e 100644 --- a/webui/frontend/app/components/common/FileCard.tsx +++ b/webui/frontend/app/components/common/FileCard.tsx @@ -2,9 +2,7 @@ import { Image, Tooltip } from 'antd' import type React from 'react' import { useT } from '~/lib/i18n' -// File type icons. Inlined (`?react`) instead of loaded as URLs so the -// theme-adaptive badges (e.g. web) can follow `currentColor` — an external SVG -// referenced by has no inherited color and would render black. +// File type icons, inlined via `?react` so they render as sized SVG components. import iconDefault from '~/assets/files/default.svg?react' import iconPdf from '~/assets/files/pdf.svg?react' import iconWord from '~/assets/files/word.svg?react' @@ -17,7 +15,30 @@ import iconJavascript from '~/assets/files/js.svg?react' import iconPython from '~/assets/files/py.svg?react' import iconText from '~/assets/files/txt.svg?react' import iconMp3 from '~/assets/files/mp3.svg?react' -import iconWeb from '~/assets/files/web.svg?react' +import iconHtml from '~/assets/files/html.svg?react' +import iconCss from '~/assets/files/css.svg?react' +import iconSass from '~/assets/files/sass.svg?react' +import iconLess from '~/assets/files/less.svg?react' +import iconJson from '~/assets/files/json.svg?react' +import iconYaml from '~/assets/files/yaml.svg?react' +import iconXml from '~/assets/files/xml.svg?react' +import iconConfig from '~/assets/files/config.svg?react' +import iconDatabase from '~/assets/files/database.svg?react' +import iconShell from '~/assets/files/shell.svg?react' +import iconDocker from '~/assets/files/docker.svg?react' +import iconGit from '~/assets/files/git.svg?react' +import iconTs from '~/assets/files/ts.svg?react' +import iconGo from '~/assets/files/go.svg?react' +import iconRust from '~/assets/files/rust.svg?react' +import iconC from '~/assets/files/c.svg?react' +import iconCpp from '~/assets/files/cpp.svg?react' +import iconCsharp from '~/assets/files/csharp.svg?react' +import iconRuby from '~/assets/files/ruby.svg?react' +import iconPhp from '~/assets/files/php.svg?react' +import iconSwift from '~/assets/files/swift.svg?react' +import iconKotlin from '~/assets/files/kotlin.svg?react' +import iconVue from '~/assets/files/vue.svg?react' +import iconSvelte from '~/assets/files/svelte.svg?react' import iconImage from '~/assets/icons/image.svg?react' import iconAudio from '~/assets/icons/audio.svg?react' import iconVideo from '~/assets/icons/video.svg?react' @@ -76,43 +97,132 @@ function getFileExt(name: string): string { type FileIcon = React.FC> +// Full filename (lowercased) to icon, checked before the extension map. +const fileNameIcons: Record = { + readme: iconMarkdown, + 'readme.md': iconMarkdown, + 'readme.txt': iconText, + changelog: iconText, + license: iconText, + licence: iconText, + copying: iconText, + notice: iconText, + authors: iconText, + dockerfile: iconDocker, + 'docker-compose.yml': iconDocker, + 'docker-compose.yaml': iconDocker, + '.dockerignore': iconDocker, + '.gitignore': iconGit, + '.gitattributes': iconGit, + '.gitmodules': iconGit, + '.gitkeep': iconGit, + gemfile: iconRuby, + 'go.mod': iconGo, + 'go.sum': iconGo +} + // File extension to icon mapping const fileIcons: Record = { // Documents PDF: iconPdf, DOC: iconWord, DOCX: iconWord, + RTF: iconWord, + ODT: iconWord, // Spreadsheets XLS: iconExcel, XLSX: iconExcel, CSV: iconExcel, + TSV: iconExcel, + ODS: iconExcel, // Presentations PPT: iconPpt, PPTX: iconPpt, + ODP: iconPpt, // Archives ZIP: iconZip, RAR: iconZip, '7Z': iconZip, TAR: iconZip, GZ: iconZip, + TGZ: iconZip, + BZ2: iconZip, + XZ: iconZip, + ZST: iconZip, + JAR: iconZip, + WAR: iconZip, // Code / Text MD: iconMarkdown, + MDX: iconMarkdown, + MARKDOWN: iconMarkdown, TXT: iconText, + TEXT: iconText, LOG: iconText, - // Web sources - HTML: iconWeb, - HTM: iconWeb, - CSS: iconWeb, - // .ipynb has no dedicated badge asset; use the generic file badge so doc - // cards render uniformly (matching the composer upload card) instead of the - // odd line-art glyph. + NFO: iconText, IPYNB: iconDefault, + // Data / config + JSON: iconJson, + JSONC: iconJson, + JSON5: iconJson, + YAML: iconYaml, + YML: iconYaml, + XML: iconXml, + PLIST: iconXml, + TOML: iconConfig, + INI: iconConfig, + CFG: iconConfig, + CONF: iconConfig, + ENV: iconConfig, + PROPERTIES: iconConfig, + EDITORCONFIG: iconConfig, + // Database + SQL: iconDatabase, + DB: iconDatabase, + SQLITE: iconDatabase, + SQLITE3: iconDatabase, + // Shell + SH: iconShell, + BASH: iconShell, + ZSH: iconShell, + FISH: iconShell, + // Web sources + HTML: iconHtml, + HTM: iconHtml, + XHTML: iconHtml, + CSS: iconCss, + STYL: iconCss, + SCSS: iconSass, + SASS: iconSass, + LESS: iconLess, JS: iconJavascript, - TS: iconJavascript, + MJS: iconJavascript, + CJS: iconJavascript, JSX: iconJavascript, - TSX: iconJavascript, + TS: iconTs, + TSX: iconTs, + MTS: iconTs, + CTS: iconTs, JAVA: iconJava, PY: iconPython, + // Languages + GO: iconGo, + RS: iconRust, + C: iconC, + H: iconC, + CPP: iconCpp, + CC: iconCpp, + CXX: iconCpp, + HPP: iconCpp, + HH: iconCpp, + HXX: iconCpp, + CS: iconCsharp, + RB: iconRuby, + PHP: iconPhp, + SWIFT: iconSwift, + KT: iconKotlin, + KTS: iconKotlin, + VUE: iconVue, + SVELTE: iconSvelte, // Media PNG: iconImage, JPG: iconImage, @@ -120,19 +230,40 @@ const fileIcons: Record = { GIF: iconImage, SVG: iconImage, WEBP: iconImage, + ICO: iconImage, + BMP: iconImage, + TIFF: iconImage, + TIF: iconImage, + AVIF: iconImage, + HEIC: iconImage, + HEIF: iconImage, MP3: iconMp3, WAV: iconAudio, OGG: iconAudio, FLAC: iconAudio, + M4A: iconAudio, + AAC: iconAudio, + OPUS: iconAudio, + AIFF: iconAudio, + WMA: iconAudio, MP4: iconVideo, MOV: iconVideo, AVI: iconVideo, WEBM: iconVideo, - MKV: iconVideo + MKV: iconVideo, + MPG: iconVideo, + MPEG: iconVideo, + M4V: iconVideo, + FLV: iconVideo, + WMV: iconVideo, + '3GP': iconVideo, + OGV: iconVideo } -function getFileIcon(ext: string): FileIcon { - return fileIcons[ext] ?? iconDefault +export function getFileIcon(name: string): FileIcon { + const named = fileNameIcons[name.toLowerCase()] + if (named) return named + return fileIcons[getFileExt(name)] ?? iconDefault } /** File-type badge for a filename (extension-based, with fallback). The color @@ -145,7 +276,7 @@ export function FileTypeIcon({ name: string className?: string }) { - const Icon = getFileIcon(getFileExt(name)) + const Icon = getFileIcon(name) return } diff --git a/webui/frontend/app/components/common/FolderTree.tsx b/webui/frontend/app/components/common/FolderTree.tsx index 479182f3a..b593d22b3 100644 --- a/webui/frontend/app/components/common/FolderTree.tsx +++ b/webui/frontend/app/components/common/FolderTree.tsx @@ -1,80 +1,18 @@ import { Dropdown, Tree } from 'antd' import type { MenuProps, TreeDataNode, TreeProps } from 'antd' -import { - type FC, - type ReactNode, - type SVGProps, - useEffect, - useMemo, - useRef, - useState -} from 'react' +import { type ReactNode, useEffect, useMemo, useRef, useState } from 'react' import { collectDroppedFiles } from '~/lib/dropFiles' import type { DroppedFile } from '~/lib/dropFiles' import { useT } from '~/lib/i18n' import { InlineNameInput } from './InlineNameInput' import './FolderTree.css' -// File type icons, inlined (`?react`) so the neutral ones can follow -// `currentColor` (see FileCard). -import iconDefault from '~/assets/files/default.svg?react' -import iconPdf from '~/assets/files/pdf.svg?react' -import iconWord from '~/assets/files/word.svg?react' -import iconExcel from '~/assets/files/excel.svg?react' -import iconPpt from '~/assets/files/ppt.svg?react' -import iconZip from '~/assets/files/zip.svg?react' -import iconMarkdown from '~/assets/files/md.svg?react' -import iconJava from '~/assets/files/java.svg?react' -import iconJavascript from '~/assets/files/js.svg?react' -import iconPython from '~/assets/files/py.svg?react' -import iconText from '~/assets/files/txt.svg?react' -import iconMp3 from '~/assets/files/mp3.svg?react' -import iconWeb from '~/assets/files/web.svg?react' import iconFolder from '~/assets/icons/folder.svg?react' - -type FileIcon = FC> - -// Extension → icon mapping -const FILE_ICONS: Record = { - pdf: iconPdf, - doc: iconWord, - docx: iconWord, - xls: iconExcel, - xlsx: iconExcel, - csv: iconExcel, - ppt: iconPpt, - pptx: iconPpt, - zip: iconZip, - rar: iconZip, - '7z': iconZip, - tar: iconZip, - gz: iconZip, - md: iconMarkdown, - js: iconJavascript, - ts: iconJavascript, - jsx: iconJavascript, - tsx: iconJavascript, - java: iconJava, - py: iconPython, - json: iconJavascript, - mp3: iconMp3, - html: iconWeb, - htm: iconWeb, - css: iconWeb, - log: iconText, - txt: iconText, - yaml: iconDefault, - yml: iconDefault, - bin: iconDefault, - sh: iconDefault, - xml: iconDefault, - svg: iconDefault -} +import { getFileIcon } from './FileCard' function iconFor(title: string, isDir: boolean): ReactNode { - const ext = title.split('.').pop()?.toLowerCase() ?? '' - const Icon = isDir ? iconFolder : FILE_ICONS[ext] ?? iconDefault - return + const Icon = isDir ? iconFolder : getFileIcon(title) + return } // Key of the inline "new entry" row. Not a path, so it can never collide with a @@ -321,7 +259,11 @@ export function FolderTree({ // eslint-disable-next-line react-hooks/exhaustive-deps }, [selectedKey, defaultExpandAll, dirSig]) - const menuItems = (isDir: boolean, path: string, key: string): MenuProps['items'] => { + const menuItems = ( + isDir: boolean, + path: string, + key: string + ): MenuProps['items'] => { if (!actions) return [] // When right-clicking a node that's part of a multi-selection, offer batch // operations over the whole selection instead of single-node actions. @@ -560,7 +502,9 @@ export function FolderTree({ useEffect(() => { if (!draft?.dir) return const parts = draft.dir.split('/') - const ancestors = parts.map((_, i) => `dir:${parts.slice(0, i + 1).join('/')}`) + const ancestors = parts.map( + (_, i) => `dir:${parts.slice(0, i + 1).join('/')}` + ) setExpandedKeys((prev) => [...new Set([...prev, ...ancestors])]) }, [draft?.dir]) @@ -641,7 +585,9 @@ export function FolderTree({ '.ant-tree-treenode' ) as HTMLElement | null if (!dt || !dt.setDragImage || !row) return - const iconEl = row.querySelector('.ant-tree-title img') as HTMLImageElement | null + const iconEl = row.querySelector( + '.ant-tree-title img' + ) as HTMLImageElement | null const name = row.querySelector('.ant-tree-title')?.textContent ?? '' // Dragging any node of a multi-selection moves the whole set: show a count. const dragKey = String(info.node.key) diff --git a/webui/frontend/app/components/project/ProjectOverviewView.tsx b/webui/frontend/app/components/project/ProjectOverviewView.tsx index 5933aa345..9cfd1b385 100644 --- a/webui/frontend/app/components/project/ProjectOverviewView.tsx +++ b/webui/frontend/app/components/project/ProjectOverviewView.tsx @@ -802,11 +802,11 @@ function WorkspacePanel({ return ( {record.kind === 'folder' ? ( - + ) : ( )} {record.kind === 'folder' ? ( From 29c1581eeedc5faca765524b74de66be06d3e6c9 Mon Sep 17 00:00:00 2001 From: Col0ring <1561999073@qq.com> Date: Tue, 15 Sep 2026 17:48:56 +0800 Subject: [PATCH 3/3] fix: icon size --- webui/frontend/app/components/common/FileCard.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/webui/frontend/app/components/common/FileCard.tsx b/webui/frontend/app/components/common/FileCard.tsx index adccbda5e..54d33e6d9 100644 --- a/webui/frontend/app/components/common/FileCard.tsx +++ b/webui/frontend/app/components/common/FileCard.tsx @@ -321,9 +321,9 @@ function OpenButton({ onClick }: { onClick?: () => void }) { e.stopPropagation() onClick?.() }} - className="absolute -right-1.5 -top-1.5 z-10 flex h-[20px] w-[20px] cursor-pointer items-center justify-center rounded-full border-none bg-msa-fill-3 p-0 text-msa-text-2 opacity-0 shadow-sm outline-none transition-opacity hover:text-msa-text-1 group-hover:opacity-100" + className="absolute -right-1.5 -top-1.5 z-10 flex h-5 w-5 cursor-pointer items-center justify-center rounded-full border-none bg-msa-fill-3 p-0 text-msa-text-2 opacity-0 shadow-sm outline-none transition-opacity hover:text-msa-text-1 group-hover:opacity-100" > - + ) }