diff --git a/web/src/components/ragflow-form.tsx b/web/src/components/ragflow-form.tsx index 384565755..28d1138b9 100644 --- a/web/src/components/ragflow-form.tsx +++ b/web/src/components/ragflow-form.tsx @@ -11,7 +11,7 @@ import { ControllerRenderProps, useFormContext } from 'react-hook-form'; type RAGFlowFormItemProps = { name: string; - label: ReactNode; + label?: ReactNode; tooltip?: ReactNode; children: ReactNode | ((field: ControllerRenderProps) => ReactNode); horizontal?: boolean; @@ -39,13 +39,15 @@ export function RAGFlowFormItem({ 'flex items-center': horizontal, })} > - - {label} - + {label && ( + + {label} + + )} {typeof children === 'function' ? children(field) diff --git a/web/src/hooks/use-agent-request.ts b/web/src/hooks/use-agent-request.ts index 9629e610c..97b8e4ede 100644 --- a/web/src/hooks/use-agent-request.ts +++ b/web/src/hooks/use-agent-request.ts @@ -125,7 +125,12 @@ export const useFetchAgentListByPage = () => { ...pagination, }, ], - initialData: { canvas: [], total: 0 }, + placeholderData: (previousData) => { + if (previousData === undefined) { + return { canvas: [], total: 0 }; + } + return previousData; + }, gcTime: 0, queryFn: async () => { const { data } = await agentService.listCanvasTeam( @@ -152,7 +157,7 @@ export const useFetchAgentListByPage = () => { ); return { - data: data.canvas, + data: data?.canvas ?? [], loading, searchString, handleInputChange: onInputChange, diff --git a/web/src/pages/agent/debug-content/uploader.tsx b/web/src/pages/agent/debug-content/uploader.tsx index e11a6f41d..88465d15c 100644 --- a/web/src/pages/agent/debug-content/uploader.tsx +++ b/web/src/pages/agent/debug-content/uploader.tsx @@ -86,7 +86,7 @@ export function FileUploadDirectUpload({ Drag & drop files here - Or click to browse (max 2 files) + Or click to browse (max 1 files) diff --git a/web/src/pages/agent/run-sheet/index.tsx b/web/src/pages/agent/run-sheet/index.tsx index cac62d008..d7a339b90 100644 --- a/web/src/pages/agent/run-sheet/index.tsx +++ b/web/src/pages/agent/run-sheet/index.tsx @@ -51,7 +51,7 @@ const RunSheet = ({ ); return ( - + {t('flow.testRun')} diff --git a/web/src/pages/data-flow/form/hierarchical-merger-form/index.tsx b/web/src/pages/data-flow/form/hierarchical-merger-form/index.tsx index 0a8405320..ebeab72d0 100644 --- a/web/src/pages/data-flow/form/hierarchical-merger-form/index.tsx +++ b/web/src/pages/data-flow/form/hierarchical-merger-form/index.tsx @@ -69,7 +69,7 @@ export function RegularExpressions({ return ( - H{index} + H{index + 1} void) { + const { send } = useSendMessageBySSE(api.runCanvas); + const { id } = useParams(); + + const { handleRun: saveGraph, loading } = + useSaveGraphBeforeOpeningDebugDrawer(showLogSheet!); + + const run = useCallback( + async (fileResponseData: Record) => { + const success = await saveGraph(); + if (!success) return; + const res = await send({ + id, + query: '', + session_id: null, + inputs: fileResponseData, + }); + console.log('🚀 ~ useRunDataflow ~ res:', res); + + if (res && res?.response.status === 200 && res?.data?.code === 0) { + // fetch canvas + } + }, + [id, saveGraph, send], + ); + + return { run, loading: loading }; +} diff --git a/web/src/pages/data-flow/hooks/use-save-graph.ts b/web/src/pages/data-flow/hooks/use-save-graph.ts index f0c85a1c4..322e8b80e 100644 --- a/web/src/pages/data-flow/hooks/use-save-graph.ts +++ b/web/src/pages/data-flow/hooks/use-save-graph.ts @@ -1,8 +1,4 @@ -import { - useFetchAgent, - useResetAgent, - useSetAgent, -} from '@/hooks/use-agent-request'; +import { useFetchAgent, useSetAgent } from '@/hooks/use-agent-request'; import { RAGFlowNodeType } from '@/interfaces/database/flow'; import { formatDate } from '@/utils/date'; import { useDebounceEffect } from 'ahooks'; @@ -34,21 +30,22 @@ export const useSaveGraph = (showMessage: boolean = true) => { export const useSaveGraphBeforeOpeningDebugDrawer = (show: () => void) => { const { saveGraph, loading } = useSaveGraph(); - const { resetAgent } = useResetAgent(); + // const { resetAgent } = useResetAgent(); const handleRun = useCallback( async (nextNodes?: RAGFlowNodeType[]) => { const saveRet = await saveGraph(nextNodes); if (saveRet?.code === 0) { // Call the reset api before opening the run drawer each time - const resetRet = await resetAgent(); + // const resetRet = await resetAgent(); // After resetting, all previous messages will be cleared. - if (resetRet?.code === 0) { - show(); - } + // if (resetRet?.code === 0) { + show(); + // } } + return saveRet?.code === 0; }, - [saveGraph, resetAgent, show], + [saveGraph, show], ); return { handleRun, loading }; diff --git a/web/src/pages/data-flow/run-sheet/index.tsx b/web/src/pages/data-flow/run-sheet/index.tsx index 18d043ffa..264a0883a 100644 --- a/web/src/pages/data-flow/run-sheet/index.tsx +++ b/web/src/pages/data-flow/run-sheet/index.tsx @@ -6,53 +6,21 @@ import { } from '@/components/ui/sheet'; import { IModalProps } from '@/interfaces/common'; import { cn } from '@/lib/utils'; -import { useCallback } from 'react'; import { useTranslation } from 'react-i18next'; -import { BeginId } from '../constant'; -import { useSaveGraphBeforeOpeningDebugDrawer } from '../hooks/use-save-graph'; -import { BeginQuery } from '../interface'; -import useGraphStore from '../store'; -import { buildBeginQueryWithObject } from '../utils'; -import { Uploader } from './uploader'; +import { useRunDataflow } from '../hooks/use-run-dataflow'; +import { UploaderForm } from './uploader'; -const RunSheet = ({ - hideModal, - showModal: showChatModal, -}: IModalProps) => { +const RunSheet = ({ hideModal, showModal: showLogSheet }: IModalProps) => { const { t } = useTranslation(); - const { updateNodeForm, getNode } = useGraphStore((state) => state); - const { handleRun, loading } = useSaveGraphBeforeOpeningDebugDrawer( - showChatModal!, - ); - - const handleRunAgent = useCallback( - (nextValues: BeginQuery[]) => { - const beginNode = getNode(BeginId); - const inputs: Record = beginNode?.data.form.inputs; - - const nextInputs = buildBeginQueryWithObject(inputs, nextValues); - - const currentNodes = updateNodeForm(BeginId, nextInputs, ['inputs']); - handleRun(currentNodes); - hideModal?.(); - }, - [getNode, handleRun, hideModal, updateNodeForm], - ); - - const onOk = useCallback( - async (nextValues: any[]) => { - handleRunAgent(nextValues); - }, - [handleRunAgent], - ); + const { run, loading } = useRunDataflow(() => {}); return ( {t('flow.testRun')} - + diff --git a/web/src/pages/data-flow/run-sheet/uploader.tsx b/web/src/pages/data-flow/run-sheet/uploader.tsx index 44969df25..db4a977dd 100644 --- a/web/src/pages/data-flow/run-sheet/uploader.tsx +++ b/web/src/pages/data-flow/run-sheet/uploader.tsx @@ -1,108 +1,57 @@ 'use client'; -import { - FileUpload, - FileUploadDropzone, - FileUploadItem, - FileUploadItemDelete, - FileUploadItemMetadata, - FileUploadItemPreview, - FileUploadItemProgress, - FileUploadList, - FileUploadTrigger, - type FileUploadProps, -} from '@/components/file-upload'; -import { Button } from '@/components/ui/button'; -import { Upload, X } from 'lucide-react'; -import * as React from 'react'; -import { toast } from 'sonner'; +import { z } from 'zod'; -export function Uploader() { - const [isUploading, setIsUploading] = React.useState(false); - const [files, setFiles] = React.useState([]); +import { RAGFlowFormItem } from '@/components/ragflow-form'; +import { ButtonLoading } from '@/components/ui/button'; +import { Form } from '@/components/ui/form'; +import { FileUploadDirectUpload } from '@/pages/agent/debug-content/uploader'; +import { zodResolver } from '@hookform/resolvers/zod'; +import { useForm } from 'react-hook-form'; +import { useTranslation } from 'react-i18next'; - const onUpload: NonNullable = React.useCallback( - async (files, { onProgress }) => { - try { - setIsUploading(true); - // const res = await uploadFiles('imageUploader', { - // files, - // onUploadProgress: ({ file, progress }) => { - // onProgress(file, progress); - // }, - // }); - } catch (error) { - setIsUploading(false); +const formSchema = z.object({ + file: z.record(z.any()), +}); - // if (error instanceof UploadThingError) { - // const errorMessage = - // error.data && 'error' in error.data - // ? error.data.error - // : 'Upload failed'; - // toast.error(errorMessage); - // return; - // } +export type FormSchemaType = z.infer; - toast.error( - error instanceof Error ? error.message : 'An unknown error occurred', - ); - } finally { - setIsUploading(false); - } - }, - [], - ); +type UploaderFormProps = { + ok: (values: FormSchemaType) => void; + loading: boolean; +}; - const onFileReject = React.useCallback((file: File, message: string) => { - toast(message, { - description: `"${file.name.length > 20 ? `${file.name.slice(0, 20)}...` : file.name}" has been rejected`, - }); - }, []); +export function UploaderForm({ ok, loading }: UploaderFormProps) { + const { t } = useTranslation(); + const form = useForm({ + resolver: zodResolver(formSchema), + defaultValues: {}, + }); return ( - setFiles(files)} - onUpload={onUpload} - onFileReject={onFileReject} - multiple - disabled={isUploading} - > - - - - - - Drag & drop images here - - Or click to browse (max 2 files, up to 4MB each) - + + + + {(field) => { + return ( + + ); + }} + + + + + {t('flow.run')} + - - - Browse files - - - - - {files.map((file, index) => ( - - - - - - - - - - - - - ))} - - + + ); }
Drag & drop files here
- Or click to browse (max 2 files) + Or click to browse (max 1 files)
Drag & drop images here
- Or click to browse (max 2 files, up to 4MB each) -