@kcuf/helper-tree 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +5 -0
- package/LICENSE +21 -0
- package/README.md +5 -0
- package/dist/cjs/helper/index.js +41 -0
- package/dist/cjs/helper/tree-build.js +52 -0
- package/dist/cjs/helper/tree-disable-mode-downward.js +25 -0
- package/dist/cjs/helper/tree-disable-mode-only.js +24 -0
- package/dist/cjs/helper/tree-disable-mode-upward.js +56 -0
- package/dist/cjs/helper/tree-disable.js +24 -0
- package/dist/cjs/helper/tree-filter.js +42 -0
- package/dist/cjs/helper/tree-flatten.js +19 -0
- package/dist/cjs/helper/tree-traverse.js +18 -0
- package/dist/cjs/index.js +16 -0
- package/dist/cjs/types/index.js +5 -0
- package/dist/esm/helper/index.js +6 -0
- package/dist/esm/helper/index.js.map +1 -0
- package/dist/esm/helper/tree-build.js +47 -0
- package/dist/esm/helper/tree-build.js.map +1 -0
- package/dist/esm/helper/tree-disable-mode-downward.js +19 -0
- package/dist/esm/helper/tree-disable-mode-downward.js.map +1 -0
- package/dist/esm/helper/tree-disable-mode-only.js +18 -0
- package/dist/esm/helper/tree-disable-mode-only.js.map +1 -0
- package/dist/esm/helper/tree-disable-mode-upward.js +50 -0
- package/dist/esm/helper/tree-disable-mode-upward.js.map +1 -0
- package/dist/esm/helper/tree-disable.js +19 -0
- package/dist/esm/helper/tree-disable.js.map +1 -0
- package/dist/esm/helper/tree-filter.js +36 -0
- package/dist/esm/helper/tree-filter.js.map +1 -0
- package/dist/esm/helper/tree-flatten.js +13 -0
- package/dist/esm/helper/tree-flatten.js.map +1 -0
- package/dist/esm/helper/tree-traverse.js +13 -0
- package/dist/esm/helper/tree-traverse.js.map +1 -0
- package/dist/esm/index.js +3 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/types/index.js +2 -0
- package/dist/esm/types/index.js.map +1 -0
- package/dist/types/helper/index.d.ts +5 -0
- package/dist/types/helper/tree-build.d.ts +5 -0
- package/dist/types/helper/tree-disable-mode-downward.d.ts +2 -0
- package/dist/types/helper/tree-disable-mode-only.d.ts +2 -0
- package/dist/types/helper/tree-disable-mode-upward.d.ts +2 -0
- package/dist/types/helper/tree-disable.d.ts +5 -0
- package/dist/types/helper/tree-filter.d.ts +7 -0
- package/dist/types/helper/tree-flatten.d.ts +2 -0
- package/dist/types/helper/tree-traverse.d.ts +2 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/types/index.d.ts +16 -0
- package/package.json +49 -0
package/CHANGELOG.md
ADDED
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2019 Alibaba Cloud
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
Object.defineProperty(exports, "treeBuild", {
|
|
8
|
+
enumerable: true,
|
|
9
|
+
get: function get() {
|
|
10
|
+
return _treeBuild.default;
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
Object.defineProperty(exports, "treeDisable", {
|
|
14
|
+
enumerable: true,
|
|
15
|
+
get: function get() {
|
|
16
|
+
return _treeDisable.default;
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(exports, "treeFilter", {
|
|
20
|
+
enumerable: true,
|
|
21
|
+
get: function get() {
|
|
22
|
+
return _treeFilter.default;
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
Object.defineProperty(exports, "treeFlatten", {
|
|
26
|
+
enumerable: true,
|
|
27
|
+
get: function get() {
|
|
28
|
+
return _treeFlatten.default;
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
Object.defineProperty(exports, "treeTraverse", {
|
|
32
|
+
enumerable: true,
|
|
33
|
+
get: function get() {
|
|
34
|
+
return _treeTraverse.default;
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
var _treeBuild = _interopRequireDefault(require("./tree-build"));
|
|
38
|
+
var _treeDisable = _interopRequireDefault(require("./tree-disable"));
|
|
39
|
+
var _treeFilter = _interopRequireDefault(require("./tree-filter"));
|
|
40
|
+
var _treeFlatten = _interopRequireDefault(require("./tree-flatten"));
|
|
41
|
+
var _treeTraverse = _interopRequireDefault(require("./tree-traverse"));
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.default = treeBuild;
|
|
8
|
+
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
|
|
9
|
+
var _treeFlatten = _interopRequireDefault(require("./tree-flatten"));
|
|
10
|
+
/**
|
|
11
|
+
* 将平铺的(已标准化 `id` 和 `parentId`)数据转成树节点列表
|
|
12
|
+
*/
|
|
13
|
+
function treeBuild(list) {
|
|
14
|
+
var nodeMap = new Map();
|
|
15
|
+
var listClone = list.map(function (v) {
|
|
16
|
+
var treeItem = (0, _objectSpread2.default)({}, v);
|
|
17
|
+
nodeMap.set(treeItem.id, treeItem);
|
|
18
|
+
return treeItem;
|
|
19
|
+
});
|
|
20
|
+
function putToParent(o) {
|
|
21
|
+
var parentNode = nodeMap.get(o.parentId);
|
|
22
|
+
if (parentNode) {
|
|
23
|
+
var _parentNode$children;
|
|
24
|
+
(_parentNode$children = parentNode.children) !== null && _parentNode$children !== void 0 ? _parentNode$children : parentNode.children = [];
|
|
25
|
+
parentNode.children.push(o);
|
|
26
|
+
} else {
|
|
27
|
+
o.parentId = ''; // wrong parent
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
listClone.forEach(function (v) {
|
|
31
|
+
if (v.parentId) {
|
|
32
|
+
putToParent(v);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
var tree = listClone.filter(function (v) {
|
|
36
|
+
return !v.parentId;
|
|
37
|
+
}); // All top-level nodes
|
|
38
|
+
|
|
39
|
+
// 若数据有自循环,则自循环的将不会在以上得到的树里
|
|
40
|
+
var flatten = (0, _treeFlatten.default)(tree);
|
|
41
|
+
if (flatten.length !== list.length) {
|
|
42
|
+
// 说明有循环,循环的会游离在树之外,需要收回来
|
|
43
|
+
list.forEach(function (v) {
|
|
44
|
+
if (!flatten.find(function (vv) {
|
|
45
|
+
return vv.id === v.id;
|
|
46
|
+
})) {
|
|
47
|
+
tree.push(v);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
return tree;
|
|
52
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.default = treeDisableModeDownward;
|
|
8
|
+
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
|
|
9
|
+
function treeDisableModeDownward(tree, disabledSet) {
|
|
10
|
+
function processNode(node, parentDisabled) {
|
|
11
|
+
var _node$children;
|
|
12
|
+
var disabled = parentDisabled || disabledSet.has(node.id);
|
|
13
|
+
var processedChildren = (_node$children = node.children) === null || _node$children === void 0 ? void 0 : _node$children.map(function (child) {
|
|
14
|
+
return processNode(child, disabled);
|
|
15
|
+
});
|
|
16
|
+
return (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, node), disabled ? {
|
|
17
|
+
disabled: true
|
|
18
|
+
} : {}), processedChildren !== null && processedChildren !== void 0 && processedChildren.length ? {
|
|
19
|
+
children: processedChildren
|
|
20
|
+
} : {});
|
|
21
|
+
}
|
|
22
|
+
return tree.map(function (node) {
|
|
23
|
+
return processNode(node, false);
|
|
24
|
+
});
|
|
25
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.default = treeDisableModeOnly;
|
|
8
|
+
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
|
|
9
|
+
function treeDisableModeOnly(tree, disabledSet) {
|
|
10
|
+
function processNode(node) {
|
|
11
|
+
var disabled = disabledSet.has(node.id);
|
|
12
|
+
var processedChildren = node.children ? node.children.map(function (child) {
|
|
13
|
+
return processNode(child);
|
|
14
|
+
}) : undefined;
|
|
15
|
+
return (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, node), disabled ? {
|
|
16
|
+
disabled: true
|
|
17
|
+
} : {}), processedChildren !== null && processedChildren !== void 0 && processedChildren.length ? {
|
|
18
|
+
children: processedChildren
|
|
19
|
+
} : {});
|
|
20
|
+
}
|
|
21
|
+
return tree.map(function (node) {
|
|
22
|
+
return processNode(node);
|
|
23
|
+
});
|
|
24
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.default = treeDisableModeUpward;
|
|
8
|
+
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
|
|
9
|
+
var _createForOfIteratorHelper2 = _interopRequireDefault(require("@babel/runtime/helpers/createForOfIteratorHelper"));
|
|
10
|
+
function treeDisableModeUpward(tree, disabledSet) {
|
|
11
|
+
// 第一步:收集所有需要向上级联禁用的节点路径
|
|
12
|
+
var upwardDisabledSet = new Set(disabledSet);
|
|
13
|
+
function collectUpwardDisabled(node) {
|
|
14
|
+
var hasDisabledChild = disabledSet.has(node.id);
|
|
15
|
+
if (node.children) {
|
|
16
|
+
var _iterator = (0, _createForOfIteratorHelper2.default)(node.children),
|
|
17
|
+
_step;
|
|
18
|
+
try {
|
|
19
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
20
|
+
var child = _step.value;
|
|
21
|
+
if (collectUpwardDisabled(child)) {
|
|
22
|
+
hasDisabledChild = true;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
} catch (err) {
|
|
26
|
+
_iterator.e(err);
|
|
27
|
+
} finally {
|
|
28
|
+
_iterator.f();
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (hasDisabledChild) {
|
|
32
|
+
upwardDisabledSet.add(node.id);
|
|
33
|
+
}
|
|
34
|
+
return hasDisabledChild;
|
|
35
|
+
}
|
|
36
|
+
tree.forEach(function (node) {
|
|
37
|
+
return collectUpwardDisabled(node);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
// 第二步:根据收集到的禁用节点集合标记树
|
|
41
|
+
function processNode(node) {
|
|
42
|
+
var _node$children;
|
|
43
|
+
var disabled = upwardDisabledSet.has(node.id);
|
|
44
|
+
var processedChildren = (_node$children = node.children) === null || _node$children === void 0 ? void 0 : _node$children.map(function (child) {
|
|
45
|
+
return processNode(child);
|
|
46
|
+
});
|
|
47
|
+
return (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, node), disabled ? {
|
|
48
|
+
disabled: true
|
|
49
|
+
} : {}), processedChildren !== null && processedChildren !== void 0 && processedChildren.length ? {
|
|
50
|
+
children: processedChildren
|
|
51
|
+
} : {});
|
|
52
|
+
}
|
|
53
|
+
return tree.map(function (node) {
|
|
54
|
+
return processNode(node);
|
|
55
|
+
});
|
|
56
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.default = treeDisable;
|
|
8
|
+
var _treeDisableModeOnly = _interopRequireDefault(require("./tree-disable-mode-only"));
|
|
9
|
+
var _treeDisableModeDownward = _interopRequireDefault(require("./tree-disable-mode-downward"));
|
|
10
|
+
var _treeDisableModeUpward = _interopRequireDefault(require("./tree-disable-mode-upward"));
|
|
11
|
+
/**
|
|
12
|
+
* 禁用树节点
|
|
13
|
+
*/
|
|
14
|
+
function treeDisable(tree, disabledIds, mode) {
|
|
15
|
+
var disabledSet = new Set(disabledIds);
|
|
16
|
+
switch (mode) {
|
|
17
|
+
case 'downward':
|
|
18
|
+
return (0, _treeDisableModeDownward.default)(tree, disabledSet);
|
|
19
|
+
case 'upward':
|
|
20
|
+
return (0, _treeDisableModeUpward.default)(tree, disabledSet);
|
|
21
|
+
default:
|
|
22
|
+
return (0, _treeDisableModeOnly.default)(tree, disabledSet);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.default = treeFilter;
|
|
8
|
+
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
|
|
9
|
+
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
|
10
|
+
var _excluded = ["children"];
|
|
11
|
+
/**
|
|
12
|
+
* 过滤树节点
|
|
13
|
+
*
|
|
14
|
+
* 策略:如果节点本身满足条件,或其任一子孙节点满足条件,则保留该节点及其满足条件的子树,以保留完整的父子路径,适用于搜索等场景
|
|
15
|
+
*/
|
|
16
|
+
function treeFilter(tree, predicate) {
|
|
17
|
+
function doFilter(node) {
|
|
18
|
+
var _node$children;
|
|
19
|
+
var matched = predicate(node);
|
|
20
|
+
// 递归过滤子节点
|
|
21
|
+
var filteredChildren = (_node$children = node.children) === null || _node$children === void 0 ? void 0 : _node$children.map(function (v) {
|
|
22
|
+
return doFilter(v);
|
|
23
|
+
}).filter(function (child) {
|
|
24
|
+
return child !== null;
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
// 如果节点本身满足条件,或者有过滤后的子节点,则保留该节点
|
|
28
|
+
if (matched || filteredChildren !== null && filteredChildren !== void 0 && filteredChildren.length) {
|
|
29
|
+
var _ = node.children,
|
|
30
|
+
nodeWithoutChildren = (0, _objectWithoutProperties2.default)(node, _excluded);
|
|
31
|
+
return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, nodeWithoutChildren), filteredChildren !== null && filteredChildren !== void 0 && filteredChildren.length ? {
|
|
32
|
+
children: filteredChildren
|
|
33
|
+
} : {});
|
|
34
|
+
}
|
|
35
|
+
return null; // 否则移除节点
|
|
36
|
+
}
|
|
37
|
+
return tree.map(function (node) {
|
|
38
|
+
return doFilter(node);
|
|
39
|
+
}).filter(function (node) {
|
|
40
|
+
return node !== null;
|
|
41
|
+
});
|
|
42
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.default = treeFlatten;
|
|
8
|
+
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
|
9
|
+
var _treeTraverse = _interopRequireDefault(require("./tree-traverse"));
|
|
10
|
+
var _excluded = ["children"];
|
|
11
|
+
function treeFlatten(tree) {
|
|
12
|
+
var result = [];
|
|
13
|
+
(0, _treeTraverse.default)(tree, function (v) {
|
|
14
|
+
var children = v.children,
|
|
15
|
+
flatNode = (0, _objectWithoutProperties2.default)(v, _excluded);
|
|
16
|
+
result.push(flatNode);
|
|
17
|
+
});
|
|
18
|
+
return result;
|
|
19
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = treeTraverse;
|
|
7
|
+
function treeTraverse(tree, callback) {
|
|
8
|
+
function traverse(nodes) {
|
|
9
|
+
nodes.forEach(function (v) {
|
|
10
|
+
var _v$children;
|
|
11
|
+
callback(v);
|
|
12
|
+
if ((_v$children = v.children) !== null && _v$children !== void 0 && _v$children.length) {
|
|
13
|
+
traverse(v.children);
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
traverse(tree);
|
|
18
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
var _helper = require("./helper");
|
|
7
|
+
Object.keys(_helper).forEach(function (key) {
|
|
8
|
+
if (key === "default" || key === "__esModule") return;
|
|
9
|
+
if (key in exports && exports[key] === _helper[key]) return;
|
|
10
|
+
Object.defineProperty(exports, key, {
|
|
11
|
+
enumerable: true,
|
|
12
|
+
get: function get() {
|
|
13
|
+
return _helper[key];
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
});
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { default as treeBuild } from './tree-build';
|
|
2
|
+
export { default as treeDisable } from './tree-disable';
|
|
3
|
+
export { default as treeFilter } from './tree-filter';
|
|
4
|
+
export { default as treeFlatten } from './tree-flatten';
|
|
5
|
+
export { default as treeTraverse } from './tree-traverse';
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["default","treeBuild","treeDisable","treeFilter","treeFlatten","treeTraverse"],"sources":["../../../src/helper/index.ts"],"sourcesContent":["export { default as treeBuild } from './tree-build';\nexport { default as treeDisable } from './tree-disable';\nexport { default as treeFilter } from './tree-filter';\nexport { default as treeFlatten } from './tree-flatten';\nexport { default as treeTraverse } from './tree-traverse';\n"],"mappings":"AAAA,SAASA,OAAO,IAAIC,SAAS,QAAQ,cAAc;AACnD,SAASD,OAAO,IAAIE,WAAW,QAAQ,gBAAgB;AACvD,SAASF,OAAO,IAAIG,UAAU,QAAQ,eAAe;AACrD,SAASH,OAAO,IAAII,WAAW,QAAQ,gBAAgB;AACvD,SAASJ,OAAO,IAAIK,YAAY,QAAQ,iBAAiB","ignoreList":[]}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import _objectSpread from "@babel/runtime/helpers/objectSpread2";
|
|
2
|
+
import treeFlatten from './tree-flatten';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* 将平铺的(已标准化 `id` 和 `parentId`)数据转成树节点列表
|
|
6
|
+
*/
|
|
7
|
+
export default function treeBuild(list) {
|
|
8
|
+
var nodeMap = new Map();
|
|
9
|
+
var listClone = list.map(function (v) {
|
|
10
|
+
var treeItem = _objectSpread({}, v);
|
|
11
|
+
nodeMap.set(treeItem.id, treeItem);
|
|
12
|
+
return treeItem;
|
|
13
|
+
});
|
|
14
|
+
function putToParent(o) {
|
|
15
|
+
var parentNode = nodeMap.get(o.parentId);
|
|
16
|
+
if (parentNode) {
|
|
17
|
+
var _parentNode$children;
|
|
18
|
+
(_parentNode$children = parentNode.children) !== null && _parentNode$children !== void 0 ? _parentNode$children : parentNode.children = [];
|
|
19
|
+
parentNode.children.push(o);
|
|
20
|
+
} else {
|
|
21
|
+
o.parentId = ''; // wrong parent
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
listClone.forEach(function (v) {
|
|
25
|
+
if (v.parentId) {
|
|
26
|
+
putToParent(v);
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
var tree = listClone.filter(function (v) {
|
|
30
|
+
return !v.parentId;
|
|
31
|
+
}); // All top-level nodes
|
|
32
|
+
|
|
33
|
+
// 若数据有自循环,则自循环的将不会在以上得到的树里
|
|
34
|
+
var flatten = treeFlatten(tree);
|
|
35
|
+
if (flatten.length !== list.length) {
|
|
36
|
+
// 说明有循环,循环的会游离在树之外,需要收回来
|
|
37
|
+
list.forEach(function (v) {
|
|
38
|
+
if (!flatten.find(function (vv) {
|
|
39
|
+
return vv.id === v.id;
|
|
40
|
+
})) {
|
|
41
|
+
tree.push(v);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
return tree;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=tree-build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree-build.js","names":["treeFlatten","treeBuild","list","nodeMap","Map","listClone","map","v","treeItem","_objectSpread","set","id","putToParent","o","parentNode","get","parentId","_parentNode$children","children","push","forEach","tree","filter","flatten","length","find","vv"],"sources":["../../../src/helper/tree-build.ts"],"sourcesContent":["import {\n ITreeItemBase,\n TTreeItem\n} from '../types';\n\nimport treeFlatten from './tree-flatten';\n\n/**\n * 将平铺的(已标准化 `id` 和 `parentId`)数据转成树节点列表\n */\nexport default function treeBuild<T extends ITreeItemBase>(list: T[]): TTreeItem<T>[] {\n const nodeMap = new Map<string, TTreeItem<T>>();\n const listClone: TTreeItem<T>[] = list.map((v: T) => {\n const treeItem: TTreeItem<T> = { // shallow clone\n ...v\n };\n \n nodeMap.set(treeItem.id, treeItem);\n \n return treeItem;\n });\n \n function putToParent(o: TTreeItem<T>): void {\n const parentNode = nodeMap.get(o.parentId);\n \n if (parentNode) {\n parentNode.children ??= [];\n parentNode.children.push(o);\n } else {\n o.parentId = ''; // wrong parent\n }\n }\n \n listClone.forEach(v => {\n if (v.parentId) {\n putToParent(v);\n }\n });\n \n const tree: TTreeItem<T>[] = listClone.filter(v => !v.parentId); // All top-level nodes\n \n // 若数据有自循环,则自循环的将不会在以上得到的树里\n const flatten = treeFlatten(tree);\n \n if (flatten.length !== list.length) { // 说明有循环,循环的会游离在树之外,需要收回来\n list.forEach(v => {\n if (!flatten.find(vv => vv.id === v.id)) {\n tree.push(v);\n }\n });\n }\n \n return tree;\n}\n"],"mappings":";AAKA,OAAOA,WAAW,MAAM,gBAAgB;;AAExC;AACA;AACA;AACA,eAAe,SAASC,SAASA,CAA0BC,IAAS,EAAkB;EACpF,IAAMC,OAAO,GAAG,IAAIC,GAAG,CAAuB,CAAC;EAC/C,IAAMC,SAAyB,GAAGH,IAAI,CAACI,GAAG,CAAC,UAACC,CAAI,EAAK;IACnD,IAAMC,QAAsB,GAAAC,aAAA,KACvBF,CAAC,CACL;IAEDJ,OAAO,CAACO,GAAG,CAACF,QAAQ,CAACG,EAAE,EAAEH,QAAQ,CAAC;IAElC,OAAOA,QAAQ;EACjB,CAAC,CAAC;EAEF,SAASI,WAAWA,CAACC,CAAe,EAAQ;IAC1C,IAAMC,UAAU,GAAGX,OAAO,CAACY,GAAG,CAACF,CAAC,CAACG,QAAQ,CAAC;IAE1C,IAAIF,UAAU,EAAE;MAAA,IAAAG,oBAAA;MACd,CAAAA,oBAAA,GAAAH,UAAU,CAACI,QAAQ,cAAAD,oBAAA,cAAAA,oBAAA,GAAnBH,UAAU,CAACI,QAAQ,GAAK,EAAE;MAC1BJ,UAAU,CAACI,QAAQ,CAACC,IAAI,CAACN,CAAC,CAAC;IAC7B,CAAC,MAAM;MACLA,CAAC,CAACG,QAAQ,GAAG,EAAE,CAAC,CAAC;IACnB;EACF;EAEAX,SAAS,CAACe,OAAO,CAAC,UAAAb,CAAC,EAAI;IACrB,IAAIA,CAAC,CAACS,QAAQ,EAAE;MACdJ,WAAW,CAACL,CAAC,CAAC;IAChB;EACF,CAAC,CAAC;EAEF,IAAMc,IAAoB,GAAGhB,SAAS,CAACiB,MAAM,CAAC,UAAAf,CAAC;IAAA,OAAI,CAACA,CAAC,CAACS,QAAQ;EAAA,EAAC,CAAC,CAAC;;EAEjE;EACA,IAAMO,OAAO,GAAGvB,WAAW,CAACqB,IAAI,CAAC;EAEjC,IAAIE,OAAO,CAACC,MAAM,KAAKtB,IAAI,CAACsB,MAAM,EAAE;IAAE;IACpCtB,IAAI,CAACkB,OAAO,CAAC,UAAAb,CAAC,EAAI;MAChB,IAAI,CAACgB,OAAO,CAACE,IAAI,CAAC,UAAAC,EAAE;QAAA,OAAIA,EAAE,CAACf,EAAE,KAAKJ,CAAC,CAACI,EAAE;MAAA,EAAC,EAAE;QACvCU,IAAI,CAACF,IAAI,CAACZ,CAAC,CAAC;MACd;IACF,CAAC,CAAC;EACJ;EAEA,OAAOc,IAAI;AACb","ignoreList":[]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import _objectSpread from "@babel/runtime/helpers/objectSpread2";
|
|
2
|
+
export default function treeDisableModeDownward(tree, disabledSet) {
|
|
3
|
+
function processNode(node, parentDisabled) {
|
|
4
|
+
var _node$children;
|
|
5
|
+
var disabled = parentDisabled || disabledSet.has(node.id);
|
|
6
|
+
var processedChildren = (_node$children = node.children) === null || _node$children === void 0 ? void 0 : _node$children.map(function (child) {
|
|
7
|
+
return processNode(child, disabled);
|
|
8
|
+
});
|
|
9
|
+
return _objectSpread(_objectSpread(_objectSpread({}, node), disabled ? {
|
|
10
|
+
disabled: true
|
|
11
|
+
} : {}), processedChildren !== null && processedChildren !== void 0 && processedChildren.length ? {
|
|
12
|
+
children: processedChildren
|
|
13
|
+
} : {});
|
|
14
|
+
}
|
|
15
|
+
return tree.map(function (node) {
|
|
16
|
+
return processNode(node, false);
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=tree-disable-mode-downward.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree-disable-mode-downward.js","names":["treeDisableModeDownward","tree","disabledSet","processNode","node","parentDisabled","_node$children","disabled","has","id","processedChildren","children","map","child","_objectSpread","length"],"sources":["../../../src/helper/tree-disable-mode-downward.ts"],"sourcesContent":["import {\n ITreeItemBase,\n TTreeItem\n} from '../types';\n\nexport default function treeDisableModeDownward<T extends ITreeItemBase>(tree: TTreeItem<T>[], disabledSet: Set<string>): TTreeItem<T>[] {\n function processNode(node: TTreeItem<T>, parentDisabled: boolean): TTreeItem<T> {\n const disabled = parentDisabled || disabledSet.has(node.id);\n const processedChildren = node.children?.map(child => processNode(child, disabled));\n \n return {\n ...node,\n ...disabled ? {\n disabled: true\n } : {},\n ...processedChildren?.length ? {\n children: processedChildren\n } : {}\n };\n }\n \n return tree.map(node => processNode(node, false));\n}\n"],"mappings":";AAKA,eAAe,SAASA,uBAAuBA,CAA0BC,IAAoB,EAAEC,WAAwB,EAAkB;EACvI,SAASC,WAAWA,CAACC,IAAkB,EAAEC,cAAuB,EAAgB;IAAA,IAAAC,cAAA;IAC9E,IAAMC,QAAQ,GAAGF,cAAc,IAAIH,WAAW,CAACM,GAAG,CAACJ,IAAI,CAACK,EAAE,CAAC;IAC3D,IAAMC,iBAAiB,IAAAJ,cAAA,GAAGF,IAAI,CAACO,QAAQ,cAAAL,cAAA,uBAAbA,cAAA,CAAeM,GAAG,CAAC,UAAAC,KAAK;MAAA,OAAIV,WAAW,CAACU,KAAK,EAAEN,QAAQ,CAAC;IAAA,EAAC;IAEnF,OAAAO,aAAA,CAAAA,aAAA,CAAAA,aAAA,KACKV,IAAI,GACJG,QAAQ,GAAG;MACZA,QAAQ,EAAE;IACZ,CAAC,GAAG,CAAC,CAAC,GACHG,iBAAiB,aAAjBA,iBAAiB,eAAjBA,iBAAiB,CAAEK,MAAM,GAAG;MAC7BJ,QAAQ,EAAED;IACZ,CAAC,GAAG,CAAC,CAAC;EAEV;EAEA,OAAOT,IAAI,CAACW,GAAG,CAAC,UAAAR,IAAI;IAAA,OAAID,WAAW,CAACC,IAAI,EAAE,KAAK,CAAC;EAAA,EAAC;AACnD","ignoreList":[]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import _objectSpread from "@babel/runtime/helpers/objectSpread2";
|
|
2
|
+
export default function treeDisableModeOnly(tree, disabledSet) {
|
|
3
|
+
function processNode(node) {
|
|
4
|
+
var disabled = disabledSet.has(node.id);
|
|
5
|
+
var processedChildren = node.children ? node.children.map(function (child) {
|
|
6
|
+
return processNode(child);
|
|
7
|
+
}) : undefined;
|
|
8
|
+
return _objectSpread(_objectSpread(_objectSpread({}, node), disabled ? {
|
|
9
|
+
disabled: true
|
|
10
|
+
} : {}), processedChildren !== null && processedChildren !== void 0 && processedChildren.length ? {
|
|
11
|
+
children: processedChildren
|
|
12
|
+
} : {});
|
|
13
|
+
}
|
|
14
|
+
return tree.map(function (node) {
|
|
15
|
+
return processNode(node);
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=tree-disable-mode-only.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree-disable-mode-only.js","names":["treeDisableModeOnly","tree","disabledSet","processNode","node","disabled","has","id","processedChildren","children","map","child","undefined","_objectSpread","length"],"sources":["../../../src/helper/tree-disable-mode-only.ts"],"sourcesContent":["import {\n ITreeItemBase,\n TTreeItem\n} from '../types';\n\nexport default function treeDisableModeOnly<T extends ITreeItemBase>(tree: TTreeItem<T>[], disabledSet: Set<string>): TTreeItem<T>[] {\n function processNode(node: TTreeItem<T>): TTreeItem<T> {\n const disabled = disabledSet.has(node.id);\n const processedChildren = node.children ? node.children.map(child => processNode(child)) : undefined;\n \n return {\n ...node,\n ...disabled ? {\n disabled: true\n } : {},\n ...processedChildren?.length ? {\n children: processedChildren\n } : {}\n };\n }\n \n return tree.map(node => processNode(node));\n}\n"],"mappings":";AAKA,eAAe,SAASA,mBAAmBA,CAA0BC,IAAoB,EAAEC,WAAwB,EAAkB;EACnI,SAASC,WAAWA,CAACC,IAAkB,EAAgB;IACrD,IAAMC,QAAQ,GAAGH,WAAW,CAACI,GAAG,CAACF,IAAI,CAACG,EAAE,CAAC;IACzC,IAAMC,iBAAiB,GAAGJ,IAAI,CAACK,QAAQ,GAAGL,IAAI,CAACK,QAAQ,CAACC,GAAG,CAAC,UAAAC,KAAK;MAAA,OAAIR,WAAW,CAACQ,KAAK,CAAC;IAAA,EAAC,GAAGC,SAAS;IAEpG,OAAAC,aAAA,CAAAA,aAAA,CAAAA,aAAA,KACKT,IAAI,GACJC,QAAQ,GAAG;MACZA,QAAQ,EAAE;IACZ,CAAC,GAAG,CAAC,CAAC,GACHG,iBAAiB,aAAjBA,iBAAiB,eAAjBA,iBAAiB,CAAEM,MAAM,GAAG;MAC7BL,QAAQ,EAAED;IACZ,CAAC,GAAG,CAAC,CAAC;EAEV;EAEA,OAAOP,IAAI,CAACS,GAAG,CAAC,UAAAN,IAAI;IAAA,OAAID,WAAW,CAACC,IAAI,CAAC;EAAA,EAAC;AAC5C","ignoreList":[]}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import _objectSpread from "@babel/runtime/helpers/objectSpread2";
|
|
2
|
+
import _createForOfIteratorHelper from "@babel/runtime/helpers/createForOfIteratorHelper";
|
|
3
|
+
export default function treeDisableModeUpward(tree, disabledSet) {
|
|
4
|
+
// 第一步:收集所有需要向上级联禁用的节点路径
|
|
5
|
+
var upwardDisabledSet = new Set(disabledSet);
|
|
6
|
+
function collectUpwardDisabled(node) {
|
|
7
|
+
var hasDisabledChild = disabledSet.has(node.id);
|
|
8
|
+
if (node.children) {
|
|
9
|
+
var _iterator = _createForOfIteratorHelper(node.children),
|
|
10
|
+
_step;
|
|
11
|
+
try {
|
|
12
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
13
|
+
var child = _step.value;
|
|
14
|
+
if (collectUpwardDisabled(child)) {
|
|
15
|
+
hasDisabledChild = true;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
} catch (err) {
|
|
19
|
+
_iterator.e(err);
|
|
20
|
+
} finally {
|
|
21
|
+
_iterator.f();
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
if (hasDisabledChild) {
|
|
25
|
+
upwardDisabledSet.add(node.id);
|
|
26
|
+
}
|
|
27
|
+
return hasDisabledChild;
|
|
28
|
+
}
|
|
29
|
+
tree.forEach(function (node) {
|
|
30
|
+
return collectUpwardDisabled(node);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
// 第二步:根据收集到的禁用节点集合标记树
|
|
34
|
+
function processNode(node) {
|
|
35
|
+
var _node$children;
|
|
36
|
+
var disabled = upwardDisabledSet.has(node.id);
|
|
37
|
+
var processedChildren = (_node$children = node.children) === null || _node$children === void 0 ? void 0 : _node$children.map(function (child) {
|
|
38
|
+
return processNode(child);
|
|
39
|
+
});
|
|
40
|
+
return _objectSpread(_objectSpread(_objectSpread({}, node), disabled ? {
|
|
41
|
+
disabled: true
|
|
42
|
+
} : {}), processedChildren !== null && processedChildren !== void 0 && processedChildren.length ? {
|
|
43
|
+
children: processedChildren
|
|
44
|
+
} : {});
|
|
45
|
+
}
|
|
46
|
+
return tree.map(function (node) {
|
|
47
|
+
return processNode(node);
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=tree-disable-mode-upward.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree-disable-mode-upward.js","names":["treeDisableModeUpward","tree","disabledSet","upwardDisabledSet","Set","collectUpwardDisabled","node","hasDisabledChild","has","id","children","_iterator","_createForOfIteratorHelper","_step","s","n","done","child","value","err","e","f","add","forEach","processNode","_node$children","disabled","processedChildren","map","_objectSpread","length"],"sources":["../../../src/helper/tree-disable-mode-upward.ts"],"sourcesContent":["import {\n ITreeItemBase,\n TTreeItem\n} from '../types';\n\nexport default function treeDisableModeUpward<T extends ITreeItemBase>(tree: TTreeItem<T>[], disabledSet: Set<string>): TTreeItem<T>[] {\n // 第一步:收集所有需要向上级联禁用的节点路径\n const upwardDisabledSet = new Set(disabledSet);\n \n function collectUpwardDisabled(node: TTreeItem<T>): boolean {\n let hasDisabledChild = disabledSet.has(node.id);\n \n if (node.children) {\n for (const child of node.children) {\n if (collectUpwardDisabled(child)) {\n hasDisabledChild = true;\n }\n }\n }\n \n if (hasDisabledChild) {\n upwardDisabledSet.add(node.id);\n }\n \n return hasDisabledChild;\n }\n \n tree.forEach(node => collectUpwardDisabled(node));\n \n // 第二步:根据收集到的禁用节点集合标记树\n function processNode(node: TTreeItem<T>): TTreeItem<T> {\n const disabled = upwardDisabledSet.has(node.id);\n const processedChildren = node.children?.map(child => processNode(child));\n \n return {\n ...node,\n ...disabled ? {\n disabled: true\n } : {},\n ...processedChildren?.length ? {\n children: processedChildren\n } : {}\n };\n }\n \n return tree.map(node => processNode(node));\n}\n"],"mappings":";;AAKA,eAAe,SAASA,qBAAqBA,CAA0BC,IAAoB,EAAEC,WAAwB,EAAkB;EACrI;EACA,IAAMC,iBAAiB,GAAG,IAAIC,GAAG,CAACF,WAAW,CAAC;EAE9C,SAASG,qBAAqBA,CAACC,IAAkB,EAAW;IAC1D,IAAIC,gBAAgB,GAAGL,WAAW,CAACM,GAAG,CAACF,IAAI,CAACG,EAAE,CAAC;IAE/C,IAAIH,IAAI,CAACI,QAAQ,EAAE;MAAA,IAAAC,SAAA,GAAAC,0BAAA,CACGN,IAAI,CAACI,QAAQ;QAAAG,KAAA;MAAA;QAAjC,KAAAF,SAAA,CAAAG,CAAA,MAAAD,KAAA,GAAAF,SAAA,CAAAI,CAAA,IAAAC,IAAA,GAAmC;UAAA,IAAxBC,KAAK,GAAAJ,KAAA,CAAAK,KAAA;UACd,IAAIb,qBAAqB,CAACY,KAAK,CAAC,EAAE;YAChCV,gBAAgB,GAAG,IAAI;UACzB;QACF;MAAC,SAAAY,GAAA;QAAAR,SAAA,CAAAS,CAAA,CAAAD,GAAA;MAAA;QAAAR,SAAA,CAAAU,CAAA;MAAA;IACH;IAEA,IAAId,gBAAgB,EAAE;MACpBJ,iBAAiB,CAACmB,GAAG,CAAChB,IAAI,CAACG,EAAE,CAAC;IAChC;IAEA,OAAOF,gBAAgB;EACzB;EAEAN,IAAI,CAACsB,OAAO,CAAC,UAAAjB,IAAI;IAAA,OAAID,qBAAqB,CAACC,IAAI,CAAC;EAAA,EAAC;;EAEjD;EACA,SAASkB,WAAWA,CAAClB,IAAkB,EAAgB;IAAA,IAAAmB,cAAA;IACrD,IAAMC,QAAQ,GAAGvB,iBAAiB,CAACK,GAAG,CAACF,IAAI,CAACG,EAAE,CAAC;IAC/C,IAAMkB,iBAAiB,IAAAF,cAAA,GAAGnB,IAAI,CAACI,QAAQ,cAAAe,cAAA,uBAAbA,cAAA,CAAeG,GAAG,CAAC,UAAAX,KAAK;MAAA,OAAIO,WAAW,CAACP,KAAK,CAAC;IAAA,EAAC;IAEzE,OAAAY,aAAA,CAAAA,aAAA,CAAAA,aAAA,KACKvB,IAAI,GACJoB,QAAQ,GAAG;MACZA,QAAQ,EAAE;IACZ,CAAC,GAAG,CAAC,CAAC,GACHC,iBAAiB,aAAjBA,iBAAiB,eAAjBA,iBAAiB,CAAEG,MAAM,GAAG;MAC7BpB,QAAQ,EAAEiB;IACZ,CAAC,GAAG,CAAC,CAAC;EAEV;EAEA,OAAO1B,IAAI,CAAC2B,GAAG,CAAC,UAAAtB,IAAI;IAAA,OAAIkB,WAAW,CAAClB,IAAI,CAAC;EAAA,EAAC;AAC5C","ignoreList":[]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import treeDisableModeOnly from './tree-disable-mode-only';
|
|
2
|
+
import treeDisableModeDownward from './tree-disable-mode-downward';
|
|
3
|
+
import treeDisableModeUpward from './tree-disable-mode-upward';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* 禁用树节点
|
|
7
|
+
*/
|
|
8
|
+
export default function treeDisable(tree, disabledIds, mode) {
|
|
9
|
+
var disabledSet = new Set(disabledIds);
|
|
10
|
+
switch (mode) {
|
|
11
|
+
case 'downward':
|
|
12
|
+
return treeDisableModeDownward(tree, disabledSet);
|
|
13
|
+
case 'upward':
|
|
14
|
+
return treeDisableModeUpward(tree, disabledSet);
|
|
15
|
+
default:
|
|
16
|
+
return treeDisableModeOnly(tree, disabledSet);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=tree-disable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree-disable.js","names":["treeDisableModeOnly","treeDisableModeDownward","treeDisableModeUpward","treeDisable","tree","disabledIds","mode","disabledSet","Set"],"sources":["../../../src/helper/tree-disable.ts"],"sourcesContent":["import {\n ITreeItemBase,\n TTreeItem,\n TTreeDisableMode\n} from '../types';\n\nimport treeDisableModeOnly from './tree-disable-mode-only';\nimport treeDisableModeDownward from './tree-disable-mode-downward';\nimport treeDisableModeUpward from './tree-disable-mode-upward';\n\n/**\n * 禁用树节点\n */\nexport default function treeDisable<T extends ITreeItemBase>(tree: TTreeItem<T>[], disabledIds: string[], mode?: TTreeDisableMode): TTreeItem<T>[] {\n const disabledSet = new Set(disabledIds);\n \n switch (mode) {\n case 'downward':\n return treeDisableModeDownward(tree, disabledSet);\n case 'upward':\n return treeDisableModeUpward(tree, disabledSet);\n default:\n return treeDisableModeOnly(tree, disabledSet);\n }\n}\n"],"mappings":"AAMA,OAAOA,mBAAmB,MAAM,0BAA0B;AAC1D,OAAOC,uBAAuB,MAAM,8BAA8B;AAClE,OAAOC,qBAAqB,MAAM,4BAA4B;;AAE9D;AACA;AACA;AACA,eAAe,SAASC,WAAWA,CAA0BC,IAAoB,EAAEC,WAAqB,EAAEC,IAAuB,EAAkB;EACjJ,IAAMC,WAAW,GAAG,IAAIC,GAAG,CAACH,WAAW,CAAC;EAExC,QAAQC,IAAI;IACZ,KAAK,UAAU;MACb,OAAOL,uBAAuB,CAACG,IAAI,EAAEG,WAAW,CAAC;IACnD,KAAK,QAAQ;MACX,OAAOL,qBAAqB,CAACE,IAAI,EAAEG,WAAW,CAAC;IACjD;MACE,OAAOP,mBAAmB,CAACI,IAAI,EAAEG,WAAW,CAAC;EAC/C;AACF","ignoreList":[]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import _objectSpread from "@babel/runtime/helpers/objectSpread2";
|
|
2
|
+
import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
|
|
3
|
+
var _excluded = ["children"];
|
|
4
|
+
/**
|
|
5
|
+
* 过滤树节点
|
|
6
|
+
*
|
|
7
|
+
* 策略:如果节点本身满足条件,或其任一子孙节点满足条件,则保留该节点及其满足条件的子树,以保留完整的父子路径,适用于搜索等场景
|
|
8
|
+
*/
|
|
9
|
+
export default function treeFilter(tree, predicate) {
|
|
10
|
+
function doFilter(node) {
|
|
11
|
+
var _node$children;
|
|
12
|
+
var matched = predicate(node);
|
|
13
|
+
// 递归过滤子节点
|
|
14
|
+
var filteredChildren = (_node$children = node.children) === null || _node$children === void 0 ? void 0 : _node$children.map(function (v) {
|
|
15
|
+
return doFilter(v);
|
|
16
|
+
}).filter(function (child) {
|
|
17
|
+
return child !== null;
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
// 如果节点本身满足条件,或者有过滤后的子节点,则保留该节点
|
|
21
|
+
if (matched || filteredChildren !== null && filteredChildren !== void 0 && filteredChildren.length) {
|
|
22
|
+
var _ = node.children,
|
|
23
|
+
nodeWithoutChildren = _objectWithoutProperties(node, _excluded);
|
|
24
|
+
return _objectSpread(_objectSpread({}, nodeWithoutChildren), filteredChildren !== null && filteredChildren !== void 0 && filteredChildren.length ? {
|
|
25
|
+
children: filteredChildren
|
|
26
|
+
} : {});
|
|
27
|
+
}
|
|
28
|
+
return null; // 否则移除节点
|
|
29
|
+
}
|
|
30
|
+
return tree.map(function (node) {
|
|
31
|
+
return doFilter(node);
|
|
32
|
+
}).filter(function (node) {
|
|
33
|
+
return node !== null;
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=tree-filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree-filter.js","names":["treeFilter","tree","predicate","doFilter","node","_node$children","matched","filteredChildren","children","map","v","filter","child","length","_","nodeWithoutChildren","_objectWithoutProperties","_excluded","_objectSpread"],"sources":["../../../src/helper/tree-filter.ts"],"sourcesContent":["import {\n ITreeItemBase,\n TTreeItem\n} from '../types';\n\n/**\n * 过滤树节点\n *\n * 策略:如果节点本身满足条件,或其任一子孙节点满足条件,则保留该节点及其满足条件的子树,以保留完整的父子路径,适用于搜索等场景\n */\nexport default function treeFilter<T extends ITreeItemBase>(tree: TTreeItem<T>[], predicate: (node: T) => boolean): TTreeItem<T>[] {\n function doFilter(node: TTreeItem<T>): TTreeItem<T> | null {\n const matched = predicate(node);\n // 递归过滤子节点\n const filteredChildren = node.children?.map(v => doFilter(v)).filter((child): child is TTreeItem<T> => child !== null);\n \n // 如果节点本身满足条件,或者有过滤后的子节点,则保留该节点\n if (matched || filteredChildren?.length) {\n const {\n children: _,\n ...nodeWithoutChildren\n } = node;\n \n return {\n ...nodeWithoutChildren as T,\n ...filteredChildren?.length ? {\n children: filteredChildren\n } : {}\n };\n }\n \n return null; // 否则移除节点\n }\n \n return tree.map(node => doFilter(node)).filter((node): node is TTreeItem<T> => node !== null);\n}\n"],"mappings":";;;AAKA;AACA;AACA;AACA;AACA;AACA,eAAe,SAASA,UAAUA,CAA0BC,IAAoB,EAAEC,SAA+B,EAAkB;EACjI,SAASC,QAAQA,CAACC,IAAkB,EAAuB;IAAA,IAAAC,cAAA;IACzD,IAAMC,OAAO,GAAGJ,SAAS,CAACE,IAAI,CAAC;IAC/B;IACA,IAAMG,gBAAgB,IAAAF,cAAA,GAAGD,IAAI,CAACI,QAAQ,cAAAH,cAAA,uBAAbA,cAAA,CAAeI,GAAG,CAAC,UAAAC,CAAC;MAAA,OAAIP,QAAQ,CAACO,CAAC,CAAC;IAAA,EAAC,CAACC,MAAM,CAAC,UAACC,KAAK;MAAA,OAA4BA,KAAK,KAAK,IAAI;IAAA,EAAC;;IAEtH;IACA,IAAIN,OAAO,IAAIC,gBAAgB,aAAhBA,gBAAgB,eAAhBA,gBAAgB,CAAEM,MAAM,EAAE;MACvC,IACYC,CAAC,GAETV,IAAI,CAFNI,QAAQ;QACLO,mBAAmB,GAAAC,wBAAA,CACpBZ,IAAI,EAAAa,SAAA;MAER,OAAAC,aAAA,CAAAA,aAAA,KACKH,mBAAmB,GACnBR,gBAAgB,aAAhBA,gBAAgB,eAAhBA,gBAAgB,CAAEM,MAAM,GAAG;QAC5BL,QAAQ,EAAED;MACZ,CAAC,GAAG,CAAC,CAAC;IAEV;IAEA,OAAO,IAAI,CAAC,CAAC;EACf;EAEA,OAAON,IAAI,CAACQ,GAAG,CAAC,UAAAL,IAAI;IAAA,OAAID,QAAQ,CAACC,IAAI,CAAC;EAAA,EAAC,CAACO,MAAM,CAAC,UAACP,IAAI;IAAA,OAA2BA,IAAI,KAAK,IAAI;EAAA,EAAC;AAC/F","ignoreList":[]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
|
|
2
|
+
var _excluded = ["children"];
|
|
3
|
+
import treeTraverse from './tree-traverse';
|
|
4
|
+
export default function treeFlatten(tree) {
|
|
5
|
+
var result = [];
|
|
6
|
+
treeTraverse(tree, function (v) {
|
|
7
|
+
var children = v.children,
|
|
8
|
+
flatNode = _objectWithoutProperties(v, _excluded);
|
|
9
|
+
result.push(flatNode);
|
|
10
|
+
});
|
|
11
|
+
return result;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=tree-flatten.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree-flatten.js","names":["treeTraverse","treeFlatten","tree","result","v","children","flatNode","_objectWithoutProperties","_excluded","push"],"sources":["../../../src/helper/tree-flatten.ts"],"sourcesContent":["import {\n ITreeItemBase,\n TTreeItem\n} from '../types';\n\nimport treeTraverse from './tree-traverse';\n\nexport default function treeFlatten<T extends ITreeItemBase>(tree: TTreeItem<T>[]): T[] {\n const result: T[] = [];\n \n treeTraverse(tree, v => {\n const {\n children, // 剔除\n ...flatNode\n } = v;\n \n result.push(flatNode as T);\n });\n \n return result;\n}\n"],"mappings":";;AAKA,OAAOA,YAAY,MAAM,iBAAiB;AAE1C,eAAe,SAASC,WAAWA,CAA0BC,IAAoB,EAAO;EACtF,IAAMC,MAAW,GAAG,EAAE;EAEtBH,YAAY,CAACE,IAAI,EAAE,UAAAE,CAAC,EAAI;IACtB,IACEC,QAAQ,GAEND,CAAC,CAFHC,QAAQ;MACLC,QAAQ,GAAAC,wBAAA,CACTH,CAAC,EAAAI,SAAA;IAELL,MAAM,CAACM,IAAI,CAACH,QAAa,CAAC;EAC5B,CAAC,CAAC;EAEF,OAAOH,MAAM;AACf","ignoreList":[]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export default function treeTraverse(tree, callback) {
|
|
2
|
+
function traverse(nodes) {
|
|
3
|
+
nodes.forEach(function (v) {
|
|
4
|
+
var _v$children;
|
|
5
|
+
callback(v);
|
|
6
|
+
if ((_v$children = v.children) !== null && _v$children !== void 0 && _v$children.length) {
|
|
7
|
+
traverse(v.children);
|
|
8
|
+
}
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
traverse(tree);
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=tree-traverse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree-traverse.js","names":["treeTraverse","tree","callback","traverse","nodes","forEach","v","_v$children","children","length"],"sources":["../../../src/helper/tree-traverse.ts"],"sourcesContent":["import {\n ITreeItemBase,\n TTreeItem\n} from '../types';\n\nexport default function treeTraverse<T extends ITreeItemBase>(tree: TTreeItem<T>[], callback: (o: TTreeItem<T>) => void): void {\n function traverse(nodes: TTreeItem<T>[]): void {\n nodes.forEach(v => {\n callback(v);\n \n if (v.children?.length) {\n traverse(v.children);\n }\n });\n }\n \n traverse(tree);\n}\n"],"mappings":"AAKA,eAAe,SAASA,YAAYA,CAA0BC,IAAoB,EAAEC,QAAmC,EAAQ;EAC7H,SAASC,QAAQA,CAACC,KAAqB,EAAQ;IAC7CA,KAAK,CAACC,OAAO,CAAC,UAAAC,CAAC,EAAI;MAAA,IAAAC,WAAA;MACjBL,QAAQ,CAACI,CAAC,CAAC;MAEX,KAAAC,WAAA,GAAID,CAAC,CAACE,QAAQ,cAAAD,WAAA,eAAVA,WAAA,CAAYE,MAAM,EAAE;QACtBN,QAAQ,CAACG,CAAC,CAACE,QAAQ,CAAC;MACtB;IACF,CAAC,CAAC;EACJ;EAEAL,QAAQ,CAACF,IAAI,CAAC;AAChB","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/index.ts"],"sourcesContent":["export * from './helper';\n\nexport type {\n ITreeItemBase as TreeItemBase,\n TTreeItem as TreeItem,\n TTreeDisableMode as TreeDisableMode\n} from './types';\n"],"mappings":"AAAA,cAAc,UAAU;AAAC","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/types/index.ts"],"sourcesContent":["export interface ITreeItemBase {\n id: string;\n parentId: string;\n}\n\nexport type TTreeItem<T extends ITreeItemBase> = T & {\n disabled?: boolean;\n children?: TTreeItem<T>[];\n};\n\n/**\n * 禁用树节点的模式\n *\n * - only - 仅禁用指定的节点\n * - downward - 向下级联,父节点被禁用,其所有子孙节点也自动标记\n * - upward - 向上级联,当所有子节点被禁用,其所有祖先节点也自动标记\n */\nexport type TTreeDisableMode = 'only' | 'downward' | 'upward';\n"],"mappings":"","ignoreList":[]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { default as treeBuild } from './tree-build';
|
|
2
|
+
export { default as treeDisable } from './tree-disable';
|
|
3
|
+
export { default as treeFilter } from './tree-filter';
|
|
4
|
+
export { default as treeFlatten } from './tree-flatten';
|
|
5
|
+
export { default as treeTraverse } from './tree-traverse';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ITreeItemBase, TTreeItem } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* 过滤树节点
|
|
4
|
+
*
|
|
5
|
+
* 策略:如果节点本身满足条件,或其任一子孙节点满足条件,则保留该节点及其满足条件的子树,以保留完整的父子路径,适用于搜索等场景
|
|
6
|
+
*/
|
|
7
|
+
export default function treeFilter<T extends ITreeItemBase>(tree: TTreeItem<T>[], predicate: (node: T) => boolean): TTreeItem<T>[];
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface ITreeItemBase {
|
|
2
|
+
id: string;
|
|
3
|
+
parentId: string;
|
|
4
|
+
}
|
|
5
|
+
export type TTreeItem<T extends ITreeItemBase> = T & {
|
|
6
|
+
disabled?: boolean;
|
|
7
|
+
children?: TTreeItem<T>[];
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* 禁用树节点的模式
|
|
11
|
+
*
|
|
12
|
+
* - only - 仅禁用指定的节点
|
|
13
|
+
* - downward - 向下级联,父节点被禁用,其所有子孙节点也自动标记
|
|
14
|
+
* - upward - 向上级联,当所有子节点被禁用,其所有祖先节点也自动标记
|
|
15
|
+
*/
|
|
16
|
+
export type TTreeDisableMode = 'only' | 'downward' | 'upward';
|
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@kcuf/helper-tree",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Tree data helper.",
|
|
5
|
+
"keywords": [],
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"sideEffects": false,
|
|
8
|
+
"main": "dist/cjs/index.js",
|
|
9
|
+
"module": "dist/esm/index.js",
|
|
10
|
+
"types": "dist/types/index.d.ts",
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "git+https://github.com/justnewbee/kcuf.git"
|
|
14
|
+
},
|
|
15
|
+
"homepage": "https://github.com/justnewbee/kcuf/tree/main/packages-helper/helper-tree",
|
|
16
|
+
"bugs": "https://github.com/justnewbee/kcuf/issues",
|
|
17
|
+
"author": {
|
|
18
|
+
"name": "Jianchun Wang",
|
|
19
|
+
"email": "justnewbee@gmail.com"
|
|
20
|
+
},
|
|
21
|
+
"publishConfig": {
|
|
22
|
+
"access": "public"
|
|
23
|
+
},
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"@babel/cli": "^7.28.3",
|
|
26
|
+
"@babel/core": "^7.28.5",
|
|
27
|
+
"@babel/plugin-transform-runtime": "^7.28.5",
|
|
28
|
+
"@babel/preset-env": "^7.28.5",
|
|
29
|
+
"@babel/preset-typescript": "^7.28.5",
|
|
30
|
+
"@vitest/coverage-v8": "^4.0.16",
|
|
31
|
+
"rimraf": "^6.1.2",
|
|
32
|
+
"typescript": "^5.9.3",
|
|
33
|
+
"vitest": "^4.0.16",
|
|
34
|
+
"@kcuf/ts-config": "^0.1.0"
|
|
35
|
+
},
|
|
36
|
+
"peerDependencies": {
|
|
37
|
+
"@babel/runtime": ">=7.0.0"
|
|
38
|
+
},
|
|
39
|
+
"scripts": {
|
|
40
|
+
"build:clean": "rimraf dist",
|
|
41
|
+
"build:esm": "ESM=1 babel src -d dist/esm --extensions .ts,.tsx --source-maps",
|
|
42
|
+
"build:cjs": "ESM=0 babel src -d dist/cjs --extensions .ts,.tsx",
|
|
43
|
+
"build:types": "tsc -rootDir src --outDir dist/types --declaration --noEmit false --emitDeclarationOnly --isolatedModules false",
|
|
44
|
+
"build": "pnpm build:esm && pnpm build:cjs && pnpm build:types",
|
|
45
|
+
"watch": "pnpm build:esm -w",
|
|
46
|
+
"test": "vitest",
|
|
47
|
+
"test:cov": "vitest --coverage --coverage.include=src"
|
|
48
|
+
}
|
|
49
|
+
}
|