[ARVADOS-WORKBENCH2] updated: 1.1.4-198-gc178bb7

Git user git at public.curoverse.com
Wed Jul 4 11:27:18 EDT 2018


Summary of changes:
 src/common/api/common-resource-service.ts          |  2 +-
 src/common/api/filter-builder.ts                   | 51 ++++++++++++++++------
 src/models/container-request.ts                    |  8 +++-
 .../collection-service/collection-service.ts       |  2 +-
 src/services/groups-service/groups-service.ts      |  2 +-
 .../project-panel/project-panel-middleware.ts      | 20 ++++++---
 src/views/project-panel/project-panel.tsx          | 20 +++++++--
 7 files changed, 78 insertions(+), 27 deletions(-)

       via  c178bb7bacbb174f6b645e410323dbecd59e1a2c (commit)
       via  9fbe0f44685e9c3c00f753bd36e858bd23c46680 (commit)
      from  c282281e22bd7a52dae2c72282a956f7a4ecae04 (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 c178bb7bacbb174f6b645e410323dbecd59e1a2c
Author: Michal Klobukowski <michal.klobukowski at contractors.roche.com>
Date:   Wed Jul 4 17:27:03 2018 +0200

    Implement filtering by status
    
    Feature #13703
    
    Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski <michal.klobukowski at contractors.roche.com>

diff --git a/src/models/container-request.ts b/src/models/container-request.ts
index 44dd615..4a10414 100644
--- a/src/models/container-request.ts
+++ b/src/models/container-request.ts
@@ -5,12 +5,18 @@
 import { Resource } from "../common/api/common-resource-service";
 import { ResourceKind } from "./kinds";
 
+export enum ContainerRequestState {
+    Uncommitted = "Uncommitted",
+    Committed = "Committed",
+    Final = "Final"
+}
+
 export interface ContainerRequestResource extends Resource {
     kind: ResourceKind.ContainerRequest;
     name: string;
     description: string;
     properties: any;
-    state: string;
+    state: ContainerRequestState;
     requestingContainerUuid: string;
     containerUuid: string;
     containerCountMax: number;
diff --git a/src/views/project-panel/project-panel-middleware.ts b/src/views/project-panel/project-panel-middleware.ts
index 2afc530..0ea5f1e 100644
--- a/src/views/project-panel/project-panel-middleware.ts
+++ b/src/views/project-panel/project-panel-middleware.ts
@@ -11,6 +11,7 @@ import { getDataExplorer, DataExplorerState } from "../../store/data-explorer/da
 import { resourceToDataItem, ProjectPanelItem } from "./project-panel-item";
 import FilterBuilder from "../../common/api/filter-builder";
 import { DataColumns } from "../../components/data-table/data-table";
+import { ProcessResource } from "../../models/process";
 
 export const projectPanelMiddleware: Middleware = store => next => {
     next(actions.SET_COLUMNS({ id: PROJECT_PANEL_ID, columns }));
@@ -39,14 +40,21 @@ export const projectPanelMiddleware: Middleware = store => next => {
             REQUEST_ITEMS: handleProjectPanelAction(() => {
                 const state = store.getState() as RootState;
                 const dataExplorer = getDataExplorer(state.dataExplorer, PROJECT_PANEL_ID);
-                const typeColumn = columns.find(c => c.name === "Type");
-                const typeFilters = getSelectedTypeFilters(dataExplorer.columns as DataColumns<ProjectPanelItem, ProjectPanelFilter>);
+                const columns = dataExplorer.columns as DataColumns<ProjectPanelItem, ProjectPanelFilter>;
+                const typeFilters = getColumnFilters(columns, "Type");
+                const statusFilters = getColumnFilters(columns, "Status");
                 if (typeFilters.length > 0) {
                     groupsService
                         .contents(state.projects.currentItemId, {
                             limit: dataExplorer.rowsPerPage,
                             offset: dataExplorer.page * dataExplorer.rowsPerPage,
-                            filters: FilterBuilder.create().addIsA("uuid", typeFilters.map(f => f.type))
+                            filters: FilterBuilder
+                                .create()
+                                .addIsA("uuid", typeFilters.map(f => f.type))
+                                .concat(FilterBuilder
+                                    .create<ProcessResource>("containerRequests")
+                                    .addIn("state", statusFilters.map(f => f.type))
+                                )
                         })
                         .then(response => {
                             store.dispatch(actions.SET_ITEMS({
@@ -72,8 +80,8 @@ export const projectPanelMiddleware: Middleware = store => next => {
     };
 };
 
-const getSelectedTypeFilters = (columns: DataColumns<ProjectPanelItem, ProjectPanelFilter>) => {
-    const typeColumn = columns.find(c => c.name === "Type");
-    return typeColumn && typeColumn.filters ? typeColumn.filters.filter(f => f.selected) : [];
+const getColumnFilters = (columns: DataColumns<ProjectPanelItem, ProjectPanelFilter>, columnName: string) => {
+    const column = columns.find(c => c.name === columnName);
+    return column && column.filters ? column.filters.filter(f => f.selected) : [];
 };
 
diff --git a/src/views/project-panel/project-panel.tsx b/src/views/project-panel/project-panel.tsx
index 7323ce2..2c895ee 100644
--- a/src/views/project-panel/project-panel.tsx
+++ b/src/views/project-panel/project-panel.tsx
@@ -14,11 +14,12 @@ import { RouteComponentProps } from 'react-router';
 import { RootState } from '../../store/store';
 import { ResourceKind } from '../../models/kinds';
 import { DataTableFilterItem } from '../../components/data-table-filters/data-table-filters';
+import { ContainerRequestState } from '../../models/container-request';
 
 export const PROJECT_PANEL_ID = "projectPanel";
 
 export interface ProjectPanelFilter extends DataTableFilterItem {
-    type: ResourceKind;
+    type: ResourceKind | ContainerRequestState;
 }
 
 type ProjectPanelProps = {
@@ -124,12 +125,12 @@ const renderOwner = (owner: string) =>
 
 
 const typeToLabel = (type: string) => {
-    switch(type){
+    switch (type) {
         case ResourceKind.Collection:
             return "Data collection";
         case ResourceKind.Project:
             return "Project";
-        case ResourceKind.Process: 
+        case ResourceKind.Process:
             return "Process";
         default:
             return "Unknown";
@@ -158,6 +159,19 @@ export const columns: DataColumns<ProjectPanelItem, ProjectPanelFilter> = [{
 }, {
     name: "Status",
     selected: true,
+    filters: [{
+        name: ContainerRequestState.Committed,
+        selected: true,
+        type: ContainerRequestState.Committed
+    }, {
+        name: ContainerRequestState.Final,
+        selected: true,
+        type: ContainerRequestState.Final
+    }, {
+        name: ContainerRequestState.Uncommitted,
+        selected: true,
+        type: ContainerRequestState.Uncommitted
+    }],
     render: renderStatus,
     width: "75px"
 }, {

commit 9fbe0f44685e9c3c00f753bd36e858bd23c46680
Author: Michal Klobukowski <michal.klobukowski at contractors.roche.com>
Date:   Wed Jul 4 17:26:15 2018 +0200

    Add new conditions and concatenation to FilterBuilder
    
    Feature #13703
    
    Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski <michal.klobukowski at contractors.roche.com>

diff --git a/src/common/api/common-resource-service.ts b/src/common/api/common-resource-service.ts
index 58bcaa5..fe6c752 100644
--- a/src/common/api/common-resource-service.ts
+++ b/src/common/api/common-resource-service.ts
@@ -90,7 +90,7 @@ export default class CommonResourceService<T extends Resource> {
         const { filters, order, ...other } = args;
         const params = {
             ...other,
-            filters: filters ? filters.get() : undefined,
+            filters: filters ? filters.serialize() : undefined,
             order: order ? order.getOrder() : undefined
         };
         return this.serverApi
diff --git a/src/common/api/filter-builder.ts b/src/common/api/filter-builder.ts
index cc31f38..1f2107f 100644
--- a/src/common/api/filter-builder.ts
+++ b/src/common/api/filter-builder.ts
@@ -6,22 +6,14 @@ import * as _ from "lodash";
 import { Resource } from "./common-resource-service";
 
 export default class FilterBuilder<T extends Resource = Resource> {
-    private filters = "";
 
-    static create<T extends Resource = Resource>() {
-        return new FilterBuilder<T>();
+    static create<T extends Resource = Resource>(resourcePrefix = "") {
+        return new FilterBuilder<T>(resourcePrefix);
     }
 
-    private addCondition(field: keyof T, cond: string, value?: string | string[], prefix: string = "", postfix: string = "") {
-        if (value) {
-            value = typeof value === "string"
-                ? `"${prefix}${value}${postfix}"`
-                : `["${value.join(`","`)}"]`;
-
-            this.filters += `["${_.snakeCase(field.toString())}","${cond}",${value}]`;
-        }
-        return this;
-    }
+    constructor(
+        private resourcePrefix = "",
+        private filters = "") { }
 
     public addEqual(field: keyof T, value?: string) {
         return this.addCondition(field, "=", value);
@@ -39,7 +31,38 @@ export default class FilterBuilder<T extends Resource = Resource> {
         return this.addCondition(field, "is_a", value);
     }
 
-    public get() {
+    public addIn(field: keyof T, value?: string | string[]) {
+        return this.addCondition(field, "in", value);
+    }
+
+    public concat<O extends Resource>(filterBuilder: FilterBuilder<O>) {
+        return new FilterBuilder(this.resourcePrefix, this.filters + this.getSeparator() + filterBuilder.getFilters());
+    }
+
+    public getFilters() {
+        return this.filters;
+    }
+
+    public serialize() {
         return "[" + this.filters + "]";
     }
+
+    private addCondition(field: keyof T, cond: string, value?: string | string[], prefix: string = "", postfix: string = "") {
+        if (value) {
+            value = typeof value === "string"
+                ? `"${prefix}${value}${postfix}"`
+                : `["${value.join(`","`)}"]`;
+
+            const resourcePrefix = this.resourcePrefix
+                ? _.snakeCase(this.resourcePrefix) + "."
+                : "";
+
+            this.filters += `${this.getSeparator()}["${resourcePrefix}${_.snakeCase(field.toString())}","${cond}",${value}]`;
+        }
+        return this;
+    }
+
+    private getSeparator () {
+        return this.filters ? "," : "";
+    }
 }
diff --git a/src/services/collection-service/collection-service.ts b/src/services/collection-service/collection-service.ts
index 8a1d693..8412dea 100644
--- a/src/services/collection-service/collection-service.ts
+++ b/src/services/collection-service/collection-service.ts
@@ -34,7 +34,7 @@ export default class CollectionService {
             const fb = new FilterBuilder();
             fb.addLike("ownerUuid", parentUuid);
             return serverApi.get<CollectionsResponse>('/collections', { params: {
-                filters: fb.get()
+                filters: fb.serialize()
             }}).then(resp => {
                 const collections = resp.data.items.map(g => ({
                     name: g.name,
diff --git a/src/services/groups-service/groups-service.ts b/src/services/groups-service/groups-service.ts
index aa39e64..8c5fd8f 100644
--- a/src/services/groups-service/groups-service.ts
+++ b/src/services/groups-service/groups-service.ts
@@ -37,7 +37,7 @@ export default class GroupsService extends CommonResourceService<GroupResource>
         const { filters, order, ...other } = args;
         const params = {
             ...other,
-            filters: filters ? filters.get() : undefined,
+            filters: filters ? filters.serialize() : undefined,
             order: order ? order.getOrder() : undefined
         };
         return this.serverApi

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


hooks/post-receive
-- 




More information about the arvados-commits mailing list