Merge branch '13830-change-snakecase-to-upper-case-in-enums'
[arvados-workbench2.git] / src / store / favorite-panel / favorite-panel-middleware.ts
index c5020e892010d66a5dc5202b951fe5cecc6ba2a7..548a117814996519f76c6ee5c9ba83c725df1deb 100644 (file)
@@ -18,6 +18,10 @@ import {
 import { FavoritePanelItem, resourceToDataItem } from "../../views/favorite-panel/favorite-panel-item";
 import { LinkResource } from "../../models/link";
 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 }));
@@ -54,12 +58,19 @@ 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))
@@ -90,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) : [];