Merge branch '17256-file-selection-dialog-issue'
[arvados-workbench2.git] / src / views-components / tree-picker / tree-picker.ts
index c34b6c37eeb630fc63ca460a53b85c6cf058ba2d..822fdcf2891029ddd1aedaa83de7956f224ce3d4 100644 (file)
@@ -18,22 +18,27 @@ export interface TreePickerProps<T> {
     toggleItemSelection: Callback<T>;
 }
 
-const flatTree = (depth: number, items?: any): [] => {
-    return items ? items.reduce((prev: any, next: any) => {
-        const { items } = next;
+const flatTree = (itemsIdMap: Map<string, any>, depth: number, items?: any): [] => {
+    return items ? items
+        .map((item: any) => addToItemsIdMap(item, itemsIdMap))
+        .reduce((prev: Array<any>, next: any) => {
+            const { items } = next;
+            prev.push({ ...next, depth });
+            prev.push(...(next.open ? flatTree(itemsIdMap, depth + 1, items) : []));
+            return prev;
+        }, []) : [];
+};
 
-        return [
-            ...prev,
-            { ...next, depth },
-            ...(next.open ? flatTree(depth + 1, items) : []),
-        ];
-    }, []) : [];
+const addToItemsIdMap = <T>(item: TreeItem<T>, itemsIdMap: Map<string, TreeItem<T>>) => {
+    itemsIdMap[item.id] = item;
+    return item;
 };
 
 const memoizedMapStateToProps = () => {
     let prevTree: Ttree<any>;
-    let mappedProps: Pick<TreeProps<any>, 'items' | 'disableRipple'>;
-    return <T>(state: RootState, props: TreePickerProps<T>): Pick<TreeProps<T>, 'items' | 'disableRipple'> => {
+    let mappedProps: Pick<TreeProps<any>, 'items' | 'disableRipple' | 'itemsMap'>;
+    return <T>(state: RootState, props: TreePickerProps<T>): Pick<TreeProps<T>, 'items' | 'disableRipple' | 'itemsMap'> => {
+        const itemsIdMap: Map<string, TreeItem<T>> = new Map();
         const tree = state.treePicker[props.pickerId] || createTree();
         if (tree !== prevTree) {
             prevTree = tree;
@@ -41,11 +46,13 @@ const memoizedMapStateToProps = () => {
                 disableRipple: true,
                 items: getNodeChildrenIds('')(tree)
                     .map(treePickerToTreeItems(tree))
+                    .map(item => addToItemsIdMap(item, itemsIdMap))
                     .map(parentItem => ({
                         ...parentItem,
                         flatTree: true,
-                        items: flatTree(2, parentItem.items || []),
-                    }))
+                        items: flatTree(itemsIdMap, 2, parentItem.items || []),
+                    })),
+                itemsMap: itemsIdMap,
             };
         }
         return mappedProps;