From ce28af6a69f02abdf036ecb2a6dab1c861355464 Mon Sep 17 00:00:00 2001 From: Ken Hibino Date: Wed, 1 Dec 2021 06:59:14 -0800 Subject: [PATCH] WIP: (ui): Add endtime, duration selector --- ui/src/views/MetricsView.tsx | 263 ++++++++++++++++++++++++++++++++++- 1 file changed, 261 insertions(+), 2 deletions(-) diff --git a/ui/src/views/MetricsView.tsx b/ui/src/views/MetricsView.tsx index b9a1b7d..ea33a8d 100644 --- a/ui/src/views/MetricsView.tsx +++ b/ui/src/views/MetricsView.tsx @@ -3,10 +3,17 @@ import { connect, ConnectedProps } from "react-redux"; import { makeStyles } from "@material-ui/core/styles"; import Container from "@material-ui/core/Container"; import Grid from "@material-ui/core/Grid"; +import Popover from "@material-ui/core/Popover"; +import Typography from "@material-ui/core/Typography"; +import Button from "@material-ui/core/Button"; +import Radio from "@material-ui/core/Radio"; +import RadioGroup from "@material-ui/core/RadioGroup"; +import FormControlLabel from "@material-ui/core/FormControlLabel"; +import FormControl from "@material-ui/core/FormControl"; +import FormLabel from "@material-ui/core/FormLabel"; import { getMetricsAsync } from "../actions/metricsActions"; import { AppState } from "../store"; import { usePolling } from "../hooks"; -import Typography from "@material-ui/core/Typography"; import QueueSizeMetricsChart from "../components/QueueSizeMetricsChart"; const useStyles = makeStyles((theme) => ({ @@ -14,6 +21,31 @@ const useStyles = makeStyles((theme) => ({ paddingTop: theme.spacing(4), paddingBottom: theme.spacing(4), }, + controlsContainer: { + display: "flex", + justifyContent: "flex-end", + }, + controls: {}, + controlSelectorBox: { + display: "flex", + minWidth: 400, + padding: theme.spacing(2), + }, + controlEndTimeSelector: { + width: "50%", + }, + controlDurationSelector: { + width: "50%", + }, + radioButtonRoot: { + paddingTop: theme.spacing(0.5), + paddingBottom: theme.spacing(0.5), + paddingLeft: theme.spacing(1), + paddingRight: theme.spacing(1), + }, + radioButtonLabel: { + fontSize: 14, + }, })); function mapStateToProps(state: AppState) { @@ -31,12 +63,239 @@ type Props = ConnectedProps; function MetricsView(props: Props) { const classes = useStyles(); const { pollInterval, getMetricsAsync, data } = props; + const [anchorEl, setAnchorEl] = React.useState( + null + ); - usePolling(getMetricsAsync, pollInterval); + const [endTimeOption, setEndTimeOption] = React.useState("real_time"); + const [durationOption, setDurationOption] = React.useState("1h"); + const [durationSec, setDurationSec] = React.useState(60 * 60); // 1h + + const handleEndTimeOptionChange = ( + event: React.ChangeEvent + ) => { + setEndTimeOption((event.target as HTMLInputElement).value); + }; + + const handleDurationOptionChange = ( + event: React.ChangeEvent + ) => { + const selected = (event.target as HTMLInputElement).value; + setDurationOption(selected); + switch (selected) { + case "1h": + setDurationSec(60 * 60); + break; + case "6h": + setDurationSec(6 * 60 * 60); + break; + case "1d": + setDurationSec(24 * 60 * 60); + break; + case "8d": + setDurationSec(8 * 24 * 60 * 60); + break; + case "30d": + setDurationSec(30 * 24 * 60 * 60); + break; + case "custom": + // TODO + } + }; + + const handleClick = (event: React.MouseEvent) => { + setAnchorEl(event.currentTarget); + }; + + const handleClose = () => { + setAnchorEl(null); + }; + + const open = Boolean(anchorEl); + const id = open ? "control-popover" : undefined; + + //usePolling(getMetricsAsync, pollInterval); + React.useEffect(() => { + const fetchMetrics = () => getMetricsAsync(); + const id = setInterval(fetchMetrics, pollInterval * 1000); + return () => clearInterval(id); + }, [pollInterval, getMetricsAsync]); return ( + +
+
+ + +
+
+ + End Time + + + } + label="Real Time" + /> + + } + label="Freeze at now" + /> + + } + label="Custom End Time" + /> + + +
+
+ + Duration + + + } + label="1h" + /> + + } + label="6h" + /> + + } + label="1 day" + /> + + } + label="8 days" + /> + + } + label="30 days" + /> + + } + label="Custom Duration" + /> + + +
+
+
+
+
+
Queue Size