feat: Add remark function to knowledge url (#2210)

* chore: Update .gitignore to exclude .cursor/rules

* feat: Add remark function to knowledge url
This commit is contained in:
Asurada 2025-02-24 12:47:47 +08:00 committed by GitHub
parent f87ba144c8
commit af1a9868db
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 74 additions and 13 deletions

1
.gitignore vendored
View File

@ -46,3 +46,4 @@ stats.html
local local
.aider* .aider*
.cursorrules .cursorrules
.cursor/rules

View File

@ -316,7 +316,9 @@
"title": "Knowledge Base", "title": "Knowledge Base",
"url_added": "URL added", "url_added": "URL added",
"url_placeholder": "Enter URL, multiple URLs separated by Enter", "url_placeholder": "Enter URL, multiple URLs separated by Enter",
"urls": "URLs" "urls": "URLs",
"edit_remark": "Edit Remark",
"edit_remark_placeholder": "Please enter remark content"
}, },
"languages": { "languages": {
"arabic": "Arabic", "arabic": "Arabic",

View File

@ -316,7 +316,9 @@
"title": "ナレッジベース", "title": "ナレッジベース",
"url_added": "URLが追加されました", "url_added": "URLが追加されました",
"url_placeholder": "URLを入力, 複数のURLはEnterで区切る", "url_placeholder": "URLを入力, 複数のURLはEnterで区切る",
"urls": "URL" "urls": "URL",
"edit_remark": "備考を編集",
"edit_remark_placeholder": "備考内容を入力してください"
}, },
"languages": { "languages": {
"arabic": "アラビア語", "arabic": "アラビア語",

View File

@ -316,7 +316,9 @@
"title": "База знаний", "title": "База знаний",
"url_added": "URL добавлен", "url_added": "URL добавлен",
"url_placeholder": "Введите URL, несколько URL через Enter", "url_placeholder": "Введите URL, несколько URL через Enter",
"urls": "URL-адреса" "urls": "URL-адреса",
"edit_remark": "Изменить примечание",
"edit_remark_placeholder": "Пожалуйста, введите содержание примечания"
}, },
"languages": { "languages": {
"arabic": "Арабский", "arabic": "Арабский",

View File

@ -316,7 +316,9 @@
"title": "知识库", "title": "知识库",
"url_added": "网址已添加", "url_added": "网址已添加",
"url_placeholder": "请输入网址, 多个网址用回车分隔", "url_placeholder": "请输入网址, 多个网址用回车分隔",
"urls": "网址" "urls": "网址",
"edit_remark": "修改备注",
"edit_remark_placeholder": "请输入备注内容"
}, },
"languages": { "languages": {
"arabic": "阿拉伯文", "arabic": "阿拉伯文",

View File

@ -316,7 +316,9 @@
"title": "知識庫", "title": "知識庫",
"url_added": "網址已添加", "url_added": "網址已添加",
"url_placeholder": "請輸入網址, 多個網址用回車分隔", "url_placeholder": "請輸入網址, 多個網址用回車分隔",
"urls": "網址" "urls": "網址",
"edit_remark": "修改備註",
"edit_remark_placeholder": "請輸入備註內容"
}, },
"languages": { "languages": {
"arabic": "阿拉伯文", "arabic": "阿拉伯文",

View File

@ -1,4 +1,5 @@
import { import {
CopyOutlined,
DeleteOutlined, DeleteOutlined,
EditOutlined, EditOutlined,
FileTextOutlined, FileTextOutlined,
@ -17,9 +18,9 @@ import Scrollbar from '@renderer/components/Scrollbar'
import { useKnowledge } from '@renderer/hooks/useKnowledge' import { useKnowledge } from '@renderer/hooks/useKnowledge'
import FileManager from '@renderer/services/FileManager' import FileManager from '@renderer/services/FileManager'
import { getProviderName } from '@renderer/services/ProviderService' import { getProviderName } from '@renderer/services/ProviderService'
import { FileType, FileTypes, KnowledgeBase } from '@renderer/types' import { FileType, FileTypes, KnowledgeBase, KnowledgeItem } from '@renderer/types'
import { bookExts, documentExts, textExts, thirdPartyApplicationExts } from '@shared/config/constant' import { bookExts, documentExts, textExts, thirdPartyApplicationExts } from '@shared/config/constant'
import { Alert, Button, Card, Divider, message, Tag, Tooltip, Typography, Upload } from 'antd' import { Alert, Button, Card, Divider, Dropdown, message, Tag, Tooltip, Typography, Upload } from 'antd'
import { FC } from 'react' import { FC } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import styled from 'styled-components' import styled from 'styled-components'
@ -55,7 +56,8 @@ const KnowledgeContent: FC<KnowledgeContentProps> = ({ selectedBase }) => {
getProcessingStatus, getProcessingStatus,
getDirectoryProcessingPercent, getDirectoryProcessingPercent,
addNote, addNote,
addDirectory addDirectory,
updateItem
} = useKnowledge(selectedBase.id || '') } = useKnowledge(selectedBase.id || '')
const providerName = getProviderName(base?.model.provider || '') const providerName = getProviderName(base?.model.provider || '')
@ -197,6 +199,31 @@ const KnowledgeContent: FC<KnowledgeContentProps> = ({ selectedBase }) => {
path && addDirectory(path) path && addDirectory(path)
} }
const handleEditRemark = async (item: KnowledgeItem) => {
if (disabled) {
return
}
const editedRemark: string | undefined = await PromptPopup.show({
title: t('knowledge.edit_remark'),
message: '',
inputPlaceholder: t('knowledge.edit_remark_placeholder'),
defaultValue: item.remark || '',
inputProps: {
maxLength: 100,
rows: 1
}
})
if (editedRemark !== undefined && editedRemark !== null) {
updateItem({
...item,
remark: editedRemark,
updated_at: Date.now()
})
}
}
return ( return (
<MainContent> <MainContent>
{!base?.version && ( {!base?.version && (
@ -303,11 +330,33 @@ const KnowledgeContent: FC<KnowledgeContentProps> = ({ selectedBase }) => {
<ItemContent> <ItemContent>
<ItemInfo> <ItemInfo>
<LinkOutlined /> <LinkOutlined />
<Dropdown
menu={{
items: [
{
key: 'edit',
icon: <EditOutlined />,
label: t('knowledge.edit_remark'),
onClick: () => handleEditRemark(item)
},
{
key: 'copy',
icon: <CopyOutlined />,
label: t('common.copy'),
onClick: () => {
navigator.clipboard.writeText(item.content as string)
message.success(t('message.copied'))
}
}
]
}}
trigger={['contextMenu']}>
<a href={item.content as string} target="_blank" rel="noopener noreferrer"> <a href={item.content as string} target="_blank" rel="noopener noreferrer">
<Tooltip title={item.content as string}> <Tooltip title={item.content as string}>
<Ellipsis text={item.content as string} /> <Ellipsis text={item.remark || (item.content as string)} />
</Tooltip> </Tooltip>
</a> </a>
</Dropdown>
</ItemInfo> </ItemInfo>
<FlexAlignCenter> <FlexAlignCenter>
{item.uniqueId && <Button type="text" icon={<RefreshIcon />} onClick={() => refreshItem(item)} />} {item.uniqueId && <Button type="text" icon={<RefreshIcon />} onClick={() => refreshItem(item)} />}

View File

@ -228,6 +228,7 @@ export type KnowledgeItem = {
uniqueIds?: string[] uniqueIds?: string[]
type: KnowledgeItemType type: KnowledgeItemType
content: string | FileType content: string | FileType
remark?: string
created_at: number created_at: number
updated_at: number updated_at: number
processingStatus?: ProcessingStatus processingStatus?: ProcessingStatus