summaryrefslogtreecommitdiff
path: root/addons/web/static/src/js/services/config.js
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/web/static/src/js/services/config.js
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/web/static/src/js/services/config.js')
-rw-r--r--addons/web/static/src/js/services/config.js122
1 files changed, 122 insertions, 0 deletions
diff --git a/addons/web/static/src/js/services/config.js b/addons/web/static/src/js/services/config.js
new file mode 100644
index 00000000..6c576c35
--- /dev/null
+++ b/addons/web/static/src/js/services/config.js
@@ -0,0 +1,122 @@
+odoo.define('web.config', function (require) {
+"use strict";
+
+const Bus = require('web.Bus');
+
+const bus = new Bus();
+
+/**
+ * This module contains all the (mostly) static 'environmental' information.
+ * This is often necessary to allow the rest of the web client to properly
+ * render itself.
+ *
+ * Note that many information currently stored in session should be moved to
+ * this file someday.
+ */
+
+var config = {
+ device: {
+ /**
+ * bus to use in order to be able to handle device config related events
+ * - 'size_changed' : triggered when window size is
+ * corresponding to a new bootstrap breakpoint. The new size_class
+ * is provided.
+ */
+ bus: bus,
+ /**
+ * touch is a boolean, true if the device supports touch interaction
+ *
+ * @type Boolean
+ */
+ touch: 'ontouchstart' in window || 'onmsgesturechange' in window,
+ /**
+ * size_class is an integer: 0, 1, 2, 3 or 4, depending on the (current)
+ * size of the device. This is a dynamic property, updated whenever the
+ * browser is resized
+ *
+ * @type Number
+ */
+ size_class: null,
+ /**
+ * A frequent use case is to have a different render in 'mobile' mode,
+ * meaning when the screen is small. This flag (boolean) is true when
+ * the size is XS/VSM/SM. It is also updated dynamically.
+ *
+ * @type Boolean
+ */
+ isMobile: null,
+ /**
+ * Mobile device detection using userAgent.
+ * This flag doesn't depend on the size/resolution of the screen.
+ * It targets mobile devices which suggests that there is a virtual keyboard.
+ *
+ * @return {boolean}
+ */
+ isMobileDevice: navigator.userAgent.match(/Android/i) ||
+ navigator.userAgent.match(/webOS/i) ||
+ navigator.userAgent.match(/iPhone/i) ||
+ navigator.userAgent.match(/iPad/i) ||
+ navigator.userAgent.match(/iPod/i) ||
+ navigator.userAgent.match(/BlackBerry/i) ||
+ navigator.userAgent.match(/Windows Phone/i),
+ /**
+ * Mapping between the numbers 0,1,2,3,4,5,6 and some descriptions
+ */
+ SIZES: { XS: 0, VSM: 1, SM: 2, MD: 3, LG: 4, XL: 5, XXL: 6 },
+ },
+ /**
+ * States whether the current environment is in debug or not.
+ *
+ * @param debugMode the debug mode to check, empty for simple debug mode
+ * @returns {boolean}
+ */
+ isDebug: function (debugMode) {
+ if (debugMode) {
+ return odoo.debug && odoo.debug.indexOf(debugMode) !== -1;
+ }
+ return odoo.debug;
+ },
+};
+
+
+var medias = [
+ window.matchMedia('(max-width: 474px)'),
+ window.matchMedia('(min-width: 475px) and (max-width: 575px)'),
+ window.matchMedia('(min-width: 576px) and (max-width: 767px)'),
+ window.matchMedia('(min-width: 768px) and (max-width: 991px)'),
+ window.matchMedia('(min-width: 992px) and (max-width: 1199px)'),
+ window.matchMedia('(min-width: 1200px) and (max-width: 1533px)'),
+ window.matchMedia('(min-width: 1534px)'),
+];
+
+/**
+ * Return the current size class
+ *
+ * @returns {integer} a number between 0 and 5, included
+ */
+function _getSizeClass() {
+ for (var i = 0 ; i < medias.length ; i++) {
+ if (medias[i].matches) {
+ return i;
+ }
+ }
+}
+/**
+ * Update the size dependant properties in the config object. This method
+ * should be called every time the size class changes.
+ */
+function _updateSizeProps() {
+ var sc = _getSizeClass();
+ if (sc !== config.device.size_class) {
+ config.device.size_class = sc;
+ config.device.isMobile = config.device.size_class <= config.device.SIZES.SM;
+ config.device.bus.trigger('size_changed', config.device.size_class);
+ }
+}
+
+_.invoke(medias, 'addListener', _updateSizeProps);
+_updateSizeProps();
+
+return config;
+
+});