|
@@ -491,35 +491,52 @@ export default {
|
|
|
return true;
|
|
return true;
|
|
|
},
|
|
},
|
|
|
|
|
|
|
|
- applyFilter(nodesToFilter) {
|
|
|
|
|
- const searchText = this.filterText.toLowerCase().trim();
|
|
|
|
|
- if (!searchText) return nodesToFilter;
|
|
|
|
|
|
|
+ getMatchedAndAncestorKeys(searchText) {
|
|
|
|
|
+ const matchedKeys = new Set();
|
|
|
|
|
|
|
|
- const matchedNodeKeys = new Set();
|
|
|
|
|
- const newExpandedKeys = new Set(this.expandedKeysSet);
|
|
|
|
|
-
|
|
|
|
|
- nodesToFilter.forEach(node => {
|
|
|
|
|
|
|
+ this.flattenedNodes.forEach(node => {
|
|
|
if (node.label.toLowerCase().includes(searchText)) {
|
|
if (node.label.toLowerCase().includes(searchText)) {
|
|
|
- matchedNodeKeys.add(node.key);
|
|
|
|
|
|
|
+ matchedKeys.add(node.key);
|
|
|
|
|
+
|
|
|
|
|
+ // 向上找父节点
|
|
|
let parentKey = node.parentKey;
|
|
let parentKey = node.parentKey;
|
|
|
while (parentKey) {
|
|
while (parentKey) {
|
|
|
- const parentNode = this.nodeMap.get(parentKey);
|
|
|
|
|
- if (parentNode) {
|
|
|
|
|
- newExpandedKeys.add(parentKey);
|
|
|
|
|
- parentKey = parentNode.parentKey;
|
|
|
|
|
- } else {
|
|
|
|
|
- break;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ matchedKeys.add(parentKey);
|
|
|
|
|
+ const parent = this.nodeMap.get(parentKey);
|
|
|
|
|
+ parentKey = parent ? parent.parentKey : null;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
- const filteredResult = nodesToFilter.filter(node => {
|
|
|
|
|
- return this.hasMatchInSubtreeOrSelf(node, searchText);
|
|
|
|
|
|
|
+ return matchedKeys;
|
|
|
|
|
+ },
|
|
|
|
|
+
|
|
|
|
|
+ expandChildrenForMatchedParents(matchedKeys) {
|
|
|
|
|
+ const resultKeys = new Set(matchedKeys);
|
|
|
|
|
+
|
|
|
|
|
+ matchedKeys.forEach(key => {
|
|
|
|
|
+ const node = this.nodeMap.get(key);
|
|
|
|
|
+ if (node && !node.isLeaf) {
|
|
|
|
|
+ node.childrenKeys.forEach(childKey => {
|
|
|
|
|
+ resultKeys.add(childKey);
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
- this.expandedKeysSet = newExpandedKeys;
|
|
|
|
|
- return filteredResult;
|
|
|
|
|
|
|
+ return resultKeys;
|
|
|
|
|
+ },
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ applyFilter(nodesToFilter) {
|
|
|
|
|
+ const searchText = this.filterText.toLowerCase().trim();
|
|
|
|
|
+ if (!searchText) return nodesToFilter;
|
|
|
|
|
+
|
|
|
|
|
+ const matchedKeys = this.getMatchedAndAncestorKeys(searchText);
|
|
|
|
|
+
|
|
|
|
|
+ const displayKeys = this.expandChildrenForMatchedParents(matchedKeys);
|
|
|
|
|
+
|
|
|
|
|
+ return nodesToFilter.filter(node => displayKeys.has(node.key));
|
|
|
},
|
|
},
|
|
|
hasMatchInSubtreeOrSelf(node, searchText) {
|
|
hasMatchInSubtreeOrSelf(node, searchText) {
|
|
|
if (node.label.toLowerCase().includes(searchText)) {
|
|
if (node.label.toLowerCase().includes(searchText)) {
|