merge master
authorPawel Kowalczyk <pawel.kowalczyk@contractors.roche.com>
Mon, 15 Oct 2018 13:32:37 +0000 (15:32 +0200)
committerPawel Kowalczyk <pawel.kowalczyk@contractors.roche.com>
Mon, 15 Oct 2018 13:32:37 +0000 (15:32 +0200)
Feature #14277

Arvados-DCO-1.1-Signed-off-by: Pawel Kowalczyk <pawel.kowalczyk@contractors.roche.com>

1  2 
src/store/search-bar/search-bar-actions.ts
src/views-components/search-bar/search-bar-view.tsx
src/views-components/search-bar/search-bar.tsx
src/views/workbench/workbench.tsx

index 394920a5d7c776aaec41841c0d13161fb5701446,f7527852ada8f71dd7e9dc2fa1ba559774049513..771cbc891da17de2ba7b995721ac388c2c63a483
@@@ -10,9 -10,7 +10,10 @@@ import { ServiceRepository } from '~/se
  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);
@@@ -56,7 -43,6 +46,7 @@@ export const saveQuery = (data: SearchB
          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 }));
          }
      };
  
@@@ -75,24 -61,17 +65,28 @@@ export const openSearchView = () =
          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)
index 51062646cdc1965e4797e0b7d52ebc8a408f487d,d0967712177eb09effeef030f83c8393a329f950..8e1f84b01fabdbe0661e2bdaeebc5e7838ba8d40
@@@ -21,7 -21,7 +21,7 @@@ import { SearchBarBasicView } from '~/v
  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';
  
@@@ -66,7 -66,6 +66,7 @@@ interface SearchBarActionProps 
      saveQuery: (data: SearchBarAdvanceFormData) => void;
      deleteSavedQuery: (id: number) => void;
      openSearchView: () => void;
 +    navigateTo: (uuid: string) => void;
  }
  
  type SearchBarProps = SearchBarDataProps & SearchBarActionProps & WithStyles<CssRules>;
@@@ -75,41 -74,26 +75,41 @@@ interface SearchBarState 
      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)}>
@@@ -132,7 -116,7 +132,7 @@@ export const SearchBarView = withStyles
  
          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} />;
              }
          }
  
index 5c42af20caa03e3b88db25f7d55e4debeaae5374,d6561c591b770f15c63144120b86549044076ca0..5208a7d61c0259e2ae2724ebc9510edf2ed5b403
@@@ -12,11 -12,11 +12,12 @@@ import 
      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 {
@@@ -36,8 -36,7 +37,8 @@@ const mapDispatchToProps = (dispatch: D
      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);
index ade9a4e122dcd61f2e5322e9137da60ff202d390,09435d096c40ce940ead47f93397a91cf7bf4ea0..788c96ae6b2552500ec3922fdd59748493f0347d
@@@ -41,7 -41,12 +41,13 @@@ import { SharedWithMePanel } from '~/vi
  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';
  
@@@ -99,7 -104,6 +105,7 @@@ export const WorkbenchPanel 
                                  <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>