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
+
+
+ |
|