[IMP] barcodes: allow immediate quantity input after scanning

When scanning items with a device like the Symbol MC3200 you are
presented with the Kanban view because of it's limited resolution.

In this view it is not possible to quickly set the quantity of scanned
products. Ideally users just want to scan the barcode, input the
quantity and repeat without having to click on virtual buttons on the
usually less than ideal touchscreen.

This implements a way for users to immediately start typing numbers
representing a quantity after scanning a barcode. The quantity will be
set on the specified m2x_field.quantity_field of the record associated
to the last scanned barcode. Because KanbanRecords are not editable
without opening a new view window.prompt is used. It will create an easy
to use native dialog of whatever device is being used. It also avoids us
having to implement a custom input field which would have to handle
keypress events like numbers, backspace, delete, etc.
This commit is contained in:
Joren Van Onder
2016-03-17 09:39:18 +01:00
committed by Antony Lesuisse
parent c6fc91b318
commit 5bb64d40d0
2 changed files with 90 additions and 4 deletions
+23 -2
View File
@@ -143,11 +143,18 @@ msgstr ""
#. module: barcodes
#. openerp-web
#: code:addons/barcodes/static/src/js/form_view_barcode_handler.js:51
#: code:addons/barcodes/static/src/js/form_view_barcode_handler.js:122
#, python-format
msgid "Error : Document not editable"
msgstr ""
#. module: barcodes
#. openerp-web
#: code:addons/barcodes/static/src/js/form_view_barcode_handler.js:56
#, python-format
msgid "Error : No last scanned barcode"
msgstr ""
#. module: barcodes
#: model:ir.model.fields,field_description:barcodes.field_barcode_nomenclature_id
#: model:ir.model.fields,field_description:barcodes.field_barcode_rule_id
@@ -209,6 +216,13 @@ msgstr ""
msgid "Sequence"
msgstr ""
#. module: barcodes
#. openerp-web
#: code:addons/barcodes/static/src/js/form_view_barcode_handler.js:68
#, python-format
msgid "Set quantity"
msgstr ""
#. module: barcodes
#: model:ir.ui.view,arch_db:barcodes.view_barcode_nomenclature_form
msgid "Tables"
@@ -244,11 +258,18 @@ msgstr ""
#. module: barcodes
#. openerp-web
#: code:addons/barcodes/static/src/js/form_view_barcode_handler.js:51
#: code:addons/barcodes/static/src/js/form_view_barcode_handler.js:122
#, python-format
msgid "To modify this document, please first start edition."
msgstr ""
#. module: barcodes
#. openerp-web
#: code:addons/barcodes/static/src/js/form_view_barcode_handler.js:56
#, python-format
msgid "To set the quantity please scan a barcode first."
msgstr ""
#. module: barcodes
#: model:ir.model.fields,field_description:barcodes.field_barcode_rule_type
msgid "Type"
@@ -23,6 +23,13 @@ KanbanRecord.include({
});
var FormViewBarcodeHandler = common.AbstractField.extend(BarcodeHandlerMixin, {
init: function(parent, context) {
this.__quantity_listener = _.bind(this._set_quantity_listener, this);
BarcodeHandlerMixin.init.apply(this, arguments);
return this._super.apply(this, arguments);
},
start: function() {
this._super();
this.form_view = this.field_manager;
@@ -44,7 +51,64 @@ var FormViewBarcodeHandler = common.AbstractField.extend(BarcodeHandlerMixin, {
this.map_barcode_method['O-CMD.PAGER-NEXT'] = _.bind(this.form_view.pager.next, this.form_view.pager);
}
},
_display_no_edit_mode_warning: function() {
this.do_warn(_t('Error : Document not editable'), _t('To modify this document, please first start edition.'));
},
_display_no_last_scanned_warning: function() {
this.do_warn(_t('Error : No last scanned barcode'), _t('To set the quantity please scan a barcode first.'));
},
_set_quantity_listener: function(event) {
var self = this;
var character = String.fromCharCode(event.which);
if (this.form_view.get('actual_mode') === 'view') {
this._display_no_edit_mode_warning();
} else if ($(event.target).is('body') && /[0-9]/.test(character)) { // only catch the event if we're not focused in
// another field and it's a number
var field = this.form_view.fields[this.m2x_field];
var view = field.viewmanager.active_view;
if (this.last_scanned_barcode) {
var new_qty = window.prompt(_t('Set quantity'), character) || "0";
new_qty = new_qty.replace(',', '.');
var record = this._get_records(field).find(function(record) {
return record.get('product_barcode') === self.last_scanned_barcode;
});
if (record) {
var values = {};
values[this.quantity_field] = parseFloat(new_qty);
field.data_update(record.get('id'), values).then(function () {
view.controller.reload_record(record);
});
} else {
this._display_no_last_scanned_warning();
}
} else {
this._display_no_last_scanned_warning();
}
}
},
start_listening: function() {
if (this.quantity_field && ! this.is_listening) {
core.bus.on('keypress', this, this.__quantity_listener);
}
BarcodeHandlerMixin.start_listening.call(this);
},
stop_listening: function() {
if (this.quantity_field && this.is_listening) {
core.bus.off('keypress', this, this.__quantity_listener);
delete this.last_scanned_barcode;
}
BarcodeHandlerMixin.stop_listening.call(this);
},
// Let subclasses add custom behaviour before onchange. Must return a deferred.
// Resolve the deferred with true proceed with the onchange, false to prevent it.
pre_onchange_hook: function(barcode) {
@@ -53,6 +117,7 @@ var FormViewBarcodeHandler = common.AbstractField.extend(BarcodeHandlerMixin, {
on_barcode_scanned: function(barcode) {
var self = this;
self.last_scanned_barcode = barcode;
// Execute a harcoded action
var action = this.map_barcode_method[barcode];
if (typeof action === "function")
@@ -61,7 +126,7 @@ var FormViewBarcodeHandler = common.AbstractField.extend(BarcodeHandlerMixin, {
return;
// Warn the user if form view is not editable
else if (this.form_view.get('actual_mode') === 'view')
this.do_warn(_t('Error : Document not editable'), _t('To modify this document, please first start edition.'));
this._display_no_edit_mode_warning();
else {
// Call hook method possibly implemented by subclass
this.pre_onchange_hook(barcode).then(function(proceed) {