refactor: Replace DOM observer-based decimal styling with direct wrapDecimal integration in field formatters.

This commit is contained in:
Suherdy Yacob 2026-02-02 16:13:42 +07:00
parent 61c3f010a9
commit d28cfcaa89
2 changed files with 29 additions and 54 deletions

View File

@ -151,26 +151,27 @@ const ultraSafeObserver = new MutationObserver((mutations) => {
// Start ultra-safe observing
function startUltraSafeObserver() {
console.log('Ultra-Safe Decimal Observer: Starting ultra-conservative observation');
// console.log('Ultra-Safe Decimal Observer: Starting ultra-conservative observation');
// Process existing content safely with delay
setTimeout(() => {
ultraSafelyProcessContainer(document.body);
}, 1000); // Initial delay to let everything load
// setTimeout(() => {
// ultraSafelyProcessContainer(document.body);
// }, 1000); // Initial delay to let everything load
// Start observing for new content with very reduced frequency
ultraSafeObserver.observe(document.body, {
childList: true,
subtree: true
});
// ultraSafeObserver.observe(document.body, {
// childList: true,
// subtree: true
// });
// Much less frequent periodic processing to reduce conflicts
setInterval(() => {
ultraSafelyProcessContainer(document.body);
}, 10000); // Every 10 seconds instead of 5
// setInterval(() => {
// ultraSafelyProcessContainer(document.body);
// }, 10000); // Every 10 seconds instead of 5
}
// Start ultra-safely
/*
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', () => {
setTimeout(startUltraSafeObserver, 2000); // Extra delay
@ -178,5 +179,6 @@ if (document.readyState === 'loading') {
} else {
setTimeout(startUltraSafeObserver, 2000); // Extra delay
}
*/
console.log('Ultra-safe decimal observer loaded');
console.log('Ultra-safe decimal observer disabled');

View File

@ -20,27 +20,13 @@ try {
currencyId: this.currencyId,
noSymbol: !this.props.readonly || this.props.hideSymbol,
});
// For readonly fields, apply decimal styling via safe DOM manipulation
// Start of Owl Safe Decimal Styling
if (this.props.readonly) {
// Use a longer timeout to avoid Owl lifecycle conflicts
setTimeout(() => {
try {
const element = this.el?.querySelector('.o_field_monetary');
if (element && !element.querySelector('.o_decimal') && document.contains(element)) {
const text = element.textContent;
const match = text?.match(/^(.*)(\d{1,3}(?:[.,]\d{3})*)[.,](\d+)(.*)$/);
if (match && element.textContent === text) { // Double-check content hasn't changed
const [, prefix, integerPart, decimalPart, suffix] = match;
element.innerHTML = `${prefix}${integerPart}<span class="o_decimal">.${decimalPart}</span>${suffix}`;
}
}
} catch (error) {
console.warn('Monetary field decimal styling error (non-critical):', error);
}
}, 150); // Longer delay to avoid Owl conflicts
return wrapDecimal(res);
}
// End of Owl Safe Decimal Styling
return res;
}
});
@ -67,26 +53,13 @@ try {
} else {
res = formatFloat(this.value, { ...options, humanReadable: false });
}
// For readonly fields, apply decimal styling via safe DOM manipulation
// Start of Owl Safe Decimal Styling
if (this.props.readonly) {
setTimeout(() => {
try {
const element = this.el?.querySelector('.o_field_float');
if (element && !element.querySelector('.o_decimal') && document.contains(element)) {
const text = element.textContent;
const match = text?.match(/^(.*)(\d+)[.](\d+)(.*)$/);
if (match && element.textContent === text) { // Double-check content hasn't changed
const [, prefix, integerPart, decimalPart, suffix] = match;
element.innerHTML = `${prefix}${integerPart}<span class="o_decimal">.${decimalPart}</span>${suffix}`;
}
}
} catch (error) {
console.warn('Float field decimal styling error (non-critical):', error);
}
}, 150);
return wrapDecimal(res);
}
// End of Owl Safe Decimal Styling
return res;
}
});
@ -94,6 +67,7 @@ try {
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");
@ -106,19 +80,18 @@ try {
try {
const original = formattersRegistry.get(name);
originalFormatters.set(name, original);
formattersRegistry.add(name, (...args) => {
try {
const res = original(...args);
// Return the result as-is, let DOM observer handle styling
// This avoids markup escaping issues and Owl conflicts
return res;
// 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 });
console.log('Web Decimal Style: Safely patched formatter', name);
} catch (error) {
console.warn(`Error patching formatter ${name} (non-critical):`, error);