parent: string;
active: boolean;
selected: boolean;
+ initialState?: boolean;
expanded: boolean;
status: TreeNodeStatus;
}
export enum TreePickerId {
PROJECTS = 'Projects',
SHARED_WITH_ME = 'Shared with me',
- FAVORITES = 'Favorites'
+ FAVORITES = 'Favorites',
+ PUBLIC_FAVORITES = 'Public Favorites'
}
export const createTree = <T>(): Tree<T> => ({});
)(subtree) as Tree<T>;
export const setNode = <T>(node: TreeNode<T>) => (tree: Tree<T>): Tree<T> => {
- return pipe(
- (tree: Tree<T>) => getNode(node.id)(tree) === node
- ? tree
- : { ...tree, [node.id]: node },
- addChild(node.parent, node.id)
- )(tree);
+ if (tree[node.id] && tree[node.id] === node) { return tree; }
+
+ tree[node.id] = node;
+ if (tree[node.parent]) {
+ tree[node.parent].children = Array.from(new Set([...tree[node.parent].children, node.id]));
+ }
+ return tree;
};
export const getNodeValue = (id: string) => <T>(tree: Tree<T>) => {
export const mapTreeValues = <T, R>(mapFn: (value: T) => R) => (tree: Tree<T>): Tree<R> =>
getNodeDescendantsIds('')(tree)
.map(id => getNode(id)(tree))
+ .filter(node => !!node)
.map(mapNodeValue(mapFn))
.reduce((newTree, node) => setNode(node)(newTree), createTree<R>());
toggleAncestorsSelection(id),
toggleDescendantsSelection(id))(tree)
: tree;
-
};
export const selectNode = (id: string) => <T>(tree: Tree<T>) => {
...data,
});
+export const getTreeDirty = (id: string) => <T>(tree: Tree<T>): 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) => <T>(tree: Tree<T>) => {
const node = getNode(id)(tree);
if (node) {
return tree;
};
-
const mapNodeValue = <T, R>(mapFn: (value: T) => R) => (node: TreeNode<T>): TreeNode<R> =>
({ ...node, value: mapFn(node.value) });
Object
.keys(tree)
.filter(id => getNode(id)(tree)!.parent === TREE_ROOT_ID);
-
-
-const addChild = (parentId: string, childId: string) => <T>(tree: Tree<T>): Tree<T> => {
- const node = getNode(parentId)(tree);
- if (node) {
- const children = node.children.some(id => id === childId)
- ? node.children
- : [...node.children, childId];
-
- const newNode = children === node.children
- ? node
- : { ...node, children };
-
- return setNode(newNode)(tree);
- }
- return tree;
-};