tntd 3.0.9-beta.3 → 3.0.10

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 (38) hide show
  1. package/es/array-input/index.js +3 -1
  2. package/es/array-input/index.js.map +1 -1
  3. package/es/index.js +1 -1
  4. package/es/index.js.map +1 -1
  5. package/es/query-list-scene/QueryForm.js +3 -6
  6. package/es/query-list-scene/QueryForm.js.map +1 -1
  7. package/es/title/index.js +18 -4
  8. package/es/title/index.js.map +1 -1
  9. package/es/title/index.less +85 -34
  10. package/es/tntd-virtual-tree/index.js +51 -42
  11. package/es/tntd-virtual-tree/index.js.map +1 -1
  12. package/es/tntd-virtual-tree/index.less +29 -16
  13. package/es/tntd-virtual-tree/utils.js +117 -58
  14. package/es/tntd-virtual-tree/utils.js.map +1 -1
  15. package/lib/array-input/index.js +5 -1
  16. package/lib/array-input/index.js.map +1 -1
  17. package/lib/index.d.ts +1 -1
  18. package/lib/index.d.ts.map +1 -1
  19. package/lib/index.js +2 -2
  20. package/lib/index.js.map +1 -1
  21. package/lib/query-list-scene/QueryForm.d.ts +2 -2
  22. package/lib/query-list-scene/QueryForm.d.ts.map +1 -1
  23. package/lib/query-list-scene/QueryForm.js +8 -10
  24. package/lib/query-list-scene/QueryForm.js.map +1 -1
  25. package/lib/title/index.d.ts +1 -0
  26. package/lib/title/index.d.ts.map +1 -1
  27. package/lib/title/index.js +18 -4
  28. package/lib/title/index.js.map +1 -1
  29. package/lib/title/index.less +85 -34
  30. package/lib/tntd-virtual-tree/index.d.ts.map +1 -1
  31. package/lib/tntd-virtual-tree/index.js +55 -45
  32. package/lib/tntd-virtual-tree/index.js.map +1 -1
  33. package/lib/tntd-virtual-tree/index.less +29 -16
  34. package/lib/tntd-virtual-tree/utils.d.ts +6 -4
  35. package/lib/tntd-virtual-tree/utils.d.ts.map +1 -1
  36. package/lib/tntd-virtual-tree/utils.js +130 -66
  37. package/lib/tntd-virtual-tree/utils.js.map +1 -1
  38. package/package.json +1 -1
@@ -4,7 +4,7 @@ import _uniq from "lodash/uniq";
4
4
  * @Author: 郑泳健
5
5
  * @Date: 2024-07-31 14:46:55
6
6
  * @LastEditors: 郑泳健
7
- * @LastEditTime: 2024-08-08 16:22:40
7
+ * @LastEditTime: 2024-08-09 17:51:50
8
8
  */
9
9
  import React, { useState, useMemo, useEffect, useRef } from 'react';
10
10
  import List from 'rc-virtual-list';
@@ -12,7 +12,7 @@ import Icon from '../icon';
12
12
  import Ellipsis from '../ellipsis';
13
13
  import Empty from '../empty';
14
14
  import Checkbox from '../checkbox';
15
- import { flatTreeData, getFullExpandedKeys, getFullCheckedKeys, getNodeParentChoosed, addTreeNodeAttrs, getIndeterminate } from './utils';
15
+ import { flatTreeData, findNodeDetail, getFullExpandedKeys, getFullCheckedKeys, getNodeParentChoosed, addTreeNodeAttrs, getIndeterminate } from './utils';
16
16
  import './index.less';
17
17
  const VirtualTree = ({
18
18
  itemHeight,
@@ -30,13 +30,14 @@ const VirtualTree = ({
30
30
  onExpand
31
31
  }) => {
32
32
  const ref = React.useRef(null);
33
+ const expandChangedRef = useRef(0);
34
+ const checkedChangeRef = useRef(0);
33
35
  // 展开的节点列表
34
36
  const [expandedList, setExpandedList] = useState([]);
35
37
  // checked 节点列表
36
38
  const [checkedList, setCheckedList] = useState([]);
37
39
  // 当前被选中的节点
38
40
  const [choosedValue, setChoosedValue] = useState(undefined);
39
- const expandChangedRef = useRef(0);
40
41
  /** 给每个节点增加属性keys,值为其下面所有节点的集合 */
41
42
  const treeDataWithKeys = useMemo(() => {
42
43
  return addTreeNodeAttrs(treeData, fieldNames);
@@ -50,13 +51,25 @@ const VirtualTree = ({
50
51
  }, [defaultExpandAll, expandedKeys]);
51
52
  /** 获取到所有选中的节点,因为checkedKeys可能传入的是最后一级 */
52
53
  useEffect(() => {
54
+ // 非第一次
55
+ if (checkedChangeRef.current > 0) {
56
+ setCheckedList(checkedKeys);
57
+ return;
58
+ }
53
59
  if (checkable) {
54
- const transCheckedKeys = Array.isArray(checkedKeys) ? checkedKeys : [];
55
60
  // 如果是受控
56
61
  if (checkStrictly) {
57
- setCheckedList(_uniq(transCheckedKeys));
62
+ setCheckedList(_uniq(Array.isArray(checkedKeys) ? checkedKeys : []));
58
63
  return;
59
64
  }
65
+ const transCheckedKeys = Array.isArray(checkedKeys) ? checkedKeys.reduce((total, item) => {
66
+ total.push(item);
67
+ const {
68
+ needCheckedChildrenValues
69
+ } = findNodeDetail(treeDataWithKeys, item) || {};
70
+ total = [...total, ...needCheckedChildrenValues];
71
+ return total;
72
+ }, []) : [];
60
73
  const _checkedKeys = getFullCheckedKeys(treeDataWithKeys, transCheckedKeys);
61
74
  setCheckedList(_uniq(_checkedKeys));
62
75
  }
@@ -115,35 +128,38 @@ const VirtualTree = ({
115
128
  if (disabled) {
116
129
  return;
117
130
  }
118
- if (checkable) {
119
- // 需要增删的子节点
120
- const itemChildrenValues = Array.isArray(children) && !!children.length ? item.childrenValues : [];
121
- if (isChecked) {
122
- // 需要删除的父节点
123
- const itemParentValues = Array.isArray(item.parentsValues) && !!item.parentsValues.length ? item.parentsValues : [];
124
- // 当前节点所有的父节点
125
- const delList = checkStrictly ? [_value] : [...itemChildrenValues, ...itemParentValues, _value];
126
- const _checkedList = checkedList.filter(i => !delList.includes(i));
127
- if (onCheck) {
128
- onCheck === null || onCheck === void 0 ? void 0 : onCheck(_uniq(_checkedList), item, !isChecked);
129
- return;
130
- }
131
- setCheckedList(_uniq(_checkedList));
132
- } else {
133
- // 递归循环其上级是否也要被选中
134
- const itemParentValues = getNodeParentChoosed(item.parentsValues, item.siblingsValue, [...checkedList, _value]);
135
- const addList = checkStrictly ? [_value] : [...itemChildrenValues, ...itemParentValues, _value];
136
- const _checkedList = [...checkedList, ...addList];
137
- if (onCheck) {
138
- onCheck === null || onCheck === void 0 ? void 0 : onCheck(_uniq(_checkedList), item, !isChecked);
139
- return;
140
- }
141
- setCheckedList(_uniq(_checkedList));
131
+ checkedChangeRef.current++;
132
+ // 需要增删的子节点
133
+ const itemChildrenValues = Array.isArray(children) && !!children.length ? item.needCheckedChildrenValues : [];
134
+ if (isChecked) {
135
+ // 需要删除的父节点
136
+ const itemParentValues = Array.isArray(item.needCheckedSiblingsValue) ? item.needCheckedSiblingsValue.map(i => i.key) : [];
137
+ // 当前节点所有的父节点
138
+ const delList = checkStrictly ? [_value] : [...itemChildrenValues, ...itemParentValues, _value];
139
+ const _checkedList = checkedList.filter(i => !delList.includes(i));
140
+ if (onCheck) {
141
+ onCheck === null || onCheck === void 0 ? void 0 : onCheck(_uniq(_checkedList), item, !isChecked);
142
+ return;
142
143
  }
144
+ setCheckedList(_uniq(_checkedList));
143
145
  } else {
144
- setChoosedValue(_value);
146
+ // 递归循环其上级是否也要被选中
147
+ const itemParentValues = getNodeParentChoosed(item.needCheckedSiblingsValue, [...checkedList, ...itemChildrenValues, _value]);
148
+ const addList = checkStrictly ? [_value] : [...itemChildrenValues, ...itemParentValues, _value];
149
+ const _checkedList = [...checkedList, ...addList];
150
+ if (onCheck) {
151
+ onCheck === null || onCheck === void 0 ? void 0 : onCheck(_uniq(_checkedList), item, !isChecked);
152
+ return;
153
+ }
154
+ setCheckedList(_uniq(_checkedList));
145
155
  }
146
156
  };
157
+ const handleChoosed = item => {
158
+ if (item.disabled) {
159
+ return;
160
+ }
161
+ setChoosedValue(item.value);
162
+ };
147
163
  const defaultRenderItem = item => {
148
164
  return React.createElement(Ellipsis, {
149
165
  title: item.title,
@@ -170,7 +186,7 @@ const VirtualTree = ({
170
186
  const indeterminateStatus = getIndeterminate(item, checkedList);
171
187
  // 当前节点是否被选中
172
188
  const checkedBingo = Array.isArray(checkedList) ? checkedList.includes(item.value) : false;
173
- const isChecked = !checkStrictly ? checkedBingo && !indeterminateStatus : checkedBingo;
189
+ const isChecked = !checkStrictly || disabled ? checkedBingo && !indeterminateStatus : checkedBingo;
174
190
  const checkBoxAttrs = {
175
191
  className: `${disabled ? 'tntd-virtual-tree-checkbox-disabled' : ''}`,
176
192
  onChange: () => handleCheck(item, isChecked),
@@ -187,22 +203,15 @@ const VirtualTree = ({
187
203
  },
188
204
  key: item.value
189
205
  }, React.createElement("div", {
190
- style: {
191
- width: 18,
192
- paddingLeft: 3,
193
- marginTop: -2,
194
- marginRight: 4
195
- }
206
+ className: "tntd-virtual-tree-item-expand-icon"
196
207
  }, Array.isArray(children) && !!children.length ? React.createElement(Icon, {
197
208
  type: bool ? 'caret-down' : 'caret-right',
198
209
  onClick: () => handleToggle(item)
199
210
  }) : ''), checkable ? React.createElement("div", {
200
- style: {
201
- margin: '0 4px'
202
- }
211
+ className: "tntd-virtual-tree-item-checkbox"
203
212
  }, React.createElement(Checkbox, Object.assign({}, checkBoxAttrs))) : '', React.createElement("div", {
204
- className: `tntd-virtual-tree-title ${checkable ? 'tntd-virtual-tree-title_checkable' : ''} ${choosedValue === item.value ? 'tntd-virtual-tree-title_active' : ''}`,
205
- onClick: () => handleCheck(item, isChecked)
213
+ className: `tntd-virtual-tree-title ${choosedValue === item.value ? 'tntd-virtual-tree-title_active' : ''}`,
214
+ onClick: () => handleChoosed(item)
206
215
  }, titleRender ? titleRender(item) : defaultRenderItem(item)));
207
216
  }));
208
217
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tntd-virtual-tree/index.jsx"],"names":[],"mappings":"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","sourcesContent":["/*\n * @Descripttion: 基于antd3 tree 部分api实现的tree,增加了虚拟滚动\n * @Author: 郑泳健\n * @Date: 2024-07-31 14:46:55\n * @LastEditors: 郑泳健\n * @LastEditTime: 2024-08-08 16:22:40\n */\nimport React, { useState, useMemo, useEffect, useRef } from 'react';\nimport List from 'rc-virtual-list';\nimport { uniq } from 'lodash';\nimport Icon from '../icon';\nimport Ellipsis from '../ellipsis';\nimport Empty from '../empty';\nimport Checkbox from '../checkbox';\nimport { flatTreeData, getFullExpandedKeys, getFullCheckedKeys, getNodeParentChoosed, addTreeNodeAttrs, getIndeterminate } from './utils';\nimport './index.less';\n\nconst VirtualTree = ({\n itemHeight,\n height,\n filterKey,\n treeData,\n checkable,\n checkStrictly,\n checkedKeys,\n defaultExpandAll = true,\n expandedKeys,\n fieldNames,\n titleRender,\n onCheck,\n onExpand\n}) => {\n const ref = React.useRef(null);\n // 展开的节点列表\n const [expandedList, setExpandedList] = useState([]);\n // checked 节点列表\n const [checkedList, setCheckedList] = useState([]);\n // 当前被选中的节点\n const [choosedValue, setChoosedValue] = useState(undefined);\n const expandChangedRef = useRef(0)\n\n /** 给每个节点增加属性keys,值为其下面所有节点的集合 */\n const treeDataWithKeys = useMemo(() => {\n return addTreeNodeAttrs(treeData, fieldNames);\n }, [treeData, fieldNames]);\n\n /** 默认是否全部展开 */\n const mergeDefaultExpandAll = useMemo(() => {\n if (Array.isArray(expandedKeys)) {\n return false;\n }\n\n return defaultExpandAll;\n }, [defaultExpandAll, expandedKeys]);\n\n /** 获取到所有选中的节点,因为checkedKeys可能传入的是最后一级 */\n useEffect(() => {\n if (checkable) {\n const transCheckedKeys = Array.isArray(checkedKeys) ? checkedKeys : [];\n // 如果是受控\n if (checkStrictly) {\n setCheckedList(uniq(transCheckedKeys));\n return;\n }\n const _checkedKeys = getFullCheckedKeys(treeDataWithKeys, transCheckedKeys);\n setCheckedList(uniq(_checkedKeys));\n }\n }, [treeDataWithKeys, checkStrictly, checkable, checkedKeys]);\n\n useEffect(() => {\n setExpandedList(expandedKeys)\n }, [expandedKeys])\n\n /** 初始化获取到所有展开的节点,因为初始化expandedKeys可能传入的是最后一级 */\n useEffect(() => {\n if(expandChangedRef.current === 0) {\n // 展开的节点\n const transExpandedKeys = Array.isArray(expandedKeys) ? expandedKeys : [];\n const _expandedKeys = getFullExpandedKeys(treeDataWithKeys, transExpandedKeys, mergeDefaultExpandAll);\n setExpandedList(_expandedKeys);\n } \n }, [treeDataWithKeys, expandedKeys, mergeDefaultExpandAll]);\n\n /** 最终渲染的数据 */\n const renderData = useMemo(() => {\n return flatTreeData(treeDataWithKeys, filterKey, expandedList);\n }, [treeDataWithKeys, filterKey, expandedList]);\n\n /** 切换展开/收起 */\n const handleToggle = (item) => {\n expandChangedRef.current++;\n const { value } = item || {};\n const bool = Array.isArray(expandedList) ? expandedList.includes(value) : false;\n if (bool) {\n const list = Array.isArray(expandedList) ? expandedList.filter((i) => i !== value) : [];\n if(onExpand) {\n onExpand(uniq(list), { node: item, expanded: !bool })\n return;\n }\n setExpandedList(uniq(list));\n } else {\n const arr = uniq([...expandedList, value])\n if(onExpand) {\n onExpand(arr, { node: item, expanded: !bool })\n return;\n }\n setExpandedList(arr);\n }\n };\n\n const handleCheck = (item, isChecked) => {\n const { value: _value, children, disabled } = item;\n if (disabled) {\n return;\n }\n if (checkable) {\n // 需要增删的子节点\n const itemChildrenValues = Array.isArray(children) && !!children.length ? item.childrenValues : [];\n\n if (isChecked) {\n // 需要删除的父节点\n const itemParentValues = Array.isArray(item.parentsValues) && !!item.parentsValues.length ? item.parentsValues : [];\n // 当前节点所有的父节点\n const delList = checkStrictly ? [_value] : [...itemChildrenValues, ...itemParentValues, _value];\n const _checkedList = checkedList.filter((i) => !delList.includes(i));\n if (onCheck) {\n onCheck?.(uniq(_checkedList), item, !isChecked);\n return;\n }\n setCheckedList(uniq(_checkedList));\n } else {\n // 递归循环其上级是否也要被选中\n const itemParentValues = getNodeParentChoosed(item.parentsValues, item.siblingsValue, [...checkedList, _value]);\n const addList = checkStrictly ? [_value] : [...itemChildrenValues, ...itemParentValues, _value];\n const _checkedList = [...checkedList, ...addList];\n if (onCheck) {\n onCheck?.(uniq(_checkedList), item, !isChecked);\n return;\n }\n setCheckedList(uniq(_checkedList));\n }\n }else {\n setChoosedValue(_value);\n }\n };\n\n const defaultRenderItem = (item) => {\n return <Ellipsis title={item.title} widthLimit={'100%'} />;\n };\n\n return (\n <div className=\"tntd-virtual-tree\">\n {!Array.isArray(renderData) || !renderData.length ? (\n <Empty size=\"small\" />\n ) : (\n <List ref={ref} height={height || 300} itemHeight={itemHeight || 32} data={renderData}>\n {(item) => {\n const { level, children, disabled } = item;\n const bool = Array.isArray(expandedList) ? expandedList.includes(item.value) : false;\n // 当前节点半选状态\n const indeterminateStatus = getIndeterminate(item, checkedList);\n // 当前节点是否被选中\n const checkedBingo = Array.isArray(checkedList) ? checkedList.includes(item.value) : false;\n const isChecked = !checkStrictly ? checkedBingo && !indeterminateStatus : checkedBingo\n\n const checkBoxAttrs = {\n className: `${disabled ? 'tntd-virtual-tree-checkbox-disabled' : ''}`,\n onChange: () => handleCheck(item, isChecked),\n checked: isChecked\n };\n // 状态没有半选模式\n if (!checkStrictly) {\n checkBoxAttrs.indeterminate = indeterminateStatus;\n }\n return (\n <div className={`tntd-virtual-tree-item ${disabled ? 'tntd-virtual-tree-item_disabled' : ''}`} style={{ paddingLeft: level * 18 }} key={item.value}>\n <div style={{ width: 18, paddingLeft: 3, marginTop: -2, marginRight: 4 }}>\n {Array.isArray(children) && !!children.length ? (\n <Icon type={bool ? 'caret-down' : 'caret-right'} onClick={() => handleToggle(item)} />\n ) : (\n ''\n )}\n </div>\n\n {checkable ? (\n <div style={{ margin: '0 4px' }}>\n <Checkbox {...checkBoxAttrs} />\n </div>\n ) : (\n ''\n )}\n\n <div\n className={`tntd-virtual-tree-title ${checkable ? 'tntd-virtual-tree-title_checkable' : ''} ${\n choosedValue === item.value ? 'tntd-virtual-tree-title_active' : ''\n }`}\n onClick={() => handleCheck(item, isChecked)}>\n {titleRender ? titleRender(item) : defaultRenderItem(item)}\n </div>\n </div>\n );\n }}\n </List>\n )}\n </div>\n );\n};\n\nexport default VirtualTree;\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tntd-virtual-tree/index.jsx"],"names":[],"mappings":"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","sourcesContent":["/*\n * @Descripttion: 基于antd3 tree 部分api实现的tree,增加了虚拟滚动\n * @Author: 郑泳健\n * @Date: 2024-07-31 14:46:55\n * @LastEditors: 郑泳健\n * @LastEditTime: 2024-08-09 17:51:50\n */\nimport React, { useState, useMemo, useEffect, useRef } from 'react';\nimport List from 'rc-virtual-list';\nimport { uniq } from 'lodash';\nimport Icon from '../icon';\nimport Ellipsis from '../ellipsis';\nimport Empty from '../empty';\nimport Checkbox from '../checkbox';\nimport {\n flatTreeData,\n findNodeDetail,\n getFullExpandedKeys,\n getFullCheckedKeys,\n getNodeParentChoosed,\n addTreeNodeAttrs,\n getIndeterminate\n} from './utils';\nimport './index.less';\n\nconst VirtualTree = ({\n itemHeight,\n height,\n filterKey,\n treeData,\n checkable,\n checkStrictly,\n checkedKeys,\n defaultExpandAll = true,\n expandedKeys,\n fieldNames,\n titleRender,\n onCheck,\n onExpand\n}) => {\n const ref = React.useRef(null);\n const expandChangedRef = useRef(0);\n const checkedChangeRef = useRef(0);\n // 展开的节点列表\n const [expandedList, setExpandedList] = useState([]);\n // checked 节点列表\n const [checkedList, setCheckedList] = useState([]);\n // 当前被选中的节点\n const [choosedValue, setChoosedValue] = useState(undefined);\n\n /** 给每个节点增加属性keys,值为其下面所有节点的集合 */\n const treeDataWithKeys = useMemo(() => {\n return addTreeNodeAttrs(treeData, fieldNames);\n }, [treeData, fieldNames]);\n\n /** 默认是否全部展开 */\n const mergeDefaultExpandAll = useMemo(() => {\n if (Array.isArray(expandedKeys)) {\n return false;\n }\n\n return defaultExpandAll;\n }, [defaultExpandAll, expandedKeys]);\n\n /** 获取到所有选中的节点,因为checkedKeys可能传入的是最后一级 */\n useEffect(() => {\n // 非第一次\n if (checkedChangeRef.current > 0) {\n setCheckedList(checkedKeys);\n return;\n }\n\n if (checkable) {\n // 如果是受控\n if (checkStrictly) {\n setCheckedList(uniq(Array.isArray(checkedKeys) ? checkedKeys : []));\n return;\n }\n const transCheckedKeys = Array.isArray(checkedKeys)\n ? checkedKeys.reduce((total, item) => {\n total.push(item);\n const { needCheckedChildrenValues } = findNodeDetail(treeDataWithKeys, item) || {};\n total = [...total, ...needCheckedChildrenValues];\n return total;\n }, [])\n : [];\n const _checkedKeys = getFullCheckedKeys(treeDataWithKeys, transCheckedKeys);\n setCheckedList(uniq(_checkedKeys));\n }\n }, [treeDataWithKeys, checkStrictly, checkable, checkedKeys]);\n\n useEffect(() => {\n setExpandedList(expandedKeys);\n }, [expandedKeys]);\n\n /** 初始化获取到所有展开的节点,因为初始化expandedKeys可能传入的是最后一级 */\n useEffect(() => {\n if (expandChangedRef.current === 0) {\n // 展开的节点\n const transExpandedKeys = Array.isArray(expandedKeys) ? expandedKeys : [];\n const _expandedKeys = getFullExpandedKeys(treeDataWithKeys, transExpandedKeys, mergeDefaultExpandAll);\n setExpandedList(_expandedKeys);\n }\n }, [treeDataWithKeys, expandedKeys, mergeDefaultExpandAll]);\n\n /** 最终渲染的数据 */\n const renderData = useMemo(() => {\n return flatTreeData(treeDataWithKeys, filterKey, expandedList);\n }, [treeDataWithKeys, filterKey, expandedList]);\n\n /** 切换展开/收起 */\n const handleToggle = (item) => {\n expandChangedRef.current++;\n const { value } = item || {};\n const bool = Array.isArray(expandedList) ? expandedList.includes(value) : false;\n if (bool) {\n const list = Array.isArray(expandedList) ? expandedList.filter((i) => i !== value) : [];\n if (onExpand) {\n onExpand(uniq(list), { node: item, expanded: !bool });\n return;\n }\n setExpandedList(uniq(list));\n } else {\n const arr = uniq([...expandedList, value]);\n if (onExpand) {\n onExpand(arr, { node: item, expanded: !bool });\n return;\n }\n setExpandedList(arr);\n }\n };\n\n const handleCheck = (item, isChecked) => {\n const { value: _value, children, disabled } = item;\n if (disabled) {\n return;\n }\n checkedChangeRef.current++;\n // 需要增删的子节点\n const itemChildrenValues = Array.isArray(children) && !!children.length ? item.needCheckedChildrenValues : [];\n if (isChecked) {\n // 需要删除的父节点\n const itemParentValues = Array.isArray(item.needCheckedSiblingsValue) ? item.needCheckedSiblingsValue.map((i) => i.key) : [];\n // 当前节点所有的父节点\n const delList = checkStrictly ? [_value] : [...itemChildrenValues, ...itemParentValues, _value];\n const _checkedList = checkedList.filter((i) => !delList.includes(i));\n if (onCheck) {\n onCheck?.(uniq(_checkedList), item, !isChecked);\n return;\n }\n\n setCheckedList(uniq(_checkedList));\n } else {\n // 递归循环其上级是否也要被选中\n const itemParentValues = getNodeParentChoosed(item.needCheckedSiblingsValue, [...checkedList, ...itemChildrenValues, _value]);\n const addList = checkStrictly ? [_value] : [...itemChildrenValues, ...itemParentValues, _value];\n const _checkedList = [...checkedList, ...addList];\n\n if (onCheck) {\n onCheck?.(uniq(_checkedList), item, !isChecked);\n return;\n }\n setCheckedList(uniq(_checkedList));\n }\n };\n\n const handleChoosed = (item) => {\n if (item.disabled) {\n return;\n }\n setChoosedValue(item.value);\n };\n\n const defaultRenderItem = (item) => {\n return <Ellipsis title={item.title} widthLimit={'100%'} />;\n };\n\n return (\n <div className=\"tntd-virtual-tree\">\n {!Array.isArray(renderData) || !renderData.length ? (\n <Empty size=\"small\" />\n ) : (\n <List ref={ref} height={height || 300} itemHeight={itemHeight || 32} data={renderData}>\n {(item) => {\n const { level, children, disabled } = item;\n const bool = Array.isArray(expandedList) ? expandedList.includes(item.value) : false;\n // 当前节点半选状态\n const indeterminateStatus = getIndeterminate(item, checkedList);\n // 当前节点是否被选中\n const checkedBingo = Array.isArray(checkedList) ? checkedList.includes(item.value) : false;\n const isChecked = !checkStrictly || disabled ? checkedBingo && !indeterminateStatus : checkedBingo;\n\n const checkBoxAttrs = {\n className: `${disabled ? 'tntd-virtual-tree-checkbox-disabled' : ''}`,\n onChange: () => handleCheck(item, isChecked),\n checked: isChecked\n };\n // 状态没有半选模式\n if (!checkStrictly) {\n checkBoxAttrs.indeterminate = indeterminateStatus;\n }\n return (\n <div\n className={`tntd-virtual-tree-item ${disabled ? 'tntd-virtual-tree-item_disabled' : ''}`}\n style={{ paddingLeft: level * 18 }}\n key={item.value}>\n <div className=\"tntd-virtual-tree-item-expand-icon\">\n {Array.isArray(children) && !!children.length ? (\n <Icon type={bool ? 'caret-down' : 'caret-right'} onClick={() => handleToggle(item)} />\n ) : (\n ''\n )}\n </div>\n\n {checkable ? (\n <div className=\"tntd-virtual-tree-item-checkbox\">\n <Checkbox {...checkBoxAttrs} />\n </div>\n ) : (\n ''\n )}\n\n <div\n className={`tntd-virtual-tree-title ${choosedValue === item.value ? 'tntd-virtual-tree-title_active' : ''}`}\n onClick={() => handleChoosed(item)}>\n {titleRender ? titleRender(item) : defaultRenderItem(item)}\n </div>\n </div>\n );\n }}\n </List>\n )}\n </div>\n );\n};\n\nexport default VirtualTree;\n"]}
@@ -2,7 +2,7 @@
2
2
  padding: 0;
3
3
  white-space: nowrap;
4
4
  .tntd-virtual-tree-item{
5
- display: flex;
5
+ // display: flex;
6
6
  border-radius: var(--border-radius-sm);
7
7
  color: #17233d;
8
8
  text-decoration: none;
@@ -12,40 +12,53 @@
12
12
  font-size: 14px;
13
13
  box-sizing: border-box;
14
14
 
15
- &.tntd-virtual-tree-item_disabled{
16
- color: rgba(0, 0, 0, 0.25);
17
- cursor: not-allowed;
15
+ .tntd-virtual-tree-item-expand-icon{
16
+ display: inline-block;
17
+ width: 18px;
18
+ padding-left: 3px;
19
+ margin-right: 4px;
18
20
 
19
- .tntd-virtual-tree-title_checkable{
20
- &:hover{
21
- background-color: inherit !important;
22
- }
21
+ .anticon-caret-down,.anticon-caret-right {
22
+ vertical-align: middle;
23
+ font-size: 16px;
24
+ margin-right: 4px;
23
25
  }
24
26
  }
25
27
 
26
- .anticon-caret-down,.anticon-caret-right {
28
+ .tntd-virtual-tree-item-checkbox{
29
+ display: inline-block;
30
+ margin: 0 4px;
27
31
  vertical-align: middle;
28
- font-size: 16px;
29
- margin-right: 4px;
30
32
  }
31
33
 
32
34
  .tntd-virtual-tree-title{
33
35
  padding: 0 2px;
34
36
  flex: 1;
35
37
  overflow: hidden;
38
+ display: inline-block;
39
+ vertical-align: middle;
36
40
 
37
- &.tntd-virtual-tree-title_checkable{
38
- &:hover{
39
- background-color: var(--blue-1);
40
- }
41
+ &:hover{
42
+ background-color: var(--blue-1);
41
43
  }
42
44
 
43
45
  &_active{
44
- background-color: var(--blue-2);
46
+ background-color: var(--blue-2) !important;
45
47
  border-radius: @border-radius-base;
46
48
  }
47
49
  }
48
50
 
51
+ &.tntd-virtual-tree-item_disabled{
52
+ color: rgba(0, 0, 0, 0.25);
53
+ cursor: not-allowed;
54
+
55
+ .tntd-virtual-tree-title_checkable{
56
+ &:hover{
57
+ background-color: inherit !important;
58
+ }
59
+ }
60
+ }
61
+
49
62
  .tntd-virtual-tree-checkbox-disabled{
50
63
  color: var(--text-color-tertiary);
51
64
  cursor: not-allowed;
@@ -7,7 +7,12 @@ var __rest = this && this.__rest || function (s, e) {
7
7
  return t;
8
8
  };
9
9
  /**
10
- * 初始化给树的每个节点增加属性字段(childrenValues, titleTotal, parentsValues, siblingsValue),childrenValues: 当前节点下的所有子节点的value和, titleTotal: 当前节点下的所有子节点的title和 parentsValues: 当前节点所有的父节点 siblingsValue: 当前节点所有上级节点的兄弟节点
10
+ * 初始化给树的每个节点增加以下属性字段
11
+ * childrenValues: 当前节点下的所有子节点的value和(包含了disabled节点)用户展开/收起
12
+ * titleTotal: 当前节点下的所有子节点的title和 (包含了disabled节点)用于搜索
13
+ * needCheckedChildrenValues: 当前节点下的节点(即无children)的value和(不包含了disabled节点),用于选中/取消选中
14
+ * needCheckedLastestChildrenValues: 当前节点下的最底层节点(即无children)的value和(不包含了disabled节点),用于选中/取消选中
15
+ * needCheckedSiblingsValue: 当前节点所有上级节点的兄弟节点, [{ key: '上级节点value', list: [xx] }] list包含非disabled节点 用于选中/取消选中
11
16
  * 用于判断后续展开/收起
12
17
  * @param {*} treeData
13
18
  */
@@ -16,7 +21,7 @@ export const addTreeNodeAttrs = (treeData, fieldNames = {
16
21
  value: 'value',
17
22
  children: 'children',
18
23
  disabled: 'disabled'
19
- }, parentsValues = [], siblingsValue = {}) => {
24
+ }, needCheckedSiblingsValue = []) => {
20
25
  if (Array.isArray(treeData) && !!treeData.length) {
21
26
  return treeData.map(item => {
22
27
  item.children = item[fieldNames['children']];
@@ -27,9 +32,22 @@ export const addTreeNodeAttrs = (treeData, fieldNames = {
27
32
  } = item,
28
33
  query = __rest(item, ["children"]);
29
34
  if (Array.isArray(children) && !!children.length) {
30
- query.children = addTreeNodeAttrs(children, fieldNames, [item.value, ...parentsValues], Object.assign(Object.assign({}, siblingsValue), {
31
- [item.value]: children.map(i => i[fieldNames['value']])
32
- }));
35
+ let siblingsSum = needCheckedSiblingsValue;
36
+ if (!item[fieldNames['disabled']]) {
37
+ // 这里注意要逆序,要不然校验的时候会出问题
38
+ siblingsSum = [{
39
+ key: item[fieldNames['value']],
40
+ list: children.reduce((total, item) => {
41
+ if (!item[fieldNames['disabled']]) {
42
+ total.push(item[fieldNames['value']]);
43
+ }
44
+ return total;
45
+ }, [])
46
+ }, ...siblingsSum];
47
+ } else {
48
+ siblingsSum = [];
49
+ }
50
+ query.children = addTreeNodeAttrs(children, fieldNames, siblingsSum);
33
51
  }
34
52
  return Object.assign(Object.assign({}, query), {
35
53
  title: query[fieldNames['title']],
@@ -37,8 +55,9 @@ export const addTreeNodeAttrs = (treeData, fieldNames = {
37
55
  disabled: query[fieldNames['disabled']],
38
56
  childrenValues: getNodeValuess(query, false),
39
57
  titleTotal: getNodeStr(query, fieldNames['title']),
40
- parentsValues,
41
- siblingsValue
58
+ needCheckedLastestChildrenValues: !item[fieldNames['disabled']] ? getNodeNoDisabledLastestChildrenValues(item, fieldNames) : [],
59
+ needCheckedChildrenValues: !item[fieldNames['disabled']] ? getNodeNoDisabledChildrenValues(item, fieldNames) : [],
60
+ needCheckedSiblingsValue: !item[fieldNames['disabled']] ? needCheckedSiblingsValue : []
42
61
  });
43
62
  });
44
63
  }
@@ -86,14 +105,10 @@ export const flatTreeData = (treeData, filterKey = '', expandedKeys = [], treeDe
86
105
  const {
87
106
  value,
88
107
  children,
89
- childrenValues,
90
- parentsValues,
91
108
  titleTotal,
92
- siblingsValue,
93
- title,
94
- disabled
109
+ title
95
110
  } = i,
96
- rest = __rest(i, ["value", "children", "childrenValues", "parentsValues", "titleTotal", "siblingsValue", "title", "disabled"]);
111
+ rest = __rest(i, ["value", "children", "titleTotal", "title"]);
97
112
  // 判断是否命中过滤
98
113
  let bingo = true;
99
114
  const transFilterKey = !['', null, undefined].includes(filterKey);
@@ -101,17 +116,9 @@ export const flatTreeData = (treeData, filterKey = '', expandedKeys = [], treeDe
101
116
  bingo = Array.isArray(titleTotal) ? titleTotal.some(i => i.includes(filterKey)) : false;
102
117
  }
103
118
  if (bingo) {
104
- result.push({
105
- value,
106
- children,
107
- title,
108
- level,
109
- titleTotal,
110
- childrenValues,
111
- parentsValues,
112
- siblingsValue,
113
- disabled
114
- });
119
+ result.push(Object.assign({
120
+ level
121
+ }, i));
115
122
  }
116
123
  const selfIn = Array.isArray(expandedKeys) ? expandedKeys.includes(value) : false;
117
124
  if ((treeDefaultExpandAll || selfIn || transFilterKey && bingo) && Array.isArray(children) && !!children.length) {
@@ -148,7 +155,7 @@ export const getFullExpandedKeys = (treeDataWithKeys, treeExpandedKeys = [], tre
148
155
  return result;
149
156
  };
150
157
  /**
151
- * 获取所有选中的节点 (组件传入最后一层,需要将其上层和自身全部加入到expandedKeys)
158
+ * 初始化根据用户传入的值获取其关联节点是否要在checkList
152
159
  * @param {*} treeDataWithKeys
153
160
  * @param {*} transCheckedKeys
154
161
  * @param {*} result
@@ -160,37 +167,63 @@ export const getFullCheckedKeys = (treeDataWithKeys, transCheckedKeys, result =
160
167
  }
161
168
  treeDataWithKeys.forEach(i => {
162
169
  const {
163
- childrenValues,
164
170
  value,
165
- children
171
+ children,
172
+ disabled
166
173
  } = i;
167
- if (Array.isArray(childrenValues) && [...childrenValues, value].some(el => transCheckedKeys.includes(el))) {
174
+ const bingo = transCheckedKeys.includes(value);
175
+ if (bingo) {
168
176
  result.push(value);
169
- if (Array.isArray(children) && !!children.length) {
170
- result = [...result, ...getFullCheckedKeys(children, transCheckedKeys)];
177
+ }
178
+ if (Array.isArray(children) && !!children.length) {
179
+ const lastestUnDisabledChildrenValues = i.needCheckedLastestChildrenValues;
180
+ // 如果当前节点是被命中,就将其下面所有子节点都选中
181
+ if (Array.isArray(lastestUnDisabledChildrenValues) && !!lastestUnDisabledChildrenValues.length && lastestUnDisabledChildrenValues.every(el => transCheckedKeys.includes(el))) {
182
+ result.push(value);
171
183
  }
184
+ result = [...result, ...getFullCheckedKeys(children, transCheckedKeys)];
172
185
  }
173
186
  });
174
187
  return result;
175
188
  };
176
189
  /**
177
- * 获取当前节点下的所有子节点
190
+ * 递归获取某个节点所有最下层(没有children)的values集合,递归遇到disable的节点就不继续往下递归了
191
+ * @param {*} node
178
192
  * @param {*} node
179
- * @param {*} result
180
193
  * @returns
181
194
  */
182
- export const getNodeAllChildrenValue = (node, isSelf = true, result = []) => {
183
- const {
184
- value,
185
- children
186
- } = node;
187
- if (!['', null, undefined].includes(value) || !isSelf) {
188
- result.push(value);
195
+ export const getNodeNoDisabledLastestChildrenValues = (node, fieldNames, result = []) => {
196
+ if (Array.isArray(node.children) && !!node.children.length) {
197
+ node.children.forEach(element => {
198
+ if (!element[fieldNames['disabled']]) {
199
+ result = [...result, ...getNodeNoDisabledLastestChildrenValues(element, fieldNames)];
200
+ }
201
+ });
202
+ } else {
203
+ if (!node[fieldNames['disabled']]) {
204
+ result.push(node[fieldNames['value']]);
205
+ }
189
206
  }
190
- if (Array.isArray(children)) {
191
- children.forEach(i => {
192
- result = [...result, ...getNodeAllChildrenValue(i, false)];
207
+ return result;
208
+ };
209
+ /**
210
+ * 递归获取某个节点所有下层(没有children)的values集合,递归遇到disable的节点就不继续往下递归了
211
+ * @param {*} node
212
+ * @param {*} node
213
+ * @returns
214
+ */
215
+ export const getNodeNoDisabledChildrenValues = (node, fieldNames, result = []) => {
216
+ if (Array.isArray(node.children) && !!node.children.length) {
217
+ node.children.forEach(element => {
218
+ if (!element[fieldNames['disabled']]) {
219
+ result.push(element[fieldNames['value']]);
220
+ result = [...result, ...getNodeNoDisabledChildrenValues(element, fieldNames)];
221
+ }
193
222
  });
223
+ } else {
224
+ if (!node[fieldNames['disabled']]) {
225
+ result.push(node[fieldNames['value']]);
226
+ }
194
227
  }
195
228
  return result;
196
229
  };
@@ -199,39 +232,65 @@ export const getNodeAllChildrenValue = (node, isSelf = true, result = []) => {
199
232
  * @param {*} item
200
233
  * @param {*} checkedList
201
234
  */
202
- export const getIndeterminate = (item, checkedList) => {
203
- // 如果没有子节点,判断当前节点是否被选中
235
+ export const getIndeterminate = (item, checkedList, disabledList) => {
236
+ // 如果没有子节点,就没有半选情况
204
237
  if (!Array.isArray(item.children) || !item.children.length) {
205
238
  return false;
206
239
  }
207
240
  if (!Array.isArray(checkedList) || !checkedList.length) {
208
241
  return false;
209
242
  }
210
- // 如果有子节点,判断子节点是否都被选中
211
- const list = getNodeAllChildrenValue(item);
212
- const childrenCheckedList = list.filter(i => checkedList.includes(i));
243
+ // 当前节点下的去掉disabled的所有末级节点
244
+ const list = Array.isArray(item.needCheckedLastestChildrenValues) ? item.needCheckedLastestChildrenValues : [];
245
+ const childrenCheckedList = list.filter(i => checkedList === null || checkedList === void 0 ? void 0 : checkedList.includes(i));
213
246
  return childrenCheckedList.length > 0 && childrenCheckedList.length < list.length;
214
247
  };
215
248
  /**
216
249
  * 获取当前节点的父亲节点是否需要被选中
217
- * @param {*} parentsValues
218
- * @param {*} siblingsValue
250
+ * @param {*} needCheckedSiblingsValue
219
251
  * @param {*} checkedList
220
252
  * @returns
221
253
  */
222
- export const getNodeParentChoosed = (parentsValues, siblingsValue, checkedList) => {
223
- if (!Array.isArray(parentsValues) || !parentsValues.length || !Array.isArray(checkedList) || !checkedList.length) {
254
+ export const getNodeParentChoosed = (needCheckedSiblingsValue, checkedList) => {
255
+ if (!Array.isArray(checkedList) || !checkedList.length) {
224
256
  return [];
225
257
  }
226
258
  let result = [];
227
- for (let item of parentsValues) {
228
- const list = Array.isArray(siblingsValue[item]) ? siblingsValue[item] : [];
229
- const bool = list.every(it => checkedList.includes(it));
230
- if (!bool) {
231
- break;
259
+ for (let item of needCheckedSiblingsValue) {
260
+ const {
261
+ key,
262
+ list
263
+ } = item || {};
264
+ // 过滤掉子节点为disabled的
265
+ const bool = Array.isArray(list) ? list.every(it => checkedList.includes(it)) : false;
266
+ if (bool) {
267
+ checkedList.push(key);
268
+ result.push(key);
269
+ }
270
+ }
271
+ return result;
272
+ };
273
+ /**
274
+ * 获取节点的信息
275
+ * @param {*} tree
276
+ * @param {*} key
277
+ * @param {*} result
278
+ * @returns
279
+ */
280
+ export const findNodeDetail = (tree, key, result) => {
281
+ if (Array.isArray(tree) && !!key) {
282
+ for (let i of tree) {
283
+ if (i.value === key) {
284
+ result = i;
285
+ break;
286
+ }
287
+ if (Array.isArray(i.children) && !!i.children.length) {
288
+ result = findNodeDetail(i.children, key);
289
+ if (result) {
290
+ break;
291
+ }
292
+ }
232
293
  }
233
- checkedList.push(item);
234
- result.push(item);
235
294
  }
236
295
  return result;
237
296
  };