From aaa8840e1df45ff78033177042539e134be48474 Mon Sep 17 00:00:00 2001 From: Anish Sarkar <104695310+AnishSarkar22@users.noreply.github.com> Date: Fri, 6 Mar 2026 22:22:28 +0530 Subject: [PATCH] feat: enhance DocumentsFilters and ModelSelector components with scroll position tracking and improved styling, improving user experience and visual consistency across the application --- .../(manage)/components/DocumentsFilters.tsx | 52 ++++++++++++------- .../components/DocumentsTableShell.tsx | 2 +- .../layout/ui/sidebar/DocumentsSidebar.tsx | 3 +- .../layout/ui/sidebar/InboxSidebar.tsx | 4 +- .../ui/sidebar/SidebarSlideOutPanel.tsx | 2 +- .../components/new-chat/model-selector.tsx | 31 +++++++++-- 6 files changed, 67 insertions(+), 27 deletions(-) diff --git a/surfsense_web/app/dashboard/[search_space_id]/documents/(manage)/components/DocumentsFilters.tsx b/surfsense_web/app/dashboard/[search_space_id]/documents/(manage)/components/DocumentsFilters.tsx index fabbaee39..e24621074 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/documents/(manage)/components/DocumentsFilters.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/documents/(manage)/components/DocumentsFilters.tsx @@ -2,7 +2,7 @@ import { ListFilter, Search, Upload, X } from "lucide-react"; import { useTranslations } from "next-intl"; -import React, { useMemo, useRef, useState } from "react"; +import React, { useCallback, useMemo, useRef, useState } from "react"; import { useDocumentUploadDialog } from "@/components/assistant-ui/document-upload-popup"; import { Button } from "@/components/ui/button"; import { Checkbox } from "@/components/ui/checkbox"; @@ -31,6 +31,13 @@ export function DocumentsFilters({ const { openDialog: openUploadDialog } = useDocumentUploadDialog(); const [typeSearchQuery, setTypeSearchQuery] = useState(""); + const [scrollPos, setScrollPos] = useState<"top" | "middle" | "bottom">("top"); + const handleScroll = useCallback((e: React.UIEvent) => { + const el = e.currentTarget; + const atTop = el.scrollTop <= 2; + const atBottom = el.scrollHeight - el.scrollTop - el.clientHeight <= 2; + setScrollPos(atTop ? "top" : atBottom ? "bottom" : "middle"); + }, []); const uniqueTypes = useMemo(() => { return Object.keys(typeCountsRecord).sort() as DocumentTypeEnum[]; @@ -61,7 +68,7 @@ export function DocumentsFilters({ - +
{/* Search input */} -
-
- - setTypeSearchQuery(e.target.value)} - className="h-6 pl-6 text-sm bg-transparent border-0 focus-visible:ring-0" - /> +
+
+ + setTypeSearchQuery(e.target.value)} + className="h-6 pl-6 text-sm bg-transparent border-0 shadow-none focus-visible:ring-0" + />
-
+
{filteredTypes.length === 0 ? (
No types found @@ -125,11 +139,11 @@ export function DocumentsFilters({ )}
{activeTypes.length > 0 && ( -
-