File size: 5,793 Bytes
b6f7f27 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | // static/script.js
document.addEventListener("DOMContentLoaded", function() {
// 1. التحقق من المدخلات لمنع القيم السالبة أو الصفرية في الكميات والأسعار
const forms = document.querySelectorAll('form');
forms.forEach(form => {
form.addEventListener('submit', function(event) {
const numberInputs = form.querySelectorAll('input[type="number"]');
let isValid = true;
numberInputs.forEach(input => {
if (parseFloat(input.value) <= 0 && input.name.includes('quantity')) {
alert("يرجى إدخال كميات موجبة أكبر من الصفر للحفاظ على دقة النمذجة الرياضية.");
isValid = false;
}
});
if (!isValid) {
event.preventDefault(); // إيقاف الإرسال
}
});
});
// 2. معالجة ورسم المبيان التفاعلي المحسن
const vaElement = document.getElementById('va_value_hidden');
const chartCanvas = document.getElementById('vaChart');
if (vaElement && chartCanvas) {
const vaValue = parseFloat(vaElement.value);
const ctx = chartCanvas.getContext('2d');
// إنشاء تدرج لوني (Gradient) احترافي للرسم البياني
const gradient = ctx.createLinearGradient(0, 0, 0, 300);
if (vaValue >= 0) {
// تدرج لوني للنمو الاقتصادي (أخضر)
gradient.addColorStop(0, 'rgba(39, 174, 96, 0.9)');
gradient.addColorStop(1, 'rgba(46, 204, 113, 0.3)');
} else {
// تدرج لوني للانكماش الاقتصادي (أحمر)
gradient.addColorStop(0, 'rgba(192, 57, 43, 0.9)');
gradient.addColorStop(1, 'rgba(231, 76, 60, 0.3)');
}
const borderColor = vaValue >= 0 ? '#27ae60' : '#c0392b';
const chartLabel = vaValue >= 0 ? 'قيمة مضافة موجبة (مساهمة في النمو الاقتصادي)' : 'قيمة مقتطعة سالبة (عائق للنمو الاقتصادي)';
new Chart(ctx, {
type: 'bar',
data: {
labels: ['مؤشر الأثر الاقتصادي الكلي (VA)'],
datasets: [{
label: chartLabel,
data: [vaValue],
backgroundColor: gradient,
borderColor: borderColor,
borderWidth: 2,
borderRadius: 8, // حواف دائرية احترافية
barPercentage: 0.4 // ضبط عرض العمود ليكون أكثر أناقة
}]
},
options: {
responsive: true,
maintainAspectRatio: false,
animation: {
duration: 1500, // حركة سلسة عند التحميل
easing: 'easeOutQuart'
},
scales: {
y: {
beginAtZero: true,
grid: {
color: 'rgba(0, 0, 0, 0.05)',
borderDash: [5, 5] // خطوط شبكة خلفية منقطة
},
title: {
display: true,
text: 'القيمة النقدية (VA)',
font: {
family: "'Segoe UI', Tahoma, Geneva, Verdana, sans-serif",
size: 14,
weight: 'bold'
}
}
},
x: {
grid: {
display: false // إخفاء خطوط الشبكة العمودية لنظافة التصميم
},
ticks: {
font: {
family: "'Segoe UI', Tahoma, Geneva, Verdana, sans-serif",
size: 15,
weight: 'bold'
}
}
}
},
plugins: {
legend: {
display: true,
position: 'top',
labels: {
font: {
family: "'Segoe UI', Tahoma, Geneva, Verdana, sans-serif",
size: 13
}
}
},
tooltip: {
backgroundColor: 'rgba(44, 62, 80, 0.95)',
titleFont: { size: 14, family: "'Segoe UI'" },
bodyFont: { size: 15, family: "'Segoe UI'", weight: 'bold' },
padding: 15,
displayColors: false,
cornerRadius: 8,
callbacks: {
label: function(context) {
let value = context.parsed.y;
let prefix = value >= 0 ? ' المحصلة: +' : ' المحصلة: ';
return prefix + value + ' وحدة نقدية';
}
}
}
}
}
});
}
}); |