diff --git a/client/src/components/design-elements/LoadingSpinner.tsx b/client/src/components/design-elements/LoadingSpinner.tsx
new file mode 100644
index 000000000..840c37014
--- /dev/null
+++ b/client/src/components/design-elements/LoadingSpinner.tsx
@@ -0,0 +1,12 @@
+import CircularProgress, { type CircularProgressProps } from "@mui/material/CircularProgress";
+
+type LoadingSpinnerProps = { show?: boolean } & CircularProgressProps;
+
+export const LoadingSpinner = ({
+ show = true,
+ size = 18,
+ thickness = 5,
+ ...props
+}: LoadingSpinnerProps) => (show ? (
+
+) : null);
diff --git a/client/src/components/design-elements/index.tsx b/client/src/components/design-elements/index.tsx
index 66bbf35cd..963dd9c44 100644
--- a/client/src/components/design-elements/index.tsx
+++ b/client/src/components/design-elements/index.tsx
@@ -30,3 +30,4 @@ export { Breadcrumb } from "./Breadcrumb";
export { InfoBox } from "./InfoBox";
export { Tooltip, TooltipWithInfo } from "./Tooltip";
export { PlanCard } from "./PlanCard";
+export { LoadingSpinner } from "./LoadingSpinner";
diff --git a/client/src/components/layouts/sidebar/Menu.tsx b/client/src/components/layouts/sidebar/Menu.tsx
index f8378faf1..71e81b226 100644
--- a/client/src/components/layouts/sidebar/Menu.tsx
+++ b/client/src/components/layouts/sidebar/Menu.tsx
@@ -5,6 +5,7 @@ import {
Server,
AlertTriangle,
LayoutList,
+ ListChecks,
Wrench,
Activity,
LifeBuoy,
@@ -45,6 +46,11 @@ export const getMenu = (t: Function, user: IUser) => {
path: "incidents",
icon: ,
},
+ {
+ name: t("menu.checks"),
+ path: "checks",
+ icon: ,
+ },
{
name: t("menu.statusPages"),
diff --git a/client/src/components/monitors/HeaderFilter.tsx b/client/src/components/monitors/HeaderFilter.tsx
index 45a9a9401..ca02ba1df 100644
--- a/client/src/components/monitors/HeaderFilter.tsx
+++ b/client/src/components/monitors/HeaderFilter.tsx
@@ -3,6 +3,7 @@ import Box from "@mui/material/Box";
import MenuItem from "@mui/material/MenuItem";
import Typography from "@mui/material/Typography";
import { Select, Checkbox, TextInput } from "@/components/inputs";
+import { LoadingSpinner } from "@/components/design-elements";
import { useEffect, useState } from "react";
import { useTheme } from "@mui/material/styles";
@@ -21,6 +22,7 @@ type HeaderFilterProps = {
onStatusesChange: (statuses: MonitorStatus[]) => void;
searchString: string;
onSearchStringChange?: (value: string) => void;
+ loading?: boolean;
};
const coerceValue = (value: string | string[]): T[] => {
@@ -37,6 +39,7 @@ export const HeaderFilter = ({
onStatusesChange,
searchString,
onSearchStringChange,
+ loading = false,
}: HeaderFilterProps) => {
const theme = useTheme();
const [localSearch, setLocalSearch] = useState(searchString);
@@ -65,7 +68,6 @@ export const HeaderFilter = ({
return (