-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathgetRenderList.js
100 lines (98 loc) · 3.25 KB
/
getRenderList.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
const { fromJS, List, OrderedMap, Set } = require('immutable')
module.exports = function getRenderList({
disabledNodes = new Set(),
hiddenNodes = new Set(),
roots,
selectedNodes = new Set(),
sortedParentChildrenMap,
}) {
return roots.reduce((acc, rootNodeId) => {
return acc.concat(
getRenderListR(
{
disabledNodes,
hiddenNodes,
selectedNodes,
sortedParentChildrenMap,
},
new OrderedMap(),
rootNodeId,
0,
new List([rootNodeId])
).filter((node, nodeId) => !hiddenNodes.has(nodeId))
)
}, new List())
}
function getRenderListR(
{
disabledNodes,
hiddenNodes,
parentId,
parentIsLasts = new List(),
selectedNodes,
sortedParentChildrenMap,
},
acc,
nodeId,
i,
list
) {
const isLastChild = i === list.size - 1
parentIsLasts = parentIsLasts.push(isLastChild)
acc = acc.withMutations(mutable => {
mutable.set(
nodeId,
fromJS({
ancestors: parentId
? mutable.getIn([parentId, 'ancestors']).unshift(parentId)
: new List(),
descendents: new Set(),
descenders: parentIsLasts.shift().map((parentIsLast, _i, _list) => {
return _i === _list.size - 1 ? true : !parentIsLast
}),
disabledDescendents: new Set(),
hiddenDescendents: new Set(),
isLastChild,
nodeId,
selectedDescendents: new Set(),
})
)
if (parentId) {
mutable.updateIn([parentId, 'descendents'], set => set.add(nodeId))
if (disabledNodes.has(nodeId))
mutable.updateIn([parentId, 'disabledDescendents'], set => set.add(nodeId))
if (hiddenNodes.has(nodeId))
mutable.updateIn([parentId, 'hiddenDescendents'], set => set.add(nodeId))
if (selectedNodes.has(nodeId))
mutable.updateIn([parentId, 'selectedDescendents'], set => set.add(nodeId))
}
})
if (!sortedParentChildrenMap.get(nodeId)) return acc
acc = sortedParentChildrenMap.get(nodeId).reduce(
getRenderListR.bind(undefined, {
disabledNodes,
hiddenNodes,
parentId: nodeId,
parentIsLasts,
selectedNodes,
sortedParentChildrenMap,
}),
acc
)
return acc.withMutations(mutable => {
if (parentId) {
mutable.updateIn([parentId, 'descendents'], set =>
set.union(acc.getIn([nodeId, 'descendents']))
)
mutable.updateIn([parentId, 'disabledDescendents'], set =>
set.union(acc.getIn([nodeId, 'disabledDescendents']))
)
mutable.updateIn([parentId, 'hiddenDescendents'], set =>
set.union(acc.getIn([nodeId, 'hiddenDescendents']))
)
mutable.updateIn([parentId, 'selectedDescendents'], set =>
set.union(acc.getIn([nodeId, 'selectedDescendents']))
)
}
})
}