+export const saveRecentQuery = (query: string) =>
+ (dispatch: Dispatch<any>, getState: () => RootState, services: ServiceRepository) =>
+ services.searchService.saveRecentQuery(query);
+
+
+export const loadRecentQueries = () =>
+ (dispatch: Dispatch<any>, getState: () => RootState, services: ServiceRepository) => {
+ const recentQueries = services.searchService.getRecentQueries();
+ dispatch(searchBarActions.SET_RECENT_QUERIES(recentQueries));
+ return recentQueries;
+ };
+
+export const searchData = (searchValue: string, useCancel = false) =>
+ async (dispatch: Dispatch, getState: () => RootState) => {
+ const currentView = getState().searchBar.currentView;
+ dispatch(searchResultsPanelActions.CLEAR());
+ dispatch(searchBarActions.SET_SEARCH_VALUE(searchValue));
+ if (searchValue.length > 0) {
+ dispatch<any>(searchGroups(searchValue, 5, useCancel));
+ if (currentView === SearchView.BASIC) {
+ dispatch(searchBarActions.CLOSE_SEARCH_VIEW());
+ dispatch(navigateToSearchResults(searchValue));
+ }
+ }
+ };
+
+export const searchAdvancedData = (data: SearchBarAdvancedFormData) =>
+ async (dispatch: Dispatch, getState: () => RootState) => {
+ dispatch<any>(saveQuery(data));
+ const searchValue = getState().searchBar.searchValue;
+ dispatch(searchResultsPanelActions.CLEAR());
+ dispatch(searchBarActions.SET_CURRENT_VIEW(SearchView.BASIC));
+ dispatch(searchBarActions.CLOSE_SEARCH_VIEW());
+ dispatch(navigateToSearchResults(searchValue));
+ };
+
+export const setSearchValueFromAdvancedData = (data: SearchBarAdvancedFormData, prevData?: SearchBarAdvancedFormData) =>
+ (dispatch: Dispatch, getState: () => RootState) => {
+ if (data.projectObject) {
+ data.projectUuid = data.projectObject.uuid;
+ }
+ const searchValue = getState().searchBar.searchValue;
+ const value = getQueryFromAdvancedData({
+ ...data,
+ searchValue
+ }, prevData);
+ dispatch(searchBarActions.SET_SEARCH_VALUE(value));
+ };
+
+export const setAdvancedDataFromSearchValue = (search: string, vocabulary: Vocabulary) =>
+ async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
+ const data = getAdvancedDataFromQuery(search, vocabulary);
+ if (data.projectUuid) {
+ data.projectObject = await services.projectService.get(data.projectUuid);
+ }
+ dispatch<any>(initialize(SEARCH_BAR_ADVANCED_FORM_NAME, data));
+ if (data.projectUuid) {
+ await dispatch<any>(activateSearchBarProject(data.projectUuid));
+ dispatch(treePickerActions.ACTIVATE_TREE_PICKER_NODE({ pickerId: SEARCH_BAR_ADVANCED_FORM_PICKER_ID, id: data.projectUuid }));
+ }
+ };
+
+const saveQuery = (data: SearchBarAdvancedFormData) =>
+ (dispatch: Dispatch<any>, getState: () => RootState, services: ServiceRepository) => {
+ const savedQueries = services.searchService.getSavedQueries();
+ if (data.saveQuery && data.queryName) {
+ const filteredQuery = savedQueries.find(query => query.queryName === data.queryName);
+ data.searchValue = getState().searchBar.searchValue;
+ if (filteredQuery) {
+ services.searchService.editSavedQueries(data);
+ dispatch(searchBarActions.UPDATE_SAVED_QUERY(savedQueries));
+ dispatch(snackbarActions.OPEN_SNACKBAR({ message: 'Query has been successfully updated', hideDuration: 2000, kind: SnackbarKind.SUCCESS }));
+ } else {
+ services.searchService.saveQuery(data);
+ dispatch(searchBarActions.SET_SAVED_QUERIES(savedQueries));
+ dispatch(snackbarActions.OPEN_SNACKBAR({ message: 'Query has been successfully saved', hideDuration: 2000, kind: SnackbarKind.SUCCESS }));
+ }
+ }
+ };
+
+export const deleteSavedQuery = (id: number) =>
+ (dispatch: Dispatch<any>, getState: () => RootState, services: ServiceRepository) => {
+ services.searchService.deleteSavedQuery(id);
+ const savedSearchQueries = services.searchService.getSavedQueries();
+ dispatch(searchBarActions.SET_SAVED_QUERIES(savedSearchQueries));
+ return savedSearchQueries || [];
+ };
+
+export const editSavedQuery = (data: SearchBarAdvancedFormData) =>
+ (dispatch: Dispatch<any>) => {
+ dispatch(searchBarActions.SET_CURRENT_VIEW(SearchView.ADVANCED));
+ dispatch(searchBarActions.SET_SEARCH_VALUE(getQueryFromAdvancedData(data)));
+ dispatch<any>(initialize(SEARCH_BAR_ADVANCED_FORM_NAME, data));
+ };
+
+export const openSearchView = () =>
+ (dispatch: Dispatch<any>, getState: () => RootState, services: ServiceRepository) => {
+ const savedSearchQueries = services.searchService.getSavedQueries();
+ dispatch(searchBarActions.SET_SAVED_QUERIES(savedSearchQueries));
+ dispatch(loadRecentQueries());
+ dispatch(searchBarActions.OPEN_SEARCH_VIEW());
+ dispatch(searchBarActions.SELECT_FIRST_ITEM());
+ };
+
+export const closeSearchView = () =>
+ (dispatch: Dispatch<any>) => {
+ dispatch(searchBarActions.SET_SELECTED_ITEM(''));
+ dispatch(searchBarActions.CLOSE_SEARCH_VIEW());
+ };
+
+export const closeAdvanceView = () =>
+ (dispatch: Dispatch<any>) => {
+ dispatch(searchBarActions.SET_SEARCH_VALUE(''));
+ dispatch(treePickerActions.DEACTIVATE_TREE_PICKER_NODE({ pickerId: SEARCH_BAR_ADVANCED_FORM_PICKER_ID }));
+ dispatch(searchBarActions.SET_CURRENT_VIEW(SearchView.BASIC));
+ };
+
+export const navigateToItem = (uuid: string) =>
+ (dispatch: Dispatch<any>) => {
+ dispatch(searchBarActions.SET_SELECTED_ITEM(''));
+ dispatch(searchBarActions.CLOSE_SEARCH_VIEW());
+ dispatch(navigateTo(uuid));
+ };
+
+export const changeData = (searchValue: string) =>
+ (dispatch: Dispatch, getState: () => RootState) => {
+ dispatch(searchBarActions.SET_SEARCH_VALUE(searchValue));
+ const currentView = getState().searchBar.currentView;
+ const searchValuePresent = searchValue.length > 0;
+
+ if (currentView === SearchView.ADVANCED) {
+ dispatch(searchBarActions.SET_CURRENT_VIEW(SearchView.AUTOCOMPLETE));
+ } else if (searchValuePresent) {
+ dispatch(searchBarActions.SET_CURRENT_VIEW(SearchView.AUTOCOMPLETE));
+ dispatch(searchBarActions.SET_SELECTED_ITEM(searchValue));
+ } else {
+ dispatch(searchBarActions.SET_CURRENT_VIEW(SearchView.BASIC));
+ dispatch(searchBarActions.SET_SEARCH_RESULTS([]));
+ dispatch(searchBarActions.SELECT_FIRST_ITEM());
+ }
+ };
+
+export const submitData = (event: React.FormEvent<HTMLFormElement>) =>
+ (dispatch: Dispatch, getState: () => RootState) => {
+ event.preventDefault();
+ const searchValue = getState().searchBar.searchValue;
+ dispatch<any>(saveRecentQuery(searchValue));
+ dispatch<any>(loadRecentQueries());
+ dispatch(searchBarActions.CLOSE_SEARCH_VIEW());
+ if (RESOURCE_UUID_REGEX.exec(searchValue) || COLLECTION_PDH_REGEX.exec(searchValue)) {
+ dispatch<any>(navigateTo(searchValue));
+ } else {
+ dispatch(searchBarActions.SET_SEARCH_VALUE(searchValue));
+ dispatch(searchBarActions.SET_SEARCH_RESULTS([]));
+ dispatch(searchResultsPanelActions.CLEAR());
+ dispatch(navigateToSearchResults(searchValue));
+ }
+ };
+
+let cancelTokens: any[] = [];
+const searchGroups = (searchValue: string, limit: number, useCancel = false) =>