diff --git a/addons/barcodes/static/src/js/inherited_form_widget_button.js b/addons/barcodes/static/src/js/inherited_form_widget_button.js
new file mode 100644
index 00000000000..6c85b9a92a8
--- /dev/null
+++ b/addons/barcodes/static/src/js/inherited_form_widget_button.js
@@ -0,0 +1,29 @@
+odoo.define('barcode.InheritedFormWidgetButton', function (require) {
+"use strict";
+
+var widgets = require('web.form_widgets');
+var BarcodeHandlerMixin = require('barcodes.BarcodeHandlerMixin');
+
+// If the button has a barcode_trigger attribute, dynamically inherit
+// BarcodeHandlerMixin and redefine on_barcode_scanned
+
+var ButtonBarcodeHandlerMixin = _.extend({}, BarcodeHandlerMixin, {
+ init: function(field_manager, node) {
+ if (node.attrs.barcode_trigger) {
+ BarcodeHandlerMixin.init.call(this, field_manager, node);
+ var self = this;
+ this.on_barcode_scanned = function(barcode) {
+ var match = barcode.match(/O-BTN\.(.+)/);
+ if (match && match[1] === self.node.attrs.barcode_trigger && self.$el.is(':visible')) {
+ self.on_click();
+ }
+ };
+ } else {
+ this._super(field_manager, node);
+ }
+ },
+});
+
+widgets.WidgetButton.include(ButtonBarcodeHandlerMixin);
+
+});
diff --git a/addons/barcodes/views/templates.xml b/addons/barcodes/views/templates.xml
index 1b36f049a9c..2fcab2ea6db 100644
--- a/addons/barcodes/views/templates.xml
+++ b/addons/barcodes/views/templates.xml
@@ -8,6 +8,7 @@
+
diff --git a/addons/web/static/src/js/views/form_widgets.js b/addons/web/static/src/js/views/form_widgets.js
index 8a51e8aa480..54c57c6fd8c 100644
--- a/addons/web/static/src/js/views/form_widgets.js
+++ b/addons/web/static/src/js/views/form_widgets.js
@@ -1663,7 +1663,8 @@ core.form_tag_registry.add('button', WidgetButton);
return {
FieldChar: FieldChar,
- FieldMonetary: FieldMonetary
+ FieldMonetary: FieldMonetary,
+ WidgetButton: WidgetButton
};
});