diff --git a/web/client/api/flow/index.ts b/web/client/api/flow/index.ts index 67c6462e4..b7f6bd381 100644 --- a/web/client/api/flow/index.ts +++ b/web/client/api/flow/index.ts @@ -71,3 +71,6 @@ export const getFlowTemplateList = () => { export const getFlowTemplateById = (id: string) => { return GET(`/api/v2/serve/awel/flow/templates/${id}`); }; +export const metadataBatch = (data: IUploadFileRequestParams) => { + return POST>('/api/v2/serve/file/files/metadata/batch', data); +}; \ No newline at end of file diff --git a/web/components/flow/canvas-modal/import-flow-modal.tsx b/web/components/flow/canvas-modal/import-flow-modal.tsx index 803f37d92..7bc54a7e3 100644 --- a/web/components/flow/canvas-modal/import-flow-modal.tsx +++ b/web/components/flow/canvas-modal/import-flow-modal.tsx @@ -4,7 +4,7 @@ import { Button, Form, GetProp, Modal, Radio, Space, Upload, UploadFile, UploadP import { useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { Edge, Node } from 'reactflow'; - +import CanvasWrapper from '@/pages/construct/flow/canvas/index'; type Props = { isImportModalOpen: boolean; setNodes: React.Dispatch[]>>; @@ -37,9 +37,12 @@ export const ImportFlowModal: React.FC = ({ isImportModalOpen, setIsImpor const [, , res] = await apiInterceptors(importFlow(formData)); if (res?.success) { - messageApi.success(t('Export_Flow_Success')); + messageApi.success(t('Import_Flow_Success')); + localStorage.setItem('importFlowData', JSON.stringify(res?.data)); + CanvasWrapper(res?.data) } else if (res?.err_msg) { messageApi.error(res?.err_msg); + } setIsImportFlowModalOpen(false); }; diff --git a/web/components/flow/canvas-node.tsx b/web/components/flow/canvas-node.tsx index aa0378c2f..5a86a5da1 100644 --- a/web/components/flow/canvas-node.tsx +++ b/web/components/flow/canvas-node.tsx @@ -19,7 +19,6 @@ type CanvasNodeProps = { function TypeLabel({ label }: { label: string }) { return
{label}
; } -const forceTypeList = ['file', 'multiple_files', 'time']; const CanvasNode: React.FC = ({ data }) => { const node = data; @@ -128,9 +127,6 @@ const CanvasNode: React.FC = ({ data }) => { function onParameterValuesChange(changedValues: any, allValues: any) { const [changedKey, changedVal] = Object.entries(changedValues)[0]; - if (!allValues?.force && forceTypeList.includes(changedKey)) { - return; - } updateCurrentNodeValue(changedKey, changedVal); if (changedVal) { updateDependsNodeValue(changedKey, changedVal); @@ -197,8 +193,11 @@ const CanvasNode: React.FC = ({ data }) => { >
= ({ formValuesChange, n if (ui_type === 'slider' && data.is_list) { defaultValue = [0, 1]; } + return ( { const { t } = useTranslation(); const urlList = useRef([]); const { data, formValuesChange } = params; + const [fileList, setFileList] = useState([]) + + // 获取上传文件元数据 + useEffect(() => { + if (data.value) { + let uris:string[] = [] + typeof(data.value) === 'string'? uris.push(data.value):uris = data.value + let parameter:any = { + uris + } + metadataBatch(parameter).then((res)=>{ + let urlList:UploadFile[] = [] + for (let index = 0; index < res.data.data.length; index++) { + const element = res.data.data[index]; + urlList.push({ + uid: element.file_id, + name:element.file_name, + status: 'done', + url: element.uri, + }) + } + setFileList(urlList) + }).catch((error)=>{ + console.log(error) + }) + } + }, []); const attr = convertKeysToCamelCase(data.ui?.attr || {}); const [uploading, setUploading] = useState(false); @@ -51,6 +79,7 @@ export const renderUpload = (params: Props) => { headers: { authorization: 'authorization-text', }, + defaultFileList: fileList, onChange(info) { setUploading(true); if (info.file.status !== 'uploading') { @@ -73,19 +102,11 @@ export const renderUpload = (params: Props) => { return (
- {data.is_list ? ( - + - ) : ( - - - - )}
); }; diff --git a/web/pages/construct/flow/canvas/index.tsx b/web/pages/construct/flow/canvas/index.tsx index c67b72bfa..b3d0889a5 100644 --- a/web/pages/construct/flow/canvas/index.tsx +++ b/web/pages/construct/flow/canvas/index.tsx @@ -26,8 +26,8 @@ import 'reactflow/dist/style.css'; const nodeTypes = { customNode: CanvasNode }; const edgeTypes = { buttonedge: ButtonEdge }; - const Canvas: React.FC = () => { + const { t } = useTranslation(); const [messageApi, contextHolder] = message.useMessage(); @@ -43,7 +43,17 @@ const Canvas: React.FC = () => { const [isSaveFlowModalOpen, setIsSaveFlowModalOpen] = useState(false); const [isExportFlowModalOpen, setIsExportFlowModalOpen] = useState(false); const [isImportModalOpen, setIsImportFlowModalOpen] = useState(false); - + + if (localStorage.getItem('importFlowData') ) { + const importFlowData = JSON.parse(localStorage.getItem('importFlowData') ); + localStorage.removeItem('importFlowData') + setLoading(true); + const flowData = mapUnderlineToHump(importFlowData.flow_data); + setFlowInfo(importFlowData); + setNodes(flowData.nodes); + setEdges(flowData.edges); + setLoading(false); + } async function getFlowData() { setLoading(true); const [_, data] = await apiInterceptors(getFlowById(id)); diff --git a/web/styles/globals.css b/web/styles/globals.css index 524fb68f5..1d49ea271 100644 --- a/web/styles/globals.css +++ b/web/styles/globals.css @@ -122,4 +122,4 @@ table { .rc-md-editor .editor-container>.section { border-right: none !important; -} \ No newline at end of file +}