Skip to content

Commit 9f06807

Browse files
committed
fix: copy/paste logic + add message
1 parent 117c03f commit 9f06807

4 files changed

Lines changed: 36 additions & 19 deletions

File tree

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

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -91,14 +91,14 @@ function buildEmptyPayload(): LowcoderClipboardPayload {
9191
};
9292
}
9393

94-
export function writeHookOnlyToClipboard(hookItems: ClipboardHookItem[]) {
94+
export async function writeHookOnlyToClipboard(hookItems: ClipboardHookItem[]): Promise<boolean> {
9595
const payload = buildEmptyPayload();
9696
payload.hookItems = hookItems;
97-
writeToClipboard(payload);
97+
return writeToClipboard(payload);
9898
}
9999

100100
export class GridCompOperator {
101-
static copyComp(editorState: EditorState, compRecords: Record<string, Comp>) {
101+
static async copyComp(editorState: EditorState, compRecords: Record<string, Comp>): Promise<boolean> {
102102
const oldUi = editorState.getUIComp().getComp();
103103
if (!oldUi) {
104104
messageInstance.info(trans("gridCompOperator.notSupport"));
@@ -152,9 +152,13 @@ export class GridCompOperator {
152152
const payload = buildEmptyPayload();
153153
payload.sourcePositionParams = sourcePositionParams;
154154
payload.gridItems = gridItems;
155-
writeToClipboard(payload);
156-
157-
return true;
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;
158162
}
159163

160164
static pasteFromPayload(editorState: EditorState, payload: LowcoderClipboardPayload): boolean {
@@ -240,6 +244,7 @@ export class GridCompOperator {
240244
})
241245
);
242246
editorState.setSelectedCompNames(copyCompNames);
247+
messageInstance.success(trans("gridCompOperator.pasteCompsSuccess", { compNum: copyCompNames.size }));
243248
return true;
244249
}
245250

@@ -274,10 +279,11 @@ export class GridCompOperator {
274279
window.open(APPLICATION_VIEW_URL(applicationId, "edit"))
275280
}
276281

277-
static cutComp(editorState: EditorState, compRecords: Record<string, Comp>) {
278-
this.copyComp(editorState, compRecords) &&
279-
this.doDelete(editorState, compRecords) &&
280-
messageInstance.info(trans("gridCompOperator.cutCompsSuccess", { pasteKey, undoKey }));
282+
static async cutComp(editorState: EditorState, compRecords: Record<string, Comp>) {
283+
const copied = await this.copyComp(editorState, compRecords);
284+
if (copied && this.doDelete(editorState, compRecords)) {
285+
messageInstance.info(trans("gridCompOperator.cutCompsSuccess", { pasteKey, undoKey }));
286+
}
281287
}
282288

283289
private static doDelete(editorState: EditorState, compRecords: Record<string, Comp>): boolean {

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

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
} from "./gridCompOperator";
1212

1313
export class HookCompOperator {
14-
static copyComp(editorState: EditorState): boolean {
14+
static async copyComp(editorState: EditorState): Promise<boolean> {
1515
const selectedNames = Array.from(editorState.selectedCompNames);
1616
if (!selectedNames.length) {
1717
return false;
@@ -40,9 +40,13 @@ export class HookCompOperator {
4040
return { compType, comp, name, fullValue };
4141
});
4242

43-
writeHookOnlyToClipboard(hookItems);
44-
messageInstance.success(trans("copySuccess"));
45-
return true;
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;
4650
}
4751

4852
static pasteFromPayload(editorState: EditorState, payload: LowcoderClipboardPayload): boolean {
@@ -82,7 +86,7 @@ export class HookCompOperator {
8286
});
8387

8488
editorState.setSelectedCompNames(newNames, "leftPanel");
85-
messageInstance.success(trans("copySuccess"));
89+
messageInstance.success(trans("gridCompOperator.pasteCompsSuccess", { compNum: newNames.size }));
8690
return true;
8791
}
8892
}

client/packages/lowcoder/src/i18n/locales/en.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,12 @@ export const en = {
9191
"gridCompOperator": {
9292
"notSupport": "Not Supported",
9393
"selectAtLeastOneComponent": "Please select at least one component",
94-
"selectCompFirst": "Select components before copying",
94+
"selectCompFirst": "Please copy a component first",
9595
"noContainerSelected": "[Bug] No container selected",
96+
"copyCompsSuccess": "Copied {compNum} {compNum, plural, one {component} other {components}} to clipboard",
97+
"pasteCompsSuccess": "Pasted {compNum} {compNum, plural, one {component} other {components}}",
98+
"clipboardReadError": "Unable to read clipboard. Please allow clipboard access and try again",
99+
"clipboardWriteError": "Unable to write to clipboard. Please allow clipboard access and try again",
96100
"deleteCompsSuccess": "Deleted successfully. Press {undoKey} to undo.",
97101
"deleteCompsTitle": "Delete Components",
98102
"deleteCompsBody": "Are you sure you want to delete {compNum} selected components?",

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ 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";
57
import { ExternalEditorContext } from "util/context/ExternalEditorContext";
68
import { EditorHistory } from "util/editoryHistory";
79
import { executeQueryAction } from "lowcoder-core";
@@ -18,16 +20,17 @@ import { preview } from "constants/routesURL";
1820
import { useApplicationId } from "util/hooks";
1921
import { useUnmount } from "react-use";
2022

21-
function handleCopyComps(editorState: EditorState) {
22-
const isHook = HookCompOperator.copyComp(editorState);
23+
async function handleCopyComps(editorState: EditorState) {
24+
const isHook = await HookCompOperator.copyComp(editorState);
2325
if (!isHook) {
24-
GridCompOperator.copyComp(editorState, editorState.selectedComps());
26+
await GridCompOperator.copyComp(editorState, editorState.selectedComps());
2527
}
2628
}
2729

2830
async function handlePasteComps(editorState: EditorState) {
2931
const payload = await readFromClipboard();
3032
if (!payload) {
33+
messageInstance.info(trans("gridCompOperator.selectCompFirst"));
3134
return;
3235
}
3336

0 commit comments

Comments
 (0)