From c62bfbf916e39af8b4d6840be6a82b5c68c003e6 Mon Sep 17 00:00:00 2001 From: Carter Date: Mon, 24 Feb 2025 11:46:16 -0600 Subject: [PATCH] component page graphs now render --- .../measurementCharts/MultiLineGraph.tsx | 9 +- src/common/NextMeasurementChip.tsx | 94 +++ src/common/time/TimeBar.tsx | 24 +- src/component/ComponentSettings.tsx | 2 - src/component/ComponentTypeChip.tsx | 20 +- src/component/MeasurementSummary.tsx | 16 +- src/interactions/InteractionChip.tsx | 87 +++ src/navigation/Router.tsx | 5 + src/pages/Device.tsx | 5 - src/pages/DeviceComponent.tsx | 684 ++++++++++++++++++ 10 files changed, 908 insertions(+), 38 deletions(-) create mode 100644 src/common/NextMeasurementChip.tsx create mode 100644 src/interactions/InteractionChip.tsx create mode 100644 src/pages/DeviceComponent.tsx diff --git a/src/charts/measurementCharts/MultiLineGraph.tsx b/src/charts/measurementCharts/MultiLineGraph.tsx index 721d54f..6e064e0 100644 --- a/src/charts/measurementCharts/MultiLineGraph.tsx +++ b/src/charts/measurementCharts/MultiLineGraph.tsx @@ -1,9 +1,8 @@ -import { Box, Button, useTheme } from "@material-ui/core"; +import { Box, Button, useTheme } from "@mui/material"; import MaterialChartTooltip from "charts/MaterialChartTooltip"; import moment from "moment"; import { MeasurementDescriber } from "pbHelpers/MeasurementDescriber"; -import { useGlobalState } from "providers"; -import React, { useEffect, useState } from "react"; +import { useEffect, useState } from "react"; import { Legend, Line, @@ -67,7 +66,6 @@ export default function MultiLineGraph(props: Props) { const [refLeft, setRefLeft] = useState(); const [refRight, setRefRight] = useState(); const [xDomain, setXDomain] = useState(["dataMin", "dataMax"]); - const [{ newStructure }] = useGlobalState(); useEffect(() => { if (newXDomain) { @@ -210,8 +208,7 @@ export default function MultiLineGraph(props: Props) { {...props} valueFormatter={value => { return describer.convertWithUnits( - roundTo(parseFloat(String(value)), 2), - newStructure + roundTo(parseFloat(String(value)), 2) ); }} /> diff --git a/src/common/NextMeasurementChip.tsx b/src/common/NextMeasurementChip.tsx new file mode 100644 index 0000000..fb60c85 --- /dev/null +++ b/src/common/NextMeasurementChip.tsx @@ -0,0 +1,94 @@ +import { Chip, Theme, Tooltip } from "@mui/material"; +import { Schedule } from "@mui/icons-material"; +import moment from "moment"; +import { useEffect, useState } from "react"; +import { makeStyles } from "@mui/styles"; +import { yellow } from "@mui/material/colors"; + +const useStyles = makeStyles((theme: Theme) => { + return ({ + notReporting: { + color: theme.palette.text.secondary + }, + reporting: { + color: yellow["900"] + } + }) +}); + +interface Props { + lastMeasurement: string; + periodMs: number; + size?: "small" | "medium"; +} + +export function NextMeasurementChip(props: Props) { + const { lastMeasurement, periodMs, size } = props; + const classes = useStyles(); + const [countdown, setCountdown] = useState(0); + + useEffect(() => { + let timer = setInterval(() => { + if (countdown > 0) { + setCountdown(countdown - 1); + } else { + const now = moment(); + let last = moment(lastMeasurement !== "" ? lastMeasurement : 0); + let diff = now.diff(last, "seconds"); + const periodS = periodMs / 1000.0; + let rem = periodS - diff; + if (rem < 0) rem = 0; + setCountdown(rem); + } + }, 1000); + + return () => clearInterval(timer); + }, [countdown, lastMeasurement, periodMs]); + + const getTooltip = () => { + let tooltip = "Not reporting measurements"; + if (periodMs > 0) { + if (periodMs < 60000) { + tooltip = + "Reports a measurement every " + moment.duration(periodMs, "ms").asSeconds() + " seconds"; + } else { + tooltip = + "Reports a measurement every " + + moment + .duration(periodMs, "ms") + .humanize() + .replace("an ", ""); + } + } + return tooltip; + }; + + const getLabel = () => { + let label = "Not reporting"; + if (periodMs > 0) { + if (countdown < 5) { + label = "Measuring soon"; + } else if (countdown <= 60) { + label = "Measuring in a minute"; + } else { + label = + "Measuring " + + moment() + .utc() + .to(moment.utc().add(countdown, "s")); + } + } + return label; + }; + + return ( + + 0 ? classes.reporting : classes.notReporting} />} + size={size} + /> + + ); +} diff --git a/src/common/time/TimeBar.tsx b/src/common/time/TimeBar.tsx index e3684e1..d089e11 100644 --- a/src/common/time/TimeBar.tsx +++ b/src/common/time/TimeBar.tsx @@ -4,16 +4,18 @@ import { DialogContent, Grid, TextField, + Theme, Typography -} from "@material-ui/core"; -import { createStyles, makeStyles, Theme } from "@material-ui/core/styles"; +} from "@mui/material"; import moment, { Moment } from "moment"; -import { DateRange as DateIcon } from "@material-ui/icons"; +import { DateRange as DateIcon } from "@mui/icons-material"; import React, { useEffect, useState } from "react"; import ResponsiveDialog from "common/ResponsiveDialog"; -import { DateRange, DateRangeDelimiter, StaticDateRangePicker } from "@material-ui/pickers"; +// import { DateRange, DateRangeDelimiter, StaticDateRangePicker } from "@material-ui/pickers"; import { DateRangePreset, GetDefaultDateRange, SetDefaultPreset } from "./DateRange"; import { useThemeType } from "hooks"; +import { makeStyles } from "@mui/styles"; +import dayjs from "dayjs"; interface Props { startDate: Moment; @@ -21,8 +23,11 @@ interface Props { updateDateRange: (start: Moment, end: Moment, live: boolean) => void; } -const useStyles = makeStyles((theme: Theme) => - createStyles({ +// Define a type similar to DateRange +type DateRange = [T | null, T | null]; + +const useStyles = makeStyles((_theme: Theme) => { + return ({ activeButtonLight: { border: "1px solid black" }, @@ -30,7 +35,7 @@ const useStyles = makeStyles((theme: Theme) => border: "1px solid white" } }) -); +}); export default function TimeBar(props: Props) { const { updateDateRange, startDate, endDate } = props; @@ -83,7 +88,7 @@ export default function TimeBar(props: Props) { onClose={() => setDateRangeDialog(false)} aria-labelledby="date-range-dialog"> - setDateRange(date)} @@ -94,7 +99,8 @@ export default function TimeBar(props: Props) { )} - /> + /> */} + DATE PICKER GOES HERE