import { Checkbox, Grid, LinearProgress, Table, TableBody, TableCell, TableFooter, TablePagination, TableRow, Tooltip, IconButton, } from "@material-ui/core"; import AddCircleIcon from "@material-ui/icons/AddCircle"; import DeleteIcon from "@material-ui/icons/Delete"; import clsx from "clsx"; import React, { useEffect, useState } from "react"; import { Link } from "react-router-dom"; import { logger } from "../../../../../services/monitoring"; import { FleetProvider, useFleetContext } from "../../../../Contexts/FleetContext"; import { useStatusContext } from "../../../../Contexts/StatusContext"; import { useUserContext } from "../../../../Contexts/UserContext"; import SearchField from "../../../../Controls/SearchField"; import TableHeaderSortable from "../../../../Table/HeaderSortable"; import { useLocalStorage } from "../../../../useLocalStorage"; import ConnectedIcon from "../../../../Controls/ConnectedIcon"; import BulkActions from "../../../../BulkActions"; import Battery from "../../../../Battery"; import useStyles from "../../../../useStyles"; const tableColumns = [ { id: "vin", label: "VIN", }, { id: "trex_version", label: "T.REX Version", }, { id: "car_update", label: "Car Update", }, { id: "car_update_status", label: "Car Update Status", }, { id: "battery", label: "Battery", }, { id: "voltage", label: "Voltage", }, { id: "park", // TODO: Update to 'gear' when we confirm each possible state label: "Park", }, { id: "", label: "Actions", }, ]; const PAGE_SIZE = "FLEET_STATUS_VEHICLES_TABLE_PAGE_SIZE"; const MainForm = ({ name }) => { const [pageSize, setPageSize] = useLocalStorage(PAGE_SIZE, 10); const [pageIndex, setPageIndex] = useState(0); const [orderBy, setOrderBy] = useState("id"); const [order, setOrder] = useState("desc"); const [search, setSearch] = useState(""); const [selected, setSelected] = useState([]); const classes = useStyles(); const { setMessage } = useStatusContext(); const { fleetVehicles, totalFleetVehicles, watchFleetVehicles, getFleetVehicles, deleteFleetVehicle, } = useFleetContext(); const { token: { idToken: { jwtToken: token }, }, } = useUserContext(); const handleSearch = (query) => { setSearch(query); }; useEffect(() => { (async () => { try { if (!name || !token) return; await getFleetVehicles( name, { search, limit: pageSize, offset: pageSize * pageIndex, order: `${orderBy} ${order}`, }, token ); watchFleetVehicles.start({ token }); } catch (e) { setMessage(e.message); logger.warn(e.stack); } })(); return () => { watchFleetVehicles.end(); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [token, pageIndex, pageSize, orderBy, order, search]); const handleChangePageIndex = (event, newIndex) => { setPageIndex(newIndex); }; const handleChangePageSize = (event) => { setPageSize(parseInt(event.target.value, 10)); setPageIndex(0); }; const handleSort = (event, property) => { try { if (property === orderBy) { if (order === "asc") { setOrder("desc"); } else { setOrder("asc"); } } else { setOrderBy(property); setOrder("asc"); } } catch (e) { logger.warn(e.stack); } }; const handleSelect = (vin, setState) => { setSelected(selected => setState ? [...selected, vin] : selected.filter(select => select !== vin)); }; const handleSelectAll = (event) => { const allSelected = !event.target.checked; setSelected(() => allSelected ? [] : fleetVehicles.map((vehicle) => vehicle.vin)); } const onDelete = async (vin) => { try { await deleteFleetVehicle(name, { vin: vin }, token); setMessage(`Deleted ${vin}`); } catch (e) { setMessage(e.message); logger.warn(e.stack); } }; return (