import React, { useState, useEffect } from "react"; import PropTypes from "prop-types"; import cx from "classnames"; import { react2angular } from "react2angular"; import { find } from "lodash"; 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) { // get recent if (!term) { return Query.recent().$promise.then(results => { const filteredResults = results.filter(item => !item.is_draft); // filter out draft return Promise.resolve(filteredResults); }); } // search by query return Query.query({ q: term }).$promise.then(({ results }) => Promise.resolve(results)); } export 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, }; export default function init(ngModule) { ngModule.component("querySelector", react2angular(QuerySelector)); } init.init = true;