1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import { searchBarActions, SearchBarActions } from '~/store/search-bar/search-bar-actions';
6 import { GroupContentsResource } from '~/services/groups-service/groups-service';
7 import { SearchBarAdvanceFormData } from '~/models/search-bar';
9 type SearchResult = GroupContentsResource;
14 searchResults: SearchResult[];
16 savedQueries: SearchBarAdvanceFormData[];
20 export enum SearchView {
22 ADVANCED = 'advanced',
23 AUTOCOMPLETE = 'autocomplete'
26 const initialState: SearchBar = {
27 currentView: SearchView.BASIC,
35 export const searchBarReducer = (state = initialState, action: SearchBarActions): SearchBar =>
36 searchBarActions.match(action, {
37 SET_CURRENT_VIEW: currentView => ({
42 OPEN_SEARCH_VIEW: () => ({ ...state, open: true }),
43 CLOSE_SEARCH_VIEW: () => ({ ...state, open: false }),
44 SET_SEARCH_RESULTS: searchResults => ({
47 selectedItem: searchResults.length > 0
48 ? searchResults.findIndex(r => r.uuid === state.selectedItem) >= 0
53 SET_SEARCH_VALUE: searchValue => ({
56 selectedItem: state.searchValue === state.selectedItem
60 SET_SAVED_QUERIES: savedQueries => ({ ...state, savedQueries }),
61 UPDATE_SAVED_QUERY: searchQuery => ({ ...state, savedQueries: searchQuery }),
62 SET_SELECTED_ITEM: item => ({ ...state, selectedItem: item }),
64 let selectedItem = state.selectedItem;
65 if (state.currentView === SearchView.AUTOCOMPLETE) {
66 const idx = state.searchResults.findIndex(r => r.uuid === selectedItem);
68 selectedItem = state.searchResults[idx - 1].uuid;
70 selectedItem = state.searchValue;
79 let selectedItem = state.selectedItem;
80 if (state.currentView === SearchView.AUTOCOMPLETE) {
81 const idx = state.searchResults.findIndex(r => r.uuid === selectedItem);
82 if (idx >= 0 && idx < state.searchResults.length - 1) {
83 selectedItem = state.searchResults[idx + 1].uuid;
84 } else if (idx < 0 && state.searchResults.length > 0) {
85 selectedItem = state.searchResults[0].uuid;