diff --git a/surfsense_web/components/assistant-ui/connector-popup/tabs/active-connectors-tab.tsx b/surfsense_web/components/assistant-ui/connector-popup/tabs/active-connectors-tab.tsx index 3dd4fd1d0..04e819bc8 100644 --- a/surfsense_web/components/assistant-ui/connector-popup/tabs/active-connectors-tab.tsx +++ b/surfsense_web/components/assistant-ui/connector-popup/tabs/active-connectors-tab.tsx @@ -12,6 +12,7 @@ import type { SearchSourceConnector } from "@/contracts/types/connector.types"; import type { LogActiveTask, LogSummary } from "@/contracts/types/log.types"; import { cn } from "@/lib/utils"; import { getDocumentCountForConnector } from "../utils/connector-document-mapping"; +import { getConnectorDisplayName } from "./all-connectors-tab"; interface ActiveConnectorsTabProps { searchQuery: string; @@ -171,7 +172,7 @@ export const ActiveConnectorsTab: FC = ({

- {connector.name} + {getConnectorDisplayName(connector.name)}

{isIndexing ? (

diff --git a/surfsense_web/components/assistant-ui/connector-popup/tabs/all-connectors-tab.tsx b/surfsense_web/components/assistant-ui/connector-popup/tabs/all-connectors-tab.tsx index bdec4dcb2..0be4e7e87 100644 --- a/surfsense_web/components/assistant-ui/connector-popup/tabs/all-connectors-tab.tsx +++ b/surfsense_web/components/assistant-ui/connector-popup/tabs/all-connectors-tab.tsx @@ -1,12 +1,27 @@ "use client"; +import { Plus } from "lucide-react"; import type { FC } from "react"; +import { Button } from "@/components/ui/button"; import type { SearchSourceConnector } from "@/contracts/types/connector.types"; import type { LogActiveTask, LogSummary } from "@/contracts/types/log.types"; import { ConnectorCard } from "../components/connector-card"; import { CRAWLERS, OAUTH_CONNECTORS, OTHER_CONNECTORS } from "../constants/connector-constants"; import { getDocumentCountForConnector } from "../utils/connector-document-mapping"; +/** + * Extract the display name from a full connector name. + * Full names are in format "Base Name - identifier" (e.g., "Gmail - john@example.com"). + * Returns just the identifier (e.g : john@example.com). + */ +export function getConnectorDisplayName(fullName: string): string { + const separatorIndex = fullName.indexOf(" - "); + if (separatorIndex !== -1) { + return fullName.substring(separatorIndex + 3); + } + return fullName; +} + interface AllConnectorsTabProps { searchQuery: string; searchSpaceId: string; @@ -67,56 +82,78 @@ export const AllConnectorsTab: FC = ({ return (

- {/* Quick Connect */} - {filteredOAuth.length > 0 && ( -
-
-

Quick Connect

-
-
- {filteredOAuth.map((connector) => { - const isConnected = connectedTypes.has(connector.connectorType); - const isConnecting = connectingId === connector.id; - // Find the actual connector object if connected - const actualConnector = - isConnected && allConnectors - ? allConnectors.find( - (c: SearchSourceConnector) => c.connector_type === connector.connectorType - ) - : undefined; + {/* Per-Type OAuth Connector Groups */} + {filteredOAuth.map((connectorType) => { + const userConnectors = + allConnectors?.filter( + (c: SearchSourceConnector) => c.connector_type === connectorType.connectorType + ) || []; + const isConnecting = connectingId === connectorType.id; - const documentCount = getDocumentCountForConnector( - connector.connectorType, - documentTypeCounts - ); - const isIndexing = actualConnector && indexingConnectorIds?.has(actualConnector.id); - const activeTask = actualConnector - ? getActiveTaskForConnector(actualConnector.id) - : undefined; + return ( +
+ {/* Group Header */} +
+

+ {connectorType.title} Integrations +

+ {userConnectors.length > 0 && ( + + )} +
- return ( +
+ {userConnectors.length === 0 ? ( onConnectOAuth(connector)} - onManage={ - actualConnector && onManage ? () => onManage(actualConnector) : undefined - } + onConnect={() => onConnectOAuth(connectorType)} /> - ); - })} -
-
- )} + ) : ( + userConnectors.map((connector: SearchSourceConnector) => { + const documentCount = getDocumentCountForConnector( + connector.connector_type, + documentTypeCounts + ); + const isIndexing = indexingConnectorIds?.has(connector.id); + const activeTask = getActiveTaskForConnector(connector.id); + + return ( + onConnectOAuth(connectorType)} + onManage={onManage ? () => onManage(connector) : undefined} + /> + ); + }) + )} +
+
+ ); + })} {/* More Integrations */} {filteredOther.length > 0 && (