Merge branch '15019-project-view-status-filter'
authorLucas Di Pentima <lucas@di-pentima.com.ar>
Tue, 21 Jan 2020 20:23:39 +0000 (17:23 -0300)
committerLucas Di Pentima <lucas@di-pentima.com.ar>
Tue, 21 Jan 2020 20:23:39 +0000 (17:23 -0300)
Closes #15019

Arvados-DCO-1.1-Signed-off-by: Lucas Di Pentima <lucas@di-pentima.com.ar>

src/services/api/filter-builder.ts
src/services/favorite-service/favorite-service.ts
src/services/project-service/project-service.ts
src/store/project-panel/project-panel-middleware-service.ts
src/views/project-panel/project-panel.tsx

index aa0f011b037b2ca1def0c426f20d5a9bbea71cf1..102ff62c60e3eb1afc1076bf7ca2d85589e0fe63 100644 (file)
@@ -2,8 +2,8 @@
 //
 // SPDX-License-Identifier: AGPL-3.0
 
-export function joinFilters(filters0?: string, filters1?: string) {
-    return [filters0, filters1].filter(s => s).join(",");
+export function joinFilters(...filters: string[]) {
+    return filters.filter(s => s).join(",");
 }
 
 export class FilterBuilder {
index 8b504c867fe7f781a42ad064878ede727921fe80..90849c8b95b1a79b632827ab75bf404b1c046744 100644 (file)
@@ -53,7 +53,7 @@ export class FavoriteService {
 
         return this.linkService
             .list({
-                filters: joinFilters(filters, listFilters),
+                filters: joinFilters(filters || '', listFilters),
                 limit,
                 offset,
                 order: linkOrder
index eec5a9409adc9aa090783cc9843a86487581c69d..4ae91d4d088fe1c113e75d4191142719e39be618 100644 (file)
@@ -18,7 +18,7 @@ export class ProjectService extends GroupsService<ProjectResource> {
         return super.list({
             ...args,
             filters: joinFilters(
-                args.filters,
+                args.filters || '',
                 new FilterBuilder()
                     .addEqual("group_class", GroupClass.PROJECT)
                     .getFilters()
index d4b2416ef6b05f163515d76b39619fa1ead13b23..b889f7cbc0ad7277337fa6a90e147d2a26180149 100644 (file)
@@ -29,7 +29,7 @@ import { ListResults } from '~/services/common-service/common-service';
 import { loadContainers } from '~/store/processes/processes-actions';
 import { ResourceKind } from '~/models/resource';
 import { getSortColumn } from "~/store/data-explorer/data-explorer-reducer";
-import { serializeResourceTypeFilters } from '~/store/resource-type-filters/resource-type-filters';
+import { serializeResourceTypeFilters, ProcessStatusFilter } from '~/store/resource-type-filters/resource-type-filters';
 import { updatePublicFavorites } from '~/store/public-favorites/public-favorites-actions';
 
 export class ProjectPanelMiddlewareService extends DataExplorerMiddlewareService {
@@ -103,6 +103,10 @@ export const getParams = (dataExplorer: DataExplorer, isProjectTrashed: boolean)
 export const getFilters = (dataExplorer: DataExplorer) => {
     const columns = dataExplorer.columns as DataColumns<string>;
     const typeFilters = serializeResourceTypeFilters(getDataExplorerColumnFilters(columns, ProjectPanelColumnNames.TYPE));
+    const statusColumnFilters = getDataExplorerColumnFilters(columns, 'Status');
+    const activeStatusFilter = Object.keys(statusColumnFilters).find(
+        filterName => statusColumnFilters[filterName].selected
+    );
 
     // TODO: Extract group contents name filter
     const nameFilters = new FilterBuilder()
@@ -111,12 +115,35 @@ export const getFilters = (dataExplorer: DataExplorer) => {
         .addILike("name", dataExplorer.searchValue, GroupContentsResourcePrefix.PROJECT)
         .getFilters();
 
+    // Filter by container status
+    const fb = new FilterBuilder();
+    switch (activeStatusFilter) {
+        case ProcessStatusFilter.COMPLETED: {
+            fb.addEqual('container.state', 'Complete', GroupContentsResourcePrefix.PROCESS);
+            fb.addEqual('container.exit_code', '0', GroupContentsResourcePrefix.PROCESS);
+            break;
+        }
+        case ProcessStatusFilter.FAILED: {
+            fb.addEqual('container.state', 'Complete', GroupContentsResourcePrefix.PROCESS);
+            fb.addDistinct('container.exit_code', '0', GroupContentsResourcePrefix.PROCESS);
+            break;
+        }
+        case ProcessStatusFilter.CANCELLED:
+        case ProcessStatusFilter.FAILED:
+        case ProcessStatusFilter.LOCKED:
+        case ProcessStatusFilter.QUEUED:
+        case ProcessStatusFilter.RUNNING: {
+            fb.addEqual('container.state', activeStatusFilter, GroupContentsResourcePrefix.PROCESS);
+            break;
+        }
+    }
+    const statusFilters = fb.getFilters();
+
     return joinFilters(
+        statusFilters,
         typeFilters,
         nameFilters,
     );
-    // TODO: Restore process status filters
-    // const statusFilters = getDataExplorerColumnFilters(columns, ProjectPanelColumnNames.STATUS);
 };
 
 export const getOrder = (dataExplorer: DataExplorer) => {
index df8f22e75e2b5f7e41a7228f6487e80d2d780dde..1e26bc0d5c1e29d2008cd7d5bf95f19a62747cc7 100644 (file)
@@ -28,7 +28,7 @@ import { PROJECT_PANEL_CURRENT_UUID } from '~/store/project-panel/project-panel-
 import { DataTableDefaultView } from '~/components/data-table-default-view/data-table-default-view';
 import { ArvadosTheme } from "~/common/custom-theme";
 import { createTree } from '~/models/tree';
-import { getInitialResourceTypeFilters } from '~/store/resource-type-filters/resource-type-filters';
+import { getInitialResourceTypeFilters, getInitialProcessStatusFilters } from '~/store/resource-type-filters/resource-type-filters';
 
 type CssRules = 'root' | "button";
 
@@ -69,7 +69,8 @@ export const projectPanelColumns: DataColumns<string> = [
         name: "Status",
         selected: true,
         configurable: true,
-        filters: createTree(),
+        mutuallyExclusiveFilters: true,
+        filters: getInitialProcessStatusFilters(),
         render: uuid => <ProcessStatus uuid={uuid} />,
     },
     {