feat: enhance folder indexing with metadata management and improve folder structure handling in UI components

This commit is contained in:
Anish Sarkar 2026-04-08 16:48:40 +05:30
parent 60eb1e4060
commit ae98f64760
6 changed files with 35 additions and 3 deletions

View file

@ -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

View file

@ -49,6 +49,7 @@ export interface FolderDisplay {
position: string;
parentId: number | null;
searchSpaceId: number;
metadata?: Record<string, unknown> | null;
}
interface FolderNodeProps {

View file

@ -168,6 +168,12 @@ export function FolderTreeView({
return states;
}, [folders, docsByFolder, foldersByParent, mentionedDocIds]);
const folderMap = useMemo(() => {
const map: Record<number, FolderDisplay> = {};
for (const f of folders) map[f.id] = f;
return map;
}, [folders]);
const folderProcessingStates = useMemo(() => {
const states: Record<number, "idle" | "processing" | "failed"> = {};
@ -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";

View file

@ -194,6 +194,7 @@ export function DocumentsSidebar({
position: f.position,
parentId: f.parentId ?? null,
searchSpaceId: f.searchSpaceId,
metadata: f.metadata as Record<string, unknown> | null | undefined,
})),
[zeroFolders]
);

View file

@ -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 });
}, []);

View file

@ -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<Record<string, unknown>>().optional().from("metadata"),
})
.primaryKey("id");