MuK IT GmbH
5 years ago
4 changed files with 140 additions and 101 deletions
-
2muk_web_theme/__manifest__.py
-
103muk_web_theme/static/src/js/chrome/apps.js
-
133muk_web_theme/static/src/js/core/search.js
-
3muk_web_theme/template/assets.xml
@ -0,0 +1,133 @@ |
|||
/********************************************************************************** |
|||
* |
|||
* Copyright (C) 2017 MuK IT GmbH |
|||
* |
|||
* This program is free software: you can redistribute it and/or modify |
|||
* it under the terms of the GNU Affero 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 Affero General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Affero 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"; |
|||
|
|||
var core = require('web.core'); |
|||
var config = require("web.config"); |
|||
var session = require("web.session"); |
|||
|
|||
var _t = core._t; |
|||
var QWeb = core.qweb; |
|||
|
|||
var MenuSearchMixin = { |
|||
_findNames: function (memo, menu) { |
|||
if (menu.action) { |
|||
var 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: function (key) { |
|||
var original = this._searchableMenus[key]; |
|||
return _.extend({ |
|||
action_id: parseInt(original.action.split(',')[1], 10), |
|||
}, original); |
|||
}, |
|||
_searchFocus: function () { |
|||
if (!config.device.isMobile) { |
|||
this.$search_input.focus(); |
|||
} else { |
|||
this.$search_input.blur(); |
|||
} |
|||
}, |
|||
_searchReset: function () { |
|||
this.$search_container.removeClass("has-results"); |
|||
this.$search_results.empty(); |
|||
this.$search_input.val(""); |
|||
}, |
|||
_searchMenusSchedule: function () { |
|||
this._search_def.reject(); |
|||
this._search_def = $.Deferred(); |
|||
setTimeout(this._search_def.resolve.bind(this._search_def), 50); |
|||
this._search_def.done(this._searchMenus.bind(this)); |
|||
}, |
|||
_searchMenus: function () { |
|||
var query = this.$search_input.val(); |
|||
if (query === "") { |
|||
this.$search_container.removeClass("has-results"); |
|||
this.$search_results.empty(); |
|||
return; |
|||
} |
|||
var 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: function (event) { |
|||
if (this.$search_results.html().trim() === "") { |
|||
this._searchMenusSchedule(); |
|||
return; |
|||
} |
|||
var all = this.$search_results.find(".mk_menu_search_result"); |
|||
var key = event.key || String.fromCharCode(event.which); |
|||
var pre_focused = all.filter(".active") || $(all[0]); |
|||
var 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; |
|||
} |
|||
var 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: function(event) { |
|||
this._searchFocus(); |
|||
}, |
|||
_onMenuHidden: function(event) { |
|||
this._searchReset(); |
|||
}, |
|||
}; |
|||
|
|||
return MenuSearchMixin; |
|||
|
|||
}); |
Write
Preview
Loading…
Cancel
Save
Reference in new issue