odoo.define('base_iban.iban_widget', function (require) {
"use strict";
var basicFields = require('web.basic_fields');
var core = require('web.core');
var fieldRegistry = require('web.field_registry');
var FieldChar = basicFields.FieldChar;
var _t = core._t;
/**
* IbanWidget is a widget to check if the iban number is valide.
* If the bank account is correct, it will show a green check pictogram
* next to number, if the number is not complient with IBAN format, a
* red cross will be show. This pictogram is computed every time the user
* changes the field (If user is typing, there is a debouce of 400ms).
*/
var IbanWidget = FieldChar.extend({
/**
* @constructor
*/
init: function () {
this._super.apply(this, arguments);
this.ibanIsValid;
this._isValid = true;
this._compute_debounce = _.debounce(this._compute, 400);
},
//--------------------------------------------------------------------------
// Private
//--------------------------------------------------------------------------
/**
* Compute if iban is valid
* @private
*/
_compute: function () {
var self = this;
var content = this._getValue();
if (content.length === 0) {
this.ibanIsValid = true;
this.$el.last().filter('.o_iban').removeClass('fa-check text-success fa-times text-danger o_iban_fail');
this.$el.last().filter('.o_iban').attr('title', '');
} else if (content.length < 15) {
if (this.ibanIsValid !== false) {
this.ibanIsValid = false;
this._renderValid();
}
} else {
this._rpc({
model: 'res.partner.bank',
method: 'check_iban',
args: [[], content],
})
.then(function (result) {
if (result !== self.ibanIsValid) {
self.ibanIsValid = result;
self._renderValid();
}
});
}
},
/**
* @private
* @override
* @returns {Promise|undefined}
*/
_renderEdit: function () {
var res = this._super.apply(this, arguments);
this._compute();
return res;
},
/**
* Render the pictogram next to account number.
* @private
*/
_renderValid: function () {
var warningMessage = _t("Account isn't IBAN compliant.");
if (this.$el.filter('.o_iban').length === 0) {
var $span;
if (!this.ibanIsValid) {
$span = $('');
$span.attr('title', warningMessage);
} else {
$span = $('');
}
this.$el.addClass('o_iban_input_with_validator');
$span.insertAfter(this.$el);
this.$el = this.$el.add($span);
}
if (!this.ibanIsValid) {
this.$el.last().filter('.o_iban').removeClass('fa-check text-success').addClass('fa-times text-danger o_iban_fail');
this.$el.last().filter('.o_iban').attr('title', warningMessage);
} else {
this.$el.last().filter('.o_iban').removeClass('fa-times text-danger o_iban_fail').addClass('fa-check text-success');
this.$el.last().filter('.o_iban').attr('title', '');
}
},
//--------------------------------------------------------------------------
// Handlers
//--------------------------------------------------------------------------
/**
* @override
* @private
*/
_onChange: function () {
this._super.apply(this, arguments);
this._compute();
},
/**
* @override
* @private
*/
_onInput: function () {
this._super.apply(this, arguments);
this._compute_debounce();
},
});
fieldRegistry.add('iban', IbanWidget);
return IbanWidget;
});