diff --git a/addons/barcodes/static/src/js/barcode_handler_mixin.js b/addons/barcodes/static/src/js/barcode_handler_mixin.js new file mode 100644 index 00000000000..5b01516788f --- /dev/null +++ b/addons/barcodes/static/src/js/barcode_handler_mixin.js @@ -0,0 +1,47 @@ +odoo.define('barcodes.BarcodeHandlerMixin', function(require) { +"use strict"; + +var core = require('web.core'); +var View = require('web.View'); + +// Mixin implementing the common basis for barcode handlers. +// The object on which this mixin is applied must also include ParentedMixin. Example : +// Widget.extend(BarcodeHandlerMixin, { ... }); +// Class.extend(PropertiesMixin, BarcodeHandlerMixin, { ... }); + +return { + init: function() { + var self = this; + this._super.apply(this, arguments); + this.__on_barcode_scanned = function () { + self.on_barcode_scanned.apply(self, arguments); + }; + this.start_listening(); + // Handlers inside a View managed by a ViewManager only listen to barcode events while their view is displayed + var view = this.findAncestor(function(ancestor) { return ancestor instanceof View }); + if (view) { + view.on('attached', this, this.start_listening); + view.on('detached', this, this.stop_listening); + } + }, + + start_listening: function() { + if (! this.is_listening) { + core.bus.on('barcode_scanned', this, this.__on_barcode_scanned); + this.is_listening = true; + } + }, + + stop_listening: function() { + if (this.is_listening) { + core.bus.off('barcode_scanned', this, this.__on_barcode_scanned); + this.is_listening = false; + } + }, + + on_barcode_scanned: function(barcode) { + console.error('A class implementing BarcodeHandlerMixin must redefine method on_barcode_scanned.'); + }, +}; + +}); diff --git a/addons/barcodes/static/src/js/form_view_barcode_handler.js b/addons/barcodes/static/src/js/form_view_barcode_handler.js index a68d531819f..ab2f6514bf0 100644 --- a/addons/barcodes/static/src/js/form_view_barcode_handler.js +++ b/addons/barcodes/static/src/js/form_view_barcode_handler.js @@ -4,15 +4,14 @@ odoo.define('barcodes.FormViewBarcodeHandler', function(require) { var core = require('web.core'); var utils = require('web.utils'); var common = require('web.form_common'); +var BarcodeHandlerMixin = require('barcodes.BarcodeHandlerMixin'); var _t = core._t; -var FormViewBarcodeHandler = common.AbstractField.extend({ - +var FormViewBarcodeHandler = common.AbstractField.extend(BarcodeHandlerMixin, { start: function() { this._super(); this.form_view = this.field_manager; - core.bus.on('barcode_scanned', this, this.on_barcode_scanned); // Hardcoded barcode actions this.map_barcode_method = { 'O-CMD.NEW': _.bind(this.form_view.on_button_new, this.form_view), diff --git a/addons/barcodes/views/templates.xml b/addons/barcodes/views/templates.xml index 2db01ead8de..1b36f049a9c 100644 --- a/addons/barcodes/views/templates.xml +++ b/addons/barcodes/views/templates.xml @@ -6,6 +6,7 @@ +