[FIX] mail: prevent composer cursor from randomly changing position

task-2388600

closes odoo/odoo#64830

X-original-commit: 785fdb6cea6ee7d9a1a4e4c6a44403a275a67763
Signed-off-by: Alexandre Kühn (aku) <aku@odoo.com>
This commit is contained in:
Sébastien Theys
2021-01-20 19:42:05 +00:00
parent 18e4b34b70
commit 7b386de6f5
2 changed files with 24 additions and 8 deletions
@@ -163,14 +163,16 @@ class ComposerTextInput extends Component {
if (!this.composer) {
return;
}
this._textareaRef.el.value = this.composer.textInputContent;
this._mirroredTextareaRef.el.value = this.composer.textInputContent;
if (this.composer.hasFocus) {
this._textareaRef.el.setSelectionRange(
this.composer.textInputCursorStart,
this.composer.textInputCursorEnd,
this.composer.textInputSelectionDirection,
);
if (this.composer.isLastStateChangeProgrammatic) {
this._textareaRef.el.value = this.composer.textInputContent;
if (this.composer.hasFocus) {
this._textareaRef.el.setSelectionRange(
this.composer.textInputCursorStart,
this.composer.textInputCursorEnd,
this.composer.textInputSelectionDirection,
);
}
this.composer.update({ isLastStateChangeProgrammatic: false });
}
this._updateHeight();
}
@@ -181,6 +183,7 @@ class ComposerTextInput extends Component {
* @private
*/
_updateHeight() {
this._mirroredTextareaRef.el.value = this.composer.textInputContent;
this._textareaRef.el.style.height = (this._mirroredTextareaRef.el.scrollHeight) + "px";
}
@@ -160,6 +160,7 @@ function factory(dependencies) {
this.textInputContent.length
);
this.update({
isLastStateChangeProgrammatic: true,
textInputContent: partA + content + partB,
textInputCursorStart: this.textInputCursorStart + content.length,
textInputCursorEnd: this.textInputCursorStart + content.length,
@@ -208,6 +209,7 @@ function factory(dependencies) {
break;
}
this.update({
isLastStateChangeProgrammatic: true,
textInputContent: textLeft + recordReplacement + ' ' + textRight,
textInputCursorEnd: textLeft.length + recordReplacement.length + 1,
textInputCursorStart: textLeft.length + recordReplacement.length + 1,
@@ -722,6 +724,7 @@ function factory(dependencies) {
this.closeSuggestions();
this.update({
attachments: [['unlink-all']],
isLastStateChangeProgrammatic: true,
mentionedChannels: [['unlink-all']],
mentionedPartners: [['unlink-all']],
subjectContent: "",
@@ -1011,6 +1014,16 @@ function factory(dependencies) {
hasToScrollToActiveSuggestion: attr({
default: false,
}),
/**
* Determines whether the last change (since the last render) was
* programmatic. Useful to avoid restoring the state when its change was
* from a user action, in particular to prevent the cursor from jumping
* to its previous position after the user clicked on the textarea while
* it didn't have the focus anymore.
*/
isLastStateChangeProgrammatic: attr({
default: false,
}),
/**
* If true composer will log a note, else a comment will be posted.
*/