summaryrefslogtreecommitdiff
path: root/addons/mail/static/src/env/test_env.js
diff options
context:
space:
mode:
authorSébastien Theys <seb@odoo.com>2020-06-15 18:12:21 +0000
committerSébastien Theys <seb@odoo.com>2020-06-15 18:12:21 +0000
commit3fea5b2136627c1d7e83b2a5e111952fe3eb10a1 (patch)
tree5eefad07972a87ce4689b83260f981bc87aadad4 /addons/mail/static/src/env/test_env.js
parent0a82848606151ef60eb6523e9c4c161171f214e7 (diff)
[REF] mail, *: refactor messaging with OWL
This commit is a significant rewriting of client-side discuss, chatter, chat window, and messaging menu using OWL. The behavior should be broadly the same, with some slight functional changes here and there. From a technical standpoint, the code of messaging is mainly organized in 2 main groups of modules: - models, which are logical entities that depict the client-side state of messaging as a whole. - components, which are in charge of displaying information from models. This refactoring also introduces new JS guidelines regarding folder structure (/static) and naming rules for JS modules. Community PR: https://github.com/odoo/odoo/pull/39023 Enterprise PR: https://github.com/odoo/enterprise/pull/6249 Task-1914207 This PR is a collaborative work by Alexandre, Julien, Sébastien and Xavier, with the precious help of Lucas to speed it up towards the end. closes odoo/odoo#39023 Related: odoo/enterprise#6249 Signed-off-by: Alexandre Kühn (aku) <aku@odoo.com> Co-authored-by: Alexandre Kühn <aku@odoo.com> Co-authored-by: Julien Giannone <jgi@odoo.com> Co-authored-by: Lucas Perais <lpe@odoo.com> Co-authored-by: Sébastien Theys <seb@odoo.com> Co-authored-by: Xavier Dubuc <xdu@odoo.com>
Diffstat (limited to 'addons/mail/static/src/env/test_env.js')
-rw-r--r--addons/mail/static/src/env/test_env.js152
1 files changed, 152 insertions, 0 deletions
diff --git a/addons/mail/static/src/env/test_env.js b/addons/mail/static/src/env/test_env.js
new file mode 100644
index 00000000000..75e921c27c7
--- /dev/null
+++ b/addons/mail/static/src/env/test_env.js
@@ -0,0 +1,152 @@
+odoo.define('mail/static/src/env/test_env.js', function (require) {
+'use strict';
+
+const ModelManager = require('mail/static/src/model/model_manager.js');
+const { makeDeferred } = require('mail/static/src/utils/deferred/deferred.js');
+const { nextTick } = require('mail/static/src/utils/utils.js');
+
+const { Store } = owl;
+const { EventBus } = owl.core;
+
+/**
+ * @param {Object} [providedEnv={}]
+ * @returns {Object}
+ */
+function addMessagingToEnv(providedEnv = {}) {
+
+ const defaultEnv = Object.assign({}, providedEnv, {
+ session: Object.assign({
+ is_bound: Promise.resolve(),
+ name: 'Admin',
+ partner_display_name: 'Your Company, Admin',
+ partner_id: 3,
+ uid: 2,
+ url: s => s,
+ }, providedEnv.session)
+ });
+
+ let env = Object.assign({
+ loadingBaseDelayDuration: defaultEnv.loadingBaseDelayDuration || 0,
+ }, defaultEnv);
+
+ /**
+ * Messaging store
+ */
+ const store = new Store({
+ env,
+ state: {},
+ });
+
+ /**
+ * Registry of models.
+ */
+ env.models = {};
+ /**
+ * Environment keys used in messaging.
+ */
+ Object.assign(env, {
+ autofetchPartnerImStatus: false,
+ browser: Object.assign({
+ innerHeight: 1080,
+ innerWidth: 1920,
+ Notification: Object.assign({
+ permission: 'denied',
+ async requestPermission() {
+ return this.permission;
+ },
+ }, (env.browser && env.browser.Notification) || {}),
+ }, env.browser),
+ destroyMessaging() {
+ if (env.modelManager) {
+ env.modelManager.deleteAll();
+ env.messaging = undefined;
+ }
+ },
+ disableAnimation: true,
+ isMessagingInitialized() {
+ if (!this.messaging) {
+ return false;
+ }
+ return this.messaging.isInitialized;
+ },
+ messaging: undefined,
+ messagingInitializedDeferred: makeDeferred(),
+ messagingBus: new EventBus(),
+ modelManager: new ModelManager(),
+ store,
+ });
+
+ return env;
+}
+
+/**
+ * @param {Object} [providedEnv={}]
+ * @returns {Object}
+ */
+function addTimeControlToEnv(providedEnv = {}) {
+
+ let env = Object.assign({}, providedEnv);
+
+ if (!env.browser) {
+ env.browser = {};
+ }
+ // list of timeout ids that have timed out.
+ let timedOutIds = [];
+ // key: timeoutId, value: func + remaining duration
+ const timeouts = new Map();
+ Object.assign(env.browser, {
+ clearTimeout: id => {
+ timeouts.delete(id);
+ timedOutIds = timedOutIds.filter(i => i !== id);
+ },
+ setTimeout: (func, duration) => {
+ const timeoutId = _.uniqueId('timeout_');
+ const timeout = {
+ id: timeoutId,
+ isTimedOut: false,
+ func,
+ duration,
+ };
+ timeouts.set(timeoutId, timeout);
+ if (duration === 0) {
+ timedOutIds.push(timeoutId);
+ timeout.isTimedOut = true;
+ }
+ return timeoutId;
+ },
+ });
+ if (!env.testUtils) {
+ env.testUtils = {};
+ }
+ Object.assign(env.testUtils, {
+ advanceTime: async duration => {
+ await nextTick();
+ for (const id of timeouts.keys()) {
+ const timeout = timeouts.get(id);
+ if (timeout.isTimedOut) {
+ continue;
+ }
+ timeout.duration = Math.max(timeout.duration - duration, 0);
+ if (timeout.duration === 0) {
+ timedOutIds.push(id);
+ }
+ }
+ while (timedOutIds.length > 0) {
+ const id = timedOutIds.shift();
+ const timeout = timeouts.get(id);
+ timeouts.delete(id);
+ timeout.func();
+ await nextTick();
+ }
+ await nextTick();
+ },
+ });
+ return env;
+}
+
+return {
+ addMessagingToEnv,
+ addTimeControlToEnv,
+};
+
+});