mirror of https://github.com/OCA/web.git
[FIX] web_responsive: Allow searching apps in mobile Chrome
This patch fixes #1251. The keydown event is faked in mobile chrome because it's not something reliable due to today's virtual keyboards prediction features. Typing a <kbd>C</kbd> character doesn't mean it will be there when user uses autocorrection/autoguessing. Instead of that, we use now the `keydown` event exclusively for movement features, and `input` event exclusively for content changes in the search input element. Apart from fixing search in mobile Chrome, it also makes code more readable. The search input also disables autocompletion since it would be useless and annoying here.pull/1252/head
parent
2465278969
commit
771ab61d0b
|
@ -72,6 +72,7 @@ odoo.define('web_responsive', function (require) {
|
||||||
AppsMenu.include({
|
AppsMenu.include({
|
||||||
events: _.extend({
|
events: _.extend({
|
||||||
"keydown .search-input input": "_searchResultsNavigate",
|
"keydown .search-input input": "_searchResultsNavigate",
|
||||||
|
"input .search-input input": "_searchMenusSchedule",
|
||||||
"click .o-menu-search-result": "_searchResultChosen",
|
"click .o-menu-search-result": "_searchResultChosen",
|
||||||
"shown.bs.dropdown": "_searchFocus",
|
"shown.bs.dropdown": "_searchFocus",
|
||||||
"hidden.bs.dropdown": "_searchReset",
|
"hidden.bs.dropdown": "_searchReset",
|
||||||
|
@ -217,17 +218,15 @@ odoo.define('web_responsive', function (require) {
|
||||||
* @param {jQuery.Event} event
|
* @param {jQuery.Event} event
|
||||||
*/
|
*/
|
||||||
_searchResultsNavigate: function (event) {
|
_searchResultsNavigate: function (event) {
|
||||||
// Exit soon when not navigating results
|
|
||||||
if (this.$search_results.html().trim() === "") {
|
|
||||||
// Just in case it is the 1st search
|
|
||||||
this._searchMenusSchedule();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Find current results and active element (1st by default)
|
// Find current results and active element (1st by default)
|
||||||
var all = this.$search_results.find(".o-menu-search-result"),
|
var all = this.$search_results.find(".o-menu-search-result"),
|
||||||
pre_focused = all.filter(".active") || $(all[0]),
|
pre_focused = all.filter(".active") || $(all[0]),
|
||||||
offset = all.index(pre_focused),
|
offset = all.index(pre_focused),
|
||||||
key = event.key;
|
key = event.key;
|
||||||
|
// Keyboard navigation only supports search results
|
||||||
|
if (!all.length) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
// Transform tab presses in arrow presses
|
// Transform tab presses in arrow presses
|
||||||
if (key === "Tab") {
|
if (key === "Tab") {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
|
@ -245,12 +244,8 @@ odoo.define('web_responsive', function (require) {
|
||||||
case "ArrowDown":
|
case "ArrowDown":
|
||||||
offset++;
|
offset++;
|
||||||
break;
|
break;
|
||||||
// Other keys trigger a search
|
|
||||||
default:
|
default:
|
||||||
// All keys that write a character have length 1
|
// Other keys are useless in this event
|
||||||
if (key.length === 1 || key === "Backspace") {
|
|
||||||
this._searchMenusSchedule();
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// Allow looping on results
|
// Allow looping on results
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<input type="search"
|
<input type="search"
|
||||||
|
autocomplete="off"
|
||||||
placeholder="Search menus..."
|
placeholder="Search menus..."
|
||||||
class="form-control"/>
|
class="form-control"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
Loading…
Reference in New Issue