summaryrefslogtreecommitdiff
path: root/addons/barcodes
diff options
context:
space:
mode:
Diffstat (limited to 'addons/barcodes')
-rw-r--r--addons/barcodes/static/src/js/barcode_form_view.js23
-rw-r--r--addons/barcodes/static/tests/barcode_tests.js132
2 files changed, 146 insertions, 9 deletions
diff --git a/addons/barcodes/static/src/js/barcode_form_view.js b/addons/barcodes/static/src/js/barcode_form_view.js
index 1730b42290e..015119c5830 100644
--- a/addons/barcodes/static/src/js/barcode_form_view.js
+++ b/addons/barcodes/static/src/js/barcode_form_view.js
@@ -146,10 +146,10 @@ FormController.include({
* @param {Object} activeBarcode: options sent by the field who use barcode features
* @returns {Deferred}
*/
- _barcodeSelectedCandidate: function (candidate, record, barcode, activeBarcode) {
+ _barcodeSelectedCandidate: function (candidate, record, barcode, activeBarcode, quantity) {
var changes = {};
var candidateChanges = {};
- candidateChanges[activeBarcode.quantity] = candidate.data[activeBarcode.quantity] + 1;
+ candidateChanges[activeBarcode.quantity] = quantity ? quantity : candidate.data[activeBarcode.quantity] + 1;
changes[activeBarcode.fieldName] = {
operation: 'UPDATE',
id: candidate.id,
@@ -283,15 +283,14 @@ FormController.include({
function (reserved) {return barcode.indexOf(reserved) === 0;});
var hasCommand = false;
var defs = [];
+ if (! $.contains(target, self.el)) {
+ return;
+ }
for (var k in self.activeBarcode) {
var activeBarcode = self.activeBarcode[k];
// Handle the case where there are several barcode widgets on the same page. Since the
// event is global on the page, all barcode widgets will be triggered. However, we only
// want to keep the event on the target widget.
- if (! $.contains(target, self.el)) {
- continue;
- }
-
var methods = self.activeBarcode[k].commands;
var method = prefixed ? methods[barcode] : methods.barcode;
if (method) {
@@ -306,6 +305,8 @@ FormController.include({
}
return self.alive($.when.apply($, defs)).then(function () {
if (!prefixed) {
+ // remember the barcode scanned for the quantity listener
+ self.current_barcode = barcode;
// redraw the view if we scanned a real barcode (required if
// we manually apply the change in JS, e.g. incrementing the
// quantity)
@@ -321,6 +322,9 @@ FormController.include({
_quantityListener: function (event) {
var character = String.fromCharCode(event.which);
+ if (! $.contains(event.target, this.el)) {
+ return;
+ }
// only catch the event if we're not focused in
// another field and it's a number
if (!$(event.target).is('body, .modal') || !/[0-9]/.test(character)) {
@@ -355,9 +359,10 @@ FormController.include({
title: _t('Set quantity'),
buttons: [{text: _t('Select'), classes: 'btn-primary', close: true, click: function () {
var new_qty = this.$content.find('.o_set_qty_input').val();
- var values = {};
- values[activeBarcode.quantity] = parseFloat(new_qty);
- return self.model.notifyChanges(activeBarcode.candidate.id, values).then(function () {
+ var record = self.model.get(self.handle);
+ return self._barcodeSelectedCandidate(activeBarcode.candidate, record,
+ self.current_barcode, activeBarcode, parseFloat(new_qty))
+ .then(function () {
self.update({}, {reload: false});
});
}}, {text: _t('Discard'), close: true}],
diff --git a/addons/barcodes/static/tests/barcode_tests.js b/addons/barcodes/static/tests/barcode_tests.js
index cf77497a2a7..b2a2bf46126 100644
--- a/addons/barcodes/static/tests/barcode_tests.js
+++ b/addons/barcodes/static/tests/barcode_tests.js
@@ -404,4 +404,136 @@ QUnit.test('specification of widget barcode_handler', function (assert) {
barcodeEvents.BarcodeEvents.max_time_between_keys_in_ms = delay;
delete fieldRegistry.map.test_barcode_handler;
});
+
+QUnit.test('specification of widget barcode_handler with keypress and notifyChange', function (assert) {
+ assert.expect(6);
+ var done = assert.async();
+
+ var delay = barcodeEvents.BarcodeEvents.max_time_between_keys_in_ms;
+ barcodeEvents.BarcodeEvents.max_time_between_keys_in_ms = 0;
+
+ this.data.order.onchanges = {
+ _barcode_scanned: function () {},
+ };
+
+ // Define a specific barcode_handler widget for this test case
+ var TestBarcodeHandler = AbstractField.extend({
+ init: function () {
+ this._super.apply(this, arguments);
+
+ this.trigger_up('activeBarcode', {
+ name: 'test',
+ fieldName: 'line_ids',
+ notifyChange: false,
+ setQuantityWithKeypress: true,
+ quantity: 'quantity',
+ commands: {
+ barcode: '_barcodeAddX2MQuantity',
+ }
+ });
+ },
+ });
+ fieldRegistry.add('test_barcode_handler', TestBarcodeHandler);
+
+ var form = createView({
+ View: FormView,
+ model: 'order',
+ data: this.data,
+ arch: '<form>' +
+ '<field name="_barcode_scanned" widget="test_barcode_handler"/>' +
+ '<field name="line_ids">' +
+ '<tree>' +
+ '<field name="product_id"/>' +
+ '<field name="product_barcode" invisible="1"/>' +
+ '<field name="quantity"/>' +
+ '</tree>' +
+ '</field>' +
+ '</form>',
+ mockRPC: function (route, args) {
+ assert.step(args.method);
+ return this._super.apply(this, arguments);
+ },
+ res_id: 1,
+ viewOptions: {
+ mode: 'edit',
+ },
+ });
+ _.each(['1','2','3','4','5','6','7','8','9','0','Enter'], triggerKeypressEvent);
+ // Quantity listener should open a dialog.
+ triggerKeypressEvent('5');
+
+ setTimeout(function () {
+ var keycode = $.ui.keyCode.ENTER;
+
+ assert.strictEqual($('.modal .modal-body').length, 1, 'should open a modal with a quantity as input');
+ assert.strictEqual($('.modal .modal-body .o_set_qty_input').val(), '5', 'the quantity by default in the modal shoud be 5');
+
+ $('.modal .modal-body .o_set_qty_input').val('7');
+
+ $('.modal .modal-body .o_set_qty_input').trigger($.Event('keypress', {which: keycode, keyCode: keycode}));
+ assert.strictEqual(form.$('.o_data_row .o_data_cell:nth(1)').text(), '7',
+ "quantity checked should be 7");
+
+ assert.verifySteps(['read', 'read']);
+
+ form.destroy();
+ barcodeEvents.BarcodeEvents.max_time_between_keys_in_ms = delay;
+ delete fieldRegistry.map.test_barcode_handler;
+ done();
+ });
+});
+QUnit.test('barcode_scanned only trigger error for active view', function (assert) {
+ assert.expect(2);
+
+ this.data.order_line.fields._barcode_scanned = {string: 'Barcode scanned', type: 'char'};
+
+ var form = createView({
+ View: FormView,
+ model: 'order',
+ data: this.data,
+ arch: '<form>' +
+ '<field name="_barcode_scanned" widget="barcode_handler"/>' +
+ '<field name="line_ids">' +
+ '<tree>' +
+ '<field name="product_id"/>' +
+ '<field name="product_barcode" invisible="1"/>' +
+ '<field name="quantity"/>' +
+ '</tree>' +
+ '</field>' +
+ '</form>',
+ archs: {
+ "order_line,false,form":
+ '<form string="order line">' +
+ '<field name="_barcode_scanned" widget="barcode_handler"/>' +
+ '<field name="product_id"/>' +
+ '</form>',
+ },
+ res_id: 1,
+ intercepts: {
+ warning: function (event) {
+ assert.step(event.name);
+ }
+ },
+ viewOptions: {
+ mode: 'edit',
+ },
+ });
+
+ form.$('.o_data_row:first').click();
+
+ // We do not trigger on the body since modal and
+ // form view are both inside it.
+ function modalTriggerKeypressEvent(char) {
+ var keycode;
+ if (char === "Enter") {
+ keycode = $.ui.keyCode.ENTER;
+ } else {
+ keycode = char.charCodeAt(0);
+ }
+ return $('.modal').trigger($.Event('keypress', {which: keycode, keyCode: keycode}));
+ }
+ _.each(['O','-','B','T','N','.','c','a','n','c','e','l','Enter'], modalTriggerKeypressEvent);
+ assert.verifySteps(['warning'], "only one event should be triggered");
+ form.destroy();
+});
});