import { find } from "lodash"; import React, { useState, useEffect } from "react"; import PropTypes from "prop-types"; import cx from "classnames"; import Input from "antd/lib/input"; import Select from "antd/lib/select"; import { Query } from "@/services/query"; import notification from "@/services/notification"; import { QueryTagsControl } from "@/components/tags-control/TagsControl"; import useSearchResults from "@/lib/hooks/useSearchResults"; const { Option } = Select; function search(term) { if (term === null) { return Promise.resolve(null); } // get recent if (!term) { return Query.recent().then(results => results.filter(item => !item.is_draft)); // filter out draft } // search by query return Query.query({ q: term }).then(({ results }) => results); } export default function QuerySelector(props) { const [searchTerm, setSearchTerm] = useState(""); const [selectedQuery, setSelectedQuery] = useState(); const [doSearch, searchResults, searching] = useSearchResults(search, { initialResults: [] }); const placeholder = "Search a query by name"; const clearIcon = selectQuery(null)} />; const spinIcon = ; useEffect(() => { doSearch(searchTerm); }, [doSearch, searchTerm]); // set selected from prop useEffect(() => { if (props.selectedQuery) { setSelectedQuery(props.selectedQuery); } }, [props.selectedQuery]); function selectQuery(queryId) { let query = null; if (queryId) { query = find(searchResults, { id: queryId }); if (!query) { // shouldn't happen notification.error("Something went wrong...", "Couldn't select query"); } } setSearchTerm(query ? null : ""); // empty string triggers recent fetch setSelectedQuery(query); props.onChange(query); } function renderResults() { if (!searchResults.length) { return
No results matching search term.
; } return (
{searchResults.map(q => ( selectQuery(q.id)} data-test={`QueryId${q.id}`}> {q.name} ))}
); } if (props.disabled) { return ; } if (props.type === "select") { const suffixIcon = selectedQuery ? clearIcon : null; const value = selectedQuery ? selectedQuery.name : searchTerm; return ( ); } return ( {selectedQuery ? ( ) : ( setSearchTerm(e.target.value)} suffix={spinIcon} /> )}
{searchResults && renderResults()}
); } QuerySelector.propTypes = { onChange: PropTypes.func.isRequired, selectedQuery: PropTypes.object, // eslint-disable-line react/forbid-prop-types type: PropTypes.oneOf(["select", "default"]), className: PropTypes.string, disabled: PropTypes.bool, }; QuerySelector.defaultProps = { selectedQuery: null, type: "default", className: null, disabled: false, };