X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/e952a4d2fac7c75375a9307f7f6676bd950bd0ed..9e5ba9af996126cdf1186df49ff4c177af62e41d:/src/views-components/search-bar/search-bar-view.tsx?ds=sidebyside diff --git a/src/views-components/search-bar/search-bar-view.tsx b/src/views-components/search-bar/search-bar-view.tsx index 3782f869..6251308d 100644 --- a/src/views-components/search-bar/search-bar-view.tsx +++ b/src/views-components/search-bar/search-bar-view.tsx @@ -11,9 +11,9 @@ import { WithStyles, Tooltip, InputAdornment, Input, - ClickAwayListener } from '@material-ui/core'; import SearchIcon from '@material-ui/icons/Search'; +import ArrowDropDownIcon from '@material-ui/icons/ArrowDropDown'; import { ArvadosTheme } from '~/common/custom-theme'; import { SearchView } from '~/store/search-bar/search-bar-reducer'; import { @@ -31,6 +31,7 @@ import { SearchBarAdvancedViewDataProps, SearchBarAdvancedViewActionProps } from '~/views-components/search-bar/search-bar-advanced-view'; +import { KEY_CODE_DOWN, KEY_CODE_ESC, KEY_CODE_UP, KEY_ENTER } from "~/common/codes"; type CssRules = 'container' | 'containerSearchViewOpened' | 'input' | 'view'; @@ -39,16 +40,18 @@ const styles: StyleRulesCallback = (theme: ArvadosTheme) => { container: { position: 'relative', width: '100%', - borderRadius: theme.spacing.unit / 2 + borderRadius: theme.spacing.unit / 2, + zIndex: theme.zIndex.modal, }, containerSearchViewOpened: { position: 'relative', width: '100%', - borderRadius: `${theme.spacing.unit / 2}px ${theme.spacing.unit / 2}px 0 0` + borderRadius: `${theme.spacing.unit / 2}px ${theme.spacing.unit / 2}px 0 0`, + zIndex: theme.zIndex.modal, }, input: { border: 'none', - padding: `0px ${theme.spacing.unit}px` + padding: `0` }, view: { position: 'absolute', @@ -82,65 +85,147 @@ interface SearchBarViewActionProps { closeView: () => void; openSearchView: () => void; loadRecentQueries: () => string[]; + moveUp: () => void; + moveDown: () => void; + setAdvancedDataFromSearchValue: (search: string) => void; } type SearchBarViewProps = SearchBarDataProps & SearchBarActionProps & WithStyles; +const handleKeyDown = (e: React.KeyboardEvent, props: SearchBarViewProps) => { + if (e.keyCode === KEY_CODE_DOWN) { + e.preventDefault(); + if (!props.isPopoverOpen) { + props.onSetView(SearchView.AUTOCOMPLETE); + props.openSearchView(); + } else { + props.moveDown(); + } + } else if (e.keyCode === KEY_CODE_UP) { + e.preventDefault(); + props.moveUp(); + } else if (e.keyCode === KEY_CODE_ESC) { + e.preventDefault(); + props.closeView(); + } else if (e.keyCode === KEY_ENTER) { + if (props.currentView === SearchView.BASIC) { + e.preventDefault(); + props.onSearch(props.selectedItem.query); + } else if (props.currentView === SearchView.AUTOCOMPLETE) { + if (props.selectedItem.id !== props.searchValue) { + e.preventDefault(); + props.navigateTo(props.selectedItem.id); + } + } + } +}; + +const handleInputClick = (e: React.MouseEvent, props: SearchBarViewProps) => { + if (props.searchValue) { + props.onSetView(SearchView.AUTOCOMPLETE); + props.openSearchView(); + } else { + props.closeView(); + } +}; + +const handleDropdownClick = (e: React.MouseEvent, props: SearchBarViewProps) => { + e.stopPropagation(); + if (props.isPopoverOpen) { + if (props.currentView === SearchView.ADVANCED) { + props.closeView(); + } else { + props.setAdvancedDataFromSearchValue(props.searchValue); + props.onSetView(SearchView.ADVANCED); + } + } else { + props.setAdvancedDataFromSearchValue(props.searchValue); + props.onSetView(SearchView.ADVANCED); + } +}; + export const SearchBarView = withStyles(styles)( - (props : SearchBarViewProps) => { - const { classes, isPopoverOpen, closeView, searchValue, openSearchView, onChange, onSubmit } = props; + (props: SearchBarViewProps) => { + const { classes, isPopoverOpen } = props; return ( - + <> + + {isPopoverOpen && + } + -
+ + onClick={e => handleInputClick(e, props)} + onKeyDown={e => handleKeyDown(e, props)} + startAdornment={ + - + + } + endAdornment={ + + + handleDropdownClick(e, props)}> + + + + } />
- {isPopoverOpen && getView({...props})} + {isPopoverOpen && getView({ ...props })}
-
+ ); } ); const getView = (props: SearchBarViewProps) => { - const { onSetView, loadRecentQueries, savedQueries, deleteSavedQuery, searchValue, - searchResults, saveQuery, onSearch, navigateTo, editSavedQuery, tags, currentView } = props; - switch (currentView) { + switch (props.currentView) { case SearchView.AUTOCOMPLETE: return ; + navigateTo={props.navigateTo} + searchResults={props.searchResults} + searchValue={props.searchValue} + selectedItem={props.selectedItem} />; case SearchView.ADVANCED: return ; + closeAdvanceView={props.closeAdvanceView} + tags={props.tags} + saveQuery={props.saveQuery} />; default: return ; + onSetView={props.onSetView} + onSearch={props.onSearch} + loadRecentQueries={props.loadRecentQueries} + savedQueries={props.savedQueries} + deleteSavedQuery={props.deleteSavedQuery} + editSavedQuery={props.editSavedQuery} + selectedItem={props.selectedItem} />; } }; + +const Backdrop = withStyles<'backdrop'>(theme => ({ + backdrop: { + position: 'fixed', + top: 0, + right: 0, + bottom: 0, + left: 0, + zIndex: theme.zIndex.modal + } +}))( + ({ classes, ...props }: WithStyles<'backdrop'> & React.HTMLProps) => +
);