From fd177b26569f02c2efe4edc8a74f37ecc2180535 Mon Sep 17 00:00:00 2001 From: John Wu <76966357+jwu-fisker@users.noreply.github.com> Date: Fri, 17 Mar 2023 13:41:51 -0700 Subject: [PATCH 1/6] CEC-3916 Fix digital twin (#294) * CEC-3916 Fix digital twin * Mileage --- .../DigitalTwinTab.test.jsx.snap | 30 ++++++++++---- src/components/DigitalTwin/index.js | 39 +++++++++++++------ 2 files changed, 50 insertions(+), 19 deletions(-) diff --git a/src/components/Cars/Status/__snapshots__/DigitalTwinTab.test.jsx.snap b/src/components/Cars/Status/__snapshots__/DigitalTwinTab.test.jsx.snap index b3bbeb4..c1dc644 100644 --- a/src/components/Cars/Status/__snapshots__/DigitalTwinTab.test.jsx.snap +++ b/src/components/Cars/Status/__snapshots__/DigitalTwinTab.test.jsx.snap @@ -35,13 +35,27 @@ exports[`DigitalTwinTab Render 1`] = ` true
-

- +

+

Battery - - : - 95% -

+

+

+ + Percentage + + : + 95% +

+

+ + Total Mileage + + : + unknown +

+
@@ -102,14 +116,14 @@ exports[`DigitalTwinTab Render 1`] = ` driver : - Closed + Unlocked

all : - Locked + Unlocked

(

{key}: {value} @@ -23,33 +27,46 @@ const windowState = (value) => { const DigitalTwin = (props) => { const classes = useStyles(); - const { battery, doors, location, trex_version, ip, updated, windows, misc_windows, sunroof, dbc_version, door_locks } = props; + const { battery, doors, location, trex_version, ip, updated, windows, misc_windows, sunroof, dbc_version, door_locks, vcu0x260, charging_metrics } = props; return (

- {!battery && !doors && !location && !windows && ( + {!battery && !doors && !location && !windows && !vcu0x260 && !charging_metrics && (

No vehicle data to display.

)} - {battery != null && keyValueTemplate("Battery", `${battery.percent}%`)} - {doors != null && ( + {battery && ( +
+

Battery

+ {keyValueTemplate("Percentage", `${battery.percent || 0}%`)} + {keyValueTemplate("Total Mileage", `${battery.total_mileage_odometer || UNKNOWN}`)} +
+ )} + {(vcu0x260 || charging_metrics) && ( +
+

Charging

+ {keyValueTemplate("Charge Type", vcu0x260?.charge_type || UNKNOWN)} + {keyValueTemplate("Remaining Time", charging_metrics?.remaining_charging_time || UNKNOWN)} +
+ )} + {doors && (

Doors

{Object.entries(doors).map(mapOpenCloseState)}
)} - {door_locks != null && ( + {door_locks && (

Door Locks

{Object.entries(door_locks).map((value) => { if (value[0] === "driver") { - return keyValueTemplate(value[0], value[1] ? "Open" : "Closed"); + return keyValueTemplate(value[0], value[1] ? LOCKED : UNLOCKED); } else { - return keyValueTemplate(value[0], value[1] ? "Unlocked" : "Locked"); + return keyValueTemplate(value[0], value[1] ? LOCKED : UNLOCKED); } })}
)} - {windows != null && ( + {windows && (

Windows

{Object.entries(windows).map((value) => { @@ -57,7 +74,7 @@ const DigitalTwin = (props) => { })}
)} - {misc_windows != null && ( + {misc_windows && (

Misc Windows

{Object.entries(misc_windows).map((value) => { @@ -65,7 +82,7 @@ const DigitalTwin = (props) => { })}
)} - {sunroof != null && ( + {sunroof && (

Sunroof

{Object.entries(sunroof).map((value) => { @@ -73,7 +90,7 @@ const DigitalTwin = (props) => { })}
)} - {location != null && ( + {location && (

Location

{Object.entries(location).map((value) => { From 8090bfdc6f86b3a9d938958928d76555673d5021 Mon Sep 17 00:00:00 2001 From: das31 <31259710+das31@users.noreply.github.com> Date: Fri, 17 Mar 2023 17:08:43 -0400 Subject: [PATCH 2/6] CEC-3759-Collapsible-Sidemenu (#292) * first push * Code smell --------- Co-authored-by: jwu-fisker --- .../App/__snapshots__/App.test.js.snap | 336 ++++++++++++++++++ src/components/DigitalTwin/index.js | 6 +- src/components/Layouts/MenuDrawer.jsx | 32 +- 3 files changed, 364 insertions(+), 10 deletions(-) diff --git a/src/components/App/__snapshots__/App.test.js.snap b/src/components/App/__snapshots__/App.test.js.snap index 7ec5bb8..5d1be1a 100644 --- a/src/components/App/__snapshots__/App.test.js.snap +++ b/src/components/App/__snapshots__/App.test.js.snap @@ -14,6 +14,30 @@ exports[`App Route / authenticated 1`] = `
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{

Door Locks

{Object.entries(door_locks).map((value) => { - if (value[0] === "driver") { - return keyValueTemplate(value[0], value[1] ? LOCKED : UNLOCKED); - } else { - return keyValueTemplate(value[0], value[1] ? LOCKED : UNLOCKED); - } + return keyValueTemplate(value[0], value[1] ? LOCKED : UNLOCKED); })}
)} diff --git a/src/components/Layouts/MenuDrawer.jsx b/src/components/Layouts/MenuDrawer.jsx index e437d8d..f26a103 100644 --- a/src/components/Layouts/MenuDrawer.jsx +++ b/src/components/Layouts/MenuDrawer.jsx @@ -1,4 +1,4 @@ -import React from "react"; +import React, { useState } from "react"; import clsx from "clsx"; import { Container, @@ -7,8 +7,10 @@ import { Toolbar, Typography, Divider, + IconButton, } from "@material-ui/core"; +import MenuIcon from "@material-ui/icons/Menu"; import SideMenu from "./SideMenu"; import useStyles from "../useStyles"; import { useUserContext } from "../Contexts/UserContext"; @@ -22,20 +24,40 @@ export default function MenuDrawer({ children }) { const { title, sitePath } = useStatusContext(); const { token } = useUserContext(); + const [drawerOpen, setDrawerOpen] = useState(true); + + const toggleDrawer = () => { + setDrawerOpen(!drawerOpen); + }; + return (
+ {token !== null && ( + + + + )}
{title} - +
{token !== null && ( @@ -47,7 +69,7 @@ export default function MenuDrawer({ children }) { className={classes.drawer} variant="persistent" anchor="left" - open={true} + open={drawerOpen} classes={{ paper: classes.drawerPaper, }} @@ -65,7 +87,7 @@ export default function MenuDrawer({ children }) { )}
From a4e774c8d48daedb21b912622bba4d6a102534a5 Mon Sep 17 00:00:00 2001 From: John Wu <76966357+jwu-fisker@users.noreply.github.com> Date: Fri, 17 Mar 2023 14:50:23 -0700 Subject: [PATCH 3/6] CEC-3916 add max range (#296) * CEC-3916 Add max range Magna should not have access to self serve CAN page * Max range --- .../__snapshots__/DigitalTwinTab.test.jsx.snap | 11 +++++++++-- src/components/Cars/Status/index.jsx | 10 +++++++++- src/components/DigitalTwin/index.js | 13 +++++++------ 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/components/Cars/Status/__snapshots__/DigitalTwinTab.test.jsx.snap b/src/components/Cars/Status/__snapshots__/DigitalTwinTab.test.jsx.snap index c1dc644..d487b3c 100644 --- a/src/components/Cars/Status/__snapshots__/DigitalTwinTab.test.jsx.snap +++ b/src/components/Cars/Status/__snapshots__/DigitalTwinTab.test.jsx.snap @@ -55,6 +55,13 @@ exports[`DigitalTwinTab Render 1`] = ` : unknown

+

+ + Max Range + + : + 577 +

- Updated at + Updated At : 7/26/2022 12:26:38 AM @@ -206,7 +213,7 @@ exports[`DigitalTwinTab Render 1`] = ` >

- DBC version + DBC Version : d439abd3662dd20099f49dd8f43f7b145202e961caa2b5aba2c6154c8096348b diff --git a/src/components/Cars/Status/index.jsx b/src/components/Cars/Status/index.jsx index ffe3802..98f223a 100644 --- a/src/components/Cars/Status/index.jsx +++ b/src/components/Cars/Status/index.jsx @@ -26,10 +26,12 @@ const TabViews = [ { label: "Details", component: CarDetailsTab, + rolesPerProvider: Permissions.FiskerMagnaRead, }, { label: "Car Updates", component: CarUpdatesTab, + rolesPerProvider: Permissions.FiskerMagnaRead, }, { label: "CAN Filters", @@ -39,22 +41,27 @@ const TabViews = [ { label: "Digital Twin", component: DigitalTwinTab, + rolesPerProvider: Permissions.FiskerMagnaRead, }, { label: "CAN Signals", component: CANSignalsTab, + rolesPerProvider: Permissions.FiskerMagnaRead, }, { label: "T.Rex logs", component: TRexLogsTab, + rolesPerProvider: Permissions.FiskerMagnaRead, }, { label: "ECUs", component: ECUsTab, + rolesPerProvider: Permissions.FiskerMagnaRead, }, { label: "Remote Commands", component: RemoteCommandsTab, + rolesPerProvider: Permissions.FiskerMagnaCreate, }, { label: "Fleets", @@ -63,7 +70,8 @@ const TabViews = [ }, { label: "CAN Signal Export", - component: SelfServeTab + component: SelfServeTab, + rolesPerProvider: Permissions.FiskerRead, } ]; diff --git a/src/components/DigitalTwin/index.js b/src/components/DigitalTwin/index.js index e1c70f0..c359dc7 100644 --- a/src/components/DigitalTwin/index.js +++ b/src/components/DigitalTwin/index.js @@ -27,18 +27,19 @@ const windowState = (value) => { const DigitalTwin = (props) => { const classes = useStyles(); - const { battery, doors, location, trex_version, ip, updated, windows, misc_windows, sunroof, dbc_version, door_locks, vcu0x260, charging_metrics } = props; + const { battery, doors, location, trex_version, ip, updated, windows, misc_windows, sunroof, dbc_version, door_locks, vcu0x260, charging_metrics, max_range } = props; return (

{!battery && !doors && !location && !windows && !vcu0x260 && !charging_metrics && (

No vehicle data to display.

)} - {battery && ( + {(battery || max_range) && (

Battery

- {keyValueTemplate("Percentage", `${battery.percent || 0}%`)} - {keyValueTemplate("Total Mileage", `${battery.total_mileage_odometer || UNKNOWN}`)} + {keyValueTemplate("Percentage", `${battery?.percent || 0}%`)} + {keyValueTemplate("Total Mileage", battery?.total_mileage_odometer || UNKNOWN)} + {keyValueTemplate("Max Range", max_range?.max_miles || UNKNOWN)}
)} {(vcu0x260 || charging_metrics) && ( @@ -113,12 +114,12 @@ const DigitalTwin = (props) => { )} {updated != null && (
- {keyValueTemplate("Updated at", LocalDateTimeString(updated))} + {keyValueTemplate("Updated At", LocalDateTimeString(updated))}
)} {dbc_version != null && (
- {keyValueTemplate("DBC version", dbc_version)} + {keyValueTemplate("DBC Version", dbc_version)}
)}
From a9b040f3457269798ad823867edc231bb14e73de Mon Sep 17 00:00:00 2001 From: das31 <31259710+das31@users.noreply.github.com> Date: Fri, 17 Mar 2023 18:46:41 -0400 Subject: [PATCH 4/6] CEC-3514-add-select-all (#295) --- .../CANSelfServe/SelfServe/index.jsx | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/components/CANSelfServe/SelfServe/index.jsx b/src/components/CANSelfServe/SelfServe/index.jsx index 4dbf59d..3de5740 100644 --- a/src/components/CANSelfServe/SelfServe/index.jsx +++ b/src/components/CANSelfServe/SelfServe/index.jsx @@ -72,9 +72,19 @@ const MainForm = ({ id }) => { }; const handleSelectedItemsChange = (event) => { - setSelectedCanSignals(event.target.value); + const { value } = event.target; + if (value.some(item => item === "Select All")) { + if (selectedCanSignals.length === canSignals.length) { + setSelectedCanSignals([]); + } else { + setSelectedCanSignals(canSignals.map(signal => signal.signal_name)); + } + } else { + setSelectedCanSignals(value); + } }; + return (
@@ -146,7 +156,7 @@ const MainForm = ({ id }) => { - Select CAN signals + Select CAN signals