From 3ece83d419d366c4963ec22f059cfebbd1e0f817 Mon Sep 17 00:00:00 2001 From: zhaoying Date: Tue, 7 Apr 2026 11:46:39 +0800 Subject: [PATCH 1/3] fix(web): chat file ui --- web/src/assets/images/file/audio_disabled.svg | 13 + web/src/assets/images/file/csv_disabled.svg | 18 ++ web/src/assets/images/file/excel_disabled.svg | 17 ++ web/src/assets/images/file/html_disabled.svg | 17 ++ web/src/assets/images/file/json_disabled.svg | 14 ++ web/src/assets/images/file/md_disabled.svg | 19 ++ web/src/assets/images/file/pause.svg | 16 ++ web/src/assets/images/file/pdf_disabled.svg | 20 ++ web/src/assets/images/file/play.svg | 28 +++ web/src/assets/images/file/ppt_disabled.svg | 14 ++ web/src/assets/images/file/txt_disabled.svg | 14 ++ web/src/assets/images/file/video_disabled.svg | 16 ++ web/src/assets/images/file/word_disabled.svg | 15 ++ web/src/components/Chat/FileList.tsx | 236 +++++++++++------- web/src/components/Header/index.tsx | 4 +- 15 files changed, 368 insertions(+), 93 deletions(-) create mode 100644 web/src/assets/images/file/audio_disabled.svg create mode 100644 web/src/assets/images/file/csv_disabled.svg create mode 100644 web/src/assets/images/file/excel_disabled.svg create mode 100644 web/src/assets/images/file/html_disabled.svg create mode 100644 web/src/assets/images/file/json_disabled.svg create mode 100644 web/src/assets/images/file/md_disabled.svg create mode 100644 web/src/assets/images/file/pause.svg create mode 100644 web/src/assets/images/file/pdf_disabled.svg create mode 100644 web/src/assets/images/file/play.svg create mode 100644 web/src/assets/images/file/ppt_disabled.svg create mode 100644 web/src/assets/images/file/txt_disabled.svg create mode 100644 web/src/assets/images/file/video_disabled.svg create mode 100644 web/src/assets/images/file/word_disabled.svg diff --git a/web/src/assets/images/file/audio_disabled.svg b/web/src/assets/images/file/audio_disabled.svg new file mode 100644 index 00000000..93d83a0a --- /dev/null +++ b/web/src/assets/images/file/audio_disabled.svg @@ -0,0 +1,13 @@ + + + 音乐 + + + + + + + + + + \ No newline at end of file diff --git a/web/src/assets/images/file/csv_disabled.svg b/web/src/assets/images/file/csv_disabled.svg new file mode 100644 index 00000000..29add1f6 --- /dev/null +++ b/web/src/assets/images/file/csv_disabled.svg @@ -0,0 +1,18 @@ + + + 编组 57 + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/assets/images/file/excel_disabled.svg b/web/src/assets/images/file/excel_disabled.svg new file mode 100644 index 00000000..5e2136e9 --- /dev/null +++ b/web/src/assets/images/file/excel_disabled.svg @@ -0,0 +1,17 @@ + + + Excel + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/assets/images/file/html_disabled.svg b/web/src/assets/images/file/html_disabled.svg new file mode 100644 index 00000000..fa237301 --- /dev/null +++ b/web/src/assets/images/file/html_disabled.svg @@ -0,0 +1,17 @@ + + + Word + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/assets/images/file/json_disabled.svg b/web/src/assets/images/file/json_disabled.svg new file mode 100644 index 00000000..267e2b46 --- /dev/null +++ b/web/src/assets/images/file/json_disabled.svg @@ -0,0 +1,14 @@ + + + JSON + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/assets/images/file/md_disabled.svg b/web/src/assets/images/file/md_disabled.svg new file mode 100644 index 00000000..8fe81fe7 --- /dev/null +++ b/web/src/assets/images/file/md_disabled.svg @@ -0,0 +1,19 @@ + + + PDF + + + + + + + + + + MD + + + + + + \ No newline at end of file diff --git a/web/src/assets/images/file/pause.svg b/web/src/assets/images/file/pause.svg new file mode 100644 index 00000000..0e26ece0 --- /dev/null +++ b/web/src/assets/images/file/pause.svg @@ -0,0 +1,16 @@ + + + 播放 + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/assets/images/file/pdf_disabled.svg b/web/src/assets/images/file/pdf_disabled.svg new file mode 100644 index 00000000..950edcb8 --- /dev/null +++ b/web/src/assets/images/file/pdf_disabled.svg @@ -0,0 +1,20 @@ + + + PDF + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/assets/images/file/play.svg b/web/src/assets/images/file/play.svg new file mode 100644 index 00000000..f2ff9cb7 --- /dev/null +++ b/web/src/assets/images/file/play.svg @@ -0,0 +1,28 @@ + + + 播放 + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/assets/images/file/ppt_disabled.svg b/web/src/assets/images/file/ppt_disabled.svg new file mode 100644 index 00000000..f3da453e --- /dev/null +++ b/web/src/assets/images/file/ppt_disabled.svg @@ -0,0 +1,14 @@ + + + file-ppt-2-fill + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/assets/images/file/txt_disabled.svg b/web/src/assets/images/file/txt_disabled.svg new file mode 100644 index 00000000..100565ce --- /dev/null +++ b/web/src/assets/images/file/txt_disabled.svg @@ -0,0 +1,14 @@ + + + txt + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/assets/images/file/video_disabled.svg b/web/src/assets/images/file/video_disabled.svg new file mode 100644 index 00000000..f8f71c2a --- /dev/null +++ b/web/src/assets/images/file/video_disabled.svg @@ -0,0 +1,16 @@ + + + 编组 59 + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/assets/images/file/word_disabled.svg b/web/src/assets/images/file/word_disabled.svg new file mode 100644 index 00000000..d4f9e6ec --- /dev/null +++ b/web/src/assets/images/file/word_disabled.svg @@ -0,0 +1,15 @@ + + + Word + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/components/Chat/FileList.tsx b/web/src/components/Chat/FileList.tsx index 3c84a59f..41fed7d8 100644 --- a/web/src/components/Chat/FileList.tsx +++ b/web/src/components/Chat/FileList.tsx @@ -1,5 +1,6 @@ -import { type FC } from 'react' +import { type FC, useRef, useState } from 'react' import { Flex, Spin } from 'antd' +import { CloseOutlined } from '@ant-design/icons' import clsx from 'clsx' import type { UploadFile, FlexProps } from 'antd' @@ -13,101 +14,154 @@ interface FileListProps { const FileList: FC = ({ fileList, onDelete, wrap, className = "rb:mx-3! rb:mt-3! rb:w-max!" }) => { + const [playingUid, setPlayingUid] = useState(null) + const mediaRef = useRef(null) + + const handleClose = () => { + mediaRef.current?.pause() + setPlayingUid(null) + } + + const playingFile = fileList.find(f => f.uid === playingUid) + if (!fileList.length) return null - return ( - - {fileList.map((file) => { - if (file.type?.includes('image')) { - return ( - -
- {file.name} - {onDelete &&
onDelete(file)} - >
} -
-
- ) - } - if (file.type?.includes('video')) { - return ( - -
-
-
- ) - } - if (file.type?.includes('audio')) { - return ( - -
-
-
- ) - } - return ( - - -
{ + console.log('getFileIconClassName file', file) + if (file.status === 'uploading') { + return file.type?.includes('audio') + ? "rb:bg-[url('@/assets/images/file/audio_disabled.svg')]" + : file.type?.includes('video') + ? "rb:bg-[url('@/assets/images/file/video_disabled.svg')]" + : file.type?.includes('pdf') + ? "rb:bg-[url('@/assets/images/file/pdf_disabled.svg')]" + : (file.type?.includes('excel') || file.type?.includes('spreadsheetml.sheet')) + ? "rb:bg-[url('@/assets/images/file/excel_disabled.svg')]" + : file.type?.includes('csv') + ? "rb:bg-[url('@/assets/images/file/csv_disabled.svg')]" + : file.type?.includes('html') + ? "rb:bg-[url('@/assets/images/file/html_disabled.svg')]" + : file.type?.includes('json') + ? "rb:bg-[url('@/assets/images/file/json_disabled.svg')]" : file.type?.includes('ppt') + ? "rb:bg-[url('@/assets/images/file/ppt_disabled.svg')]" + : file.type?.includes('markdown') + ? "rb:bg-[url('@/assets/images/file/md_disabled.svg')]" + : file.type?.includes('text') + ? "rb:bg-[url('@/assets/images/file/txt_disabled.svg')]" + : (file.type?.includes('doc') || file.type?.includes('docx') || file.type?.includes('word') || file.type?.includes('wordprocessingml.document')) + ? "rb:bg-[url('@/assets/images/file/word_disabled.svg')]" + : "rb:bg-[url('@/assets/images/file/txt_disabled.svg')]" + } + return file.type?.includes('audio') + ? "rb:bg-[url('@/assets/images/file/audio.svg')]" + : file.type?.includes('video') + ? "rb:bg-[url('@/assets/images/file/video.svg')]" + : file.type?.includes('pdf') + ? "rb:bg-[url('@/assets/images/file/pdf.svg')]" + : (file.type?.includes('excel') || file.type?.includes('spreadsheetml.sheet')) + ? "rb:bg-[url('@/assets/images/file/excel.svg')]" + : file.type?.includes('csv') + ? "rb:bg-[url('@/assets/images/file/csv.svg')]" + : file.type?.includes('html') + ? "rb:bg-[url('@/assets/images/file/html.svg')]" + : file.type?.includes('json') + ? "rb:bg-[url('@/assets/images/file/json.svg')]" + : file.type?.includes('ppt') ? "rb:bg-[url('@/assets/images/file/ppt.svg')]" - : file.type?.includes('text') - ? "rb:bg-[url('@/assets/images/file/txt.svg')]" : file.type?.includes('markdown') - ? "rb:bg-[url('@/assets/images/file/md.svg')]" - : (file.type?.includes('doc') || file.type?.includes('docx') || file.type?.includes('word') || file.type?.includes('wordprocessingml.document')) - ? "rb:bg-[url('@/assets/images/file/word.svg')]" - : null - )} - >
-
-
{file.name}
-
{[file.type?.split('/').pop(), file.size].filter(item => item).join(' · ')}
-
- {onDelete &&
onDelete(file)} - >
} -
-
- ) - })} -
+ ? "rb:bg-[url('@/assets/images/file/md.svg')]" + : file.type?.includes('text') + ? "rb:bg-[url('@/assets/images/file/txt.svg')]" + : (file.type?.includes('doc') || file.type?.includes('docx') || file.type?.includes('word') || file.type?.includes('wordprocessingml.document')) + ? "rb:bg-[url('@/assets/images/file/word.svg')]" + : "rb:bg-[url('@/assets/images/file/txt.svg')]" + } + + return ( + <> + + {fileList.map((file) => { + if (file.type?.includes('image')) { + return ( + +
+ {file.name} + {onDelete &&
onDelete(file)} + >
} +
+
+ ) + } + return ( + + +
+
+
{file.name}
+
{[file.type?.split('/').pop(), file.size].filter(item => item).join(' · ')}
+
+ {file.status === 'done' && (file.type?.includes('video') || file.type?.includes('audio')) && +
playingUid === file.uid ? handleClose() : setPlayingUid(file.uid)} + >
+ } + {onDelete &&
onDelete(file)} + >
} +
+
+ ) + })} +
+ + {playingFile && ( +
+ + {playingFile.type?.includes('video') ? ( +
+ )} + ) } diff --git a/web/src/components/Header/index.tsx b/web/src/components/Header/index.tsx index ac59fcc2..0dd51bbd 100644 --- a/web/src/components/Header/index.tsx +++ b/web/src/components/Header/index.tsx @@ -2,7 +2,7 @@ * @Author: ZhaoYing * @Date: 2026-02-02 15:07:49 * @Last Modified by: ZhaoYing - * @Last Modified time: 2026-02-05 13:43:59 + * @Last Modified time: 2026-04-03 20:21:02 */ /** * AppHeader Component @@ -180,7 +180,7 @@ const AppHeader: FC<{source?: 'space' | 'manage';}> = ({source = 'manage'}) => { > - {/[\u4e00-\u9fa5]/.test(user.username) ? user.username.slice(0, 2) : user.username[0]} + {/[\u4e00-\u9fa5]/.test(user.username) ? user.username.slice(user.username.length, -2) : user.username[0]} {user.username}
Date: Tue, 7 Apr 2026 12:05:20 +0800 Subject: [PATCH 2/3] fix(web): llm/document-extractor support file type variable --- .../components/Properties/VariableSelect.tsx | 8 +++--- .../Workflow/components/Properties/index.tsx | 25 ++++++++++++++++--- web/src/views/Workflow/constant.ts | 4 +-- 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/web/src/views/Workflow/components/Properties/VariableSelect.tsx b/web/src/views/Workflow/components/Properties/VariableSelect.tsx index a5428a60..38c48dba 100644 --- a/web/src/views/Workflow/components/Properties/VariableSelect.tsx +++ b/web/src/views/Workflow/components/Properties/VariableSelect.tsx @@ -20,7 +20,7 @@ interface VariableSelectProps { multiple?: boolean; size?: 'small' | 'middle' | 'large'; placeholder?: string; - variant?: 'outlined' | 'borderless'; + variant?: 'outlined' | 'borderless' | 'filled'; className?: string; onChange?: (value: string | string[], option: Suggestion | Suggestion[] | undefined) => void; } @@ -190,12 +190,12 @@ const VariableSelect: FC = ({ {/* Trigger */}
setOpen(o => !o)} diff --git a/web/src/views/Workflow/components/Properties/index.tsx b/web/src/views/Workflow/components/Properties/index.tsx index b2a82318..1270a4de 100644 --- a/web/src/views/Workflow/components/Properties/index.tsx +++ b/web/src/views/Workflow/components/Properties/index.tsx @@ -38,6 +38,7 @@ import RbCard from '@/components/RbCard/Card'; import ModelConfig from './ModelConfig' import ModelSelect from '@/components/ModelSelect' import ListOperator from './ListOperator' +import type { Variable } from "./VariableList/types"; /** * Props for Properties component @@ -229,7 +230,6 @@ const Properties: FC = ({ } return filteredList; }; - if (nodeType === 'llm') { // For LLM nodes that are children of iteration or loop nodes, include parent variables const parentLoopNode = selectedNode ? (() => { @@ -790,8 +790,25 @@ const Properties: FC = ({ return nodeTypeMatch || variableNameMatch; }); } - if (config.onFilterVariableNames) { - return baseVariableList.filter(variable => Array.isArray(config.onFilterVariableNames) && config.onFilterVariableNames.includes(variable.label)); + if (config.onFilterVariableType) { + const types = config.onFilterVariableType as string[]; + let list: Suggestion[] = [] + baseVariableList.forEach((variable) => { + if (variable.children?.length) { + const filteredChildren = variable.children.filter((c: Suggestion) => types.includes(c.dataType)); + console.log('filteredChildren', filteredChildren) + if (filteredChildren.length > 0) { + list.push({ ...variable, children: filteredChildren }); + } else if (types.includes(variable.dataType)) { + list.push({ ...variable, children: [] }); + } + } else if (types.includes(variable.dataType)) { + list.push(variable); + } + }); + + console.log('list', list) + return list } // Filter child nodes for iteration output if (config.filterChildNodes && selectedNode) { @@ -812,7 +829,7 @@ const Properties: FC = ({ } return baseVariableList; })()} - onChange={(value, option) => handleChangeVariableList(value, option, key)} + onChange={(value, option) => handleChangeVariableList(value as string, option, key)} size="small" /> : config.type === 'switch' diff --git a/web/src/views/Workflow/constant.ts b/web/src/views/Workflow/constant.ts index 7909d183..9621d968 100644 --- a/web/src/views/Workflow/constant.ts +++ b/web/src/views/Workflow/constant.ts @@ -128,7 +128,7 @@ export const nodeLibrary: NodeLibrary[] = [ }, vision_input: { type: 'variableList', - onFilterVariableNames: ['sys.files'] + onFilterVariableType: ['array[file]'] } } }, @@ -457,7 +457,7 @@ export const nodeLibrary: NodeLibrary[] = [ file_selector: { type: 'variableList', placeholder: 'common.pleaseSelect', - onFilterVariableNames: ['sys.files'] + onFilterVariableType: ['array[file]', 'file'] } } }, From 072d118935aa27b18a715d21280122945d6c4b04 Mon Sep 17 00:00:00 2001 From: zhaoying Date: Tue, 7 Apr 2026 12:08:36 +0800 Subject: [PATCH 3/3] fix(web): add file type transform --- web/src/views/Conversation/components/FileUpload.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/views/Conversation/components/FileUpload.tsx b/web/src/views/Conversation/components/FileUpload.tsx index 0cbef569..c8715fd2 100644 --- a/web/src/views/Conversation/components/FileUpload.tsx +++ b/web/src/views/Conversation/components/FileUpload.tsx @@ -235,7 +235,7 @@ const UploadFiles = forwardRef(({ name: rcFile.name, status: 'uploading' as UploadFileStatus, percent: 0, - type: rcFile.type, + type: (rcFile.type && transform_file_type[rcFile.type as keyof typeof transform_file_type]) || rcFile.type || 'document', originFileObj: rcFile, thumbUrl: URL.createObjectURL(rcFile), size: rcFile.size,