diff options
| author | Richard Sassine <richardsassine@tutanota.com> | 2021-05-04 18:00:38 +0300 |
|---|---|---|
| committer | Richard Sassine <richardsassine@tutanota.com> | 2021-05-04 18:00:38 +0300 |
| commit | ad97722b1b35aff50d0adf13a19715f7b8373c07 (patch) | |
| tree | edf36f1114b896a01602e31dafd74efe45736427 /muk_web_theme/static/src/js/core | |
initial commit
Diffstat (limited to 'muk_web_theme/static/src/js/core')
| -rw-r--r-- | muk_web_theme/static/src/js/core/search.js | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/muk_web_theme/static/src/js/core/search.js b/muk_web_theme/static/src/js/core/search.js new file mode 100644 index 0000000..0bf5996 --- /dev/null +++ b/muk_web_theme/static/src/js/core/search.js @@ -0,0 +1,134 @@ +/********************************************************************************** +* +* 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.MenuSearchMixin', function (require) { +"use strict"; + +const core = require('web.core'); +const config = require("web.config"); + +const QWeb = core.qweb; + +const MenuSearchMixin = { + _findNames(memo, menu) { + if (menu.action) { + const key = menu.parent_id ? menu.parent_id[1] + "/" : ""; + memo[key + menu.name] = menu; + } + if (menu.children.length) { + _.reduce(menu.children, this._findNames.bind(this), memo); + } + return memo; + }, + _menuInfo(key) { + const original = this._searchableMenus[key]; + return _.extend({ + action_id: parseInt(original.action.split(',')[1], 10), + }, original); + }, + _searchFocus() { + if (!config.device.isMobile) { + this.$search_input.focus(); + } else { + this.$search_input.blur(); + } + }, + _searchReset() { + this.$search_container.removeClass("has-results"); + this.$search_results.empty(); + this.$search_input.val(""); + }, + _searchMenusSchedule() { + this._search_def.reject(); + this._search_def = $.Deferred(); + setTimeout(this._search_def.resolve.bind(this._search_def), 50); + this._search_def.then(this._searchMenus.bind(this)); + }, + _searchMenus() { + const query = this.$search_input.val(); + if (query === "") { + this.$search_container.removeClass("has-results"); + this.$search_results.empty(); + return; + } + const results = fuzzy.filter(query, _.keys(this._searchableMenus), { + pre: "<b>", + post: "</b>", + }); + this.$search_container.toggleClass("has-results", Boolean(results.length)); + this.$search_results.html(QWeb.render("muk_web_theme.MenuSearchResults", { + results: results, + widget: this, + })); + }, + _onSearchResultsNavigate(event) { + if (this.$search_results.html().trim() === "") { + this._searchMenusSchedule(); + return; + } + const all = this.$search_results.find(".mk_menu_search_result"); + const key = event.key || String.fromCharCode(event.which); + const pre_focused = all.filter(".active") || $(all[0]); + const offset = all.index(pre_focused); + if (key === "Tab") { + event.preventDefault(); + key = event.shiftKey ? "ArrowUp" : "ArrowDown"; + } + switch (key) { + case "Enter": + pre_focused.click(); + break; + case "ArrowUp": + offset--; + break; + case "ArrowDown": + offset++; + break; + default: + this._searchMenusSchedule(); + return; + } + if (offset < 0) { + offset = all.length + offset; + } else if (offset >= all.length) { + offset -= all.length; + } + const new_focused = $(all[offset]); + pre_focused.removeClass("active"); + new_focused.addClass("active"); + this.$search_results.scrollTo(new_focused, { + offset: { + top: this.$search_results.height() * -0.5, + }, + }); + }, + _onMenuShown(event) { + this._searchFocus(); + }, + _onMenuHidden(event) { + this._searchReset(); + }, +}; + +return MenuSearchMixin; + +});
\ No newline at end of file |
