mirror of
https://github.com/infiniflow/ragflow.git
synced 2025-12-30 00:32:30 +08:00
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:
@ -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
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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.',
|
||||||
|
|||||||
@ -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:
|
||||||
'此字段及其所有对应值将从所有关联的文件中删除。',
|
'此字段及其所有对应值将从所有关联的文件中删除。',
|
||||||
|
|||||||
@ -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'),
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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(() => {
|
||||||
|
|||||||
@ -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],
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user