diff --git a/surfsense_web/app/dashboard/[search_space_id]/documents/(manage)/components/DocumentsTableShell.tsx b/surfsense_web/app/dashboard/[search_space_id]/documents/(manage)/components/DocumentsTableShell.tsx index 6ab96b920..203469c5f 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/documents/(manage)/components/DocumentsTableShell.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/documents/(manage)/components/DocumentsTableShell.tsx @@ -817,7 +817,7 @@ export function DocumentsTableShell({ {hasDeletableSelection && (
- {deletableSelectedIds.length} deletable selected + {deletableSelectedIds.length} selected @@ -319,7 +319,7 @@ export function ReportPanelContent({ variant="outline" size="sm" disabled={isLoading || !reportContent?.content} - className="h-8 px-3.5 py-4 text-[15px] gap-1.5" + className="h-8 px-3.5 py-4 text-[15px] gap-1.5 bg-sidebar select-none" > Export @@ -327,7 +327,7 @@ export function ReportPanelContent({ {!shareToken && ( <> @@ -398,14 +398,18 @@ export function ReportPanelContent({ {versions.length > 1 && ( - {versions.map((v, i) => ( ) ) : ( @@ -491,7 +496,7 @@ function DesktopReportPanel() { return (
diff --git a/surfsense_web/components/tool-ui/generate-report.tsx b/surfsense_web/components/tool-ui/generate-report.tsx index 06f8c3416..5f4cc947e 100644 --- a/surfsense_web/components/tool-ui/generate-report.tsx +++ b/surfsense_web/components/tool-ui/generate-report.tsx @@ -4,10 +4,11 @@ import { makeAssistantToolUI } from "@assistant-ui/react"; import { useAtomValue, useSetAtom } from "jotai"; import { Dot, FileTextIcon } from "lucide-react"; import { useParams, usePathname } from "next/navigation"; -import { useEffect, useState } from "react"; +import { useEffect, useRef, useState } from "react"; import { z } from "zod"; import { openReportPanelAtom, reportPanelAtom } from "@/atoms/chat/report-panel.atom"; import { TextShimmerLoader } from "@/components/prompt-kit/loader"; +import { useMediaQuery } from "@/hooks/use-media-query"; import { baseApiService } from "@/lib/apis/base-api.service"; /** @@ -110,15 +111,20 @@ function ReportCard({ title, wordCount, shareToken, + autoOpen = false, }: { reportId: number; title: string; wordCount?: number; /** When set, uses public endpoint for fetching report data */ shareToken?: string | null; + /** When true, auto-opens the report panel on desktop after metadata loads */ + autoOpen?: boolean; }) { const openPanel = useSetAtom(openReportPanelAtom); const panelState = useAtomValue(reportPanelAtom); + const isDesktop = useMediaQuery("(min-width: 768px)"); + const autoOpenedRef = useRef(false); const [metadata, setMetadata] = useState<{ title: string; wordCount: number | null; @@ -154,11 +160,19 @@ function ReportCard({ versionLabel = `version ${idx + 1}`; } } - setMetadata({ - title: parsed.data.title || title, - wordCount: parsed.data.report_metadata?.word_count ?? wordCount ?? null, - versionLabel, - }); + const resolvedTitle = parsed.data.title || title; + const resolvedWordCount = parsed.data.report_metadata?.word_count ?? wordCount ?? null; + setMetadata({ title: resolvedTitle, wordCount: resolvedWordCount, versionLabel }); + + if (autoOpen && isDesktop && !autoOpenedRef.current) { + autoOpenedRef.current = true; + openPanel({ + reportId, + title: resolvedTitle, + wordCount: resolvedWordCount ?? undefined, + shareToken, + }); + } } } } catch { @@ -171,7 +185,7 @@ function ReportCard({ return () => { cancelled = true; }; - }, [reportId, title, wordCount, shareToken]); + }, [reportId, title, wordCount, shareToken, autoOpen, isDesktop, openPanel]); // Show non-clickable error card for any error (failed status, not found, etc.) if (!isLoading && error) { @@ -243,6 +257,13 @@ export const GenerateReportToolUI = makeAssistantToolUI; @@ -293,6 +314,7 @@ export const GenerateReportToolUI = makeAssistantToolUI ); } diff --git a/surfsense_web/components/ui/drawer.tsx b/surfsense_web/components/ui/drawer.tsx index c92531d14..67d4189e4 100644 --- a/surfsense_web/components/ui/drawer.tsx +++ b/surfsense_web/components/ui/drawer.tsx @@ -45,7 +45,7 @@ function DrawerContent({