LaOsaCoop/Odoo16#74 add pos_barcode_block_on_error

This commit is contained in:
Luis 2025-09-17 12:03:08 +02:00
parent f4bc2ee66b
commit a24b4392d6
4 changed files with 134 additions and 0 deletions

View file

@ -0,0 +1,67 @@
/** @odoo-module */
/**
* Block barcode processing while ErrorBarcodePopup is visible by taking
* exclusive control of the barcode reader, and release it when closing.
*/
import Registries from "point_of_sale.Registries";
import ErrorBarcodePopup from "point_of_sale.ErrorBarcodePopup";
import { useBarcodeReader } from "point_of_sale.custom_hooks";
const ErrorBarcodePopupBlock = (ErrorPopup) =>
class extends ErrorPopup {
setup() {
super.setup(...arguments);
// Prevent keyboard-triggered clicks (Enter on focused button)
owl.onMounted(() => {
this.__clickHandler = (ev) => {
// Keyboard-triggered clicks usually have detail === 0
if (ev && ev.detail === 0) {
ev.preventDefault();
ev.stopPropagation();
}
};
if (this.el) {
this.el.addEventListener('click', this.__clickHandler, true);
}
});
// Take exclusive control using POS hook so subsequent scans are ignored
useBarcodeReader({
product: () => {},
quantity: () => {},
weight: () => {},
price: () => {},
client: () => {},
discount: () => {},
cashier: () => {},
error: () => {},
gs1: () => {},
}, true);
}
willUnmount() {
// useBarcodeReader cleans up automatically on unmount
if (this.el && this.__clickHandler) {
this.el.removeEventListener('click', this.__clickHandler, true);
}
super.willUnmount(...arguments);
}
// Only accept real pointer clicks to close the popup; ignore keyboard/programmatic events
async confirm(ev) {
if (ev && ev.type === 'click' && ev.isTrusted && ev.detail > 0) {
return super.confirm();
}
}
cancel(ev) {
if (ev && ev.type === 'click' && ev.isTrusted && ev.detail > 0) {
return super.cancel();
}
}
};
Registries.Component.extend(ErrorBarcodePopup, ErrorBarcodePopupBlock);
export default ErrorBarcodePopup;