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 } 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 { authenticationService } from '@/_services'; function DataSourcePicker({ dataSources, 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 { admin } = authenticationService.currentSessionValue; 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`); }; 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) => { return ( { handleChangeDataSource(source); }} className="text-truncate" data-cy={`${source.kind.toLowerCase().replace(/\s+/g, '-')}-add-query-card`} > {source.shortName} ); })}
{admin && ( 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={source.name} data-cy={`${String(source.name).toLowerCase().replace(/\s+/g, '-')}-add-query-card`} > {source.name} ))} )}
); } const EmptyDataSourceBanner = () => (
No global 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;