From ae55b864932ace6627a8b940b852acb1e59f4756 Mon Sep 17 00:00:00 2001 From: henrygd Date: Sat, 18 Oct 2025 17:10:08 -0400 Subject: [PATCH] improve chart filtering logic to support multiple terms (#1274) --- .../src/components/charts/container-chart.tsx | 7 ++-- .../components/charts/temperature-chart.tsx | 3 +- internal/site/src/components/lang-toggle.tsx | 2 +- internal/site/src/components/navbar.tsx | 8 ++--- internal/site/src/components/routes/home.tsx | 2 +- internal/site/src/components/ui/chart.tsx | 34 +++++++++++-------- 6 files changed, 32 insertions(+), 24 deletions(-) diff --git a/internal/site/src/components/charts/container-chart.tsx b/internal/site/src/components/charts/container-chart.tsx index e330529f..2093fc27 100644 --- a/internal/site/src/components/charts/container-chart.tsx +++ b/internal/site/src/components/charts/container-chart.tsx @@ -94,8 +94,11 @@ export default memo(function ContainerChart({ if (!filter) { return new Set() } - const filterLower = filter.toLowerCase() - return new Set(Object.keys(chartConfig).filter((key) => !key.toLowerCase().includes(filterLower))) + const filterTerms = filter.toLowerCase().split(" ").filter(term => term.length > 0) + return new Set(Object.keys(chartConfig).filter((key) => { + const keyLower = key.toLowerCase() + return !filterTerms.some(term => keyLower.includes(term)) + })) }, [chartConfig, filter]) // console.log('rendered at', new Date()) diff --git a/internal/site/src/components/charts/temperature-chart.tsx b/internal/site/src/components/charts/temperature-chart.tsx index a5a03705..fedcb9b2 100644 --- a/internal/site/src/components/charts/temperature-chart.tsx +++ b/internal/site/src/components/charts/temperature-chart.tsx @@ -91,7 +91,8 @@ export default memo(function TemperatureChart({ chartData }: { chartData: ChartD } /> {colors.map((key) => { - const filtered = filter && !key.toLowerCase().includes(filter.toLowerCase()) + const filterTerms = filter ? filter.toLowerCase().split(" ").filter(term => term.length > 0) : [] + const filtered = filterTerms.length > 0 && !filterTerms.some(term => key.toLowerCase().includes(term)) const strokeOpacity = filtered ? 0.1 : 1 return ( - diff --git a/internal/site/src/components/navbar.tsx b/internal/site/src/components/navbar.tsx index 456ef21a..d0035e8d 100644 --- a/internal/site/src/components/navbar.tsx +++ b/internal/site/src/components/navbar.tsx @@ -50,7 +50,7 @@ export default function Navbar() {
import("@/components/routes/settings/general")}> @@ -60,13 +60,13 @@ export default function Navbar() { - @@ -120,7 +120,7 @@ export default function Navbar() { - +
) diff --git a/internal/site/src/components/routes/home.tsx b/internal/site/src/components/routes/home.tsx index b0072488..a635c556 100644 --- a/internal/site/src/components/routes/home.tsx +++ b/internal/site/src/components/routes/home.tsx @@ -14,7 +14,7 @@ export default memo(() => { return useMemo( () => ( <> -
+
diff --git a/internal/site/src/components/ui/chart.tsx b/internal/site/src/components/ui/chart.tsx index 10cd64ed..8068ef65 100644 --- a/internal/site/src/components/ui/chart.tsx +++ b/internal/site/src/components/ui/chart.tsx @@ -91,16 +91,16 @@ const ChartTooltip = RechartsPrimitive.Tooltip const ChartTooltipContent = React.forwardRef< HTMLDivElement, React.ComponentProps & - React.ComponentProps<"div"> & { - hideLabel?: boolean - indicator?: "line" | "dot" | "dashed" - nameKey?: string - labelKey?: string - unit?: string - filter?: string - contentFormatter?: (item: any, key: string) => React.ReactNode | string - truncate?: boolean - } + React.ComponentProps<"div"> & { + hideLabel?: boolean + indicator?: "line" | "dot" | "dashed" + nameKey?: string + labelKey?: string + unit?: string + filter?: string + contentFormatter?: (item: any, key: string) => React.ReactNode | string + truncate?: boolean + } >( ( { @@ -129,7 +129,11 @@ const ChartTooltipContent = React.forwardRef< React.useMemo(() => { if (filter) { - payload = payload?.filter((item) => (item.name as string)?.toLowerCase().includes(filter.toLowerCase())) + const filterTerms = filter.toLowerCase().split(" ").filter(term => term.length > 0) + payload = payload?.filter((item) => { + const itemName = (item.name as string)?.toLowerCase() + return filterTerms.some(term => itemName?.includes(term)) + }) } if (itemSorter) { // @ts-expect-error @@ -250,10 +254,10 @@ const ChartLegend = RechartsPrimitive.Legend const ChartLegendContent = React.forwardRef< HTMLDivElement, React.ComponentProps<"div"> & - Pick & { - hideIcon?: boolean - nameKey?: string - } + Pick & { + hideIcon?: boolean + nameKey?: string + } >(({ className, payload, verticalAlign = "bottom" }, ref) => { // const { config } = useChart()