@tddc/assign-modal 3.1.0 → 3.1.2
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/README.md +495 -0
- package/package.json +1 -1
package/README.md
ADDED
|
@@ -0,0 +1,495 @@
|
|
|
1
|
+
# AssignModal 授权弹窗组件
|
|
2
|
+
|
|
3
|
+
用于管理机构、应用(渠道)、用户授权的复杂业务组件,支持树形机构选择、多选应用和用户,以及全局授权等功能。
|
|
4
|
+
|
|
5
|
+
## 特性
|
|
6
|
+
|
|
7
|
+
- 🌲 **树形机构选择**:支持多级机构树形结构,带有智能联动逻辑
|
|
8
|
+
- 🔄 **智能联动**:选中子机构自动勾选上级,取消上级自动取消下级
|
|
9
|
+
- 🌐 **全局授权**:支持一键授权所有机构/应用/用户
|
|
10
|
+
- 👁 **双模式**:编辑模式和查看模式自动切换
|
|
11
|
+
- 🔍 **搜索过滤**:支持对机构、应用、用户进行实时搜索
|
|
12
|
+
- 🌍 **国际化**:内置中英文支持,可自定义语言包
|
|
13
|
+
- 🎨 **自定义禁用**:支持自定义机构和应用的禁用规则
|
|
14
|
+
|
|
15
|
+
## 安装
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install @tddc/assign-modal --save
|
|
19
|
+
# 或
|
|
20
|
+
yarn add @tddc/assign-modal
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## 基础用法
|
|
24
|
+
|
|
25
|
+
```jsx
|
|
26
|
+
import React, { useState } from 'react';
|
|
27
|
+
import { Button, message } from 'tntd';
|
|
28
|
+
import AssignModal from '@tddc/assign-modal';
|
|
29
|
+
|
|
30
|
+
const Example = () => {
|
|
31
|
+
const [visible, setVisible] = useState(false);
|
|
32
|
+
|
|
33
|
+
// 机构列表(树形结构)
|
|
34
|
+
const orgList = [
|
|
35
|
+
{
|
|
36
|
+
uuid: 'org-1',
|
|
37
|
+
code: 'ROOT',
|
|
38
|
+
name: '总公司',
|
|
39
|
+
level: 1,
|
|
40
|
+
children: [
|
|
41
|
+
{
|
|
42
|
+
uuid: 'org-2',
|
|
43
|
+
code: 'BRANCH_A',
|
|
44
|
+
name: '分公司A',
|
|
45
|
+
level: 2,
|
|
46
|
+
children: [],
|
|
47
|
+
},
|
|
48
|
+
],
|
|
49
|
+
},
|
|
50
|
+
];
|
|
51
|
+
|
|
52
|
+
// 应用列表
|
|
53
|
+
const appList = [
|
|
54
|
+
{ uuid: 'app-1', name: 'APP1', value: 'APP1', label: '应用系统1' },
|
|
55
|
+
{ uuid: 'app-2', name: 'APP2', value: 'APP2', label: '应用系统2' },
|
|
56
|
+
];
|
|
57
|
+
|
|
58
|
+
// 用户列表(可选)
|
|
59
|
+
const userList = [
|
|
60
|
+
{ uuid: 'user-1', account: 'user1', userName: '用户A', orgCode: 'ROOT' },
|
|
61
|
+
{ uuid: 'user-2', account: 'user2', userName: '用户B', orgCode: 'BRANCH_A' },
|
|
62
|
+
];
|
|
63
|
+
|
|
64
|
+
// 授权数据
|
|
65
|
+
const dataItem = {
|
|
66
|
+
orgCode: 'ROOT',
|
|
67
|
+
appCode: 'APP1',
|
|
68
|
+
account: 'user1',
|
|
69
|
+
orgCodes: ['ROOT'],
|
|
70
|
+
appCodes: ['APP1'],
|
|
71
|
+
accounts: ['user1'],
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
const handleSubmit = (data) => {
|
|
75
|
+
console.log('授权数据:', data);
|
|
76
|
+
message.success('授权成功');
|
|
77
|
+
setVisible(false);
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
return (
|
|
81
|
+
<>
|
|
82
|
+
<Button onClick={() => setVisible(true)}>配置权限</Button>
|
|
83
|
+
<AssignModal
|
|
84
|
+
visible={visible}
|
|
85
|
+
title="权限配置"
|
|
86
|
+
orgList={orgList}
|
|
87
|
+
appList={appList}
|
|
88
|
+
userList={userList}
|
|
89
|
+
dataItem={dataItem}
|
|
90
|
+
showUser={true}
|
|
91
|
+
onSubmit={handleSubmit}
|
|
92
|
+
close={() => setVisible(false)}
|
|
93
|
+
/>
|
|
94
|
+
</>
|
|
95
|
+
);
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
export default Example;
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## 授权逻辑说明
|
|
102
|
+
|
|
103
|
+
### 机构树联动规则
|
|
104
|
+
|
|
105
|
+
- **选中子机构**:点击授权某下级机构时,该机构的所有上级机构会自动一起授权
|
|
106
|
+
- **取消上级机构**:点击取消某上级机构授权时,该机构的所有下级机构会自动一起取消授权
|
|
107
|
+
- **所属机构保护**:组件所属机构及其上级机构默认授权勾选且置灰,不得修改
|
|
108
|
+
- **全局授权**:勾选全局时,系统内所有机构都被授权,返回数据中 `checkedKeys = ['all']`
|
|
109
|
+
|
|
110
|
+
### 渠道授权规则
|
|
111
|
+
|
|
112
|
+
- **多选模式**:支持选择多个渠道
|
|
113
|
+
- **所属渠道保护**:组件所属渠道默认授权勾选且置灰,不得修改
|
|
114
|
+
- **全局授权**:勾选全局时,系统内所有渠道都被授权,返回数据中 `appKeys = ['all']`
|
|
115
|
+
|
|
116
|
+
### 用户授权规则
|
|
117
|
+
|
|
118
|
+
- **多选模式**:支持选择多个用户
|
|
119
|
+
- **所属用户保护**:组件所属用户默认授权勾选且置灰,不得修改
|
|
120
|
+
- **全局授权**:勾选全局时,系统内所有用户都被授权,返回数据中 `userKeys = ['all']`
|
|
121
|
+
|
|
122
|
+
## API
|
|
123
|
+
|
|
124
|
+
### Props
|
|
125
|
+
|
|
126
|
+
| 参数 | 说明 | 类型 | 默认值 | 版本 |
|
|
127
|
+
| --- | --- | --- | --- | --- |
|
|
128
|
+
| visible | 弹窗是否可见 | `boolean` | `false` | - |
|
|
129
|
+
| disabled | 是否禁用编辑(开启后为查看模式) | `boolean` | `false` | - |
|
|
130
|
+
| title | 弹窗标题 | `string` | - | - |
|
|
131
|
+
| okText | 确定按钮文字 | `string` | `'确定'` | - |
|
|
132
|
+
| cancelText | 取消按钮文字 | `string` | `'取消'` | - |
|
|
133
|
+
| orgList | 机构列表,见下方 [orgList 数据结构](#orglist-数据结构) | `Array<OrgNode>` | `[]` | - |
|
|
134
|
+
| appList | 应用列表,见下方 [appList 数据结构](#applist-数据结构) | `Array<AppNode>` | `[]` | - |
|
|
135
|
+
| userList | 用户列表,见下方 [userList 数据结构](#userlist-数据结构) | `Array<UserNode>` | `[]` | - |
|
|
136
|
+
| dataItem | 授权数据项,见下方 [dataItem 数据结构](#dataitem-数据结构) | `DataItem` | - | - |
|
|
137
|
+
| showUser | 是否展示用户授权面板 | `boolean` | `false` | - |
|
|
138
|
+
| onSubmit | 确定操作回调 | `(data: SubmitData) => void` | - | - |
|
|
139
|
+
| close | 关闭操作回调 | `() => void` | - | - |
|
|
140
|
+
| lang | 语言设置,支持 `cn`、`en` | `string` | `'cn'` | - |
|
|
141
|
+
| locale | 自定义语言包(会覆盖内置语言包) | `object` | - | - |
|
|
142
|
+
| orgTitle | 机构列表面板标题 | `string` | `'可用机构'` | - |
|
|
143
|
+
| appTitle | 应用列表面板标题 | `string` | `'可用渠道'` | - |
|
|
144
|
+
| userTitle | 用户列表面板标题 | `string` | `'可用用户'` | - |
|
|
145
|
+
| orgCheckboxTitle | 机构全局授权复选框标题 | `string` | `'全部机构可用'` | - |
|
|
146
|
+
| appCheckboxTitle | 应用全局授权复选框标题 | `string` | `'全部渠道可用'` | - |
|
|
147
|
+
| userCheckboxTitle | 用户全局授权复选框标题 | `string` | `'全部用户可用'` | - |
|
|
148
|
+
| customOrgDisabled | 自定义机构禁用规则 | `(org: OrgNode) => boolean` | - | - |
|
|
149
|
+
| customAppDisabled | 自定义应用禁用规则 | `(app: AppNode) => boolean` | - | - |
|
|
150
|
+
|
|
151
|
+
### orgList 数据结构
|
|
152
|
+
|
|
153
|
+
机构列表为树形结构数组,每个节点包含以下字段:
|
|
154
|
+
|
|
155
|
+
```javascript
|
|
156
|
+
[
|
|
157
|
+
{
|
|
158
|
+
uuid: 'org-1',
|
|
159
|
+
code: 'ROOT',
|
|
160
|
+
level: 1,
|
|
161
|
+
name: '总公司',
|
|
162
|
+
children: [
|
|
163
|
+
{
|
|
164
|
+
uuid: 'org-2',
|
|
165
|
+
code: 'BRANCH_A',
|
|
166
|
+
level: 2,
|
|
167
|
+
parentUuid: 'org-1',
|
|
168
|
+
name: '分公司A',
|
|
169
|
+
children: [
|
|
170
|
+
{
|
|
171
|
+
uuid: 'org-3',
|
|
172
|
+
code: 'DEPT_A1',
|
|
173
|
+
level: 3,
|
|
174
|
+
parentUuid: 'org-2',
|
|
175
|
+
name: '部门A1',
|
|
176
|
+
children: [],
|
|
177
|
+
},
|
|
178
|
+
],
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
uuid: 'org-4',
|
|
182
|
+
code: 'BRANCH_B',
|
|
183
|
+
level: 2,
|
|
184
|
+
parentUuid: 'org-1',
|
|
185
|
+
name: '分公司B',
|
|
186
|
+
children: [],
|
|
187
|
+
},
|
|
188
|
+
],
|
|
189
|
+
},
|
|
190
|
+
];
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
**字段说明:**
|
|
194
|
+
|
|
195
|
+
- `uuid`:机构唯一标识
|
|
196
|
+
- `code`:机构编码(**必需**)
|
|
197
|
+
- `name`:机构名称(**必需**)
|
|
198
|
+
- `level`:机构层级
|
|
199
|
+
- `children`:子机构数组(**必需**,即使为空也要提供空数组)
|
|
200
|
+
- `orgAttribute`:机构属性(`1` 为职能部门,会显示特殊标签)
|
|
201
|
+
|
|
202
|
+
### appList 数据结构
|
|
203
|
+
|
|
204
|
+
应用列表为扁平数组,每个应用包含以下字段:
|
|
205
|
+
|
|
206
|
+
```javascript
|
|
207
|
+
[
|
|
208
|
+
{
|
|
209
|
+
uuid: 'app-1',
|
|
210
|
+
name: 'APP1',
|
|
211
|
+
displayName: '应用系统1',
|
|
212
|
+
label: '应用系统1',
|
|
213
|
+
value: 'APP1',
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
uuid: 'app-2',
|
|
217
|
+
name: 'APP2',
|
|
218
|
+
displayName: '应用系统2',
|
|
219
|
+
label: '应用系统2',
|
|
220
|
+
value: 'APP2',
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
uuid: 'app-3',
|
|
224
|
+
name: 'APP3',
|
|
225
|
+
displayName: '应用系统3',
|
|
226
|
+
label: '应用系统3',
|
|
227
|
+
value: 'APP3',
|
|
228
|
+
},
|
|
229
|
+
];
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
**字段说明:**
|
|
233
|
+
|
|
234
|
+
- `uuid`:应用唯一标识
|
|
235
|
+
- `name`:应用编码
|
|
236
|
+
- `value`:应用值(**必需**)
|
|
237
|
+
- `label` / `displayName`:应用显示名称(**必需**)
|
|
238
|
+
|
|
239
|
+
### userList 数据结构
|
|
240
|
+
|
|
241
|
+
用户列表为扁平数组,每个用户包含以下字段:
|
|
242
|
+
|
|
243
|
+
```javascript
|
|
244
|
+
[
|
|
245
|
+
{
|
|
246
|
+
uuid: 'user-1',
|
|
247
|
+
account: 'user1',
|
|
248
|
+
userName: '用户A',
|
|
249
|
+
orgCode: 'ROOT',
|
|
250
|
+
status: 0,
|
|
251
|
+
},
|
|
252
|
+
{
|
|
253
|
+
uuid: 'user-2',
|
|
254
|
+
account: 'user2',
|
|
255
|
+
userName: '用户B',
|
|
256
|
+
orgCode: 'BRANCH_A',
|
|
257
|
+
status: 0,
|
|
258
|
+
},
|
|
259
|
+
];
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
**字段说明:**
|
|
263
|
+
|
|
264
|
+
- `uuid`:用户唯一标识
|
|
265
|
+
- `account`:用户账号(**必需**)
|
|
266
|
+
- `userName`:用户名称(**必需**)
|
|
267
|
+
- `orgCode`:所属机构编码
|
|
268
|
+
- `status`:用户状态
|
|
269
|
+
|
|
270
|
+
### dataItem 数据结构
|
|
271
|
+
|
|
272
|
+
授权数据项,用于初始化组件的授权状态:
|
|
273
|
+
|
|
274
|
+
```javascript
|
|
275
|
+
{
|
|
276
|
+
// 所属信息(会被自动选中且禁用)
|
|
277
|
+
orgCode: 'ROOT', // 所属机构编码
|
|
278
|
+
appCode: 'APP1', // 所属应用编码
|
|
279
|
+
account: 'user1', // 所属用户账号
|
|
280
|
+
|
|
281
|
+
// 已授权列表
|
|
282
|
+
orgCodes: ['ROOT', 'BRANCH_A'], // 已授权的机构编码列表,['all'] 表示全局授权
|
|
283
|
+
appCodes: ['APP1', 'APP2'], // 已授权的应用编码列表,['all'] 表示全局授权
|
|
284
|
+
accounts: ['user1', 'user2'] // 已授权的用户账号列表,['all'] 表示全局授权
|
|
285
|
+
}
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
### onSubmit 回调数据格式
|
|
289
|
+
|
|
290
|
+
点击确定按钮时,会触发 `onSubmit` 回调,返回的数据格式如下:
|
|
291
|
+
|
|
292
|
+
```javascript
|
|
293
|
+
{
|
|
294
|
+
// 授权的编码列表
|
|
295
|
+
checkedKeys: ['ROOT', 'BRANCH_A'] | ['all'], // 机构编码列表
|
|
296
|
+
appKeys: ['APP1', 'APP2'] | ['all'], // 应用编码列表
|
|
297
|
+
userKeys: ['user1', 'user2'] | ['all'], // 用户账号列表
|
|
298
|
+
|
|
299
|
+
// 是否全局授权标识
|
|
300
|
+
orgCheckAll: false, // 机构是否全局授权
|
|
301
|
+
appCheckAll: false, // 应用是否全局授权
|
|
302
|
+
userCheckAll: false, // 用户是否全局授权
|
|
303
|
+
|
|
304
|
+
// 实际数据(包含全部的具体编码,不使用 'all')
|
|
305
|
+
checkData: {
|
|
306
|
+
orgs: ['ROOT', 'BRANCH_A', ...], // 所有被授权的机构编码
|
|
307
|
+
apps: ['APP1', 'APP2', ...], // 所有被授权的应用编码
|
|
308
|
+
accounts: ['user1', 'user2', ...] // 所有被授权的用户账号
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
**数据说明:**
|
|
314
|
+
|
|
315
|
+
- 当选择全局授权时,`checkedKeys`/`appKeys`/`userKeys` 的值为 `['all']`
|
|
316
|
+
- `checkData` 中始终包含具体的编码列表,即使选择了全局授权
|
|
317
|
+
- 使用 `orgCheckAll`/`appCheckAll`/`userCheckAll` 可以判断是否为全局授权
|
|
318
|
+
|
|
319
|
+
## 高级用法
|
|
320
|
+
|
|
321
|
+
### 查看模式
|
|
322
|
+
|
|
323
|
+
将 `disabled` 设置为 `true` 即可切换为查看模式,此时不显示操作按钮,所有选项为只读状态:
|
|
324
|
+
|
|
325
|
+
```jsx
|
|
326
|
+
<AssignModal
|
|
327
|
+
visible={true}
|
|
328
|
+
disabled={true} // 查看模式
|
|
329
|
+
orgList={orgList}
|
|
330
|
+
appList={appList}
|
|
331
|
+
dataItem={dataItem}
|
|
332
|
+
close={() => setVisible(false)}
|
|
333
|
+
/>
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
### 自定义禁用规则
|
|
337
|
+
|
|
338
|
+
可以通过 `customOrgDisabled` 和 `customAppDisabled` 自定义禁用规则:
|
|
339
|
+
|
|
340
|
+
```jsx
|
|
341
|
+
<AssignModal
|
|
342
|
+
visible={true}
|
|
343
|
+
orgList={orgList}
|
|
344
|
+
appList={appList}
|
|
345
|
+
dataItem={dataItem}
|
|
346
|
+
// 自定义机构禁用规则:禁用 3 级以下机构
|
|
347
|
+
customOrgDisabled={(org) => org.level > 3}
|
|
348
|
+
// 自定义应用禁用规则:禁用非激活状态的应用
|
|
349
|
+
customAppDisabled={(app) => app.status !== 'active'}
|
|
350
|
+
onSubmit={(data) => console.log(data)}
|
|
351
|
+
close={() => setVisible(false)}
|
|
352
|
+
/>
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
### 国际化配置
|
|
356
|
+
|
|
357
|
+
#### 使用内置语言
|
|
358
|
+
|
|
359
|
+
组件内置中英文支持,通过 `lang` 属性切换:
|
|
360
|
+
|
|
361
|
+
```jsx
|
|
362
|
+
<AssignModal
|
|
363
|
+
visible={true}
|
|
364
|
+
lang="en" // 'cn' | 'en'
|
|
365
|
+
orgList={orgList}
|
|
366
|
+
appList={appList}
|
|
367
|
+
dataItem={dataItem}
|
|
368
|
+
onSubmit={(data) => console.log(data)}
|
|
369
|
+
close={() => setVisible(false)}
|
|
370
|
+
/>
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
#### 自定义语言包
|
|
374
|
+
|
|
375
|
+
可以通过 `locale` 属性传入自定义语言包,会覆盖内置语言包:
|
|
376
|
+
|
|
377
|
+
```jsx
|
|
378
|
+
const customLocale = {
|
|
379
|
+
authorizesOrgList: '自定义机构列表',
|
|
380
|
+
allOrgAvailable: '自定义全部机构',
|
|
381
|
+
search: '自定义搜索提示',
|
|
382
|
+
// ... 更多文案
|
|
383
|
+
};
|
|
384
|
+
|
|
385
|
+
<AssignModal
|
|
386
|
+
visible={true}
|
|
387
|
+
locale={customLocale}
|
|
388
|
+
orgList={orgList}
|
|
389
|
+
appList={appList}
|
|
390
|
+
dataItem={dataItem}
|
|
391
|
+
onSubmit={(data) => console.log(data)}
|
|
392
|
+
close={() => setVisible(false)}
|
|
393
|
+
/>;
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
### 自定义标题
|
|
397
|
+
|
|
398
|
+
可以自定义各个面板的标题:
|
|
399
|
+
|
|
400
|
+
```jsx
|
|
401
|
+
<AssignModal
|
|
402
|
+
visible={true}
|
|
403
|
+
title="权限配置"
|
|
404
|
+
orgTitle="授权机构"
|
|
405
|
+
appTitle="授权渠道"
|
|
406
|
+
userTitle="授权账号"
|
|
407
|
+
orgCheckboxTitle="授权全部机构"
|
|
408
|
+
appCheckboxTitle="授权全部渠道"
|
|
409
|
+
userCheckboxTitle="授权全部账号"
|
|
410
|
+
orgList={orgList}
|
|
411
|
+
appList={appList}
|
|
412
|
+
userList={userList}
|
|
413
|
+
dataItem={dataItem}
|
|
414
|
+
showUser={true}
|
|
415
|
+
onSubmit={(data) => console.log(data)}
|
|
416
|
+
close={() => setVisible(false)}
|
|
417
|
+
/>
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
### 只使用机构和应用
|
|
421
|
+
|
|
422
|
+
如果不需要用户授权功能,不传 `showUser` 或设置为 `false` 即可:
|
|
423
|
+
|
|
424
|
+
```jsx
|
|
425
|
+
<AssignModal
|
|
426
|
+
visible={true}
|
|
427
|
+
orgList={orgList}
|
|
428
|
+
appList={appList}
|
|
429
|
+
dataItem={dataItem}
|
|
430
|
+
showUser={false} // 或不传此属性
|
|
431
|
+
onSubmit={(data) => console.log(data)}
|
|
432
|
+
close={() => setVisible(false)}
|
|
433
|
+
/>
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
## 常见问题
|
|
437
|
+
|
|
438
|
+
### 1. 机构树不显示?
|
|
439
|
+
|
|
440
|
+
确保每个机构节点包含必需字段:`code`(机构编码)、`name`(机构名称)、`children`(子机构数组)
|
|
441
|
+
|
|
442
|
+
### 2. 所属机构/应用无法取消?
|
|
443
|
+
|
|
444
|
+
这是保护机制,`dataItem` 中的 `orgCode`、`appCode`、`account` 会被自动选中且禁用,确保组件至少有基本的授权。
|
|
445
|
+
|
|
446
|
+
### 3. 如何判断全局授权?
|
|
447
|
+
|
|
448
|
+
通过 `orgCheckAll`/`appCheckAll`/`userCheckAll` 字段或判断 `checkedKeys`/`appKeys`/`userKeys` 是否为 `['all']`
|
|
449
|
+
|
|
450
|
+
### 4. 如何预填充授权数据?
|
|
451
|
+
|
|
452
|
+
通过 `dataItem` 传入已有的授权数据:
|
|
453
|
+
|
|
454
|
+
```javascript
|
|
455
|
+
const dataItem = {
|
|
456
|
+
orgCode: 'ROOT', // 所属机构(必填)
|
|
457
|
+
appCode: 'APP1', // 所属应用(必填)
|
|
458
|
+
orgCodes: ['ROOT', 'BRANCH_A'], // 已授权的机构列表
|
|
459
|
+
appCodes: ['APP1', 'APP2'], // 已授权的应用列表
|
|
460
|
+
};
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
## 依赖
|
|
464
|
+
|
|
465
|
+
- `react`: >= 16.8.0
|
|
466
|
+
- `tntd`:组件库
|
|
467
|
+
- `universal-cookie`:Cookie 管理
|
|
468
|
+
- `lodash`:工具函数库
|
|
469
|
+
|
|
470
|
+
## 注意事项
|
|
471
|
+
|
|
472
|
+
1. **数据格式**:务必确保 `orgList`、`appList`、`userList` 的数据格式正确,特别是必需字段
|
|
473
|
+
2. **联动逻辑**:选中子机构会自动选中父机构,取消父机构会自动取消子机构
|
|
474
|
+
3. **全局授权**:使用全局授权时,返回的 `checkedKeys`/`appKeys`/`userKeys` 为 `['all']`,但 `checkData` 中包含实际的完整列表
|
|
475
|
+
4. **性能优化**:对于大量机构数据,组件内部使用了虚拟滚动优化
|
|
476
|
+
|
|
477
|
+
## 语言包配置
|
|
478
|
+
|
|
479
|
+
组件支持通过 `locale` 属性自定义文案:
|
|
480
|
+
|
|
481
|
+
```jsx
|
|
482
|
+
<AssignModal
|
|
483
|
+
locale={{
|
|
484
|
+
authorizesOrgList: '组织架构',
|
|
485
|
+
allOrgAvailable: '授权全部组织',
|
|
486
|
+
search: '搜索组织...',
|
|
487
|
+
// 更多字段...
|
|
488
|
+
}}
|
|
489
|
+
// 其他属性...
|
|
490
|
+
/>
|
|
491
|
+
```
|
|
492
|
+
|
|
493
|
+
## License
|
|
494
|
+
|
|
495
|
+
ISC
|