summaryrefslogtreecommitdiff
path: root/muk_web_theme/static/src/js/chrome
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 17:14:58 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 17:14:58 +0700
commit1ca3b3df3421961caec3b747a364071c80f5c7da (patch)
tree6778a1f0f3f9b4c6e26d6d87ccde16e24da6c9d6 /muk_web_theme/static/src/js/chrome
parentb57188be371d36d96caac4b8d65a40745c0e972c (diff)
initial commit
Diffstat (limited to 'muk_web_theme/static/src/js/chrome')
-rw-r--r--muk_web_theme/static/src/js/chrome/actions.js39
-rw-r--r--muk_web_theme/static/src/js/chrome/apps.js96
-rw-r--r--muk_web_theme/static/src/js/chrome/appsbar.js69
-rw-r--r--muk_web_theme/static/src/js/chrome/menu.js101
4 files changed, 305 insertions, 0 deletions
diff --git a/muk_web_theme/static/src/js/chrome/actions.js b/muk_web_theme/static/src/js/chrome/actions.js
new file mode 100644
index 0000000..37b3c45
--- /dev/null
+++ b/muk_web_theme/static/src/js/chrome/actions.js
@@ -0,0 +1,39 @@
+/**********************************************************************************
+*
+* Copyright (c) 2017-today MuK IT GmbH.
+*
+* This file is part of MuK Grid Snippets
+* (see https://mukit.at).
+*
+* This program is free software: you can redistribute it and/or modify
+* it under the terms of the GNU Lesser General Public License as published by
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public License
+* along with this program. If not, see <http://www.gnu.org/licenses/>.
+*
+**********************************************************************************/
+
+odoo.define('muk_web_theme.ActionManager', function (require) {
+"use strict";
+
+const ActionManager = require('web.ActionManager');
+
+ActionManager.include({
+ _handleAction(action) {
+ return this._super(...arguments).then($.proxy(this, '_hideMenusByAction', action));
+ },
+ _hideMenusByAction(action) {
+ const unique_selection = '[data-action-id=' + action.id + ']';
+ $(_.str.sprintf('.o_menu_apps .dropdown:has(.dropdown-menu.show:has(%s)) > a', unique_selection)).dropdown('toggle');
+ $(_.str.sprintf('.o_menu_sections.show:has(%s)', unique_selection)).collapse('hide');
+ },
+});
+
+});
diff --git a/muk_web_theme/static/src/js/chrome/apps.js b/muk_web_theme/static/src/js/chrome/apps.js
new file mode 100644
index 0000000..8423aa9
--- /dev/null
+++ b/muk_web_theme/static/src/js/chrome/apps.js
@@ -0,0 +1,96 @@
+/**********************************************************************************
+*
+* Copyright (c) 2017-today MuK IT GmbH.
+*
+* This file is part of MuK Grid Snippets
+* (see https://mukit.at).
+*
+* This program is free software: you can redistribute it and/or modify
+* it under the terms of the GNU Lesser General Public License as published by
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public License
+* along with this program. If not, see <http://www.gnu.org/licenses/>.
+*
+**********************************************************************************/
+
+odoo.define('muk_web_theme.AppsMenu', function (require) {
+"use strict";
+
+const core = require('web.core');
+const session = require("web.session");
+
+const AppsMenu = require("web.AppsMenu");
+const MenuSearchMixin = require("muk_web_theme.MenuSearchMixin");
+
+AppsMenu.include(_.extend({}, MenuSearchMixin, {
+ events: _.extend({}, AppsMenu.prototype.events, {
+ "keydown .mk_search_input input": "_onSearchResultsNavigate",
+ "click .mk_menu_search_result": "_onSearchResultChosen",
+ "shown.bs.dropdown": "_onMenuShown",
+ "hidden.bs.dropdown": "_onMenuHidden",
+ "hide.bs.dropdown": "_onMenuHide",
+ }),
+ init(parent, menuData) {
+ this._super(...arguments);
+ for (let n in this._apps) {
+ this._apps[n].web_icon_data = menuData.children[n].web_icon_data;
+ }
+ this._searchableMenus = _.reduce(
+ menuData.children, this._findNames.bind(this), {}
+ );
+ this._search_def = $.Deferred();
+ },
+ start() {
+ this._setBackgroundImage();
+ this.$search_container = this.$(".mk_search_container");
+ this.$search_input = this.$(".mk_search_input input");
+ this.$search_results = this.$(".mk_search_results");
+ return this._super(...arguments);
+ },
+ _onSearchResultChosen(event) {
+ event.preventDefault();
+ const $result = $(event.currentTarget),
+ text = $result.text().trim(),
+ data = $result.data(),
+ suffix = ~text.indexOf("/") ? "/" : "";
+ this.trigger_up("menu_clicked", {
+ action_id: data.actionId,
+ id: data.menuId,
+ previous_menu_id: data.parentId,
+ });
+ const app = _.find(this._apps, (_app) => text.indexOf(_app.name + suffix) === 0);
+ core.bus.trigger("change_menu_section", app.menuID);
+ },
+ _onAppsMenuItemClicked(event) {
+ this._super(...arguments);
+ event.preventDefault();
+ },
+ _setBackgroundImage() {
+ const url = session.url('/web/image', {
+ model: 'res.company',
+ id: session.company_id,
+ field: 'background_image',
+ });
+ this.$('.dropdown-menu').css({
+ "background-size": "cover",
+ "background-image": "url(" + url + ")"
+ });
+ if (session.muk_web_theme_background_blend_mode) {
+ this.$('.o-app-name').css({
+ "mix-blend-mode": session.muk_web_theme_background_blend_mode,
+ });
+ }
+ },
+ _onMenuHide(event) {
+ return $('.oe_wait').length === 0 && !this.$('input').is(':focus');
+ },
+}));
+
+}); \ No newline at end of file
diff --git a/muk_web_theme/static/src/js/chrome/appsbar.js b/muk_web_theme/static/src/js/chrome/appsbar.js
new file mode 100644
index 0000000..eaa91d3
--- /dev/null
+++ b/muk_web_theme/static/src/js/chrome/appsbar.js
@@ -0,0 +1,69 @@
+/**********************************************************************************
+*
+* Copyright (c) 2017-today MuK IT GmbH.
+*
+* This file is part of MuK Grid Snippets
+* (see https://mukit.at).
+*
+* This program is free software: you can redistribute it and/or modify
+* it under the terms of the GNU Lesser General Public License as published by
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public License
+* along with this program. If not, see <http://www.gnu.org/licenses/>.
+*
+**********************************************************************************/
+
+odoo.define('muk_web_theme.AppsBar', function (require) {
+"use strict";
+
+const Widget = require('web.Widget');
+
+const AppsBar = Widget.extend({
+ events: _.extend({}, Widget.prototype.events, {
+ 'click .nav-link': '_onAppsMenuItemClicked',
+ }),
+ template: "muk_web_theme.AppsBarMenu",
+ init(parent, menu) {
+ this._super(...arguments);
+ this._apps = _.map(menu.children, (app) => ({
+ actionID: parseInt(app.action.split(',')[1]),
+ web_icon_data: app.web_icon_data,
+ menuID: app.id,
+ name: app.name,
+ xmlID: app.xmlid,
+ })
+ );
+ },
+ getApps() {
+ return this._apps;
+ },
+ _openApp(app) {
+ this.trigger_up('app_clicked', {
+ action_id: app.actionID,
+ menu_id: app.menuID,
+ });
+ },
+ _onAppsMenuItemClicked(ev) {
+ const $target = $(ev.currentTarget);
+ const actionID = $target.data('action-id');
+ const menuID = $target.data('menu-id');
+ const app = _.findWhere(this._apps, {
+ actionID: actionID,
+ menuID: menuID
+ });
+ this._openApp(app);
+ ev.preventDefault();
+ $target.blur();
+ },
+});
+
+return AppsBar;
+
+}); \ No newline at end of file
diff --git a/muk_web_theme/static/src/js/chrome/menu.js b/muk_web_theme/static/src/js/chrome/menu.js
new file mode 100644
index 0000000..c1e522f
--- /dev/null
+++ b/muk_web_theme/static/src/js/chrome/menu.js
@@ -0,0 +1,101 @@
+/**********************************************************************************
+*
+* Copyright (c) 2017-today MuK IT GmbH.
+*
+* This file is part of MuK Grid Snippets
+* (see https://mukit.at).
+*
+* This program is free software: you can redistribute it and/or modify
+* it under the terms of the GNU Lesser General Public License as published by
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public License
+* along with this program. If not, see <http://www.gnu.org/licenses/>.
+*
+**********************************************************************************/
+
+odoo.define('muk_web_theme.Menu', function (require) {
+"use strict";
+
+const config = require("web.config");
+
+const Menu = require("web.Menu");
+const AppsBar = require("muk_web_theme.AppsBar");
+
+Menu.include({
+ events: _.extend({}, Menu.prototype.events, {
+ "click .o_menu_apps a[data-toggle=dropdown]": "_onAppsMenuClick",
+ "click .mk_menu_mobile_section": "_onMobileSectionClick",
+ "click .o_menu_sections [role=menuitem]": "_hideMobileSubmenus",
+ "show.bs.dropdown .o_menu_systray, .o_menu_apps": "_hideMobileSubmenus",
+ }),
+ menusTemplate: config.device.isMobile ?
+ 'muk_web_theme.MobileMenu.sections' : Menu.prototype.menusTemplate,
+ start() {
+ const res = this._super(...arguments);
+ this.$menu_toggle = this.$(".mk_menu_sections_toggle");
+ this.$menu_apps_sidebar = this.$('.mk_apps_sidebar_panel');
+ this._appsBar = new AppsBar(this, this.menu_data);
+ const appsBarProm = this._appsBar.appendTo(this.$menu_apps_sidebar);
+ appsBarProm.then(() => {
+ this.$menu_apps_sidebar.renderScrollBar();
+ });
+ if (config.device.isMobile) {
+ const menu_ids = _.keys(this.$menu_sections);
+ for (let i = 0; i < menu_ids.length; i++) {
+ const $section = this.$menu_sections[menu_ids[i]];
+ $section.on('click', 'a[data-menu]', this, (ev) => {
+ ev.stopPropagation();
+ });
+ }
+ }
+ return Promise.all([
+ res, appsBarProm
+ ]);
+ },
+ _hideMobileSubmenus() {
+ if (this.$menu_toggle.is(":visible") && $('.oe_wait').length === 0 &&
+ this.$section_placeholder.is(":visible")) {
+ this.$section_placeholder.collapse("hide");
+ }
+ },
+ _updateMenuBrand() {
+ return !config.device.isMobile ? this._super(...arguments) : null;
+ },
+ _onAppsMenuClick(event, checkedCanBeRemoved) {
+ const action_manager = this.getParent().action_manager;
+ const controller = action_manager.getCurrentController();
+ if (controller && !checkedCanBeRemoved) {
+ controller.widget.canBeRemoved().then(() => {
+ $(event.currentTarget).trigger('click', [true]);
+ $(event.currentTarget).off('.bs.dropdown');
+ });
+ event.stopPropagation();
+ event.preventDefault();
+ }
+ },
+ _onMobileSectionClick(event) {
+ event.preventDefault();
+ event.stopPropagation();
+ const $section = $(event.currentTarget);
+ if ($section.hasClass('show')) {
+ $section.removeClass('show');
+ $section.find('.show').removeClass('show');
+ $section.find('.fa-chevron-down').hide();
+ $section.find('.fa-chevron-right').show();
+ } else {
+ $section.addClass('show');
+ $section.find('ul:first').addClass('show');
+ $section.find('.fa-chevron-down:first').show();
+ $section.find('.fa-chevron-right:first').hide();
+ }
+ },
+});
+
+}); \ No newline at end of file