diff --git a/src/components/Battery/index.jsx b/src/components/Battery/index.jsx new file mode 100644 index 0000000..0a9977e --- /dev/null +++ b/src/components/Battery/index.jsx @@ -0,0 +1,62 @@ +import { lazy } from "react"; +import { + Tooltip +} from "@material-ui/core"; +import useStyles from "../useStyles"; + +const Battery0 = lazy(() => import("@mui/icons-material/Battery0Bar")); +const BatteryFull = lazy(() => import("@mui/icons-material/BatteryFull")); +const BatteryUnknown = lazy(() => import("@mui/icons-material/BatteryUnknown")); +const BatteryCharging = lazy(() => import("@mui/icons-material/BatteryChargingFull")); +const Batteries = [ + lazy(() => import("@mui/icons-material/Battery0Bar")), + lazy(() => import("@mui/icons-material/Battery1Bar")), + lazy(() => import("@mui/icons-material/Battery2Bar")), + lazy(() => import("@mui/icons-material/Battery3Bar")), + lazy(() => import("@mui/icons-material/Battery4Bar")), + lazy(() => import("@mui/icons-material/Battery5Bar")), + lazy(() => import("@mui/icons-material/Battery6Bar")), +]; + +const chargingStates = [ + "V2L_trunk_active", +]; + +function getBatteryByPercent(percent) { + if (isNaN(percent) || percent > 100 || percent < 0) { + return BatteryUnknown; + } + + if (percent === 0) { + return Battery0; + } + + if (percent === 100) { + return BatteryFull; + } + + const unit = 14.2857142857; + const range = Math.floor(percent / unit); + + return Batteries[range]; +} + +export default function Battery({ + percent, + charge = "unknown" +}) { + const classes = useStyles(); + let Battery = getBatteryByPercent(percent); + + if (chargingStates.includes(charge)) { + Battery = BatteryCharging; + } + + return ( + +
+ {percent && `${percent}%`} +
+
+ ); +} \ No newline at end of file diff --git a/src/components/BulkActions/index.jsx b/src/components/BulkActions/index.jsx index 23d82e0..bdb8389 100644 --- a/src/components/BulkActions/index.jsx +++ b/src/components/BulkActions/index.jsx @@ -81,7 +81,7 @@ export default function BulkActions({ { id: "diagnostic", name: "Send Diagnostic", - disabled: false, // TODO set role + disabled: !hasRole(groups, Permissions.CarDiagnostic, providers), trigger: () => setActive("diagnostic"), } ].filter((action) => actions.includes(action.id)); diff --git a/src/components/Contexts/FleetContext.jsx b/src/components/Contexts/FleetContext.jsx index 2173d9d..1c845a2 100644 --- a/src/components/Contexts/FleetContext.jsx +++ b/src/components/Contexts/FleetContext.jsx @@ -138,6 +138,10 @@ export const FleetProvider = ({ children }) => { car_update_name: vehicle.carupdate?.updatemanifest?.name || "", car_update_status: vehicle.carupdate?.status || "", car_update_type: vehicle.carupdate?.updatemanifest?.type || "", + voltage: vehicle.carstate?.battery?.battery_voltage, + charge: vehicle.carstate?.battery?.percent, + charge_type: vehicle.carstate?.vcu0x260?.charge_type, + park: vehicle.carstate?.gear?.in_park, }); }); @@ -155,9 +159,16 @@ export const FleetProvider = ({ children }) => { const result = await updatesApi.getCarUpdateProgress( carUpdateIdsRef.current.join(","), token - ).catch(() => { - return Promise.reject(); - }); + ) + .then((result) => { + if (!Array.isArray(result.statuses)) { + return Promise.reject(); + } + return result; + }) + .catch(() => { + return Promise.reject(); + }); let pivot = result.statuses?.length ? result.statuses.length - 1 : 0; setFleetVehicles((fleetVehicles) => fleetVehicles.map((vehicle) => { result.statuses.find((status, i) => { @@ -184,6 +195,7 @@ export const FleetProvider = ({ children }) => { break; default: vehicle.car_update_progress = -1; + vehicle.car_update_status = status.msg; break; } diff --git a/src/components/Fleets/Status/CANFiltersTab.jsx b/src/components/Fleets/Status/CANFiltersTab.jsx index 78361a0..596787d 100644 --- a/src/components/Fleets/Status/CANFiltersTab.jsx +++ b/src/components/Fleets/Status/CANFiltersTab.jsx @@ -12,7 +12,7 @@ const FleetCANFiltersTab = () => { return (
- CAN Filters + CAN Filters
); diff --git a/src/components/Fleets/Status/DetailsTab.jsx b/src/components/Fleets/Status/DetailsTab.jsx index c4a563b..e9f6c19 100644 --- a/src/components/Fleets/Status/DetailsTab.jsx +++ b/src/components/Fleets/Status/DetailsTab.jsx @@ -12,7 +12,7 @@ const FleetDetailsTab = () => { return (
- Fleet Details + Fleet Details
); diff --git a/src/components/Fleets/Status/Vehicles/Table/__snapshots__/index.test.jsx.snap b/src/components/Fleets/Status/Vehicles/Table/__snapshots__/index.test.jsx.snap index 3e290d6..e041c32 100644 --- a/src/components/Fleets/Status/Vehicles/Table/__snapshots__/index.test.jsx.snap +++ b/src/components/Fleets/Status/Vehicles/Table/__snapshots__/index.test.jsx.snap @@ -232,6 +232,75 @@ exports[`FleetVehiclesTable Render 1`] = ` + + + Battery + + + + + + Voltage + + + + + + Park + + +
{ - + {car.car_update_status} {car.car_update_progress > -1 && ( )} - {Actions(car.vin)} + + + + + {car.voltage > 0 && `${car.voltage}V`} + + + {car.park ? "Yes" : "No"} + + {Actions(car.vin)} ) })} @@ -272,7 +294,7 @@ const MainForm = ({ name }) => { { return (
- Vehicles + Vehicles
); diff --git a/src/components/Fleets/Status/__snapshots__/CANFiltersTab.test.jsx.snap b/src/components/Fleets/Status/__snapshots__/CANFiltersTab.test.jsx.snap index 4ab0de0..daf6c67 100644 --- a/src/components/Fleets/Status/__snapshots__/CANFiltersTab.test.jsx.snap +++ b/src/components/Fleets/Status/__snapshots__/CANFiltersTab.test.jsx.snap @@ -6,7 +6,7 @@ exports[`CANFiltersTab Render 1`] = ` class="makeStyles-paper-0 makeStyles-tableSize-0" >
CAN Filters
diff --git a/src/components/Fleets/Status/__snapshots__/DetailsTab.test.jsx.snap b/src/components/Fleets/Status/__snapshots__/DetailsTab.test.jsx.snap index 4e0190c..01e8236 100644 --- a/src/components/Fleets/Status/__snapshots__/DetailsTab.test.jsx.snap +++ b/src/components/Fleets/Status/__snapshots__/DetailsTab.test.jsx.snap @@ -15,7 +15,7 @@ exports[`DetailsTab Render 1`] = ` class="makeStyles-paper-0 makeStyles-tableSize-0" >
Fleet Details
diff --git a/src/components/Fleets/Status/__snapshots__/VehiclesTab.test.jsx.snap b/src/components/Fleets/Status/__snapshots__/VehiclesTab.test.jsx.snap index 5aec244..105877b 100644 --- a/src/components/Fleets/Status/__snapshots__/VehiclesTab.test.jsx.snap +++ b/src/components/Fleets/Status/__snapshots__/VehiclesTab.test.jsx.snap @@ -6,7 +6,7 @@ exports[`VehiclesTab Render 1`] = ` class="makeStyles-paper-0 makeStyles-tableSize-0" >
Vehicles
@@ -231,6 +231,75 @@ exports[`VehiclesTab Render 1`] = ` + + + Battery + + + + + + Voltage + + + + + + Park + + +
@@ -103,7 +104,7 @@ exports[`FleetStatus Render 1`] = ` class="makeStyles-paper-0 makeStyles-tableSize-0" >
Fleet Details
@@ -291,12 +292,14 @@ exports[`FleetStatus Render 1`] = `