X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/c1889cf297d64d0b7290660bdb074a73f1394b97..e7af5ee5ca402f7c637586831d611e5648cbc5b9:/src/models/tree.ts diff --git a/src/models/tree.ts b/src/models/tree.ts index 69d2e937..61360110 100644 --- a/src/models/tree.ts +++ b/src/models/tree.ts @@ -86,7 +86,7 @@ export const getNodeDescendantsIds = (id: string, limit = Infinity) => (tree: const node = getNode(id)(tree); const children = node ? node.children : id === TREE_ROOT_ID - ? getRootNodeChildren(tree) + ? getRootNodeChildrenIds(tree) : []; return children @@ -109,6 +109,8 @@ export const mapIdsToNodes = (ids: string[]) => (tree: Tree) => export const activateNode = (id: string) => (tree: Tree) => mapTree(node => node.id === id ? { ...node, active: true } : { ...node, active: false })(tree); +export const deactivateNode = (tree: Tree) => + mapTree(node => node.active ? { ...node, active: false } : node)(tree); export const expandNode = (...ids: string[]) => (tree: Tree) => mapTree(node => ids.some(id => id === node.id) ? { ...node, expanded: true } : node)(tree); @@ -137,7 +139,30 @@ export const toggleNodeSelection = (id: string) => (tree: Tree) => { }; -export const initTreeNode = (data: Pick, 'id' | 'value'> & {parent?: string}): TreeNode => ({ +export const selectNode = (id: string) => (tree: Tree) => { + const node = getNode(id)(tree); + return node && node.selected + ? tree + : toggleNodeSelection(id)(tree); +}; + +export const selectNodes = (id: string | string[]) => (tree: Tree) => { + const ids = typeof id === 'string' ? [id] : id; + return ids.reduce((tree, id) => selectNode(id)(tree), tree); +}; +export const deselectNode = (id: string) => (tree: Tree) => { + const node = getNode(id)(tree); + return node && node.selected + ? toggleNodeSelection(id)(tree) + : tree; +}; + +export const deselectNodes = (id: string | string[]) => (tree: Tree) => { + const ids = typeof id === 'string' ? [id] : id; + return ids.reduce((tree, id) => deselectNode(id)(tree), tree); +}; + +export const initTreeNode = (data: Pick, 'id' | 'value'> & { parent?: string }): TreeNode => ({ children: [], active: false, selected: false, @@ -182,11 +207,12 @@ const toggleParentNodeSelection = (id: string) => (tree: Tree) => { const mapNodeValue = (mapFn: (value: T) => R) => (node: TreeNode): TreeNode => ({ ...node, value: mapFn(node.value) }); -const getRootNodeChildren = (tree: Tree) => +const getRootNodeChildrenIds = (tree: Tree) => Object .keys(tree) .filter(id => getNode(id)(tree)!.parent === TREE_ROOT_ID); + const addChild = (parentId: string, childId: string) => (tree: Tree): Tree => { const node = getNode(parentId)(tree); if (node) {