import { Combobox, ComboboxButton, ComboboxInput, ComboboxOption, ComboboxOptions, } from "@headlessui/react"; import sourceConfigsData from "@site/src/data/source-configs-dereferenced.json"; import styles from "./SourceConfiguration.module.css"; import { useState, useMemo } from "react"; /** * Component to display configuration fields based on selected source type * Uses OpenAPI plugin classnames for perfect visual consistency */ const ConfigurationFields = ({ selectedSourceId, configSchema, }: { selectedSourceId: string; configSchema: any; }) => { const selectedConfig = configSchema.oneOf?.find( (config) => config.title === selectedSourceId, ); if (!selectedConfig) { return null; } const requiredFields = selectedConfig.required || []; const properties = selectedConfig.properties || {}; // Sort properties: required first, then optional const sortedEntries = Object.entries(properties).sort(([nameA], [nameB]) => { const aRequired = requiredFields.includes(nameA); const bRequired = requiredFields.includes(nameB); if (aRequired === bRequired) return 0; return aRequired ? -1 : 1; }); return ( ); }; export const SourceConfiguration = ({ endpointData }) => { const [sourceConfigs] = useState(sourceConfigsData); const [searchQuery, setSearchQuery] = useState(""); const [selectedSource, setSelectedSource] = useState( sourceConfigsData.length > 0 ? sourceConfigsData[0] : null, ); const [bodyExpanded, setBodyExpanded] = useState(true); const [configExpanded, setConfigExpanded] = useState(true); const [fieldValues, setFieldValues] = useState({}); // Filter sources based on search query console.log("Source configs data:", endpointData); const filteredSources = useMemo(() => { if (!searchQuery.trim()) { return sourceConfigs; } const query = searchQuery.toLowerCase(); return sourceConfigs.filter( (source) => source.displayName.toLowerCase().includes(query) || source.id.toLowerCase().includes(query), ); }, [searchQuery, sourceConfigs]); const handleSourceSelect = (source) => { console.log("Selected source:", source); setSelectedSource(source); }; return ( <> {endpointData?.configurationSchema && ( <> {/* Combobox for source selection */} setSearchQuery("")} >
source?.id ?? ""} onChange={(event) => setSearchQuery(event.target.value)} autoComplete="off" />
{filteredSources.length === 0 ? (
{searchQuery ? `No sources found for "${searchQuery}"` : "No sources available"}
) : ( filteredSources.map((source) => ( `${styles.option} ${active ? styles.active : ""} ${ selected ? styles.selected : "" }` } > {source.id} )) )}
{/* Display configuration schema properties for selected source */} {/* Display required properties for selected source */} {selectedSource && endpointData.configurationSchema.oneOf && ( )} )} ); };