[arvados-workbench2] created: 2.4.0-104-gea5a820f

git repository hosting git at public.arvados.org
Wed Jun 1 13:45:45 UTC 2022


        at  ea5a820fec3ed912626227103ed6bd84d6ee8ff3 (commit)


commit ea5a820fec3ed912626227103ed6bd84d6ee8ff3
Author: Stephen Smith <stephen at curii.com>
Date:   Wed Jun 1 09:45:04 2022 -0400

    18984: Move and rename workflow / definition filter
    
    Arvados-DCO-1.1-Signed-off-by: Stephen Smith <stephen at curii.com>

diff --git a/src/store/resource-type-filters/resource-type-filters.test.ts b/src/store/resource-type-filters/resource-type-filters.test.ts
index f001770e..c2ace021 100644
--- a/src/store/resource-type-filters/resource-type-filters.test.ts
+++ b/src/store/resource-type-filters/resource-type-filters.test.ts
@@ -44,8 +44,8 @@ describe("serializeResourceTypeFilters", () => {
     it("should serialize output collections and projects", () => {
         const filters = pipe(
             () => getInitialResourceTypeFilters(),
-            deselectNode(ObjectTypeFilter.PROCESS),
             deselectNode(ObjectTypeFilter.WORKFLOW),
+            deselectNode(ObjectTypeFilter.DEFINITION),
             deselectNode(CollectionTypeFilter.GENERAL_COLLECTION),
             deselectNode(CollectionTypeFilter.LOG_COLLECTION),
             deselectNode(CollectionTypeFilter.INTERMEDIATE_COLLECTION),
@@ -59,8 +59,8 @@ describe("serializeResourceTypeFilters", () => {
     it("should serialize intermediate collections and projects", () => {
         const filters = pipe(
             () => getInitialResourceTypeFilters(),
-            deselectNode(ObjectTypeFilter.PROCESS),
             deselectNode(ObjectTypeFilter.WORKFLOW),
+            deselectNode(ObjectTypeFilter.DEFINITION),
             deselectNode(CollectionTypeFilter.GENERAL_COLLECTION),
             deselectNode(CollectionTypeFilter.LOG_COLLECTION),
             deselectNode(CollectionTypeFilter.OUTPUT_COLLECTION),
@@ -75,8 +75,8 @@ describe("serializeResourceTypeFilters", () => {
         const filters = pipe(
             () => getInitialResourceTypeFilters(),
             deselectNode(ObjectTypeFilter.PROJECT),
-            deselectNode(ObjectTypeFilter.PROCESS),
             deselectNode(ObjectTypeFilter.WORKFLOW),
+            deselectNode(ObjectTypeFilter.DEFINITION),
             deselectNode(CollectionTypeFilter.OUTPUT_COLLECTION)
         )();
 
@@ -91,7 +91,7 @@ describe("serializeResourceTypeFilters", () => {
             deselectNode(ObjectTypeFilter.PROJECT),
             deselectNode(ProcessTypeFilter.CHILD_PROCESS),
             deselectNode(ObjectTypeFilter.COLLECTION),
-            deselectNode(ObjectTypeFilter.WORKFLOW),
+            deselectNode(ObjectTypeFilter.DEFINITION),
         )();
 
         const serializedFilters = serializeResourceTypeFilters(filters);
@@ -105,7 +105,7 @@ describe("serializeResourceTypeFilters", () => {
             deselectNode(ObjectTypeFilter.PROJECT),
             deselectNode(ProcessTypeFilter.MAIN_PROCESS),
             deselectNode(ObjectTypeFilter.COLLECTION),
-            deselectNode(ObjectTypeFilter.WORKFLOW),
+            deselectNode(ObjectTypeFilter.DEFINITION),
         )();
 
         const serializedFilters = serializeResourceTypeFilters(filters);
@@ -116,9 +116,9 @@ describe("serializeResourceTypeFilters", () => {
     it("should serialize all project types", () => {
         const filters = pipe(
             () => getInitialResourceTypeFilters(),
-            deselectNode(ObjectTypeFilter.PROCESS),
-            deselectNode(ObjectTypeFilter.COLLECTION),
             deselectNode(ObjectTypeFilter.WORKFLOW),
+            deselectNode(ObjectTypeFilter.COLLECTION),
+            deselectNode(ObjectTypeFilter.DEFINITION),
         )();
 
         const serializedFilters = serializeResourceTypeFilters(filters);
@@ -130,9 +130,9 @@ describe("serializeResourceTypeFilters", () => {
         const filters = pipe(
             () => getInitialResourceTypeFilters(),
             deselectNode(GroupTypeFilter.PROJECT),
-            deselectNode(ObjectTypeFilter.PROCESS),
-            deselectNode(ObjectTypeFilter.COLLECTION),
             deselectNode(ObjectTypeFilter.WORKFLOW),
+            deselectNode(ObjectTypeFilter.COLLECTION),
+            deselectNode(ObjectTypeFilter.DEFINITION),
         )();
 
         const serializedFilters = serializeResourceTypeFilters(filters);
@@ -144,9 +144,9 @@ describe("serializeResourceTypeFilters", () => {
         const filters = pipe(
             () => getInitialResourceTypeFilters(),
             deselectNode(GroupTypeFilter.FILTER_GROUP),
-            deselectNode(ObjectTypeFilter.PROCESS),
-            deselectNode(ObjectTypeFilter.COLLECTION),
             deselectNode(ObjectTypeFilter.WORKFLOW),
+            deselectNode(ObjectTypeFilter.COLLECTION),
+            deselectNode(ObjectTypeFilter.DEFINITION),
         )();
 
         const serializedFilters = serializeResourceTypeFilters(filters);
diff --git a/src/store/resource-type-filters/resource-type-filters.ts b/src/store/resource-type-filters/resource-type-filters.ts
index 9f6d73ba..04c056dc 100644
--- a/src/store/resource-type-filters/resource-type-filters.ts
+++ b/src/store/resource-type-filters/resource-type-filters.ts
@@ -25,9 +25,9 @@ export enum ProcessStatusFilter {
 
 export enum ObjectTypeFilter {
     PROJECT = 'Project',
-    PROCESS = 'Process',
-    COLLECTION = 'Data collection',
     WORKFLOW = 'Workflow',
+    COLLECTION = 'Data collection',
+    DEFINITION = 'Definition',
 }
 
 export enum GroupTypeFilter {
@@ -43,8 +43,8 @@ export enum CollectionTypeFilter {
 }
 
 export enum ProcessTypeFilter {
-    MAIN_PROCESS = 'Main',
-    CHILD_PROCESS = 'Child',
+    MAIN_PROCESS = 'Runs',
+    CHILD_PROCESS = 'Intermediate Steps',
 }
 
 const initFilter = (name: string, parent = '', isSelected?: boolean, isExpanded?: boolean) =>
@@ -63,9 +63,9 @@ const initFilter = (name: string, parent = '', isSelected?: boolean, isExpanded?
 export const getSimpleObjectTypeFilters = pipe(
     (): DataTableFilters => createTree<DataTableFilterItem>(),
     initFilter(ObjectTypeFilter.PROJECT),
-    initFilter(ObjectTypeFilter.PROCESS),
-    initFilter(ObjectTypeFilter.COLLECTION),
     initFilter(ObjectTypeFilter.WORKFLOW),
+    initFilter(ObjectTypeFilter.COLLECTION),
+    initFilter(ObjectTypeFilter.DEFINITION),
 );
 
 // Using pipe() with more than 7 arguments makes the return type be 'any',
@@ -78,9 +78,10 @@ export const getInitialResourceTypeFilters = pipe(
         initFilter(GroupTypeFilter.FILTER_GROUP, ObjectTypeFilter.PROJECT),
     ),
     pipe(
-        initFilter(ObjectTypeFilter.PROCESS, '', false, true),
-        initFilter(ProcessTypeFilter.MAIN_PROCESS, ObjectTypeFilter.PROCESS),
-        initFilter(ProcessTypeFilter.CHILD_PROCESS, ObjectTypeFilter.PROCESS, false)
+        initFilter(ObjectTypeFilter.WORKFLOW, '', false, true),
+        initFilter(ObjectTypeFilter.DEFINITION, ObjectTypeFilter.WORKFLOW),
+        initFilter(ProcessTypeFilter.MAIN_PROCESS, ObjectTypeFilter.WORKFLOW),
+        initFilter(ProcessTypeFilter.CHILD_PROCESS, ObjectTypeFilter.WORKFLOW, false),
     ),
     pipe(
         initFilter(ObjectTypeFilter.COLLECTION, '', true, true),
@@ -89,7 +90,6 @@ export const getInitialResourceTypeFilters = pipe(
         initFilter(CollectionTypeFilter.INTERMEDIATE_COLLECTION, ObjectTypeFilter.COLLECTION),
         initFilter(CollectionTypeFilter.LOG_COLLECTION, ObjectTypeFilter.COLLECTION),
     ),
-    initFilter(ObjectTypeFilter.WORKFLOW)
 
 );
 
@@ -134,11 +134,11 @@ const objectTypeToResourceKind = (type: ObjectTypeFilter) => {
     switch (type) {
         case ObjectTypeFilter.PROJECT:
             return ResourceKind.PROJECT;
-        case ObjectTypeFilter.PROCESS:
+        case ObjectTypeFilter.WORKFLOW:
             return ResourceKind.PROCESS;
         case ObjectTypeFilter.COLLECTION:
             return ResourceKind.COLLECTION;
-        case ObjectTypeFilter.WORKFLOW:
+        case ObjectTypeFilter.DEFINITION:
             return ResourceKind.WORKFLOW;
     }
 };
@@ -156,7 +156,7 @@ const serializeObjectTypeFilters = ({ fb, selectedFilters }: ReturnType<typeof c
             ? set.add(ObjectTypeFilter.COLLECTION)
             : set,
         set => processFilters.length > 0
-            ? set.add(ObjectTypeFilter.PROCESS)
+            ? set.add(ObjectTypeFilter.WORKFLOW)
             : set,
         set => Array.from(set)
     )();

commit 10465af2a9575f004b8f516d8c74b50413531972
Author: Stephen Smith <stephen at curii.com>
Date:   Tue May 31 23:34:46 2022 -0400

    18984: Add auto-apply with debounce to non-mutually exclusive data table filter popover
    
    Arvados-DCO-1.1-Signed-off-by: Stephen Smith <stephen at curii.com>

diff --git a/src/components/data-table-filters/data-table-filters-popover.tsx b/src/components/data-table-filters/data-table-filters-popover.tsx
index 3183157b..b5187866 100644
--- a/src/components/data-table-filters/data-table-filters-popover.tsx
+++ b/src/components/data-table-filters/data-table-filters-popover.tsx
@@ -2,7 +2,7 @@
 //
 // SPDX-License-Identifier: AGPL-3.0
 
-import React from "react";
+import React, { useEffect } from "react";
 import {
     WithStyles,
     withStyles,
@@ -23,6 +23,7 @@ import { DefaultTransformOrigin } from "components/popover/helpers";
 import { createTree } from 'models/tree';
 import { DataTableFilters, DataTableFiltersTree } from "./data-table-filters-tree";
 import { getNodeDescendants } from 'models/tree';
+import debounce from "lodash/debounce";
 
 export type CssRules = "root" | "icon" | "iconButton" | "active" | "checkbox";
 
@@ -127,7 +128,7 @@ export const DataTableFiltersPopover = withStyles(styles)(
                     open={!!this.state.anchorEl}
                     anchorOrigin={DefaultTransformOrigin}
                     transformOrigin={DefaultTransformOrigin}
-                    onClose={this.cancel}>
+                    onClose={this.close}>
                     <Card>
                         <CardContent>
                             <Typography variant="caption">
@@ -137,36 +138,21 @@ export const DataTableFiltersPopover = withStyles(styles)(
                         <DataTableFiltersTree
                             filters={this.state.filters}
                             mutuallyExclusive={this.props.mutuallyExclusive}
-                            onChange={filters => {
-                                this.setState({ filters });
-                                if (this.props.mutuallyExclusive) {
-                                    const { onChange } = this.props;
-                                    if (onChange) {
-                                        onChange(filters);
-                                    }
-                                    this.setState({ anchorEl: undefined });
-                                }
-                            }} />
+                            onChange={this.onChange} />
                         {this.props.mutuallyExclusive ||
                         <CardActions>
-                            <Button
-                                color="primary"
-                                variant='contained'
-                                size="small"
-                                onClick={this.submit}>
-                                Ok
-                            </Button>
                             <Button
                                 color="primary"
                                 variant="outlined"
                                 size="small"
-                                onClick={this.cancel}>
-                                Cancel
+                                onClick={this.close}>
+                                Close
                             </Button>
                         </CardActions >
                         }
                     </Card>
                 </Popover>
+                <this.MountHandler />
             </>;
         }
 
@@ -180,25 +166,43 @@ export const DataTableFiltersPopover = withStyles(styles)(
             this.setState({ anchorEl: this.icon.current || undefined });
         }
 
-        submit = () => {
+        onChange = (filters) => {
+            this.setState({ filters });
+            if (this.props.mutuallyExclusive) {
+                // Mutually exclusive filters apply immediately
+                const { onChange } = this.props;
+                if (onChange) {
+                    onChange(filters);
+                }
+                this.close();
+            } else {
+                // Non-mutually exclusive filters are debounced
+                this.submit();
+            }
+        }
+
+        submit = debounce (() => {
             const { onChange } = this.props;
             if (onChange) {
                 onChange(this.state.filters);
             }
-            this.setState({ anchorEl: undefined });
-        }
+        }, 1000);
+
+        MountHandler = () => {
+            useEffect(() => {
+                return () => {
+                    this.submit.cancel();
+                }
+            },[]);
+            return null;
+        };
 
-        cancel = () => {
+        close = () => {
             this.setState(prev => ({
                 ...prev,
-                filters: prev.prevFilters,
                 anchorEl: undefined
             }));
         }
 
-        setFilters = (filters: DataTableFilters) => {
-            this.setState({ filters });
-        }
-
     }
 );

commit 2903199054f8ac49ff15386fa576a0765032fa25
Author: Stephen Smith <stephen at curii.com>
Date:   Wed May 25 21:27:43 2022 -0400

    19894: Change process type filter default values and collapse state
    
    Arvados-DCO-1.1-Signed-off-by: Stephen Smith <stephen at curii.com>

diff --git a/src/store/resource-type-filters/resource-type-filters.ts b/src/store/resource-type-filters/resource-type-filters.ts
index 6f766b58..9f6d73ba 100644
--- a/src/store/resource-type-filters/resource-type-filters.ts
+++ b/src/store/resource-type-filters/resource-type-filters.ts
@@ -47,7 +47,7 @@ export enum ProcessTypeFilter {
     CHILD_PROCESS = 'Child',
 }
 
-const initFilter = (name: string, parent = '', isSelected?: boolean) =>
+const initFilter = (name: string, parent = '', isSelected?: boolean, isExpanded?: boolean) =>
     setNode<DataTableFilterItem>({
         id: name,
         value: { name },
@@ -55,8 +55,8 @@ const initFilter = (name: string, parent = '', isSelected?: boolean) =>
         children: [],
         active: false,
         selected: isSelected !== undefined ? isSelected : true,
-        expanded: false,
         initialState: isSelected !== undefined ? isSelected : true,
+        expanded: isExpanded !== undefined ? isExpanded : false,
         status: TreeNodeStatus.LOADED,
     });
 
@@ -73,17 +73,17 @@ export const getSimpleObjectTypeFilters = pipe(
 export const getInitialResourceTypeFilters = pipe(
     (): DataTableFilters => createTree<DataTableFilterItem>(),
     pipe(
-        initFilter(ObjectTypeFilter.PROJECT),
+        initFilter(ObjectTypeFilter.PROJECT, '', true, true),
         initFilter(GroupTypeFilter.PROJECT, ObjectTypeFilter.PROJECT),
         initFilter(GroupTypeFilter.FILTER_GROUP, ObjectTypeFilter.PROJECT),
     ),
     pipe(
-        initFilter(ObjectTypeFilter.PROCESS),
+        initFilter(ObjectTypeFilter.PROCESS, '', false, true),
         initFilter(ProcessTypeFilter.MAIN_PROCESS, ObjectTypeFilter.PROCESS),
-        initFilter(ProcessTypeFilter.CHILD_PROCESS, ObjectTypeFilter.PROCESS)
+        initFilter(ProcessTypeFilter.CHILD_PROCESS, ObjectTypeFilter.PROCESS, false)
     ),
     pipe(
-        initFilter(ObjectTypeFilter.COLLECTION),
+        initFilter(ObjectTypeFilter.COLLECTION, '', true, true),
         initFilter(CollectionTypeFilter.GENERAL_COLLECTION, ObjectTypeFilter.COLLECTION),
         initFilter(CollectionTypeFilter.OUTPUT_COLLECTION, ObjectTypeFilter.COLLECTION),
         initFilter(CollectionTypeFilter.INTERMEDIATE_COLLECTION, ObjectTypeFilter.COLLECTION),

commit c69c6d43021b29186717ad30bea95cf50ee8c1e6
Author: Stephen Smith <stephen at curii.com>
Date:   Wed May 25 21:26:35 2022 -0400

    19894: Show dirty indicator on process type filter
    
    Arvados-DCO-1.1-Signed-off-by: Stephen Smith <stephen at curii.com>

diff --git a/src/components/data-table-filters/data-table-filters-tree.tsx b/src/components/data-table-filters/data-table-filters-tree.tsx
index 659a385d..fab9086e 100644
--- a/src/components/data-table-filters/data-table-filters-tree.tsx
+++ b/src/components/data-table-filters/data-table-filters-tree.tsx
@@ -76,7 +76,12 @@ export class DataTableFiltersTree extends React.Component<DataTableFilterProps>
 }
 
 const renderItem = (item: TreeItem<DataTableFilterItem>) =>
-    <span>{item.data.name}</span>;
+    <span>
+        {item.data.name}
+        {item.initialState !== item.selected ? <>
+            *
+        </> : null}
+    </span>;
 
 const filterToTreeItem = (filters: DataTableFilters) =>
     (id: string): TreeItem<any> => {
@@ -92,6 +97,7 @@ const filterToTreeItem = (filters: DataTableFilters) =>
             items: items.length > 0 ? items : undefined,
             open: node.expanded,
             selected: node.selected,
+            initialState: node.initialState,
             indeterminate: isIndeterminate,
             status: TreeItemStatus.LOADED,
         };
diff --git a/src/components/tree/tree.tsx b/src/components/tree/tree.tsx
index 6e562dfa..fc9dbc74 100644
--- a/src/components/tree/tree.tsx
+++ b/src/components/tree/tree.tsx
@@ -97,6 +97,7 @@ export interface TreeItem<T> {
     open: boolean;
     active: boolean;
     selected?: boolean;
+    initialState?: boolean;
     indeterminate?: boolean;
     flatTree?: boolean;
     status: TreeItemStatus;
diff --git a/src/models/tree.ts b/src/models/tree.ts
index e9291388..4a52d61a 100644
--- a/src/models/tree.ts
+++ b/src/models/tree.ts
@@ -14,6 +14,7 @@ export interface TreeNode<T = any> {
     parent: string;
     active: boolean;
     selected: boolean;
+    initialState?: boolean;
     expanded: boolean;
     status: TreeNodeStatus;
 }
diff --git a/src/store/resource-type-filters/resource-type-filters.ts b/src/store/resource-type-filters/resource-type-filters.ts
index 64a391ca..6f766b58 100644
--- a/src/store/resource-type-filters/resource-type-filters.ts
+++ b/src/store/resource-type-filters/resource-type-filters.ts
@@ -56,6 +56,7 @@ const initFilter = (name: string, parent = '', isSelected?: boolean) =>
         active: false,
         selected: isSelected !== undefined ? isSelected : true,
         expanded: false,
+        initialState: isSelected !== undefined ? isSelected : true,
         status: TreeNodeStatus.LOADED,
     });
 

commit 0537bee45712945bd97d28f6d28118f7589a6840
Author: Stephen Smith <stephen at curii.com>
Date:   Wed May 25 21:23:22 2022 -0400

    18984: Add indeterminate ui for process type filters
    
    Arvados-DCO-1.1-Signed-off-by: Stephen Smith <stephen at curii.com>

diff --git a/src/components/data-table-filters/data-table-filters-tree.tsx b/src/components/data-table-filters/data-table-filters-tree.tsx
index 6514078d..659a385d 100644
--- a/src/components/data-table-filters/data-table-filters-tree.tsx
+++ b/src/components/data-table-filters/data-table-filters-tree.tsx
@@ -83,6 +83,7 @@ const filterToTreeItem = (filters: DataTableFilters) =>
         const node = getNode(id)(filters) || initTreeNode({ id: '', value: 'InvalidNode' });
         const items = getNodeChildrenIds(node.id)(filters)
             .map(filterToTreeItem(filters));
+        const isIndeterminate = !node.selected && items.some(i => i.selected || i.indeterminate);
 
         return {
             active: node.active,
@@ -91,6 +92,7 @@ const filterToTreeItem = (filters: DataTableFilters) =>
             items: items.length > 0 ? items : undefined,
             open: node.expanded,
             selected: node.selected,
+            indeterminate: isIndeterminate,
             status: TreeItemStatus.LOADED,
         };
     };
diff --git a/src/components/tree/tree.tsx b/src/components/tree/tree.tsx
index 3ae884b6..6e562dfa 100644
--- a/src/components/tree/tree.tsx
+++ b/src/components/tree/tree.tsx
@@ -97,6 +97,7 @@ export interface TreeItem<T> {
     open: boolean;
     active: boolean;
     selected?: boolean;
+    indeterminate?: boolean;
     flatTree?: boolean;
     status: TreeItemStatus;
     items?: Array<TreeItem<T>>;
@@ -292,6 +293,7 @@ export const Tree = withStyles(styles)(
                             {showSelection(it) && !useRadioButtons &&
                                 <Checkbox
                                     checked={it.selected}
+                                    indeterminate={!it.selected && it.indeterminate}
                                     className={classes.checkbox}
                                     color="primary"
                                     onClick={this.handleCheckboxChange(it)} />}

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


hooks/post-receive
-- 




More information about the arvados-commits mailing list