import React, { useState, useEffect } from 'react'; import Plus from '@/_ui/Icon/solidIcons/Plus'; import Information from '@/_ui/Icon/solidIcons/Information'; import { useTranslation } from 'react-i18next'; import { useNavigate } from 'react-router-dom'; import { getWorkspaceId, decodeEntities } from '@/_helpers/utils'; import { ButtonSolid } from '@/_ui/AppButton/AppButton'; import { SearchBox as SearchBox2 } from '@/_components/SearchBox'; import DataSourceIcon from './DataSourceIcon'; import { isEmpty } from 'lodash'; import { Col, Container, Row } from 'react-bootstrap'; import { useDataQueriesActions } from '@/_stores/dataQueriesStore'; import { useQueryPanelActions } from '@/_stores/queryPanelStore'; import { Tooltip } from 'react-tooltip'; import { canCreateDataSource } from '@/_helpers'; import SolidIcon from '@/_ui/Icon/SolidIcons'; import { isWorkflowsFeatureEnabled } from '@/modules/common/helpers/utils'; import '../queryManager.theme.scss'; function DataSourcePicker({ dataSources, sampleDataSource, staticDataSources, darkMode, globalDataSources }) { const allUserDefinedSources = [...dataSources, ...globalDataSources]; const [searchTerm, setSearchTerm] = useState(); const [filteredUserDefinedDataSources, setFilteredUserDefinedDataSources] = useState(allUserDefinedSources); const navigate = useNavigate(); const { createDataQuery } = useDataQueriesActions(); const { setPreviewData } = useQueryPanelActions(); const docLink = 'sampledb.com'; const handleChangeDataSource = (source) => { createDataQuery(source); setPreviewData(null); }; useEffect(() => { if (searchTerm) { const formattedSearchTerm = searchTerm.toLowerCase(); const filteredResults = allUserDefinedSources.filter( ({ name, kind }) => name.toLowerCase().includes(formattedSearchTerm) || kind.toLowerCase().includes(formattedSearchTerm) ); setFilteredUserDefinedDataSources(filteredResults); } else { setFilteredUserDefinedDataSources(allUserDefinedSources); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [searchTerm, globalDataSources, dataSources]); const handleAddClick = () => { const workspaceId = getWorkspaceId(); navigate(`/${workspaceId}/data-sources`); }; const workflowsEnabled = isWorkflowsFeatureEnabled(); return ( <>

Connect to a Data source

Select a Data source to start creating a new query. To know more about queries in ToolJet, you can read our   documentation

{staticDataSources.map((source) => { if (!workflowsEnabled && source.kind === 'workflows') return null; return ( { handleChangeDataSource(source); }} className="text-truncate" data-cy={`${source.kind.toLowerCase().replace(/\s+/g, '-')}-add-query-card`} > {source.shortName} ); })}
{!!sampleDataSource && (
{ handleChangeDataSource(sampleDataSource); }} className="text-truncate" data-cy={`${sampleDataSource.kind.toLowerCase().replace(/\s+/g, '-')}-sample-db-add-query-card`} > {' '} {sampleDataSource.kind == 'postgresql' ? 'PostgreSQL' : 'ToolJetDB'}
{/* Info icon */}

This is a shared resource and may show varying data due to real-time updates. It's reset daily for some consistency, but please note it's designed for user exploration, not production use.  Explore available data sources {' '}

)}
{canCreateDataSource() && ( Add new )}
{isEmpty(allUserDefinedSources) ? ( ) : ( {allUserDefinedSources.length > 4 && ( )} {filteredUserDefinedDataSources.map((source) => ( { handleChangeDataSource(source); }} data-tooltip-id="tooltip-for-query-panel-ds-picker-btn" data-tooltip-content={decodeEntities(source.name)} data-cy={`${String(source.name).toLowerCase().replace(/\s+/g, '-')}-add-query-card`} > {decodeEntities(source.name)} ))} )}
); } const EmptyDataSourceBanner = () => (
No Data sources have been added yet.
); const SearchBox = ({ onSearch, darkMode, searchTerm, dataCy }) => { const { t } = useTranslation(); return ( onSearch(e.target.value)} onClearCallback={() => onSearch('')} dataCy={dataCy} /> {/* */} ); }; export default DataSourcePicker;