import React, { useState, useCallback, useContext } from "react"; import { filter, includes } from "lodash"; import { AppContext } from "context/app"; import Button from "components/buttons/Button"; import Modal from "components/Modal"; // @ts-ignore import InputFieldWithIcon from "components/forms/fields/InputFieldWithIcon"; import DataError from "components/DataError"; import permissions from "utilities/permissions"; import { ISchedulableQuery } from "interfaces/schedulable_query"; export interface ISelectQueryModalProps { onCancel: () => void; onQueryHostCustom: () => void; onQueryHostSaved: (selectedQuery: ISchedulableQuery) => void; queries: ISchedulableQuery[] | []; queryErrors: Error | null; isOnlyObserver?: boolean; hostsTeamId: number | null; } const baseClass = "select-query-modal"; const SelectQueryModal = ({ onCancel, onQueryHostCustom, onQueryHostSaved, queries, queryErrors, isOnlyObserver, hostsTeamId, }: ISelectQueryModalProps): JSX.Element => { let queriesAvailableToRun = queries; const { currentUser, isObserverPlus } = useContext(AppContext); /* Context team id might be different that host's team id Observer plus must be checked against host's team id */ const isHostsTeamObserverPlus = currentUser ? permissions.isObserverPlus(currentUser, hostsTeamId) : false; const [queriesFilter, setQueriesFilter] = useState(""); if (isOnlyObserver && !isObserverPlus && !isHostsTeamObserverPlus) { queriesAvailableToRun = queries.filter( (query) => query.observer_can_run === true ); } const getQueries = () => { if (!queriesFilter) { return queriesAvailableToRun; } const lowerQueryFilter = queriesFilter.toLowerCase(); return filter(queriesAvailableToRun, (query) => { if (!query.name) { return false; } const lowerQueryName = query.name.toLowerCase(); return includes(lowerQueryName, lowerQueryFilter); }); }; const onFilterQueries = useCallback( (filterString: string): void => { setQueriesFilter(filterString); }, [setQueriesFilter] ); const queriesFiltered = getQueries(); const queriesCount = queriesFiltered.length; const renderDescription = (): JSX.Element => { return (