Fix: Metadata tips info (#12209)

### What problem does this PR solve?

Fix: Metadata tips info

### Type of change

- [x] Bug Fix (non-breaking change which fixes an issue)
This commit is contained in:
chanx
2025-12-25 15:55:06 +08:00
committed by GitHub
parent f6217bb990
commit 2817be14d5
10 changed files with 76 additions and 25 deletions

View File

@ -170,7 +170,7 @@ const Modal: ModalType = ({
<DialogPrimitive.Root open={open} onOpenChange={handleChange}> <DialogPrimitive.Root open={open} onOpenChange={handleChange}>
<DialogPrimitive.Portal> <DialogPrimitive.Portal>
<DialogPrimitive.Overlay <DialogPrimitive.Overlay
className="fixed inset-0 z-50 bg-bg-card backdrop-blur-sm flex items-center justify-center p-4" className="fixed inset-0 z-50 bg-bg-card backdrop-blur-[1px] flex items-center justify-center p-4"
onClick={() => maskClosable && onOpenChange?.(false)} onClick={() => maskClosable && onOpenChange?.(false)}
> >
<DialogPrimitive.Content <DialogPrimitive.Content

View File

@ -37,6 +37,15 @@ const handleDocHelpCLick = () => {
window.open('https://ragflow.io/docs/dev/category/guides', 'target'); window.open('https://ragflow.io/docs/dev/category/guides', 'target');
}; };
const PathMap = {
[Routes.Datasets]: [Routes.Datasets],
[Routes.Chats]: [Routes.Chats],
[Routes.Searches]: [Routes.Searches],
[Routes.Agents]: [Routes.Agents],
[Routes.Memories]: [Routes.Memories, Routes.Memory, Routes.MemoryMessage],
[Routes.Files]: [Routes.Files],
} as const;
export function Header() { export function Header() {
const { t } = useTranslation(); const { t } = useTranslation();
const { pathname } = useLocation(); const { pathname } = useLocation();
@ -106,6 +115,18 @@ export function Header() {
navigate(Routes.Root); navigate(Routes.Root);
}, [navigate]); }, [navigate]);
const activePathName = useMemo(() => {
const name = Object.keys(PathMap).find((x: string) => {
const pathList = PathMap[x as keyof typeof PathMap];
return pathList.some((y: string) => pathname.indexOf(y) > -1);
});
if (name) {
return name;
} else {
return pathname;
}
}, [pathname]);
return ( return (
<section className="py-5 px-10 flex justify-between items-center "> <section className="py-5 px-10 flex justify-between items-center ">
<div className="flex items-center gap-4"> <div className="flex items-center gap-4">
@ -121,7 +142,7 @@ export function Header() {
sizeType="xl" sizeType="xl"
buttonSize="xl" buttonSize="xl"
options={options} options={options}
value={pathname} value={activePathName}
onChange={handleChange} onChange={handleChange}
activeClassName="text-bg-base bg-metallic-gradient border-b-[#00BEB4] border-b-2" activeClassName="text-bg-base bg-metallic-gradient border-b-[#00BEB4] border-b-2"
></Segmented> ></Segmented>

View File

@ -184,6 +184,10 @@ Procedural Memory: Learned skills, habits, and automated procedures.`,
'Value already exists. Confirm to merge duplicates and combine all associated files.', 'Value already exists. Confirm to merge duplicates and combine all associated files.',
fieldNameExists: fieldNameExists:
'Field name already exists. Confirm to merge duplicates and combine all associated files.', 'Field name already exists. Confirm to merge duplicates and combine all associated files.',
valueSingleExists:
'Value already exists. Confirm to merge duplicates .',
fieldSingleNameExists:
'Field name already exists. Confirm to merge duplicates .',
fieldExists: 'Field already exists.', fieldExists: 'Field already exists.',
fieldSetting: 'Field settings', fieldSetting: 'Field settings',
changesAffectNewParses: 'Changes affect new parses only.', changesAffectNewParses: 'Changes affect new parses only.',

View File

@ -171,11 +171,16 @@ export default {
descriptionTip: descriptionTip:
'提供描述或示例来指导大语言模型为此字段提取值。如果留空,将依赖字段名称。', '提供描述或示例来指导大语言模型为此字段提取值。如果留空,将依赖字段名称。',
restrictTDefinedValuesTip: restrictTDefinedValuesTip:
'枚举模式:限制大语言模型提取预设值。在下方定义值。', '枚举模式:限制大语言模型提取的值只能匹配预设值。在下方定义值。',
valueExists: '值已存在。确认合并重复项并组合所有关联文件。',
fieldNameExists: '字段名已存在。确认合并重复项并组合所有关联文件。',
valueSingleExists: '值已存在。确认合并重复项。',
fieldSingleNameExists: '字段名已存在。确认合并重复项。',
fieldExists: '字段名已存在。',
fieldSetting: '字段设置', fieldSetting: '字段设置',
changesAffectNewParses: '更改仅影响新解析。', changesAffectNewParses: '更改仅影响新解析。',
editMetadataForDataset: '查看和编辑元数据 ', editMetadataForDataset: '查看和编辑元数据 ',
restrictDefinedValues: '限制为已定义值', restrictDefinedValues: '限制为已定义值',
metadataGenerationSettings: '元数据生成设置', metadataGenerationSettings: '元数据生成设置',
manageMetadataForDataset: '管理此数据集的元数据', manageMetadataForDataset: '管理此数据集的元数据',
manageMetadata: '管理元数据', manageMetadata: '管理元数据',
@ -185,11 +190,8 @@ export default {
action: '操作', action: '操作',
field: '字段', field: '字段',
description: '描述', description: '描述',
fieldName: '字段名', fieldName: '字段名',
editMetadata: '编辑元数据', editMetadata: '编辑元数据',
valueExists: '值已存在。确认合并重复项并组合所有关联文件。',
fieldNameExists: '字段名已存在。确认合并重复项并组合所有关联文件。',
fieldExists: '字段名已存在。',
deleteWarn: '此 {{field}} 将从所有关联文件中移除', deleteWarn: '此 {{field}} 将从所有关联文件中移除',
deleteManageFieldAllWarn: deleteManageFieldAllWarn:
'此字段及其所有对应值将从所有关联的文件中删除。', '此字段及其所有对应值将从所有关联的文件中删除。',

View File

@ -32,28 +32,42 @@ export const MetadataDeleteMap = (
t: TFunction<'translation', undefined>, t: TFunction<'translation', undefined>,
): Record< ): Record<
MetadataType, MetadataType,
{ title: string; warnFieldText: string; warnValueText: string } {
title: string;
warnFieldText: string;
warnValueText: string;
warnFieldName: string;
warnValueName: string;
}
> => { > => {
return { return {
[MetadataType.Manage]: { [MetadataType.Manage]: {
title: t('common.delete') + ' ' + t('knowledgeDetails.metadata.metadata'), title: t('common.delete') + ' ' + t('knowledgeDetails.metadata.metadata'),
warnFieldText: t('knowledgeDetails.metadata.deleteManageFieldAllWarn'), warnFieldText: t('knowledgeDetails.metadata.deleteManageFieldAllWarn'),
warnValueText: t('knowledgeDetails.metadata.deleteManageValueAllWarn'), warnValueText: t('knowledgeDetails.metadata.deleteManageValueAllWarn'),
warnFieldName: t('knowledgeDetails.metadata.fieldNameExists'),
warnValueName: t('knowledgeDetails.metadata.valueExists'),
}, },
[MetadataType.Setting]: { [MetadataType.Setting]: {
title: t('common.delete') + ' ' + t('knowledgeDetails.metadata.metadata'), title: t('common.delete') + ' ' + t('knowledgeDetails.metadata.metadata'),
warnFieldText: t('knowledgeDetails.metadata.deleteSettingFieldWarn'), warnFieldText: t('knowledgeDetails.metadata.deleteSettingFieldWarn'),
warnValueText: t('knowledgeDetails.metadata.deleteSettingValueWarn'), warnValueText: t('knowledgeDetails.metadata.deleteSettingValueWarn'),
warnFieldName: t('knowledgeDetails.metadata.fieldExists'),
warnValueName: t('knowledgeDetails.metadata.valueExists'),
}, },
[MetadataType.UpdateSingle]: { [MetadataType.UpdateSingle]: {
title: t('common.delete') + ' ' + t('knowledgeDetails.metadata.metadata'), title: t('common.delete') + ' ' + t('knowledgeDetails.metadata.metadata'),
warnFieldText: t('knowledgeDetails.metadata.deleteManageFieldSingleWarn'), warnFieldText: t('knowledgeDetails.metadata.deleteManageFieldSingleWarn'),
warnValueText: t('knowledgeDetails.metadata.deleteManageValueSingleWarn'), warnValueText: t('knowledgeDetails.metadata.deleteManageValueSingleWarn'),
warnFieldName: t('knowledgeDetails.metadata.fieldSingleNameExists'),
warnValueName: t('knowledgeDetails.metadata.valueSingleExists'),
}, },
[MetadataType.SingleFileSetting]: { [MetadataType.SingleFileSetting]: {
title: t('common.delete') + ' ' + t('knowledgeDetails.metadata.metadata'), title: t('common.delete') + ' ' + t('knowledgeDetails.metadata.metadata'),
warnFieldText: t('knowledgeDetails.metadata.deleteSettingFieldWarn'), warnFieldText: t('knowledgeDetails.metadata.deleteSettingFieldWarn'),
warnValueText: t('knowledgeDetails.metadata.deleteSettingValueWarn'), warnValueText: t('knowledgeDetails.metadata.deleteSettingValueWarn'),
warnFieldName: t('knowledgeDetails.metadata.fieldExists'),
warnValueName: t('knowledgeDetails.metadata.valueSingleExists'),
}, },
}; };
}; };

View File

@ -47,10 +47,10 @@ export const useManageValues = (props: IManageValuesProps) => {
setValueError((prev) => { setValueError((prev) => {
return { return {
...prev, ...prev,
field: field: MetadataDeleteMap(t)[type as MetadataType].warnFieldName,
type === MetadataType.Setting // type === MetadataType.Setting
? t('knowledgeDetails.metadata.fieldExists') // ? t('knowledgeDetails.metadata.fieldExists')
: t('knowledgeDetails.metadata.fieldNameExists'), // : t('knowledgeDetails.metadata.fieldNameExists'),
}; };
}); });
} else if (field === 'field' && !existsKeys.includes(value)) { } else if (field === 'field' && !existsKeys.includes(value)) {
@ -103,7 +103,8 @@ export const useManageValues = (props: IManageValuesProps) => {
setValueError((prev) => { setValueError((prev) => {
return { return {
...prev, ...prev,
values: t('knowledgeDetails.metadata.valueExists'), values: MetadataDeleteMap(t)[type as MetadataType].warnValueName,
// t('knowledgeDetails.metadata.valueExists'),
}; };
}); });
} else { } else {
@ -120,7 +121,7 @@ export const useManageValues = (props: IManageValuesProps) => {
return newValues; return newValues;
}); });
}, },
[t], [t, type],
); );
// Handle blur event, synchronize to main state // Handle blur event, synchronize to main state

View File

@ -485,7 +485,7 @@ export const LLMSelect = ({
export function LLMModelItem({ line = 1, isEdit, label, name }: IProps) { export function LLMModelItem({ line = 1, isEdit, label, name }: IProps) {
const { t } = useTranslate('knowledgeConfiguration'); const { t } = useTranslate('knowledgeConfiguration');
const form = useFormContext(); const form = useFormContext();
const disabled = useHasParsedDocument(isEdit); // const disabled = useHasParsedDocument(isEdit);
return ( return (
<> <>
<FormField <FormField
@ -515,7 +515,7 @@ export function LLMModelItem({ line = 1, isEdit, label, name }: IProps) {
<LLMSelect <LLMSelect
isEdit={!!isEdit} isEdit={!!isEdit}
field={field} field={field}
disabled={disabled} disabled={false}
></LLMSelect> ></LLMSelect>
</FormControl> </FormControl>
</div> </div>

View File

@ -47,7 +47,7 @@ const InfoItem: React.FC<{
<span className="text-text-secondary text-sm">{label}</span> <span className="text-text-secondary text-sm">{label}</span>
<Tooltip> <Tooltip>
<TooltipTrigger asChild> <TooltipTrigger asChild>
<span className="text-text-primary mt-1 truncate max-w-[200px]"> <span className="text-text-primary mt-1 truncate w-full">
{value} {value}
</span> </span>
</TooltipTrigger> </TooltipTrigger>

View File

@ -3,6 +3,7 @@
import message from '@/components/ui/message'; import message from '@/components/ui/message';
import { useSetModalState } from '@/hooks/common-hooks'; import { useSetModalState } from '@/hooks/common-hooks';
import { useHandleSearchChange } from '@/hooks/logic-hooks'; import { useHandleSearchChange } from '@/hooks/logic-hooks';
import { useFetchTenantInfo } from '@/hooks/use-user-setting-request';
import memoryService, { updateMemoryById } from '@/services/memory-service'; import memoryService, { updateMemoryById } from '@/services/memory-service';
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
import { useDebounce } from 'ahooks'; import { useDebounce } from 'ahooks';
@ -216,15 +217,22 @@ export const useRenameMemory = () => {
const { updateMemory } = useUpdateMemory(); const { updateMemory } = useUpdateMemory();
const { createMemory } = useCreateMemory(); const { createMemory } = useCreateMemory();
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
const { data: tenantInfo } = useFetchTenantInfo();
const handleShowChatRenameModal = useCallback( const handleShowChatRenameModal = useCallback(
(record?: IMemory) => { (record?: IMemory) => {
if (record) { if (record) {
setMemory(record); const embd_id = record.embd_id || tenantInfo?.embd_id;
const llm_id = record.llm_id || tenantInfo?.llm_id;
setMemory({
...record,
embd_id,
llm_id,
});
} }
showChatRenameModal(); showChatRenameModal();
}, },
[showChatRenameModal], [showChatRenameModal, tenantInfo],
); );
const handleHideModal = useCallback(() => { const handleHideModal = useCallback(() => {

View File

@ -117,12 +117,13 @@ export const useMessageAction = () => {
data: messageContent, data: messageContent,
isPending: fetchMessageContentLoading, isPending: fetchMessageContentLoading,
mutateAsync: fetchMessageContent, mutateAsync: fetchMessageContent,
} = useMutation<IMessageContentProps>({ } = useMutation<IMessageContentProps, Error, IMessageInfo>({
mutationKey: [ mutationKey: [
MemoryApiAction.FetchMessageContent, MemoryApiAction.FetchMessageContent,
selectedMessage.message_id, selectedMessage.message_id,
], ],
mutationFn: async () => {
mutationFn: async (selectedMessage: IMessageInfo) => {
setShowMessageContentDialog(true); setShowMessageContentDialog(true);
const res = await memoryService.getMessageContent({ const res = await memoryService.getMessageContent({
memory_id: memoryId, memory_id: memoryId,
@ -140,7 +141,7 @@ export const useMessageAction = () => {
const handleClickMessageContentDialog = useCallback( const handleClickMessageContentDialog = useCallback(
(message: IMessageInfo) => { (message: IMessageInfo) => {
setSelectedMessage(message); setSelectedMessage(message);
fetchMessageContent(); fetchMessageContent(message);
}, },
[fetchMessageContent], [fetchMessageContent],
); );