mirror of
https://github.com/hibiken/asynqmon.git
synced 2025-10-26 00:06:13 +08:00
(ui): Add shift button functionality
This commit is contained in:
@@ -105,6 +105,11 @@ const useStyles = makeStyles((theme) => ({
|
|||||||
},
|
},
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
// minute, hour, day in seconds
|
||||||
|
const minute = 60;
|
||||||
|
const hour = 60 * minute;
|
||||||
|
const day = 24 * hour;
|
||||||
|
|
||||||
function getInitialState(endTimeSec: number, durationSec: number): State {
|
function getInitialState(endTimeSec: number, durationSec: number): State {
|
||||||
let endTimeOption: EndTimeOption = "real_time";
|
let endTimeOption: EndTimeOption = "real_time";
|
||||||
let customEndTime = "";
|
let customEndTime = "";
|
||||||
@@ -122,19 +127,19 @@ function getInitialState(endTimeSec: number, durationSec: number): State {
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch (durationSec) {
|
switch (durationSec) {
|
||||||
case 60 * 60:
|
case 1 * hour:
|
||||||
durationOption = "1h";
|
durationOption = "1h";
|
||||||
break;
|
break;
|
||||||
case 6 * 60 * 60:
|
case 6 * hour:
|
||||||
durationOption = "6h";
|
durationOption = "6h";
|
||||||
break;
|
break;
|
||||||
case 24 * 60 * 60:
|
case 1 * day:
|
||||||
durationOption = "1d";
|
durationOption = "1d";
|
||||||
break;
|
break;
|
||||||
case 8 * 24 * 60 * 60:
|
case 8 * day:
|
||||||
durationOption = "8d";
|
durationOption = "8d";
|
||||||
break;
|
break;
|
||||||
case 30 * 24 * 60 * 60:
|
case 30 * day:
|
||||||
durationOption = "30d";
|
durationOption = "30d";
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -198,19 +203,19 @@ function MetricsFetchControls(props: Props) {
|
|||||||
}));
|
}));
|
||||||
switch (selectedOpt) {
|
switch (selectedOpt) {
|
||||||
case "1h":
|
case "1h":
|
||||||
props.onDurationChange(60 * 60);
|
props.onDurationChange(1 * hour);
|
||||||
break;
|
break;
|
||||||
case "6h":
|
case "6h":
|
||||||
props.onDurationChange(6 * 60 * 60);
|
props.onDurationChange(6 * hour);
|
||||||
break;
|
break;
|
||||||
case "1d":
|
case "1d":
|
||||||
props.onDurationChange(24 * 60 * 60);
|
props.onDurationChange(1 * day);
|
||||||
break;
|
break;
|
||||||
case "8d":
|
case "8d":
|
||||||
props.onDurationChange(8 * 24 * 60 * 60);
|
props.onDurationChange(8 * day);
|
||||||
break;
|
break;
|
||||||
case "30d":
|
case "30d":
|
||||||
props.onDurationChange(30 * 24 * 60 * 60);
|
props.onDurationChange(30 * day);
|
||||||
break;
|
break;
|
||||||
case "custom":
|
case "custom":
|
||||||
// No-op
|
// No-op
|
||||||
@@ -299,6 +304,28 @@ function MetricsFetchControls(props: Props) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const shiftBy = (deltaSec: number) => {
|
||||||
|
return () => {
|
||||||
|
const now = currentUnixtime();
|
||||||
|
const endTime = props.endTimeSec + deltaSec;
|
||||||
|
if (now <= endTime) {
|
||||||
|
setState((prevState) => ({
|
||||||
|
...prevState,
|
||||||
|
customEndTime: "",
|
||||||
|
endTimeOption: "real_time",
|
||||||
|
}));
|
||||||
|
props.onEndTimeChange(now);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
setState((prevState) => ({
|
||||||
|
...prevState,
|
||||||
|
endTimeOption: "custom",
|
||||||
|
customEndTime: new Date(endTime * 1000).toISOString(),
|
||||||
|
}));
|
||||||
|
props.onEndTimeChange(endTime);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={classes.root}>
|
<div className={classes.root}>
|
||||||
<Typography variant="caption" className={classes.endTimeCaption}>
|
<Typography variant="caption" className={classes.endTimeCaption}>
|
||||||
@@ -335,16 +362,58 @@ function MetricsFetchControls(props: Props) {
|
|||||||
>
|
>
|
||||||
<div className={classes.endTimeShiftControls}>
|
<div className={classes.endTimeShiftControls}>
|
||||||
<div className={classes.leftShiftButtons}>
|
<div className={classes.leftShiftButtons}>
|
||||||
<ShiftButton direction="left" text="2h" onClick={() => {}} />
|
<ShiftButton
|
||||||
<ShiftButton direction="left" text="1h" onClick={() => {}} />
|
direction="left"
|
||||||
<ShiftButton direction="left" text="30m" onClick={() => {}} />
|
text="2h"
|
||||||
<ShiftButton direction="left" text="15m" onClick={() => {}} />
|
onClick={shiftBy(-2 * hour)}
|
||||||
|
/>
|
||||||
|
<ShiftButton
|
||||||
|
direction="left"
|
||||||
|
text="1h"
|
||||||
|
onClick={shiftBy(-1 * hour)}
|
||||||
|
/>
|
||||||
|
<ShiftButton
|
||||||
|
direction="left"
|
||||||
|
text="30m"
|
||||||
|
onClick={shiftBy(-30 * minute)}
|
||||||
|
/>
|
||||||
|
<ShiftButton
|
||||||
|
direction="left"
|
||||||
|
text="15m"
|
||||||
|
onClick={shiftBy(-15 * minute)}
|
||||||
|
/>
|
||||||
|
<ShiftButton
|
||||||
|
direction="left"
|
||||||
|
text="5m"
|
||||||
|
onClick={shiftBy(-5 * minute)}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className={classes.rightShiftButtons}>
|
<div className={classes.rightShiftButtons}>
|
||||||
<ShiftButton direction="right" text="15m" onClick={() => {}} />
|
<ShiftButton
|
||||||
<ShiftButton direction="right" text="30m" onClick={() => {}} />
|
direction="right"
|
||||||
<ShiftButton direction="right" text="1h" onClick={() => {}} />
|
text="5m"
|
||||||
<ShiftButton direction="right" text="2h" onClick={() => {}} />
|
onClick={shiftBy(5 * minute)}
|
||||||
|
/>
|
||||||
|
<ShiftButton
|
||||||
|
direction="right"
|
||||||
|
text="15m"
|
||||||
|
onClick={shiftBy(15 * minute)}
|
||||||
|
/>
|
||||||
|
<ShiftButton
|
||||||
|
direction="right"
|
||||||
|
text="30m"
|
||||||
|
onClick={shiftBy(30 * minute)}
|
||||||
|
/>
|
||||||
|
<ShiftButton
|
||||||
|
direction="right"
|
||||||
|
text="1h"
|
||||||
|
onClick={shiftBy(1 * hour)}
|
||||||
|
/>
|
||||||
|
<ShiftButton
|
||||||
|
direction="right"
|
||||||
|
text="2h"
|
||||||
|
onClick={shiftBy(2 * hour)}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className={classes.controlSelectorBox}>
|
<div className={classes.controlSelectorBox}>
|
||||||
@@ -563,6 +632,7 @@ function ShiftButton(props: ShiftButtonProps) {
|
|||||||
label: classes.label,
|
label: classes.label,
|
||||||
}}
|
}}
|
||||||
size="small"
|
size="small"
|
||||||
|
onClick={props.onClick}
|
||||||
>
|
>
|
||||||
{props.direction === "left" && (
|
{props.direction === "left" && (
|
||||||
<ArrowLeftIcon classes={{ root: classes.iconRoot }} />
|
<ArrowLeftIcon classes={{ root: classes.iconRoot }} />
|
||||||
|
|||||||
Reference in New Issue
Block a user