إضافة نظام JavaScript لكشف وتطبيق فونت رمز العملة السعودية تلقائياً

This commit is contained in:
Mohamed Eltayar 2025-08-31 22:50:44 +03:00
parent 84f14bc4fe
commit 75ca11657b
1 changed files with 217 additions and 0 deletions

View File

@ -0,0 +1,217 @@
/**
* SAR Symbol Detection and Font Application
* يقوم هذا الكود بالبحث عن رمز العملة السعودية وتطبيق الفونت المناسب
*/
(function() {
'use strict';
// رمز العملة السعودية الجديد
const SAR_SYMBOLS = [
'﷼', // الرمز الكلاسيكي
'ر.س', // اختصار ريال سعودي
'SAR', // كود العملة
'\uFDFC', // Unicode للرمز الجديد
'\ue900' // الرمز المخصص في الفونت
];
/**
* فحص ما إذا كان العنصر يحتوي على رمز العملة السعودية
*/
function containsSarSymbol(text) {
if (!text) return false;
return SAR_SYMBOLS.some(symbol => text.includes(symbol));
}
/**
* تطبيق كلاس الفونت على العنصر
*/
function applySarFont(element) {
if (element && element.nodeType === 1) { // Element node
element.classList.add('js_has_sar_symbol');
// تطبيق كلاسات إضافية حسب نوع العنصر
if (element.classList.contains('o_field_monetary')) {
element.classList.add('sar_currency');
}
if (element.classList.contains('oe_currency_value')) {
element.classList.add('sar_currency');
}
if (element.closest('.o_account_reports_table')) {
element.classList.add('sar_currency');
}
}
}
/**
* فحص عنصر واحد وأطفاله
*/
function checkElement(element) {
if (!element || element.nodeType !== 1) return;
// فحص النص المباشر
if (element.textContent && containsSarSymbol(element.textContent)) {
applySarFont(element);
}
// فحص الخصائص
const attributes = ['title', 'data-currency', 'data-currency-code', 'data-symbol'];
attributes.forEach(attr => {
const value = element.getAttribute(attr);
if (value && containsSarSymbol(value)) {
applySarFont(element);
}
});
// فحص الأطفال (فقط العناصر النصية المباشرة لتجنب الإفراط)
if (element.children.length === 0 && element.textContent) {
const parent = element.parentElement;
if (parent && containsSarSymbol(element.textContent)) {
applySarFont(parent);
}
}
}
/**
* فحص جميع العناصر في الصفحة
*/
function scanAllElements() {
// فحص العناصر المحتملة أولاً (تحسين الأداء)
const potentialElements = [
'.o_field_monetary',
'.oe_currency_value',
'.o_field_widget[data-field-type="monetary"]',
'.o_data_cell',
'.oe_kanban_details',
'.o_account_reports_table td',
'.o_account_reports_table th',
'.pos-content *',
'.product_price',
'[data-currency]',
'[data-currency-code]'
];
potentialElements.forEach(selector => {
try {
const elements = document.querySelectorAll(selector);
elements.forEach(checkElement);
} catch (e) {
// تجاهل أخطاء السيلكتور
}
});
// فحص شامل كـ fallback
const allElements = document.querySelectorAll('*');
allElements.forEach(element => {
if (element.textContent && element.textContent.length < 200) { // تجنب النصوص الطويلة
checkElement(element);
}
});
}
/**
* مراقب تغييرات DOM
*/
function setupDOMObserver() {
const observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
if (mutation.type === 'childList') {
mutation.addedNodes.forEach(function(node) {
if (node.nodeType === 1) { // Element node
checkElement(node);
// فحص الأطفال الجدد
const children = node.querySelectorAll('*');
children.forEach(checkElement);
}
});
} else if (mutation.type === 'characterData') {
// تغيير في النص
const parent = mutation.target.parentElement;
if (parent) {
checkElement(parent);
}
}
});
});
observer.observe(document.body, {
childList: true,
subtree: true,
characterData: true
});
return observer;
}
/**
* معالج خاص للحقول النقدية في أودو
*/
function handleOdooMonetaryFields() {
// مراقبة تحديثات البيانات في أودو
if (window.odoo && window.odoo.define) {
window.odoo.define('sar_symbol.field_utils', function (require) {
'use strict';
const fieldUtils = require('web.field_utils');
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);
}
return result;
};
return fieldUtils;
});
}
}
/**
* تهيئة النظام
*/
function initialize() {
console.log('SAR Symbol Font System: Initializing...');
// فحص أولي
scanAllElements();
// إعداد المراقبة
setupDOMObserver();
// معالجة خاصة لأودو
handleOdooMonetaryFields();
// فحص دوري (للتأكد)
setInterval(scanAllElements, 5000);
console.log('SAR Symbol Font System: Ready');
}
// تشغيل النظام
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initialize);
} else {
initialize();
}
// تصدير للاستخدام الخارجي
window.SarSymbolSystem = {
scan: scanAllElements,
check: checkElement,
apply: applySarFont
};
})();