names changed
[arvados-workbench2.git] / src / store / tree-picker / tree-picker-reducer.ts
index e7173d22ac73832403cb486c345f41b6f106946b..b0d9bc94caa9843d6774b141ea8687737f773240 100644 (file)
@@ -7,6 +7,7 @@ import { TreePicker, TreePickerNode } from "./tree-picker";
 import { treePickerActions, TreePickerAction } from "./tree-picker-actions";
 import { TreeItemStatus } from "~/components/tree/tree";
 import { compose } from "redux";
+import { getNode } from '../../models/tree';
 
 export const treePickerReducer = (state: TreePicker = {}, action: TreePickerAction) =>
     treePickerActions.match(action, {
@@ -18,8 +19,10 @@ export const treePickerReducer = (state: TreePicker = {}, action: TreePickerActi
             updateOrCreatePicker(state, pickerId, setNodeValueWith(toggleCollapse)(nodeId)),
         TOGGLE_TREE_PICKER_NODE_SELECT: ({ nodeId, pickerId }) =>
             updateOrCreatePicker(state, pickerId, mapTreeValues(toggleSelect(nodeId))),
-        RESET_TREE_PICKER: ({ pickerId }) => 
+        RESET_TREE_PICKER: ({ pickerId }) =>
             updateOrCreatePicker(state, pickerId, createTree),
+        EXPAND_TREE_PICKER_NODES: ({ pickerId, nodeIds }) =>
+            updateOrCreatePicker(state, pickerId, mapTreeValues(expand(nodeIds))),
         default: () => state
     });
 
@@ -29,6 +32,11 @@ const updateOrCreatePicker = (state: TreePicker, pickerId: string, func: (value:
     return { ...state, [pickerId]: updatedPicker };
 };
 
+const expand = (ids: string[]) => (node: TreePickerNode): TreePickerNode =>
+    ids.some(id => id === node.nodeId)
+        ? { ...node, collapsed: false }
+        : node;
+
 const setPending = (value: TreePickerNode): TreePickerNode =>
     ({ ...value, status: TreeItemStatus.PENDING });
 
@@ -43,11 +51,19 @@ const toggleSelect = (nodeId: string) => (value: TreePickerNode): TreePickerNode
         ? ({ ...value, selected: !value.selected })
         : ({ ...value, selected: false });
 
-const receiveNodes = (nodes: Array<TreePickerNode>) => (parent: string) => (state: Tree<TreePickerNode>) =>
-    nodes.reduce((tree, node) =>
-        setNode(
-            createTreeNode(parent)(node)
-        )(tree), state);
+const receiveNodes = (nodes: Array<TreePickerNode>) => (parent: string) => (state: Tree<TreePickerNode>) => {
+    const parentNode = getNode(parent)(state);
+    let newState = state;
+    if (parentNode) {
+        newState = setNode({ ...parentNode, children: [] })(state);
+    }
+    return nodes.reduce((tree, node) => {
+        const oldNode = getNode(node.nodeId)(state) || { value: {} };
+        const newNode = createTreeNode(parent)(node);
+        const value = { ...oldNode.value, ...newNode.value };
+        return setNode({ ...newNode, value })(tree);
+    }, newState);
+};
 
 const createTreeNode = (parent: string) => (node: TreePickerNode): TreeNode<TreePickerNode> => ({
     children: [],