Merge branch 'master'
[arvados-workbench2.git] / src / store / favorite-panel / favorite-panel-middleware.ts
index 27e36b0caaae324b4e6097f56758b861fcb5f6ec..0ce13b461c36ed8aaabdec8cf568c5c54473301b 100644 (file)
@@ -9,10 +9,6 @@ import { RootState } from "../store";
 import { getDataExplorer } from "../data-explorer/data-explorer-reducer";
 import { FilterBuilder } from "../../common/api/filter-builder";
 import { DataColumns } from "../../components/data-table/data-table";
-import { ProcessResource } from "../../models/process";
-import { OrderBuilder } from "../../common/api/order-builder";
-import { GroupContentsResourcePrefix } from "../../services/groups-service/groups-service";
-import { SortDirection } from "../../components/data-table/data-column";
 import {
     columns,
     FAVORITE_PANEL_ID,
@@ -21,7 +17,11 @@ import {
 } from "../../views/favorite-panel/favorite-panel";
 import { FavoritePanelItem, resourceToDataItem } from "../../views/favorite-panel/favorite-panel-item";
 import { LinkResource } from "../../models/link";
-import { ResourceKind } from "../../models/resource";
+import { checkPresenceInFavorites } from "../favorites/favorites-actions";
+import { OrderBuilder } from "../../common/api/order-builder";
+import { SortDirection } from "../../components/data-table/data-column";
+import { GroupContentsResource, GroupContentsResourcePrefix } from "../../services/groups-service/groups-service";
+import { FavoriteOrderBuilder } from "../../services/favorite-service/favorite-order-builder";
 
 export const favoritePanelMiddleware: Middleware = store => next => {
     next(dataExplorerActions.SET_COLUMNS({ id: FAVORITE_PANEL_ID, columns }));
@@ -58,15 +58,23 @@ export const favoritePanelMiddleware: Middleware = store => next => {
                 const state = store.getState() as RootState;
                 const dataExplorer = getDataExplorer(state.dataExplorer, FAVORITE_PANEL_ID);
                 const columns = dataExplorer.columns as DataColumns<FavoritePanelItem, FavoritePanelFilter>;
+                const sortColumn = dataExplorer.columns.find(({ sortDirection }) => Boolean(sortDirection && sortDirection !== "none"));
                 const typeFilters = getColumnFilters(columns, FavoritePanelColumnNames.TYPE);
+                const order = FavoriteOrderBuilder.create();
                 if (typeFilters.length > 0) {
                     favoriteService
                         .list(state.projects.currentItemId, {
                             limit: dataExplorer.rowsPerPage,
                             offset: dataExplorer.page * dataExplorer.rowsPerPage,
+                            order: sortColumn!.name === FavoritePanelColumnNames.NAME
+                                ? sortColumn!.sortDirection === SortDirection.Asc
+                                    ? order.addDesc("name")
+                                    : order.addAsc("name")
+                                : order,
                             filters: FilterBuilder
                                 .create<LinkResource>()
                                 .addIsA("headUuid", typeFilters.map(filter => filter.type))
+                                .addILike("name", dataExplorer.searchValue)
                         })
                         .then(response => {
                             store.dispatch(dataExplorerActions.SET_ITEMS({
@@ -76,6 +84,7 @@ export const favoritePanelMiddleware: Middleware = store => next => {
                                 page: Math.floor(response.offset / response.limit),
                                 rowsPerPage: response.limit
                             }));
+                            store.dispatch<any>(checkPresenceInFavorites(response.items.map(item => item.uuid)));
                         });
                 } else {
                     store.dispatch(dataExplorerActions.SET_ITEMS({
@@ -92,6 +101,21 @@ export const favoritePanelMiddleware: Middleware = store => next => {
     };
 };
 
+const getOrder = (direction: SortDirection) => {
+    const order = OrderBuilder.create<LinkResource>();
+    const addRule = (builder: OrderBuilder<GroupContentsResource | LinkResource>, direction: SortDirection) =>
+        direction === SortDirection.Asc
+            ? builder.addAsc("name")
+            : builder.addDesc("name");
+
+    return [
+        OrderBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.Collection),
+        OrderBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.Process),
+        OrderBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.Project)
+    ].reduce((acc, b) =>
+        acc.concat(addRule(b, direction)), addRule(OrderBuilder.create(), direction));
+};
+
 const getColumnFilters = (columns: DataColumns<FavoritePanelItem, FavoritePanelFilter>, columnName: string) => {
     const column = columns.find(c => c.name === columnName);
     return column && column.filters ? column.filters.filter(f => f.selected) : [];