diff --git a/surfsense_backend/app/tasks/connector_indexers/local_folder_indexer.py b/surfsense_backend/app/tasks/connector_indexers/local_folder_indexer.py index 5c4878a04..c23fe55c3 100644 --- a/surfsense_backend/app/tasks/connector_indexers/local_folder_indexer.py +++ b/surfsense_backend/app/tasks/connector_indexers/local_folder_indexer.py @@ -1276,6 +1276,13 @@ async def index_uploaded_files( ) await session.flush() + root_folder = await session.get(Folder, root_folder_id) + if root_folder: + meta = dict(root_folder.folder_metadata or {}) + meta["indexing_in_progress"] = True + root_folder.folder_metadata = meta + await session.commit() + page_limit_service = PageLimitService(session) pipeline = IndexingPipelineService(session) llm = await get_user_long_context_llm(session, user_id, search_space_id) @@ -1454,3 +1461,14 @@ async def index_uploaded_files( log_entry, f"Error: {e}", "Unexpected error", {} ) return 0, 0, str(e) + + finally: + try: + root_folder = await session.get(Folder, root_folder_id) + if root_folder: + meta = dict(root_folder.folder_metadata or {}) + meta.pop("indexing_in_progress", None) + root_folder.folder_metadata = meta + await session.commit() + except Exception: + pass diff --git a/surfsense_web/components/documents/FolderNode.tsx b/surfsense_web/components/documents/FolderNode.tsx index 4b0103ce5..7f75f8abf 100644 --- a/surfsense_web/components/documents/FolderNode.tsx +++ b/surfsense_web/components/documents/FolderNode.tsx @@ -49,6 +49,7 @@ export interface FolderDisplay { position: string; parentId: number | null; searchSpaceId: number; + metadata?: Record | null; } interface FolderNodeProps { diff --git a/surfsense_web/components/documents/FolderTreeView.tsx b/surfsense_web/components/documents/FolderTreeView.tsx index 65f7fd9a2..6eb53da50 100644 --- a/surfsense_web/components/documents/FolderTreeView.tsx +++ b/surfsense_web/components/documents/FolderTreeView.tsx @@ -168,6 +168,12 @@ export function FolderTreeView({ return states; }, [folders, docsByFolder, foldersByParent, mentionedDocIds]); + const folderMap = useMemo(() => { + const map: Record = {}; + for (const f of folders) map[f.id] = f; + return map; + }, [folders]); + const folderProcessingStates = useMemo(() => { const states: Record = {}; @@ -178,6 +184,11 @@ export function FolderTreeView({ ); let hasFailed = directDocs.some((d) => d.status?.state === "failed"); + const folder = folderMap[folderId]; + if (folder?.metadata?.indexing_in_progress) { + hasProcessing = true; + } + for (const child of foldersByParent[folderId] ?? []) { const sub = compute(child.id); hasProcessing = hasProcessing || sub.hasProcessing; @@ -195,7 +206,7 @@ export function FolderTreeView({ if (states[f.id] === undefined) compute(f.id); } return states; - }, [folders, docsByFolder, foldersByParent]); + }, [folders, docsByFolder, foldersByParent, folderMap]); function renderLevel(parentId: number | null, depth: number): React.ReactNode[] { const key = parentId ?? "root"; diff --git a/surfsense_web/components/layout/ui/sidebar/DocumentsSidebar.tsx b/surfsense_web/components/layout/ui/sidebar/DocumentsSidebar.tsx index b8634bb3b..7679faae5 100644 --- a/surfsense_web/components/layout/ui/sidebar/DocumentsSidebar.tsx +++ b/surfsense_web/components/layout/ui/sidebar/DocumentsSidebar.tsx @@ -194,6 +194,7 @@ export function DocumentsSidebar({ position: f.position, parentId: f.parentId ?? null, searchSpaceId: f.searchSpaceId, + metadata: f.metadata as Record | null | undefined, })), [zeroFolders] ); diff --git a/surfsense_web/components/sources/FolderWatchDialog.tsx b/surfsense_web/components/sources/FolderWatchDialog.tsx index b44f42d77..bb3972a09 100644 --- a/surfsense_web/components/sources/FolderWatchDialog.tsx +++ b/surfsense_web/components/sources/FolderWatchDialog.tsx @@ -66,7 +66,7 @@ export function FolderWatchDialog({ const folderPath = await api.selectFolder(); if (!folderPath) return; - const folderName = folderPath.split("/").pop() || folderPath.split("\\").pop() || folderPath; + const folderName = folderPath.split(/[/\\]/).pop() || folderPath; setSelectedFolder({ path: folderPath, name: folderName }); }, []); diff --git a/surfsense_web/zero/schema/folders.ts b/surfsense_web/zero/schema/folders.ts index 2313506ab..c5b192942 100644 --- a/surfsense_web/zero/schema/folders.ts +++ b/surfsense_web/zero/schema/folders.ts @@ -1,4 +1,4 @@ -import { number, string, table } from "@rocicorp/zero"; +import { json, number, string, table } from "@rocicorp/zero"; export const folderTable = table("folders") .columns({ @@ -10,5 +10,6 @@ export const folderTable = table("folders") createdById: string().optional().from("created_by_id"), createdAt: number().from("created_at"), updatedAt: number().from("updated_at"), + metadata: json>().optional().from("metadata"), }) .primaryKey("id");