From c370b28694d7e397078b0a9a2806662bb4eb0baa Mon Sep 17 00:00:00 2001 From: Christopher Date: Sun, 12 Jan 2020 16:19:24 +0000 Subject: [PATCH] #11378. Added cut/copy and pasting user pills from editor. --- .../views/rooms/BasicMessageComposer.js | 46 ++++++++++++++++--- 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/src/components/views/rooms/BasicMessageComposer.js b/src/components/views/rooms/BasicMessageComposer.js index 15585ffea0..94159ec8c3 100644 --- a/src/components/views/rooms/BasicMessageComposer.js +++ b/src/components/views/rooms/BasicMessageComposer.js @@ -200,17 +200,47 @@ export default class BasicMessageEditor extends React.Component { return !!(this._isIMEComposing || (event.nativeEvent && event.nativeEvent.isComposing)); } + _onCutCopy = (event, type) => { + const selection = document.getSelection(); + const text = selection.toString(); + if (text) { + const {model} = this.props; + const range = getRangeForSelection(this._editorRef, model, selection); + const selectedParts = range.parts.map(p => p.serialize()); + event.clipboardData.setData("application/x-riot-composer", JSON.stringify(selectedParts)); + if (type === "cut") { + selection.deleteFromDocument(); + range.replace([]); + } + event.preventDefault(); + } + } + + _onCopy = (event) => { + this._onCutCopy(event, "copy"); + } + + _onCut = (event) => { + this._onCutCopy(event, "cut"); + } + _onPaste = (event) => { const {model} = this.props; const {partCreator} = model; - const text = event.clipboardData.getData("text/plain"); - if (text) { - this._modifiedFlag = true; - const range = getRangeForSelection(this._editorRef, model, document.getSelection()); - const parts = parsePlainTextMessage(text, partCreator); - replaceRangeAndMoveCaret(range, parts); - event.preventDefault(); + const partsText = event.clipboardData.getData("application/x-riot-composer"); + let parts; + if (partsText) { + const serializedTextParts = JSON.parse(partsText); + const deserializedParts = serializedTextParts.map(p => partCreator.deserializePart(p)) + parts = deserializedParts; + } else { + const text = event.clipboardData.getData("text/plain"); + parts = parsePlainTextMessage(text, partCreator); } + this._modifiedFlag = true; + const range = getRangeForSelection(this._editorRef, model, document.getSelection()); + replaceRangeAndMoveCaret(range, parts); + event.preventDefault(); } _onInput = (event) => { @@ -557,6 +587,8 @@ export default class BasicMessageEditor extends React.Component { tabIndex="0" onBlur={this._onBlur} onFocus={this._onFocus} + onCopy={this._onCopy} + onCut={this._onCut} onPaste={this._onPaste} onKeyDown={this._onKeyDown} ref={ref => this._editorRef = ref}