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({
= ({ 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({