diff --git a/querybook/webapp/components/QueryRunButton/QueryRunButton.scss b/querybook/webapp/components/QueryRunButton/QueryRunButton.scss index 99eceb3db..d47a3b3d2 100644 --- a/querybook/webapp/components/QueryRunButton/QueryRunButton.scss +++ b/querybook/webapp/components/QueryRunButton/QueryRunButton.scss @@ -32,6 +32,10 @@ } } } + .engine-selector-wrapper { + max-height: 50vh; + overflow-y: auto; + } } &.readonly { diff --git a/querybook/webapp/components/QueryRunButton/QueryRunButton.tsx b/querybook/webapp/components/QueryRunButton/QueryRunButton.tsx index 7b7abaaca..39f8ec912 100644 --- a/querybook/webapp/components/QueryRunButton/QueryRunButton.tsx +++ b/querybook/webapp/components/QueryRunButton/QueryRunButton.tsx @@ -1,5 +1,6 @@ import clsx from 'clsx'; import * as React from 'react'; +import { useState, useMemo } from 'react'; import { useSelector } from 'react-redux'; import { IQueryEngine, QueryEngineStatus } from 'const/queryEngine'; @@ -12,6 +13,7 @@ import { } from 'lib/sql-helper/sql-limiter'; import { getShortcutSymbols, KeyMap } from 'lib/utils/keyboard'; import { formatNumber } from 'lib/utils/number'; +import { stopPropagation } from 'lib/utils/noop'; import { queryEngineStatusByIdEnvSelector } from 'redux/queryEngine/selector'; import { AsyncButton, IAsyncButtonHandles } from 'ui/AsyncButton/AsyncButton'; import { Dropdown } from 'ui/Dropdown/Dropdown'; @@ -19,6 +21,7 @@ import { Icon } from 'ui/Icon/Icon'; import { ListMenu } from 'ui/Menu/ListMenu'; import { StatusIcon } from 'ui/StatusIcon/StatusIcon'; import { Tag } from 'ui/Tag/Tag'; +import { SearchBar } from 'ui/SearchBar/SearchBar'; import './QueryRunButton.scss'; @@ -155,19 +158,40 @@ export const QueryEngineSelector: React.FC = ({ ); }; - const engineItems = queryEngines.map((engineInfo) => ({ - name: {engineInfo.name}, - onClick: onEngineIdSelect.bind(null, engineInfo.id), - checked: engineInfo.id === engineId, - tooltip: engineInfo.description, - })); + const [keyword, setKeyword] = useState(''); + + const engineItems = queryEngines + .filter((engineInfo) => + `${engineInfo.name.toLowerCase()}`.includes(keyword.toLowerCase()) + ) + .map((engineInfo) => ({ + name: {engineInfo.name}, + onClick: onEngineIdSelect.bind(null, engineInfo.id), + checked: engineInfo.id === engineId, + tooltip: engineInfo.description, + })); + const engineButtonDOM = ( - +
+ {queryEngines.length > 3 && ( +
+ +
+ )} + +
); diff --git a/querybook/webapp/ui/SearchBar/SearchBar.scss b/querybook/webapp/ui/SearchBar/SearchBar.scss index f28dea6cd..283c6b0f9 100644 --- a/querybook/webapp/ui/SearchBar/SearchBar.scss +++ b/querybook/webapp/ui/SearchBar/SearchBar.scss @@ -24,4 +24,16 @@ border-left: var(--border); height: 20px; } + + &.clear-search { + .DebouncedInput { + flex: 9; + } + .SearchIcon { + flex: 1; + } + .Button{ + flex: 1; + } + } } diff --git a/querybook/webapp/ui/SearchBar/SearchBar.tsx b/querybook/webapp/ui/SearchBar/SearchBar.tsx index 1897b7cd1..986d748da 100644 --- a/querybook/webapp/ui/SearchBar/SearchBar.tsx +++ b/querybook/webapp/ui/SearchBar/SearchBar.tsx @@ -74,6 +74,7 @@ export const SearchBar: React.FunctionComponent = ({ SearchBar: true, [className]: Boolean(className), transparent, + 'clear-search': hasClearSearch, }); const clearSearchButton =