summaryrefslogtreecommitdiff
path: root/addons/mail/static/src/js/thread_widget.js
diff options
context:
space:
mode:
authorAlexandre Kühn <aku@odoo.com>2018-08-11 20:30:51 +0200
committerAlexandre Kühn <aku@odoo.com>2018-08-13 14:17:27 +0200
commitf2302dfb27dd7f6a0dee7c65ab75b62a01706264 (patch)
treed58fef9e2e8a5b98c0680f28fc92e24992236029 /addons/mail/static/src/js/thread_widget.js
parent3de97f168956a7c22c3af6b72950cf28554f4139 (diff)
[REF][FIX] mail, im_livechat: various improvements (JS)
This commit makes a lot of small improvements of the JS of mail and related modules. A. Mail Manager --------------- im_support: - [REF] Slightly more robust way to determine a support message, so that it more reliably falls back on default kind of message (i.e. support channel UUID should be clearly set). mail: - [REF] Improved method names for readability purposes. Some examples: - `fetchFromServer` becomes `fetchMailStateFromServer` - `_initialize{*}` becomes `_update{*}FromServer` - `_isModerator` becomes `_isMyselfModerator` - [REF] Use 'template' pattern design to make Include on Mail Manager much more robust. In particular, the flow is always as follow: 1. Initialize internal state. 2. Listen on buses. 3. Fetch mail data from server. - [REF] Improved workflow for thread window workflow (Shorter & more readable). B. Mail Tests ------------- - [REF] Thread Window Tests crashes with clean message when there are some thread windows open before running the tests. C. (Model) Message ------------------ - [REF] Improved method names for readability purposes (e.g. `isAuthor` becomes `isMyselfAuthor`). D. (Model) Thread ----------------- - [REF] Improved `init` parameters on each kind of thread. - [REF] 'Thread With Cache' has been renamed to 'Searchable Thread': it embraces all kinds of threads that can be used with the search view. - [REF] 'DM' has been renamed to 'DM Chat' (for clarity). - [IMP] New Livechat model in the backend. - [REF] No more direct instances of the Channel class: public and private channels are now 'Multi-User' channels, while DM Chat and Livechat are 'Two-User' channels: This change has been made so that instances of classes always have direct classes as "leaf" in the Class modeling. It eases making changes to a certain model without being too constrained by another model. - [REF] As a consequence of above changed, the method `isChat` has been renamed to `isTwoUserThread`. This is to avoid confusion with the terminology 'chat', which is more like a shortcut for 'quick real- time conversation'. In other words, the property of 'chat' depends of the way to interact on a thread, not of the intrinsic type of the thread. Still, some parts have kept the terminology 'chat', such as in the systray messagin menu. - [IMP] Added `message_added` and `message_posted` hooks, which may be useful to easily hook on those events. E. Thread Widget ---------------- - [REF] Now uses a `mail.model.AbstractThread` for the rendering of a thread, instead of a list of `{mail.model.AbstractMessage}`. - [FIX] Stick thread scroll height to bottom on new rendering, if it was previously at the bottom of the thread. - [REF] Option ORDER has its meaning changed: it now refers to the chronological order of messages in the thread, in which DESC means 'from top to bottom', while ASC means 'from bottom to top'. - [REF] Improved doc on templates, in particular with the option `ORDER`. F. Thread Window ---------------- - [REF] Moved more logic to thread windows, which were previously in Mail Window Manager. - [REF] Now hides the thread widget attribute. So instead of `threadWindow.threadWidget.isAtBottom()`, it uses `threadWindow.isAtBottom()`. - [FIX] New received messages when not having focus on Odoo tab should always make the corresponding thread windows "passive" (i.e. windows that keep threads unread until click on them). - [FIX] Blank thread window (i.e. 'New message' TW) correctly opens Discuss with 'Inbox' when clicking on 'Expand' Button in the title - [FIX] Do not display the composer for channels with property 'mass-mailing' set in thread windows. G. (Website) Livechat --------------------- - [REF] Some `trigger` have been turned into `trigger_up`. - [REF] Some logic has been moved to models (e.g. `{im_livechat.model.WebsiteLivechat}`), from `{im_livechat.im_livechat.LivechatButton}`. - [FIX] New messages should be received in real-time. The longpolling was broken with a recent refactoring on bus service (6448420c5dd160470e465dee7729d19d8d5e7bab).
Diffstat (limited to 'addons/mail/static/src/js/thread_widget.js')
-rw-r--r--addons/mail/static/src/js/thread_widget.js38
1 files changed, 21 insertions, 17 deletions
diff --git a/addons/mail/static/src/js/thread_widget.js b/addons/mail/static/src/js/thread_widget.js
index ab0dea1bece..c2d642d5dbe 100644
--- a/addons/mail/static/src/js/thread_widget.js
+++ b/addons/mail/static/src/js/thread_widget.js
@@ -12,8 +12,8 @@ var QWeb = core.qweb;
var _t = core._t;
var ORDER = {
- ASC: 1,
- DESC: -1,
+ ASC: 1, // visually, chronological order of thread from bottom to top
+ DESC: -1, // visually, chronological order of thread from top to bottom
};
var READ_MORE = _t("read more");
@@ -55,7 +55,7 @@ var ThreadWidget = Widget.extend({
// options when the thread is enabled (e.g. can send message,
// interact on messages, etc.)
this._enabledOptions = _.defaults(options || {}, {
- displayOrder: ORDER.ASC,
+ displayOrder: ORDER.DESC,
displayMarkAsRead: true,
displayStars: true,
displayDocumentLinks: true,
@@ -78,20 +78,16 @@ var ThreadWidget = Widget.extend({
loadMoreOnScroll: this._enabledOptions.loadMoreOnScroll,
};
this._selectedMessageID = null;
+ this._currentThreadID = null;
},
-
/**
* @override
*/
destroy: function () {
clearInterval(this._updateTimestampsInterval);
},
-
/**
- * @param {mail.model.AbstractMessage[]} messages list of messages of the
- * thread, ordered by increasing IDs (a higher ID means a more recent
- * message).
- * @param {}
+ * @param {mail.model.AbstractThread} thread the thread to render.
* @param {Object} [options]
* @param {integer} [options.displayOrder=ORDER.ASC] order of displaying
* messages in the thread:
@@ -99,11 +95,18 @@ var ThreadWidget = Widget.extend({
* - ORDER.DESC: last message is at the top of the thread
* @param {boolean} [options.displayLoadMore]
* @param {boolean} [options.isCreateMode]
+ * @param {boolean} [options.scrollToBottom=false]
* @param {boolean} [options.squashCloseMessages]
*/
render: function (thread, options) {
var self = this;
+ var shouldScrollToBottomAfterRendering = false;
+ if (this._currentThreadID === thread.getID() && this.isAtBottom()) {
+ shouldScrollToBottomAfterRendering = true;
+ }
+ this._currentThreadID = thread.getID();
+
// copy so that reverse do not alter order in the thread object
var messages = _.clone(thread.getMessages());
@@ -115,9 +118,6 @@ var ThreadWidget = Widget.extend({
return message.getAttachments();
})));
- if (modeOptions.displayOrder === ORDER.DESC) {
- messages.reverse();
- }
options = _.extend({}, modeOptions, options, {
selectedMessageID: this._selectedMessageID,
});
@@ -160,6 +160,11 @@ var ThreadWidget = Widget.extend({
}
prevMessage = message;
});
+
+ if (modeOptions.displayOrder === ORDER.DESC) {
+ messages.reverse();
+ }
+
this.$el.html(QWeb.render('mail.widget.Thread', {
thread: thread,
displayAuthorMessages: displayAuthorMessages,
@@ -175,6 +180,10 @@ var ThreadWidget = Widget.extend({
self._insertReadMore($message);
});
+ if (shouldScrollToBottomAfterRendering) {
+ this.scrollToBottom();
+ }
+
if (!this._updateTimestampsInterval) {
this.updateTimestampsInterval = setInterval(function () {
self._updateTimestamps();
@@ -368,11 +377,6 @@ var ThreadWidget = Widget.extend({
});
});
},
-
- //--------------------------------------------------------------------------
- // Private
- //--------------------------------------------------------------------------
-
/**
* @private
* @param {Object} options