From 0a1e7ce5e0339580563ad7216ed89ae48e988022 Mon Sep 17 00:00:00 2001 From: pftom <1043269994@qq.com> Date: Fri, 14 Feb 2025 13:14:35 +0800 Subject: [PATCH 1/4] feat(knowledge): Add support for parsing resource data during file upload - Use `safeParseJSON` to parse resource data from string or object - Ensure flexible data handling in resource creation endpoint - Update resource creation method to include parsed data --- apps/api/src/knowledge/knowledge.controller.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/api/src/knowledge/knowledge.controller.ts b/apps/api/src/knowledge/knowledge.controller.ts index 0bc8725e3..4baf854e0 100644 --- a/apps/api/src/knowledge/knowledge.controller.ts +++ b/apps/api/src/knowledge/knowledge.controller.ts @@ -39,6 +39,7 @@ import { buildSuccessResponse } from '@/utils'; import { LoginedUser } from '@/utils/decorators/user.decorator'; import { documentPO2DTO, resourcePO2DTO, referencePO2DTO } from './knowledge.dto'; import { ParamsError } from '@refly-packages/errors'; +import { safeParseJSON } from '@refly-packages/utils'; @Controller('v1/knowledge') export class KnowledgeController { @@ -101,6 +102,7 @@ export class KnowledgeController { // Convert file content to string const content = file.buffer.toString('utf-8'); + const data = typeof body.data === 'object' ? body.data : safeParseJSON(body.data); // Create resource with file content const resource = await this.knowledgeService.createResource( @@ -108,6 +110,7 @@ export class KnowledgeController { { ...body, content, + data, }, { checkStorageQuota: true, From f8e63b4641181ecdae3fcbfbadf67e9f7d10a7e9 Mon Sep 17 00:00:00 2001 From: pftom <1043269994@qq.com> Date: Fri, 14 Feb 2025 13:15:08 +0800 Subject: [PATCH 2/4] feat(extension): Enhance web clipper with metadata editing and improved resource saving - Add collapsible metadata section for title and URL editing - Update content clipper UI with Form and Collapse components - Modify resource saving hook to support custom title and URL - Add new translation keys for metadata input placeholders - Adjust popup styling to accommodate new content clipper layout --- .../src/components/content-clipper/index.scss | 9 +++ .../src/components/content-clipper/index.tsx | 57 ++++++++++++++++--- apps/extension/src/entrypoints/popup/App.scss | 17 +++++- apps/extension/src/hooks/use-save-resource.ts | 23 ++++++-- apps/extension/src/i18n/cn/translation.ts | 6 ++ apps/extension/src/i18n/en/translation.ts | 6 ++ 6 files changed, 102 insertions(+), 16 deletions(-) create mode 100644 apps/extension/src/components/content-clipper/index.scss diff --git a/apps/extension/src/components/content-clipper/index.scss b/apps/extension/src/components/content-clipper/index.scss new file mode 100644 index 000000000..a3cdb40e1 --- /dev/null +++ b/apps/extension/src/components/content-clipper/index.scss @@ -0,0 +1,9 @@ +.content-clipper-collapse { + .ant-collapse-header { + padding: 0; + } + + .ant-collapse-content { + padding: 0; + } +} diff --git a/apps/extension/src/components/content-clipper/index.tsx b/apps/extension/src/components/content-clipper/index.tsx index 78437fadf..8f4470503 100644 --- a/apps/extension/src/components/content-clipper/index.tsx +++ b/apps/extension/src/components/content-clipper/index.tsx @@ -1,5 +1,5 @@ import React, { useCallback, useState, useEffect } from 'react'; -import { Button, Divider, Input, message, Tooltip } from 'antd'; +import { Button, Divider, Input, message, Tooltip, Form, Collapse } from 'antd'; import { IconDelete, IconPaste } from '@arco-design/web-react/icon'; import { HiOutlineDocumentDownload } from 'react-icons/hi'; import { useTranslation } from 'react-i18next'; @@ -14,6 +14,7 @@ import { BackgroundMessage } from '@refly/common-types'; import { getRuntime } from '@refly/utils/env'; const { TextArea } = Input; +const { Panel } = Collapse; interface ContentClipperProps { className?: string; @@ -174,17 +175,55 @@ export const ContentClipper: React.FC = ({ className, onSav setPageInfo((prev) => ({ ...prev, content: e.target.value })); }, []); + // Handle title change + const handleTitleChange = useCallback((e: React.ChangeEvent) => { + setPageInfo((prev) => ({ ...prev, title: e.target.value })); + }, []); + + // Handle URL change + const handleUrlChange = useCallback((e: React.ChangeEvent) => { + setPageInfo((prev) => ({ ...prev, url: e.target.value })); + }, []); + return (
-