[FIX] barcode: use the same process for quantity listener
The barcode scanner and the quantity listener do not use the same proccess although they act for the same operation. (For example the quantity listener trigger onchange server side while the barcode scanner not if 'notifychange' key on the active_barcode is set to False) Since quantity listener is based on candidate we could directly call the _barcodeSelectedCandidate method in order to have a common behavior and code.
This commit is contained in:
@@ -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,
|
||||
@@ -306,6 +306,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)
|
||||
@@ -355,9 +357,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}],
|
||||
|
||||
@@ -404,4 +404,82 @@ 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();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user