Skip to content

Commit a70859b

Browse files
Merge pull request #2148 from iamfaran/fix/copy-components
fix: copy components global canvas issue
2 parents 699d6b4 + c46726d commit a70859b

3 files changed

Lines changed: 15 additions & 24 deletions

File tree

client/packages/lowcoder/src/comps/utils/gridCompOperator.ts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -152,13 +152,7 @@ export class GridCompOperator {
152152
const payload = buildEmptyPayload();
153153
payload.sourcePositionParams = sourcePositionParams;
154154
payload.gridItems = gridItems;
155-
const written = await writeToClipboard(payload);
156-
if (written) {
157-
messageInstance.success(trans("gridCompOperator.copyCompsSuccess", { compNum: gridItems.length }));
158-
} else {
159-
messageInstance.error(trans("gridCompOperator.clipboardWriteError"));
160-
}
161-
return written;
155+
return writeToClipboard(payload);
162156
}
163157

164158
static pasteFromPayload(editorState: EditorState, payload: LowcoderClipboardPayload): boolean {
@@ -244,7 +238,6 @@ export class GridCompOperator {
244238
})
245239
);
246240
editorState.setSelectedCompNames(copyCompNames);
247-
messageInstance.success(trans("gridCompOperator.pasteCompsSuccess", { compNum: copyCompNames.size }));
248241
return true;
249242
}
250243

client/packages/lowcoder/src/comps/utils/hookCompOperator.ts

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ import { HookComp } from "comps/hooks/hookComp";
22
import { EditorState } from "comps/editorState";
33
import { singletonHookComp } from "comps/hooks/hookCompTypes";
44
import { wrapActionExtraInfo } from "lowcoder-core";
5-
import { messageInstance } from "lowcoder-design";
6-
import { trans } from "i18n";
75
import {
86
writeHookOnlyToClipboard,
97
type ClipboardHookItem,
@@ -40,13 +38,7 @@ export class HookCompOperator {
4038
return { compType, comp, name, fullValue };
4139
});
4240

43-
const written = await writeHookOnlyToClipboard(hookItems);
44-
if (written) {
45-
messageInstance.success(trans("gridCompOperator.copyCompsSuccess", { compNum: hookItems.length }));
46-
} else {
47-
messageInstance.error(trans("gridCompOperator.clipboardWriteError"));
48-
}
49-
return written;
41+
return writeHookOnlyToClipboard(hookItems);
5042
}
5143

5244
static pasteFromPayload(editorState: EditorState, payload: LowcoderClipboardPayload): boolean {
@@ -86,7 +78,6 @@ export class HookCompOperator {
8678
});
8779

8880
editorState.setSelectedCompNames(newNames, "leftPanel");
89-
messageInstance.success(trans("gridCompOperator.pasteCompsSuccess", { compNum: newNames.size }));
9081
return true;
9182
}
9283
}

client/packages/lowcoder/src/pages/editor/editorHotKeys.tsx

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,12 @@ import React, { useCallback, useContext, useRef, useEffect } from "react";
22
import { EditorContext, EditorState } from "comps/editorState";
33
import { GridCompOperator, readFromClipboard } from "comps/utils/gridCompOperator";
44
import { HookCompOperator } from "comps/utils/hookCompOperator";
5-
import { messageInstance } from "lowcoder-design";
6-
import { trans } from "i18n";
75
import { ExternalEditorContext } from "util/context/ExternalEditorContext";
86
import { EditorHistory } from "util/editoryHistory";
97
import { executeQueryAction } from "lowcoder-core";
108
import {
119
GlobalShortcutsWrapper,
10+
isFilterInputTarget,
1211
modKeyPressed,
1312
selectCompModifierKeyPressed,
1413
ShortcutsWrapper,
@@ -20,6 +19,11 @@ import { preview } from "constants/routesURL";
2019
import { useApplicationId } from "util/hooks";
2120
import { useUnmount } from "react-use";
2221

22+
23+
function isNativeClipboardContext(e: KeyboardEvent | React.KeyboardEvent): boolean {
24+
return isFilterInputTarget(e) || !!window.getSelection?.()?.toString();
25+
}
26+
2327
async function handleCopyComps(editorState: EditorState) {
2428
const isHook = await HookCompOperator.copyComp(editorState);
2529
if (!isHook) {
@@ -30,7 +34,6 @@ async function handleCopyComps(editorState: EditorState) {
3034
async function handlePasteComps(editorState: EditorState) {
3135
const payload = await readFromClipboard();
3236
if (!payload) {
33-
messageInstance.info(trans("gridCompOperator.selectCompFirst"));
3437
return;
3538
}
3639

@@ -98,17 +101,18 @@ function handleGlobalKeyDown(
98101
break;
99102
}
100103
default:
101-
if (modKeyPressed(e)) {
104+
if (modKeyPressed(e) && !isNativeClipboardContext(e)) {
102105
const key = e.key?.toLowerCase();
103-
if (key === "c") {
106+
const hasSelectedComps = editorState.selectedCompNames.size > 0;
107+
if (key === "c" && hasSelectedComps) {
104108
handleCopyComps(editorState);
105109
break;
106110
}
107111
if (key === "v") {
108112
handlePasteComps(editorState);
109113
break;
110114
}
111-
if (key === "x") {
115+
if (key === "x" && hasSelectedComps) {
112116
GridCompOperator.cutComp(editorState, editorState.selectedComps());
113117
break;
114118
}
@@ -236,12 +240,15 @@ function handleEditorKeyDown(e: React.KeyboardEvent, editorState: EditorState) {
236240
e.stopPropagation();
237241
return;
238242
case "copyComps":
243+
if (isNativeClipboardContext(e) || editorState.selectedCompNames.size === 0) return;
239244
handleCopyComps(editorState);
240245
return;
241246
case "pasteComps":
247+
if (isNativeClipboardContext(e)) return;
242248
handlePasteComps(editorState);
243249
return;
244250
case "cutComps":
251+
if (isNativeClipboardContext(e) || editorState.selectedCompNames.size === 0) return;
245252
GridCompOperator.cutComp(editorState, editorState.selectedComps());
246253
return;
247254
case "deselectComps":

0 commit comments

Comments
 (0)