From ce8232a23c5a7b6786b5978084edc25fc02c55c1 Mon Sep 17 00:00:00 2001 From: Konrad Staniszewski Date: Tue, 3 Dec 2024 12:46:42 -0800 Subject: [PATCH] Filter panel visual fixes (#105) * Make filter panel full page height * Fix filter items text when the filter items were cutoff, the text would break onto multiple lines and the count would overlap with the text --------- Co-authored-by: Brendan Kellam --- .../search/components/filterPanel/entry.tsx | 18 ++++++++++++------ .../search/components/filterPanel/filter.tsx | 16 ++++++++++------ .../search/components/filterPanel/index.tsx | 19 ++++++++++--------- packages/web/src/app/search/page.tsx | 3 ++- packages/web/src/components/ui/resizable.tsx | 5 ++++- 5 files changed, 38 insertions(+), 23 deletions(-) diff --git a/packages/web/src/app/search/components/filterPanel/entry.tsx b/packages/web/src/app/search/components/filterPanel/entry.tsx index bc6f7460..04064883 100644 --- a/packages/web/src/app/search/components/filterPanel/entry.tsx +++ b/packages/web/src/app/search/components/filterPanel/entry.tsx @@ -25,10 +25,14 @@ export const Entry = ({ }, onClicked, }: EntryProps) => { - + let countText = count.toString(); + if (count > 999) { + countText = "999+"; + } return (
onClicked()} > -
+
{Icon ? Icon : ( )} -

{displayName}

+

{displayName}

+
+
+ {countText}
-

{count}

); } @@ -53,4 +59,4 @@ export const compareEntries = (a: Entry, b: Entry) => { } return a.count - b.count; -} \ No newline at end of file +} diff --git a/packages/web/src/app/search/components/filterPanel/filter.tsx b/packages/web/src/app/search/components/filterPanel/filter.tsx index 0faacbca..a791353e 100644 --- a/packages/web/src/app/search/components/filterPanel/filter.tsx +++ b/packages/web/src/app/search/components/filterPanel/filter.tsx @@ -5,12 +5,14 @@ import { compareEntries, Entry } from "./entry"; import { Input } from "@/components/ui/input"; import { ScrollArea } from "@/components/ui/scroll-area"; import Fuse from "fuse.js"; +import { cn } from "@/lib/utils" interface FilterProps { title: string, searchPlaceholder: string, entries: Entry[], onEntryClicked: (key: string) => void, + className?: string, } export const Filter = ({ @@ -18,6 +20,7 @@ export const Filter = ({ searchPlaceholder, entries, onEntryClicked, + className, }: FilterProps) => { const [searchFilter, setSearchFilter] = useState(""); @@ -36,7 +39,10 @@ export const Filter = ({ }, [entries, searchFilter]); return ( -
+

{title}

setSearchFilter(event.target.value)} /> - +
{filteredEntries .sort((entryA, entryB) => compareEntries(entryB, entryA)) @@ -63,4 +67,4 @@ export const Filter = ({
) -} \ No newline at end of file +} diff --git a/packages/web/src/app/search/components/filterPanel/index.tsx b/packages/web/src/app/search/components/filterPanel/index.tsx index 635fab51..8a097b8e 100644 --- a/packages/web/src/app/search/components/filterPanel/index.tsx +++ b/packages/web/src/app/search/components/filterPanel/index.tsx @@ -118,22 +118,23 @@ export const FilterPanel = ({ onFilterChanged(filteredMatches); }, [matches, repos, languages, onFilterChanged]); + const numRepos = Object.keys(repos).length > 100 ? '100+' : Object.keys(repos).length; + const numLanguages = Object.keys(languages).length > 100 ? '100+' : Object.keys(languages).length; return ( -
-

Filter Results

- +
onEntryClicked(key, setRepos)} + className="max-h-[50%]" /> - onEntryClicked(key, setLanguages)} + className="overflow-auto" />
) @@ -167,4 +168,4 @@ const aggregateMatches = ( aggregation[key].count += 1; return aggregation; }, {} as Record) -} \ No newline at end of file +} diff --git a/packages/web/src/app/search/page.tsx b/packages/web/src/app/search/page.tsx index 3a2bb5f1..e8963e82 100644 --- a/packages/web/src/app/search/page.tsx +++ b/packages/web/src/app/search/page.tsx @@ -286,6 +286,7 @@ const PanelGroup = ({ return ( {/* ~~ Filter panel ~~ */} ) -} \ No newline at end of file +} diff --git a/packages/web/src/components/ui/resizable.tsx b/packages/web/src/components/ui/resizable.tsx index f4bc5586..63972c6e 100644 --- a/packages/web/src/components/ui/resizable.tsx +++ b/packages/web/src/components/ui/resizable.tsx @@ -29,7 +29,10 @@ const ResizableHandle = ({ }) => ( div]:rotate-90", + "relative flex w-px items-center justify-center bg-border", + "after:absolute after:inset-y-0 after:left-1/2 after:w-1 after:-translate-x-1/2", + "focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1", + "data-[panel-group-direction=vertical]:h-px data-[panel-group-direction=vertical]:w-full data-[panel-group-direction=vertical]:after:left-0 data-[panel-group-direction=vertical]:after:h-1 data-[panel-group-direction=vertical]:after:w-full data-[panel-group-direction=vertical]:after:-translate-y-1/2 data-[panel-group-direction=vertical]:after:translate-x-0 [&[data-panel-group-direction=vertical]>div]:rotate-90", className )} {...props}