import { useState, useEffect, useRef } from 'react'; export default function App() { // State for active tab and sidebar const [activeTab, setActiveTab] = useState('dashboard'); const [isSidebarCollapsed, setIsSidebarCollapsed] = useState(false); const [equipmentList, setEquipmentList] = useState([ { id: 1, name: "Токарный станок CNC-2000", type: "Станок", serial: "CNC2000-001", inventory: "INV-1001", status: "active", lastMaintenance: "2023-05-15", nextMaintenance: "2023-06-15", maintenanceInterval: 30, description: "Токарный станок с ЧПУ, производитель XYZ Corp." }, { id: 2, name: "Конвейерная линия A-12", type: "Конвейер", serial: "CONV-A12-045", inventory: "INV-1042", status: "active", lastMaintenance: "2023-05-20", nextMaintenance: "2023-06-20", maintenanceInterval: 30, description: "Конвейерная линия для сборки продукции" }, { id: 3, name: "Воздушный компрессор V-50", type: "Компрессор", serial: "COMP-V50-112", inventory: "INV-1078", status: "maintenance", lastMaintenance: "2023-04-10", nextMaintenance: "2023-06-10", maintenanceInterval: 60, description: "Промышленный воздушный компрессор" } ]); const [users, setUsers] = useState([ { id: 1, name: "Иван Петров", role: "admin", email: "ivan@example.com" }, { id: 2, name: "Петр Смирнов", role: "engineer", email: "petr@example.com" }, { id: 3, name: "Анна Иванова", role: "viewer", email: "anna@example.com" } ]); const [maintenanceEvents, setMaintenanceEvents] = useState([ { equipmentId: 1, date: "2023-06-15", status: "planned", responsible: "Иван Петров" }, { equipmentId: 2, date: "2023-06-20", status: "planned", responsible: "Петр Смирнов" }, { equipmentId: 3, date: "2023-06-10", status: "overdue", responsible: "Анна Иванова" } ]); const [newEquipment, setNewEquipment] = useState({ name: '', type: '', serial: '', inventory: '', commissionDate: '', maintenanceInterval: 30, description: '' }); const [editEquipment, setEditEquipment] = useState(null); const [showAddModal, setShowAddModal] = useState(false); const [showEditModal, setShowEditModal] = useState(false); // Refs for form validation const formRef = useRef(null); const editFormRef = useRef(null); // Format date to DD.MM.YYYY const formatDate = (dateString) => { if (!dateString) return ''; const date = new Date(dateString); const day = String(date.getDate()).padStart(2, '0'); const month = String(date.getMonth() + 1).padStart(2, '0'); const year = date.getFullYear(); return `${day}.${month}.${year}`; }; // Calculate next maintenance date const calculateNextMaintenanceDate = (commissionDate, intervalDays) => { if (!commissionDate) return ''; const intervalMs = parseInt(intervalDays) * 24 * 60 * 60 * 1000; const nextDate = new Date(new Date(commissionDate).getTime() + intervalMs); return nextDate.toISOString().split('T')[0]; }; // Handle add equipment modal const openAddModal = () => { setNewEquipment({ name: '', type: '', serial: '', inventory: '', commissionDate: '', maintenanceInterval: 30, description: '' }); setShowAddModal(true); }; const closeAddModal = () => { setShowAddModal(false); setNewEquipment({ name: '', type: '', serial: '', inventory: '', commissionDate: '', maintenanceInterval: 30, description: '' }); }; // Save new equipment const saveEquipment = () => { // Validate form let isValid = true; const inputs = formRef.current.querySelectorAll('[required]'); inputs.forEach(input => { if (!input.value.trim()) { input.classList.add('border-red-500'); isValid = false; } else { input.classList.remove('border-red-500'); } }); if (!isValid) { alert('Пожалуйста, заполните все обязательные поля'); return; } const newEq = { ...newEquipment, id: equipmentList.length + 1, status: 'active' }; setEquipmentList([...equipmentList, newEq]); closeAddModal(); alert('Оборудование добавлено успешно!'); }; // Open edit modal const openEditModal = (id) => { const equipment = equipmentList.find(eq => eq.id === id); if (equipment) { setEditEquipment({...equipment}); setShowEditModal(true); } }; const closeEditModal = () => { setShowEditModal(false); setEditEquipment(null); }; // Update equipment const updateEquipment = () => { // Validate form let isValid = true; const inputs = editFormRef.current.querySelectorAll('[required]'); inputs.forEach(input => { if (!input.value.trim()) { input.classList.add('border-red-500'); isValid = false; } else { input.classList.remove('border-red-500'); } }); if (!isValid) { alert('Пожалуйста, заполните все обязательные поля'); return; } setEquipmentList(equipmentList.map(eq => eq.id === editEquipment.id ? {...editEquipment} : eq )); closeEditModal(); alert('Изменения сохранены!'); }; // Delete equipment const deleteEquipment = (id) => { if (window.confirm('Вы уверены, что хотите удалить это оборудование?')) { setEquipmentList(equipmentList.filter(eq => eq.id !== id)); alert('Оборудование удалено!'); } }; // Dashboard stats const dashboardStats = [ { title: "Всего оборудования", value: equipmentList.length, icon: "tools", color: "blue" }, { title: "Выполнено ТО", value: equipmentList.filter(eq => eq.lastMaintenance).length, icon: "check-circle", color: "green" }, { title: "Просрочено ТО", value: equipmentList.filter(eq => new Date(eq.nextMaintenance) < new Date() ).length, icon: "exclamation-triangle", color: "yellow" }, { title: "Текущие ремонты", value: equipmentList.filter(eq => eq.status === "repair").length, icon: "wrench", color: "red" } ]; // Render dashboard content const renderDashboard = () => (
{stat.title}
| ID | Название | Тип | Статус | Последнее ТО | Действия |
|---|---|---|---|---|---|
| {eq.id} | {eq.name} | {eq.type} | {eq.status === 'active' ? 'Активно' : eq.status === 'maintenance' ? 'ТО' : 'Ремонт'} | {formatDate(eq.lastMaintenance)} |
{equipment?.type || ''}
Нет предстоящих ТО
)}| ID | Название | Тип | Статус | Последнее ТО | Действия |
|---|---|---|---|---|---|
| {eq.id} | {eq.name} | {eq.type} | {eq.status === 'active' ? 'Активно' : eq.status === 'maintenance' ? 'ТО' : 'Ремонт'} | {formatDate(eq.lastMaintenance)} |
| Имя | Роль | Действия | |
|---|---|---|---|
| {user.name} | {user.email} | {user.role === 'admin' ? 'Администратор' : user.role === 'engineer' ? 'Инженер' : 'Просмотр'} |
{!isSidebarCollapsed && (
Иван Петров
Администратор