From 1d93519cb21ec23b2771c5b000c41f91541f90eb Mon Sep 17 00:00:00 2001 From: chanx <1243304602@qq.com> Date: Mon, 26 Jan 2026 18:00:40 +0800 Subject: [PATCH] Fix: Issues with metadata parameter addition failures and single-file chunk saving failures. (#12818) ### What problem does this PR solve? Fix: Issues with metadata parameter addition failures and single-file chunk saving failures. ### Type of change - [x] Bug Fix (non-breaking change which fixes an issue) --- .../components/chunk-method-dialog/index.tsx | 14 ++- web/src/locales/en.ts | 5 +- web/src/locales/zh.ts | 5 +- .../metedata/hooks/use-manage-modal.ts | 75 +++++++++------ .../dataset/components/metedata/interface.ts | 5 +- .../metedata/manage-modal-column.tsx | 92 +++++++++++-------- .../components/metedata/manage-modal.tsx | 7 +- .../configuration/common-item.tsx | 23 ++++- web/src/pages/dataset/dataset/index.tsx | 16 +++- .../dataset/use-bulk-operate-dataset.tsx | 11 ++- .../dataset/use-dataset-table-columns.tsx | 10 +- 11 files changed, 170 insertions(+), 93 deletions(-) diff --git a/web/src/components/chunk-method-dialog/index.tsx b/web/src/components/chunk-method-dialog/index.tsx index 372e58fdc..a4291eea7 100644 --- a/web/src/components/chunk-method-dialog/index.tsx +++ b/web/src/components/chunk-method-dialog/index.tsx @@ -144,15 +144,13 @@ export function ChunkMethodDialog({ pages: z .array(z.object({ from: z.coerce.number(), to: z.coerce.number() })) .optional(), - metadata: z + metadata: z.any().optional(), + built_in_metadata: z .array( - z - .object({ - key: z.string().optional(), - description: z.string().optional(), - enum: z.array(z.string().optional()).optional(), - }) - .optional(), + z.object({ + key: z.string().optional(), + type: z.string().optional(), + }), ) .optional(), enable_metadata: z.boolean().optional(), diff --git a/web/src/locales/en.ts b/web/src/locales/en.ts index 5ed8912af..01c472bc1 100644 --- a/web/src/locales/en.ts +++ b/web/src/locales/en.ts @@ -184,6 +184,7 @@ Example: A 1 KB message with 1024-dim embedding uses ~9 KB. The 5 MB default lim }, knowledgeDetails: { metadata: { + selectFiles: 'Selected {{count}} files', type: 'Type', fieldNameInvalid: 'Field name can only contain letters or underscores.', builtIn: 'Built-in', @@ -205,10 +206,10 @@ Example: A 1 KB message with 1024-dim embedding uses ~9 KB. The 5 MB default lim fieldExists: 'Field already exists.', fieldSetting: 'Field settings', changesAffectNewParses: 'Changes affect new parses only.', - editMetadataForDataset: 'View and edit metadata for ', + // editMetadataForDataset: 'View and edit metadata for ', restrictDefinedValues: 'Restrict to defined values', metadataGenerationSettings: 'Metadata generation settings', - manageMetadataForDataset: 'Manage metadata for this dataset', + // manageMetadataForDataset: 'Manage metadata for this dataset', manageMetadata: 'Manage metadata', metadata: 'Metadata', values: 'Values', diff --git a/web/src/locales/zh.ts b/web/src/locales/zh.ts index 1ca477995..ec72b7f73 100644 --- a/web/src/locales/zh.ts +++ b/web/src/locales/zh.ts @@ -175,6 +175,7 @@ export default { }, knowledgeDetails: { metadata: { + selectFiles: '已选择 {{count}} 个文件', type: '类型', fieldNameInvalid: '字段名称只能包含字母或下划线。', builtIn: '内置', @@ -192,10 +193,10 @@ export default { fieldExists: '字段名已存在。', fieldSetting: '字段设置', changesAffectNewParses: '更改仅影响新的解析。', - editMetadataForDataset: '查看和编辑元数据 ', + // editMetadataForDataset: '查看和编辑元数据 ', restrictDefinedValues: '限制为已定义的值', metadataGenerationSettings: '元数据生成设置', - manageMetadataForDataset: '管理此数据集的元数据', + // manageMetadataForDataset: '管理此数据集的元数据', manageMetadata: '管理元数据', metadata: '元数据', values: '值', diff --git a/web/src/pages/dataset/components/metedata/hooks/use-manage-modal.ts b/web/src/pages/dataset/components/metedata/hooks/use-manage-modal.ts index 95ec0318c..3555af26c 100644 --- a/web/src/pages/dataset/components/metedata/hooks/use-manage-modal.ts +++ b/web/src/pages/dataset/components/metedata/hooks/use-manage-modal.ts @@ -11,11 +11,7 @@ import { RowSelectionState } from '@tanstack/react-table'; import { useCallback, useEffect, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useParams } from 'react-router'; -import { - DEFAULT_VALUE_TYPE, - MetadataType, - metadataValueTypeEnum, -} from '../constant'; +import { DEFAULT_VALUE_TYPE, MetadataType } from '../constant'; import { IBuiltInMetadataItem, IMetaDataReturnJSONSettings, @@ -25,6 +21,7 @@ import { MetadataOperations, MetadataValueType, ShowManageMetadataModalProps, + UpdateOperation, } from '../interface'; export const util = { @@ -136,6 +133,7 @@ export const useMetadataOperations = () => { deletes: [], updates: [], }); + // const operationsRef = useRef(operations); const addDeleteRow = useCallback((key: string) => { setOperations((prev) => ({ @@ -165,41 +163,60 @@ export const useMetadataOperations = () => { newValue: string | string[], type?: MetadataValueType, ) => { - let newValuesRes: string | string[]; - if (type !== metadataValueTypeEnum['list']) { - if (Array.isArray(newValue) && newValue.length > 0) { - newValuesRes = newValue[0]; - } else { - newValuesRes = newValue; - } - } else { - newValuesRes = newValue; - } + // let newValuesRes: string | string[]; + // if (type !== metadataValueTypeEnum['list']) { + // if (Array.isArray(newValue) && newValue.length > 0) { + // newValuesRes = newValue[0]; + // } else { + // newValuesRes = newValue; + // } + // } else { + // newValuesRes = newValue; + // } setOperations((prev) => { + let updatedUpdates = [...prev.updates]; const existsIndex = prev.updates.findIndex( - (update) => update.key === key && update.match === originalValue, + (update) => + update.key === key && + update.match === originalValue && + update.match !== '', ); - if (existsIndex > -1) { - const updatedUpdates = [...prev.updates]; updatedUpdates[existsIndex] = { key, match: originalValue, - value: newValuesRes, + value: newValue, valueType: type || DEFAULT_VALUE_TYPE, }; - return { - ...prev, - updates: updatedUpdates, - }; + + // operationsRef.current = updatedOperations; + } else { + updatedUpdates.push({ + key, + match: originalValue, + value: newValue, + valueType: type, + }); } - return { + updatedUpdates = updatedUpdates.reduce((pre, cur) => { + if ( + !pre.some( + (item) => + item.key === cur.key && + item.match === cur.match && + item.value === cur.value, + ) + ) { + pre.push(cur); + } + return pre; + }, [] as UpdateOperation[]); + + const updatedOperations = { ...prev, - updates: [ - ...prev.updates, - { key, match: originalValue, value: newValuesRes, valueType: type }, - ], + updates: updatedUpdates, }; + return updatedOperations; }); }, [], @@ -213,6 +230,7 @@ export const useMetadataOperations = () => { }, []); return { + // operationsRef, operations, addDeleteBatch, addDeleteRow, @@ -272,6 +290,7 @@ export const useManageMetaDataModal = ( const [tableData, setTableData] = useState(metaData); const queryClient = useQueryClient(); const { + // operationsRef, operations, addDeleteRow, addDeleteBatch, diff --git a/web/src/pages/dataset/components/metedata/interface.ts b/web/src/pages/dataset/components/metedata/interface.ts index ac1cf6520..f5b65b194 100644 --- a/web/src/pages/dataset/components/metedata/interface.ts +++ b/web/src/pages/dataset/components/metedata/interface.ts @@ -72,6 +72,7 @@ export type IManageModalProps = { isVerticalShowValue?: boolean; builtInMetadata?: IBuiltInMetadataItem[]; success?: (data: any) => void; + secondTitle?: ReactNode; }; export interface IManageValuesProps { @@ -98,12 +99,12 @@ export interface IManageValuesProps { addDeleteValue: (key: string, value: string) => void; } -interface DeleteOperation { +export interface DeleteOperation { key: string; value?: string; } -interface UpdateOperation { +export interface UpdateOperation { key: string; match: string; value: string | string[]; diff --git a/web/src/pages/dataset/components/metedata/manage-modal-column.tsx b/web/src/pages/dataset/components/metedata/manage-modal-column.tsx index 9441661a8..b5270ca34 100644 --- a/web/src/pages/dataset/components/metedata/manage-modal-column.tsx +++ b/web/src/pages/dataset/components/metedata/manage-modal-column.tsx @@ -4,12 +4,7 @@ import { Input } from '@/components/ui/input'; import { DateInput } from '@/components/ui/input-date'; import { formatDate } from '@/utils/date'; import { ColumnDef, Row, Table } from '@tanstack/react-table'; -import { - ListChevronsDownUp, - ListChevronsUpDown, - Settings, - Trash2, -} from 'lucide-react'; +import { ListChevronsDownUp, Settings, Trash2 } from 'lucide-react'; import { useCallback, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { @@ -51,12 +46,16 @@ export const useMetadataColumns = ({ onOk: () => {}, onCancel: () => {}, }); - const [expanded, setExpanded] = useState(true); + // const [expanded, setExpanded] = useState(true); const [editingValue, setEditingValue] = useState<{ field: string; value: string; newValue: string; } | null>(null); + const [rowExpandedStates, setRowExpandedStates] = useState< + Record + >({}); + const isSettingsMode = metadataType === MetadataType.Setting || metadataType === MetadataType.SingleFileSetting || @@ -142,21 +141,7 @@ export const useMetadataColumns = ({ ), }, - // ...(showTypeColumn - // ? ([ - // { - // accessorKey: 'valueType', - // header: () => Type, - // cell: ({ row }) => ( - //
- // {getMetadataValueTypeLabel( - // row.original.valueType as IMetaDataTableData['valueType'], - // )} - //
- // ), - // }, - // ] as ColumnDef[]) - // : []), + { accessorKey: 'description', header: () => {t('knowledgeDetails.metadata.description')}, @@ -182,7 +167,7 @@ export const useMetadataColumns = ({ header: () => (
{t('knowledgeDetails.metadata.values')} -
{ setExpanded(!expanded); @@ -194,16 +179,25 @@ export const useMetadataColumns = ({ )} {expanded} -
+
*/} ), cell: ({ row }) => { const values = row.getValue('values') as Array; - const displayedValues = expanded ? values : values.slice(0, 2); + const isRowExpanded = rowExpandedStates[row.original.field] ?? false; + + const toggleRowExpanded = () => { + setRowExpandedStates((prev) => ({ + ...prev, + [row.original.field]: !isRowExpanded, + })); + }; + + const displayedValues = isRowExpanded ? values : values.slice(0, 2); const hasMore = Array.isArray(values) && values.length > 2; return ( -
+
{displayedValues?.map((value: string) => { const isEditing = @@ -218,7 +212,6 @@ export const useMetadataColumns = ({ { - console.log('value', value); const newValue = { ...editingValue, newValue: formatDate( @@ -228,13 +221,7 @@ export const useMetadataColumns = ({ }; setEditingValue(newValue); saveEditedValue(newValue); - // onValueChange(index, formatDate(value), true); }} - // openChange={(open) => { - // console.log('open', open); - // if (!open) { - // } - // }} showTimeSelect={true} /> )} @@ -249,7 +236,7 @@ export const useMetadataColumns = ({ newValue: e.target.value, }) } - onBlur={saveEditedValue} + onBlur={() => saveEditedValue()} onKeyDown={(e) => { if (e.key === 'Enter') { saveEditedValue(); @@ -316,10 +303,37 @@ export const useMetadataColumns = ({ ); })} - {hasMore && !expanded && ( -
...
- )}
+ {hasMore && !isRowExpanded && ( + + )} + {hasMore && isRowExpanded && ( + //
+ + //
+ )}
); }, @@ -390,10 +404,10 @@ export const useMetadataColumns = ({ isDeleteSingleValue, handleEditValueRow, metadataType, - expanded, + // expanded, editingValue, saveEditedValue, - showTypeColumn, + rowExpandedStates, ]); return { diff --git a/web/src/pages/dataset/components/metedata/manage-modal.tsx b/web/src/pages/dataset/components/metedata/manage-modal.tsx index 5bb9832e6..23b1a8d98 100644 --- a/web/src/pages/dataset/components/metedata/manage-modal.tsx +++ b/web/src/pages/dataset/components/metedata/manage-modal.tsx @@ -69,6 +69,7 @@ export const ManageMetadataModal = (props: IManageModalProps) => { builtInMetadata, success, documentIds, + secondTitle, } = props; const { t } = useTranslation(); const [valueData, setValueData] = useState({ @@ -316,7 +317,9 @@ export const ManageMetadataModal = (props: IManageModalProps) => { <>
-
{t('knowledgeDetails.metadata.metadata')}
+
+ {secondTitle || t('knowledgeDetails.metadata.metadata')} +
{metadataType === MetadataType.Manage && (
) } @@ -255,6 +262,7 @@ export default function Dataset() { isVerticalShowValue={metadataConfig.isVerticalShowValue} isEditField={metadataConfig.isEditField} isDeleteSingleValue={metadataConfig.isDeleteSingleValue} + secondTitle={metadataConfig.secondTitle} type={metadataConfig.type} documentIds={metadataConfig.documentIds} otherData={metadataConfig.record} diff --git a/web/src/pages/dataset/dataset/use-bulk-operate-dataset.tsx b/web/src/pages/dataset/dataset/use-bulk-operate-dataset.tsx index ae83ebde4..fda05c870 100644 --- a/web/src/pages/dataset/dataset/use-bulk-operate-dataset.tsx +++ b/web/src/pages/dataset/dataset/use-bulk-operate-dataset.tsx @@ -9,7 +9,14 @@ import { useSetDocumentStatus, } from '@/hooks/use-document-request'; import { IDocumentInfo } from '@/interfaces/database/document'; -import { Ban, CircleCheck, CircleX, PenIcon, Play, Trash2 } from 'lucide-react'; +import { + Ban, + CircleCheck, + CircleX, + Cylinder, + Play, + Trash2, +} from 'lucide-react'; import { useCallback, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { toast } from 'sonner'; @@ -143,7 +150,7 @@ export function useBulkOperateDataset({ { id: 'batch-metadata', label: t('knowledgeDetails.metadata.metadata'), - icon: , + icon: , }, ]; diff --git a/web/src/pages/dataset/dataset/use-dataset-table-columns.tsx b/web/src/pages/dataset/dataset/use-dataset-table-columns.tsx index 7e94fb1b4..7244fdf4a 100644 --- a/web/src/pages/dataset/dataset/use-dataset-table-columns.tsx +++ b/web/src/pages/dataset/dataset/use-dataset-table-columns.tsx @@ -191,10 +191,16 @@ export function useDatasetTableColumns({
{t('metadata.editMetadata')}
-
+ {/*
{t('metadata.editMetadataForDataset')} {row.original.name} -
+
*/} +
+ ), + secondTitle: ( +
+ +
{row.original.name}
), isDeleteSingleValue: true,