Skip to content
Snippets Groups Projects
Commit 6229674b authored by Louis Baudoux's avatar Louis Baudoux
Browse files

[FIX] partner_autocomplete: fix search by VAT number on `Many2one` fields


Since the Owl conversion of the partner autocomplete widgets, the search
by VAT number on a `Many2one` field of `res.partner` wasn't working
anymore.

closes odoo/odoo#118071

Signed-off-by: default avatarFlorian Daloze (fda) <fda@odoo.com>
parent 7ec8b25e
No related branches found
No related tags found
No related merge requests found
/** @odoo-module **/
/* global checkVATNumber */
import { loadJS } from "@web/core/assets";
import { _t } from "@web/core/l10n/translation";
import { KeepLast } from "@web/core/utils/concurrency";
import { useService } from "@web/core/utils/hooks";
......@@ -21,8 +23,24 @@ export function usePartnerAutocomplete() {
const notification = useService("notification");
const orm = useService("orm");
function autocomplete(value, isVAT = false) {
function sanitizeVAT(value) {
return value ? value.replace(/[^A-Za-z0-9]/g, '') : '';
}
async function isVATNumber(value) {
// Lazyload jsvat only if the component is being used.
await loadJS("/partner_autocomplete/static/lib/jsvat.js");
// checkVATNumber is defined in library jsvat.
// It validates that the input has a valid VAT number format
return checkVATNumber(sanitizeVAT(value));
}
async function autocomplete(value) {
value = value.trim();
const isVAT = await isVATNumber(value);
let odooSuggestions = [];
let clearbitSuggestions = [];
return new Promise((resolve, reject) => {
......@@ -292,5 +310,5 @@ export function usePartnerAutocomplete() {
notification.add(title);
}
}
return { autocomplete, getCreateData };
return { autocomplete, getCreateData, isVATNumber };
}
/** @odoo-module **/
/* global checkVATNumber */
import { AutoComplete } from "@web/core/autocomplete/autocomplete";
import { useChildRef } from "@web/core/utils/hooks";
......@@ -7,7 +6,6 @@ import { registry } from "@web/core/registry";
import { _t } from "@web/core/l10n/translation";
import { CharField } from "@web/views/fields/char/char_field";
import { useInputField } from "@web/views/fields/input_field_hook";
import { loadJS } from "@web/core/assets";
import { usePartnerAutocomplete } from "@partner_autocomplete/js/partner_autocomplete_core"
......@@ -21,19 +19,9 @@ export class PartnerAutoCompleteCharField extends CharField {
useInputField({ getValue: () => this.props.value || "", parse: (v) => this.parse(v), ref: this.inputRef});
}
sanitizeVAT(request) {
return request ? request.replace(/[^A-Za-z0-9]/g, '') : '';
}
isVAT(request) {
// checkVATNumber is defined in library jsvat.
// It validates that the input has a valid VAT number format
return checkVATNumber(this.sanitizeVAT(request));
}
validateSearchTerm(request) {
async validateSearchTerm(request) {
if (this.props.name == 'vat') {
return this.isVAT(request);
return this.partner_autocomplete.isVATNumber(request);
}
else {
return request && request.length > 2;
......@@ -44,11 +32,8 @@ export class PartnerAutoCompleteCharField extends CharField {
return [
{
options: async (request) => {
// Lazyload jsvat only if the component is being used.
await loadJS("/partner_autocomplete/static/lib/jsvat.js");
if (this.validateSearchTerm(request)) {
const suggestions = await this.partner_autocomplete.autocomplete(request, this.isVAT(request));
if (await this.validateSearchTerm(request)) {
const suggestions = await this.partner_autocomplete.autocomplete(request);
suggestions.forEach((suggestion) => {
suggestion.classList = "partner_autocomplete_dropdown_char";
});
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment