diff --git a/surfsense_web/app/dashboard/[search_space_id]/more-pages/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/more-pages/page.tsx index 6779dc5d0..27c451d2f 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/more-pages/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/more-pages/page.tsx @@ -9,7 +9,14 @@ import { useEffect } from "react"; import { toast } from "sonner"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; -import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card"; +import { + Card, + CardContent, + CardDescription, + CardFooter, + CardHeader, + CardTitle, +} from "@/components/ui/card"; import { Dialog, DialogContent, @@ -108,37 +115,26 @@ export default function MorePagesPage() {
- {task.completed ? ( - - ) : ( - - )} + {task.completed ? : }

{task.title}

-

- +{task.pages_reward} pages -

+

+{task.pages_reward} pages

- - - )} + {/* Content */} +
+
+
+ {/* LLM Configuration Warning */} + {!llmConfigLoading && !hasDocumentSummaryLLM && ( + + + LLM Configuration Required + +

+ {isAutoMode && !hasGlobalConfigs + ? "Auto mode is selected but no global LLM configurations are available. Please configure a custom LLM in Settings to process and summarize documents from your connected sources." + : "You need to configure a Document Summary LLM before adding connectors. This LLM is used to process and summarize documents from your connected sources."} +

+ +
+
+ )} - - + {}} + onConnectNonOAuth={hasDocumentSummaryLLM ? handleConnectNonOAuth : () => {}} + onCreateWebcrawler={ + hasDocumentSummaryLLM ? handleCreateWebcrawler : () => {} + } + onCreateYouTubeCrawler={ + hasDocumentSummaryLLM ? handleCreateYouTubeCrawler : () => {} + } + onManage={handleStartEdit} + onViewAccountsList={handleViewAccountsList} + /> + + + {}} - onConnectNonOAuth={hasDocumentSummaryLLM ? handleConnectNonOAuth : () => {}} - onCreateWebcrawler={hasDocumentSummaryLLM ? handleCreateWebcrawler : () => {}} - onCreateYouTubeCrawler={ - hasDocumentSummaryLLM ? handleCreateYouTubeCrawler : () => {} - } + onTabChange={handleTabChange} onManage={handleStartEdit} onViewAccountsList={handleViewAccountsList} /> - - - +
+ {/* Bottom fade shadow */} +
- {/* Bottom fade shadow */} -
-
- - )} - - - ); -}); + + )} + + + ); + } +); ConnectorIndicator.displayName = "ConnectorIndicator"; diff --git a/surfsense_web/components/assistant-ui/connector-popup/connector-configs/components/webcrawler-config.tsx b/surfsense_web/components/assistant-ui/connector-popup/connector-configs/components/webcrawler-config.tsx index 22b14842b..446c08857 100644 --- a/surfsense_web/components/assistant-ui/connector-popup/connector-configs/components/webcrawler-config.tsx +++ b/surfsense_web/components/assistant-ui/connector-popup/connector-configs/components/webcrawler-config.tsx @@ -63,7 +63,8 @@ export const WebcrawlerConfig: FC = ({ connector, onConfig

- Want a quick answer from a webpage without indexing it? Just paste the URL directly into the chat instead. + Want a quick answer from a webpage without indexing it? Just paste the URL directly into + the chat instead.

diff --git a/surfsense_web/components/assistant-ui/connector-popup/views/youtube-crawler-view.tsx b/surfsense_web/components/assistant-ui/connector-popup/views/youtube-crawler-view.tsx index c8e565df5..7ec85f4d3 100644 --- a/surfsense_web/components/assistant-ui/connector-popup/views/youtube-crawler-view.tsx +++ b/surfsense_web/components/assistant-ui/connector-popup/views/youtube-crawler-view.tsx @@ -280,9 +280,7 @@ export const YouTubeCrawlerView: FC = ({ searchSpaceId,
-

- {t("chat_tip")} -

+

{t("chat_tip")}

diff --git a/surfsense_web/components/assistant-ui/thread.tsx b/surfsense_web/components/assistant-ui/thread.tsx index edc2c4bb3..fa767fbab 100644 --- a/surfsense_web/components/assistant-ui/thread.tsx +++ b/surfsense_web/components/assistant-ui/thread.tsx @@ -14,7 +14,6 @@ import { AlertCircle, ArrowDownIcon, ArrowUpIcon, - Unplug, CheckIcon, ChevronLeftIcon, ChevronRightIcon, @@ -24,6 +23,7 @@ import { RefreshCwIcon, SquareIcon, SquareLibrary, + Unplug, Upload, X, } from "lucide-react"; @@ -47,12 +47,12 @@ import { } from "@/atoms/new-llm-config/new-llm-config-query.atoms"; import { currentUserAtom } from "@/atoms/user/user-query.atoms"; import { AssistantMessage } from "@/components/assistant-ui/assistant-message"; -import { useDocumentUploadDialog } from "@/components/assistant-ui/document-upload-popup"; import { ChatSessionStatus } from "@/components/assistant-ui/chat-session-status"; import { ConnectorIndicator, type ConnectorIndicatorHandle, } from "@/components/assistant-ui/connector-popup"; +import { useDocumentUploadDialog } from "@/components/assistant-ui/document-upload-popup"; import { InlineMentionEditor, type InlineMentionEditorRef, @@ -65,6 +65,7 @@ import { import { ToolFallback } from "@/components/assistant-ui/tool-fallback"; import { TooltipIconButton } from "@/components/assistant-ui/tooltip-icon-button"; import { UserMessage } from "@/components/assistant-ui/user-message"; +import { SLIDEOUT_PANEL_OPENED_EVENT } from "@/components/layout/ui/sidebar/SidebarSlideOutPanel"; import { DocumentMentionPicker, type DocumentMentionPickerRef, @@ -83,7 +84,6 @@ import { getConnectorIcon } from "@/contracts/enums/connectorIcons"; import type { Document } from "@/contracts/types/document.types"; import { useBatchCommentsPreload } from "@/hooks/use-comments"; import { useCommentsElectric } from "@/hooks/use-comments-electric"; -import { SLIDEOUT_PANEL_OPENED_EVENT } from "@/components/layout/ui/sidebar/SidebarSlideOutPanel"; import { cn } from "@/lib/utils"; /** Placeholder texts that cycle in new chats when input is empty */ @@ -273,16 +273,10 @@ const ConnectToolsBanner: FC = () => { onClick={() => setConnectorDialogOpen(true)} > - - Connect your tools - + Connect your tools {BANNER_CONNECTORS.map(({ type, label }, i) => ( - + {getConnectorIcon(type, "size-3.5")} @@ -516,9 +510,9 @@ const Composer: FC = () => { currentUserId={currentUser?.id ?? null} members={members ?? []} /> -
- {/* Inline editor with @mention support */} -
+
+ {/* Inline editor with @mention support */} +
= ({ isBlockedByOtherUser = false {connectorCount > 0 ? "Manage connectors" : "Connect your tools"} {connectorCount > 0 && ( - - {connectorCount} - + {connectorCount} )} @@ -685,7 +677,6 @@ const ComposerAction: FC = ({ isBlockedByOtherUser = false )}
- !thread.isRunning}> {hasThreads && (
diff --git a/surfsense_web/components/homepage/hero-section.tsx b/surfsense_web/components/homepage/hero-section.tsx index 2d2f1b478..5723b7e55 100644 --- a/surfsense_web/components/homepage/hero-section.tsx +++ b/surfsense_web/components/homepage/hero-section.tsx @@ -176,7 +176,6 @@ function GetStartedButton() { ); } - const BackgroundGrids = () => { return (
diff --git a/surfsense_web/components/layout/providers/LayoutDataProvider.tsx b/surfsense_web/components/layout/providers/LayoutDataProvider.tsx index 9d3ecdf92..f261684fb 100644 --- a/surfsense_web/components/layout/providers/LayoutDataProvider.tsx +++ b/surfsense_web/components/layout/providers/LayoutDataProvider.tsx @@ -696,7 +696,7 @@ export function LayoutDataProvider({ searchSpaceId, children }: LayoutDataProvid markAsRead: statusInbox.markAsRead, markAllAsRead: statusInbox.markAllAsRead, }, - }} + }} announcementsPanel={{ open: isAnnouncementsSidebarOpen, onOpenChange: setIsAnnouncementsSidebarOpen, diff --git a/surfsense_web/components/layout/ui/sidebar/ChatListItem.tsx b/surfsense_web/components/layout/ui/sidebar/ChatListItem.tsx index 82ba29ac9..902c11b44 100644 --- a/surfsense_web/components/layout/ui/sidebar/ChatListItem.tsx +++ b/surfsense_web/components/layout/ui/sidebar/ChatListItem.tsx @@ -1,12 +1,6 @@ "use client"; -import { - ArchiveIcon, - MoreHorizontal, - PenLine, - RotateCcwIcon, - Trash2, -} from "lucide-react"; +import { ArchiveIcon, MoreHorizontal, PenLine, RotateCcwIcon, Trash2 } from "lucide-react"; import { useTranslations } from "next-intl"; import { useCallback, useState } from "react"; import { Button } from "@/components/ui/button"; diff --git a/surfsense_web/components/layout/ui/sidebar/DocumentsSidebar.tsx b/surfsense_web/components/layout/ui/sidebar/DocumentsSidebar.tsx index 9e929b53b..2e3eb2419 100644 --- a/surfsense_web/components/layout/ui/sidebar/DocumentsSidebar.tsx +++ b/surfsense_web/components/layout/ui/sidebar/DocumentsSidebar.tsx @@ -14,8 +14,8 @@ import { import { sidebarSelectedDocumentsAtom } from "@/atoms/chat/mentioned-documents.atom"; import { connectorDialogOpenAtom } from "@/atoms/connector-dialog/connector-dialog.atoms"; import { deleteDocumentMutationAtom } from "@/atoms/documents/document-mutation.atoms"; -import { Button } from "@/components/ui/button"; import { Avatar, AvatarFallback, AvatarGroup } from "@/components/ui/avatar"; +import { Button } from "@/components/ui/button"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; import { getConnectorIcon } from "@/contracts/enums/connectorIcons"; import type { DocumentTypeEnum } from "@/contracts/types/document.types"; @@ -40,7 +40,12 @@ interface DocumentsSidebarProps { onDockedChange?: (docked: boolean) => void; } -export function DocumentsSidebar({ open, onOpenChange, isDocked = false, onDockedChange }: DocumentsSidebarProps) { +export function DocumentsSidebar({ + open, + onOpenChange, + isDocked = false, + onDockedChange, +}: DocumentsSidebarProps) { const t = useTranslations("documents"); const tSidebar = useTranslations("sidebar"); const params = useParams(); @@ -213,25 +218,20 @@ export function DocumentsSidebar({ open, onOpenChange, isDocked = false, onDocke
- {/* Connected tools strip */} + {/* Connected tools strip */}