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.
- package/es/array-input/index.js +3 -1
- package/es/array-input/index.js.map +1 -1
- package/es/index.js +1 -1
- package/es/index.js.map +1 -1
- package/es/query-list-scene/QueryForm.js +3 -6
- package/es/query-list-scene/QueryForm.js.map +1 -1
- package/es/title/index.js +18 -4
- package/es/title/index.js.map +1 -1
- package/es/title/index.less +85 -34
- package/es/tntd-virtual-tree/index.js +51 -42
- package/es/tntd-virtual-tree/index.js.map +1 -1
- package/es/tntd-virtual-tree/index.less +29 -16
- package/es/tntd-virtual-tree/utils.js +117 -58
- package/es/tntd-virtual-tree/utils.js.map +1 -1
- package/lib/array-input/index.js +5 -1
- package/lib/array-input/index.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +2 -2
- package/lib/index.js.map +1 -1
- package/lib/query-list-scene/QueryForm.d.ts +2 -2
- package/lib/query-list-scene/QueryForm.d.ts.map +1 -1
- package/lib/query-list-scene/QueryForm.js +8 -10
- package/lib/query-list-scene/QueryForm.js.map +1 -1
- package/lib/title/index.d.ts +1 -0
- package/lib/title/index.d.ts.map +1 -1
- package/lib/title/index.js +18 -4
- package/lib/title/index.js.map +1 -1
- package/lib/title/index.less +85 -34
- package/lib/tntd-virtual-tree/index.d.ts.map +1 -1
- package/lib/tntd-virtual-tree/index.js +55 -45
- package/lib/tntd-virtual-tree/index.js.map +1 -1
- package/lib/tntd-virtual-tree/index.less +29 -16
- package/lib/tntd-virtual-tree/utils.d.ts +6 -4
- package/lib/tntd-virtual-tree/utils.d.ts.map +1 -1
- package/lib/tntd-virtual-tree/utils.js +130 -66
- package/lib/tntd-virtual-tree/utils.js.map +1 -1
- 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-
|
|
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(
|
|
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
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 ${
|
|
205
|
-
onClick: () =>
|
|
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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
-
.
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
.
|
|
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
|
-
|
|
38
|
-
|
|
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
|
-
*
|
|
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
|
-
},
|
|
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
|
-
|
|
31
|
-
|
|
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
|
-
|
|
41
|
-
|
|
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
|
-
|
|
93
|
-
title,
|
|
94
|
-
disabled
|
|
109
|
+
title
|
|
95
110
|
} = i,
|
|
96
|
-
rest = __rest(i, ["value", "children", "
|
|
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
|
-
|
|
106
|
-
|
|
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
|
-
*
|
|
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
|
-
|
|
174
|
+
const bingo = transCheckedKeys.includes(value);
|
|
175
|
+
if (bingo) {
|
|
168
176
|
result.push(value);
|
|
169
|
-
|
|
170
|
-
|
|
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
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
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
|
-
|
|
191
|
-
|
|
192
|
-
|
|
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 =
|
|
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 {*}
|
|
218
|
-
* @param {*} siblingsValue
|
|
250
|
+
* @param {*} needCheckedSiblingsValue
|
|
219
251
|
* @param {*} checkedList
|
|
220
252
|
* @returns
|
|
221
253
|
*/
|
|
222
|
-
export const getNodeParentChoosed = (
|
|
223
|
-
if (!Array.isArray(
|
|
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
|
|
228
|
-
const
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
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
|
};
|