import { FilterBuilder } from "~/services/api/filter-builder";
import { ResourceKind } from '~/models/resource';
import { GroupClass } from '~/models/group';
+import { SearchView } from '~/store/search-bar/search-bar-reducer';
+import { navigateToSearchResults, navigateTo } from '~/store/navigation/navigation-action';
+import { snackbarActions, SnackbarKind } from '~/store/snackbar/snackbar-actions';
+ import { SearchBarAdvanceFormData } from '~/models/search-bar';
export const searchBarActions = unionize({
SET_CURRENT_VIEW: ofType<string>(),
export type SearchBarActions = UnionOf<typeof searchBarActions>;
- export interface SearchBarAdvanceFormData {
- type?: GroupContentsResource;
- cluster?: string;
- project?: string;
- inTrash: boolean;
- dataFrom: string;
- dataTo: string;
- saveQuery: boolean;
- searchQuery: string;
- }
-
export const SEARCH_BAR_ADVANCE_FORM_NAME = 'searchBarAdvanceFormName';
export const goToView = (currentView: string) => searchBarActions.SET_CURRENT_VIEW(currentView);
if (data.saveQuery && data.searchQuery) {
services.searchService.saveQuery(data.searchQuery);
dispatch(searchBarActions.SET_SAVED_QUERIES(services.searchService.getSavedQueries()));
+ dispatch(snackbarActions.OPEN_SNACKBAR({ message: 'Query has been sucessfully saved', kind: SnackbarKind.SUCCESS }));
}
};
dispatch(searchBarActions.SET_SAVED_QUERIES(savedSearchQueries));
};
- export const closeSearchView = () =>
+ export const closeSearchView = () =>
(dispatch: Dispatch<any>, getState: () => RootState, services: ServiceRepository) => {
- dispatch(searchBarActions.CLOSE_SEARCH_VIEW());
- dispatch(searchBarActions.SET_CURRENT_VIEW(SearchView.BASIC));
+ const isOpen = getState().searchBar.open;
+ if(isOpen) {
+ dispatch(searchBarActions.CLOSE_SEARCH_VIEW());
++ dispatch(searchBarActions.SET_CURRENT_VIEW(SearchView.BASIC));
+ }
};
+
+export const navigateToItem = (uuid: string) =>
+ (dispatch: Dispatch<any>, getState: () => RootState, services: ServiceRepository) => {
+ dispatch(searchBarActions.CLOSE_SEARCH_VIEW());
+ dispatch(navigateTo(uuid));
+ };
+
export const searchData = (searchValue: string) =>
async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
+ const currentView = getState().searchBar.currentView;
+ if (currentView !== SearchView.AUTOCOMPLETE) {
+ dispatch(searchBarActions.CLOSE_SEARCH_VIEW());
+ }
dispatch(searchBarActions.SET_SEARCH_VALUE(searchValue));
dispatch(searchBarActions.SET_SEARCH_RESULTS([]));
if (searchValue) {
});
dispatch(searchBarActions.SET_SEARCH_RESULTS(items));
}
+ dispatch(navigateToSearchResults);
};
-const getFilters = (filterName: string, searchValue: string): string => {
+export const getFilters = (filterName: string, searchValue: string): string => {
return new FilterBuilder()
.addIsA("uuid", [ResourceKind.PROJECT, ResourceKind.COLLECTION, ResourceKind.PROCESS])
.addILike(filterName, searchValue, GroupContentsResourcePrefix.COLLECTION)
import { SearchBarAdvancedView } from '~/views-components/search-bar/search-bar-advanced-view';
import { SearchBarAutocompleteView, SearchBarAutocompleteViewDataProps } from '~/views-components/search-bar/search-bar-autocomplete-view';
import { ArvadosTheme } from '~/common/custom-theme';
- import { SearchBarAdvanceFormData } from '~/store/search-bar/search-bar-actions';
+ import { SearchBarAdvanceFormData } from '~/models/search-bar';
type CssRules = 'container' | 'containerSearchViewOpened' | 'input' | 'view';
saveQuery: (data: SearchBarAdvanceFormData) => void;
deleteSavedQuery: (id: number) => void;
openSearchView: () => void;
+ navigateTo: (uuid: string) => void;
}
type SearchBarProps = SearchBarDataProps & SearchBarActionProps & WithStyles<CssRules>;
value: string;
}
-interface RenderSavedQueriesProps {
+
+
+interface RenderRecentQueriesProps {
text: string | JSX.Element;
- id: number;
- deleteSavedQuery: (id: number) => void;
+ onSearch: (searchValue: string | JSX.Element) => void;
}
-interface RenderRecentQueriesProps {
+export const RenderRecentQueries = (props: RenderRecentQueriesProps) => {
+ return <ListItem button>
+ <ListItemText secondary={props.text} onClick={() => props.onSearch(props.text)} />
+ </ListItem>;
+};
+
+interface RenderAutocompleteItemsProps {
text: string | JSX.Element;
+ navigateTo: (uuid: string) => void;
+ uuid: string;
}
-export const RecentQueriesItem = (props: RenderRecentQueriesProps) => {
+export const RenderAutocompleteItems = (props: RenderAutocompleteItemsProps) => {
return <ListItem button>
- <ListItemText secondary={props.text} />
+ <ListItemText secondary={props.text} onClick={() => props.navigateTo(props.uuid)} />
</ListItem>;
};
+interface RenderSavedQueriesProps {
+ text: string | JSX.Element;
+ id: number;
+ deleteSavedQuery: (id: number) => void;
+ onSearch: (searchValue: string | JSX.Element) => void;
+}
export const RenderSavedQueries = (props: RenderSavedQueriesProps) => {
return <ListItem button>
- <ListItemText secondary={props.text} />
+ <ListItemText secondary={props.text} onClick={() => props.onSearch(props.text)} />
<ListItemSecondaryAction>
<Tooltip title="Remove">
<IconButton aria-label="Remove" onClick={() => props.deleteSavedQuery(props.id)}>
render() {
const { classes, currentView, openSearchView, closeView, isPopoverOpen } = this.props;
- return <ClickAwayListener onClickAway={() => closeView()}>
+ return <ClickAwayListener onClickAway={closeView}>
<Paper className={isPopoverOpen ? classes.containerSearchViewOpened : classes.container} >
<form onSubmit={this.handleSubmit}>
<Input
}
getView = (currentView: string) => {
- const { onSetView, loadRecentQueries, savedQueries, deleteSavedQuery, searchValue, searchResults, saveQuery } = this.props;
+ const { onSetView, loadRecentQueries, savedQueries, deleteSavedQuery, searchValue, searchResults, saveQuery, onSearch, navigateTo } = this.props;
switch (currentView) {
case SearchView.BASIC:
- return <SearchBarBasicView setView={onSetView} recentQueries={loadRecentQueries} savedQueries={savedQueries} deleteSavedQuery={deleteSavedQuery} />;
+ return <SearchBarBasicView setView={onSetView} recentQueries={loadRecentQueries} savedQueries={savedQueries} deleteSavedQuery={deleteSavedQuery} onSearch={onSearch} />;
case SearchView.ADVANCED:
- return <SearchBarAdvancedView setView={onSetView} saveQuery={saveQuery}/>;
+ return <SearchBarAdvancedView setView={onSetView} saveQuery={saveQuery} />;
case SearchView.AUTOCOMPLETE:
return <SearchBarAutocompleteView
+ navigateTo={navigateTo}
searchResults={searchResults}
searchValue={searchValue} />;
default:
- return <SearchBarBasicView setView={onSetView} recentQueries={loadRecentQueries} savedQueries={savedQueries} deleteSavedQuery={deleteSavedQuery} />;
+ return <SearchBarBasicView setView={onSetView} recentQueries={loadRecentQueries} savedQueries={savedQueries} deleteSavedQuery={deleteSavedQuery} onSearch={onSearch} />;
}
}
saveRecentQuery,
loadRecentQueries,
saveQuery,
- openSearchView
+ openSearchView,
- closeSearchView
++ closeSearchView,
++ navigateToItem
} from '~/store/search-bar/search-bar-actions';
import { SearchBarView } from '~/views-components/search-bar/search-bar-view';
- import { SearchBarAdvanceFormData } from '~/store/search-bar/search-bar-actions';
- import { closeSearchView, navigateToItem } from '~/store/search-bar/search-bar-actions';
+ import { SearchBarAdvanceFormData } from '~/models/search-bar';
const mapStateToProps = ({ searchBar }: RootState) => {
return {
loadRecentQueries: () => dispatch<any>(loadRecentQueries()),
saveQuery: (data: SearchBarAdvanceFormData) => dispatch<any>(saveQuery(data)),
deleteSavedQuery: (id: number) => dispatch<any>(deleteSavedQuery(id)),
- openSearchView: () => dispatch<any>(openSearchView())
+ openSearchView: () => dispatch<any>(openSearchView()),
+ navigateTo: (uuid: string) => dispatch<any>(navigateToItem(uuid))
});
export const SearchBar = connect(mapStateToProps, mapDispatchToProps)(SearchBarView);
import { RunProcessPanel } from '~/views/run-process-panel/run-process-panel';
import SplitterLayout from 'react-splitter-layout';
import { WorkflowPanel } from '~/views/workflow-panel/workflow-panel';
+import { SearchResultsPanel } from '~/views/search-results-panel/search-results-panel';
+ import { HomeTreePicker } from '~/views-components/projects-tree-picker/home-tree-picker';
+ import { SharedTreePicker } from '~/views-components/projects-tree-picker/shared-tree-picker';
+ import { FavoritesTreePicker } from '../../views-components/projects-tree-picker/favorites-tree-picker';
+ import { ProjectsTreePicker } from '~/views-components/projects-tree-picker/projects-tree-picker';
+ import { Chips } from '~/components/chips/chips';
+ import { ChipsInput } from '../../components/chips-input/chips-input';
type CssRules = 'root' | 'container' | 'splitter' | 'asidePanel' | 'contentWrapper' | 'content';
<Route path={Routes.SHARED_WITH_ME} component={SharedWithMePanel} />
<Route path={Routes.RUN_PROCESS} component={RunProcessPanel} />
<Route path={Routes.WORKFLOWS} component={WorkflowPanel} />
+ <Route path={Routes.SEARCH_RESULTS} component={SearchResultsPanel} />
</Switch>
</Grid>
</Grid>