[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