//
// SPDX-License-Identifier: AGPL-3.0
-import { ServiceRepository } from '~/services/services';
+import { ServiceRepository } from 'services/services';
import { MiddlewareAPI, Dispatch } from 'redux';
-import { DataExplorerMiddlewareService, dataExplorerToListParams, listResultsToDataExplorerItemsMeta } from '~/store/data-explorer/data-explorer-middleware-service';
-import { RootState } from '~/store/store';
-import { snackbarActions, SnackbarKind } from '~/store/snackbar/snackbar-actions';
-import { DataExplorer, getDataExplorer } from '~/store/data-explorer/data-explorer-reducer';
-import { updateResources } from '~/store/resources/resources-actions';
-import { SortDirection } from '~/components/data-table/data-column';
-import { SearchResultsPanelColumnNames } from '~/views/search-results-panel/search-results-panel-view';
-import { OrderDirection, OrderBuilder } from '~/services/api/order-builder';
-import { GroupContentsResource, GroupContentsResourcePrefix } from "~/services/groups-service/groups-service";
-import { ListResults } from '~/services/common-service/common-service';
-import { searchResultsPanelActions } from '~/store/search-results-panel/search-results-panel-actions';
-import { getFilters } from '~/store/search-bar/search-bar-actions';
-import { getSortColumn } from "~/store/data-explorer/data-explorer-reducer";
+import { DataExplorerMiddlewareService, dataExplorerToListParams, listResultsToDataExplorerItemsMeta, getDataExplorerColumnFilters } from 'store/data-explorer/data-explorer-middleware-service';
+import { RootState } from 'store/store';
+import { snackbarActions, SnackbarKind } from 'store/snackbar/snackbar-actions';
+import { DataExplorer, getDataExplorer } from 'store/data-explorer/data-explorer-reducer';
+import { updateResources } from 'store/resources/resources-actions';
+import { SortDirection } from 'components/data-table/data-column';
+import { OrderDirection, OrderBuilder } from 'services/api/order-builder';
+import { GroupContentsResource, GroupContentsResourcePrefix } from "services/groups-service/groups-service";
+import { ListResults } from 'services/common-service/common-service';
+import { searchResultsPanelActions } from 'store/search-results-panel/search-results-panel-actions';
+import {
+ getSearchSessions,
+ queryToFilters,
+ getAdvancedDataFromQuery
+} from 'store/search-bar/search-bar-actions';
+import { getSortColumn } from "store/data-explorer/data-explorer-reducer";
+import { joinFilters } from 'services/api/filter-builder';
+import { DataColumns } from 'components/data-table/data-table';
+import { serializeResourceTypeFilters } from 'store//resource-type-filters/resource-type-filters';
+import { ProjectPanelColumnNames } from 'views/project-panel/project-panel';
+import { Resource } from 'models/resource';
export class SearchResultsMiddlewareService extends DataExplorerMiddlewareService {
constructor(private services: ServiceRepository, id: string) {
super(id);
}
- async requestItems(api: MiddlewareAPI<Dispatch, RootState>) {
+ async requestItems(api: MiddlewareAPI<Dispatch, RootState>, criteriaChanged?: boolean) {
const state = api.getState();
- const userUuid = state.auth.user!.uuid;
const dataExplorer = getDataExplorer(state.dataExplorer, this.getId());
const searchValue = state.searchBar.searchValue;
- try {
- const response = await this.services.groupsService.contents('', getParams(dataExplorer, searchValue));
- api.dispatch(updateResources(response.items));
- api.dispatch(setItems(response));
- } catch {
- api.dispatch(couldNotFetchSearchResults());
+ const { cluster: clusterId } = getAdvancedDataFromQuery(searchValue);
+ const sessions = getSearchSessions(clusterId, state.auth.sessions);
+
+ if (searchValue.trim() === '') {
+ return;
}
+
+ const initial = {
+ itemsAvailable: 0,
+ items: [] as GroupContentsResource[],
+ kind: '',
+ offset: 0,
+ limit: 10
+ };
+
+ if (criteriaChanged) {
+ api.dispatch(setItems(initial));
+ }
+
+ sessions.forEach(session => {
+ const params = getParams(dataExplorer, searchValue, session.apiRevision);
+ this.services.groupsService.contents('', params, session)
+ .then((response) => {
+ api.dispatch(updateResources(response.items));
+ api.dispatch(appendItems(response));
+ }).catch(() => {
+ api.dispatch(couldNotFetchSearchResults(session.clusterId));
+ });
+ }
+ );
}
}
-export const getParams = (dataExplorer: DataExplorer, searchValue: string) => ({
+const typeFilters = (columns: DataColumns<string>) => serializeResourceTypeFilters(getDataExplorerColumnFilters(columns, ProjectPanelColumnNames.TYPE));
+
+export const getParams = (dataExplorer: DataExplorer, query: string, apiRevision: number) => ({
...dataExplorerToListParams(dataExplorer),
- filters: getFilters('name', searchValue),
- order: getOrder(dataExplorer)
+ filters: joinFilters(
+ queryToFilters(query, apiRevision),
+ typeFilters(dataExplorer.columns)
+ ),
+ order: getOrder(dataExplorer),
+ includeTrash: getAdvancedDataFromQuery(query).inTrash,
+ includeOldVersions: getAdvancedDataFromQuery(query).pastVersions
});
const getOrder = (dataExplorer: DataExplorer) => {
? OrderDirection.ASC
: OrderDirection.DESC;
- const columnName = sortColumn && sortColumn.name === SearchResultsPanelColumnNames.NAME ? "name" : "modifiedAt";
return order
- .addOrder(sortDirection, columnName, GroupContentsResourcePrefix.COLLECTION)
- .addOrder(sortDirection, columnName, GroupContentsResourcePrefix.PROCESS)
- .addOrder(sortDirection, columnName, GroupContentsResourcePrefix.PROJECT)
+ .addOrder(sortDirection, sortColumn.name as keyof Resource, GroupContentsResourcePrefix.COLLECTION)
+ .addOrder(sortDirection, sortColumn.name as keyof Resource, GroupContentsResourcePrefix.PROCESS)
+ .addOrder(sortDirection, sortColumn.name as keyof Resource, GroupContentsResourcePrefix.PROJECT)
.getOrder();
} else {
return order.getOrder();
items: listResults.items.map(resource => resource.uuid),
});
-const couldNotFetchSearchResults = () =>
+export const appendItems = (listResults: ListResults<GroupContentsResource>) =>
+ searchResultsPanelActions.APPEND_ITEMS({
+ ...listResultsToDataExplorerItemsMeta(listResults),
+ items: listResults.items.map(resource => resource.uuid),
+ });
+
+const couldNotFetchSearchResults = (cluster: string) =>
snackbarActions.OPEN_SNACKBAR({
- message: 'Could not fetch search results.',
+ message: `Could not fetch search results from ${cluster}.`,
kind: SnackbarKind.ERROR
});