@kdcloudjs/kdesign 1.5.2 → 1.5.5

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.
Files changed (107) hide show
  1. package/CHANGELOG.md +64 -0
  2. package/dist/default-theme.js +4 -4
  3. package/dist/kdesign-complete.less +169 -88
  4. package/dist/kdesign.css +165 -86
  5. package/dist/kdesign.css.map +1 -1
  6. package/dist/kdesign.js +335 -220
  7. package/dist/kdesign.js.map +1 -1
  8. package/dist/kdesign.min.css +4 -4
  9. package/dist/kdesign.min.js +6 -6
  10. package/dist/kdesign.min.js.map +1 -1
  11. package/es/_utils/usePopper.js +17 -8
  12. package/es/alert/alert.js +2 -2
  13. package/es/alert/style/index.css +27 -11
  14. package/es/alert/style/index.less +24 -10
  15. package/es/alert/style/mixin.less +8 -2
  16. package/es/alert/style/token.less +16 -8
  17. package/es/config-provider/compDefaultProps.d.ts +1 -0
  18. package/es/config-provider/compDefaultProps.js +2 -1
  19. package/es/drawer/drawer.js +1 -0
  20. package/es/dropdown/dropdown.js +16 -6
  21. package/es/dropdown/style/index.css +13 -14
  22. package/es/dropdown/style/index.less +4 -5
  23. package/es/dropdown/style/token.less +6 -5
  24. package/es/input/ClearableLabeledInput.js +5 -5
  25. package/es/input/style/index.css +5 -0
  26. package/es/input/style/index.less +5 -0
  27. package/es/radio/style/index.css +7 -1
  28. package/es/radio/style/index.less +9 -1
  29. package/es/search/style/index.css +3 -3
  30. package/es/select/select.js +1 -1
  31. package/es/spin/style/index.css +25 -26
  32. package/es/spin/style/index.less +18 -19
  33. package/es/spin/style/token.less +9 -3
  34. package/es/stepper/stepper.js +9 -4
  35. package/es/stepper/style/index.css +2 -0
  36. package/es/stepper/style/index.less +2 -0
  37. package/es/stepper/style/token.less +1 -2
  38. package/es/style/icon/kdicon.css +2 -1
  39. package/es/style/icon/kdicon.woff +0 -0
  40. package/es/style/themes/default.less +3 -4
  41. package/es/tabs/style/index.css +1 -0
  42. package/es/tabs/style/index.less +1 -0
  43. package/es/timeline/style/index.css +22 -21
  44. package/es/timeline/style/index.less +2 -2
  45. package/es/timeline/style/token.less +4 -7
  46. package/es/tooltip/tooltip.js +1 -1
  47. package/es/tree/style/index.css +56 -7
  48. package/es/tree/style/index.less +26 -18
  49. package/es/tree/style/mixin.less +25 -1
  50. package/es/tree/style/token.less +6 -4
  51. package/es/tree/tree.d.ts +2 -0
  52. package/es/tree/tree.js +77 -20
  53. package/es/tree/treeHooks.d.ts +1 -1
  54. package/es/tree/treeHooks.js +3 -4
  55. package/es/tree/treeNode.d.ts +1 -0
  56. package/es/tree/treeNode.js +45 -49
  57. package/es/tree/utils/treeUtils.d.ts +6 -3
  58. package/es/tree/utils/treeUtils.js +66 -42
  59. package/lib/_utils/usePopper.js +17 -8
  60. package/lib/alert/alert.js +2 -2
  61. package/lib/alert/style/index.css +27 -11
  62. package/lib/alert/style/index.less +24 -10
  63. package/lib/alert/style/mixin.less +8 -2
  64. package/lib/alert/style/token.less +16 -8
  65. package/lib/config-provider/compDefaultProps.d.ts +1 -0
  66. package/lib/config-provider/compDefaultProps.js +2 -1
  67. package/lib/drawer/drawer.js +1 -0
  68. package/lib/dropdown/dropdown.js +15 -6
  69. package/lib/dropdown/style/index.css +13 -14
  70. package/lib/dropdown/style/index.less +4 -5
  71. package/lib/dropdown/style/token.less +6 -5
  72. package/lib/input/ClearableLabeledInput.js +5 -5
  73. package/lib/input/style/index.css +5 -0
  74. package/lib/input/style/index.less +5 -0
  75. package/lib/radio/style/index.css +7 -1
  76. package/lib/radio/style/index.less +9 -1
  77. package/lib/search/style/index.css +3 -3
  78. package/lib/select/select.js +1 -1
  79. package/lib/spin/style/index.css +25 -26
  80. package/lib/spin/style/index.less +18 -19
  81. package/lib/spin/style/token.less +9 -3
  82. package/lib/stepper/stepper.js +9 -4
  83. package/lib/stepper/style/index.css +2 -0
  84. package/lib/stepper/style/index.less +2 -0
  85. package/lib/stepper/style/token.less +1 -2
  86. package/lib/style/icon/kdicon.css +2 -1
  87. package/lib/style/icon/kdicon.woff +0 -0
  88. package/lib/style/themes/default.less +3 -4
  89. package/lib/tabs/style/index.css +1 -0
  90. package/lib/tabs/style/index.less +1 -0
  91. package/lib/timeline/style/index.css +22 -21
  92. package/lib/timeline/style/index.less +2 -2
  93. package/lib/timeline/style/token.less +4 -7
  94. package/lib/tooltip/tooltip.js +1 -1
  95. package/lib/tree/style/index.css +56 -7
  96. package/lib/tree/style/index.less +26 -18
  97. package/lib/tree/style/mixin.less +25 -1
  98. package/lib/tree/style/token.less +6 -4
  99. package/lib/tree/tree.d.ts +2 -0
  100. package/lib/tree/tree.js +78 -20
  101. package/lib/tree/treeHooks.d.ts +1 -1
  102. package/lib/tree/treeHooks.js +3 -4
  103. package/lib/tree/treeNode.d.ts +1 -0
  104. package/lib/tree/treeNode.js +46 -48
  105. package/lib/tree/utils/treeUtils.d.ts +6 -3
  106. package/lib/tree/utils/treeUtils.js +64 -42
  107. package/package.json +1 -1
@@ -101,6 +101,24 @@
101
101
  普通组件内部自身层级应设置在0-100间
102
102
  */
103
103
  /* ----------- zIndex ——————---- end */
104
+ .node-hover-hover {
105
+ -webkit-transition: background-color var(--kd-c-tree-motion-duration, var(--kd-g-duration, 0.3s)), color var(--kd-c-tree-motion-duration, var(--kd-g-duration, 0.3s));
106
+ transition: background-color var(--kd-c-tree-motion-duration, var(--kd-g-duration, 0.3s)), color var(--kd-c-tree-motion-duration, var(--kd-g-duration, 0.3s));
107
+ }
108
+ .node-hover-hover:hover {
109
+ background-color: var(--kd-c-tree-node-color-backgroung-hover, var(--kd-g-color-hover, #f5f5f5));
110
+ cursor: pointer;
111
+ }
112
+ .node-selected {
113
+ background-color: var(--kd-c-tree-node-color-backgroung-checked, var(--kd-g-color-theme-3, #e3eeff)) !important;
114
+ color: var(--kd-c-tree-node-color-text-checked, var(--kd-g-color-theme, #5582f3));
115
+ }
116
+ .node-selected .kd-tree-node-title {
117
+ color: var(--kd-c-tree-node-color-text-checked, var(--kd-g-color-theme, #5582f3));
118
+ }
119
+ .node-selected .kd-tree-node-icon {
120
+ color: var(--kd-c-tree-node-color-text-checked, var(--kd-g-color-theme, #5582f3));
121
+ }
104
122
  .kd-tree {
105
123
  position: relative;
106
124
  overflow: auto;
@@ -136,6 +154,15 @@
136
154
  -ms-flex-align: center;
137
155
  align-items: center;
138
156
  }
157
+ .kd-tree-node-root .kd-spin-dot-spin {
158
+ border: none;
159
+ width: var(--kd-c-tree-expand-icon-loading-sizing-width, 16px);
160
+ height: var(--kd-c-tree-expand-icon-loading-sizing-height, 16px);
161
+ }
162
+ .kd-tree-node-root .kd-spin-dot-spin .kd-spin-dot-item {
163
+ width: var(--kd-c-tree-expand-icon-loading-sizing-width, 16px);
164
+ height: var(--kd-c-tree-expand-icon-loading-sizing-height, 16px);
165
+ }
139
166
  .kd-tree-node-fb-children-pointerEvents * {
140
167
  pointer-events: none;
141
168
  }
@@ -176,8 +203,8 @@
176
203
  }
177
204
  .kd-tree-node-icon {
178
205
  cursor: pointer;
179
- height: var(--kd-c-tree-expand-icon-sizing-height, 22px);
180
- width: var(--kd-c-tree-expand-icon-sizing-width, 22px);
206
+ height: var(--kd-c-tree-expand-icon-sizing-height, 16px);
207
+ width: var(--kd-c-tree-expand-icon-sizing-width, 16px);
181
208
  display: -webkit-box;
182
209
  display: -ms-flexbox;
183
210
  display: flex;
@@ -190,9 +217,13 @@
190
217
  font-size: var(--kd-c-tree-node-icon-font-size, 16px);
191
218
  color: var(--kd-c-tree-node-icon-color-text, #666666);
192
219
  }
220
+ .kd-tree-node-icon-hover:hover {
221
+ background-color: var(--kd-c-tree-node-color-backgroung-hover, var(--kd-g-color-hover, #f5f5f5));
222
+ cursor: pointer;
223
+ }
193
224
  .kd-tree-node-icon-hidden {
194
- height: var(--kd-c-tree-node-icon-sizing-height, 20px);
195
- width: var(--kd-c-tree-node-icon-sizing-width, 20px);
225
+ height: var(--kd-c-tree-node-icon-sizing-height, 16px);
226
+ width: var(--kd-c-tree-node-icon-sizing-width, 16px);
196
227
  -ms-flex-negative: 0;
197
228
  flex-shrink: 0;
198
229
  opacity: 0;
@@ -233,10 +264,28 @@
233
264
  -ms-flex-align: center;
234
265
  align-items: center;
235
266
  height: 100%;
267
+ padding-left: 4px;
268
+ }
269
+ .kd-tree-node-title-wrap-hover {
270
+ -webkit-transition: background-color var(--kd-c-tree-motion-duration, var(--kd-g-duration, 0.3s)), color var(--kd-c-tree-motion-duration, var(--kd-g-duration, 0.3s));
271
+ transition: background-color var(--kd-c-tree-motion-duration, var(--kd-g-duration, 0.3s)), color var(--kd-c-tree-motion-duration, var(--kd-g-duration, 0.3s));
272
+ }
273
+ .kd-tree-node-title-wrap-hover:hover {
274
+ background-color: var(--kd-c-tree-node-color-backgroung-hover, var(--kd-g-color-hover, #f5f5f5));
275
+ cursor: pointer;
276
+ }
277
+ .kd-tree-node-title-wrap-selected {
278
+ background-color: var(--kd-c-tree-node-color-backgroung-checked, var(--kd-g-color-theme-3, #e3eeff)) !important;
279
+ color: var(--kd-c-tree-node-color-text-checked, var(--kd-g-color-theme, #5582f3));
280
+ }
281
+ .kd-tree-node-title-wrap-selected .kd-tree-node-title {
282
+ color: var(--kd-c-tree-node-color-text-checked, var(--kd-g-color-theme, #5582f3));
283
+ }
284
+ .kd-tree-node-title-wrap-selected .kd-tree-node-icon {
285
+ color: var(--kd-c-tree-node-color-text-checked, var(--kd-g-color-theme, #5582f3));
236
286
  }
237
287
  .kd-tree-node-title {
238
288
  white-space: nowrap;
239
- margin-left: 6px;
240
289
  }
241
290
  .kd-tree-node-selected {
242
291
  background-color: var(--kd-c-tree-node-color-backgroung-checked, var(--kd-g-color-theme-3, #e3eeff)) !important;
@@ -285,8 +334,8 @@
285
334
  transform: translateY(-50%);
286
335
  }
287
336
  .kd-tree-node-leaf-icon {
288
- height: var(--kd-c-tree-node-icon-sizing-height, 20px);
289
- width: var(--kd-c-tree-node-icon-sizing-width, 20px);
337
+ height: var(--kd-c-tree-node-icon-sizing-height, 16px);
338
+ width: var(--kd-c-tree-node-icon-sizing-width, 16px);
290
339
  display: -webkit-box;
291
340
  display: -ms-flexbox;
292
341
  display: flex;
@@ -28,6 +28,17 @@
28
28
  display: flex;
29
29
  justify-content: flex-start;
30
30
  align-items: center;
31
+
32
+ .@{kd-prefix}-spin-dot-spin {
33
+ border: none;
34
+ width: @tree-expand-icon-loading-width;
35
+ height: @tree-expand-icon-loading-height;
36
+
37
+ .@{kd-prefix}-spin-dot-item {
38
+ width: @tree-expand-icon-loading-width;
39
+ height: @tree-expand-icon-loading-height;
40
+ }
41
+ }
31
42
  }
32
43
  &-fb-children-pointerEvents * {
33
44
  pointer-events: none;
@@ -35,13 +46,8 @@
35
46
  &-item {
36
47
  display: flex;
37
48
  align-items: center;
38
- }
39
- &-item-hover {
40
- transition: background-color @tree-transition-duration, color @tree-transition-duration;
41
- }
42
- &-item-hover:hover {
43
- background-color: @tree-node-hover-bg-color;
44
- cursor: pointer;
49
+
50
+ .node-hover()
45
51
  }
46
52
 
47
53
  &-indent {
@@ -70,6 +76,11 @@
70
76
  align-items: center;
71
77
  font-size: @tree-node-icon-size;
72
78
  color: @tree-node-icon-color-text;
79
+
80
+ &-hover:hover {
81
+ background-color: @tree-node-hover-bg-color;
82
+ cursor: pointer;
83
+ }
73
84
  }
74
85
  &-icon-hidden {
75
86
  height: @tree-node-icon-height;
@@ -99,22 +110,19 @@
99
110
  display: flex;
100
111
  align-items: center;
101
112
  height: 100%;
113
+ padding-left: 4px;
114
+
115
+ .node-hover();
116
+
117
+ &-selected {
118
+ .node-selected()
119
+ }
102
120
  }
103
121
  &-title {
104
122
  white-space: nowrap;
105
- margin-left: 6px;
106
123
  }
107
124
  &-selected {
108
- background-color: @tree-node-checked-bg-color !important;
109
- color: @tree-node-checked-text-color;
110
-
111
- .@{tree-node-prefix-cls}-title {
112
- color: @tree-node-checked-text-color;
113
- }
114
-
115
- .@{tree-node-prefix-cls}-icon {
116
- color: @tree-node-checked-text-color;
117
- }
125
+ .node-selected()
118
126
  }
119
127
 
120
128
  &-draggabled {
@@ -1 +1,25 @@
1
- @import './token.less';
1
+ @import './token.less';
2
+
3
+ .node-hover {
4
+ &-hover {
5
+ transition: background-color @tree-transition-duration, color @tree-transition-duration;
6
+
7
+ &:hover {
8
+ background-color: @tree-node-hover-bg-color;
9
+ cursor: pointer;
10
+ }
11
+ }
12
+ }
13
+
14
+ .node-selected {
15
+ background-color: @tree-node-checked-bg-color !important;
16
+ color: @tree-node-checked-text-color;
17
+
18
+ .@{tree-node-prefix-cls}-title {
19
+ color: @tree-node-checked-text-color;
20
+ }
21
+
22
+ .@{tree-node-prefix-cls}-icon {
23
+ color: @tree-node-checked-text-color;
24
+ }
25
+ }
@@ -16,10 +16,12 @@
16
16
  @tree-node-drag-line-border-color: var(~'@{tree-prefix}-node-drag-line-color-background', #276FF5);
17
17
 
18
18
  // sizing
19
- @tree-expand-icon-height: var(~'@{tree-prefix}-expand-icon-sizing-height', 22px);
20
- @tree-expand-icon-width: var(~'@{tree-prefix}-expand-icon-sizing-width', 22px);
21
- @tree-node-icon-height: var(~'@{tree-prefix}-node-icon-sizing-height', 20px);
22
- @tree-node-icon-width: var(~'@{tree-prefix}-node-icon-sizing-width', 20px);
19
+ @tree-expand-icon-height: var(~'@{tree-prefix}-expand-icon-sizing-height', 16px);
20
+ @tree-expand-icon-width: var(~'@{tree-prefix}-expand-icon-sizing-width', 16px);
21
+ @tree-expand-icon-loading-height: var(~'@{tree-prefix}-expand-icon-loading-sizing-height', 16px);
22
+ @tree-expand-icon-loading-width: var(~'@{tree-prefix}-expand-icon-loading-sizing-width', 16px);
23
+ @tree-node-icon-height: var(~'@{tree-prefix}-node-icon-sizing-height', 16px);
24
+ @tree-node-icon-width: var(~'@{tree-prefix}-node-icon-sizing-width', 16px);
23
25
 
24
26
  // font
25
27
  @tree-font-size: var(~'@{tree-prefix}-font-size', @font-size-small);
package/es/tree/tree.d.ts CHANGED
@@ -24,6 +24,7 @@ export interface TreeProps {
24
24
  virtual?: boolean;
25
25
  scrollToKey?: string;
26
26
  selectedKeys?: string[];
27
+ loadData?: () => void;
27
28
  onCheck?: (checkedKeys: string[], { checked, node, event, halfCheckedKeys }: any) => void;
28
29
  onExpand?: (expandedKeys: string[], { expanded, node }: any) => void;
29
30
  onSelect?: ({ checked, node, event }: any) => void;
@@ -36,6 +37,7 @@ export interface TreeProps {
36
37
  setTreeNodeClassName?: (node: any) => string;
37
38
  setTreeNodeStyle?: (node: any) => Map<string, string>;
38
39
  estimatedItemSize?: number;
40
+ expandOnClickNode?: boolean;
39
41
  }
40
42
  export declare type TreeNodeData = {
41
43
  checkable?: boolean;
package/es/tree/tree.js CHANGED
@@ -2,15 +2,17 @@ import _extends from "@babel/runtime-corejs3/helpers/extends";
2
2
  import _toConsumableArray from "@babel/runtime-corejs3/helpers/toConsumableArray";
3
3
  import _slicedToArray from "@babel/runtime-corejs3/helpers/slicedToArray";
4
4
  import _defineProperty from "@babel/runtime-corejs3/helpers/defineProperty";
5
- import _Object$keys from "@babel/runtime-corejs3/core-js-stable/object/keys";
5
+ import _Set from "@babel/runtime-corejs3/core-js-stable/set";
6
6
  import _concatInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/concat";
7
+ import _Object$keys from "@babel/runtime-corejs3/core-js-stable/object/keys";
7
8
  import _mapInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/map";
8
9
  import React, { useContext, useCallback, useEffect } from 'react';
9
10
  import classNames from 'classnames';
11
+ import cloneDeep from 'lodash/cloneDeep';
10
12
  import ConfigContext from '../config-provider/ConfigContext';
11
13
  import { getCompProps } from '../_utils';
12
14
  import TreeNode from './treeNode';
13
- import { getChecked, getHalfChecked, addKeys, flattenAll, delKey, getFilterData, getSpreadAttrData, getDataCheckededState, getDataCheckededStateStrictly, getMaxLevel, getAllChildKeys, getPos, getSelected, calcDropPosition } from './utils/treeUtils';
15
+ import { getChecked, getHalfChecked, addKeys, flattenAll, delKey, getFilterData, getSpreadAttrData, getDataCheckededState, getDataCheckededStateStrictly, getAllChildKeys, getPos, getSelected, calcDropPosition } from './utils/treeUtils';
14
16
  import { useChecked, useExpand, usePlantomHeightEffect, useViewportHeight, useVisibleDataMemo, useScrollToKey, useSelect } from './treeHooks';
15
17
  import isBoolean from 'lodash/isBoolean';
16
18
  var InternalTree = /*#__PURE__*/React.forwardRef(function (props, ref) {
@@ -62,7 +64,9 @@ var InternalTree = /*#__PURE__*/React.forwardRef(function (props, ref) {
62
64
  innerEstimatedItemSize = TreeProps.estimatedItemSize,
63
65
  style = TreeProps.style,
64
66
  filterTreeNode = TreeProps.filterTreeNode,
65
- filterValue = TreeProps.filterValue;
67
+ filterValue = TreeProps.filterValue,
68
+ expandOnClickNode = TreeProps.expandOnClickNode,
69
+ loadData = TreeProps.loadData;
66
70
  var treePrefixCls = getPrefixCls(prefixCls, 'tree', customPrefixcls); // 树样式前缀
67
71
 
68
72
  var treeNodePrefixCls = getPrefixCls(prefixCls, 'tree-node', customPrefixcls); // 树节点样式前缀
@@ -71,12 +75,11 @@ var InternalTree = /*#__PURE__*/React.forwardRef(function (props, ref) {
71
75
  var treeRootClassName = "".concat(treePrefixCls, "-root");
72
76
  var estimatedItemSize = innerEstimatedItemSize; // 节点高度
73
77
 
74
- var flattenAllData = React.useMemo(function () {
78
+ var _React$useMemo = React.useMemo(function () {
75
79
  return flattenAll(treeData, []);
76
- }, [treeData]);
77
- var maxLevel = React.useMemo(function () {
78
- return getMaxLevel(flattenAllData);
79
- }, [flattenAllData]);
80
+ }, [treeData]),
81
+ flattenAllData = _React$useMemo.flattenAllData,
82
+ maxLevel = _React$useMemo.maxLevel;
80
83
 
81
84
  var _useChecked = useChecked(checkStrictly, checkedKeysProps, defaultCheckedKeys, flattenAllData, maxLevel, checkable),
82
85
  _useChecked2 = _slicedToArray(_useChecked, 4),
@@ -123,7 +126,21 @@ var InternalTree = /*#__PURE__*/React.forwardRef(function (props, ref) {
123
126
  dragOverNodeKey = _React$useState10[0],
124
127
  setDragOverNodeKey = _React$useState10[1];
125
128
 
126
- var _useExpand = useExpand(flattenAllData, expandedKeysProps, defaultExpandedKeys, defaultExpandAll, defaultExpandRoot, defaultExpandParent, scrollKey, isInit, filterTreeNode, filterValue),
129
+ var _React$useState11 = React.useState(new _Set()),
130
+ _React$useState12 = _slicedToArray(_React$useState11, 2),
131
+ loadedKeys = _React$useState12[0],
132
+ setLoadedKeys = _React$useState12[1];
133
+
134
+ var _React$useState13 = React.useState(new _Set()),
135
+ _React$useState14 = _slicedToArray(_React$useState13, 2),
136
+ loadingKeys = _React$useState14[0],
137
+ setLoadingKeys = _React$useState14[1];
138
+
139
+ var isSearching = React.useMemo(function () {
140
+ return typeof filterTreeNode === 'function' && filterValue;
141
+ }, [filterValue]);
142
+
143
+ var _useExpand = useExpand(flattenAllData, expandedKeysProps, defaultExpandedKeys, defaultExpandAll, defaultExpandRoot, defaultExpandParent, scrollKey, isInit, filterTreeNode, isSearching),
127
144
  _useExpand2 = _slicedToArray(_useExpand, 2),
128
145
  expandedKeys = _useExpand2[0],
129
146
  setExpandedKeys = _useExpand2[1];
@@ -132,8 +149,8 @@ var InternalTree = /*#__PURE__*/React.forwardRef(function (props, ref) {
132
149
  return getSpreadAttrData(flattenAllData, expandedKeys);
133
150
  }, [flattenAllData, expandedKeys]);
134
151
  var filterData = React.useMemo(function () {
135
- return getFilterData(spreadAttrData, filterTreeNode, filterValue);
136
- }, [spreadAttrData, filterTreeNode, filterValue]);
152
+ return getFilterData(spreadAttrData, filterTreeNode, isSearching);
153
+ }, [spreadAttrData, isSearching]);
137
154
 
138
155
  var _useViewportHeight = useViewportHeight(height, listRef),
139
156
  _useViewportHeight2 = _slicedToArray(_useViewportHeight, 1),
@@ -167,15 +184,54 @@ var InternalTree = /*#__PURE__*/React.forwardRef(function (props, ref) {
167
184
  listRef.current.style.transform = "translate3d(0,".concat(tempStartOffset, "px,0)");
168
185
  }
169
186
  }, [listRef, scrollRef, virtual, estimatedItemSize]);
170
- var handleExpand = React.useCallback(function (key, value, node) {
171
- var newExpandedKeys = value ? addKeys(expandedKeys, [key]) : delKey(expandedKeys, [key]);
187
+ var handleNodeLoad = useCallback(function (loadedKeys, loadingKeys, data) {
188
+ var key = data.key;
189
+
190
+ if (!loadData || loadedKeys.has(key) || loadingKeys.has(key)) {
191
+ return;
192
+ }
193
+
194
+ setLoadingKeys(function (prevLoadingKeys) {
195
+ var _context;
196
+
197
+ return new _Set(_concatInstanceProperty(_context = []).call(_context, _toConsumableArray(prevLoadingKeys), [key]));
198
+ });
199
+ loadData(data).then(function () {
200
+ setLoadedKeys(function (prevState) {
201
+ var _context2;
202
+
203
+ return new _Set(_concatInstanceProperty(_context2 = []).call(_context2, _toConsumableArray(prevState), [key]));
204
+ });
205
+ setLoadingKeys(function (prevState) {
206
+ var prevLoadingKeys = cloneDeep(prevState);
207
+ prevLoadingKeys.delete(key);
208
+ return prevLoadingKeys;
209
+ });
210
+ }).catch(function (e) {
211
+ setLoadingKeys(function (prevState) {
212
+ var prevLoadingKeys = cloneDeep(prevState);
213
+ prevLoadingKeys.delete(key);
214
+ return prevLoadingKeys;
215
+ });
216
+ setExpandedKeys(function (preExpandedKeys) {
217
+ return delKey(_toConsumableArray(preExpandedKeys), [key]);
218
+ });
219
+ throw e;
220
+ });
221
+ }, [loadData, setExpandedKeys]);
222
+ var handleExpand = React.useCallback(function (key, expanded, node) {
223
+ var newExpandedKeys = expanded ? addKeys(expandedKeys, [key]) : delKey(expandedKeys, [key]);
172
224
  onExpand && onExpand(newExpandedKeys, {
173
225
  node: node,
174
- expanded: value
226
+ expanded: expanded
175
227
  });
176
228
  setScrollKey('');
177
229
  setIsInit(false);
178
- }, [expandedKeys, onExpand]);
230
+
231
+ if (expanded && loadData) {
232
+ handleNodeLoad(loadedKeys, loadingKeys, node);
233
+ }
234
+ }, [expandedKeys, onExpand, loadData, handleNodeLoad, loadedKeys, loadingKeys]);
179
235
  var handleCheck = React.useCallback(function (key, value, node, event, pos) {
180
236
  var newCheckedKeys = value ? addKeys(checkedKeys, [key]) : delKey(checkedKeys, [key]);
181
237
  var checkState = checkStrictly ? getDataCheckededStateStrictly(newCheckedKeys) : getDataCheckededState(spreadAttrData, newCheckedKeys, halfCheckedKeys, maxLevel, false, pos, value);
@@ -264,11 +320,11 @@ var InternalTree = /*#__PURE__*/React.forwardRef(function (props, ref) {
264
320
  });
265
321
  }, [onDragEnd]);
266
322
  var handleDrop = React.useCallback(function (event, node, dragNode, dragNodesKeys) {
267
- var _context;
323
+ var _context3;
268
324
 
269
325
  var pos = getPos(flattenAllData, dragNodesKeys);
270
326
 
271
- var keys = _concatInstanceProperty(_context = getAllChildKeys(flattenAllData, pos)).call(_context, dragNodesKeys);
327
+ var keys = _concatInstanceProperty(_context3 = getAllChildKeys(flattenAllData, pos)).call(_context3, dragNodesKeys);
272
328
 
273
329
  onDrop && onDrop({
274
330
  event: event,
@@ -334,7 +390,6 @@ var InternalTree = /*#__PURE__*/React.forwardRef(function (props, ref) {
334
390
  className: treeRootClassName,
335
391
  ref: listRef
336
392
  }, visibleData && _mapInstanceProperty(visibleData).call(visibleData, function (item) {
337
- // const props: any = {}
338
393
  var checked = getChecked(checkedKeys, item.key);
339
394
  var indeterminate = getHalfChecked(halfCheckedKeys, item.key);
340
395
  item.nodeKey = item.key;
@@ -349,8 +404,7 @@ var InternalTree = /*#__PURE__*/React.forwardRef(function (props, ref) {
349
404
  item.onSelect = handleSelect;
350
405
  item.checked = checked;
351
406
  item.selected = getSelected(selectedKeys, item.key);
352
- item.indeterminate = indeterminate; // item.showLine = showLine
353
-
407
+ item.indeterminate = indeterminate;
354
408
  item.disabled = getDisabled(disabled, item.disabled);
355
409
  item.showIcon = showIcon || false;
356
410
  item.checkable = getCheckable(checkable, item.checkable); // 哪个优先
@@ -365,6 +419,9 @@ var InternalTree = /*#__PURE__*/React.forwardRef(function (props, ref) {
365
419
  item.getDragNode = getDragNode;
366
420
  item.setDragNode = setDragNode;
367
421
  item.dragOver = dragOverNodeKey === item.key && dropPosition === 0;
422
+ item.expandOnClickNode = expandOnClickNode;
423
+ item.loading = loadingKeys.has(item.key) && !loadedKeys.has(item.key);
424
+ item.loadData = loadData;
368
425
  return /*#__PURE__*/React.createElement(TreeNode, _extends({}, item, {
369
426
  key: item.key,
370
427
  ref: treeNodeRef
@@ -4,6 +4,6 @@ export declare const useViewportHeight: (height: number, listRef: React.RefObjec
4
4
  export declare const useVisibleDataMemo: (virtual: boolean, filterData: TreeNodeData[], viewportHeight: number, estimatedItemSize: number, start: number) => TreeNodeData[][];
5
5
  export declare const usePlantomHeightEffect: (plantomRef: React.RefObject<HTMLElement>, filterData: TreeNodeData[], estimatedItemSize: number) => void;
6
6
  export declare const useChecked: (checkStrictly: boolean, checkedKeysProps: string[], defaultCheckedKeys: string[], flattenAllData: any[], maxLevel: number, checkable: boolean) => readonly [string[], string[], React.Dispatch<React.SetStateAction<string[]>>, React.Dispatch<React.SetStateAction<string[]>>];
7
- export declare const useExpand: (flattenAllData: any[], expandedKeysProps: string[], defaultExpandedKeys: string[], defaultExpandAll: boolean, defaultExpandRoot: boolean, defaultExpandParent: boolean, scrollKey: string, isInit: boolean, filterTreeNode: FunctionConstructor, filterValue: string) => readonly [string[], React.Dispatch<React.SetStateAction<string[]>>];
7
+ export declare const useExpand: (flattenAllData: any[], expandedKeysProps: string[], defaultExpandedKeys: string[], defaultExpandAll: boolean, defaultExpandRoot: boolean, defaultExpandParent: boolean, scrollKey: string, isInit: boolean, filterTreeNode: FunctionConstructor, isSearching: boolean) => readonly [string[], React.Dispatch<React.SetStateAction<string[]>>];
8
8
  export declare const useScrollToKey: (scrollKey: string, index: number, estimatedItemSize: number, scrollRef: any, viewportHeight: number, treeNodePrefixCls: string) => void;
9
9
  export declare const useSelect: (selectedKeysProps: string[], defaultSelectedKeys: string[]) => readonly [string[], React.Dispatch<React.SetStateAction<string[]>>];
@@ -64,7 +64,7 @@ export var useChecked = function useChecked(checkStrictly, checkedKeysProps, def
64
64
  }, [nextHalfCheckedKeys]);
65
65
  return [checkedKeys, halfCheckedKeys, setCheckedKeys, setHalfCheckedKeys];
66
66
  };
67
- export var useExpand = function useExpand(flattenAllData, expandedKeysProps, defaultExpandedKeys, defaultExpandAll, defaultExpandRoot, defaultExpandParent, scrollKey, isInit, filterTreeNode, filterValue) {
67
+ export var useExpand = function useExpand(flattenAllData, expandedKeysProps, defaultExpandedKeys, defaultExpandAll, defaultExpandRoot, defaultExpandParent, scrollKey, isInit, filterTreeNode, isSearching) {
68
68
  var expandScrollkeys = [];
69
69
 
70
70
  if (scrollKey) {
@@ -73,8 +73,8 @@ export var useExpand = function useExpand(flattenAllData, expandedKeysProps, def
73
73
  }
74
74
 
75
75
  var initialExpandedKeys = React.useMemo(function () {
76
- return getInitExpandedKeys(flattenAllData, expandedKeysProps, defaultExpandedKeys, defaultExpandAll, defaultExpandRoot, defaultExpandParent, expandScrollkeys, filterTreeNode, filterValue);
77
- }, [flattenAllData, expandedKeysProps, defaultExpandedKeys, defaultExpandAll, defaultExpandRoot, defaultExpandParent, scrollKey, filterTreeNode, filterValue]);
76
+ return getInitExpandedKeys(flattenAllData, expandedKeysProps, defaultExpandedKeys, defaultExpandAll, defaultExpandRoot, defaultExpandParent, expandScrollkeys, filterTreeNode, isSearching);
77
+ }, [flattenAllData, expandedKeysProps, defaultExpandedKeys, defaultExpandAll, defaultExpandRoot, defaultExpandParent, scrollKey, filterTreeNode, isSearching]);
78
78
  var newExpandedKeys = React.useMemo(function () {
79
79
  return getExpandedKeys(expandedKeysProps, expandScrollkeys);
80
80
  }, [expandedKeysProps]);
@@ -112,7 +112,6 @@ export var useScrollToKey = function useScrollToKey(scrollKey, index, estimatedI
112
112
  }
113
113
 
114
114
  if (treeRoot && treeNode) {
115
- // const treeRootScrollTop = treeRoot.scrollTop
116
115
  var treeRootRect = treeRoot.getBoundingClientRect();
117
116
  var treeNodeRect = treeNode.getBoundingClientRect();
118
117
 
@@ -25,6 +25,7 @@ export interface TreeNodeProps {
25
25
  pos?: string;
26
26
  estimatedItemSize?: number;
27
27
  dragOver?: boolean;
28
+ isLeaf?: boolean;
28
29
  onCheck?: (key: string, value: boolean, node: React.ReactNode, event: React.MouseEvent<MouseEvent>, pos: string) => void;
29
30
  onSelect?: (event: React.MouseEvent<MouseEvent>, node: React.ReactNode, key: string) => void;
30
31
  onExpand?: (value: boolean, node: React.ReactNode) => void;
@@ -17,12 +17,13 @@ var __rest = this && this.__rest || function (s, e) {
17
17
  return t;
18
18
  };
19
19
 
20
- import React, { useContext, useEffect } from 'react';
20
+ import React, { useCallback, useContext, useEffect } from 'react';
21
21
  import classNames from 'classnames';
22
22
  import ConfigContext from '../config-provider/ConfigContext';
23
23
  import { getCompProps } from '../_utils';
24
24
  import Checkbox from './../checkbox';
25
25
  import Icon from '../icon';
26
+ import Spin from '../spin';
26
27
  var TreeNode = /*#__PURE__*/React.forwardRef(function (props, ref) {
27
28
  var _context;
28
29
 
@@ -57,6 +58,8 @@ var TreeNode = /*#__PURE__*/React.forwardRef(function (props, ref) {
57
58
  indeterminate = TreeNodeProps.indeterminate,
58
59
  estimatedItemSize = TreeNodeProps.estimatedItemSize,
59
60
  dragOver = TreeNodeProps.dragOver,
61
+ expandOnClickNode = TreeNodeProps.expandOnClickNode,
62
+ loading = TreeNodeProps.loading,
60
63
  onExpand = TreeNodeProps.onExpand,
61
64
  onCheck = TreeNodeProps.onCheck,
62
65
  onDragStart = TreeNodeProps.onDragStart,
@@ -66,7 +69,7 @@ var TreeNode = /*#__PURE__*/React.forwardRef(function (props, ref) {
66
69
  onDragEnd = TreeNodeProps.onDragEnd,
67
70
  onDrop = TreeNodeProps.onDrop,
68
71
  onSelect = TreeNodeProps.onSelect,
69
- others = __rest(TreeNodeProps, ["nodeKey", "prefixCls", "selectable", "checkable", "className", "icon", "switcherIcon", "disabled", "draggable", "pos", "checked", "level", "getDragNode", "hasChildNode", "expand", "title", "showLine", "showIcon", "selected", "setDragNode", "style", "indeterminate", "estimatedItemSize", "dragOver", "onExpand", "onCheck", "onDragStart", "onDragOver", "onDragLeave", "onDragEnter", "onDragEnd", "onDrop", "onSelect"]);
72
+ others = __rest(TreeNodeProps, ["nodeKey", "prefixCls", "selectable", "checkable", "className", "icon", "switcherIcon", "disabled", "draggable", "pos", "checked", "level", "getDragNode", "hasChildNode", "expand", "title", "showLine", "showIcon", "selected", "setDragNode", "style", "indeterminate", "estimatedItemSize", "dragOver", "expandOnClickNode", "loading", "onExpand", "onCheck", "onDragStart", "onDragOver", "onDragLeave", "onDragEnter", "onDragEnd", "onDrop", "onSelect"]);
70
73
 
71
74
  var nodeData = React.useMemo(function () {
72
75
  return _extends({
@@ -84,7 +87,6 @@ var TreeNode = /*#__PURE__*/React.forwardRef(function (props, ref) {
84
87
  indeterminate: indeterminate,
85
88
  icon: icon,
86
89
  switcherIcon: switcherIcon,
87
- // showLine,
88
90
  showIcon: showIcon,
89
91
  selected: selected
90
92
  }, others);
@@ -166,57 +168,46 @@ var TreeNode = /*#__PURE__*/React.forwardRef(function (props, ref) {
166
168
  }
167
169
 
168
170
  return indentArr;
169
- }; // line的两种模式, 图标被替换和图标不被替换
171
+ };
172
+
173
+ var isLeaf = useCallback(function () {
174
+ var isLeaf = TreeNodeProps.isLeaf,
175
+ loadData = TreeNodeProps.loadData,
176
+ hasChildNode = TreeNodeProps.hasChildNode;
177
+
178
+ if (isLeaf === false) {
179
+ return false;
180
+ }
170
181
 
182
+ return isLeaf || !loadData && !hasChildNode;
183
+ }, [TreeNodeProps]); // line的两种模式, 图标被替换和图标不被替换
171
184
 
172
185
  var renderExpandIcon = function renderExpandIcon() {
173
- // todo 图标被替换则 line样式改变
174
- // if(switcherIcon){
175
- // }
176
- if (hasChildNode) {
177
- var _classNames2;
178
-
179
- // todo showLine模式 使用+ -符号图标
180
- // if(!!showLine){
181
- // return (
182
- // <span
183
- // onClick={handleClick}
184
- // className={classNames(`${treeNodePrefixCls}-icon`)}
185
- // >
186
- // {expand ? <Icon type='search' /> : <Icon type='add' />}
187
- // </span>
188
- // )
189
- // }
186
+ if (loading) {
187
+ return /*#__PURE__*/React.createElement(Spin, {
188
+ type: "component"
189
+ });
190
+ }
191
+
192
+ var showExpandIcon = !isLeaf();
193
+
194
+ if (showExpandIcon) {
195
+ var _classNames3;
196
+
190
197
  if (Array.isArray(switcherIcon) && switcherIcon.length === 2) {
191
198
  return /*#__PURE__*/React.createElement("span", {
192
- className: classNames("".concat(treeNodePrefixCls, "-icon"))
199
+ className: classNames("".concat(treeNodePrefixCls, "-icon"), _defineProperty({}, "".concat(treeNodePrefixCls, "-icon-hover"), !expandOnClickNode)),
200
+ onClick: expandOnClickNode ? undefined : handleExpandIconClick
193
201
  }, expandState ? renderIcon(switcherIcon[1]) : renderIcon(switcherIcon[0]));
194
202
  }
195
203
 
196
204
  return /*#__PURE__*/React.createElement("span", {
197
- className: classNames("".concat(treeNodePrefixCls, "-icon"), (_classNames2 = {}, _defineProperty(_classNames2, "".concat(treeNodePrefixCls, "-animation-expand"), expandState), _defineProperty(_classNames2, "".concat(treeNodePrefixCls, "-animation-collapse"), !expandState), _classNames2))
205
+ className: classNames("".concat(treeNodePrefixCls, "-icon"), (_classNames3 = {}, _defineProperty(_classNames3, "".concat(treeNodePrefixCls, "-animation-expand"), expandState), _defineProperty(_classNames3, "".concat(treeNodePrefixCls, "-animation-collapse"), !expandState), _defineProperty(_classNames3, "".concat(treeNodePrefixCls, "-icon-hover"), !expandOnClickNode), _classNames3)),
206
+ onClick: expandOnClickNode ? undefined : handleExpandIconClick
198
207
  }, renderIcon(switcherIcon || /*#__PURE__*/React.createElement(Icon, {
199
208
  type: "arrow-right-solid"
200
209
  })));
201
210
  } else {
202
- // if(typeof showLine === 'object' && !showLine.showLeafIcon){
203
- // return (
204
- // <span
205
- // className={classNames(`${treeNodePrefixCls}-icon-hidden`)}
206
- // >
207
- // {/* todo renderLeafLine() */}
208
- // {renderIcon(leafIcon)}
209
- // </span>
210
- // )
211
- // }else if(typeof showLine === 'object' && showLine.showLeafIcon || showLine === true){
212
- // return (
213
- // <span
214
- // className={classNames(`${treeNodePrefixCls}-leaf-icon`)}
215
- // >
216
- // {renderIcon(leafIcon)}
217
- // </span>
218
- // )
219
- // }
220
211
  // 叶子结点 隐藏展开按钮
221
212
  return /*#__PURE__*/React.createElement("span", {
222
213
  className: "".concat(treeNodePrefixCls, "-icon-hidden")
@@ -231,11 +222,11 @@ var TreeNode = /*#__PURE__*/React.forwardRef(function (props, ref) {
231
222
  };
232
223
 
233
224
  var renderNode = function renderNode() {
234
- var _classNames3;
225
+ var _classNames4, _classNames5;
235
226
 
236
227
  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
237
228
  draggable: draggable && !disabled,
238
- className: classNames((_classNames3 = {}, _defineProperty(_classNames3, "".concat(treeNodePrefixCls, "-draggabled"), true), _defineProperty(_classNames3, "".concat(treeNodePrefixCls, "-root"), true), _defineProperty(_classNames3, "".concat(treeNodePrefixCls, "-fb-children-pointerEvents"), forbiddenChildrenPointerEvents), _defineProperty(_classNames3, "".concat(treeNodePrefixCls, "-drag-over"), dragOver), _classNames3)),
229
+ className: classNames((_classNames4 = {}, _defineProperty(_classNames4, "".concat(treeNodePrefixCls, "-draggabled"), true), _defineProperty(_classNames4, "".concat(treeNodePrefixCls, "-root"), true), _defineProperty(_classNames4, "".concat(treeNodePrefixCls, "-fb-children-pointerEvents"), forbiddenChildrenPointerEvents), _defineProperty(_classNames4, "".concat(treeNodePrefixCls, "-drag-over"), dragOver), _classNames4)),
239
230
  onDragStart: handleDragStart,
240
231
  onDragEnd: handleDragEnd,
241
232
  onDragOver: handleDragOver,
@@ -244,7 +235,8 @@ var TreeNode = /*#__PURE__*/React.forwardRef(function (props, ref) {
244
235
  onDrop: handleDrop,
245
236
  ref: dragRef
246
237
  }, indent(), renderExpandIcon(), showIcon && renderNodeIcon(), /*#__PURE__*/React.createElement("div", {
247
- className: "".concat(treeNodePrefixCls, "-title-wrap")
238
+ className: classNames((_classNames5 = {}, _defineProperty(_classNames5, "".concat(treeNodePrefixCls, "-title-wrap"), true), _defineProperty(_classNames5, "".concat(treeNodePrefixCls, "-title-wrap-hover"), !expandOnClickNode && !disabled), _defineProperty(_classNames5, "".concat(treeNodePrefixCls, "-title-wrap-selected"), selected && selectable && !disabled && !expandOnClickNode), _classNames5)),
239
+ onClick: expandOnClickNode ? undefined : handleClick
248
240
  }, checkable ? /*#__PURE__*/React.createElement(Checkbox, {
249
241
  onChange: handleOnchange,
250
242
  checked: checked,
@@ -271,12 +263,16 @@ var TreeNode = /*#__PURE__*/React.forwardRef(function (props, ref) {
271
263
  selectNode: handleSelect
272
264
  };
273
265
  });
274
- var handleClick = React.useCallback(function (e) {
275
- e.stopPropagation();
266
+ var handleExpandIconClick = useCallback(function (e) {
267
+ e === null || e === void 0 ? void 0 : e.stopPropagation();
276
268
  setExpandState(!expandState);
277
269
  onExpand && onExpand(nodeKey, !expandState, nodeData);
270
+ }, [expandState, nodeData, nodeKey, onExpand, setExpandState]);
271
+ var handleClick = React.useCallback(function (e) {
272
+ e.stopPropagation();
273
+ expandOnClickNode && handleExpandIconClick();
278
274
  handleSelect(e);
279
- }, [setExpandState, expandState, onExpand, nodeKey, nodeData, handleSelect]);
275
+ }, [expandOnClickNode, handleExpandIconClick, handleSelect]);
280
276
  var handleDragStart = React.useCallback(function (e) {
281
277
  if (!draggable) return;
282
278
  setDragNode(nodeData);
@@ -325,11 +321,11 @@ var TreeNode = /*#__PURE__*/React.forwardRef(function (props, ref) {
325
321
  }
326
322
  }, [onDrop, nodeData, nodeKey]);
327
323
  return /*#__PURE__*/React.createElement("div", {
328
- className: classNames("".concat(treeNodePrefixCls, "-item"), _defineProperty({}, "".concat(treeNodePrefixCls, "-item-hover"), !disabled && selectable), _defineProperty({}, "".concat(treeNodePrefixCls, "-selected"), selected && selectable && !disabled), _defineProperty({}, "".concat(treeNodePrefixCls, "-disabled"), disabled), _defineProperty({}, "".concat(treeNodePrefixCls, "-opened"), expandState), _concatInstanceProperty(_context = "".concat(treeNodePrefixCls, "-item-")).call(_context, nodeKey), className),
324
+ className: classNames("".concat(treeNodePrefixCls, "-item"), _defineProperty({}, "".concat(treeNodePrefixCls, "-item-hover"), !disabled && selectable && expandOnClickNode), _defineProperty({}, "".concat(treeNodePrefixCls, "-selected"), selected && selectable && !disabled && expandOnClickNode), _defineProperty({}, "".concat(treeNodePrefixCls, "-disabled"), disabled), _defineProperty({}, "".concat(treeNodePrefixCls, "-opened"), expandState), _concatInstanceProperty(_context = "".concat(treeNodePrefixCls, "-item-")).call(_context, nodeKey), className),
329
325
  style: _extends({
330
326
  height: "".concat(estimatedItemSize, "px")
331
327
  }, style),
332
- onClick: handleClick
328
+ onClick: expandOnClickNode ? handleClick : undefined
333
329
  }, renderNode());
334
330
  });
335
331
  TreeNode.displayName = 'TreeNode';