Fix: Memory-related bug fixes (#12226)

### What problem does this PR solve?

Fix: bugs fix
- table -> Table
- memory delete fail
- memory copywriting modified

### Type of change

- [x] Bug Fix (non-breaking change which fixes an issue)
This commit is contained in:
chanx
2025-12-26 12:24:05 +08:00
committed by GitHub
parent 52dbacc506
commit 894bf995bb
14 changed files with 270 additions and 58 deletions

View File

@ -23,6 +23,7 @@ import {
import { ManageMetadataModal } from '../components/metedata/manage-modal';
import { DatasetTable } from './dataset-table';
import Generate from './generate-button/generate';
import { ReparseDialog } from './reparse-dialog';
import { useBulkOperateDataset } from './use-bulk-operate-dataset';
import { useCreateEmptyDocument } from './use-create-empty-document';
import { useSelectDatasetFilters } from './use-select-filters';
@ -77,7 +78,12 @@ export default function Dataset() {
const { rowSelection, rowSelectionIsEmpty, setRowSelection, selectedCount } =
useRowSelection();
const { list } = useBulkOperateDataset({
const {
list,
visible: reparseDialogVisible,
hideModal: hideReparseDialogModal,
handleRunClick: handleOperationIconClick,
} = useBulkOperateDataset({
documents,
rowSelection,
setRowSelection,
@ -207,6 +213,16 @@ export default function Dataset() {
otherData={metadataConfig.record}
/>
)}
{reparseDialogVisible && (
<ReparseDialog
// hidden={isZeroChunk || isRunning}
hidden={false}
handleOperationIconClick={handleOperationIconClick}
chunk_num={0}
visible={reparseDialogVisible}
hideModal={hideReparseDialogModal}
></ReparseDialog>
)}
</section>
</>
);

View File

@ -1,4 +1,3 @@
import { ConfirmDeleteDialog } from '@/components/confirm-delete-dialog';
import { IconFontFill } from '@/components/icon-font';
import {
DropdownMenu,
@ -19,6 +18,7 @@ import { useCallback, useMemo } from 'react';
import { useTranslation } from 'react-i18next';
import { DocumentType, RunningStatus } from './constant';
import { ParsingCard } from './parsing-card';
import { ReparseDialog } from './reparse-dialog';
import { UseChangeDocumentParserShowType } from './use-change-document-parser';
import { useHandleRunDocumentByIds } from './use-run-document';
import { UseSaveMetaShowType } from './use-save-meta';
@ -63,15 +63,21 @@ export function ParsingStatusCell({
} = record;
const operationIcon = IconMap[run];
const p = Number((progress * 100).toFixed(2));
const { handleRunDocumentByIds } = useHandleRunDocumentByIds(id);
const {
handleRunDocumentByIds,
visible: reparseDialogVisible,
showModal: showReparseDialogModal,
hideModal: hideReparseDialogModal,
} = useHandleRunDocumentByIds(id);
const isRunning = isParserRunning(run);
const isZeroChunk = chunk_num === 0;
const handleOperationIconClick =
(shouldDelete: boolean = false) =>
() => {
handleRunDocumentByIds(record.id, isRunning, shouldDelete);
};
const handleOperationIconClick = (option: {
delete: boolean;
apply_kb: boolean;
}) => {
handleRunDocumentByIds(record.id, isRunning, option);
};
const handleShowChangeParserModal = useCallback(() => {
showChangeParserModal(record);
@ -129,23 +135,20 @@ export function ParsingStatusCell({
<div className="flex items-center gap-3">
<Separator orientation="vertical" className="h-2.5" />
{!isParserRunning(run) && (
<ConfirmDeleteDialog
title={t(`knowledgeDetails.redo`, { chunkNum: chunk_num })}
hidden={isZeroChunk || isRunning}
onOk={handleOperationIconClick(true)}
onCancel={handleOperationIconClick(false)}
// <ReparseDialog
// hidden={isZeroChunk || isRunning}
// handleOperationIconClick={handleOperationIconClick}
// chunk_num={chunk_num}
// >
<div
className="cursor-pointer flex items-center gap-3"
onClick={() => {
showReparseDialogModal();
}}
>
<div
className="cursor-pointer flex items-center gap-3"
onClick={
isZeroChunk || isRunning
? handleOperationIconClick(false)
: () => {}
}
>
{!isParserRunning(run) && operationIcon}
</div>
</ConfirmDeleteDialog>
{!isParserRunning(run) && operationIcon}
</div>
// {/* </ReparseDialog> */}
)}
{isParserRunning(run) ? (
<>
@ -158,11 +161,14 @@ export function ParsingStatusCell({
</div>
<div
className="cursor-pointer flex items-center gap-3"
onClick={
isZeroChunk || isRunning
? handleOperationIconClick(false)
: () => {}
}
onClick={() => {
showReparseDialogModal();
}}
// onClick={
// isZeroChunk || isRunning
// ? handleOperationIconClick(false)
// : () => {}
// }
>
{operationIcon}
</div>
@ -175,6 +181,16 @@ export function ParsingStatusCell({
)}
</div>
)}
{reparseDialogVisible && (
<ReparseDialog
// hidden={isZeroChunk || isRunning}
hidden={false}
handleOperationIconClick={handleOperationIconClick}
chunk_num={chunk_num}
visible={reparseDialogVisible}
hideModal={hideReparseDialogModal}
></ReparseDialog>
)}
</section>
);
}

View File

@ -0,0 +1,154 @@
import { ConfirmDeleteDialog } from '@/components/confirm-delete-dialog';
import {
DynamicForm,
DynamicFormRef,
FormFieldType,
} from '@/components/dynamic-form';
import { Checkbox } from '@/components/ui/checkbox';
import { DialogProps } from '@radix-ui/react-dialog';
import { t } from 'i18next';
import { useCallback, useState } from 'react';
export const ReparseDialog = ({
handleOperationIconClick,
chunk_num,
hidden = false,
visible = true,
hideModal,
children,
}: DialogProps & {
chunk_num: number;
handleOperationIconClick: (options: {
delete: boolean;
apply_kb: boolean;
}) => void;
visible: boolean;
hideModal: () => void;
hidden?: boolean;
}) => {
const [formInstance, setFormInstance] = useState<DynamicFormRef | null>(null);
const formCallbackRef = useCallback((node: DynamicFormRef | null) => {
if (node) {
setFormInstance(node);
console.log('Form instance assigned:', node);
} else {
console.log('Form instance removed');
}
}, []);
const handleCancel = useCallback(() => {
// handleOperationIconClick(false);
hideModal?.();
formInstance?.reset();
}, [formInstance]);
const handleSave = useCallback(async () => {
const instance = formInstance;
if (!instance) {
console.error('Form instance is null');
return;
}
const check = await instance.trigger();
if (check) {
instance.submit();
const formValues = instance.getValues();
console.log(formValues);
handleOperationIconClick({
delete: formValues.delete,
apply_kb: formValues.apply_kb,
});
}
}, [formInstance, handleOperationIconClick]);
// useEffect(() => {
// if (!hidden) {
// const timer = setTimeout(() => {
// if (!formInstance) {
// console.warn(
// 'Form ref is still null after component should be mounted',
// );
// } else {
// console.log('Form ref is properly set');
// }
// }, 1000);
// return () => clearTimeout(timer);
// }
// }, [hidden, formInstance]);
return (
<ConfirmDeleteDialog
title={t(`knowledgeDetails.parseFile`)}
onOk={() => handleSave()}
onCancel={() => handleCancel()}
hidden={hidden}
open={visible}
content={{
title: t(`knowledgeDetails.parseFileTip`),
node: (
<div>
<DynamicForm.Root
onSubmit={(data) => {
console.log('submit', data);
}}
ref={formCallbackRef}
fields={[
{
name: 'delete',
label: '',
type: FormFieldType.Checkbox,
render: (fieldProps) => (
<div className="flex items-center text-text-secondary p-5 border border-border-button rounded-lg">
<Checkbox
{...fieldProps}
onCheckedChange={(checked: boolean) => {
fieldProps.onChange(checked);
}}
/>
<span className="ml-2">
{chunk_num > 0
? t(`knowledgeDetails.redo`, { chunkNum: chunk_num })
: t('knowledgeDetails.redoAll')}
</span>
</div>
),
},
{
name: 'apply_kb',
label: '',
type: FormFieldType.Checkbox,
render: (fieldProps) => (
<div className="flex items-center text-text-secondary p-5 border border-border-button rounded-lg">
<Checkbox
{...fieldProps}
onCheckedChange={(checked: boolean) => {
fieldProps.onChange(checked);
}}
/>
<span className="ml-2">
{t('knowledgeDetails.applyAutoMetadataSettings')}
</span>
</div>
),
},
]}
>
{/* <DynamicForm.CancelButton
handleCancel={() => handleOperationIconClick(false)}
cancelText={t('common.cancel')}
/>
<DynamicForm.SavingButton
buttonText={t('common.confirm')}
submitFunc={handleSave}
/> */}
</DynamicForm.Root>
</div>
),
}}
>
{/* {children} */}
</ConfirmDeleteDialog>
);
};

View File

@ -1,3 +1,4 @@
import { useSetModalState } from '@/hooks/common-hooks';
import {
UseRowSelectionType,
useSelectedIds,
@ -30,9 +31,9 @@ export function useBulkOperateDataset({
const { runDocumentByIds } = useRunDocument();
const { setDocumentStatus } = useSetDocumentStatus();
const { removeDocument } = useRemoveDocument();
const { visible, showModal, hideModal } = useSetModalState();
const runDocument = useCallback(
(run: number) => {
async (run: number, option?: { delete: boolean; apply_kb: boolean }) => {
const nonVirtualKeys = selectedRowKeys.filter(
(x) =>
!documents.some((y) => x === y.id && y.type === DocumentType.Virtual),
@ -42,18 +43,22 @@ export function useBulkOperateDataset({
toast.error(t('Please select a non-empty file list'));
return;
}
runDocumentByIds({
await runDocumentByIds({
documentIds: nonVirtualKeys,
run,
shouldDelete: false,
option,
});
hideModal();
},
[documents, runDocumentByIds, selectedRowKeys, t],
[documents, runDocumentByIds, selectedRowKeys, hideModal, t],
);
const handleRunClick = useCallback(() => {
runDocument(1);
}, [runDocument]);
const handleRunClick = useCallback(
(option: { delete: boolean; apply_kb: boolean }) => {
runDocument(1, option);
},
[runDocument],
);
const handleCancelClick = useCallback(() => {
runDocument(2);
@ -106,7 +111,7 @@ export function useBulkOperateDataset({
id: 'run',
label: t('knowledgeDetails.run'),
icon: <Play />,
onClick: handleRunClick,
onClick: () => showModal(),
},
{
id: 'cancel',
@ -127,5 +132,5 @@ export function useBulkOperateDataset({
},
];
return { list };
return { list, visible, hideModal, showModal, handleRunClick };
}

View File

@ -1,3 +1,4 @@
import { useSetModalState } from '@/hooks/common-hooks';
import { useRunDocument } from '@/hooks/use-document-request';
import { useState } from 'react';
@ -5,11 +6,11 @@ export const useHandleRunDocumentByIds = (id: string) => {
const { runDocumentByIds, loading } = useRunDocument();
const [currentId, setCurrentId] = useState<string>('');
const isLoading = loading && currentId !== '' && currentId === id;
const { visible, showModal, hideModal } = useSetModalState();
const handleRunDocumentByIds = async (
documentId: string,
isRunning: boolean,
shouldDelete: boolean = false,
option: { delete: boolean; apply_kb: boolean },
) => {
if (isLoading) {
return;
@ -19,16 +20,20 @@ export const useHandleRunDocumentByIds = (id: string) => {
await runDocumentByIds({
documentIds: [documentId],
run: isRunning ? 2 : 1,
shouldDelete,
option,
});
setCurrentId('');
} catch (error) {
setCurrentId('');
}
hideModal();
};
return {
handleRunDocumentByIds,
loading: isLoading,
visible,
showModal,
hideModal,
};
};