Skip to content

Commit 1076ec8

Browse files
Desktop: Fixes laurent22#13745: Use the native CodeMirror clipboard handler for copy/cut/paste
1 parent 45c1a06 commit 1076ec8

File tree

6 files changed

+61
-55
lines changed

6 files changed

+61
-55
lines changed

.eslintignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1007,7 +1007,7 @@ packages/editor/CodeMirror/CodeMirrorControl.js
10071007
packages/editor/CodeMirror/configFromSettings.js
10081008
packages/editor/CodeMirror/createEditor.test.js
10091009
packages/editor/CodeMirror/createEditor.js
1010-
packages/editor/CodeMirror/editorCommands/cutOrCopyText.js
1010+
packages/editor/CodeMirror/editorCommands/clipboardCommand.js
10111011
packages/editor/CodeMirror/editorCommands/duplicateLine.test.js
10121012
packages/editor/CodeMirror/editorCommands/duplicateLine.js
10131013
packages/editor/CodeMirror/editorCommands/editorCommands.js

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -979,7 +979,7 @@ packages/editor/CodeMirror/CodeMirrorControl.js
979979
packages/editor/CodeMirror/configFromSettings.js
980980
packages/editor/CodeMirror/createEditor.test.js
981981
packages/editor/CodeMirror/createEditor.js
982-
packages/editor/CodeMirror/editorCommands/cutOrCopyText.js
982+
packages/editor/CodeMirror/editorCommands/clipboardCommand.js
983983
packages/editor/CodeMirror/editorCommands/duplicateLine.test.js
984984
packages/editor/CodeMirror/editorCommands/duplicateLine.js
985985
packages/editor/CodeMirror/editorCommands/editorCommands.js

packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v6/CodeMirror.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ const CodeMirror = (props: NoteBodyEditorProps, ref: ForwardedRef<NoteBodyEditor
107107
const editorPasteText = useCallback(async () => {
108108
if (editorRef.current) {
109109
const modifiedMd = await Note.replaceResourceExternalToInternalLinks(clipboard.readText(), { useAbsolutePaths: true });
110-
editorRef.current.insertText(modifiedMd, UserEventSource.Paste);
110+
editorRef.current.pasteText(modifiedMd);
111111
}
112112
}, []);
113113

packages/editor/CodeMirror/CodeMirrorControl.ts

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import jumpToHash from './editorCommands/jumpToHash';
1616
import { resetImageResourceEffect } from './extensions/rendering/renderBlockImages';
1717
import Logger from '@joplin/utils/Logger';
1818
import { searchChangeSourceEffect } from './extensions/searchExtension';
19-
import cutOrCopyText, { ClipboardAction } from './editorCommands/cutOrCopyText';
19+
import clipboardCommand, { ClipboardActionType } from './editorCommands/clipboardCommand';
2020

2121
const logger = Logger.create('CodeMirrorControl');
2222

@@ -261,12 +261,25 @@ export default class CodeMirrorControl extends CodeMirror5Emulation implements E
261261
this._callbacks.onRemove();
262262
}
263263

264-
public cutText(writeClipboard: (text: string)=> void) {
265-
return cutOrCopyText(writeClipboard, ClipboardAction.Cut)(this.editor);
264+
public cutText(onWriteClipboard: (text: string)=> void) {
265+
return clipboardCommand({
266+
onWriteClipboard,
267+
type: ClipboardActionType.Cut,
268+
})(this.editor);
266269
}
267270

268-
public copyText(writeClipboard: (text: string)=> void) {
269-
return cutOrCopyText(writeClipboard, ClipboardAction.Copy)(this.editor);
271+
public copyText(onWriteClipboard: (text: string)=> void) {
272+
return clipboardCommand({
273+
onWriteClipboard,
274+
type: ClipboardActionType.Copy,
275+
})(this.editor);
276+
}
277+
278+
public pasteText(text: string) {
279+
return clipboardCommand({
280+
text,
281+
type: ClipboardActionType.Paste,
282+
})(this.editor);
270283
}
271284

272285
//
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { Command } from '@codemirror/view';
2+
3+
export enum ClipboardActionType {
4+
Cut = 'cut',
5+
Copy = 'copy',
6+
Paste = 'paste',
7+
}
8+
9+
interface PasteAction {
10+
type: ClipboardActionType.Paste;
11+
text: string;
12+
}
13+
14+
type OnWriteClipboard = (text: string)=> void;
15+
interface CopyAction {
16+
type: ClipboardActionType.Copy|ClipboardActionType.Cut;
17+
onWriteClipboard: OnWriteClipboard;
18+
}
19+
20+
type ClipboardAction = CopyAction|PasteAction;
21+
22+
const clipboardCommand = (action: ClipboardAction): Command => (view) => {
23+
const clipboardData = new DataTransfer();
24+
if (action.type === ClipboardActionType.Paste) {
25+
clipboardData.setData('text/plain', action.text);
26+
}
27+
const event = new ClipboardEvent(action.type, {
28+
clipboardData,
29+
});
30+
view.contentDOM.dispatchEvent(event);
31+
32+
const data = clipboardData.getData('text/plain');
33+
if (data && action.type !== ClipboardActionType.Paste) {
34+
action.onWriteClipboard(data);
35+
}
36+
37+
return true;
38+
};
39+
40+
export default clipboardCommand;

packages/editor/CodeMirror/editorCommands/cutOrCopyText.ts

Lines changed: 0 additions & 47 deletions
This file was deleted.

0 commit comments

Comments
 (0)