wssf-kage-ui 0.1.2 → 0.1.3
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/dist/cjs/Alert/index.d.ts +37 -0
- package/dist/cjs/Alert/index.js +124 -0
- package/dist/cjs/Alert/style.less +248 -0
- package/dist/cjs/Drawer/index.d.ts +57 -0
- package/dist/cjs/Drawer/index.js +203 -0
- package/dist/cjs/Drawer/style.less +215 -0
- package/dist/cjs/FloatButton/index.d.ts +54 -0
- package/dist/cjs/FloatButton/index.js +119 -0
- package/dist/cjs/FloatButton/style.less +266 -0
- package/dist/cjs/Message/index.d.ts +38 -0
- package/dist/cjs/Message/index.js +292 -0
- package/dist/cjs/Message/style.less +183 -0
- package/dist/cjs/Modal/index.d.ts +63 -0
- package/dist/cjs/Modal/index.js +254 -0
- package/dist/cjs/Modal/style.less +298 -0
- package/dist/cjs/Notification/index.d.ts +48 -0
- package/dist/cjs/Notification/index.js +340 -0
- package/dist/cjs/Notification/style.less +260 -0
- package/dist/cjs/Popconfirm/index.d.ts +58 -0
- package/dist/cjs/Popconfirm/index.js +393 -0
- package/dist/cjs/Popconfirm/style.less +417 -0
- package/dist/cjs/Progress/index.d.ts +43 -0
- package/dist/cjs/Progress/index.js +213 -0
- package/dist/cjs/Progress/style.less +206 -0
- package/dist/cjs/Result/index.d.ts +25 -0
- package/dist/cjs/Result/index.js +63 -0
- package/dist/cjs/Result/style.less +111 -0
- package/dist/cjs/Skeleton/index.d.ts +88 -0
- package/dist/cjs/Skeleton/index.js +207 -0
- package/dist/cjs/Skeleton/style.less +487 -0
- package/dist/cjs/Spin/index.d.ts +25 -0
- package/dist/cjs/Spin/index.js +98 -0
- package/dist/cjs/Spin/style.less +169 -0
- package/dist/cjs/Tree/index.d.ts +82 -0
- package/dist/cjs/Tree/index.js +226 -0
- package/dist/cjs/Tree/style.less +313 -0
- package/dist/cjs/Watermark/index.d.ts +41 -0
- package/dist/cjs/Watermark/index.js +353 -0
- package/dist/cjs/Watermark/style.less +31 -0
- package/dist/cjs/index.d.ts +27 -1
- package/dist/cjs/index.js +91 -0
- package/dist/esm/Alert/index.d.ts +37 -0
- package/dist/esm/Alert/index.js +121 -0
- package/dist/esm/Alert/style.less +248 -0
- package/dist/esm/Drawer/index.d.ts +57 -0
- package/dist/esm/Drawer/index.js +202 -0
- package/dist/esm/Drawer/style.less +215 -0
- package/dist/esm/FloatButton/index.d.ts +54 -0
- package/dist/esm/FloatButton/index.js +123 -0
- package/dist/esm/FloatButton/style.less +266 -0
- package/dist/esm/Message/index.d.ts +38 -0
- package/dist/esm/Message/index.js +294 -0
- package/dist/esm/Message/style.less +183 -0
- package/dist/esm/Modal/index.d.ts +63 -0
- package/dist/esm/Modal/index.js +251 -0
- package/dist/esm/Modal/style.less +298 -0
- package/dist/esm/Notification/index.d.ts +48 -0
- package/dist/esm/Notification/index.js +345 -0
- package/dist/esm/Notification/style.less +260 -0
- package/dist/esm/Popconfirm/index.d.ts +58 -0
- package/dist/esm/Popconfirm/index.js +389 -0
- package/dist/esm/Popconfirm/style.less +417 -0
- package/dist/esm/Progress/index.d.ts +43 -0
- package/dist/esm/Progress/index.js +208 -0
- package/dist/esm/Progress/style.less +206 -0
- package/dist/esm/Result/index.d.ts +25 -0
- package/dist/esm/Result/index.js +57 -0
- package/dist/esm/Result/style.less +111 -0
- package/dist/esm/Skeleton/index.d.ts +88 -0
- package/dist/esm/Skeleton/index.js +213 -0
- package/dist/esm/Skeleton/style.less +487 -0
- package/dist/esm/Spin/index.d.ts +25 -0
- package/dist/esm/Spin/index.js +95 -0
- package/dist/esm/Spin/style.less +169 -0
- package/dist/esm/Tree/index.d.ts +82 -0
- package/dist/esm/Tree/index.js +225 -0
- package/dist/esm/Tree/style.less +313 -0
- package/dist/esm/Watermark/index.d.ts +41 -0
- package/dist/esm/Watermark/index.js +349 -0
- package/dist/esm/Watermark/style.less +31 -0
- package/dist/esm/index.d.ts +27 -1
- package/dist/esm/index.js +14 -1
- package/package.json +1 -1
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
// Spin 加载动画组件样式
|
|
2
|
+
|
|
3
|
+
@prefix: kage-spin;
|
|
4
|
+
|
|
5
|
+
// 颜色变量
|
|
6
|
+
@spin-color: #1890ff;
|
|
7
|
+
@spin-tip-color: rgba(0, 0, 0, 0.45);
|
|
8
|
+
|
|
9
|
+
// ============ 主容器 ============
|
|
10
|
+
.@{prefix} {
|
|
11
|
+
position: relative;
|
|
12
|
+
display: inline-block;
|
|
13
|
+
color: @spin-color;
|
|
14
|
+
font-size: 14px;
|
|
15
|
+
line-height: 1;
|
|
16
|
+
text-align: center;
|
|
17
|
+
vertical-align: middle;
|
|
18
|
+
opacity: 0;
|
|
19
|
+
transition: opacity 0.3s;
|
|
20
|
+
|
|
21
|
+
&-spinning {
|
|
22
|
+
opacity: 1;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// ============ 尺寸 ============
|
|
27
|
+
.@{prefix}-small {
|
|
28
|
+
font-size: 12px;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.@{prefix}-large {
|
|
32
|
+
font-size: 16px;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// ============ 默认指示符(四个点) ============
|
|
36
|
+
.@{prefix}-dot {
|
|
37
|
+
position: relative;
|
|
38
|
+
display: inline-block;
|
|
39
|
+
width: 1em;
|
|
40
|
+
height: 1em;
|
|
41
|
+
font-size: 20px;
|
|
42
|
+
transform: rotate(45deg);
|
|
43
|
+
animation: kage-spin-rotate 1.2s infinite linear;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.@{prefix}-dot-item {
|
|
47
|
+
position: absolute;
|
|
48
|
+
display: block;
|
|
49
|
+
width: 9px;
|
|
50
|
+
height: 9px;
|
|
51
|
+
background-color: @spin-color;
|
|
52
|
+
border-radius: 100%;
|
|
53
|
+
transform: scale(0.75);
|
|
54
|
+
transform-origin: 50% 50%;
|
|
55
|
+
opacity: 0.3;
|
|
56
|
+
animation: kage-spin-dot-move 1.2s infinite linear alternate;
|
|
57
|
+
|
|
58
|
+
&:nth-child(1) {
|
|
59
|
+
top: 0;
|
|
60
|
+
left: 0;
|
|
61
|
+
animation-delay: 0s;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
&:nth-child(2) {
|
|
65
|
+
top: 0;
|
|
66
|
+
right: 0;
|
|
67
|
+
animation-delay: 0.4s;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
&:nth-child(3) {
|
|
71
|
+
right: 0;
|
|
72
|
+
bottom: 0;
|
|
73
|
+
animation-delay: 0.8s;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
&:nth-child(4) {
|
|
77
|
+
bottom: 0;
|
|
78
|
+
left: 0;
|
|
79
|
+
animation-delay: 1.2s;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// 小尺寸
|
|
84
|
+
.@{prefix}-small .@{prefix}-dot {
|
|
85
|
+
font-size: 14px;
|
|
86
|
+
|
|
87
|
+
.@{prefix}-dot-item {
|
|
88
|
+
width: 6px;
|
|
89
|
+
height: 6px;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// 大尺寸
|
|
94
|
+
.@{prefix}-large .@{prefix}-dot {
|
|
95
|
+
font-size: 32px;
|
|
96
|
+
|
|
97
|
+
.@{prefix}-dot-item {
|
|
98
|
+
width: 14px;
|
|
99
|
+
height: 14px;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// ============ 旋转动画 ============
|
|
104
|
+
@keyframes kage-spin-rotate {
|
|
105
|
+
to {
|
|
106
|
+
transform: rotate(405deg);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
@keyframes kage-spin-dot-move {
|
|
111
|
+
to {
|
|
112
|
+
opacity: 1;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// ============ 提示文字 ============
|
|
117
|
+
.@{prefix}-tip {
|
|
118
|
+
margin-top: 8px;
|
|
119
|
+
color: @spin-tip-color;
|
|
120
|
+
font-size: 14px;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// ============ 包装容器 ============
|
|
124
|
+
.@{prefix}-container {
|
|
125
|
+
position: relative;
|
|
126
|
+
transition: opacity 0.3s;
|
|
127
|
+
|
|
128
|
+
&-blur {
|
|
129
|
+
.@{prefix}-children {
|
|
130
|
+
opacity: 0.5;
|
|
131
|
+
pointer-events: none;
|
|
132
|
+
user-select: none;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
.@{prefix} {
|
|
136
|
+
position: absolute;
|
|
137
|
+
top: 50%;
|
|
138
|
+
left: 50%;
|
|
139
|
+
z-index: 4;
|
|
140
|
+
display: block;
|
|
141
|
+
transform: translate(-50%, -50%);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
.@{prefix}-children {
|
|
147
|
+
transition: opacity 0.3s;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// ============ 暗色模式适配 ============
|
|
151
|
+
[data-theme='dark'],
|
|
152
|
+
[data-prefers-color-scheme='dark'],
|
|
153
|
+
[data-prefers-color='dark'],
|
|
154
|
+
html.dark,
|
|
155
|
+
body.dark,
|
|
156
|
+
.dark {
|
|
157
|
+
.@{prefix} {
|
|
158
|
+
color: #1890ff;
|
|
159
|
+
|
|
160
|
+
&-tip {
|
|
161
|
+
color: rgba(255, 255, 255, 0.45);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
&-dot-item {
|
|
165
|
+
background-color: #1890ff;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import React, { ReactNode, CSSProperties } from 'react';
|
|
2
|
+
import './style.less';
|
|
3
|
+
/** 树节点数据 */
|
|
4
|
+
export interface TreeNode {
|
|
5
|
+
/** 唯一标识 */
|
|
6
|
+
key: string;
|
|
7
|
+
/** 节点标题 */
|
|
8
|
+
title: ReactNode;
|
|
9
|
+
/** 子节点 */
|
|
10
|
+
children?: TreeNode[];
|
|
11
|
+
/** 是否禁用 */
|
|
12
|
+
disabled?: boolean;
|
|
13
|
+
/** 是否可选择 */
|
|
14
|
+
selectable?: boolean;
|
|
15
|
+
/** 是否为叶子节点 */
|
|
16
|
+
isLeaf?: boolean;
|
|
17
|
+
/** 图标 */
|
|
18
|
+
icon?: ReactNode;
|
|
19
|
+
/** 自定义类名 */
|
|
20
|
+
className?: string;
|
|
21
|
+
/** 自定义样式 */
|
|
22
|
+
style?: CSSProperties;
|
|
23
|
+
/** 其他属性 */
|
|
24
|
+
[key: string]: any;
|
|
25
|
+
}
|
|
26
|
+
/** 选择模式 */
|
|
27
|
+
export type TreeSelectMode = 'single' | 'multiple' | 'checkbox';
|
|
28
|
+
/** Tree 属性 */
|
|
29
|
+
export interface TreeProps {
|
|
30
|
+
/** 树形数据 */
|
|
31
|
+
treeData?: TreeNode[];
|
|
32
|
+
/** 当前选中的节点 key */
|
|
33
|
+
selectedKeys?: string[];
|
|
34
|
+
/** 默认选中的节点 key */
|
|
35
|
+
defaultSelectedKeys?: string[];
|
|
36
|
+
/** 当前展开的节点 key */
|
|
37
|
+
expandedKeys?: string[];
|
|
38
|
+
/** 默认展开的节点 key */
|
|
39
|
+
defaultExpandedKeys?: string[];
|
|
40
|
+
/** 是否默认展开所有节点 */
|
|
41
|
+
defaultExpandAll?: boolean;
|
|
42
|
+
/** 是否显示复选框 */
|
|
43
|
+
checkable?: boolean;
|
|
44
|
+
/** 是否多选 */
|
|
45
|
+
multiple?: boolean;
|
|
46
|
+
/** 是否禁用 */
|
|
47
|
+
disabled?: boolean;
|
|
48
|
+
/** 是否显示连接线 */
|
|
49
|
+
showLine?: boolean;
|
|
50
|
+
/** 是否显示图标 */
|
|
51
|
+
showIcon?: boolean;
|
|
52
|
+
/** 自定义图标 */
|
|
53
|
+
icon?: (props: {
|
|
54
|
+
expanded: boolean;
|
|
55
|
+
isLeaf: boolean;
|
|
56
|
+
}) => ReactNode;
|
|
57
|
+
/** 节点点击回调 */
|
|
58
|
+
onSelect?: (selectedKeys: string[], info: {
|
|
59
|
+
node: TreeNode;
|
|
60
|
+
selected: boolean;
|
|
61
|
+
nativeEvent: MouseEvent;
|
|
62
|
+
}) => void;
|
|
63
|
+
/** 节点展开/收起回调 */
|
|
64
|
+
onExpand?: (expandedKeys: string[], info: {
|
|
65
|
+
node: TreeNode;
|
|
66
|
+
expanded: boolean;
|
|
67
|
+
}) => void;
|
|
68
|
+
/** 节点双击回调 */
|
|
69
|
+
onDoubleClick?: (e: React.MouseEvent, node: TreeNode) => void;
|
|
70
|
+
/** 节点右键回调 */
|
|
71
|
+
onRightClick?: (e: React.MouseEvent, node: TreeNode) => void;
|
|
72
|
+
/** 自定义类名 */
|
|
73
|
+
className?: string;
|
|
74
|
+
/** 自定义样式 */
|
|
75
|
+
style?: CSSProperties;
|
|
76
|
+
/** 自定义节点渲染 */
|
|
77
|
+
titleRender?: (node: TreeNode) => ReactNode;
|
|
78
|
+
/** 块节点 */
|
|
79
|
+
blockNode?: boolean;
|
|
80
|
+
}
|
|
81
|
+
export declare const Tree: React.FC<TreeProps>;
|
|
82
|
+
export default Tree;
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|
2
|
+
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
3
|
+
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
|
4
|
+
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
|
5
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
6
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
7
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
8
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
9
|
+
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
10
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
11
|
+
import React, { useState, useCallback } from 'react';
|
|
12
|
+
import "./style.less";
|
|
13
|
+
|
|
14
|
+
// ============ 类型定义 ============
|
|
15
|
+
|
|
16
|
+
/** 树节点数据 */
|
|
17
|
+
|
|
18
|
+
/** 选择模式 */
|
|
19
|
+
|
|
20
|
+
/** Tree 属性 */
|
|
21
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
22
|
+
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
23
|
+
// ============ Tree 组件 ============
|
|
24
|
+
|
|
25
|
+
export var Tree = function Tree(_ref) {
|
|
26
|
+
var _ref$treeData = _ref.treeData,
|
|
27
|
+
treeData = _ref$treeData === void 0 ? [] : _ref$treeData,
|
|
28
|
+
controlledSelectedKeys = _ref.selectedKeys,
|
|
29
|
+
_ref$defaultSelectedK = _ref.defaultSelectedKeys,
|
|
30
|
+
defaultSelectedKeys = _ref$defaultSelectedK === void 0 ? [] : _ref$defaultSelectedK,
|
|
31
|
+
controlledExpandedKeys = _ref.expandedKeys,
|
|
32
|
+
_ref$defaultExpandedK = _ref.defaultExpandedKeys,
|
|
33
|
+
defaultExpandedKeys = _ref$defaultExpandedK === void 0 ? [] : _ref$defaultExpandedK,
|
|
34
|
+
_ref$defaultExpandAll = _ref.defaultExpandAll,
|
|
35
|
+
defaultExpandAll = _ref$defaultExpandAll === void 0 ? false : _ref$defaultExpandAll,
|
|
36
|
+
_ref$checkable = _ref.checkable,
|
|
37
|
+
checkable = _ref$checkable === void 0 ? false : _ref$checkable,
|
|
38
|
+
_ref$multiple = _ref.multiple,
|
|
39
|
+
multiple = _ref$multiple === void 0 ? false : _ref$multiple,
|
|
40
|
+
_ref$disabled = _ref.disabled,
|
|
41
|
+
disabled = _ref$disabled === void 0 ? false : _ref$disabled,
|
|
42
|
+
_ref$showLine = _ref.showLine,
|
|
43
|
+
showLine = _ref$showLine === void 0 ? false : _ref$showLine,
|
|
44
|
+
_ref$showIcon = _ref.showIcon,
|
|
45
|
+
showIcon = _ref$showIcon === void 0 ? false : _ref$showIcon,
|
|
46
|
+
icon = _ref.icon,
|
|
47
|
+
onSelect = _ref.onSelect,
|
|
48
|
+
onExpand = _ref.onExpand,
|
|
49
|
+
_onDoubleClick = _ref.onDoubleClick,
|
|
50
|
+
onRightClick = _ref.onRightClick,
|
|
51
|
+
_ref$className = _ref.className,
|
|
52
|
+
className = _ref$className === void 0 ? '' : _ref$className,
|
|
53
|
+
style = _ref.style,
|
|
54
|
+
titleRender = _ref.titleRender,
|
|
55
|
+
_ref$blockNode = _ref.blockNode,
|
|
56
|
+
blockNode = _ref$blockNode === void 0 ? false : _ref$blockNode;
|
|
57
|
+
var _useState = useState(defaultSelectedKeys),
|
|
58
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
59
|
+
internalSelectedKeys = _useState2[0],
|
|
60
|
+
setInternalSelectedKeys = _useState2[1];
|
|
61
|
+
var _useState3 = useState(function () {
|
|
62
|
+
if (defaultExpandAll) {
|
|
63
|
+
var getAllKeys = function getAllKeys(nodes) {
|
|
64
|
+
var keys = [];
|
|
65
|
+
nodes.forEach(function (node) {
|
|
66
|
+
if (node.children && node.children.length > 0) {
|
|
67
|
+
keys.push(node.key);
|
|
68
|
+
keys.push.apply(keys, _toConsumableArray(getAllKeys(node.children)));
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
return keys;
|
|
72
|
+
};
|
|
73
|
+
return getAllKeys(treeData);
|
|
74
|
+
}
|
|
75
|
+
return defaultExpandedKeys;
|
|
76
|
+
}),
|
|
77
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
78
|
+
internalExpandedKeys = _useState4[0],
|
|
79
|
+
setInternalExpandedKeys = _useState4[1];
|
|
80
|
+
var selectedKeys = controlledSelectedKeys !== null && controlledSelectedKeys !== void 0 ? controlledSelectedKeys : internalSelectedKeys;
|
|
81
|
+
var expandedKeys = controlledExpandedKeys !== null && controlledExpandedKeys !== void 0 ? controlledExpandedKeys : internalExpandedKeys;
|
|
82
|
+
|
|
83
|
+
// 处理节点选择
|
|
84
|
+
var handleSelect = useCallback(function (node, e) {
|
|
85
|
+
if (node.disabled || node.selectable === false || disabled) return;
|
|
86
|
+
var isSelected = selectedKeys.includes(node.key);
|
|
87
|
+
var newSelectedKeys;
|
|
88
|
+
if (checkable || multiple) {
|
|
89
|
+
// 多选模式
|
|
90
|
+
if (isSelected) {
|
|
91
|
+
newSelectedKeys = selectedKeys.filter(function (key) {
|
|
92
|
+
return key !== node.key;
|
|
93
|
+
});
|
|
94
|
+
} else {
|
|
95
|
+
newSelectedKeys = [].concat(_toConsumableArray(selectedKeys), [node.key]);
|
|
96
|
+
}
|
|
97
|
+
} else {
|
|
98
|
+
// 单选模式
|
|
99
|
+
newSelectedKeys = isSelected ? [] : [node.key];
|
|
100
|
+
}
|
|
101
|
+
if (controlledSelectedKeys === undefined) {
|
|
102
|
+
setInternalSelectedKeys(newSelectedKeys);
|
|
103
|
+
}
|
|
104
|
+
onSelect === null || onSelect === void 0 || onSelect(newSelectedKeys, {
|
|
105
|
+
node: node,
|
|
106
|
+
selected: !isSelected,
|
|
107
|
+
nativeEvent: e.nativeEvent
|
|
108
|
+
});
|
|
109
|
+
}, [selectedKeys, checkable, multiple, disabled, controlledSelectedKeys, onSelect]);
|
|
110
|
+
|
|
111
|
+
// 处理节点展开/收起
|
|
112
|
+
var handleExpand = useCallback(function (node, e) {
|
|
113
|
+
e.stopPropagation();
|
|
114
|
+
if (node.disabled || disabled) return;
|
|
115
|
+
var isExpanded = expandedKeys.includes(node.key);
|
|
116
|
+
var newExpandedKeys = isExpanded ? expandedKeys.filter(function (key) {
|
|
117
|
+
return key !== node.key;
|
|
118
|
+
}) : [].concat(_toConsumableArray(expandedKeys), [node.key]);
|
|
119
|
+
if (controlledExpandedKeys === undefined) {
|
|
120
|
+
setInternalExpandedKeys(newExpandedKeys);
|
|
121
|
+
}
|
|
122
|
+
onExpand === null || onExpand === void 0 || onExpand(newExpandedKeys, {
|
|
123
|
+
node: node,
|
|
124
|
+
expanded: !isExpanded
|
|
125
|
+
});
|
|
126
|
+
}, [expandedKeys, disabled, controlledExpandedKeys, onExpand]);
|
|
127
|
+
|
|
128
|
+
// 渲染树节点
|
|
129
|
+
var renderTreeNode = useCallback(function (node) {
|
|
130
|
+
var _node$isLeaf;
|
|
131
|
+
var level = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
|
|
132
|
+
var hasChildren = node.children && node.children.length > 0;
|
|
133
|
+
var isExpanded = expandedKeys.includes(node.key);
|
|
134
|
+
var isSelected = selectedKeys.includes(node.key);
|
|
135
|
+
var isDisabled = node.disabled || disabled;
|
|
136
|
+
var isLeaf = (_node$isLeaf = node.isLeaf) !== null && _node$isLeaf !== void 0 ? _node$isLeaf : !hasChildren;
|
|
137
|
+
var nodeClassNames = ['kage-tree-treenode', isSelected && 'kage-tree-treenode-selected', isDisabled && 'kage-tree-treenode-disabled', blockNode && 'kage-tree-treenode-block-node', node.className].filter(Boolean).join(' ');
|
|
138
|
+
|
|
139
|
+
// 渲染图标
|
|
140
|
+
var renderIcon = function renderIcon() {
|
|
141
|
+
if (showIcon && icon) {
|
|
142
|
+
return /*#__PURE__*/_jsx("span", {
|
|
143
|
+
className: "kage-tree-icon",
|
|
144
|
+
children: icon({
|
|
145
|
+
expanded: isExpanded,
|
|
146
|
+
isLeaf: isLeaf
|
|
147
|
+
})
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
if (showIcon && node.icon) {
|
|
151
|
+
return /*#__PURE__*/_jsx("span", {
|
|
152
|
+
className: "kage-tree-icon",
|
|
153
|
+
children: node.icon
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
return null;
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
// 渲染展开/收起图标
|
|
160
|
+
var renderSwitcher = function renderSwitcher() {
|
|
161
|
+
if (isLeaf) {
|
|
162
|
+
return /*#__PURE__*/_jsx("span", {
|
|
163
|
+
className: "kage-tree-switcher kage-tree-switcher-noop"
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
return /*#__PURE__*/_jsx("span", {
|
|
167
|
+
className: "kage-tree-switcher ".concat(isExpanded ? 'kage-tree-switcher-open' : 'kage-tree-switcher-close'),
|
|
168
|
+
onClick: function onClick(e) {
|
|
169
|
+
return handleExpand(node, e);
|
|
170
|
+
},
|
|
171
|
+
children: showLine ? isExpanded ? '▼' : '▶' : isExpanded ? '▼' : '▶'
|
|
172
|
+
});
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
// 渲染复选框
|
|
176
|
+
var renderCheckbox = function renderCheckbox() {
|
|
177
|
+
if (!checkable) return null;
|
|
178
|
+
return /*#__PURE__*/_jsx("span", {
|
|
179
|
+
className: "kage-tree-checkbox ".concat(isSelected ? 'kage-tree-checkbox-checked' : '', " ").concat(isDisabled ? 'kage-tree-checkbox-disabled' : ''),
|
|
180
|
+
onClick: function onClick(e) {
|
|
181
|
+
e.stopPropagation();
|
|
182
|
+
handleSelect(node, e);
|
|
183
|
+
},
|
|
184
|
+
children: isSelected && '✓'
|
|
185
|
+
});
|
|
186
|
+
};
|
|
187
|
+
return /*#__PURE__*/_jsxs("div", {
|
|
188
|
+
className: nodeClassNames,
|
|
189
|
+
style: node.style,
|
|
190
|
+
children: [/*#__PURE__*/_jsxs("div", {
|
|
191
|
+
className: "kage-tree-node-content",
|
|
192
|
+
style: {
|
|
193
|
+
paddingLeft: "".concat(level * 24, "px")
|
|
194
|
+
},
|
|
195
|
+
onClick: function onClick(e) {
|
|
196
|
+
return !checkable && handleSelect(node, e);
|
|
197
|
+
},
|
|
198
|
+
onDoubleClick: function onDoubleClick(e) {
|
|
199
|
+
return _onDoubleClick === null || _onDoubleClick === void 0 ? void 0 : _onDoubleClick(e, node);
|
|
200
|
+
},
|
|
201
|
+
onContextMenu: function onContextMenu(e) {
|
|
202
|
+
return onRightClick === null || onRightClick === void 0 ? void 0 : onRightClick(e, node);
|
|
203
|
+
},
|
|
204
|
+
children: [renderSwitcher(), renderCheckbox(), renderIcon(), /*#__PURE__*/_jsx("span", {
|
|
205
|
+
className: "kage-tree-title",
|
|
206
|
+
children: titleRender ? titleRender(node) : node.title
|
|
207
|
+
})]
|
|
208
|
+
}), hasChildren && isExpanded && /*#__PURE__*/_jsx("div", {
|
|
209
|
+
className: "kage-tree-child-tree",
|
|
210
|
+
children: node.children.map(function (child) {
|
|
211
|
+
return renderTreeNode(child, level + 1);
|
|
212
|
+
})
|
|
213
|
+
})]
|
|
214
|
+
}, node.key);
|
|
215
|
+
}, [expandedKeys, selectedKeys, disabled, checkable, showIcon, icon, showLine, blockNode, titleRender, handleSelect, handleExpand, _onDoubleClick, onRightClick]);
|
|
216
|
+
var classNames = ['kage-tree', showLine && 'kage-tree-show-line', className].filter(Boolean).join(' ');
|
|
217
|
+
return /*#__PURE__*/_jsx("div", {
|
|
218
|
+
className: classNames,
|
|
219
|
+
style: style,
|
|
220
|
+
children: treeData.map(function (node) {
|
|
221
|
+
return renderTreeNode(node, 0);
|
|
222
|
+
})
|
|
223
|
+
});
|
|
224
|
+
};
|
|
225
|
+
export default Tree;
|