From 2ade08a9b731ace937d0ce61f36b37638846852f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=A8=E5=AD=90=E4=B8=8D=E6=98=AF=E6=9C=A8=E5=AD=90?= =?UTF-8?q?=E7=8B=B8?= <75201518+RechardLLee@users.noreply.github.com> Date: Sun, 27 Apr 2025 19:41:30 +0800 Subject: [PATCH] #4288 Added a "Copy" button next to each search result. (#5389) Co-authored-by: eeee0717 Co-authored-by: Chen Tao <70054568+eeee0717@users.noreply.github.com> --- .../components/KnowledgeSearchPopup.tsx | 48 +++++++++++++++++-- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/src/renderer/src/pages/knowledge/components/KnowledgeSearchPopup.tsx b/src/renderer/src/pages/knowledge/components/KnowledgeSearchPopup.tsx index a2a74c3bab..fd76d870c5 100644 --- a/src/renderer/src/pages/knowledge/components/KnowledgeSearchPopup.tsx +++ b/src/renderer/src/pages/knowledge/components/KnowledgeSearchPopup.tsx @@ -1,9 +1,10 @@ +import { CopyOutlined } from '@ant-design/icons' import type { ExtractChunkData } from '@cherrystudio/embedjs-interfaces' import { TopView } from '@renderer/components/TopView' import { DEFAULT_KNOWLEDGE_THRESHOLD } from '@renderer/config/constant' import { getFileFromUrl, getKnowledgeBaseParams } from '@renderer/services/KnowledgeService' import { FileType, KnowledgeBase } from '@renderer/types' -import { Input, List, Modal, Spin, Typography } from 'antd' +import { Input, List, message, Modal, Spin, Tooltip, Typography } from 'antd' import { useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' @@ -93,6 +94,16 @@ const PopupContainer: React.FC = ({ base, resolve }) => { ) } + const handleCopy = async (text: string) => { + try { + await navigator.clipboard.writeText(text) + message.success(t('message.copied')) + } catch (error) { + console.error('Failed to copy text:', error) + message.error(t('message.copyError') || 'Failed to copy text') + } + } + return ( = ({ base, resolve }) => { renderItem={(item) => ( - Score: {(item.score * 100).toFixed(1)}% + + Score: {(item.score * 100).toFixed(1)}% + + handleCopy(item.pageContent)}> + + + + {highlightText(item.pageContent)} @@ -176,10 +194,16 @@ const ResultItem = styled.div` border-radius: 8px; ` -const ScoreTag = styled.div` +const TagContainer = styled.div` position: absolute; top: 8px; right: 8px; + display: flex; + align-items: center; + gap: 8px; +` + +const ScoreTag = styled.div` padding: 2px 8px; background: var(--color-primary); color: white; @@ -187,6 +211,24 @@ const ScoreTag = styled.div` font-size: 12px; ` +const CopyButton = styled.div` + display: flex; + align-items: center; + justify-content: center; + width: 24px; + height: 24px; + background: var(--color-background); + color: var(--color-text); + border-radius: 4px; + cursor: pointer; + transition: all 0.2s; + + &:hover { + background: var(--color-primary); + color: white; + } +` + const MetadataContainer = styled.div` margin-top: 8px; padding-top: 8px;