From 4d6186a43a4a520e0b526f0d9338ba1c7e84e8e5 Mon Sep 17 00:00:00 2001 From: Anish Sarkar <104695310+AnishSarkar22@users.noreply.github.com> Date: Wed, 31 Dec 2025 16:33:15 +0530 Subject: [PATCH] feat: Update SearxNG connector form validation, enhance connector connect view with additional properties, and refine type handling in connector dialog for improved schema compliance. --- .../connect-forms/components/searxng-connect-form.tsx | 5 +++-- .../connector-configs/views/connector-connect-view.tsx | 6 +++++- .../constants/connector-popup.schemas.ts | 2 +- .../connector-popup/hooks/use-connector-dialog.ts | 10 +++++++--- .../connector-popup/tabs/all-connectors-tab.tsx | 2 +- 5 files changed, 17 insertions(+), 8 deletions(-) diff --git a/surfsense_web/components/assistant-ui/connector-popup/connect-forms/components/searxng-connect-form.tsx b/surfsense_web/components/assistant-ui/connector-popup/connect-forms/components/searxng-connect-form.tsx index b1c19a612..f8ffc7c83 100644 --- a/surfsense_web/components/assistant-ui/connector-popup/connect-forms/components/searxng-connect-form.tsx +++ b/surfsense_web/components/assistant-ui/connector-popup/connect-forms/components/searxng-connect-form.tsx @@ -27,7 +27,8 @@ const searxngFormSchema = z.object({ message: "Connector name must be at least 3 characters.", }), host: z - .string({ required_error: "Host is required." }) + .string() + .min(1, { message: "Host is required." }) .url({ message: "Enter a valid SearxNG host URL (e.g. https://searxng.example.org)." }), api_key: z.string().optional(), engines: z.string().optional(), @@ -37,7 +38,7 @@ const searxngFormSchema = z.object({ .string() .regex(/^[0-2]?$/, { message: "SafeSearch must be 0, 1, or 2." }) .optional(), - verify_ssl: z.boolean().default(true), + verify_ssl: z.boolean(), }); type SearxngFormValues = z.infer; diff --git a/surfsense_web/components/assistant-ui/connector-popup/connector-configs/views/connector-connect-view.tsx b/surfsense_web/components/assistant-ui/connector-popup/connector-configs/views/connector-connect-view.tsx index 81605c44f..6827c6362 100644 --- a/surfsense_web/components/assistant-ui/connector-popup/connector-configs/views/connector-connect-view.tsx +++ b/surfsense_web/components/assistant-ui/connector-popup/connector-configs/views/connector-connect-view.tsx @@ -17,8 +17,12 @@ interface ConnectorConnectViewProps { is_indexable: boolean; last_indexed_at: null; periodic_indexing_enabled: boolean; - indexing_frequency_minutes: null; + indexing_frequency_minutes: number | null; next_scheduled_at: null; + startDate?: Date; + endDate?: Date; + periodicEnabled?: boolean; + frequencyMinutes?: string; }) => Promise; onBack: () => void; isSubmitting: boolean; diff --git a/surfsense_web/components/assistant-ui/connector-popup/constants/connector-popup.schemas.ts b/surfsense_web/components/assistant-ui/connector-popup/constants/connector-popup.schemas.ts index cafce6bba..49b398733 100644 --- a/surfsense_web/components/assistant-ui/connector-popup/constants/connector-popup.schemas.ts +++ b/surfsense_web/components/assistant-ui/connector-popup/constants/connector-popup.schemas.ts @@ -40,7 +40,7 @@ export type IndexingConfigState = z.infer; * Schema for frequency minutes (must be one of the allowed values) */ export const frequencyMinutesSchema = z.enum(["15", "60", "360", "720", "1440", "10080"], { - errorMap: () => ({ message: "Invalid frequency value" }), + message: "Invalid frequency value", }); export type FrequencyMinutes = z.infer; diff --git a/surfsense_web/components/assistant-ui/connector-popup/hooks/use-connector-dialog.ts b/surfsense_web/components/assistant-ui/connector-popup/hooks/use-connector-dialog.ts index 97bc06685..685d7ad65 100644 --- a/surfsense_web/components/assistant-ui/connector-popup/hooks/use-connector-dialog.ts +++ b/surfsense_web/components/assistant-ui/connector-popup/hooks/use-connector-dialog.ts @@ -232,7 +232,7 @@ export const useConnectorDialog = () => { // Handle OAuth connection const handleConnectOAuth = useCallback( - async (connector: (typeof OAUTH_CONNECTORS)[0]) => { + async (connector: (typeof OAUTH_CONNECTORS)[number]) => { if (!searchSpaceId || !connector.authEndpoint) return; // Set connecting state immediately to disable button and show spinner @@ -368,9 +368,13 @@ export const useConnectorDialog = () => { // Extract UI-only fields before sending to backend const { startDate, endDate, periodicEnabled, frequencyMinutes, ...connectorData } = formData; - // Create connector + // Create connector - ensure types match the schema const newConnector = await createConnector({ - data: connectorData, + data: { + ...connectorData, + connector_type: connectorData.connector_type as EnumConnectorName, + next_scheduled_at: connectorData.next_scheduled_at as string | null, + }, queryParams: { search_space_id: searchSpaceId, }, 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 30884e6d3..6143f1d54 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 @@ -12,7 +12,7 @@ interface AllConnectorsTabProps { connectedTypes: Set; connectingId: string | null; allConnectors: SearchSourceConnector[] | undefined; - onConnectOAuth: (connector: (typeof OAUTH_CONNECTORS)[0]) => void; + onConnectOAuth: (connector: (typeof OAUTH_CONNECTORS)[number]) => void; onConnectNonOAuth?: (connectorType: string) => void; onCreateWebcrawler?: () => void; onManage?: (connector: SearchSourceConnector) => void;