From 1ec3058d45b29aca8f349a9f9b4b4b1151c5d28b Mon Sep 17 00:00:00 2001 From: Carter Date: Thu, 8 May 2025 16:45:42 -0600 Subject: [PATCH 01/13] added support page --- src/common/SmartBreadcrumb.tsx | 19 ++- src/device/DeviceActions.tsx | 8 +- src/navigation/Router.tsx | 5 + src/pages/DeviceSupport.tsx | 303 +++++++++++++++++++++++++++++++++ 4 files changed, 333 insertions(+), 2 deletions(-) create mode 100644 src/pages/DeviceSupport.tsx diff --git a/src/common/SmartBreadcrumb.tsx b/src/common/SmartBreadcrumb.tsx index 4d2c176..c931b79 100644 --- a/src/common/SmartBreadcrumb.tsx +++ b/src/common/SmartBreadcrumb.tsx @@ -7,6 +7,7 @@ import { LinkProps, Skeleton, Theme, + Typography, useTheme } from "@mui/material"; import { Replay } from "@mui/icons-material"; @@ -57,6 +58,7 @@ interface Props { paddingTop?: number; paddingBottom?: number; prependPaths?: string[]; + } interface LinkRouterProps extends LinkProps { @@ -289,7 +291,7 @@ export default function SmartBreadcrumb(props: Props) { if (prependPaths) pathnames.splice(pathnames.length - 1, 0, ...prependPaths); - pathnames.forEach((_value: any, index: any) => { + pathnames.forEach((value: any, index: any) => { const lastPath = index === pathnames.length - 1; const to = `/${pathnames.slice(0, index + 1).join("/")}`; @@ -310,6 +312,21 @@ export default function SmartBreadcrumb(props: Props) { links.push(linkComponent(to, label, lastPath)); } + if (value === "support") { + links.push( + + Support + + } + className={classes.chip} + /> + ) + } + }); return links; }; diff --git a/src/device/DeviceActions.tsx b/src/device/DeviceActions.tsx index 152ba70..baf2c49 100644 --- a/src/device/DeviceActions.tsx +++ b/src/device/DeviceActions.tsx @@ -24,7 +24,8 @@ import { AccountCircle as ObjectUsersIcon, SupervisedUserCircle as ObjectTeamsIcon, Sync as SyncDeviceIcon, - Wifi as WifiIcon + Wifi as WifiIcon, + Visibility } from "@mui/icons-material"; import { Skeleton } from "@mui/material"; // import Datadog from "assets/external/datadog.png"; @@ -498,6 +499,11 @@ export default function DeviceActions(props: Props) { const buttons = () => { return ( + {user.allowedTo("provision") && + navigate("support", { state: {device: device} })}> + + + } {canWrite && user.allowedTo("provision") && } {/* {!isShareableLink(match.params.deviceID) && ( */} import("pages/DeviceHistory")); const DevicePage = lazy(() => import("pages/Device")); @@ -103,6 +104,10 @@ export default function Router() { path="/:deviceID" // "/settings/basic" element={} /> + } + /> } diff --git a/src/pages/DeviceSupport.tsx b/src/pages/DeviceSupport.tsx new file mode 100644 index 0000000..961cdaa --- /dev/null +++ b/src/pages/DeviceSupport.tsx @@ -0,0 +1,303 @@ +import { Box, Button, FormControl, Grid2 as Grid, MenuItem, Select, Tab, Tabs, TextField, Typography, useTheme } from "@mui/material"; +import PageContainer from "./PageContainer"; +import { pond } from "protobuf-ts/pond"; +import LogsDisplay from "common/LogsDisplay"; +import { useEffect, useState } from "react"; +import { useDeviceAPI, useSnackbar } from "hooks"; +import { useLocation, useParams } from "react-router-dom"; +import { Device } from "models"; +import { getContextKeys, getContextTypes } from "pbHelpers/Context"; +import SmartBreadcrumb from "common/SmartBreadcrumb"; + +interface TabPanelProps { + children?: React.ReactNode; + index: any; + value: any; +} + +function TabPanelMine(props: TabPanelProps) { + const { children, value, index, ...other } = props; + + return ( + + ); +} + +export default function DeviceSupport() { + const deviceID = +(useParams<{ deviceID: string }>()?.deviceID ?? "0"); + + const deviceAPI = useDeviceAPI() + const snackbar = useSnackbar() + const theme = useTheme() + + const { state } = useLocation(); + const [device, setDevice] = useState(state?.device ? Device.create(state.device) : Device.create()) + const [tabNumber, setTabNumber] = useState(0) + const [newCap, setNewCap] = useState(0); + const [datacap, setDatacap] = useState(); + const [isOver, setIsOver] = useState(undefined); + const [pauseCheck, setPauseCheck] = useState(undefined); + const [inputFirmware, setInputFirmware] = useState(""); + const [platform, setPlatform] = useState( + pond.DevicePlatform.DEVICE_PLATFORM_INVALID + ); + + useEffect(() => { + if (state?.device) return + deviceAPI.get(deviceID, undefined, getContextKeys(), getContextTypes()).then(resp => { + setDevice(Device.create(resp.data)) + }) + }, [deviceID, state?.device]) + + const handleChange = (_event: React.ChangeEvent<{}>, newValue: number) => { + setTabNumber(newValue); + }; + + const resetQuackCount = () => { + deviceAPI.resetQuackCount(device.id()).then(resp => console.log(resp)); + }; + + const resetQuackCountTx = () => { + deviceAPI.resetQuackCountTx(device.id()).then(resp => console.log(resp)); + }; + + const resetQuackCountTx1000 = () => { + deviceAPI.resetQuackCountTx1000(device.id()).then(resp => console.log(resp)); + }; + + const clearPending = () => { + deviceAPI.clearPending(device.id()).then(resp => { + console.log(resp); + }); + }; + + const setFirmwareVersion = (firmwareVersion: string) => { + let status = device.status; + status.firmwareVersion = firmwareVersion; + deviceAPI.updateStatus(device.id(), status).then(() => { + snackbar.info("Firmware version set to " + firmwareVersion); + }); + }; + + const updateDevicePlatform = (firmwareVersion: pond.DevicePlatform) => { + let settings = device.settings; + settings.platform = firmwareVersion; + deviceAPI.update(device.id(), settings).then(() => { + snackbar.info("Platform set to " + firmwareVersion.toString()); + }); + }; + + const getDatacap = () => { + deviceAPI.getDatacap(device.id()).then(resp => { + //console.log(resp); + setDatacap(resp.data.overlimit); + }); + }; + + const updateDatacap = () => { + deviceAPI.setDatacap(device.id(), newCap).then(resp => { + console.log(resp); + }); + }; + + const checkLimit = () => { + deviceAPI.isOverLimit(device.id()).then(resp => { + //console.log(resp); + setIsOver(resp.data); + }); + }; + + const checkIfPaused = () => { + deviceAPI.isPaused(device.id()).then(resp => { + //console.log(resp); + setPauseCheck(resp.data); + }); + }; + + const pauseDevice = () => { + deviceAPI.pause(device.id()).then(resp => { + console.log(resp); + }); + }; + + const resumeDevice = () => { + deviceAPI.resume(device.id()).then(resp => { + console.log(resp); + }); + }; + + return ( + + + + + + + + + + + + General Options: + + + + + + + + + + + + + + setInputFirmware(e.currentTarget.value)} + /> + + + + + + + + + + + + + + + OPI Cable Functions: + + + + + + + + + + + + + + + + setNewCap(+e.target.value)} + /> + + + + + + + + + + + {datacap && datacap / 1000 / 1000}Mb + + + + + + + + + {isOver === undefined ? "Click to Check" : isOver ? "Over Limit" : "Under Limit"} + + + + + + + + + + {pauseCheck === undefined ? "Click to Check" : pauseCheck ? "Paused" : "Running"} + + + + + + + + + + + + History Not imported yet + {/* */} + + + ) +} \ No newline at end of file From 61bdff0cef483b809911dcb0b8a89377daf49cf0 Mon Sep 17 00:00:00 2001 From: Carter Date: Mon, 12 May 2025 10:14:31 -0600 Subject: [PATCH 02/13] smart bread crumbs can be given a navigation state --- src/common/SmartBreadcrumb.tsx | 10 ++++++---- src/common/StatusSen5x.tsx | 4 ++-- src/pages/Device.tsx | 8 +++++++- src/pages/DeviceSupport.tsx | 2 +- 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/common/SmartBreadcrumb.tsx b/src/common/SmartBreadcrumb.tsx index c931b79..be1d0fe 100644 --- a/src/common/SmartBreadcrumb.tsx +++ b/src/common/SmartBreadcrumb.tsx @@ -12,7 +12,7 @@ import { } from "@mui/material"; import { Replay } from "@mui/icons-material"; import { useMobile } from "hooks"; -import { ReactNode, useEffect, useRef } from "react"; +import { ReactNode } from "react"; import { useLocation } from "react-router"; import { Link as RouterLink } from "react-router-dom"; import { or } from "utils/types"; @@ -58,12 +58,13 @@ interface Props { paddingTop?: number; paddingBottom?: number; prependPaths?: string[]; - + state?: any; } interface LinkRouterProps extends LinkProps { to: string; replace?: boolean; + state?: any; } const LinkRouter = (props: LinkRouterProps) => ; @@ -74,7 +75,7 @@ export default function SmartBreadcrumb(props: Props) { const location = useLocation(); const isMobile = useMobile(); const classes = useStyles(); - const { loading, reload } = props; + const { loading, reload, state } = props; const groupID = (): string => { let index = prependPaths?.indexOf("groups") @@ -316,7 +317,7 @@ export default function SmartBreadcrumb(props: Props) { links.push( Support @@ -341,6 +342,7 @@ export default function SmartBreadcrumb(props: Props) { color={lastPath ? "textPrimary" : "textSecondary"} variant="subtitle1" to={to} + state={state} sx={{ '&:hover': { color: getThemeType() === "dark" ? 'white' : "black" }}} className={classes.textOverflow}> {label} diff --git a/src/common/StatusSen5x.tsx b/src/common/StatusSen5x.tsx index 262f595..912f128 100644 --- a/src/common/StatusSen5x.tsx +++ b/src/common/StatusSen5x.tsx @@ -176,12 +176,12 @@ export default function StatusPlenum(props: Props) { > - {device.status.sen5x?.voc.toFixed(1)}% + V: {device.status.sen5x?.voc.toFixed(1)}% - {device.status.sen5x?.nox.toFixed(1)}% + N: {device.status.sen5x?.nox.toFixed(1)}% diff --git a/src/pages/Device.tsx b/src/pages/Device.tsx index 702285e..9282a50 100644 --- a/src/pages/Device.tsx +++ b/src/pages/Device.tsx @@ -30,6 +30,7 @@ export default function DevicePage() { const groupID = useParams<{ groupID: string }>()?.groupID ?? ""; const { state } = useLocation(); const [{ as, team, user }] = useGlobalState() + // console.log(state) const [device, setDevice] = useState(state?.device ? Device.create(state.device) : Device.create()) const [loading, setLoading] = useState(false) const [permissions, setPermissions] = useState([]) @@ -54,6 +55,11 @@ export default function DevicePage() { const loadDevice = () => { // console.log("load device page data") if (loading) return + console.log(state) + if (state?.device) { + console.log(Device.create(state.device)) + return + } setLoading(true) deviceAPI.getPageData(deviceID, getContextKeys(), getContextTypes(), as).then(resp => { let device = Device.any(resp.data.device) @@ -418,7 +424,7 @@ export default function DevicePage() { - + - + Date: Tue, 13 May 2025 10:52:40 -0600 Subject: [PATCH 03/13] support page caches page data to the bread crumbs for quick navigation back to device page --- src/device/DeviceActions.tsx | 18 ++++++++++++++++-- src/pages/Device.tsx | 22 ++++++++++++++++++---- src/pages/DeviceSupport.tsx | 35 +++++++++++++++++++++++++++-------- 3 files changed, 61 insertions(+), 14 deletions(-) diff --git a/src/device/DeviceActions.tsx b/src/device/DeviceActions.tsx index baf2c49..d988f7b 100644 --- a/src/device/DeviceActions.tsx +++ b/src/device/DeviceActions.tsx @@ -48,7 +48,7 @@ import { Component, Device, deviceScope, Interaction } from "models"; // import { isShareableLink } from "pbHelpers/Device"; import { pond } from "protobuf-ts/pond"; import { useGlobalState } from "providers"; -import React, { useState } from "react"; +import React, { useEffect, useState } from "react"; // import { useHistory, useRouteMatch } from "react-router"; import { isOffline } from "utils/environment"; import { or } from "utils/types"; @@ -72,6 +72,7 @@ import Connection from "./Connection"; import ComponentOrder from "component/ComponentOrder"; import ArcGISDeviceData from "./ArcGISDeviceData"; import UpgradeDevice from "./UpgradeDevice"; +import { DevicePageData } from "pages/Device"; const useStyles = makeStyles((_theme: Theme) => { // const isMobile = useMobile() @@ -170,6 +171,19 @@ export default function DeviceActions(props: Props) { isJsonDataDialogOpen: false }); + const [devicePageData, setDevicePageData] = useState(undefined); + + useEffect(() => { + let newPageData: DevicePageData = { + device: device, + components: components, + interactions: interactions, + preferences: preferences, + permissions: permissions, + } + setDevicePageData(newPageData) + }, [device, components, interactions, preferences, permissions]) + const openDialog = (target: keyof DialogState) => { let updatedDialogState = cloneDeep(dialogState); updatedDialogState[target] = true; @@ -500,7 +514,7 @@ export default function DeviceActions(props: Props) { return ( {user.allowedTo("provision") && - navigate("support", { state: {device: device} })}> + navigate("support", { state: {device: device, devicePageData: devicePageData }})}> } diff --git a/src/pages/Device.tsx b/src/pages/Device.tsx index 9282a50..2a03a10 100644 --- a/src/pages/Device.tsx +++ b/src/pages/Device.tsx @@ -22,6 +22,15 @@ import { or } from "utils"; import ComponentDiagnostics from "component/ComponentDiagnostics"; import DeviceWizard from "device/DeviceWizard"; +export interface DevicePageData { + device: Device; + components: Component[]; + interactions: Interaction[]; + permissions: pond.Permission[]; + preferences: pond.DevicePreferences; + // componentPreferences: Map +} + export default function DevicePage() { const deviceAPI = useDeviceAPI() const snackbar = useSnackbar() @@ -52,16 +61,21 @@ export default function DevicePage() { const [addComponentManualDialogOpen, setAddComponentManualDialogOpen] = useState(false) + // const [devicePageData, setDevicePageData] = useState(pond.GetDevicePageDataResponse.create()) + const loadDevice = () => { - // console.log("load device page data") if (loading) return - console.log(state) - if (state?.device) { - console.log(Device.create(state.device)) + if (state?.devicePageData) { + setDevice(Device.create(state.devicePageData.device)) + setComponents(state.devicePageData.components.map((comp: pond.Component) => Component.create(comp))) + setInteractions(state.devicePageData.interactions.map((inter: pond.Interaction) => Interaction.create(inter))) + setPreferences(state.devicePageData.preferences) + setPermissions(state.devicePageData.permissions) return } setLoading(true) deviceAPI.getPageData(deviceID, getContextKeys(), getContextTypes(), as).then(resp => { + // setDevicePageData(resp.data) let device = Device.any(resp.data.device) // console.log(resp.data.device) setDevice(device) diff --git a/src/pages/DeviceSupport.tsx b/src/pages/DeviceSupport.tsx index a241223..4e47a07 100644 --- a/src/pages/DeviceSupport.tsx +++ b/src/pages/DeviceSupport.tsx @@ -5,9 +5,10 @@ import LogsDisplay from "common/LogsDisplay"; import { useEffect, useState } from "react"; import { useDeviceAPI, useSnackbar } from "hooks"; import { useLocation, useParams } from "react-router-dom"; -import { Device } from "models"; +import { Component, Device, Interaction } from "models"; import { getContextKeys, getContextTypes } from "pbHelpers/Context"; import SmartBreadcrumb from "common/SmartBreadcrumb"; +import { DevicePageData } from "./Device"; interface TabPanelProps { children?: React.ReactNode; @@ -37,7 +38,8 @@ export default function DeviceSupport() { const theme = useTheme() const { state } = useLocation(); - const [device, setDevice] = useState(state?.device ? Device.create(state.device) : Device.create()) + const [device, setDevice] = useState(Device.create()) + const [devicePageData, setDevicePageData] = useState(state?.devicePageData ? state.devicePageData : undefined) const [tabNumber, setTabNumber] = useState(0) const [newCap, setNewCap] = useState(0); const [datacap, setDatacap] = useState(); @@ -48,12 +50,29 @@ export default function DeviceSupport() { pond.DevicePlatform.DEVICE_PLATFORM_INVALID ); - useEffect(() => { - if (state?.device) return - deviceAPI.get(deviceID, undefined, getContextKeys(), getContextTypes()).then(resp => { - setDevice(Device.create(resp.data)) + // useEffect(() => { + // if (state?.device) return + // deviceAPI.get(deviceID, undefined, getContextKeys(), getContextTypes()).then(resp => { + // setDevice(Device.create(resp.data)) + // }) + // }, [deviceID, state?.device]) + + useEffect(() => { + if (state?.devicePageData) { + setDevice(Device.create(state?.devicePageData.device)) + return + } + deviceAPI.getPageData(deviceID, getContextKeys(), getContextTypes()).then(resp => { + setDevice(resp.data?.device ? Device.create(resp.data?.device) : Device.create()) + setDevicePageData({ + device: resp.data.device ? Device.create(resp.data.device) : Device.create(), + components: resp.data.components.map(comp => Component.create(comp)), + interactions: resp.data.interactions.map(interaction => Interaction.create(interaction)), + permissions: resp.data.permissions, + preferences: resp.data.user?.preferences as pond.DevicePreferences + }) }) - }, [deviceID, state?.device]) + }, [deviceID, state?.devicePageData]) const handleChange = (_event: React.ChangeEvent<{}>, newValue: number) => { setTabNumber(newValue); @@ -134,7 +153,7 @@ export default function DeviceSupport() { return ( - + Date: Tue, 13 May 2025 11:46:44 -0600 Subject: [PATCH 04/13] added device actions to support page --- src/device/DeviceActions.tsx | 6 +++- src/pages/DeviceSupport.tsx | 66 ++++++++++++++++++++++++++++++++++-- 2 files changed, 69 insertions(+), 3 deletions(-) diff --git a/src/device/DeviceActions.tsx b/src/device/DeviceActions.tsx index d988f7b..8356b6a 100644 --- a/src/device/DeviceActions.tsx +++ b/src/device/DeviceActions.tsx @@ -510,10 +510,14 @@ export default function DeviceActions(props: Props) { ); }; + const showSupport = () => { + return user.allowedTo("provision") && !location.pathname.includes("support") + } + const buttons = () => { return ( - {user.allowedTo("provision") && + {showSupport() && navigate("support", { state: {device: device, devicePageData: devicePageData }})}> diff --git a/src/pages/DeviceSupport.tsx b/src/pages/DeviceSupport.tsx index 4e47a07..2e873e6 100644 --- a/src/pages/DeviceSupport.tsx +++ b/src/pages/DeviceSupport.tsx @@ -9,6 +9,11 @@ import { Component, Device, Interaction } from "models"; import { getContextKeys, getContextTypes } from "pbHelpers/Context"; import SmartBreadcrumb from "common/SmartBreadcrumb"; import { DevicePageData } from "./Device"; +import AddComponentManualDialog from "component/AddComponentManualDialog"; +import { useGlobalState } from "providers"; +import DeviceActions from "device/DeviceActions"; +import { cloneDeep } from "lodash"; +import { FindAvailablePositions } from "pbHelpers/DeviceAvailability"; interface TabPanelProps { children?: React.ReactNode; @@ -38,6 +43,7 @@ export default function DeviceSupport() { const theme = useTheme() const { state } = useLocation(); + const [{ user, as }] = useGlobalState() const [device, setDevice] = useState(Device.create()) const [devicePageData, setDevicePageData] = useState(state?.devicePageData ? state.devicePageData : undefined) const [tabNumber, setTabNumber] = useState(0) @@ -49,6 +55,8 @@ export default function DeviceSupport() { const [platform, setPlatform] = useState( pond.DevicePlatform.DEVICE_PLATFORM_INVALID ); + const [addComponentManualDialogOpen, setAddComponentManualDialogOpen] = useState(false) + const [loading, setLoading] = useState(false) // useEffect(() => { // if (state?.device) return @@ -62,6 +70,7 @@ export default function DeviceSupport() { setDevice(Device.create(state?.devicePageData.device)) return } + setLoading(true) deviceAPI.getPageData(deviceID, getContextKeys(), getContextTypes()).then(resp => { setDevice(resp.data?.device ? Device.create(resp.data?.device) : Device.create()) setDevicePageData({ @@ -71,7 +80,9 @@ export default function DeviceSupport() { permissions: resp.data.permissions, preferences: resp.data.user?.preferences as pond.DevicePreferences }) - }) + }).finally(() => { + setLoading(false) + }) }, [deviceID, state?.devicePageData]) const handleChange = (_event: React.ChangeEvent<{}>, newValue: number) => { @@ -151,9 +162,47 @@ export default function DeviceSupport() { }); }; + const toggleNotificationPreference = () => { + let updatedPreferences = cloneDeep(devicePageData.preferences); + updatedPreferences.notify = !devicePageData.preferences.notify; + let updatedDevicePageData = cloneDeep(devicePageData) + updatedDevicePageData.preferences = updatedPreferences + deviceAPI + .updatePreferences(deviceID, updatedPreferences, getContextKeys(), getContextTypes(), as) + .then(() => setDevicePageData(updatedDevicePageData)) + .catch(() => { + snackbar.error( + "Error occured while " + + (devicePageData.preferences.notify ? "enabling" : "disabling") + + " notifications" + ); + }); + }; + return ( - + + + + + + + {}} + availablePositions={new Map()} + availableOffsets={new Map()} + components={[...devicePageData.components.map(comp => Component.any(comp))]} + interactions={devicePageData.interactions.map(inter => Interaction.any(inter))} + /> + + + {/* */} + + + setAddComponentManualDialogOpen(false)} + /> + {user.hasFeature("developer") === true && + + } + Date: Tue, 13 May 2025 11:48:53 -0600 Subject: [PATCH 05/13] available positions is known to device actions in support page --- src/pages/Device.tsx | 12 ------------ src/pages/DeviceSupport.tsx | 2 +- 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/src/pages/Device.tsx b/src/pages/Device.tsx index 2a03a10..911e9f0 100644 --- a/src/pages/Device.tsx +++ b/src/pages/Device.tsx @@ -441,16 +441,6 @@ export default function DevicePage() { - setAddComponentManualDialogOpen(false)} - /> - {user.hasFeature("developer") === true && - - } {}} - availablePositions={new Map()} + availablePositions={FindAvailablePositions(devicePageData.components, device.settings.product).availability} availableOffsets={new Map()} components={[...devicePageData.components.map(comp => Component.any(comp))]} interactions={devicePageData.interactions.map(inter => Interaction.any(inter))} From f72f5cd1063504f5f3b15e5c97420a86015d6d05 Mon Sep 17 00:00:00 2001 From: Carter Date: Tue, 13 May 2025 12:02:51 -0600 Subject: [PATCH 06/13] shows loading screen if devicePageData has not loaded in yet --- src/pages/DeviceSupport.tsx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/pages/DeviceSupport.tsx b/src/pages/DeviceSupport.tsx index c540fc0..4cccac6 100644 --- a/src/pages/DeviceSupport.tsx +++ b/src/pages/DeviceSupport.tsx @@ -14,6 +14,7 @@ import { useGlobalState } from "providers"; import DeviceActions from "device/DeviceActions"; import { cloneDeep } from "lodash"; import { FindAvailablePositions } from "pbHelpers/DeviceAvailability"; +import LoadingScreen from "app/LoadingScreen"; interface TabPanelProps { children?: React.ReactNode; @@ -179,6 +180,12 @@ export default function DeviceSupport() { }); }; + if (!devicePageData) { + return ( + + ) + } + return ( From 5403fe33922ca63c7ce1203484f30af4936c4f4c Mon Sep 17 00:00:00 2001 From: csawatzky Date: Wed, 14 May 2025 08:51:50 -0600 Subject: [PATCH 07/13] changing background colour of highlighted/toggled button --- src/common/ButtonGroup.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/common/ButtonGroup.tsx b/src/common/ButtonGroup.tsx index f23bc0a..f1d80f4 100644 --- a/src/common/ButtonGroup.tsx +++ b/src/common/ButtonGroup.tsx @@ -72,14 +72,14 @@ const useStyles = makeStyles((theme: Theme) => { marginLeft: theme.spacing(0.05), marginRight: theme.spacing(0.05), "&:hover": { - backgroundColor: getSecondaryColour(), //use the colour of the whitelabel - //backgroundColor: "gold", + //backgroundColor: getSecondaryColour(), //use the colour of the whitelabel + backgroundColor: "gold", //for now Dustin just wants it to be gold color: "black", } }, buttonToggled: { - backgroundColor: getSecondaryColour(), //use the colour of the whitelabel - //backgroundColor: "gold", + //backgroundColor: getSecondaryColour(), //use the colour of the whitelabel + backgroundColor: "gold", //for now Dustin just wants it to be gold color: "black", borderRadius: 24, fontWeight: "bold" From a8feca1d7562fd14c3b504501c06410ced7219c3 Mon Sep 17 00:00:00 2001 From: Carter Date: Wed, 14 May 2025 10:01:14 -0600 Subject: [PATCH 08/13] added device overview to the device support page --- src/pages/DeviceSupport.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/pages/DeviceSupport.tsx b/src/pages/DeviceSupport.tsx index 4cccac6..20bf476 100644 --- a/src/pages/DeviceSupport.tsx +++ b/src/pages/DeviceSupport.tsx @@ -15,6 +15,7 @@ import DeviceActions from "device/DeviceActions"; import { cloneDeep } from "lodash"; import { FindAvailablePositions } from "pbHelpers/DeviceAvailability"; import LoadingScreen from "app/LoadingScreen"; +import DeviceOverview from "device/DeviceOverview"; interface TabPanelProps { children?: React.ReactNode; @@ -190,10 +191,9 @@ export default function DeviceSupport() { - + - {/* */} + +
Date: Wed, 14 May 2025 12:28:35 -0600 Subject: [PATCH 09/13] running staging locally now returns the staging whitelabel --- package.json | 2 +- src/services/whiteLabel.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index efb9aa8..8e3ebd3 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "start": "VITE_AUTH0_CLIENT_ID=5pUCkl2SfogkWmM244UDcLEUOp8EFdHd VITE_AUTH0_AUDIENCE=api.brandxtech.ca VITE_APP_API_URL=https://api.brandxtech.ca/v1 VITE_APP_WS_URL=ws://api.brandxtech.ca/v1/live vite", "start-local": "VITE_AUTH0_CLIENT_ID=dzJTpqIeMA4Rwk4xujtwPbAO3TY32bM1 VITE_AUTH0_AUDIENCE=bxt-dev.api.adaptiveagriculture.ca VITE_APP_API_URL=http://localhost:50052/v1 VITE_APP_WS_URL=ws://localhost:50052/v1/live VITE_APP_BILLING_URL=http://localhost:50053/v1 VITE_APP_RECLUSE_URL=http://localhost:50054/v1 VITE_APP_GITLAB_URL=http://localhost:50055/v1 vite", "start-dev": "VITE_AUTH0_CLIENT_ID=dzJTpqIeMA4Rwk4xujtwPbAO3TY32bM1 VITE_APP_API_URL=https://bxt-dev.api.adaptiveagriculture.ca/v1 VITE_AUTH0_CLIENT_DOMAIN=brandxtech.auth0.com VITE_AUTH0_AUDIENCE=bxt-dev.api.adaptiveagriculture.ca VITE_AUTH0_DEV_CLIENT_ID=dzJTpqIeMA4Rwk4xujtwPbAO3TY32bM1 vite", - "start-staging": "VITE_AUTH0_CLIENT_ID=3ib460VvLwdeyse5iUSQfxkVdQaUmphP VITE_AUTH0_AUDIENCE=stagingapi.brandxtech.ca VITE_AUTH0_CLIENT_DOMAIN=adaptivestaging.us.auth0.com VITE_APP_API_URL=https://stagingapi.brandxtech.ca/v1 VITE_APP_WS_URL=ws://stagingapi.brandxtech.ca/v1/live VITE_APP_AUTH0_CLIENT_DOMAIN=adaptivestaging.us.auth0.com VITE_APP_AUTH0_AUDIENCE=stagingapi.brandxtech.ca vite", + "start-staging": "VITE_LOCAL_STAGING=true VITE_AUTH0_CLIENT_ID=3ib460VvLwdeyse5iUSQfxkVdQaUmphP VITE_AUTH0_AUDIENCE=stagingapi.brandxtech.ca VITE_AUTH0_CLIENT_DOMAIN=adaptivestaging.us.auth0.com VITE_APP_API_URL=https://stagingapi.brandxtech.ca/v1 VITE_APP_WS_URL=ws://stagingapi.brandxtech.ca/v1/live VITE_APP_AUTH0_CLIENT_DOMAIN=adaptivestaging.us.auth0.com VITE_APP_AUTH0_AUDIENCE=stagingapi.brandxtech.ca vite", "build": "tsc -b && vite build", "lint": "eslint .", "preview": "vite preview", diff --git a/src/services/whiteLabel.ts b/src/services/whiteLabel.ts index 22de3bf..34b2fec 100644 --- a/src/services/whiteLabel.ts +++ b/src/services/whiteLabel.ts @@ -276,7 +276,7 @@ export function getWhitelabel(): WhiteLabel { if (window.location.origin.includes("bxt-dev")) { return BXT_WHITE_LABEL; } - if (window.location.origin.includes("staging")) { + if (window.location.origin.includes("staging") || import.meta.env.VITE_LOCAL_STAGING=='true') { return STAGING_WHITELABEL; } const whiteLabelKeys = Array.from(whitelabels.keys()); From 19c741a5f83a2b2470862f3ccc37abeeaf40d592 Mon Sep 17 00:00:00 2001 From: Carter Date: Wed, 14 May 2025 12:41:31 -0600 Subject: [PATCH 10/13] replacing title by id based on whiteLabel name --- index.html | 2 +- src/app/App.tsx | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/index.html b/index.html index da05f1e..31b4ca1 100644 --- a/index.html +++ b/index.html @@ -4,7 +4,7 @@ - Adaptive Dashboard + Adaptive Dashboard diff --git a/src/app/App.tsx b/src/app/App.tsx index 46e7121..efd014b 100644 --- a/src/app/App.tsx +++ b/src/app/App.tsx @@ -37,6 +37,13 @@ function App() { faviconDocument.href = "BrandXTechnologies/favicon.ico" }) + // Set favicon + const titleDocument = document.getElementById("title-id") as HTMLLinkElement; + if (titleDocument) { + console.log(whiteLabel.name) + titleDocument.href = whiteLabel.name; + } + let domain: string | undefined = import.meta.env.VITE_AUTH0_CLIENT_DOMAIN; let audience: string | undefined = import.meta.env.VITE_AUTH0_AUDIENCE; From 188a2f2023816405f2b4f3806f23ec4f18acdde8 Mon Sep 17 00:00:00 2001 From: Carter Date: Wed, 14 May 2025 12:49:20 -0600 Subject: [PATCH 11/13] replacing title instead of href --- src/app/App.tsx | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/app/App.tsx b/src/app/App.tsx index efd014b..ceb1a41 100644 --- a/src/app/App.tsx +++ b/src/app/App.tsx @@ -37,12 +37,9 @@ function App() { faviconDocument.href = "BrandXTechnologies/favicon.ico" }) - // Set favicon + // Set title const titleDocument = document.getElementById("title-id") as HTMLLinkElement; - if (titleDocument) { - console.log(whiteLabel.name) - titleDocument.href = whiteLabel.name; - } + if (titleDocument) titleDocument.title = whiteLabel.name; let domain: string | undefined = import.meta.env.VITE_AUTH0_CLIENT_DOMAIN; let audience: string | undefined = import.meta.env.VITE_AUTH0_AUDIENCE; From ad10fc0d66f8c8d79ed0a489f38acd397e9911d5 Mon Sep 17 00:00:00 2001 From: Carter Date: Wed, 14 May 2025 12:50:14 -0600 Subject: [PATCH 12/13] made staging white label have unique title --- src/services/whiteLabel.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/whiteLabel.ts b/src/services/whiteLabel.ts index 34b2fec..d14ab51 100644 --- a/src/services/whiteLabel.ts +++ b/src/services/whiteLabel.ts @@ -70,7 +70,7 @@ interface WhiteLabel { // }; const STAGING_WHITELABEL: WhiteLabel = { - name: import.meta.env.VITE_APP_WEBSITE_TITLE, + name: "Staging", primaryColour: import.meta.env.VITE_APP_PRIMARY_COLOUR, secondaryColour: import.meta.env.VITE_APP_SECONDARY_COLOUR, signatureColour: import.meta.env.VITE_APP_SIGNATURE_COLOUR, From 4bd66d3d24973653ec848dbbfff2974e40f7d9e8 Mon Sep 17 00:00:00 2001 From: Carter Date: Wed, 14 May 2025 13:50:01 -0600 Subject: [PATCH 13/13] added manifest for staging, title actually gets set based on whiteLabel name now --- public/Staging/android-chrome-192x192.png | Bin 0 -> 6258 bytes public/Staging/android-chrome-512x512.png | Bin 0 -> 15659 bytes public/Staging/apple-touch-icon.png | Bin 0 -> 5815 bytes public/Staging/browserconfig.xml | 9 + public/Staging/favicon-16x16.png | Bin 0 -> 1351 bytes public/Staging/favicon-32x32.png | Bin 0 -> 1952 bytes public/Staging/favicon.ico | Bin 0 -> 15086 bytes public/Staging/manifest.json | 26 + public/Staging/mstile-150x150.png | Bin 0 -> 4970 bytes public/Staging/safari-pinned-tab.svg | 2198 +++++++++++++++++++++ src/app/App.tsx | 5 +- 11 files changed, 2236 insertions(+), 2 deletions(-) create mode 100644 public/Staging/android-chrome-192x192.png create mode 100644 public/Staging/android-chrome-512x512.png create mode 100644 public/Staging/apple-touch-icon.png create mode 100644 public/Staging/browserconfig.xml create mode 100644 public/Staging/favicon-16x16.png create mode 100644 public/Staging/favicon-32x32.png create mode 100644 public/Staging/favicon.ico create mode 100644 public/Staging/manifest.json create mode 100644 public/Staging/mstile-150x150.png create mode 100644 public/Staging/safari-pinned-tab.svg diff --git a/public/Staging/android-chrome-192x192.png b/public/Staging/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..cbd70d4c9cf93f58d6d8cbcd3475829fde264099 GIT binary patch literal 6258 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 literal 0 HcmV?d00001 diff --git a/public/Staging/browserconfig.xml b/public/Staging/browserconfig.xml new file mode 100644 index 0000000..d416bc5 --- /dev/null +++ b/public/Staging/browserconfig.xml @@ -0,0 +1,9 @@ + + + + + + #ffffff + + + diff --git a/public/Staging/favicon-16x16.png b/public/Staging/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..aa87654272c2f513661dd4c586955cbbb74fb11a GIT binary patch literal 1351 zcma)4YfO_@7=EB4R~-ryL8c9Nxt0O~1u?}IT1pF)a@TT)G^1Fdn?f*SM3gbi;!qI* zCt+h_Q=Bp(IyVF=w}K#r%Btdps6aBdkuVjJ?tJ^R?8lOwyx;qt%lAI#d7hk4VnvY~ z%q^!$l3)#Sx&&*ddjmVmw%@YfOQWv27D6m4d%IAO& z7{EdXz&Z=qC>n3Xg#w0dvC$GP2J|rB2H7GYM$mCcA0tTvy`D58wht*!VL(IdAguim z-h!B6@P7i$1W~_7(9w0(ZS~=%Ji`EMe!=4hrv3B*a^7gfb%2R z?U2mE%nrPtvG-drk3sqn(iun}QIViV`V(rBPB`3ww;U-GNS#Lf5SXRZ(Y^-=I|Z6C z67M2u3W*v-UP6ivQP;4Q1<5!h6NpiPc?2mBkT8k3VR#n&Eo1<3qu{nvIrI!ntRNbI zXc)qNh=vgH1MDNH-y&KexD7!+rOs1H?eKfSS7CPxHabJ7M$~O^x+vO2QPcp!ufRzP z!4UYjv8N4tuYq?9q0JDEQnp0ggi{73nILel!>A&ta+r2c{=Et2mcndE88s00n-?oft^$0#de)QB0Ov=fHW0~BW>marluBfIr_ zy?p5FAp-t|QY@n0-TxdrPBb<0Q_eS4JD4^NZlh1$aM-DP`(ed%v2119$>YhJ&n-4~ z)YPfHL*|y2f6Fs8s90P3%KE*jnXs_==Yf`8Z5E0*&tJUE@_F>8TCp zecGQdOV){(|A=uIeY@7@WY(tI;ZRmpRVAi*R#XPd3}5pJKZ7hmB&X{kLh{MNSjiW1 zjc3A8h_z<+I+( zPcL4yoh~S_@#*Zyf1yaes;qCZ3Zc2yb*Pu#Z7*Eh?vZ%7w4~Ti@%yV+?fb3|kA1Yf zFlF%ZO?wObvQ>7^``Tki+xOdS+1_Jd{n)aqrdrya+1Gz|I*9!}j>neuwh9||xw@DZ zmm6_7wejVKX=05^)nmAM-nQWu-A}ODiSFFg)FBfT&YTgxHez12wz&s>>u(jNol8qi(CGr@^K+8ixrG_6=Kj6Qtznr@ zJI~8&UHqc!S@M;d`i>xf|NOD~up^71uw$fGIPR|260@9@++<}=rZSh6U6e}-m<-=w zFNVLDZ=i(9Uw{ zlNIFBl_iQ?x=f+W1`apQE?JlyOmuS_j!}>BpNTT=$NC~qv-Y*H?T2b?BXfX@|i+QTy{{sJ3@&UXL+ literal 0 HcmV?d00001 diff --git a/public/Staging/favicon-32x32.png b/public/Staging/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..a606ca025527135e98fd0db56d554ed712a1081d GIT binary patch literal 1952 zcmV;R2VeM!P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 X3dB!JXxBOP4CS&+Dj{`VW8MD&xK9c1 literal 0 HcmV?d00001 diff --git a/public/Staging/manifest.json b/public/Staging/manifest.json new file mode 100644 index 0000000..aad40f6 --- /dev/null +++ b/public/Staging/manifest.json @@ -0,0 +1,26 @@ +{ + "name": "Brand X Technologies", + "short_name": "BXT", + "icons": [ + { + "src": "favicon.ico", + "sizes": "48x48", + "type": "image/x-icon" + }, + { + "src": "android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "start_url": "/", + "theme_color": "#272727", + "background_color": "#424242", + "display": "standalone", + "orientation": "any" +} diff --git a/public/Staging/mstile-150x150.png b/public/Staging/mstile-150x150.png new file mode 100644 index 0000000000000000000000000000000000000000..e91210aaf9c105826b36ea74212f29222a041407 GIT binary patch literal 4970 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 + + + +Created by potrace 1.11, written by Peter Selinger 2001-2013 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/app/App.tsx b/src/app/App.tsx index ceb1a41..16bb781 100644 --- a/src/app/App.tsx +++ b/src/app/App.tsx @@ -38,8 +38,9 @@ function App() { }) // Set title - const titleDocument = document.getElementById("title-id") as HTMLLinkElement; - if (titleDocument) titleDocument.title = whiteLabel.name; + const titleElement = document.getElementById("title-id") as HTMLElement; + if (titleElement) titleElement.textContent = whiteLabel.name; + let domain: string | undefined = import.meta.env.VITE_AUTH0_CLIENT_DOMAIN; let audience: string | undefined = import.meta.env.VITE_AUTH0_AUDIENCE;