import React, { useState, useEffect, createContext, useContext } from 'react';
import { initializeApp } from 'firebase/app';
import { getAuth, signInAnonymously, signInWithCustomToken, onAuthStateChanged } from 'firebase/auth';
import { getFirestore, collection, addDoc, getDocs, onSnapshot, doc, updateDoc, deleteDoc, query, where } from 'firebase/firestore';
// Context for Firebase and User data
const AppContext = createContext();
// Custom Modal Component (replaces alert/confirm)
const CustomModal = ({ isOpen, title, message, onClose, onConfirm, showConfirmButton = false }) => {
if (!isOpen) return null;
return (
{title}
{message}
{showConfirmButton && (
)}
);
};
// Main App Component
function App() {
const [db, setDb] = useState(null);
const [auth, setAuth] = useState(null);
const [userId, setUserId] = useState(null);
const [isAuthReady, setIsAuthReady] = useState(false);
const [currentView, setCurrentView] = useState('dashboard'); // 'dashboard', 'cars', 'dailyCheck', 'emergency', 'monthly', 'annualReport'
const [cars, setCars] = useState([]);
const [maintenanceRecords, setMaintenanceRecords] = useState([]);
const [selectedCar, setSelectedCar] = useState(null);
// Modal state
const [modal, setModal] = useState({
isOpen: false,
title: '',
message: '',
onClose: () => setModal({ ...modal, isOpen: false }),
onConfirm: null,
showConfirmButton: false,
});
// Initialize Firebase
useEffect(() => {
try {
const appId = typeof __app_id !== 'undefined' ? __app_id : 'default-app-id';
const firebaseConfig = JSON.parse(typeof __firebase_config !== 'undefined' ? __firebase_config : '{}');
if (Object.keys(firebaseConfig).length === 0) {
console.error("Firebase config is missing. Please provide it via __firebase_config.");
setModal({
isOpen: true,
title: 'خطأ في التهيئة',
message: 'لم يتم توفير إعدادات Firebase بشكل صحيح. يرجى التحقق من التكوين.',
});
return;
}
const app = initializeApp(firebaseConfig);
const firestore = getFirestore(app);
const authInstance = getAuth(app);
setDb(firestore);
setAuth(authInstance);
const unsubscribe = onAuthStateChanged(authInstance, async (user) => {
if (user) {
setUserId(user.uid);
} else {
// Sign in anonymously if no user is authenticated and no custom token is available
if (typeof __initial_auth_token === 'undefined' || !__initial_auth_token) {
await signInAnonymously(authInstance);
}
}
setIsAuthReady(true);
});
// Attempt to sign in with custom token if available
const initialAuthToken = typeof __initial_auth_token !== 'undefined' ? __initial_auth_token : null;
if (authInstance && initialAuthToken) {
signInWithCustomToken(authInstance, initialAuthToken)
.then(() => console.log("Signed in with custom token"))
.catch((error) => {
console.error("Error signing in with custom token:", error);
// Fallback to anonymous if custom token fails
signInAnonymously(authInstance)
.then(() => console.log("Signed in anonymously after custom token failure"))
.catch(anonError => console.error("Error signing in anonymously:", anonError));
});
} else if (authInstance) {
// If no custom token, sign in anonymously
signInAnonymously(authInstance)
.then(() => console.log("Signed in anonymously"))
.catch(anonError => console.error("Error signing in anonymously:", anonError));
}
return () => unsubscribe();
} catch (error) {
console.error("Failed to initialize Firebase:", error);
setModal({
isOpen: true,
title: 'خطأ فادح',
message: `فشل تهيئة Firebase: ${error.message}. يرجى التحقق من إعداداتك.`,
});
}
}, []);
// Fetch Cars and Maintenance Records
useEffect(() => {
if (!db || !isAuthReady || !userId) return;
const appId = typeof __app_id !== 'undefined' ? __app_id : 'default-app-id';
// Listen for cars collection (public data)
const carsRef = collection(db, `artifacts/${appId}/public/data/cars`);
const unsubscribeCars = onSnapshot(carsRef, (snapshot) => {
const carsData = snapshot.docs.map(doc => ({ id: doc.id, ...doc.data() }));
setCars(carsData);
}, (error) => {
console.error("Error fetching cars:", error);
setModal({
isOpen: true,
title: 'خطأ في جلب البيانات',
message: `فشل جلب بيانات السيارات: ${error.message}`,
});
});
// Listen for maintenance records (private data)
const maintenanceRef = collection(db, `artifacts/${appId}/users/${userId}/maintenanceRecords`);
const unsubscribeMaintenance = onSnapshot(maintenanceRef, (snapshot) => {
const recordsData = snapshot.docs.map(doc => ({ id: doc.id, ...doc.data() }));
setMaintenanceRecords(recordsData);
}, (error) => {
console.error("Error fetching maintenance records:", error);
setModal({
isOpen: true,
title: 'خطأ في جلب البيانات',
message: `فشل جلب سجلات الصيانة: ${error.message}`,
});
});
return () => {
unsubscribeCars();
unsubscribeMaintenance();
};
}, [db, isAuthReady, userId]);
const showMessage = (title, message, showConfirm = false, onConfirm = null) => {
setModal({
isOpen: true,
title,
message,
onClose: () => setModal({ ...modal, isOpen: false }),
onConfirm,
showConfirmButton: showConfirm,
});
};
if (!isAuthReady) {
return (
);
}
return (
{currentView === 'dashboard' && }
{currentView === 'cars' && }
{currentView === 'dailyCheck' && }
{currentView === 'emergency' && }
{currentView === 'monthly' && }
{currentView === 'annualReport' && }
);
}
// Navigation Item Component
const NavItem = ({ children, onClick, isActive }) => (
);
// Dashboard Component
const Dashboard = () => {
const { cars, maintenanceRecords } = useContext(AppContext);
// Calculate upcoming maintenance (example: next 30 days for monthly/quarterly/annual)
const upcomingMaintenance = maintenanceRecords.filter(record => {
const nextDate = record.nextMaintenanceDate ? new Date(record.nextMaintenanceDate) : null;
if (!nextDate) return false;
const today = new Date();
const thirtyDaysLater = new Date();
thirtyDaysLater.setDate(today.getDate() + 30);
return nextDate >= today && nextDate <= thirtyDaysLater;
}).sort((a, b) => new Date(a.nextMaintenanceDate) - new Date(b.nextMaintenanceDate));
// Calculate open emergency requests
const openEmergencyRequests = maintenanceRecords.filter(record =>
record.type === 'emergency' && record.status !== 'تم الإصلاح'
);
return (
الصيانة القادمة
{upcomingMaintenance.length > 0 ? (
{upcomingMaintenance.map(record => (
-
السيارة: {record.carNumber}
النوع: {record.type}
الموعد: {new Date(record.nextMaintenanceDate).toLocaleDateString('ar-SA')}
قريبًا
))}
) : (
لا توجد صيانة قادمة خلال 30 يومًا.
)}
طلبات الإصلاح المفتوحة
{openEmergencyRequests.length > 0 ? (
) : (
لا توجد طلبات إصلاح مفتوحة حاليًا.
)}
);
};
// Dashboard Card Component
const DashboardCard = ({ title, value, icon }) => (
);
// Car Management Component
const CarManagement = () => {
const { cars, showMessage, db, setCars } = useContext(AppContext);
const appId = typeof __app_id !== 'undefined' ? __app_id : 'default-app-id';
const [isAddingCar, setIsAddingCar] = useState(false);
const [newCarData, setNewCarData] = useState({
carNumber: '', model: '', year: '', fuelType: '', plateNumber: '', owner: '', currentMileage: 0
});
const [editingCar, setEditingCar] = useState(null); // State to hold car being edited
const handleInputChange = (e) => {
const { name, value } = e.target;
setNewCarData(prev => ({ ...prev, [name]: value }));
};
const handleAddCar = async (e) => {
e.preventDefault();
if (!db) {
showMessage('خطأ', 'قاعدة البيانات غير مهيأة.');
return;
}
if (!newCarData.carNumber || !newCarData.model || !newCarData.plateNumber) {
showMessage('خطأ', 'الرجاء ملء الحقول المطلوبة (رقم السيارة، الموديل، رقم اللوحة).');
return;
}
try {
const carsCollectionRef = collection(db, `artifacts/${appId}/public/data/cars`);
await addDoc(carsCollectionRef, newCarData);
showMessage('نجاح', 'تمت إضافة السيارة بنجاح!');
setNewCarData({ carNumber: '', model: '', year: '', fuelType: '', plateNumber: '', owner: '', currentMileage: 0 });
setIsAddingCar(false);
} catch (error) {
console.error("Error adding car:", error);
showMessage('خطأ', `فشل إضافة السيارة: ${error.message}`);
}
};
const handleEditCar = (car) => {
setEditingCar(car);
setNewCarData(car); // Populate form with existing car data
setIsAddingCar(true); // Show the form for editing
};
const handleUpdateCar = async (e) => {
e.preventDefault();
if (!db || !editingCar) {
showMessage('خطأ', 'قاعدة البيانات غير مهيأة أو لا توجد سيارة للتحديث.');
return;
}
try {
const carDocRef = doc(db, `artifacts/${appId}/public/data/cars`, editingCar.id);
await updateDoc(carDocRef, newCarData);
showMessage('نجاح', 'تم تحديث بيانات السيارة بنجاح!');
setEditingCar(null);
setNewCarData({ carNumber: '', model: '', year: '', fuelType: '', plateNumber: '', owner: '', currentMileage: 0 });
setIsAddingCar(false);
} catch (error) {
console.error("Error updating car:", error);
showMessage('خطأ', `فشل تحديث السيارة: ${error.message}`);
}
};
const handleDeleteCar = (carId) => {
showMessage(
'تأكيد الحذف',
'هل أنت متأكد أنك تريد حذف هذه السيارة؟ سيتم حذف جميع سجلات الصيانة المتعلقة بها أيضًا.',
true,
async () => {
try {
// Delete car document
const carDocRef = doc(db, `artifacts/${appId}/public/data/cars`, carId);
await deleteDoc(carDocRef);
// Optional: Delete related maintenance records (more complex query needed for private data)
// For simplicity, this example only deletes the car.
// In a real app, you'd query and delete all maintenance records linked to this carId.
showMessage('نجاح', 'تم حذف السيارة بنجاح!');
setCars(prev => prev.filter(car => car.id !== carId)); // Update local state
} catch (error) {
console.error("Error deleting car:", error);
showMessage('خطأ', `فشل حذف السيارة: ${error.message}`);
}
}
);
};
return (
إدارة السيارات
{isAddingCar && (
)}
قائمة السيارات المسجلة
{cars.length === 0 ? (
لا توجد سيارات مسجلة بعد. ابدأ بإضافة سيارة جديدة!
) : (
رقم السيارة |
الموديل |
رقم اللوحة |
عداد المسافات |
الإجراءات |
{cars.map(car => (
{car.carNumber} |
{car.model} |
{car.plateNumber} |
{car.currentMileage || 'غير محدد'} كم |
|
))}
)}
);
};
// Form Input Field Component
const InputField = ({ label, name, value, onChange, type = 'text', required = false }) => (
);
// Form Select Field Component
const SelectField = ({ label, name, value, onChange, options, required = false }) => (
);
// Daily Check Form Component
const DailyCheckForm = () => {
const { db, userId, cars, showMessage } = useContext(AppContext);
const appId = typeof __app_id !== 'undefined' ? __app_id : 'default-app-id';
const [formData, setFormData] = useState({
carId: '',
carNumber: '', // To store car number for easier display/query
date: new Date().toISOString().split('T')[0],
oilCheck: false,
tirePressure: '',
lightsCheck: false,
brakesCheck: false,
coolingFluidsCheck: false,
cleanlinessCheck: false,
notes: '',
driverSignature: '',
});
const handleCarSelect = (e) => {
const selectedCarId = e.target.value;
const car = cars.find(c => c.id === selectedCarId);
setFormData(prev => ({
...prev,
carId: selectedCarId,
carNumber: car ? car.carNumber : '',
}));
};
const handleInputChange = (e) => {
const { name, value, type, checked } = e.target;
setFormData(prev => ({
...prev,
[name]: type === 'checkbox' ? checked : value,
}));
};
const handleSubmit = async (e) => {
e.preventDefault();
if (!db || !userId) {
showMessage('خطأ', 'قاعدة البيانات أو معرف المستخدم غير متاح.');
return;
}
if (!formData.carId || !formData.date || !formData.driverSignature) {
showMessage('خطأ', 'الرجاء ملء الحقول المطلوبة (رقم السيارة، التاريخ، توقيع السائق).');
return;
}
try {
const maintenanceCollectionRef = collection(db, `artifacts/${appId}/users/${userId}/maintenanceRecords`);
await addDoc(maintenanceCollectionRef, {
...formData,
type: 'صيانة يومية',
timestamp: new Date(),
});
showMessage('نجاح', 'تم تسجيل الفحص اليومي بنجاح!');
setFormData({
carId: '',
carNumber: '',
date: new Date().toISOString().split('T')[0],
oilCheck: false,
tirePressure: '',
lightsCheck: false,
brakesCheck: false,
coolingFluidsCheck: false,
cleanlinessCheck: false,
notes: '',
driverSignature: '',
});
} catch (error) {
console.error("Error adding daily check:", error);
showMessage('خطأ', `فشل تسجيل الفحص اليومي: ${error.message}`);
}
};
return (
نموذج الفحص اليومي للسيارة
);
};
// Checkbox Field Component
const CheckboxField = ({ label, name, checked, onChange }) => (
);
// Emergency Request Form Component
const EmergencyRequestForm = () => {
const { db, userId, cars, showMessage } = useContext(AppContext);
const appId = typeof __app_id !== 'undefined' ? __app_id : 'default-app-id';
const [formData, setFormData] = useState({
carId: '',
carNumber: '',
date: new Date().toISOString().split('T')[0],
description: '',
priority: 'متوسط', // 'عاجل', 'متوسط', 'منخفض'
status: 'قيد الانتظار', // 'قيد الانتظار', 'قيد الإصلاح', 'تم الإصلاح', 'بانتظار قطع الغيار'
estimatedCost: 0,
actualCost: 0,
signature: '',
});
const [editingRequest, setEditingRequest] = useState(null);
const handleCarSelect = (e) => {
const selectedCarId = e.target.value;
const car = cars.find(c => c.id === selectedCarId);
setFormData(prev => ({
...prev,
carId: selectedCarId,
carNumber: car ? car.carNumber : '',
}));
};
const handleInputChange = (e) => {
const { name, value } = e.target;
setFormData(prev => ({ ...prev, [name]: value }));
};
const handleSubmit = async (e) => {
e.preventDefault();
if (!db || !userId) {
showMessage('خطأ', 'قاعدة البيانات أو معرف المستخدم غير متاح.');
return;
}
if (!formData.carId || !formData.description || !formData.signature) {
showMessage('خطأ', 'الرجاء ملء الحقول المطلوبة (رقم السيارة، وصف العطل، التوقيع).');
return;
}
try {
const maintenanceCollectionRef = collection(db, `artifacts/${appId}/users/${userId}/maintenanceRecords`);
if (editingRequest) {
const docRef = doc(maintenanceCollectionRef, editingRequest.id);
await updateDoc(docRef, { ...formData, timestamp: new Date() });
showMessage('نجاح', 'تم تحديث طلب الإصلاح بنجاح!');
setEditingRequest(null);
} else {
await addDoc(maintenanceCollectionRef, {
...formData,
type: 'صيانة طارئة',
timestamp: new Date(),
});
showMessage('نجاح', 'تم تسجيل طلب الإصلاح الطارئ بنجاح!');
}
setFormData({
carId: '', carNumber: '', date: new Date().toISOString().split('T')[0],
description: '', priority: 'متوسط', status: 'قيد الانتظار',
estimatedCost: 0, actualCost: 0, signature: ''
});
} catch (error) {
console.error("Error submitting emergency request:", error);
showMessage('خطأ', `فشل تسجيل طلب الإصلاح الطارئ: ${error.message}`);
}
};
const handleEditRequest = (request) => {
setEditingRequest(request);
setFormData(request);
};
const handleDeleteRequest = (requestId) => {
showMessage(
'تأكيد الحذف',
'هل أنت متأكد أنك تريد حذف طلب الإصلاح هذا؟',
true,
async () => {
try {
const maintenanceCollectionRef = collection(db, `artifacts/${appId}/users/${userId}/maintenanceRecords`);
const docRef = doc(maintenanceCollectionRef, requestId);
await deleteDoc(docRef);
showMessage('نجاح', 'تم حذف طلب الإصلاح بنجاح!');
} catch (error) {
console.error("Error deleting emergency request:", error);
showMessage('خطأ', `فشل حذف طلب الإصلاح: ${error.message}`);
}
}
);
};
const emergencyRequests = useContext(AppContext).maintenanceRecords.filter(rec => rec.type === 'صيانة طارئة');
return (
نموذج طلب إصلاح طارئ
طلبات الإصلاح الطارئة المسجلة
{emergencyRequests.length === 0 ? (
لا توجد طلبات إصلاح طارئة مسجلة.
) : (
رقم السيارة |
التاريخ |
وصف العطل |
الأولوية |
الحالة |
التكلفة المتوقعة |
التكلفة الفعلية |
الإجراءات |
{emergencyRequests.map(req => (
{req.carNumber} |
{new Date(req.date).toLocaleDateString('ar-SA')} |
{req.description} |
{req.priority} |
{req.status} |
{req.estimatedCost} ريال |
{req.actualCost} ريال |
|
))}
)}
);
};
// Monthly Maintenance Form Component
const MonthlyMaintenanceForm = () => {
const { db, userId, cars, showMessage } = useContext(AppContext);
const appId = typeof __app_id !== 'undefined' ? __app_id : 'default-app-id';
const [formData, setFormData] = useState({
carId: '',
carNumber: '',
lastMaintenanceDate: new Date().toISOString().split('T')[0],
maintenanceType: '', // 'شهرية', 'ربع سنوية', 'سنوية'
mileage: 0,
tasksCompleted: '', // Comma separated string or array
nextMaintenanceDate: '',
notes: '',
});
const [editingRecord, setEditingRecord] = useState(null);
const handleCarSelect = (e) => {
const selectedCarId = e.target.value;
const car = cars.find(c => c.id === selectedCarId);
setFormData(prev => ({
...prev,
carId: selectedCarId,
carNumber: car ? car.carNumber : '',
}));
};
const handleInputChange = (e) => {
const { name, value } = e.target;
setFormData(prev => ({ ...prev, [name]: value }));
};
const calculateNextMaintenanceDate = (type, lastDate, mileage) => {
const d = new Date(lastDate);
switch (type) {
case 'شهرية':
d.setMonth(d.getMonth() + 1);
return d.toISOString().split('T')[0];
case 'ربع سنوية':
d.setMonth(d.getMonth() + 3);
return d.toISOString().split('T')[0];
case 'سنوية':
d.setFullYear(d.getFullYear() + 1);
return d.toISOString().split('T')[0];
default:
return '';
}
};
useEffect(() => {
if (formData.lastMaintenanceDate && formData.maintenanceType) {
const nextDate = calculateNextMaintenanceDate(formData.maintenanceType, formData.lastMaintenanceDate, formData.mileage);
setFormData(prev => ({ ...prev, nextMaintenanceDate: nextDate }));
}
}, [formData.lastMaintenanceDate, formData.maintenanceType, formData.mileage]);
const handleSubmit = async (e) => {
e.preventDefault();
if (!db || !userId) {
showMessage('خطأ', 'قاعدة البيانات أو معرف المستخدم غير متاح.');
return;
}
if (!formData.carId || !formData.lastMaintenanceDate || !formData.maintenanceType || !formData.mileage) {
showMessage('خطأ', 'الرجاء ملء الحقول المطلوبة (رقم السيارة، تاريخ آخر صيانة، نوع الصيانة، المسافة المقطوعة).');
return;
}
try {
const maintenanceCollectionRef = collection(db, `artifacts/${appId}/users/${userId}/maintenanceRecords`);
if (editingRecord) {
const docRef = doc(maintenanceCollectionRef, editingRecord.id);
await updateDoc(docRef, { ...formData, timestamp: new Date() });
showMessage('نجاح', 'تم تحديث سجل الصيانة الدورية بنجاح!');
setEditingRecord(null);
} else {
await addDoc(maintenanceCollectionRef, {
...formData,
type: formData.maintenanceType, // Use the selected type
timestamp: new Date(),
});
showMessage('نجاح', 'تم تسجيل الصيانة الدورية بنجاح!');
}
setFormData({
carId: '', carNumber: '', lastMaintenanceDate: new Date().toISOString().split('T')[0],
maintenanceType: '', mileage: 0, tasksCompleted: '', nextMaintenanceDate: '', notes: ''
});
} catch (error) {
console.error("Error submitting monthly maintenance:", error);
showMessage('خطأ', `فشل تسجيل الصيانة الدورية: ${error.message}`);
}
};
const handleEditRecord = (record) => {
setEditingRecord(record);
setFormData(record);
};
const handleDeleteRecord = (recordId) => {
showMessage(
'تأكيد الحذف',
'هل أنت متأكد أنك تريد حذف سجل الصيانة هذا؟',
true,
async () => {
try {
const maintenanceCollectionRef = collection(db, `artifacts/${appId}/users/${userId}/maintenanceRecords`);
const docRef = doc(maintenanceCollectionRef, recordId);
await deleteDoc(docRef);
showMessage('نجاح', 'تم حذف سجل الصيانة بنجاح!');
} catch (error) {
console.error("Error deleting maintenance record:", error);
showMessage('خطأ', `فشل حذف سجل الصيانة: ${error.message}`);
}
}
);
};
const periodicMaintenanceRecords = useContext(AppContext).maintenanceRecords.filter(rec =>
['شهرية', 'ربع سنوية', 'سنوية'].includes(rec.type)
);
return (
جدول الصيانة الدورية
سجلات الصيانة الدورية
{periodicMaintenanceRecords.length === 0 ? (
لا توجد سجلات صيانة دورية مسجلة.
) : (
رقم السيارة |
نوع الصيانة |
تاريخ آخر صيانة |
المسافة (كم) |
المهام المنجزة |
الموعد القادم |
الإجراءات |
{periodicMaintenanceRecords.map(rec => (
{rec.carNumber} |
{rec.maintenanceType} |
{new Date(rec.lastMaintenanceDate).toLocaleDateString('ar-SA')} |
{rec.mileage} |
{rec.tasksCompleted} |
{new Date(rec.nextMaintenanceDate).toLocaleDateString('ar-SA')} |
|
))}
)}
);
};
// Annual Report Component
const AnnualReport = () => {
const { cars, maintenanceRecords, showMessage } = useContext(AppContext);
const [selectedCarId, setSelectedCarId] = useState('');
const [selectedYear, setSelectedYear] = useState(new Date().getFullYear());
const [reportData, setReportData] = useState(null);
const generateReport = () => {
if (!selectedCarId || !selectedYear) {
showMessage('خطأ', 'الرجاء اختيار السيارة والسنة لإنشاء التقرير.');
return;
}
const car = cars.find(c => c.id === selectedCarId);
if (!car) {
showMessage('خطأ', 'السيارة المختارة غير موجودة.');
return;
}
const yearRecords = maintenanceRecords.filter(record => {
const recordDate = new Date(record.date || record.lastMaintenanceDate || record.timestamp.toDate());
return record.carId === selectedCarId && recordDate.getFullYear() === selectedYear;
});
let totalAnnualMileage = 0;
let totalCost = 0;
const maintenanceCount = {
'صيانة يومية': 0,
'صيانة أسبوعية': 0,
'شهرية': 0,
'ربع سنوية': 0,
'سنوية': 0,
'صيانة طارئة': 0,
};
const recurringFaults = {}; // { description: count }
yearRecords.forEach(record => {
if (record.mileage) {
totalAnnualMileage += parseInt(record.mileage, 10);
}
if (record.actualCost) {
totalCost += parseFloat(record.actualCost);
} else if (record.estimatedCost && record.status === 'تم الإصلاح') {
totalCost += parseFloat(record.estimatedCost);
}
if (maintenanceCount[record.type]) {
maintenanceCount[record.type]++;
} else {
maintenanceCount[record.type] = 1;
}
if (record.type === 'صيانة طارئة' && record.description) {
recurringFaults[record.description] = (recurringFaults[record.description] || 0) + 1;
}
});
const sortedRecurringFaults = Object.entries(recurringFaults)
.filter(([, count]) => count > 1) // Only show faults that occurred more than once
.sort((a, b) => b[1] - a[1])
.map(([desc, count]) => `${desc} (${count} مرات)`);
setReportData({
carNumber: car.carNumber,
annualMileage: totalAnnualMileage,
totalMaintenanceCount: yearRecords.length,
maintenanceBreakdown: maintenanceCount,
totalCosts: totalCost,
recurringFaults: sortedRecurringFaults.length > 0 ? sortedRecurringFaults.join(', ') : 'لا توجد أعطال متكررة',
carConditionRating: 'جيدة (⭐️⭐️⭐️⭐️)' // This would ideally be a manual input or calculated based on severity of faults
});
};
const handlePrint = () => {
const printContent = document.getElementById('annual-report-content').innerHTML;
const originalContent = document.body.innerHTML;
document.body.innerHTML = printContent;
window.print();
document.body.innerHTML = originalContent;
window.location.reload(); // Reload to restore original page
};
const handleShare = () => {
// In a real application, this would generate a unique, read-only link to the report.
// For this example, we'll just provide the current URL as a placeholder.
const reportUrl = window.location.href; // This is the app URL, not a specific report URL
navigator.clipboard.writeText(reportUrl)
.then(() => showMessage('نجاح', 'تم نسخ رابط التطبيق إلى الحافظة. يمكنك مشاركته مع الآخرين لعرض التقارير (إذا كان لديهم صلاحية الوصول).'))
.catch(() => showMessage('خطأ', 'فشل نسخ الرابط إلى الحافظة. يرجى النسخ يدويًا.'));
};
return (
تقرير صيانة سنوي
setSelectedCarId(e.target.value)}
options={cars.map(car => ({ value: car.id, label: car.carNumber }))}
required
/>
setSelectedYear(parseInt(e.target.value))}
options={Array.from({ length: 5 }, (_, i) => new Date().getFullYear() - i)} // Last 5 years
required
/>
{reportData && (
تقرير الصيانة السنوي لـ {reportData.carNumber} - سنة {selectedYear}
رقم السيارة: {reportData.carNumber}
المسافة السنوية: {reportData.annualMileage} كم
عدد مرات الصيانة: {reportData.totalMaintenanceCount}
التكاليف الإجمالية: {reportData.totalCosts} ريال
الأعطال المتكررة: {reportData.recurringFaults}
تقييم حالة السيارة: {reportData.carConditionRating}
تفصيل أنواع الصيانة:
{Object.entries(reportData.maintenanceBreakdown).map(([type, count]) => (
- {type}: {count} مرات
))}
)}
);
};
export default App;
�