[ARVADOS-WORKBENCH2] updated: 1.1.4-385-g18ff30c

Git user git at public.curoverse.com
Tue Jul 24 07:27:15 EDT 2018


Summary of changes:
 .../favorite-service/favorite-order-builder.ts     | 48 ++++++++++++++++++++++
 src/services/favorite-service/favorite-service.ts  | 18 ++++----
 .../favorite-panel/favorite-panel-middleware.ts    | 26 ++++++++++++
 3 files changed, 85 insertions(+), 7 deletions(-)
 create mode 100644 src/services/favorite-service/favorite-order-builder.ts

       via  18ff30c75321f3be6a9e02529af2b5e1f1a3ddb0 (commit)
       via  4652d6baf3d0424d091e8e9e42660447f6259bd5 (commit)
      from  ce074465f93417bec660d09597aeabc75664a679 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.


commit 18ff30c75321f3be6a9e02529af2b5e1f1a3ddb0
Merge: 4652d6b ce07446
Author: Michal Klobukowski <michal.klobukowski at contractors.roche.com>
Date:   Tue Jul 24 13:27:04 2018 +0200

    Merge branch '13753-favorites-view' of git.curoverse.com:arvados-workbench2 into 13753-favorites-view
    
    refs #13753
    2
    13753
    
    Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski <michal.klobukowski at contractors.roche.com>


commit 4652d6baf3d0424d091e8e9e42660447f6259bd5
Author: Michal Klobukowski <michal.klobukowski at contractors.roche.com>
Date:   Tue Jul 24 13:26:51 2018 +0200

    Add ordering of favorite list results
    
    Feature #13753
    
    Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski <michal.klobukowski at contractors.roche.com>

diff --git a/src/services/favorite-service/favorite-order-builder.ts b/src/services/favorite-service/favorite-order-builder.ts
new file mode 100644
index 0000000..33214a0
--- /dev/null
+++ b/src/services/favorite-service/favorite-order-builder.ts
@@ -0,0 +1,48 @@
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+import { LinkResource } from "../../models/link";
+import { GroupContentsResource, GroupContentsResourcePrefix } from "../groups-service/groups-service";
+import { OrderBuilder } from "../../common/api/order-builder";
+
+export class FavoriteOrderBuilder {
+
+    static create(
+        linkOrder = OrderBuilder.create<LinkResource>(), 
+        contentOrder = OrderBuilder.create<GroupContentsResource>()) {
+        return new FavoriteOrderBuilder(linkOrder, contentOrder);
+    }
+
+    private constructor(
+        private linkOrder: OrderBuilder<LinkResource>,
+        private contentOrder: OrderBuilder<GroupContentsResource>
+    ) { }
+
+    addAsc(attribute: "name") {
+        const linkOrder = this.linkOrder.addAsc(attribute);
+        const contentOrder = this.contentOrder
+            .concat(OrderBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.Collection).addAsc(attribute))
+            .concat(OrderBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.Process).addAsc(attribute))
+            .concat(OrderBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.Project).addAsc(attribute));
+        return FavoriteOrderBuilder.create(linkOrder, contentOrder);
+    }
+
+    addDesc(attribute: "name") {
+        const linkOrder = this.linkOrder.addDesc(attribute);
+        const contentOrder = this.contentOrder
+            .concat(OrderBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.Collection).addDesc(attribute))
+            .concat(OrderBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.Process).addDesc(attribute))
+            .concat(OrderBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.Project).addDesc(attribute));
+        return FavoriteOrderBuilder.create(linkOrder, contentOrder);
+    }
+
+    getLinkOrder() {
+        return this.linkOrder;
+    }
+
+    getContentOrder() {
+        return this.contentOrder;
+    }
+
+}
\ No newline at end of file
diff --git a/src/services/favorite-service/favorite-service.ts b/src/services/favorite-service/favorite-service.ts
index d25ef3d..8da6eec 100644
--- a/src/services/favorite-service/favorite-service.ts
+++ b/src/services/favorite-service/favorite-service.ts
@@ -7,13 +7,14 @@ import { GroupsService, GroupContentsResource } from "../groups-service/groups-s
 import { LinkResource, LinkClass } from "../../models/link";
 import { FilterBuilder } from "../../common/api/filter-builder";
 import { ListArguments, ListResults } from "../../common/api/common-resource-service";
+import { FavoriteOrderBuilder } from "./favorite-order-builder";
 import { OrderBuilder } from "../../common/api/order-builder";
 
-export interface FavoriteListArguments extends ListArguments {
+export interface FavoriteListArguments {
     limit?: number;
     offset?: number;
     filters?: FilterBuilder<LinkResource>;
-    order?: OrderBuilder<LinkResource>;
+    order?: FavoriteOrderBuilder;
 }
 
 export class FavoriteService {
@@ -45,7 +46,7 @@ export class FavoriteService {
                 results.items.map(item => this.linkService.delete(item.uuid))));
     }
 
-    list(userUuid: string, args: FavoriteListArguments = {}): Promise<ListResults<GroupContentsResource>> {
+    list(userUuid: string, { filters, limit, offset, order }: FavoriteListArguments = {}): Promise<ListResults<GroupContentsResource>> {
         const listFilter = FilterBuilder
             .create<LinkResource>()
             .addEqual('tailUuid', userUuid)
@@ -53,14 +54,17 @@ export class FavoriteService {
 
         return this.linkService
             .list({
-                ...args,
-                filters: args.filters ? args.filters.concat(listFilter) : listFilter
+                filters: filters ? filters.concat(listFilter) : listFilter,
+                limit,
+                offset,
+                order: order ? order.getLinkOrder() : OrderBuilder.create<LinkResource>()
             })
             .then(results => {
                 const uuids = results.items.map(item => item.headUuid);
                 return this.groupsService.contents(userUuid, {
-                    limit: args.limit,
-                    offset: args.offset,
+                    limit,
+                    offset,
+                    order: order ? order.getContentOrder() : OrderBuilder.create<GroupContentsResource>(),
                     filters: FilterBuilder.create<GroupContentsResource>().addIn('uuid', uuids),
                     recursive: true
                 });
diff --git a/src/store/favorite-panel/favorite-panel-middleware.ts b/src/store/favorite-panel/favorite-panel-middleware.ts
index c5020e8..0ce13b4 100644
--- a/src/store/favorite-panel/favorite-panel-middleware.ts
+++ b/src/store/favorite-panel/favorite-panel-middleware.ts
@@ -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) : [];

-----------------------------------------------------------------------


hooks/post-receive
-- 




More information about the arvados-commits mailing list