@hi-ui/check-cascader 4.0.0-beta.7 → 4.0.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/lib/cjs/CheckCascader.js +66 -67
- package/lib/cjs/CheckCascaderMenu.js +14 -13
- package/lib/cjs/{CheckCascaderMenus.js → CheckCascaderMenuList.js} +19 -25
- package/lib/cjs/context.js +1 -2
- package/lib/cjs/hooks/use-async-switch.js +5 -6
- package/lib/cjs/hooks/{use-cache.js → use-cache/lib/esm/index.js} +12 -6
- package/lib/cjs/hooks/use-check.js +16 -7
- package/lib/cjs/hooks/use-select.js +1 -2
- package/lib/cjs/icons/index.js +4 -5
- package/lib/cjs/index.js +1 -2
- package/lib/cjs/styles/index.scss.js +3 -4
- package/lib/cjs/utils/index.js +177 -68
- package/lib/esm/CheckCascader.js +54 -52
- package/lib/esm/CheckCascaderMenu.js +4 -4
- package/lib/esm/{CheckCascaderMenus.js → CheckCascaderMenuList.js} +16 -22
- package/lib/esm/context.js +1 -2
- package/lib/esm/hooks/use-async-switch.js +1 -2
- package/lib/esm/hooks/{use-cache.js → use-cache/lib/esm/index.js} +12 -6
- package/lib/esm/hooks/use-check.js +15 -7
- package/lib/esm/hooks/use-select.js +1 -2
- package/lib/esm/icons/index.js +1 -2
- package/lib/esm/index.js +1 -2
- package/lib/esm/styles/index.scss.js +4 -6
- package/lib/esm/utils/index.js +175 -70
- package/lib/types/CheckCascader.d.ts +14 -12
- package/lib/types/CheckCascaderMenu.d.ts +4 -4
- package/lib/types/{CheckCascaderMenus.d.ts → CheckCascaderMenuList.d.ts} +18 -10
- package/lib/types/context.d.ts +4 -4
- package/lib/types/hooks/index.d.ts +0 -2
- package/lib/types/hooks/use-async-switch.d.ts +2 -2
- package/lib/types/hooks/use-check.d.ts +2 -2
- package/lib/types/index.d.ts +1 -0
- package/lib/types/types.d.ts +13 -22
- package/lib/types/utils/index.d.ts +17 -10
- package/package.json +29 -27
- package/lib/cjs/CheckCascader.js.map +0 -1
- package/lib/cjs/CheckCascaderMenu.js.map +0 -1
- package/lib/cjs/CheckCascaderMenus.js.map +0 -1
- package/lib/cjs/context.js.map +0 -1
- package/lib/cjs/hooks/use-async-switch.js.map +0 -1
- package/lib/cjs/hooks/use-cache.js.map +0 -1
- package/lib/cjs/hooks/use-check.js.map +0 -1
- package/lib/cjs/hooks/use-search.js +0 -40
- package/lib/cjs/hooks/use-search.js.map +0 -1
- package/lib/cjs/hooks/use-select.js.map +0 -1
- package/lib/cjs/icons/index.js.map +0 -1
- package/lib/cjs/index.js.map +0 -1
- package/lib/cjs/styles/index.scss.js.map +0 -1
- package/lib/cjs/utils/index.js.map +0 -1
- package/lib/esm/CheckCascader.js.map +0 -1
- package/lib/esm/CheckCascaderMenu.js.map +0 -1
- package/lib/esm/CheckCascaderMenus.js.map +0 -1
- package/lib/esm/context.js.map +0 -1
- package/lib/esm/hooks/use-async-switch.js.map +0 -1
- package/lib/esm/hooks/use-cache.js.map +0 -1
- package/lib/esm/hooks/use-check.js.map +0 -1
- package/lib/esm/hooks/use-search.js +0 -31
- package/lib/esm/hooks/use-search.js.map +0 -1
- package/lib/esm/hooks/use-select.js.map +0 -1
- package/lib/esm/icons/index.js.map +0 -1
- package/lib/esm/index.js.map +0 -1
- package/lib/esm/styles/index.scss.js.map +0 -1
- package/lib/esm/utils/index.js.map +0 -1
- package/lib/types/hooks/use-cache.d.ts +0 -8
- package/lib/types/hooks/use-search.d.ts +0 -13
package/lib/esm/context.js
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
* @hi-ui/check-cascader
|
3
3
|
* https://github.com/XiaoMi/hiui/tree/master/packages/ui/check-cascader#readme
|
4
4
|
*
|
5
|
-
* Copyright (c)
|
5
|
+
* Copyright (c) HiUI <mi-hiui@xiaomi.com>.
|
6
6
|
*
|
7
7
|
* This source code is licensed under the MIT license found in the
|
8
8
|
* LICENSE file in the root directory of this source tree.
|
@@ -22,4 +22,3 @@ var useCheckCascaderContext = function useCheckCascaderContext() {
|
|
22
22
|
};
|
23
23
|
|
24
24
|
export { CheckCascaderProvider, useCheckCascaderContext };
|
25
|
-
//# sourceMappingURL=context.js.map
|
@@ -2,7 +2,7 @@
|
|
2
2
|
* @hi-ui/check-cascader
|
3
3
|
* https://github.com/XiaoMi/hiui/tree/master/packages/ui/check-cascader#readme
|
4
4
|
*
|
5
|
-
* Copyright (c)
|
5
|
+
* Copyright (c) HiUI <mi-hiui@xiaomi.com>.
|
6
6
|
*
|
7
7
|
* This source code is licensed under the MIT license found in the
|
8
8
|
* LICENSE file in the root directory of this source tree.
|
@@ -148,4 +148,3 @@ var useList = function useList(initialValue) {
|
|
148
148
|
};
|
149
149
|
|
150
150
|
export { useAsyncSwitch };
|
151
|
-
//# sourceMappingURL=use-async-switch.js.map
|
@@ -2,17 +2,24 @@
|
|
2
2
|
* @hi-ui/check-cascader
|
3
3
|
* https://github.com/XiaoMi/hiui/tree/master/packages/ui/check-cascader#readme
|
4
4
|
*
|
5
|
-
* Copyright (c)
|
5
|
+
* Copyright (c) HiUI <mi-hiui@xiaomi.com>.
|
6
6
|
*
|
7
7
|
* This source code is licensed under the MIT license found in the
|
8
8
|
* LICENSE file in the root directory of this source tree.
|
9
9
|
*/
|
10
10
|
import { useState, useEffect } from 'react';
|
11
|
-
/**
|
12
|
-
*
|
11
|
+
/** @LICENSE
|
12
|
+
* @hi-ui/use-cache
|
13
|
+
* https://github.com/XiaoMi/hiui/tree/master/packages/hooks/use-cache#readme
|
13
14
|
*
|
14
|
-
* @
|
15
|
-
*
|
15
|
+
* Copyright (c) HiUI <mi-hiui@xiaomi.com>.
|
16
|
+
*
|
17
|
+
* This source code is licensed under the MIT license found in the
|
18
|
+
* LICENSE file in the root directory of this source tree.
|
19
|
+
*/
|
20
|
+
|
21
|
+
/**
|
22
|
+
* A hook using for data cache that compatible with the controlled and uncontrolled modes coexist.
|
16
23
|
*/
|
17
24
|
|
18
25
|
var useCache = function useCache(data) {
|
@@ -27,4 +34,3 @@ var useCache = function useCache(data) {
|
|
27
34
|
};
|
28
35
|
|
29
36
|
export { useCache };
|
30
|
-
//# sourceMappingURL=use-cache.js.map
|
@@ -2,35 +2,44 @@
|
|
2
2
|
* @hi-ui/check-cascader
|
3
3
|
* https://github.com/XiaoMi/hiui/tree/master/packages/ui/check-cascader#readme
|
4
4
|
*
|
5
|
-
* Copyright (c)
|
5
|
+
* Copyright (c) HiUI <mi-hiui@xiaomi.com>.
|
6
6
|
*
|
7
7
|
* This source code is licensed under the MIT license found in the
|
8
8
|
* LICENSE file in the root directory of this source tree.
|
9
9
|
*/
|
10
|
-
import { useCascadeCheck } from '@hi-ui/use-check';
|
11
10
|
import { useUncontrolledState } from '@hi-ui/use-uncontrolled-state';
|
11
|
+
import { useCascadeCheck } from '@hi-ui/use-check';
|
12
|
+
import { processCheckedIds, parseCheckDataDirty } from '../utils/index.js';
|
12
13
|
var NOOP_ARRAY = [];
|
13
14
|
|
14
|
-
var useCheck = function useCheck(
|
15
|
+
var useCheck = function useCheck(checkedMode, disabled, flattedData, defaultCheckedIds, checkedIdsProp, onCheck) {
|
15
16
|
if (defaultCheckedIds === void 0) {
|
16
17
|
defaultCheckedIds = NOOP_ARRAY;
|
17
18
|
}
|
18
19
|
|
19
20
|
var _useUncontrolledState = useUncontrolledState(defaultCheckedIds, checkedIdsProp, function (checkedIds, checkedNode, shouldChecked, semiCheckedIds) {
|
21
|
+
// 出口数据处理
|
20
22
|
onCheck === null || onCheck === void 0 ? void 0 : onCheck({
|
21
23
|
checkedIds: checkedIds,
|
22
24
|
semiCheckedIds: semiCheckedIds
|
23
25
|
}, checkedNode, shouldChecked);
|
24
26
|
}),
|
25
27
|
checkedIds = _useUncontrolledState[0],
|
26
|
-
trySetCheckedIds = _useUncontrolledState[1];
|
28
|
+
trySetCheckedIds = _useUncontrolledState[1]; // 入口数据处理
|
29
|
+
|
27
30
|
|
31
|
+
var parsedCheckedIds = parseCheckDataDirty(checkedMode, checkedIds, flattedData, allowCheck);
|
32
|
+
var cascaded = checkedMode !== 'SEPARATE';
|
28
33
|
return useCascadeCheck({
|
29
34
|
cascaded: cascaded,
|
30
35
|
disabled: disabled,
|
31
36
|
flattedData: flattedData,
|
32
|
-
checkedIds:
|
33
|
-
onCheck:
|
37
|
+
checkedIds: parsedCheckedIds,
|
38
|
+
onCheck: function onCheck(checkedIds, checkedNode, shouldChecked, semiCheckedIds) {
|
39
|
+
// 出口数据处理
|
40
|
+
var processedIds = processCheckedIds(checkedMode, checkedIds, flattedData, allowCheck);
|
41
|
+
trySetCheckedIds(processedIds, checkedNode, shouldChecked, semiCheckedIds);
|
42
|
+
},
|
34
43
|
allowCheck: allowCheck
|
35
44
|
});
|
36
45
|
};
|
@@ -44,4 +53,3 @@ var allowCheck = function allowCheck(targetItem) {
|
|
44
53
|
};
|
45
54
|
|
46
55
|
export { useCheck };
|
47
|
-
//# sourceMappingURL=use-check.js.map
|
@@ -2,7 +2,7 @@
|
|
2
2
|
* @hi-ui/check-cascader
|
3
3
|
* https://github.com/XiaoMi/hiui/tree/master/packages/ui/check-cascader#readme
|
4
4
|
*
|
5
|
-
* Copyright (c)
|
5
|
+
* Copyright (c) HiUI <mi-hiui@xiaomi.com>.
|
6
6
|
*
|
7
7
|
* This source code is licensed under the MIT license found in the
|
8
8
|
* LICENSE file in the root directory of this source tree.
|
@@ -28,4 +28,3 @@ var useSelect = function useSelect(disabled) {
|
|
28
28
|
};
|
29
29
|
|
30
30
|
export { useSelect };
|
31
|
-
//# sourceMappingURL=use-select.js.map
|
package/lib/esm/icons/index.js
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
* @hi-ui/check-cascader
|
3
3
|
* https://github.com/XiaoMi/hiui/tree/master/packages/ui/check-cascader#readme
|
4
4
|
*
|
5
|
-
* Copyright (c)
|
5
|
+
* Copyright (c) HiUI <mi-hiui@xiaomi.com>.
|
6
6
|
*
|
7
7
|
* This source code is licensed under the MIT license found in the
|
8
8
|
* LICENSE file in the root directory of this source tree.
|
@@ -19,4 +19,3 @@ var defaultLeafIcon = /*#__PURE__*/React.createElement("span", {
|
|
19
19
|
});
|
20
20
|
var defaultLoadingIcon = /*#__PURE__*/React.createElement(Spinner, null);
|
21
21
|
export { defaultLeafIcon, defaultLoadingIcon, defaultSuffixIcon };
|
22
|
-
//# sourceMappingURL=index.js.map
|
package/lib/esm/index.js
CHANGED
@@ -2,11 +2,10 @@
|
|
2
2
|
* @hi-ui/check-cascader
|
3
3
|
* https://github.com/XiaoMi/hiui/tree/master/packages/ui/check-cascader#readme
|
4
4
|
*
|
5
|
-
* Copyright (c)
|
5
|
+
* Copyright (c) HiUI <mi-hiui@xiaomi.com>.
|
6
6
|
*
|
7
7
|
* This source code is licensed under the MIT license found in the
|
8
8
|
* LICENSE file in the root directory of this source tree.
|
9
9
|
*/
|
10
10
|
import './styles/index.scss.js';
|
11
11
|
export { CheckCascader, CheckCascader as default } from './CheckCascader.js';
|
12
|
-
//# sourceMappingURL=index.js.map
|
@@ -2,16 +2,14 @@
|
|
2
2
|
* @hi-ui/check-cascader
|
3
3
|
* https://github.com/XiaoMi/hiui/tree/master/packages/ui/check-cascader#readme
|
4
4
|
*
|
5
|
-
* Copyright (c)
|
5
|
+
* Copyright (c) HiUI <mi-hiui@xiaomi.com>.
|
6
6
|
*
|
7
7
|
* This source code is licensed under the MIT license found in the
|
8
8
|
* LICENSE file in the root directory of this source tree.
|
9
9
|
*/
|
10
|
-
|
11
|
-
|
12
|
-
var __styleInject__ = require('style-inject/dist/style-inject.es.js')["default"];
|
10
|
+
import __styleInject__ from 'inject-head-style';
|
11
|
+
var css_248z = ".hi-v4-check-cascader__popper .hi-v4-picker__body {padding-left: 0;padding-right: 0;overflow-y: hidden; }.hi-v4-check-cascader__popper .hi-v4-picker__loading, .hi-v4-check-cascader__popper .hi-v4-picker__empty {padding: var(--hi-v4-spacing-5, 10px) var(--hi-v4-spacing-8, 16px); }.hi-v4-check-cascader-panel {white-space: nowrap;-webkit-box-sizing: border-box;box-sizing: border-box; }.hi-v4-check-cascader-panel-search {-webkit-box-sizing: border-box;box-sizing: border-box;padding: 0 10px 10px;position: relative; }.hi-v4-check-cascader-panel-search .hi-v4-input__prefix {font-size: 16px;padding-left: 0; }.hi-v4-check-cascader-panel-search__empty {display: inline-block;margin-top: 20px;font-size: 14px;font-weight: 400;color: #999;line-height: 20px; }.hi-v4-check-cascader-menus {display: -webkit-box;display: -ms-flexbox;display: flex;-webkit-box-sizing: border-box;box-sizing: border-box;overflow-x: auto; }.hi-v4-check-cascader-menus--flatted .hi-v4-check-cascader-menu {-ms-flex-preferred-size: 100%;flex-basis: 100%; }.hi-v4-check-cascader-menu {-webkit-box-sizing: border-box;box-sizing: border-box;margin: 0;padding: 0;border: none;outline: none;font-size: var(--hi-v4-text-size-md, 0.875rem);vertical-align: middle;list-style: none;width: auto;box-sizing: border-box;-ms-flex-negative: 0;flex-shrink: 0;display: inline-block;min-width: 140px;max-height: 256px;overflow: auto;padding: 0 var(--hi-v4-spacing-4, 8px);border-right: var(--hi-v4-border-size-normal, 1px solid) var(--hi-v4-color-gray-200, #ebedf0); }.hi-v4-check-cascader-menu:last-of-type {border: none; }.hi-v4-check-cascader-menu--checkable .hi-v4-check-cascader-menu-checkbox + .title__text {padding-left: 8px; }.hi-v4-check-cascader-menu-item {width: 100%;padding: var(--hi-v4-spacing-2, 4px) 0;position: relative;cursor: pointer;display: -webkit-box;display: -ms-flexbox;display: flex; }.hi-v4-check-cascader-menu-checkbox {position: relative; }.hi-v4-check-cascader-menu-checkbox::after {right: 0;top: -8px;bottom: -8px;left: -8px;content: '';position: absolute;display: block; }.hi-v4-check-cascader-menu-option {padding: 0 var(--hi-v4-spacing-4, 8px);-webkit-box-sizing: border-box;box-sizing: border-box;height: 32px;width: 100%;display: -webkit-box;display: -ms-flexbox;display: flex;-webkit-box-align: center;-ms-flex-align: center;align-items: center;position: relative;-webkit-box-pack: justify;-ms-flex-pack: justify;justify-content: space-between;border-radius: var(--hi-v4-border-radius-md, 4px); }.hi-v4-check-cascader-menu-option:hover {background-color: var(--hi-v4-color-gray-100, #f2f4f7); }.hi-v4-check-cascader-menus--selectchange .hi-v4-check-cascader-menu-option:hover .hi-v4-checkbox__icon {border-color: var(--hi-v4-color-primary-500, var(--hi-v4-color-brandblue-500, #237ffa)); }.hi-v4-check-cascader-menu-option.hi-v4-check-cascader-menu-option--selected {background: var(--hi-v4-color-primary-50, var(--hi-v4-color-brandblue-50, #e2f3fe));color: var(--hi-v4-color-primary-500, var(--hi-v4-color-brandblue-500, #237ffa)); }.hi-v4-check-cascader-menu-option.hi-v4-check-cascader-menu-option--selected .hi-v4-check-cascader-menu-switcher {color: var(--hi-v4-color-primary-500, var(--hi-v4-color-brandblue-500, #237ffa)); }.hi-v4-check-cascader-menu-option--focused {background-color: var(--hi-v4-color-primary-50, var(--hi-v4-color-brandblue-50, #e2f3fe)); }.hi-v4-check-cascader-menu-option--disabled {cursor: not-allowed;color: var(--hi-v4-color-gray-500, #929aa6);background: transparent; }.hi-v4-check-cascader-menu-option--disabled .hi-v4-check-cascader-menu-switcher {color: var(--hi-v4-color-gray-400, #c9ced6); }.hi-v4-check-cascader-menu .title__text {-webkit-box-flex: 1;-ms-flex: 1 1;flex: 1 1; }.hi-v4-check-cascader-menu .title__text--cols {display: block;width: 100%;-webkit-box-sizing: border-box;box-sizing: border-box;margin: 0;padding: 0;border: none;outline: none;font-size: var(--hi-v4-text-size-md, 0.875rem);vertical-align: middle;list-style: none; }.hi-v4-check-cascader-menu .title__text--col {display: inline-block; }.hi-v4-check-cascader-menu .title__text--col::after {content: '\\00a0/\\00a0'; }.hi-v4-check-cascader-menu .title__text--col:last-child::after {content: none; }.hi-v4-check-cascader-menu .title__text--matched {color: var(--hi-v4-color-primary-500, var(--hi-v4-color-brandblue-500, #237ffa)); }.hi-v4-check-cascader-menu-switcher {-ms-flex-negative: 0;flex-shrink: 0;font-size: 16px;color: var(--hi-v4-color-gray-500, #929aa6); }.hi-v4-check-cascader-menu-switcher--loading {color: var(--hi-v4-color-primary-500, var(--hi-v4-color-brandblue-500, #237ffa)); }.hi-v4-tree--icon-loading {-webkit-animation-name: hi-rotate;animation-name: hi-rotate;-webkit-animation-duration: 2s;animation-duration: 2s;-webkit-animation-iteration-count: infinite;animation-iteration-count: infinite; }@-webkit-keyframes hi-rotate {from {-webkit-transform: rotate(0);transform: rotate(0); }to {-webkit-transform: rotate(360deg);transform: rotate(360deg); } }@keyframes hi-rotate {from {-webkit-transform: rotate(0);transform: rotate(0); }to {-webkit-transform: rotate(360deg);transform: rotate(360deg); } }";
|
13
12
|
|
14
13
|
__styleInject__(css_248z);
|
15
14
|
|
16
|
-
export default
|
17
|
-
//# sourceMappingURL=index.scss.js.map
|
15
|
+
export { css_248z as default };
|
package/lib/esm/utils/index.js
CHANGED
@@ -2,86 +2,51 @@
|
|
2
2
|
* @hi-ui/check-cascader
|
3
3
|
* https://github.com/XiaoMi/hiui/tree/master/packages/ui/check-cascader#readme
|
4
4
|
*
|
5
|
-
* Copyright (c)
|
5
|
+
* Copyright (c) HiUI <mi-hiui@xiaomi.com>.
|
6
6
|
*
|
7
7
|
* This source code is licensed under the MIT license found in the
|
8
8
|
* LICENSE file in the root directory of this source tree.
|
9
9
|
*/
|
10
|
-
|
10
|
+
import { baseFlattenTree, getTopDownAncestors, fFindNodeById, getNodeAncestors, findNestedChildren } from '@hi-ui/tree-utils';
|
11
|
+
import { isArrayNonEmpty } from '@hi-ui/type-assertion';
|
11
12
|
/**
|
12
13
|
* 扁平化树数据结构,基于前序遍历
|
13
14
|
*
|
14
15
|
* @param treeData
|
15
16
|
* @returns
|
16
17
|
*/
|
17
|
-
var flattenTreeData = function flattenTreeData(treeData) {
|
18
|
-
var flattedTreeData = [];
|
19
|
-
|
20
|
-
var dig = function dig(node, depth, parent) {
|
21
|
-
var id = node.id,
|
22
|
-
title = node.title,
|
23
|
-
children = node.children,
|
24
|
-
_node$checkable = node.checkable,
|
25
|
-
checkable = _node$checkable === void 0 ? true : _node$checkable,
|
26
|
-
_node$isLeaf = node.isLeaf,
|
27
|
-
isLeaf = _node$isLeaf === void 0 ? false : _node$isLeaf,
|
28
|
-
_node$disabled = node.disabled,
|
29
|
-
disabled = _node$disabled === void 0 ? false : _node$disabled,
|
30
|
-
_node$disabledCheckbo = node.disabledCheckbox,
|
31
|
-
disabledCheckbox = _node$disabledCheckbo === void 0 ? false : _node$disabledCheckbo;
|
32
|
-
var flattedNode = {
|
33
|
-
id: id,
|
34
|
-
title: title,
|
35
|
-
depth: depth,
|
36
|
-
parent: parent,
|
37
|
-
raw: node,
|
38
|
-
isLeaf: isLeaf,
|
39
|
-
disabled: disabled,
|
40
|
-
disabledCheckbox: disabledCheckbox,
|
41
|
-
checkable: checkable
|
42
|
-
};
|
43
|
-
flattedTreeData.push(flattedNode);
|
44
|
-
|
45
|
-
if (children) {
|
46
|
-
var childDepth = depth + 1;
|
47
|
-
flattedNode.children = children.map(function (child) {
|
48
|
-
return dig(child, childDepth, flattedNode);
|
49
|
-
});
|
50
|
-
}
|
51
|
-
|
52
|
-
return flattedNode;
|
53
|
-
}; // @ts-ignore
|
54
18
|
|
19
|
+
var flattenTreeData = function flattenTreeData(treeData, fieldNames) {
|
20
|
+
/**
|
21
|
+
* 转换对象
|
22
|
+
*/
|
23
|
+
var getKeyFields = function getKeyFields(node, key) {
|
24
|
+
if (fieldNames) {
|
25
|
+
return node[fieldNames[key] || key];
|
26
|
+
}
|
55
27
|
|
56
|
-
|
57
|
-
|
58
|
-
treeRoot.children = treeData.map(function (node) {
|
59
|
-
return dig(node, 0, treeRoot);
|
60
|
-
});
|
61
|
-
return flattedTreeData;
|
62
|
-
};
|
63
|
-
|
64
|
-
var getTreeRoot = function getTreeRoot() {
|
65
|
-
return {
|
66
|
-
depth: -1
|
28
|
+
return node[key];
|
67
29
|
};
|
68
|
-
};
|
69
|
-
/**
|
70
|
-
* 获取祖先节点,包括自己
|
71
|
-
* @param node
|
72
|
-
* @returns
|
73
|
-
*/
|
74
|
-
|
75
|
-
|
76
|
-
var getNodeAncestors = function getNodeAncestors(node) {
|
77
|
-
var ancestors = [];
|
78
30
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
31
|
+
return baseFlattenTree({
|
32
|
+
tree: treeData,
|
33
|
+
childrenFieldName: function childrenFieldName(node) {
|
34
|
+
return getKeyFields(node, 'children');
|
35
|
+
},
|
36
|
+
transform: function transform(node) {
|
37
|
+
var _a, _b, _c, _d;
|
38
|
+
|
39
|
+
var flattedNode = node;
|
40
|
+
var raw = node.raw;
|
41
|
+
flattedNode.id = getKeyFields(raw, 'id');
|
42
|
+
flattedNode.title = getKeyFields(raw, 'title');
|
43
|
+
flattedNode.disabled = (_a = getKeyFields(raw, 'disabled')) !== null && _a !== void 0 ? _a : false;
|
44
|
+
flattedNode.isLeaf = (_b = getKeyFields(raw, 'isLeaf')) !== null && _b !== void 0 ? _b : false;
|
45
|
+
flattedNode.checkable = (_c = getKeyFields(raw, 'checkable')) !== null && _c !== void 0 ? _c : true;
|
46
|
+
flattedNode.disabledCheckbox = (_d = getKeyFields(raw, 'disabledCheckbox')) !== null && _d !== void 0 ? _d : false;
|
47
|
+
return flattedNode;
|
48
|
+
}
|
49
|
+
});
|
85
50
|
};
|
86
51
|
|
87
52
|
var getActiveMenus = function getActiveMenus(data, selectedIds) {
|
@@ -123,15 +88,155 @@ var getActiveMenuIds = function getActiveMenuIds(data, selectedIds) {
|
|
123
88
|
return selectedIds === id;
|
124
89
|
});
|
125
90
|
if (!selectedOption) return [];
|
126
|
-
return
|
91
|
+
return getTopDownAncestors(selectedOption).map(function (_ref4) {
|
127
92
|
var id = _ref4.id;
|
128
93
|
return id;
|
129
|
-
})
|
94
|
+
});
|
130
95
|
};
|
131
96
|
|
132
97
|
function getCascaderItemEventData(node, requiredProps) {
|
133
98
|
return Object.assign(Object.assign({}, node), requiredProps);
|
134
99
|
}
|
100
|
+
/**
|
101
|
+
* 处理选中的回显数据
|
102
|
+
*
|
103
|
+
* @param checkedIds 当前所有被选中的节点 ID 集合
|
104
|
+
* @param nodeEntries 所有数据的Map 集合
|
105
|
+
* @param type 数据回显方式
|
106
|
+
*/
|
107
|
+
|
108
|
+
|
109
|
+
var processCheckedIds = function processCheckedIds(type, checkedIds, flattenData, allowCheck) {
|
110
|
+
var keySet = new Set(checkedIds);
|
111
|
+
|
112
|
+
switch (type) {
|
113
|
+
case 'CHILD':
|
114
|
+
return checkedIds.filter(function (id) {
|
115
|
+
var node = fFindNodeById(flattenData, id);
|
116
|
+
|
117
|
+
if (node) {
|
118
|
+
var children = node.children;
|
119
|
+
|
120
|
+
if (isArrayNonEmpty(children)) {
|
121
|
+
if (children.filter(allowCheck).every(function (node) {
|
122
|
+
return keySet.has(node.id);
|
123
|
+
})) {
|
124
|
+
return false;
|
125
|
+
}
|
126
|
+
}
|
127
|
+
} // 没有孩子节点,保留
|
128
|
+
|
129
|
+
|
130
|
+
return true;
|
131
|
+
});
|
132
|
+
|
133
|
+
case 'PARENT':
|
134
|
+
return checkedIds.filter(function (id) {
|
135
|
+
var node = fFindNodeById(flattenData, id);
|
136
|
+
|
137
|
+
if (node) {
|
138
|
+
// 向上递归遍历是否被勾选
|
139
|
+
var ancestors = getNodeAncestors(node);
|
140
|
+
|
141
|
+
if (ancestors.some(function (parent) {
|
142
|
+
return keySet.has(parent.id);
|
143
|
+
})) {
|
144
|
+
return false;
|
145
|
+
}
|
146
|
+
}
|
147
|
+
|
148
|
+
return true;
|
149
|
+
});
|
150
|
+
}
|
151
|
+
|
152
|
+
return checkedIds;
|
153
|
+
};
|
154
|
+
/**
|
155
|
+
* 根据传入的 checkedIds 解析全选/半选数据
|
156
|
+
*/
|
157
|
+
|
158
|
+
|
159
|
+
var parseCheckDataDirty = function parseCheckDataDirty(type, checkedIds, flattenData, allowCheck) {
|
160
|
+
switch (type) {
|
161
|
+
case 'CHILD':
|
162
|
+
case 'PARENT':
|
163
|
+
return dirtyCheck(checkedIds, flattenData, allowCheck);
|
164
|
+
}
|
165
|
+
|
166
|
+
return checkedIds;
|
167
|
+
};
|
168
|
+
|
169
|
+
function dirtyCheck(checkedIds, flattenData, allowCheck) {
|
170
|
+
var nodeEntities = flattenData.reduce(function (prev, cur) {
|
171
|
+
prev[cur.id] = cur;
|
172
|
+
return prev;
|
173
|
+
}, {});
|
174
|
+
var checkedIdsSet = new Set(checkedIds.filter(function (id) {
|
175
|
+
return !!nodeEntities[id];
|
176
|
+
}));
|
177
|
+
var depthEntities = new Map();
|
178
|
+
var maxDepth = 0; // Convert entities by depth for calculation
|
179
|
+
|
180
|
+
Object.keys(nodeEntities).forEach(function (id) {
|
181
|
+
var entity = nodeEntities[id];
|
182
|
+
var depth = entity.depth;
|
183
|
+
var depthSet = depthEntities.get(depth);
|
184
|
+
|
185
|
+
if (!depthSet) {
|
186
|
+
depthSet = new Set();
|
187
|
+
depthEntities.set(depth, depthSet);
|
188
|
+
}
|
189
|
+
|
190
|
+
depthSet.add(entity);
|
191
|
+
maxDepth = Math.max(maxDepth, depth);
|
192
|
+
});
|
193
|
+
return fillCheck(checkedIdsSet, depthEntities, nodeEntities, maxDepth, allowCheck);
|
194
|
+
}
|
195
|
+
/**
|
196
|
+
* 对 checkedIds 级联遗漏选项 id 填充
|
197
|
+
*
|
198
|
+
* 1. 把所有嵌套孩子节点 allowCheck 的都标记为 checked
|
199
|
+
* 2. 祖先节点从下至上维护 checked 状态
|
200
|
+
*/
|
201
|
+
|
202
|
+
|
203
|
+
function fillCheck(checkedIds, depthEntities, nodeEntities, maxDepth, allowCheck) {
|
204
|
+
var checkedIdsSet = new Set(checkedIds);
|
205
|
+
checkedIdsSet.forEach(function (id) {
|
206
|
+
var checkedNode = nodeEntities[id];
|
207
|
+
var nestedChildren = findNestedChildren(checkedNode, allowCheck);
|
208
|
+
nestedChildren.forEach(function (child) {
|
209
|
+
checkedIdsSet.add(child.id);
|
210
|
+
});
|
211
|
+
}); // 缓存中间结果,优化查询
|
212
|
+
|
213
|
+
var visitedIds = new Map();
|
214
|
+
|
215
|
+
for (var depth = maxDepth - 1; depth >= 0; --depth) {
|
216
|
+
var entities = depthEntities.get(depth);
|
217
|
+
entities === null || entities === void 0 ? void 0 : entities.forEach(function (entity) {
|
218
|
+
var id = entity.id,
|
219
|
+
children = entity.children;
|
220
|
+
if (visitedIds.has(id)) return;
|
221
|
+
|
222
|
+
if (isArrayNonEmpty(children)) {
|
223
|
+
var shouldChecked = !children.some(function (child) {
|
224
|
+
if (visitedIds.has(child.id)) {
|
225
|
+
return !visitedIds.get(child.id);
|
226
|
+
}
|
227
|
+
|
228
|
+
return !checkedIdsSet.has(child.id);
|
229
|
+
});
|
230
|
+
visitedIds.set(id, shouldChecked);
|
231
|
+
|
232
|
+
if (shouldChecked && allowCheck(entity)) {
|
233
|
+
checkedIdsSet.add(id);
|
234
|
+
}
|
235
|
+
}
|
236
|
+
});
|
237
|
+
}
|
238
|
+
|
239
|
+
return Array.from(checkedIdsSet);
|
240
|
+
}
|
135
241
|
|
136
|
-
export { flattenTreeData, getActiveMenuIds, getActiveMenus, getCascaderItemEventData, getFlattedMenus,
|
137
|
-
//# sourceMappingURL=index.js.map
|
242
|
+
export { flattenTreeData, getActiveMenuIds, getActiveMenus, getCascaderItemEventData, getFlattedMenus, parseCheckDataDirty, processCheckedIds };
|
@@ -1,16 +1,16 @@
|
|
1
1
|
import React from 'react';
|
2
|
-
import {
|
2
|
+
import { CheckCascaderDataItem, CheckCascaderExpandTriggerEnum, CheckCascaderItemEventData, FlattedCheckCascaderDataItem } from './types';
|
3
3
|
import { PickerProps } from '@hi-ui/picker';
|
4
4
|
import { HiBaseAppearanceEnum } from '@hi-ui/core';
|
5
5
|
/**
|
6
6
|
* TODO: What is CheckCascader
|
7
7
|
*/
|
8
8
|
export declare const CheckCascader: React.ForwardRefExoticComponent<CheckCascaderProps & React.RefAttributes<HTMLDivElement | null>>;
|
9
|
-
export interface CheckCascaderProps extends Omit<PickerProps, 'trigger'> {
|
9
|
+
export interface CheckCascaderProps extends Omit<PickerProps, 'trigger' | 'scrollable'> {
|
10
10
|
/**
|
11
11
|
* 设置选择项数据源
|
12
12
|
*/
|
13
|
-
data:
|
13
|
+
data: CheckCascaderDataItem[];
|
14
14
|
/**
|
15
15
|
* 设置当前多选值
|
16
16
|
*/
|
@@ -21,7 +21,6 @@ export interface CheckCascaderProps extends Omit<PickerProps, 'trigger'> {
|
|
21
21
|
defaultValue?: React.ReactText[][];
|
22
22
|
/**
|
23
23
|
* 多选值改变时的回调
|
24
|
-
* TODO: 是否有这样的需求:暴露操作的原始数据对象?包括 点击 checkbox、点击 tag 删除按钮、点击清空按钮
|
25
24
|
*/
|
26
25
|
onChange?: (values: React.ReactText[][]) => void;
|
27
26
|
/**
|
@@ -32,7 +31,7 @@ export interface CheckCascaderProps extends Omit<PickerProps, 'trigger'> {
|
|
32
31
|
/**
|
33
32
|
* 次级菜单的展开方式
|
34
33
|
*/
|
35
|
-
expandTrigger?:
|
34
|
+
expandTrigger?: CheckCascaderExpandTriggerEnum;
|
36
35
|
/**
|
37
36
|
* 是否可搜索(仅在 title 为字符串时支持)
|
38
37
|
*/
|
@@ -60,7 +59,7 @@ export interface CheckCascaderProps extends Omit<PickerProps, 'trigger'> {
|
|
60
59
|
/**
|
61
60
|
* 自定义选择后触发器所展示的内容
|
62
61
|
*/
|
63
|
-
displayRender?: (checkedOption:
|
62
|
+
displayRender?: (checkedOption: FlattedCheckCascaderDataItem) => React.ReactNode;
|
64
63
|
/**
|
65
64
|
* 支持 checkbox 级联(正反选)功能
|
66
65
|
*/
|
@@ -81,12 +80,7 @@ export interface CheckCascaderProps extends Omit<PickerProps, 'trigger'> {
|
|
81
80
|
/**
|
82
81
|
* 异步请求更新数据
|
83
82
|
*/
|
84
|
-
onLoadChildren?: (item: CheckCascaderItemEventData, idPaths: React.ReactText[]) => Promise<
|
85
|
-
/**
|
86
|
-
* 是否单行展示,超出 +1。暂不对外暴露
|
87
|
-
* @private
|
88
|
-
*/
|
89
|
-
wrap?: boolean;
|
83
|
+
onLoadChildren?: (item: CheckCascaderItemEventData, idPaths: React.ReactText[]) => Promise<CheckCascaderDataItem[] | void> | void;
|
90
84
|
/**
|
91
85
|
* 设置展现形式
|
92
86
|
*/
|
@@ -97,4 +91,12 @@ export interface CheckCascaderProps extends Omit<PickerProps, 'trigger'> {
|
|
97
91
|
* 第二个为数据项,返回值为 true 时将出现在结果项
|
98
92
|
*/
|
99
93
|
filterOption?: (keyword: string, item: any) => boolean;
|
94
|
+
/**
|
95
|
+
* 多选数据交互时回填、回显模式
|
96
|
+
* PARENT: 当所有子节点被选中时将只保留父节点
|
97
|
+
* ALL: 所有被选中节点,不区分父子节点(不支持异步数据加载勾选checkbox)
|
98
|
+
* CHILD: 仅显示子节点(不支持异步数据加载勾选checkbox)
|
99
|
+
* SEPARATE:父子完全独立受控
|
100
|
+
*/
|
101
|
+
checkedMode?: 'PARENT' | 'CHILD' | 'ALL' | 'SEPARATE';
|
100
102
|
}
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import React from 'react';
|
2
|
-
import {
|
2
|
+
import { FlattedCheckCascaderDataItem, CheckCascaderDataItemRequiredProps } from './types';
|
3
3
|
export declare const CheckCascaderMenu: ({ prefixCls, role, className, data: menu, getCascaderItemRequiredProps, }: CheckCascaderMenuProps) => JSX.Element;
|
4
4
|
export interface CheckCascaderMenuProps {
|
5
5
|
/**
|
@@ -21,13 +21,13 @@ export interface CheckCascaderMenuProps {
|
|
21
21
|
/**
|
22
22
|
* 设置选择项数据源
|
23
23
|
*/
|
24
|
-
data:
|
24
|
+
data: FlattedCheckCascaderDataItem[];
|
25
25
|
/**
|
26
26
|
* 自定义渲染节点的 title 内容
|
27
27
|
*/
|
28
|
-
titleRender?: (item:
|
28
|
+
titleRender?: (item: FlattedCheckCascaderDataItem) => React.ReactNode;
|
29
29
|
/**
|
30
30
|
* 获取级联选项必要状态
|
31
31
|
*/
|
32
|
-
getCascaderItemRequiredProps: (option:
|
32
|
+
getCascaderItemRequiredProps: (option: FlattedCheckCascaderDataItem) => CheckCascaderDataItemRequiredProps;
|
33
33
|
}
|
@@ -1,9 +1,6 @@
|
|
1
1
|
import React from 'react';
|
2
|
-
import {
|
3
|
-
|
4
|
-
* TODO: What is CheckCascaderMenus
|
5
|
-
*/
|
6
|
-
export declare const CheckCascaderMenus: React.ForwardRefExoticComponent<CascaderMenusProps & React.RefAttributes<HTMLDivElement | null>>;
|
2
|
+
import { CheckCascaderExpandTriggerEnum, CheckCascaderItemEventData, FlattedCheckCascaderDataItem, CheckCascaderDataItem } from './types';
|
3
|
+
export declare const CheckCascaderMenuList: React.ForwardRefExoticComponent<CascaderMenusProps & React.RefAttributes<HTMLDivElement | null>>;
|
7
4
|
export interface CascaderMenusProps {
|
8
5
|
/**
|
9
6
|
* 组件默认的选择器类
|
@@ -24,15 +21,15 @@ export interface CascaderMenusProps {
|
|
24
21
|
/**
|
25
22
|
* 设置选择项数据源
|
26
23
|
*/
|
27
|
-
data:
|
24
|
+
data: CheckCascaderDataItem[];
|
28
25
|
/**
|
29
26
|
* 更新选择项数据源
|
30
27
|
*/
|
31
|
-
onChangeData: React.Dispatch<React.SetStateAction<
|
28
|
+
onChangeData: React.Dispatch<React.SetStateAction<CheckCascaderDataItem[]>>;
|
32
29
|
/**
|
33
30
|
* 设置选择项数据源
|
34
31
|
*/
|
35
|
-
flattedData:
|
32
|
+
flattedData: FlattedCheckCascaderDataItem[];
|
36
33
|
/**
|
37
34
|
* 设置当前多选值
|
38
35
|
*/
|
@@ -52,7 +49,7 @@ export interface CascaderMenusProps {
|
|
52
49
|
/**
|
53
50
|
* 次级菜单的展开方式
|
54
51
|
*/
|
55
|
-
expandTrigger?:
|
52
|
+
expandTrigger?: CheckCascaderExpandTriggerEnum;
|
56
53
|
/**
|
57
54
|
* 是否禁止使用
|
58
55
|
*/
|
@@ -65,6 +62,14 @@ export interface CascaderMenusProps {
|
|
65
62
|
* 自定义渲染节点的 title 内容
|
66
63
|
*/
|
67
64
|
titleRender?: (item: CheckCascaderItemEventData) => React.ReactNode;
|
65
|
+
/**
|
66
|
+
* 多选数据交互时回填、回显模式
|
67
|
+
* PARENT: 当所有子节点被选中时将只保留父节点
|
68
|
+
* ALL: 所有被选中节点,不区分父子节点(不支持异步数据加载勾选checkbox)
|
69
|
+
* CHILD: 仅显示子节点(不支持异步数据加载勾选checkbox)
|
70
|
+
* SEPARATE:父子完全独立受控
|
71
|
+
*/
|
72
|
+
checkedMode?: 'PARENT' | 'CHILD' | 'ALL' | 'SEPARATE';
|
68
73
|
/**
|
69
74
|
* 支持 checkbox 级联(正反选)功能
|
70
75
|
*/
|
@@ -73,5 +78,8 @@ export interface CascaderMenusProps {
|
|
73
78
|
* 将 check 子项拍平展示
|
74
79
|
*/
|
75
80
|
flatted?: boolean;
|
76
|
-
|
81
|
+
/**
|
82
|
+
* 点击异步加载子项
|
83
|
+
*/
|
84
|
+
onLoadChildren?: (item: CheckCascaderItemEventData, idPaths: React.ReactText[]) => Promise<CheckCascaderDataItem[] | void> | void;
|
77
85
|
}
|
package/lib/types/context.d.ts
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
import React from 'react';
|
2
|
-
import {
|
2
|
+
import { CheckCascaderExpandTriggerEnum, CheckCascaderItemEventData, CheckCascaderDataItem, FlattedCheckCascaderDataItem, CheckCascaderDataItemRequiredProps } from './types';
|
3
3
|
interface CheckCascaderContext {
|
4
|
-
onLoadChildren?: (item: CheckCascaderItemEventData, idPaths: React.ReactText[]) => Promise<
|
4
|
+
onLoadChildren?: (item: CheckCascaderItemEventData, idPaths: React.ReactText[]) => Promise<CheckCascaderDataItem[] | void> | void;
|
5
5
|
disabled?: boolean;
|
6
|
-
expandTrigger?:
|
6
|
+
expandTrigger?: CheckCascaderExpandTriggerEnum;
|
7
7
|
onCheck?: (option: CheckCascaderItemEventData, shouldChecked: boolean) => void;
|
8
8
|
onSelect?: (selectedOption: CheckCascaderItemEventData) => void;
|
9
9
|
flatted?: boolean;
|
10
10
|
changeOnSelect?: boolean;
|
11
11
|
titleRender?: (item: CheckCascaderItemEventData) => React.ReactNode;
|
12
|
-
getCascaderItemRequiredProps?: (item:
|
12
|
+
getCascaderItemRequiredProps?: (item: FlattedCheckCascaderDataItem) => CheckCascaderDataItemRequiredProps;
|
13
13
|
}
|
14
14
|
export declare const CheckCascaderProvider: React.Provider<CheckCascaderContext>;
|
15
15
|
export declare const useCheckCascaderContext: () => CheckCascaderContext;
|