إصلاح خطأ Service already defined - إضافة حماية من التكرار والأخطاء

This commit is contained in:
Mohamed Eltayar 2025-08-31 23:00:49 +03:00
parent e8cf6ef840
commit 678fb4ea64
1 changed files with 82 additions and 48 deletions

View File

@ -6,6 +6,12 @@
(function() {
'use strict';
// تجنب التشغيل المتكرر
if (window.SarSymbolSystem && window.SarSymbolSystem.initialized) {
console.log('SAR Symbol System already initialized');
return;
}
// رمز العملة السعودية الجديد
const SAR_SYMBOLS = [
'﷼', // الرمز الكلاسيكي
@ -100,10 +106,10 @@
}
});
// فحص شامل كـ fallback
// فحص شامل كـ fallback - فقط العناصر الصغيرة
const allElements = document.querySelectorAll('*');
allElements.forEach(element => {
if (element.textContent && element.textContent.length < 200) { // تجنب النصوص الطويلة
if (element.textContent && element.textContent.length < 100) { // تقليل الحد لتحسين الأداء
checkElement(element);
}
});
@ -144,38 +150,57 @@
}
/**
* معالج خاص للحقول النقدية في أودو
* معالج خاص للحقول النقدية في أودو - مع حماية من التكرار
*/
function handleOdooMonetaryFields() {
// مراقبة تحديثات البيانات في أودو
// التأكد من أن أودو موجود وأن الخدمة لم يتم تعريفها من قبل
if (window.odoo && window.odoo.define) {
window.odoo.define('sar_symbol.field_utils', function (require) {
'use strict';
// فحص إذا كانت الخدمة معرفة مسبقاً
const serviceName = 'sar_symbol.field_utils_' + Date.now(); // اسم فريد
const fieldUtils = require('web.field_utils');
const originalFormatMonetary = fieldUtils.format.monetary;
try {
window.odoo.define(serviceName, function (require) {
'use strict';
fieldUtils.format.monetary = function(value, field, options) {
const result = originalFormatMonetary.apply(this, arguments);
try {
const fieldUtils = require('web.field_utils');
// إذا كان النتيجة تحتوي على رمز العملة السعودية
if (result && containsSarSymbol(result)) {
// سنحتاج لمعالجة هذا في DOM لاحقاً
setTimeout(() => {
const elements = document.querySelectorAll('[data-field-type="monetary"]');
elements.forEach(element => {
if (element.textContent && containsSarSymbol(element.textContent)) {
applySarFont(element);
// التأكد من أن الدالة لم يتم تعديلها من قبل
if (fieldUtils.format.monetary && !fieldUtils.format.monetary._sarModified) {
const originalFormatMonetary = fieldUtils.format.monetary;
fieldUtils.format.monetary = function(value, field, options) {
const result = originalFormatMonetary.apply(this, arguments);
// إذا كان النتيجة تحتوي على رمز العملة السعودية
if (result && containsSarSymbol(result)) {
// سنحتاج لمعالجة هذا في DOM لاحقاً
setTimeout(() => {
const elements = document.querySelectorAll('[data-field-type="monetary"]');
elements.forEach(element => {
if (element.textContent && containsSarSymbol(element.textContent)) {
applySarFont(element);
}
});
}, 100);
}
});
}, 100);
return result;
};
// وضع علامة على أن الدالة تم تعديلها
fieldUtils.format.monetary._sarModified = true;
}
return fieldUtils;
} catch (innerError) {
console.warn('SAR Symbol: Could not modify field_utils:', innerError);
return {};
}
return result;
};
return fieldUtils;
});
});
} catch (error) {
console.warn('SAR Symbol: Could not define Odoo service:', error);
}
}
}
@ -185,33 +210,42 @@
function initialize() {
console.log('SAR Symbol Font System: Initializing...');
// فحص أولي
scanAllElements();
try {
// فحص أولي
scanAllElements();
// إعداد المراقبة
setupDOMObserver();
// إعداد المراقبة
setupDOMObserver();
// معالجة خاصة لأودو
handleOdooMonetaryFields();
// معالجة خاصة لأودو (بحماية من الأخطاء)
handleOdooMonetaryFields();
// فحص دوري (للتأكد)
setInterval(scanAllElements, 5000);
// فحص دوري (للتأكد) - مع فترة أطول لتوفير الموارد
setInterval(scanAllElements, 10000); // 10 ثوان بدلاً من 5
console.log('SAR Symbol Font System: Ready');
console.log('SAR Symbol Font System: Ready');
} catch (error) {
console.error('SAR Symbol Font System: Initialization failed:', error);
}
}
// تشغيل النظام
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initialize);
} else {
initialize();
// تشغيل النظام مع حماية من الأخطاء
try {
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initialize);
} else {
initialize();
}
} catch (error) {
console.error('SAR Symbol Font System: Failed to start:', error);
}
// تصدير للاستخدام الخارجي
// تصدير للاستخدام الخارجي مع حماية
window.SarSymbolSystem = {
scan: scanAllElements,
check: checkElement,
apply: applySarFont
apply: applySarFont,
initialized: true
};
})();