diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/(manage)/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/(manage)/page.tsx index 244bc7d6f..fb803790b 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/(manage)/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/(manage)/page.tsx @@ -6,7 +6,6 @@ import { Calendar as CalendarIcon, Edit, Plus, RefreshCw, Trash2 } from "lucide- import { useParams, useRouter } from "next/navigation"; import { useEffect, useState } from "react"; import { toast } from "sonner"; -import { getConnectorIcon } from "@/components/chat"; import { AlertDialog, AlertDialogAction, @@ -41,6 +40,7 @@ import { } from "@/components/ui/table"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip"; import { EnumConnectorName } from "@/contracts/enums/connector"; +import { getConnectorIcon } from "@/contracts/enums/connectorIcons"; import { useSearchSourceConnectors } from "@/hooks/useSearchSourceConnectors"; import { cn } from "@/lib/utils"; diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/[connector_id]/edit/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/[connector_id]/edit/page.tsx index abd223a36..218a08cc2 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/[connector_id]/edit/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/[connector_id]/edit/page.tsx @@ -5,7 +5,6 @@ import { ArrowLeft, Check, Loader2 } from "lucide-react"; import { useParams, useRouter } from "next/navigation"; import { useEffect } from "react"; import { toast } from "sonner"; -import { getConnectorIcon } from "@/components/chat"; import { EditConnectorLoadingSkeleton } from "@/components/editConnector/EditConnectorLoadingSkeleton"; import { EditConnectorNameForm } from "@/components/editConnector/EditConnectorNameForm"; import { EditGitHubConnectorConfig } from "@/components/editConnector/EditGitHubConnectorConfig"; @@ -20,6 +19,7 @@ import { CardTitle, } from "@/components/ui/card"; import { Form } from "@/components/ui/form"; +import { getConnectorIcon } from "@/contracts/enums/connectorIcons"; import { useConnectorEditPage } from "@/hooks/useConnectorEditPage"; // Import Utils, Types, Hook, and Components import { getConnectorTypeDisplay } from "@/lib/connectors/utils"; diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/airtable-connector/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/airtable-connector/page.tsx index b17965bc1..b787374ef 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/airtable-connector/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/airtable-connector/page.tsx @@ -1,6 +1,5 @@ "use client"; -import { IconBrandAirtable } from "@tabler/icons-react"; import { motion } from "framer-motion"; import { ArrowLeft, Check, ExternalLink, Loader2 } from "lucide-react"; import Link from "next/link"; @@ -17,6 +16,8 @@ import { CardTitle, } from "@/components/ui/card"; import { EnumConnectorName } from "@/contracts/enums/connector"; +// import { IconBrandAirtable } from "@tabler/icons-react"; +import { getConnectorIcon } from "@/contracts/enums/connectorIcons"; import { type SearchSourceConnector, useSearchSourceConnectors, @@ -88,8 +89,8 @@ export default function AirtableConnectorPage() { Back to connectors
-
- +
+ {getConnectorIcon(EnumConnectorName.AIRTABLE_CONNECTOR, "h-6 w-6")}

Connect Airtable

diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/clickup-connector/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/clickup-connector/page.tsx index cfe0cb35d..0914a1c00 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/clickup-connector/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/clickup-connector/page.tsx @@ -20,6 +20,8 @@ import { FormMessage, } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; +import { EnumConnectorName } from "@/contracts/enums/connector"; +import { getConnectorIcon } from "@/contracts/enums/connectorIcons"; import { useSearchSourceConnectors } from "@/hooks/useSearchSourceConnectors"; // Define the form schema with Zod @@ -59,7 +61,7 @@ export default function ClickUpConnectorPage() { try { const connectorData = { name: values.name, - connector_type: "CLICKUP_CONNECTOR", + connector_type: EnumConnectorName.CLICKUP_CONNECTOR, is_indexable: true, config: { CLICKUP_API_TOKEN: values.api_token, @@ -90,6 +92,21 @@ export default function ClickUpConnectorPage() { Back to Connectors + {/* Header */} +
+
+
+ {getConnectorIcon(EnumConnectorName.CLICKUP_CONNECTOR, "h-6 w-6")} +
+
+

Connect ClickUp

+

+ Connect your ClickUp workspace to search tasks and projects. +

+
+
+
+ ClickUp Configuration diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/confluence-connector/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/confluence-connector/page.tsx index 12f426958..2eb767bf4 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/confluence-connector/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/confluence-connector/page.tsx @@ -22,7 +22,8 @@ import { } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; - +import { EnumConnectorName } from "@/contracts/enums/connector"; +import { getConnectorIcon } from "@/contracts/enums/connectorIcons"; import { useSearchSourceConnectors } from "@/hooks/useSearchSourceConnectors"; // Define the form schema with Zod @@ -78,7 +79,7 @@ export default function ConfluenceConnectorPage() { try { await createConnector({ name: values.name, - connector_type: "CONFLUENCE_CONNECTOR", + connector_type: EnumConnectorName.CONFLUENCE_CONNECTOR, config: { CONFLUENCE_BASE_URL: values.base_url, CONFLUENCE_EMAIL: values.email, @@ -111,6 +112,21 @@ export default function ConfluenceConnectorPage() { Back to Connectors + {/* Header */} +
+
+
+ {getConnectorIcon(EnumConnectorName.CONFLUENCE_CONNECTOR, "h-6 w-6")} +
+
+

Connect Confluence

+

+ Connect your Confluence instance to search pages and spaces. +

+
+
+
+ + {/* Header */} +
+
+
+ {getConnectorIcon(EnumConnectorName.DISCORD_CONNECTOR, "h-6 w-6")} +
+
+

Connect Discord

+

+ Connect your Discord server to search messages and channels. +

+
+
+
+ {step === "enter_pat" ? ( - + getConnectorIcon(EnumConnectorName.GITHUB_CONNECTOR, "h-6 w-6") ) : ( )} diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/google-calendar-connector/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/google-calendar-connector/page.tsx index fb04a27d7..b04a5eddc 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/google-calendar-connector/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/google-calendar-connector/page.tsx @@ -1,7 +1,6 @@ "use client"; import { zodResolver } from "@hookform/resolvers/zod"; -import { IconCalendar } from "@tabler/icons-react"; import { motion } from "framer-motion"; import { ArrowLeft, Check, ExternalLink, Loader2 } from "lucide-react"; import Link from "next/link"; @@ -19,6 +18,8 @@ import { CardHeader, CardTitle, } from "@/components/ui/card"; +import { EnumConnectorName } from "@/contracts/enums/connector"; +import { getConnectorIcon } from "@/contracts/enums/connectorIcons"; import { type SearchSourceConnector, useSearchSourceConnectors, @@ -36,7 +37,8 @@ export default function GoogleCalendarConnectorPage() { useEffect(() => { fetchConnectors().then((data) => { const connector = data.find( - (c: SearchSourceConnector) => c.connector_type === "GOOGLE_CALENDAR_CONNECTOR" + (c: SearchSourceConnector) => + c.connector_type === EnumConnectorName.GOOGLE_CALENDAR_CONNECTOR ); if (connector) { setDoesConnectorExist(true); @@ -92,8 +94,8 @@ export default function GoogleCalendarConnectorPage() { Back to connectors
-
- +
+ {getConnectorIcon(EnumConnectorName.GOOGLE_CALENDAR_CONNECTOR, "h-6 w-6")}

Connect Google Calendar

diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/google-gmail-connector/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/google-gmail-connector/page.tsx index 6c130bf8f..43123ec4b 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/google-gmail-connector/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/google-gmail-connector/page.tsx @@ -1,7 +1,6 @@ "use client"; import { zodResolver } from "@hookform/resolvers/zod"; -import { IconMail } from "@tabler/icons-react"; import { motion } from "framer-motion"; import { ArrowLeft, Check, ExternalLink, Loader2 } from "lucide-react"; import Link from "next/link"; @@ -19,6 +18,8 @@ import { CardHeader, CardTitle, } from "@/components/ui/card"; +import { EnumConnectorName } from "@/contracts/enums/connector"; +import { getConnectorIcon } from "@/contracts/enums/connectorIcons"; import { type SearchSourceConnector, useSearchSourceConnectors, @@ -36,7 +37,7 @@ export default function GoogleGmailConnectorPage() { useEffect(() => { fetchConnectors().then((data) => { const connector = data.find( - (c: SearchSourceConnector) => c.connector_type === "GOOGLE_GMAIL_CONNECTOR" + (c: SearchSourceConnector) => c.connector_type === EnumConnectorName.GOOGLE_GMAIL_CONNECTOR ); if (connector) { setDoesConnectorExist(true); @@ -92,8 +93,8 @@ export default function GoogleGmailConnectorPage() { Back to connectors
-
- +
+ {getConnectorIcon(EnumConnectorName.GOOGLE_GMAIL_CONNECTOR, "h-6 w-6")}

Connect Google Gmail

diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/jira-connector/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/jira-connector/page.tsx index 59f9340fb..c7d4466b8 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/jira-connector/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/jira-connector/page.tsx @@ -35,6 +35,8 @@ import { } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; +import { EnumConnectorName } from "@/contracts/enums/connector"; +import { getConnectorIcon } from "@/contracts/enums/connectorIcons"; import { useSearchSourceConnectors } from "@/hooks/useSearchSourceConnectors"; // Define the form schema with Zod @@ -90,7 +92,7 @@ export default function JiraConnectorPage() { try { await createConnector({ name: values.name, - connector_type: "JIRA_CONNECTOR", + connector_type: EnumConnectorName.JIRA_CONNECTOR, config: { JIRA_BASE_URL: values.base_url, JIRA_EMAIL: values.email, @@ -123,6 +125,21 @@ export default function JiraConnectorPage() { Back to Connectors + {/* Header */} +
+
+
+ {getConnectorIcon(EnumConnectorName.JIRA_CONNECTOR, "h-6 w-6")} +
+
+

Connect Jira

+

+ Connect your Jira instance to search issues and tickets. +

+
+
+
+ + {/* Header */} +
+
+
+ {getConnectorIcon(EnumConnectorName.LINEAR_CONNECTOR, "h-6 w-6")} +
+
+

Connect Linear

+

+ Connect your Linear workspace to search issues and projects. +

+
+
+
+ + {/* Header */} +
+
+
+ {getConnectorIcon(EnumConnectorName.LINKUP_API, "h-6 w-6")} +
+
+

Connect Linkup API

+

+ Connect Linkup API for enhanced search capabilities. +

+
+
+
+ + {/* Header */} +
+
+
+ {getConnectorIcon(EnumConnectorName.NOTION_CONNECTOR, "h-6 w-6")} +
+
+

Connect Notion

+

+ Connect your Notion workspace to search pages and databases. +

+
+
+
+ , + icon: getConnectorIcon(EnumConnectorName.TAVILY_API, "h-6 w-6"), status: "available", }, { id: "linkup-api", title: "Linkup API", description: "Search the web using the Linkup API", - icon: , + icon: getConnectorIcon(EnumConnectorName.LINKUP_API, "h-6 w-6"), status: "available", }, ], @@ -73,7 +62,7 @@ const connectorCategories: ConnectorCategory[] = [ id: "slack-connector", title: "Slack", description: "Connect to your Slack workspace to access messages and channels.", - icon: , + icon: getConnectorIcon(EnumConnectorName.SLACK_CONNECTOR, "h-6 w-6"), status: "available", }, { @@ -87,7 +76,7 @@ const connectorCategories: ConnectorCategory[] = [ id: "discord-connector", title: "Discord", description: "Connect to Discord servers to access messages and channels.", - icon: , + icon: getConnectorIcon(EnumConnectorName.DISCORD_CONNECTOR, "h-6 w-6"), status: "available", }, ], @@ -100,21 +89,21 @@ const connectorCategories: ConnectorCategory[] = [ id: "linear-connector", title: "Linear", description: "Connect to Linear to search issues, comments and project data.", - icon: , + icon: getConnectorIcon(EnumConnectorName.LINEAR_CONNECTOR, "h-6 w-6"), status: "available", }, { id: "jira-connector", title: "Jira", description: "Connect to Jira to search issues, tickets and project data.", - icon: , + icon: getConnectorIcon(EnumConnectorName.JIRA_CONNECTOR, "h-6 w-6"), status: "available", }, { id: "clickup-connector", title: "ClickUp", description: "Connect to ClickUp to search tasks, comments and project data.", - icon: , + icon: getConnectorIcon(EnumConnectorName.CLICKUP_CONNECTOR, "h-6 w-6"), status: "available", }, ], @@ -127,28 +116,28 @@ const connectorCategories: ConnectorCategory[] = [ id: "notion-connector", title: "Notion", description: "Connect to your Notion workspace to access pages and databases.", - icon: , + icon: getConnectorIcon(EnumConnectorName.NOTION_CONNECTOR, "h-6 w-6"), status: "available", }, { id: "github-connector", title: "GitHub", description: "Connect a GitHub PAT to index code and docs from accessible repositories.", - icon: , + icon: getConnectorIcon(EnumConnectorName.GITHUB_CONNECTOR, "h-6 w-6"), status: "available", }, { id: "confluence-connector", title: "Confluence", description: "Connect to Confluence to search pages, comments and documentation.", - icon: , + icon: getConnectorIcon(EnumConnectorName.CONFLUENCE_CONNECTOR, "h-6 w-6"), status: "available", }, { id: "airtable-connector", title: "Airtable", description: "Connect to Airtable to search records, tables and database content.", - icon: , + icon: getConnectorIcon(EnumConnectorName.AIRTABLE_CONNECTOR, "h-6 w-6"), status: "available", }, ], @@ -161,14 +150,14 @@ const connectorCategories: ConnectorCategory[] = [ id: "google-calendar-connector", title: "Google Calendar", description: "Connect to Google Calendar to search events, meetings and schedules.", - icon: , + icon: getConnectorIcon(EnumConnectorName.GOOGLE_CALENDAR_CONNECTOR, "h-6 w-6"), status: "available", }, { id: "google-gmail-connector", title: "Gmail", description: "Connect to your Gmail account to search through your emails.", - icon: , + icon: getConnectorIcon(EnumConnectorName.GOOGLE_GMAIL_CONNECTOR, "h-6 w-6"), status: "available", }, { diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/serper-api/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/serper-api/page.tsx index 4cd7c53f4..667126e8e 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/serper-api/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/serper-api/page.tsx @@ -28,6 +28,8 @@ import { FormMessage, } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; +import { EnumConnectorName } from "@/contracts/enums/connector"; +import { getConnectorIcon } from "@/contracts/enums/connectorIcons"; import { useSearchSourceConnectors } from "@/hooks/useSearchSourceConnectors"; // Define the form schema with Zod @@ -65,7 +67,7 @@ export default function SerperApiPage() { try { await createConnector({ name: values.name, - connector_type: "SERPER_API", + connector_type: EnumConnectorName.SERPER_API, config: { SERPER_API_KEY: values.api_key, }, @@ -96,6 +98,21 @@ export default function SerperApiPage() { Back to Connectors + {/* Header */} +
+
+
+ {getConnectorIcon(EnumConnectorName.SERPER_API, "h-6 w-6")} +
+
+

Connect Serper API

+

+ Connect Serper API for Google search capabilities. +

+
+
+
+ + {/* Header */} +
+
+
+ {getConnectorIcon(EnumConnectorName.SLACK_CONNECTOR, "h-6 w-6")} +
+
+

Connect Slack

+

+ Connect your Slack workspace to search messages and channels. +

+
+
+
+ + {/* Header */} +
+
+
+ {getConnectorIcon(EnumConnectorName.TAVILY_API, "h-6 w-6")} +
+
+

Connect Tavily API

+

+ Connect Tavily API for AI-powered search capabilities. +

+
+
+
+ ; -const documentTypeIcons: Record = { - EXTENSION: Webhook, - CRAWLED_URL: Globe, - SLACK_CONNECTOR: IconBrandSlack, - NOTION_CONNECTOR: IconBrandNotion, - FILE: File, - YOUTUBE_VIDEO: IconBrandYoutube, - GITHUB_CONNECTOR: IconBrandGithub, - LINEAR_CONNECTOR: IconLayoutKanban, - JIRA_CONNECTOR: IconTicket, - DISCORD_CONNECTOR: IconBrandDiscord, - CONFLUENCE_CONNECTOR: IconBook, - CLICKUP_CONNECTOR: IconChecklist, - GOOGLE_CALENDAR_CONNECTOR: IconCalendar, - GOOGLE_GMAIL_CONNECTOR: IconMail, - AIRTABLE_CONNECTOR: IconTable, -}; - -export function getDocumentTypeIcon(type: string): IconComponent { - return documentTypeIcons[type] ?? File; +export function getDocumentTypeIcon(type: string): React.ReactNode { + return getConnectorIcon(type); } export function getDocumentTypeLabel(type: string): string { @@ -49,7 +17,7 @@ export function getDocumentTypeLabel(type: string): string { } export function DocumentTypeChip({ type, className }: { type: string; className?: string }) { - const Icon = getDocumentTypeIcon(type); + const icon = getDocumentTypeIcon(type); return ( - + {icon} {getDocumentTypeLabel(type)} ); 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 12da30045..d9f9bb251 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 @@ -197,7 +197,7 @@ export function DocumentsTableShell({ {sorted.map((doc, index) => { - const Icon = getDocumentTypeIcon(doc.document_type); + const icon = getDocumentTypeIcon(doc.document_type); const title = doc.title; const truncatedTitle = title.length > 30 ? `${title.slice(0, 30)}...` : title; return ( @@ -235,7 +235,7 @@ export function DocumentsTableShell({ - + {icon} {truncatedTitle} @@ -293,7 +293,7 @@ export function DocumentsTableShell({
{sorted.map((doc) => { - const Icon = getDocumentTypeIcon(doc.document_type); + const icon = getDocumentTypeIcon(doc.document_type); return (
@@ -305,7 +305,7 @@ export function DocumentsTableShell({
- + {icon}
{doc.title}
= ({ index, - + {getConnectorIcon(sourceType)} {document?.title || node?.metadata?.title || node?.metadata?.group_name || "Source"} diff --git a/surfsense_web/components/chat/ChatInputGroup.tsx b/surfsense_web/components/chat/ChatInputGroup.tsx index 6e54a8f35..1f5cc6d31 100644 --- a/surfsense_web/components/chat/ChatInputGroup.tsx +++ b/surfsense_web/components/chat/ChatInputGroup.tsx @@ -5,10 +5,7 @@ import { Brain, Check, FolderOpen, Zap } from "lucide-react"; import { useParams } from "next/navigation"; import React, { Suspense, useCallback, useState } from "react"; import type { ResearchMode } from "@/components/chat"; -import { - ConnectorButton as ConnectorButtonComponent, - getConnectorIcon, -} from "@/components/chat/ConnectorComponents"; +import { ConnectorButton as ConnectorButtonComponent } from "@/components/chat/ConnectorComponents"; import { DocumentsDataTable } from "@/components/chat/DocumentsDataTable"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; @@ -27,6 +24,7 @@ import { SelectTrigger, SelectValue, } from "@/components/ui/select"; +import { getConnectorIcon } from "@/contracts/enums/connectorIcons"; import { type Document, useDocuments } from "@/hooks/use-documents"; import { useLLMConfigs, useLLMPreferences } from "@/hooks/use-llm-configs"; import { useSearchSourceConnectors } from "@/hooks/useSearchSourceConnectors"; diff --git a/surfsense_web/components/chat/ChatSources.tsx b/surfsense_web/components/chat/ChatSources.tsx index c74369e35..625a81fa1 100644 --- a/surfsense_web/components/chat/ChatSources.tsx +++ b/surfsense_web/components/chat/ChatSources.tsx @@ -1,31 +1,14 @@ "use client"; import { getAnnotationData, type Message } from "@llamaindex/chat-ui"; -import { - IconBrandDiscord, - IconBrandGithub, - IconBrandNotion, - IconBrandSlack, - IconBrandYoutube, -} from "@tabler/icons-react"; -import { - BookOpen, - Calendar, - CheckSquare, - Database, - ExternalLink, - FileText, - Globe, - Link2, - Mail, - Puzzle, -} from "lucide-react"; +import { ExternalLink, FileText } from "lucide-react"; import { useState } from "react"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetTrigger } from "@/components/ui/sheet"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; +import { getConnectorIcon } from "@/contracts/enums/connectorIcons"; interface Source { id: string; @@ -56,86 +39,11 @@ interface SourceNode { } function getSourceIcon(type: string) { - switch (type) { - // GitHub - case "USER_SELECTED_GITHUB_CONNECTOR": - case "GITHUB_CONNECTOR": - return ; - - // Notion - case "USER_SELECTED_NOTION_CONNECTOR": - case "NOTION_CONNECTOR": - return ; - - // Slack - case "USER_SELECTED_SLACK_CONNECTOR": - case "SLACK_CONNECTOR": - return ; - - // Discord - case "USER_SELECTED_DISCORD_CONNECTOR": - case "DISCORD_CONNECTOR": - return ; - - // Google Calendar - case "USER_SELECTED_GOOGLE_CALENDAR_CONNECTOR": - case "GOOGLE_CALENDAR_CONNECTOR": - return ; - - // Google Gmail - case "USER_SELECTED_GOOGLE_GMAIL_CONNECTOR": - case "GOOGLE_GMAIL_CONNECTOR": - return ; - - // Airtable - case "USER_SELECTED_AIRTABLE_CONNECTOR": - case "AIRTABLE_CONNECTOR": - return ; - - // YouTube - case "USER_SELECTED_YOUTUBE_VIDEO": - case "YOUTUBE_VIDEO": - return ; - - // Linear - case "USER_SELECTED_LINEAR_CONNECTOR": - case "LINEAR_CONNECTOR": - return ; - - // Jira - case "USER_SELECTED_JIRA_CONNECTOR": - case "JIRA_CONNECTOR": - return ; - - // Confluence - case "USER_SELECTED_CONFLUENCE_CONNECTOR": - case "CONFLUENCE_CONNECTOR": - return ; - - // ClickUp - case "USER_SELECTED_CLICKUP_CONNECTOR": - case "CLICKUP_CONNECTOR": - return ; - - // Files - case "USER_SELECTED_FILE": - case "FILE": - return ; - - // Extension - case "USER_SELECTED_EXTENSION": - case "EXTENSION": - return ; - - // Crawled URL - case "USER_SELECTED_CRAWLED_URL": - case "CRAWLED_URL": - return ; - - // Default for any other source type - default: - return ; - } + // Handle USER_SELECTED_ prefix + const normalizedType = type.startsWith("USER_SELECTED_") + ? type.replace("USER_SELECTED_", "") + : type; + return getConnectorIcon(normalizedType, "h-4 w-4"); } function SourceCard({ source }: { source: Source }) { diff --git a/surfsense_web/components/chat/ConnectorComponents.tsx b/surfsense_web/components/chat/ConnectorComponents.tsx index d016fb49e..19058b4b2 100644 --- a/surfsense_web/components/chat/ConnectorComponents.tsx +++ b/surfsense_web/components/chat/ConnectorComponents.tsx @@ -1,81 +1,9 @@ -import { - IconBrandDiscord, - IconBrandGithub, - IconBrandNotion, - IconBrandSlack, - IconBrandYoutube, - IconCalendar, - IconLayoutKanban, - IconLinkPlus, - IconMail, - IconTable, - IconTicket, -} from "@tabler/icons-react"; -import { - ChevronDown, - File, - FileText, - Globe, - Link, - MessageCircle, - Microscope, - Plus, - Search, - Sparkles, - Telescope, - Webhook, -} from "lucide-react"; +import { ChevronDown, FileText, MessageCircle, Plus } from "lucide-react"; import type React from "react"; import { Button } from "@/components/ui/button"; +import { getConnectorIcon } from "@/contracts/enums/connectorIcons"; import type { Connector, ResearchMode } from "./types"; -// Helper function to get connector icon -export const getConnectorIcon = (connectorType: string) => { - const iconProps = { className: "h-4 w-4" }; - - switch (connectorType) { - case "LINKUP_API": - return ; - case "LINEAR_CONNECTOR": - return ; - case "GITHUB_CONNECTOR": - return ; - case "YOUTUBE_VIDEO": - return ; - case "CRAWLED_URL": - return ; - case "FILE": - return ; - case "EXTENSION": - return ; - case "SERPER_API": - case "TAVILY_API": - return ; - case "SLACK_CONNECTOR": - return ; - case "NOTION_CONNECTOR": - return ; - case "DISCORD_CONNECTOR": - return ; - case "JIRA_CONNECTOR": - return ; - case "GOOGLE_CALENDAR_CONNECTOR": - return ; - case "GOOGLE_GMAIL_CONNECTOR": - return ; - case "AIRTABLE_CONNECTOR": - return ; - case "DEEP": - return ; - case "DEEPER": - return ; - case "DEEPEST": - return ; - default: - return ; - } -}; - export const researcherOptions: { value: ResearchMode; label: string; diff --git a/surfsense_web/components/chat/DocumentsDataTable.tsx b/surfsense_web/components/chat/DocumentsDataTable.tsx index d7a240df9..79b6216b3 100644 --- a/surfsense_web/components/chat/DocumentsDataTable.tsx +++ b/surfsense_web/components/chat/DocumentsDataTable.tsx @@ -14,7 +14,6 @@ import { } from "@tanstack/react-table"; import { ArrowUpDown, Calendar, FileText, Search } from "lucide-react"; import { useEffect, useMemo, useState } from "react"; -import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Checkbox } from "@/components/ui/checkbox"; import { Input } from "@/components/ui/input"; @@ -33,6 +32,8 @@ import { TableHeader, TableRow, } from "@/components/ui/table"; +import { EnumConnectorName } from "@/contracts/enums/connector"; +import { getConnectorIcon } from "@/contracts/enums/connectorIcons"; import type { Document, DocumentType } from "@/hooks/use-documents"; interface DocumentsDataTableProps { @@ -42,42 +43,16 @@ interface DocumentsDataTableProps { initialSelectedDocuments?: Document[]; } -const DOCUMENT_TYPES: (DocumentType | "ALL")[] = [ +// Combine EnumConnectorName with additional document types +const DOCUMENT_TYPES: (string | "ALL")[] = [ "ALL", "FILE", "EXTENSION", "CRAWLED_URL", "YOUTUBE_VIDEO", - "SLACK_CONNECTOR", - "NOTION_CONNECTOR", - "GITHUB_CONNECTOR", - "LINEAR_CONNECTOR", - "DISCORD_CONNECTOR", - "JIRA_CONNECTOR", - "CONFLUENCE_CONNECTOR", - "CLICKUP_CONNECTOR", - "GOOGLE_CALENDAR_CONNECTOR", - "GOOGLE_GMAIL_CONNECTOR", - "AIRTABLE_CONNECTOR", + ...Object.values(EnumConnectorName), ]; -const getDocumentTypeColor = (type: DocumentType) => { - const colors = { - FILE: "bg-blue-50 text-blue-700 border-blue-200", - EXTENSION: "bg-green-50 text-green-700 border-green-200", - CRAWLED_URL: "bg-purple-50 text-purple-700 border-purple-200", - YOUTUBE_VIDEO: "bg-red-50 text-red-700 border-red-200", - SLACK_CONNECTOR: "bg-yellow-50 text-yellow-700 border-yellow-200", - NOTION_CONNECTOR: "bg-indigo-50 text-indigo-700 border-indigo-200", - GITHUB_CONNECTOR: "bg-gray-50 text-gray-700 border-gray-200", - LINEAR_CONNECTOR: "bg-pink-50 text-pink-700 border-pink-200", - DISCORD_CONNECTOR: "bg-violet-50 text-violet-700 border-violet-200", - JIRA_CONNECTOR: "bg-orange-50 text-orange-700 border-orange-200", - CONFLUENCE_CONNECTOR: "bg-teal-50 text-teal-700 border-teal-200", - }; - return colors[type] || "bg-gray-50 text-gray-700 border-gray-200"; -}; - const columns: ColumnDef[] = [ { id: "select", @@ -133,13 +108,9 @@ const columns: ColumnDef[] = [ cell: ({ row }) => { const type = row.getValue("document_type") as DocumentType; return ( - - {type.replace(/_/g, " ")} - {type.split("_")[0]} - +
+ {getConnectorIcon(type)} +
); }, size: 80, @@ -214,7 +185,7 @@ export function DocumentsDataTable({ const [sorting, setSorting] = useState([]); const [columnFilters, setColumnFilters] = useState([]); const [columnVisibility, setColumnVisibility] = useState({}); - const [documentTypeFilter, setDocumentTypeFilter] = useState("ALL"); + const [documentTypeFilter, setDocumentTypeFilter] = useState("ALL"); // Memoize initial row selection to prevent infinite loops const initialRowSelection = useMemo(() => { @@ -311,7 +282,7 @@ export function DocumentsDataTable({