From d1c14160e3ac2b4025357fb14571b344e27025fd Mon Sep 17 00:00:00 2001
From: Anish Sarkar <104695310+AnishSarkar22@users.noreply.github.com>
Date: Fri, 24 Apr 2026 04:42:24 +0530
Subject: [PATCH] feat(sidebar): enhance DocumentsSidebar with dropdown menu
for local folder management and improve UI interactions
---
.../layout/ui/sidebar/DocumentsSidebar.tsx | 150 +++++++++++-------
.../ui/sidebar/LocalFilesystemBrowser.tsx | 10 --
2 files changed, 89 insertions(+), 71 deletions(-)
diff --git a/surfsense_web/components/layout/ui/sidebar/DocumentsSidebar.tsx b/surfsense_web/components/layout/ui/sidebar/DocumentsSidebar.tsx
index 5c955a53e..dbe2f16e4 100644
--- a/surfsense_web/components/layout/ui/sidebar/DocumentsSidebar.tsx
+++ b/surfsense_web/components/layout/ui/sidebar/DocumentsSidebar.tsx
@@ -7,11 +7,13 @@ import {
ChevronRight,
FileText,
Folder,
+ FolderPlus,
FolderClock,
- Globe,
+ Laptop,
Lock,
Paperclip,
Search,
+ Server,
Trash2,
Unplug,
Upload,
@@ -61,8 +63,17 @@ import {
} from "@/components/ui/alert-dialog";
import { Avatar, AvatarFallback, AvatarGroup } from "@/components/ui/avatar";
import { Button } from "@/components/ui/button";
+import {
+ DropdownMenu,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuLabel,
+ DropdownMenuSeparator,
+ DropdownMenuTrigger,
+} from "@/components/ui/dropdown-menu";
import { Drawer, DrawerContent, DrawerHandle, DrawerTitle } from "@/components/ui/drawer";
import { Input } from "@/components/ui/input";
+import { Separator } from "@/components/ui/separator";
import { Spinner } from "@/components/ui/spinner";
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip";
@@ -1135,76 +1146,93 @@ function AuthenticatedDocumentsSidebar({
);
const localContent = (
-
-
- {localRootPaths.length > 0 ? (
- <>
- {localRootPaths.map((rootPath) => (
-
-
-
{getFolderDisplayName(rootPath)}
+
+
+
+ {localRootPaths.length > 0 ? (
+
+
-
- ))}
-
+
-
+
setLocalSearch(e.target.value)}
placeholder="Search local files"
@@ -1214,14 +1242,14 @@ function AuthenticatedDocumentsSidebar({
{Boolean(localSearch) && (
{
setLocalSearch("");
localSearchInputRef.current?.focus();
}}
>
-
+
)}
@@ -1266,21 +1294,21 @@ function AuthenticatedDocumentsSidebar({
void handleFilesystemTabChange(value === "local" ? "local" : "cloud");
}}
>
-
+
-
+
Cloud
-
+
Local
diff --git a/surfsense_web/components/layout/ui/sidebar/LocalFilesystemBrowser.tsx b/surfsense_web/components/layout/ui/sidebar/LocalFilesystemBrowser.tsx
index 544280116..7aebf4695 100644
--- a/surfsense_web/components/layout/ui/sidebar/LocalFilesystemBrowser.tsx
+++ b/surfsense_web/components/layout/ui/sidebar/LocalFilesystemBrowser.tsx
@@ -61,16 +61,6 @@ export function LocalFilesystemBrowser({
const [expandedFolderKeys, setExpandedFolderKeys] = useState>(new Set());
const supportedExtensions = useMemo(() => Array.from(getSupportedExtensionsSet()), []);
- useEffect(() => {
- setExpandedFolderKeys((prev) => {
- const next = new Set(prev);
- for (const rootPath of rootPaths) {
- next.add(rootPath);
- }
- return next;
- });
- }, [rootPaths]);
-
useEffect(() => {
if (!electronAPI?.listFolderFiles) return;
let cancelled = false;