import { registry } from "@web/core/registry"; import { patch } from "@web/core/utils/patch"; import { wrapDecimal } from "@web_decimal_style/core/utils/numbers_patch"; import { MonetaryField } from "@web/views/fields/monetary/monetary_field"; import { FloatField } from "@web/views/fields/float/float_field"; import { formatMonetary, formatFloat } from "@web/views/fields/formatters"; // Safe field patching with error handling try { // Patch Components for Form Views patch(MonetaryField.prototype, { get formattedValue() { if (this.props.inputType === "number" && !this.props.readonly && this.value) { return this.value; } const res = formatMonetary(this.value, { digits: this.currencyDigits, currencyId: this.currencyId, noSymbol: !this.props.readonly || this.props.hideSymbol, }); // Start of Owl Safe Decimal Styling if (this.props.readonly) { return wrapDecimal(res); } // End of Owl Safe Decimal Styling return res; } }); patch(FloatField.prototype, { get formattedValue() { if ( !this.props.formatNumber || (this.props.inputType === "number" && !this.props.readonly && this.value) ) { return this.value; } const options = { digits: this.props.digits, field: this.props.record.fields[this.props.name], }; let res; if (this.props.humanReadable && !this.state.hasFocus) { res = formatFloat(this.value, { ...options, humanReadable: true, decimals: this.props.decimals, }); } else { res = formatFloat(this.value, { ...options, humanReadable: false }); } // Start of Owl Safe Decimal Styling if (this.props.readonly) { return wrapDecimal(res); } // End of Owl Safe Decimal Styling return res; } }); } catch (error) { console.warn('Field patching error (non-critical):', error); } // Safe Registry Patching for List Views // Safe Registry Patching for List Views try { const formattersRegistry = registry.category("formatters"); // Store original formatters const originalFormatters = new Map(); function safelyPatchFormatter(name) { if (formattersRegistry.contains(name) && !originalFormatters.has(name)) { try { const original = formattersRegistry.get(name); originalFormatters.set(name, original); formattersRegistry.add(name, (...args) => { try { const res = original(...args); // Safely wrap with Owl Markup return wrapDecimal(res); } catch (error) { console.warn(`Formatter ${name} error (non-critical):`, error); return original(...args); // Fallback to original } }, { force: true }); } catch (error) { console.warn(`Error patching formatter ${name} (non-critical):`, error); } } } // Patch all numeric formatters safely ['float', 'monetary', 'percentage', 'float_factor', 'float_time'].forEach(safelyPatchFormatter); } catch (error) { console.warn('Registry patching error (non-critical):', error); }