85 lines
2.7 KiB
JavaScript
85 lines
2.7 KiB
JavaScript
flectra.define('barcodes.field', function(require) {
|
|
"use strict";
|
|
|
|
var AbstractField = require('web.AbstractField');
|
|
var basicFields = require('web.basic_fields');
|
|
var fieldRegistry = require('web.field_registry');
|
|
|
|
// Field in which the user can both type normally and scan barcodes
|
|
|
|
var FieldFloatScannable = basicFields.FieldFloat.extend({
|
|
events: _.extend({}, basicFields.FieldFloat.prototype.events, {
|
|
// The barcode_events component intercepts keypresses and releases them when it
|
|
// appears they are not part of a barcode. But since released keypresses don't
|
|
// trigger native behaviour (like characters input), we must simulate it.
|
|
'keypress': '_onKeypress',
|
|
}),
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Private
|
|
//--------------------------------------------------------------------------
|
|
|
|
/**
|
|
* @override
|
|
* @private
|
|
*/
|
|
_renderEdit: function() {
|
|
var self = this;
|
|
$.when(this._super()).then(function () {
|
|
self.$input.data('enableBarcode', true);
|
|
});
|
|
},
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Handlers
|
|
//--------------------------------------------------------------------------
|
|
|
|
/**
|
|
* @private
|
|
* @param {KeyboardEvent} e
|
|
*/
|
|
_onKeypress: function (e) {
|
|
/* only simulate a keypress if it has been previously prevented */
|
|
if (e.dispatched_by_barcode_reader !== true) {
|
|
e.preventDefault();
|
|
return;
|
|
}
|
|
var character = String.fromCharCode(e.which);
|
|
var current_str = e.target.value;
|
|
var str_before_carret = current_str.substring(0, e.target.selectionStart);
|
|
var str_after_carret = current_str.substring(e.target.selectionEnd);
|
|
e.target.value = str_before_carret + character + str_after_carret;
|
|
var new_carret_index = str_before_carret.length + character.length;
|
|
e.target.setSelectionRange(new_carret_index, new_carret_index);
|
|
// trigger an 'input' event to notify the widget that it's value changed
|
|
$(e.target).trigger('input');
|
|
},
|
|
});
|
|
|
|
// Field to use scan barcodes
|
|
var FormViewBarcodeHandler = AbstractField.extend({
|
|
/**
|
|
* @override
|
|
*/
|
|
init: function() {
|
|
this._super.apply(this, arguments);
|
|
|
|
this.trigger_up('activeBarcode', {
|
|
name: this.name,
|
|
commands: {
|
|
barcode: '_barcodeAddX2MQuantity',
|
|
}
|
|
});
|
|
},
|
|
});
|
|
|
|
fieldRegistry.add('field_float_scannable', FieldFloatScannable);
|
|
fieldRegistry.add('barcode_handler', FormViewBarcodeHandler);
|
|
|
|
return {
|
|
FieldFloatScannable: FieldFloatScannable,
|
|
FormViewBarcodeHandler: FormViewBarcodeHandler,
|
|
};
|
|
|
|
});
|