From d0f7bbc3bd20d8722caf53d9a48bb81315e82c71 Mon Sep 17 00:00:00 2001 From: Jake Howell Date: Mon, 9 Feb 2026 14:10:55 +1100 Subject: [PATCH] fix: remove `@mui/*` dependencies from `` (#21993) This pull-request looks at various components within `` and ensures that they aren't using the MUI variants of components. --- .../TemplateInsightsPage/IntervalMenu.tsx | 87 ++++++------------ .../TemplateInsightsPage.tsx | 55 +++++------- .../TemplateInsightsPage/WeekPicker.tsx | 90 ++++++------------- 3 files changed, 78 insertions(+), 154 deletions(-) diff --git a/site/src/pages/TemplatePage/TemplateInsightsPage/IntervalMenu.tsx b/site/src/pages/TemplatePage/TemplateInsightsPage/IntervalMenu.tsx index 5aa98a7665..2292de61cc 100644 --- a/site/src/pages/TemplatePage/TemplateInsightsPage/IntervalMenu.tsx +++ b/site/src/pages/TemplatePage/TemplateInsightsPage/IntervalMenu.tsx @@ -1,8 +1,13 @@ -import Menu from "@mui/material/Menu"; -import MenuItem from "@mui/material/MenuItem"; import { Button } from "components/Button/Button"; -import { CheckIcon, ChevronDownIcon } from "lucide-react"; -import { type FC, useRef, useState } from "react"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuRadioGroup, + DropdownMenuRadioItem, + DropdownMenuTrigger, +} from "components/DropdownMenu/DropdownMenu"; +import { ChevronDownIcon } from "lucide-react"; +import type { FC } from "react"; const insightsIntervals = { day: { @@ -21,62 +26,26 @@ interface IntervalMenuProps { } export const IntervalMenu: FC = ({ value, onChange }) => { - const anchorRef = useRef(null); - const [open, setOpen] = useState(false); - - const handleClose = () => { - setOpen(false); - }; - return ( -
- - - {Object.entries(insightsIntervals).map(([interval, { label }]) => { - return ( - { - onChange(interval as InsightsInterval); - handleClose(); - }} - > + + + + + + onChange(v as InsightsInterval)} + > + {Object.entries(insightsIntervals).map(([interval, { label }]) => ( + {label} -
- {value === interval && } -
-
- ); - })} -
-
+ + ))} + + + ); }; diff --git a/site/src/pages/TemplatePage/TemplateInsightsPage/TemplateInsightsPage.tsx b/site/src/pages/TemplatePage/TemplateInsightsPage/TemplateInsightsPage.tsx index 6e7196c7d4..490b8180a5 100644 --- a/site/src/pages/TemplatePage/TemplateInsightsPage/TemplateInsightsPage.tsx +++ b/site/src/pages/TemplatePage/TemplateInsightsPage/TemplateInsightsPage.tsx @@ -1,6 +1,3 @@ -import { useTheme } from "@emotion/react"; -import LinearProgress from "@mui/material/LinearProgress"; -import Link from "@mui/material/Link"; import { getErrorDetail, getErrorMessage } from "api/errors"; import { insightsTemplate, @@ -29,6 +26,7 @@ import { HelpTooltipText, HelpTooltipTitle, } from "components/HelpTooltip/HelpTooltip"; +import { Link } from "components/Link/Link"; import { Loader } from "components/Loader/Loader"; import { Stack } from "components/Stack/Stack"; import { @@ -37,11 +35,7 @@ import { TooltipContent, TooltipTrigger, } from "components/Tooltip/Tooltip"; -import { - CircleCheck as CircleCheckIcon, - CircleXIcon, - LinkIcon, -} from "lucide-react"; +import { CircleCheck as CircleCheckIcon, CircleXIcon } from "lucide-react"; import { useTemplateLayoutContext } from "pages/TemplatePage/TemplateLayout"; import { type FC, @@ -396,15 +390,23 @@ const TemplateUsagePanel: FC = ({ className, ...panelProps }) => { - const theme = useTheme(); // The API returns a row for each app, even if the user didn't use it. const validUsage = data ?.filter((u) => u.seconds > 0) .sort((a, b) => b.seconds - a.seconds); const totalInSeconds = validUsage?.reduce((total, usage) => total + usage.seconds, 0) ?? 1; + const style = getComputedStyle(document.documentElement); + const successHsl = style + .getPropertyValue("--content-success") + .trim() + .replace(/ /g, ", "); + const warningHsl = style + .getPropertyValue("--content-warning") + .trim() + .replace(/ /g, ", "); const usageColors = chroma - .scale([theme.roles.success.fill.solid, theme.roles.warning.fill.solid]) + .scale([`hsl(${successHsl})`, `hsl(${warningHsl})`]) .mode("lch") .colors(validUsage?.length ?? 0); @@ -434,17 +436,15 @@ const TemplateUsagePanel: FC = ({ - +
+ }} + /> +
{Math.floor(percentage)}% @@ -497,12 +497,7 @@ const TemplateParametersUsagePanel: FC = ({ return (
{label}
@@ -603,14 +598,8 @@ const ParameterUsageLabel: FC = ({ if (usage.value.startsWith("http")) { return ( - + {usage.value} - ); } diff --git a/site/src/pages/TemplatePage/TemplateInsightsPage/WeekPicker.tsx b/site/src/pages/TemplatePage/TemplateInsightsPage/WeekPicker.tsx index e203e8e406..080a0d7311 100644 --- a/site/src/pages/TemplatePage/TemplateInsightsPage/WeekPicker.tsx +++ b/site/src/pages/TemplatePage/TemplateInsightsPage/WeekPicker.tsx @@ -1,9 +1,14 @@ -import Menu from "@mui/material/Menu"; -import MenuItem from "@mui/material/MenuItem"; import { Button } from "components/Button/Button"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuRadioGroup, + DropdownMenuRadioItem, + DropdownMenuTrigger, +} from "components/DropdownMenu/DropdownMenu"; import dayjs from "dayjs"; -import { CheckIcon, ChevronDownIcon } from "lucide-react"; -import { type FC, useRef, useState } from "react"; +import { ChevronDownIcon } from "lucide-react"; +import type { FC } from "react"; import type { DateRangeValue } from "./DateRange"; import { lastWeeks } from "./utils"; @@ -17,70 +22,31 @@ interface WeekPickerProps { } export const WeekPicker: FC = ({ value, onChange }) => { - const anchorRef = useRef(null); - const [open, setOpen] = useState(false); const numberOfWeeks = dayjs(value.endDate).diff( dayjs(value.startDate), "week", ); - const handleClose = () => { - setOpen(false); - }; - return ( -
- - - {numberOfWeeksOptions.map((option) => { - const optionRange = lastWeeks(option); - - return ( - { - onChange(optionRange); - handleClose(); - }} - > + + + + + + onChange(lastWeeks(Number(v)))} + > + {numberOfWeeksOptions.map((option) => ( + Last {option} weeks -
- {numberOfWeeks === option && ( - - )} -
-
- ); - })} -
-
+ + ))} + + + ); };