import { DataGrid, GridColDef, GridRenderCellParams } from "@mui/x-data-grid"; import { ruRU } from "@mui/x-data-grid/locales"; import { authStore, carrierStore, languageStore, vehicleStore, SearchInput, selectedCityStore, cityStore } from "@shared"; import { useEffect, useState, useMemo } from "react"; import { observer } from "mobx-react-lite"; import { Eye, Pencil, Trash2, Minus } from "lucide-react"; import { useNavigate } from "react-router-dom"; import { CreateButton, DeleteModal } from "@widgets"; import { VEHICLE_TYPES } from "@shared"; import { Box, CircularProgress } from "@mui/material"; export const VehicleListPage = observer(() => { const { vehicles, getVehicles, deleteVehicle } = vehicleStore; const { getCarriers } = carrierStore; const navigate = useNavigate(); const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false); const [isBulkDeleteModalOpen, setIsBulkDeleteModalOpen] = useState(false); const [rowId, setRowId] = useState(null); const [ids, setIds] = useState([]); const [isLoading, setIsLoading] = useState(false); const [paginationModel, setPaginationModel] = useState({ page: 0, pageSize: 50, }); const { language } = languageStore; const canWriteVehicles = authStore.canWrite("devices"); const [searchQuery, setSearchQuery] = useState(""); useEffect(() => { const fetchData = async () => { setIsLoading(true); await getVehicles(); await getCarriers(language); await cityStore.getCities("ru"); setIsLoading(false); }; fetchData(); }, [language, selectedCityStore.cityVersion]); const columns: GridColDef[] = [ { field: "tail_number", headerName: "Бортовой номер", flex: 1, renderCell: (params: GridRenderCellParams) => { return (
{params.value ? ( params.value ) : ( )}
); }, }, { field: "type", headerName: "Тип", flex: 1, renderCell: (params: GridRenderCellParams) => { return (
{params.value ? ( VEHICLE_TYPES.find((type) => type.value === params.row.type) ?.label || params.row.type ) : ( )}
); }, }, { field: "carrier", headerName: "Перевозчик", flex: 1, renderCell: (params: GridRenderCellParams) => { return (
{params.value ? ( params.value ) : ( )}
); }, }, { field: "city", headerName: "Город", flex: 1, renderCell: (params: GridRenderCellParams) => { return (
{params.value ? ( params.value ) : ( )}
); }, }, { field: "actions", headerName: "Действия", width: 200, align: "center" as const, headerAlign: "center" as const, sortable: false, renderCell: (params: GridRenderCellParams) => { const canWrite = authStore.canWrite("devices"); return (
{canWrite && ( )} {canWrite && ( )}
); }, }, ]; const { selectedCityId } = selectedCityStore; const rows = useMemo(() => { if (!selectedCityId) return []; const query = searchQuery.trim().toLowerCase(); return (vehicles.data ?? []) .filter((vehicle) => vehicle.vehicle.city_id === selectedCityId) .filter( (vehicle) => !query || (vehicle.vehicle.tail_number ?? "").toLowerCase().includes(query) || (vehicle.vehicle.carrier ?? "").toLowerCase().includes(query) ) .map((vehicle) => ({ id: vehicle.vehicle.id, tail_number: vehicle.vehicle.tail_number, type: vehicle.vehicle.type, carrier: vehicle.vehicle.carrier, city: cityStore.cities.ru.data.find((c) => c.id === vehicle.vehicle.city_id)?.name, })); }, [vehicles.data, selectedCityId, searchQuery]); return ( <>

Транспортные средства

{(rows.length > 0 || searchQuery) && ( )} {canWriteVehicles && ids.length > 0 && (
)} { if (Array.isArray(newSelection)) { const selectedIds = newSelection.map( (id: string | number) => Number(id) ); setIds(selectedIds); } else if ( newSelection && typeof newSelection === "object" && "ids" in newSelection ) { const idsSet = newSelection.ids as Set; const selectedIds = Array.from(idsSet).map( (id: string | number) => Number(id) ); setIds(selectedIds); } else { setIds([]); } } : undefined } localeText={ruRU.components.MuiDataGrid.defaultProps.localeText} slots={{ noRowsOverlay: () => ( {isLoading ? ( ) : !selectedCityId ? ( "Выберите город" ) : ( "Нет транспортных средств" )} ), }} />
{ if (rowId) { await deleteVehicle(rowId); } setIsDeleteModalOpen(false); setRowId(null); }} onCancel={() => { setIsDeleteModalOpen(false); setRowId(null); }} /> { await Promise.all(ids.map((id) => deleteVehicle(id))); getVehicles(); setIsBulkDeleteModalOpen(false); setIds([]); }} onCancel={() => { setIsBulkDeleteModalOpen(false); }} /> ); });