diff --git a/web/src/app.tsx b/web/src/app.tsx index 0f511f310..c6c65fdd4 100644 --- a/web/src/app.tsx +++ b/web/src/app.tsx @@ -91,6 +91,8 @@ function Root({ children }: React.PropsWithChildren) { i18n.on('languageChanged', function (lng: string) { storage.setLanguage(lng); setLocal(getLocale(lng)); + // Should reflect to + document.documentElement.lang = lng; }); return ( diff --git a/web/src/locales/en.ts b/web/src/locales/en.ts index 676cc50ad..a7749c00e 100644 --- a/web/src/locales/en.ts +++ b/web/src/locales/en.ts @@ -129,6 +129,17 @@ Procedural Memory: Learned skills, habits, and automated procedures.`, delMemoryWarn: `After deletion, all messages in this memory will be deleted and cannot be retrieved by agents.`, }, memory: { + taskLogDialog: { + title: 'Memory', + startTime: 'Start time', + status: 'Status', + details: 'Details', + + success: 'Success', + running: 'Running', + failed: 'Failed', + }, + messages: { forget: 'Forget', forgetMessageTip: 'Are you sure you want to forget?', diff --git a/web/src/pages/memory/memory-message/interface.ts b/web/src/pages/memory/memory-message/interface.ts index b82de47f9..760ac20e7 100644 --- a/web/src/pages/memory/memory-message/interface.ts +++ b/web/src/pages/memory/memory-message/interface.ts @@ -10,7 +10,17 @@ export interface IMessageInfo { invalid_at: string; forget_at: string; status: boolean; - extract?: IMessageInfo[]; + extract?: Omit[]; + task: { + chunk_ids: string; + create_time: number; + digest: string; + doc_id: string; + from_page: number; + id: string; + progress: number; + progress_msg: string; + }; } export interface IMessageTableProps { diff --git a/web/src/pages/memory/memory-message/message-table.tsx b/web/src/pages/memory/memory-message/message-table.tsx index 354baba3a..ecbf413eb 100644 --- a/web/src/pages/memory/memory-message/message-table.tsx +++ b/web/src/pages/memory/memory-message/message-table.tsx @@ -5,6 +5,15 @@ import { import { EmptyType } from '@/components/empty/constant'; import Empty from '@/components/empty/empty'; import { Button } from '@/components/ui/button'; +import { + Dialog, + DialogClose, + DialogContent, + DialogFooter, + DialogHeader, + DialogTitle, + DialogTrigger, +} from '@/components/ui/dialog'; import { Modal } from '@/components/ui/modal/modal'; import { RAGFlowPagination } from '@/components/ui/ragflow-pagination'; import { Switch } from '@/components/ui/switch'; @@ -27,6 +36,7 @@ import { Row, SortingState, VisibilityState, + createColumnHelper, flexRender, getCoreRowModel, getExpandedRowModel, @@ -35,6 +45,7 @@ import { getSortedRowModel, useReactTable, } from '@tanstack/react-table'; +import dayjs from 'dayjs'; import { t } from 'i18next'; import { pick } from 'lodash'; import { @@ -57,6 +68,18 @@ export type MemoryTableProps = { setPagination: (params: { page: number; pageSize: number }) => void; }; +const columnHelper = createColumnHelper(); + +function getTaskStatus(progress: number) { + if (progress >= 1) { + return 'success'; + } else if (progress > 0 && progress < 1) { + return 'running'; + } else { + return 'failed'; + } +} + export function MemoryTable({ messages, total, @@ -198,6 +221,98 @@ export function MemoryTable({ ); }, }, + columnHelper.display({ + id: 'task_progress', + cell: ({ row }) => { + const { task } = row.original; + + if (!task) { + return null; + } + + const taskStatus = getTaskStatus(task.progress); + + return ( + + + + + + + + {t('memory.taskLogDialog.title')} + + +
+
+
+ {t('memory.taskLogDialog.startTime')} +
+
+ {dayjs(task.create_time) + .locale(document.documentElement.lang) + .format('MM/DD/YYYY HH:mm:ss')} +
+ +
+ {t('memory.taskLogDialog.status')} +
+
+
+
+ {t(`memory.taskLogDialog.${taskStatus}`)} +
+
+
+ +
+
+ {t('memory.taskLogDialog.details')} +
+
+
+
+                          {task.progress_msg}
+                        
+
+
+
+
+ + + + + + +
+
+ ); + }, + }), { accessorKey: 'action', header: () => {t('memory.messages.action')}, @@ -244,7 +359,7 @@ export function MemoryTable({ data: messages, columns, onExpandedChange: setExpanded, - getSubRows: (row) => row.extract || undefined, + getSubRows: (row) => (row.extract as IMessageInfo[]) || undefined, onSortingChange: setSorting, onColumnFiltersChange: setColumnFilters, getCoreRowModel: getCoreRowModel(),