From c46726ddc8f42f61cb8e2b4eba602e9382d444a6 Mon Sep 17 00:00:00 2001 From: Faran Javed Date: Thu, 23 Apr 2026 01:25:17 +0500 Subject: [PATCH] fix: copy components global canvas issue --- .../src/comps/utils/gridCompOperator.ts | 9 +-------- .../src/comps/utils/hookCompOperator.ts | 11 +---------- .../src/pages/editor/editorHotKeys.tsx | 19 +++++++++++++------ 3 files changed, 15 insertions(+), 24 deletions(-) diff --git a/client/packages/lowcoder/src/comps/utils/gridCompOperator.ts b/client/packages/lowcoder/src/comps/utils/gridCompOperator.ts index 7967b3484..75093b870 100644 --- a/client/packages/lowcoder/src/comps/utils/gridCompOperator.ts +++ b/client/packages/lowcoder/src/comps/utils/gridCompOperator.ts @@ -152,13 +152,7 @@ export class GridCompOperator { const payload = buildEmptyPayload(); payload.sourcePositionParams = sourcePositionParams; payload.gridItems = gridItems; - const written = await writeToClipboard(payload); - if (written) { - messageInstance.success(trans("gridCompOperator.copyCompsSuccess", { compNum: gridItems.length })); - } else { - messageInstance.error(trans("gridCompOperator.clipboardWriteError")); - } - return written; + return writeToClipboard(payload); } static pasteFromPayload(editorState: EditorState, payload: LowcoderClipboardPayload): boolean { @@ -244,7 +238,6 @@ export class GridCompOperator { }) ); editorState.setSelectedCompNames(copyCompNames); - messageInstance.success(trans("gridCompOperator.pasteCompsSuccess", { compNum: copyCompNames.size })); return true; } diff --git a/client/packages/lowcoder/src/comps/utils/hookCompOperator.ts b/client/packages/lowcoder/src/comps/utils/hookCompOperator.ts index d99492697..dd7e5bf3b 100644 --- a/client/packages/lowcoder/src/comps/utils/hookCompOperator.ts +++ b/client/packages/lowcoder/src/comps/utils/hookCompOperator.ts @@ -2,8 +2,6 @@ import { HookComp } from "comps/hooks/hookComp"; import { EditorState } from "comps/editorState"; import { singletonHookComp } from "comps/hooks/hookCompTypes"; import { wrapActionExtraInfo } from "lowcoder-core"; -import { messageInstance } from "lowcoder-design"; -import { trans } from "i18n"; import { writeHookOnlyToClipboard, type ClipboardHookItem, @@ -40,13 +38,7 @@ export class HookCompOperator { return { compType, comp, name, fullValue }; }); - const written = await writeHookOnlyToClipboard(hookItems); - if (written) { - messageInstance.success(trans("gridCompOperator.copyCompsSuccess", { compNum: hookItems.length })); - } else { - messageInstance.error(trans("gridCompOperator.clipboardWriteError")); - } - return written; + return writeHookOnlyToClipboard(hookItems); } static pasteFromPayload(editorState: EditorState, payload: LowcoderClipboardPayload): boolean { @@ -86,7 +78,6 @@ export class HookCompOperator { }); editorState.setSelectedCompNames(newNames, "leftPanel"); - messageInstance.success(trans("gridCompOperator.pasteCompsSuccess", { compNum: newNames.size })); return true; } } diff --git a/client/packages/lowcoder/src/pages/editor/editorHotKeys.tsx b/client/packages/lowcoder/src/pages/editor/editorHotKeys.tsx index 3998cb401..00456fe1c 100644 --- a/client/packages/lowcoder/src/pages/editor/editorHotKeys.tsx +++ b/client/packages/lowcoder/src/pages/editor/editorHotKeys.tsx @@ -2,13 +2,12 @@ import React, { useCallback, useContext, useRef, useEffect } from "react"; import { EditorContext, EditorState } from "comps/editorState"; import { GridCompOperator, readFromClipboard } from "comps/utils/gridCompOperator"; import { HookCompOperator } from "comps/utils/hookCompOperator"; -import { messageInstance } from "lowcoder-design"; -import { trans } from "i18n"; import { ExternalEditorContext } from "util/context/ExternalEditorContext"; import { EditorHistory } from "util/editoryHistory"; import { executeQueryAction } from "lowcoder-core"; import { GlobalShortcutsWrapper, + isFilterInputTarget, modKeyPressed, selectCompModifierKeyPressed, ShortcutsWrapper, @@ -20,6 +19,11 @@ import { preview } from "constants/routesURL"; import { useApplicationId } from "util/hooks"; import { useUnmount } from "react-use"; + +function isNativeClipboardContext(e: KeyboardEvent | React.KeyboardEvent): boolean { + return isFilterInputTarget(e) || !!window.getSelection?.()?.toString(); +} + async function handleCopyComps(editorState: EditorState) { const isHook = await HookCompOperator.copyComp(editorState); if (!isHook) { @@ -30,7 +34,6 @@ async function handleCopyComps(editorState: EditorState) { async function handlePasteComps(editorState: EditorState) { const payload = await readFromClipboard(); if (!payload) { - messageInstance.info(trans("gridCompOperator.selectCompFirst")); return; } @@ -98,9 +101,10 @@ function handleGlobalKeyDown( break; } default: - if (modKeyPressed(e)) { + if (modKeyPressed(e) && !isNativeClipboardContext(e)) { const key = e.key?.toLowerCase(); - if (key === "c") { + const hasSelectedComps = editorState.selectedCompNames.size > 0; + if (key === "c" && hasSelectedComps) { handleCopyComps(editorState); break; } @@ -108,7 +112,7 @@ function handleGlobalKeyDown( handlePasteComps(editorState); break; } - if (key === "x") { + if (key === "x" && hasSelectedComps) { GridCompOperator.cutComp(editorState, editorState.selectedComps()); break; } @@ -236,12 +240,15 @@ function handleEditorKeyDown(e: React.KeyboardEvent, editorState: EditorState) { e.stopPropagation(); return; case "copyComps": + if (isNativeClipboardContext(e) || editorState.selectedCompNames.size === 0) return; handleCopyComps(editorState); return; case "pasteComps": + if (isNativeClipboardContext(e)) return; handlePasteComps(editorState); return; case "cutComps": + if (isNativeClipboardContext(e) || editorState.selectedCompNames.size === 0) return; GridCompOperator.cutComp(editorState, editorState.selectedComps()); return; case "deselectComps":