diff --git a/package-lock.json b/package-lock.json
index 55c27be..5c1f620 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -33,6 +33,7 @@
"react-router-dom": "^5.3.0",
"react-router-hash-link": "^2.4.3",
"react-scripts": "5.0.0",
+ "usehooks-ts": "^2.7.1",
"web-vitals": "^2.1.4"
},
"devDependencies": {
@@ -16432,6 +16433,19 @@
"punycode": "^2.1.0"
}
},
+ "node_modules/usehooks-ts": {
+ "version": "2.7.2",
+ "resolved": "https://registry.npmjs.org/usehooks-ts/-/usehooks-ts-2.7.2.tgz",
+ "integrity": "sha512-DeLqSnGg9VvpwPZA+6lKVURJKM9EBu7bbIXuYclQ9COO3w4lacnJa0uP0iJbC/lAmY7GlmPinjZfGNNmDTlUpg==",
+ "engines": {
+ "node": ">=16.15.0",
+ "npm": ">=8"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
@@ -29270,6 +29284,12 @@
"punycode": "^2.1.0"
}
},
+ "usehooks-ts": {
+ "version": "2.7.2",
+ "resolved": "https://registry.npmjs.org/usehooks-ts/-/usehooks-ts-2.7.2.tgz",
+ "integrity": "sha512-DeLqSnGg9VvpwPZA+6lKVURJKM9EBu7bbIXuYclQ9COO3w4lacnJa0uP0iJbC/lAmY7GlmPinjZfGNNmDTlUpg==",
+ "requires": {}
+ },
"util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
diff --git a/package.json b/package.json
index 11daec5..5a7d5ed 100644
--- a/package.json
+++ b/package.json
@@ -28,6 +28,7 @@
"react-router-dom": "^5.3.0",
"react-router-hash-link": "^2.4.3",
"react-scripts": "5.0.0",
+ "usehooks-ts": "^2.7.1",
"web-vitals": "^2.1.4"
},
"scripts": {
@@ -67,9 +68,9 @@
"coverageThreshold": {
"global": {
"branches": 39,
- "functions": 45.5,
- "lines": 50,
- "statements": 49
+ "functions": 47,
+ "lines": 55,
+ "statements": 55
}
},
"coverageReporters": [
diff --git a/src/components/App/__snapshots__/App.test.js.snap b/src/components/App/__snapshots__/App.test.js.snap
index ad4b43a..527bc6c 100644
--- a/src/components/App/__snapshots__/App.test.js.snap
+++ b/src/components/App/__snapshots__/App.test.js.snap
@@ -3311,7 +3311,7 @@ exports[`App Route /packages authenticated 1`] = `
/>
-
+
@@ -3460,6 +3459,7 @@ exports[`App Route /packages authenticated 1`] = `
+
@@ -6015,7 +6015,7 @@ exports[`App Route /vehicle-add authenticated 1`] = `
class="PrivateSwitchBase-input-0"
name="log-level-group"
type="radio"
- value="warn"
+ value="warning"
/>
- Warn
+ Warning
+
+
diff --git a/src/components/CANFilter/Table/index.jsx b/src/components/CANFilter/Table/index.jsx
index 61b2a7a..55d985d 100644
--- a/src/components/CANFilter/Table/index.jsx
+++ b/src/components/CANFilter/Table/index.jsx
@@ -53,6 +53,7 @@ const PAGE_SIZE = "CAN_FILTER_TABLE_PAGE_SIZE";
const MainForm = ({ vin }) => {
const classes = useStyles();
+ const [search, onSearch] = useState("");
const [pageSize, setPageSize] = useLocalStorage(PAGE_SIZE, 10);
const [pageIndex, setPageIndex] = useState(0);
const [orderBy, setOrderBy] = useState("id");
@@ -68,6 +69,7 @@ const MainForm = ({ vin }) => {
await getFilters(
vin,
{
+ search,
limit: pageSize,
offset: pageSize * pageIndex,
order: `${orderBy} ${order}`,
@@ -80,7 +82,7 @@ const MainForm = ({ vin }) => {
}
})();
// eslint-disable-next-line react-hooks/exhaustive-deps
- }, [vin, token, pageIndex, pageSize, orderBy, order]);
+ }, [vin, token, pageIndex, pageSize, orderBy, order, search]);
const handleChangePageIndex = (event, newIndex) => {
setPageIndex(newIndex);
@@ -166,7 +168,7 @@ const MainForm = ({ vin }) => {
-
+
diff --git a/src/components/Cars/Add/__snapshots__/index.test.jsx.snap b/src/components/Cars/Add/__snapshots__/index.test.jsx.snap
index 95c6340..2d706b6 100644
--- a/src/components/Cars/Add/__snapshots__/index.test.jsx.snap
+++ b/src/components/Cars/Add/__snapshots__/index.test.jsx.snap
@@ -388,7 +388,7 @@ exports[`VehicleAddForm Render 1`] = `
class="PrivateSwitchBase-input-0"
name="log-level-group"
type="radio"
- value="warn"
+ value="warning"
/>
+
+
+ ICC Connected
+
+ :
+ true
+
diff --git a/src/components/Cars/Status/__snapshots__/FleetsTab.test.jsx.snap b/src/components/Cars/Status/__snapshots__/FleetsTab.test.jsx.snap
new file mode 100644
index 0000000..4353af6
--- /dev/null
+++ b/src/components/Cars/Status/__snapshots__/FleetsTab.test.jsx.snap
@@ -0,0 +1,280 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`FleetsTab Render 1`] = `
+
+`;
diff --git a/src/components/Cars/Status/__snapshots__/index.test.jsx.snap b/src/components/Cars/Status/__snapshots__/index.test.jsx.snap
index 02f5063..87bafee 100644
--- a/src/components/Cars/Status/__snapshots__/index.test.jsx.snap
+++ b/src/components/Cars/Status/__snapshots__/index.test.jsx.snap
@@ -137,6 +137,24 @@ exports[`CarStatus Render 1`] = `
class="MuiTouchRipple-root"
/>
+
+
diff --git a/src/components/Cars/Status/index.jsx b/src/components/Cars/Status/index.jsx
index 0943eb7..4d45e26 100644
--- a/src/components/Cars/Status/index.jsx
+++ b/src/components/Cars/Status/index.jsx
@@ -13,6 +13,7 @@ import { useStatusContext } from "../../Contexts/StatusContext";
import useStyles from "../../useStyles";
import CANSignalsTab from "./CANSignalsTab";
import RemoteCommandsTab from "./RemoteCommandsTab";
+import FleetsTab from "./FleetsTab";
const tabHashes = ["details", "updates", "filters"];
@@ -66,6 +67,7 @@ const CarStatus = () => {
+
@@ -92,6 +94,10 @@ const CarStatus = () => {
+
+
+
+
);
};
diff --git a/src/components/Cars/Update/__snapshots__/index.test.jsx.snap b/src/components/Cars/Update/__snapshots__/index.test.jsx.snap
index 0a175dd..403c08a 100644
--- a/src/components/Cars/Update/__snapshots__/index.test.jsx.snap
+++ b/src/components/Cars/Update/__snapshots__/index.test.jsx.snap
@@ -390,7 +390,7 @@ exports[`VehicleUpdate Render 1`] = `
class="PrivateSwitchBase-input-0"
name="log-level-group"
type="radio"
- value="warn"
+ value="warning"
/>
+ setShowDeleteModal(false)}
+ deleteFunction={() => onDelete(deleteId)}
+ />
);
};
diff --git a/src/components/VehicleMap/index.jsx b/src/components/VehicleMap/index.jsx
index d8ed19e..c685dac 100644
--- a/src/components/VehicleMap/index.jsx
+++ b/src/components/VehicleMap/index.jsx
@@ -74,12 +74,16 @@ const Component = () => {
useEffect(() => {
if (!token) return;
- if (markers.length > 0) {
- const vins = markers.map((marker) => marker[2]);
- getConnections(vins, token).then((conns) => {
- setConnections(conns);
- });
- }
+
+ const vins = markers
+ .filter((marker) => marker[2].length > 0)
+ .map((marker) => marker[2]);
+
+ if (vins.length === 0) return;
+
+ getConnections(vins, token).then((conns) => {
+ setConnections(conns);
+ });
// eslint-disable-next-line
}, [markers, token]);
@@ -151,7 +155,6 @@ const Component = () => {
url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
/>
-
{markers.map((marker) => (
{
key={carState.vin}
vin={carState.vin}
online={carState.online}
+ onlineHMI={carState.online_hmi}
battery={carState.battery}
doors={carState.doors}
location={carState.location}
diff --git a/src/components/VehicleMap/popup.jsx b/src/components/VehicleMap/popup.jsx
index 671e4ed..199d3bb 100644
--- a/src/components/VehicleMap/popup.jsx
+++ b/src/components/VehicleMap/popup.jsx
@@ -13,7 +13,7 @@ import CANSignals from "../Cars/CANSignals";
const VehiclePopUp = (props) => {
const classes = useStyles();
const [viewCAN, setViewCAN] = useState(false);
- const { vin, online, onClose } = props;
+ const { vin, online, onClose, onlineHMI } = props;
const toggleView = (e) => {
e.preventDefault();
@@ -43,6 +43,9 @@ const VehiclePopUp = (props) => {
Connected: {online.toString()}
+
+ ICC Connected: {onlineHMI?.toString()}
+
{viewCAN && }
{!viewCAN && }
diff --git a/src/services/__mocks__/fleetsAPI.js b/src/services/__mocks__/fleetsAPI.js
index 64a610c..c51b490 100644
--- a/src/services/__mocks__/fleetsAPI.js
+++ b/src/services/__mocks__/fleetsAPI.js
@@ -22,7 +22,7 @@ const fleets = [
},
{
name: "US-CENTRAL",
- log_level: "warn",
+ log_level: "warning",
canbus: { enabled: false, data_logger_enabled: false, max_mem_buffer_size: 0, max_disk_buffer_size: 0 },
vehicles: ["USCENTVIN12345678", "USCENTVIN12345679", "USCENTVIN12345670"]
},
diff --git a/src/services/__mocks__/vehiclesAPI.js b/src/services/__mocks__/vehiclesAPI.js
index b66976c..ccd7537 100644
--- a/src/services/__mocks__/vehiclesAPI.js
+++ b/src/services/__mocks__/vehiclesAPI.js
@@ -50,6 +50,14 @@ const ecusData = [
},
];
+const signals = {data:[
+ {
+ timestamp: "2021-07-14T20:09:40.98187Z",
+ name: "signal",
+ value: 123
+ },
+]};
+
const vehiclesAPI = {
addVehicle: async (vehicle) => {
data.push(vehicle);
@@ -89,6 +97,7 @@ const vehiclesAPI = {
getVehicles: async () => {
return { data };
},
+ getFleets: async (vin) => {return { data: ["fleet1", "fleet2"]}},
getYears: async () => {
return {
data: [2021, 2022],
@@ -104,6 +113,9 @@ const vehiclesAPI = {
const index = data.findIndex(element => element.vin === vin);
if (index >= 0) data[index] = vehicle;
return vehicle;
+ },
+ getCANSignals: async (vin, vehicle) => {
+ return signals;
}
};
diff --git a/src/services/vehiclesAPI.js b/src/services/vehiclesAPI.js
index d99c1d2..cc672d5 100644
--- a/src/services/vehiclesAPI.js
+++ b/src/services/vehiclesAPI.js
@@ -114,6 +114,19 @@ const vehiclesAPI = {
.catch(errorHandler);
},
+ getFleets: async (vin, search, token) => {
+ const u = addQueryParams(`${API_ENDPOINT}/vehicle/${vin}/fleets`, search)
+ return fetch(u, {
+ method: "GET",
+ headers: Object.assign(
+ { "Content-Type": "application/json" },
+ getAuthHeaderOptions(token)
+ ),
+ })
+ .then(fetchRespHandler)
+ .catch(errorHandler);
+ },
+
getYears: async (token) =>
fetch(`${API_ENDPOINT}/vehicleyears`, {
method: "GET",