From 2fa26828d2696ab883615cae02b7035f5ef6cecd Mon Sep 17 00:00:00 2001 From: Zeke Zhang <958414905@qq.com> Date: Thu, 12 Jun 2025 23:50:30 +0800 Subject: [PATCH 1/6] feat: add quick copy plugin (#6954) * Revert "Revert "feat: new plugin `plugin-input-copy-button` (#6894)"" This reverts commit 49511e2dd6656c72b79f9bd05f61ed7673b1d075. * Revert "Revert "fix: improve visibility toggle for input copy button on mouse events"" This reverts commit 9137ad651506718626f22ee48bd8c839baf6bf91. * fix: update version to 1.6.34 for input copy button plugin * fix: adjust margin style for InputCopyButton based on field readPretty state * fix: remove unused keywords from package.json for input copy button plugin * fix: add input copy button plugin to dependencies in package.json * fix: update version of input copy button plugin to 1.6.36 * chore: update version of @nocobase/plugin-input-copy-button to 1.7.10 * refactor: rename to plugin-text-copy * fix: update translation key from 'Show copy button' to 'Display copy button' * fix: add optional chaining to event listener for safety * test(e2e): update visibility check for 'Data sources' menu item in plugin settings permissions test --- .../antd/input/ReadPretty.tsx | 16 ++- .../src/client/__e2e__/configure.test.ts | 2 +- .../@nocobase/plugin-text-copy/.gitignore | 1 + .../@nocobase/plugin-text-copy/.npmignore | 2 + .../@nocobase/plugin-text-copy/README.md | 0 .../@nocobase/plugin-text-copy/client.d.ts | 2 + .../@nocobase/plugin-text-copy/client.js | 1 + .../@nocobase/plugin-text-copy/package.json | 28 +++++ .../@nocobase/plugin-text-copy/server.d.ts | 2 + .../@nocobase/plugin-text-copy/server.js | 1 + .../plugin-text-copy/src/client/index.tsx | 112 ++++++++++++++++++ .../@nocobase/plugin-text-copy/src/index.ts | 11 ++ .../plugin-text-copy/src/locale/en-US.json | 3 + .../plugin-text-copy/src/locale/ja-JP.json | 3 + .../plugin-text-copy/src/locale/zh-CN.json | 3 + .../plugin-text-copy/src/server/index.ts | 18 +++ packages/presets/nocobase/package.json | 2 + 17 files changed, 201 insertions(+), 6 deletions(-) create mode 100644 packages/plugins/@nocobase/plugin-text-copy/.gitignore create mode 100644 packages/plugins/@nocobase/plugin-text-copy/.npmignore create mode 100644 packages/plugins/@nocobase/plugin-text-copy/README.md create mode 100644 packages/plugins/@nocobase/plugin-text-copy/client.d.ts create mode 100644 packages/plugins/@nocobase/plugin-text-copy/client.js create mode 100644 packages/plugins/@nocobase/plugin-text-copy/package.json create mode 100644 packages/plugins/@nocobase/plugin-text-copy/server.d.ts create mode 100644 packages/plugins/@nocobase/plugin-text-copy/server.js create mode 100644 packages/plugins/@nocobase/plugin-text-copy/src/client/index.tsx create mode 100644 packages/plugins/@nocobase/plugin-text-copy/src/index.ts create mode 100644 packages/plugins/@nocobase/plugin-text-copy/src/locale/en-US.json create mode 100644 packages/plugins/@nocobase/plugin-text-copy/src/locale/ja-JP.json create mode 100644 packages/plugins/@nocobase/plugin-text-copy/src/locale/zh-CN.json create mode 100644 packages/plugins/@nocobase/plugin-text-copy/src/server/index.ts diff --git a/packages/core/client/src/schema-component/antd/input/ReadPretty.tsx b/packages/core/client/src/schema-component/antd/input/ReadPretty.tsx index 770c530b7b2..479d07a25d2 100644 --- a/packages/core/client/src/schema-component/antd/input/ReadPretty.tsx +++ b/packages/core/client/src/schema-component/antd/input/ReadPretty.tsx @@ -59,13 +59,19 @@ ReadPretty.Input = (props: InputReadPrettyProps) => { return (
- {props.addonBefore} - {props.prefix} + {compile(props.addonBefore)} + {compile(props.prefix)} {props.ellipsis ? {content} : content} - {props.suffix} - {props.addonAfter} + {compile(props.suffix)} + {compile(props.addonAfter)}
); }; diff --git a/packages/plugins/@nocobase/plugin-acl/src/client/__e2e__/configure.test.ts b/packages/plugins/@nocobase/plugin-acl/src/client/__e2e__/configure.test.ts index cb949854ca8..4782757b8f6 100644 --- a/packages/plugins/@nocobase/plugin-acl/src/client/__e2e__/configure.test.ts +++ b/packages/plugins/@nocobase/plugin-acl/src/client/__e2e__/configure.test.ts @@ -155,5 +155,5 @@ test('plugin settings permissions', async ({ page, mockPage, mockRole, updateRol await expect(page.getByRole('link', { name: 'Users & Permissions' })).toBeVisible(); await expect(page.getByRole('link', { name: 'Authentication' })).toBeVisible(); await page.getByRole('link', { name: 'Users & Permissions' }).click(); - await expect(page.getByRole('menuitem', { name: 'Data sources' })).toBeVisible(); + await expect(page.getByRole('menuitem', { name: 'Data sources' }).first()).toBeVisible(); }); diff --git a/packages/plugins/@nocobase/plugin-text-copy/.gitignore b/packages/plugins/@nocobase/plugin-text-copy/.gitignore new file mode 100644 index 00000000000..0f33a9bba1a --- /dev/null +++ b/packages/plugins/@nocobase/plugin-text-copy/.gitignore @@ -0,0 +1 @@ +dist diff --git a/packages/plugins/@nocobase/plugin-text-copy/.npmignore b/packages/plugins/@nocobase/plugin-text-copy/.npmignore new file mode 100644 index 00000000000..65f5e8779f4 --- /dev/null +++ b/packages/plugins/@nocobase/plugin-text-copy/.npmignore @@ -0,0 +1,2 @@ +/node_modules +/src diff --git a/packages/plugins/@nocobase/plugin-text-copy/README.md b/packages/plugins/@nocobase/plugin-text-copy/README.md new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/plugins/@nocobase/plugin-text-copy/client.d.ts b/packages/plugins/@nocobase/plugin-text-copy/client.d.ts new file mode 100644 index 00000000000..6c459cbac4c --- /dev/null +++ b/packages/plugins/@nocobase/plugin-text-copy/client.d.ts @@ -0,0 +1,2 @@ +export * from './dist/client'; +export { default } from './dist/client'; diff --git a/packages/plugins/@nocobase/plugin-text-copy/client.js b/packages/plugins/@nocobase/plugin-text-copy/client.js new file mode 100644 index 00000000000..b6e3be70e63 --- /dev/null +++ b/packages/plugins/@nocobase/plugin-text-copy/client.js @@ -0,0 +1 @@ +module.exports = require('./dist/client/index.js'); diff --git a/packages/plugins/@nocobase/plugin-text-copy/package.json b/packages/plugins/@nocobase/plugin-text-copy/package.json new file mode 100644 index 00000000000..5355429374f --- /dev/null +++ b/packages/plugins/@nocobase/plugin-text-copy/package.json @@ -0,0 +1,28 @@ +{ + "name": "@nocobase/plugin-text-copy", + "version": "1.7.10", + "main": "./dist/server/index.js", + "displayName": "Text copy", + "displayName.zh-CN": "文本复制", + "description": "Add copy button to text fields", + "description.zh-CN": "为文本字段添加复制按钮", + "license": "AGPL-3.0", + "homepage": "https://www.nocobase.com", + "devDependencies": { + "@ant-design/icons": "5.x", + "@formily/react": "2.x", + "antd": "5.x", + "react": "^18.2.0", + "react-i18next": "^11.15.1" + }, + "peerDependencies": { + "@nocobase/client": "1.x", + "@nocobase/server": "1.x", + "@nocobase/test": "1.x" + }, + "keywords": [ + "Clipboard", + "Copy" + ], + "gitHead": "d0b4efe4be55f8c79a98a331d99d9f8cf99021a1" +} diff --git a/packages/plugins/@nocobase/plugin-text-copy/server.d.ts b/packages/plugins/@nocobase/plugin-text-copy/server.d.ts new file mode 100644 index 00000000000..c41081ddc6d --- /dev/null +++ b/packages/plugins/@nocobase/plugin-text-copy/server.d.ts @@ -0,0 +1,2 @@ +export * from './dist/server'; +export { default } from './dist/server'; diff --git a/packages/plugins/@nocobase/plugin-text-copy/server.js b/packages/plugins/@nocobase/plugin-text-copy/server.js new file mode 100644 index 00000000000..972842039a6 --- /dev/null +++ b/packages/plugins/@nocobase/plugin-text-copy/server.js @@ -0,0 +1 @@ +module.exports = require('./dist/server/index.js'); diff --git a/packages/plugins/@nocobase/plugin-text-copy/src/client/index.tsx b/packages/plugins/@nocobase/plugin-text-copy/src/client/index.tsx new file mode 100644 index 00000000000..42addb8ffc3 --- /dev/null +++ b/packages/plugins/@nocobase/plugin-text-copy/src/client/index.tsx @@ -0,0 +1,112 @@ +/** + * This file is part of the NocoBase (R) project. + * Copyright (c) 2020-2024 NocoBase Co., Ltd. + * Authors: NocoBase Team. + * + * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License. + * For more information, please refer to: https://www.nocobase.com/agreement. + */ + +import { Field } from '@formily/core'; +import { observer, useField, useFieldSchema } from '@formily/react'; +import { Plugin, useColumnSchema, useDesignable, useToken } from '@nocobase/client'; +import { Typography } from 'antd'; +import _ from 'lodash'; +import React, { FC, useEffect, useRef } from 'react'; +import { useTranslation } from 'react-i18next'; + +// Define namespace for i18n +const NAMESPACE = 'text-copy'; + +const TextCopyButton: FC = observer( + () => { + const field = useField(); + const { token } = useToken(); + const buttonRef = useRef(null); + const [show, setShow] = React.useState(false); + + useEffect(() => { + if (field.value && field.readPretty && buttonRef.current) { + const currentRef = buttonRef.current; + const handleMouseOver = (e: MouseEvent) => { + setShow(true); + }; + const handleMouseOut = (e: MouseEvent) => { + setShow(false); + }; + + currentRef?.parentElement?.addEventListener('mouseover', handleMouseOver); + currentRef?.parentElement?.addEventListener('mouseout', handleMouseOut); + + return () => { + currentRef?.parentElement?.removeEventListener('mouseover', handleMouseOver); + currentRef?.parentElement?.removeEventListener('mouseout', handleMouseOut); + }; + } + }, [field.readPretty, field.value]); + + const hidden = field.readPretty && (!field.value || !show); + + return ( +