/** @odoo-module **/ import { browser } from "@web/core/browser/browser"; import { Dialog } from "@web/core/dialog/dialog"; import { _lt } from "@web/core/l10n/translation"; import { useChildRef, useOwnedDialogs, useService } from "@web/core/utils/hooks"; import { sprintf } from "@web/core/utils/strings"; import { isMobileOS } from "@web/core/browser/feature_detection"; import * as BarcodeScanner from "@web/webclient/barcode/barcode_scanner"; const {xml, Component} = owl; import { standardFieldProps } from "@web/views/fields/standard_field_props"; // Import the registry import {registry} from "@web/core/registry"; export class CodeField extends Component { setup() { super.setup(); } async onBarcodeBtnClick() { const barcode = await BarcodeScanner.scanBarcode(); if (barcode) { await this.onBarcodeScanned(barcode); if ("vibrate" in browser.navigator) { browser.navigator.vibrate(100); } } else { this.notification.add(this.env._t("Please, scan again !"), { type: "warning", }); } } async search(barcode) { const results = await this.orm.call("sf.tray", "name_search", [code], { name: barcode, args: this.getDomain(), operator: "ilike", limit: 2, // If one result we set directly and if more than one we use normal flow so no need to search more context: this.context, }); return results.map((result) => { const [id, displayName] = result; return { id, name: displayName, }; }); } async onBarcodeScanned(barcode) { const results = await this.search(barcode); const records = results.filter((r) => !!r.id); if (records.length === 1) { this.update([{ id: records[0].id, name: records[0].name }]); } else { const searchInput = this.autocompleteContainerRef.el.querySelector("input"); searchInput.value = barcode; searchInput.dispatchEvent(new Event("input")); if (this.env.isSmall) { searchInput.click(); } } } } CodeField.template = xml`