إضافة نظام JavaScript لكشف وتطبيق فونت رمز العملة السعودية تلقائياً
This commit is contained in:
parent
84f14bc4fe
commit
75ca11657b
|
|
@ -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
|
||||
};
|
||||
|
||||
})();
|
||||
Loading…
Reference in New Issue