summaryrefslogtreecommitdiff
path: root/addons/mail/static/src
diff options
context:
space:
mode:
Diffstat (limited to 'addons/mail/static/src')
-rw-r--r--addons/mail/static/src/components/composer_text_input/composer_text_input.js19
-rw-r--r--addons/mail/static/src/models/composer/composer.js13
2 files changed, 24 insertions, 8 deletions
diff --git a/addons/mail/static/src/components/composer_text_input/composer_text_input.js b/addons/mail/static/src/components/composer_text_input/composer_text_input.js
index 1b71e22afe1..3fba8115254 100644
--- a/addons/mail/static/src/components/composer_text_input/composer_text_input.js
+++ b/addons/mail/static/src/components/composer_text_input/composer_text_input.js
@@ -153,14 +153,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();
}
@@ -171,6 +173,7 @@ class ComposerTextInput extends Component {
* @private
*/
_updateHeight() {
+ this._mirroredTextareaRef.el.value = this.composer.textInputContent;
this._textareaRef.el.style.height = (this._mirroredTextareaRef.el.scrollHeight) + "px";
}
diff --git a/addons/mail/static/src/models/composer/composer.js b/addons/mail/static/src/models/composer/composer.js
index 13c4dac04a0..8caa8498856 100644
--- a/addons/mail/static/src/models/composer/composer.js
+++ b/addons/mail/static/src/models/composer/composer.js
@@ -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: "",
@@ -1013,6 +1016,16 @@ function factory(dependencies) {
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.
*/
isLog: attr({