summaryrefslogtreecommitdiff
path: root/addons/web/static/src/js/framework
diff options
context:
space:
mode:
authorJoren Van Onder <jov@odoo.com>2015-05-28 11:20:45 +0200
committerFrédéric van der Essen <fva@openerp.com>2015-05-29 16:29:15 +0200
commit44d5fbb21f482fdfb73eb607eb4871bfc510bd11 (patch)
treeef3f04beba9bce2b57a24974f5f7832941abc292 /addons/web/static/src/js/framework
parent49d4ddd422145beee6d7bf442df9ecd0485d723d (diff)
[IMP] barcode_events: implement better keyrepeat blocking
Before this, users were only able to press a key when all other keys were released to prevent a key from repeating. This works but when typing you usually press the next key before releasing the current one. This allows users to do exactly that while still blocking keys from repeating.
Diffstat (limited to 'addons/web/static/src/js/framework')
-rw-r--r--addons/web/static/src/js/framework/barcode_events.js29
1 files changed, 17 insertions, 12 deletions
diff --git a/addons/web/static/src/js/framework/barcode_events.js b/addons/web/static/src/js/framework/barcode_events.js
index 6aa5327a768..5956eee08ee 100644
--- a/addons/web/static/src/js/framework/barcode_events.js
+++ b/addons/web/static/src/js/framework/barcode_events.js
@@ -6,7 +6,7 @@ odoo.define('web.BarcodeEvents', function(require) {
return core.Class.extend(mixins.PropertiesMixin, {
timeout: null,
- key_released: true,
+ key_pressed: {},
buffered_key_events: [],
init: function(parent) {
@@ -73,20 +73,23 @@ odoo.define('web.BarcodeEvents', function(require) {
return $(element).is('input,textarea,[contenteditable="true"]');
},
+ // The keydown and keyup handlers are here to disallow key
+ // repeat. When preventDefault() is called on a keydown event
+ // the keypress that normally follows is cancelled.
+ keydown_handler: function(e){
+ if (this.key_pressed[e.which]) {
+ e.preventDefault();
+ } else {
+ this.key_pressed[e.which] = true;
+ }
+ },
+
keyup_handler: function(e){
- this.key_released = true;
+ this.key_pressed[e.which] = false;
},
handler: function(e){
if (! e.dispatched_by_barcode_reader) {
- if (! this.key_released) { // don't allow key repeat
- e.preventDefault();
- e.stopImmediatePropagation();
- return;
- }
-
- this.key_released = false;
-
// We only stop events targeting body (meaning nothing is
// focused). We do not stop events targeting other elements
// because we have no way of redispatching 'genuine' key events
@@ -106,13 +109,15 @@ odoo.define('web.BarcodeEvents', function(require) {
},
start: function(){
- document.body.addEventListener('keypress', this.handler.bind(this), true);
+ document.body.addEventListener('keydown', this.keydown_handler.bind(this), true);
document.body.addEventListener('keyup', this.keyup_handler.bind(this), true);
+ document.body.addEventListener('keypress', this.handler.bind(this), true);
},
stop: function(){
- document.body.removeEventListener('keypress', this.handler.bind(this), true);
+ document.body.removeEventListener('keydown', this.keydown_handler.bind(this), true);
document.body.removeEventListener('keyup', this.keyup_handler.bind(this), true);
+ document.body.removeEventListener('keypress', this.handler.bind(this), true);
},
});
});