import { ServiceRepository } from '~/services/services';
import { MiddlewareAPI, Dispatch } from 'redux';
-import { DataExplorerMiddlewareService, dataExplorerToListParams, listResultsToDataExplorerItemsMeta } from '~/store/data-explorer/data-explorer-middleware-service';
+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 { 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,
- getSearchQueryFirstProp,
- getSearchSessions, ParseSearchQuery,
- parseSearchQuery
+ 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;
- const sq = parseSearchQuery(searchValue);
- const clusterId = getSearchQueryFirstProp(sq, 'cluster');
+ const { cluster: clusterId } = getAdvancedDataFromQuery(searchValue);
const sessions = getSearchSessions(clusterId, state.auth.sessions);
if (searchValue.trim() === '') {
}
try {
- const params = getParams(dataExplorer, searchValue, sq);
- const lists: ListResults<GroupContentsResource>[] = await Promise.all(sessions.map(session =>
+ const params = getParams(dataExplorer, searchValue);
+
+ // TODO: if one of these fails, no results will be returned.
+ const responses = await Promise.all(sessions.map(session =>
this.services.groupsService.contents('', params, session)
));
- const items = lists
- .reduce((items, list) => items.concat(list.items), [] as GroupContentsResource[]);
-
- const itemsAvailable = lists
- .reduce((itemsAvailable, list) => itemsAvailable + list.itemsAvailable, 0);
-
- const list: ListResults<GroupContentsResource> = {
- ...params,
+ const initial = {
+ itemsAvailable: 0,
+ items: [] as GroupContentsResource[],
kind: '',
- items,
- itemsAvailable
+ offset: 0,
+ limit: 10
};
- api.dispatch(updateResources(list.items));
- api.dispatch(appendItems(list));
+ const mergedResponse = responses.reduce((merged, current) => ({
+ ...merged,
+ itemsAvailable: merged.itemsAvailable + current.itemsAvailable,
+ items: merged.items.concat(current.items)
+ }), initial);
+
+ api.dispatch(updateResources(mergedResponse.items));
+
+ api.dispatch(criteriaChanged
+ ? setItems(mergedResponse)
+ : appendItems(mergedResponse));
} catch {
api.dispatch(couldNotFetchSearchResults());
}
}
-export const getParams = (dataExplorer: DataExplorer, searchValue: string, sq: ParseSearchQuery) => ({
+const typeFilters = (columns: DataColumns<string>) => serializeResourceTypeFilters(getDataExplorerColumnFilters(columns, ProjectPanelColumnNames.TYPE));
+
+export const getParams = (dataExplorer: DataExplorer, query: string) => ({
...dataExplorerToListParams(dataExplorer),
- filters: getFilters('name', searchValue, sq),
- order: getOrder(dataExplorer)
+ filters: joinFilters(
+ queryToFilters(query),
+ typeFilters(dataExplorer.columns)
+ ),
+ order: getOrder(dataExplorer),
+ includeTrash: getAdvancedDataFromQuery(query).inTrash
});
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();