mirror of
https://github.com/Foundry376/Mailspring.git
synced 2025-02-23 15:46:28 +08:00
fix(focus): Always set selection range into editor on focus
This commit is contained in:
parent
3f6c2b5f55
commit
3d18241ea1
1 changed files with 25 additions and 31 deletions
|
@ -26,6 +26,9 @@ import {DropZone, ScrollRegion, Contenteditable} from 'nylas-component-kit';
|
|||
* @class ComposerEditor
|
||||
*/
|
||||
|
||||
const NODE_END = false;
|
||||
const NODE_BEGINNING = true;
|
||||
|
||||
class ComposerEditor extends Component {
|
||||
static displayName = 'ComposerEditor';
|
||||
|
||||
|
@ -120,17 +123,29 @@ class ComposerEditor extends Component {
|
|||
this.refs.contenteditable.atomicEdit(({editor}) => {
|
||||
editor.rootNode.focus();
|
||||
const lastNode = this._findLastNodeBeforeQuoteOrSignature(editor)
|
||||
this._selectEndOfNode(lastNode)
|
||||
if (lastNode) {
|
||||
this._selectNode(lastNode, {collapseTo: NODE_END});
|
||||
} else {
|
||||
this._selectNode(editor.rootNode, {collapseTo: NODE_BEGINNING});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
focusAbsoluteEnd() {
|
||||
this.refs.contenteditable.atomicEdit(({editor}) => {
|
||||
editor.rootNode.focus();
|
||||
this._selectNode(editor.rootNode, {collapseTo: NODE_END});
|
||||
});
|
||||
}
|
||||
|
||||
// Note: This method returns null for new drafts, because the leading
|
||||
// <br> tags contain no text nodes.
|
||||
_findLastNodeBeforeQuoteOrSignature(editor) {
|
||||
const walker = document.createTreeWalker(editor.rootNode, NodeFilter.SHOW_TEXT);
|
||||
const nodesBelowUserBody = editor.rootNode.querySelectorAll('signature, .gmail_quote, blockquote');
|
||||
|
||||
let lastNode = null;
|
||||
let node = walker.nextNode();
|
||||
|
||||
while (node != null) {
|
||||
let belowUserBody = false;
|
||||
for (let i = 0; i < nodesBelowUserBody.length; ++i) {
|
||||
|
@ -148,35 +163,14 @@ class ComposerEditor extends Component {
|
|||
return lastNode
|
||||
}
|
||||
|
||||
_findAbsoluteLastNode(editor) {
|
||||
const walker = document.createTreeWalker(editor.rootNode, NodeFilter.SHOW_TEXT);
|
||||
let lastNode = null;
|
||||
let node = walker.nextNode();
|
||||
while (node) {
|
||||
lastNode = node;
|
||||
node = walker.nextNode();
|
||||
}
|
||||
return lastNode;
|
||||
}
|
||||
|
||||
_selectEndOfNode(node) {
|
||||
if (node) {
|
||||
_selectNode(node, {collapseTo} = {}) {
|
||||
const range = document.createRange();
|
||||
range.selectNodeContents(node);
|
||||
range.collapse(false);
|
||||
range.collapse(collapseTo);
|
||||
const selection = window.getSelection();
|
||||
selection.removeAllRanges();
|
||||
selection.addRange(range);
|
||||
}
|
||||
}
|
||||
|
||||
focusAbsoluteEnd() {
|
||||
this.refs.contenteditable.atomicEdit( ({editor})=> {
|
||||
editor.rootNode.focus();
|
||||
const lastNode = this._findAbsoluteLastNode(editor)
|
||||
this._selectEndOfNode(lastNode)
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @private
|
||||
|
|
Loading…
Reference in a new issue