From dc3c42a3413c6be0a5550a562978e76f9e574455 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=98=84=EC=84=B1=ED=95=84?= Date: Fri, 12 Apr 2024 11:11:54 +0900 Subject: [PATCH] =?UTF-8?q?copy=20and=20paste=20=EB=B2=84=EA=B7=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/EditableInput.js | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/ApiTestManager/src/components/EditableInput.js b/ApiTestManager/src/components/EditableInput.js index 04487e9..fafaa53 100644 --- a/ApiTestManager/src/components/EditableInput.js +++ b/ApiTestManager/src/components/EditableInput.js @@ -44,6 +44,39 @@ class EditableInputView { this.controller.additionalCallback(this.model.getValue()); } }); + this.editableDiv.addEventListener('paste', (event) => { + event.preventDefault(); + if (navigator.clipboard && navigator.clipboard.readText) { + navigator.clipboard.readText().then(text => { + this.insertTextAtCursor(text); + }).catch(err => { + console.error('Failed to read clipboard contents: ', err); + // Fallback to using clipboardData from the paste event + const text = (event.clipboardData || window.clipboardData).getData('text'); + this.insertTextAtCursor(text); + }); + } else { + const text = (event.clipboardData || window.clipboardData).getData('text'); + this.insertTextAtCursor(text); + } + }); + } + + insertTextAtCursor(text) { + const selection = window.getSelection(); + if (!selection.rangeCount) return; + + const range = selection.getRangeAt(0); + range.deleteContents(); + const textNode = document.createTextNode(text); + range.insertNode(textNode); + + range.setStartAfter(textNode); + range.setEndAfter(textNode); + selection.removeAllRanges(); + selection.addRange(range); + + this.controller.handleInput(this.editableDiv); } updateUI() {