File size: 5,593 Bytes
4d76deb |
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 130 131 132 133 134 135 136 137 |
import React, { useState } from 'react';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faEdit, faTrash, faPlus } from '@fortawesome/free-solid-svg-icons';
import Swal from 'sweetalert2';
function Equipment({ equipment, onAdd, onEdit, onDelete }) {
const [filters, setFilters] = useState({
status: '',
type: '',
search: ''
});
const filteredEquipment = equipment.filter(item => {
return (
(!filters.status || item.status === filters.status) &&
(!filters.type || item.type === filters.type) &&
(!filters.search ||
item.name.toLowerCase().includes(filters.search.toLowerCase()) ||
item.serial.toLowerCase().includes(filters.search.toLowerCase()) ||
item.inventory.toLowerCase().includes(filters.search.toLowerCase())
)
);
});
const handleDelete = (id) => {
Swal.fire({
title: 'Подтверждение',
text: 'Вы уверены, что хотите удалить это оборудование?',
icon: 'warning',
showCancelButton: true,
confirmButtonText: 'Да, удалить',
cancelButtonText: 'Отмена'
}).then((result) => {
if (result.isConfirmed) {
onDelete(id);
}
});
};
return (
<div>
<div className="mb-4 flex justify-between items-center">
<h2 className="text-2xl font-bold">Оборудование</h2>
<button
onClick={onAdd}
className="bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded-lg flex items-center"
>
<FontAwesomeIcon icon={faPlus} className="mr-2" />
Добавить оборудование
</button>
</div>
<div className="mb-4 flex space-x-4">
<select
value={filters.status}
onChange={(e) => setFilters({ ...filters, status: e.target.value })}
className="border rounded-lg px-4 py-2"
>
<option value="">Все статусы</option>
<option value="active">Активно</option>
<option value="maintenance">ТО</option>
<option value="repair">Ремонт</option>
</select>
<select
value={filters.type}
onChange={(e) => setFilters({ ...filters, type: e.target.value })}
className="border rounded-lg px-4 py-2"
>
<option value="">Все типы</option>
<option value="Станок">Станок</option>
<option value="Конвейер">Конвейер</option>
<option value="Компрессор">Компрессор</option>
<option value="Генератор">Генератор</option>
<option value="Насос">Насос</option>
</select>
<input
type="text"
value={filters.search}
onChange={(e) => setFilters({ ...filters, search: e.target.value })}
placeholder="Поиск..."
className="border rounded-lg px-4 py-2 flex-1"
/>
</div>
<div className="bg-white rounded-lg shadow overflow-hidden">
<table className="min-w-full divide-y divide-gray-200">
<thead className="bg-gray-50">
<tr>
<th className="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Название</th>
<th className="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Тип</th>
<th className="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Статус</th>
<th className="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Инв. номер</th>
<th className="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Действия</th>
</tr>
</thead>
<tbody className="bg-white divide-y divide-gray-200">
{filteredEquipment.map((item) => (
<tr key={item.id}>
<td className="px-6 py-4 whitespace-nowrap">{item.name}</td>
<td className="px-6 py-4 whitespace-nowrap">{item.type}</td>
<td className="px-6 py-4 whitespace-nowrap">
<span className={`px-2 py-1 rounded-full text-xs font-semibold ${
item.status === 'active' ? 'bg-green-100 text-green-800' :
item.status === 'maintenance' ? 'bg-yellow-100 text-yellow-800' :
'bg-red-100 text-red-800'
}`}>
{item.status === 'active' ? 'Активно' :
item.status === 'maintenance' ? 'ТО' : 'Ремонт'}
</span>
</td>
<td className="px-6 py-4 whitespace-nowrap">{item.inventory}</td>
<td className="px-6 py-4 whitespace-nowrap">
<button
onClick={() => onEdit(item)}
className="text-blue-600 hover:text-blue-800 mr-3"
>
<FontAwesomeIcon icon={faEdit} />
</button>
<button
onClick={() => handleDelete(item.id)}
className="text-red-600 hover:text-red-800"
>
<FontAwesomeIcon icon={faTrash} />
</button>
</td>
</tr>
))}
</tbody>
</table>
</div>
</div>
);
}
export default Equipment; |