X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/e92207c912aed73a07340b5fb2a9e2cb23e1da5f..273119605b7f33940a5ef9b1422eb1ff152d6764:/src/models/tree.ts diff --git a/src/models/tree.ts b/src/models/tree.ts index 69224059b8..996f98a465 100644 --- a/src/models/tree.ts +++ b/src/models/tree.ts @@ -14,9 +14,9 @@ export interface TreeNode { parent: string; active: boolean; selected: boolean; + initialState?: boolean; expanded: boolean; status: TreeNodeStatus; - level?: number; } export enum TreeNodeStatus { @@ -75,6 +75,7 @@ export const setNodeValueWith = (mapFn: (value: T) => T) => (id: string) => ( export const mapTreeValues = (mapFn: (value: T) => R) => (tree: Tree): Tree => getNodeDescendantsIds('')(tree) .map(id => getNode(id)(tree)) + .filter(node => !!node) .map(mapNodeValue(mapFn)) .reduce((newTree, node) => setNode(node)(newTree), createTree()); @@ -194,10 +195,22 @@ export const initTreeNode = (data: Pick, 'id' | 'value'> & { pare expanded: false, status: TreeNodeStatus.INITIAL, parent: '', - level: 0, ...data, }); +export const getTreeDirty = (id: string) => (tree: Tree): boolean => { + const node = getNode(id)(tree); + const children = getNodeDescendants(id)(tree); + return (node + && node.initialState !== undefined + && node.selected !== node.initialState + ) + || children.some(child => + child.initialState !== undefined + && child.selected !== child.initialState + ); +} + const toggleDescendantsSelection = (id: string) => (tree: Tree) => { const node = getNode(id)(tree); if (node) { @@ -229,7 +242,6 @@ const toggleParentNodeSelection = (id: string) => (tree: Tree) => { return tree; }; - const mapNodeValue = (mapFn: (value: T) => R) => (node: TreeNode): TreeNode => ({ ...node, value: mapFn(node.value) });