@zat-design/sisyphus-react 3.14.2 → 3.14.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.
@@ -14,8 +14,8 @@ require("antd/es/input/style");
14
14
  var _input = _interopRequireDefault(require("antd/es/input"));
15
15
  require("antd/es/message/style");
16
16
  var _message2 = _interopRequireDefault(require("antd/es/message"));
17
- var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
18
17
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
18
+ var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
19
19
  var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
20
20
  require("antd/es/tree-select/style");
21
21
  var _treeSelect = _interopRequireDefault(require("antd/es/tree-select"));
@@ -23,18 +23,18 @@ var _ahooks = require("ahooks");
23
23
  var _classnames = _interopRequireDefault(require("classnames"));
24
24
  var _react = _interopRequireWildcard(require("react"));
25
25
  var _lodash = require("lodash");
26
+ var _utils = require("@zat-design/utils");
26
27
  var _locale = _interopRequireDefault(require("../../../locale"));
27
28
  var _ProConfigProvider = require("../../../ProConfigProvider");
28
29
  var _Container = _interopRequireDefault(require("../../../ProForm/components/Container"));
29
30
  var _AdaptiveTooltip = _interopRequireDefault(require("../AdaptiveTooltip"));
30
31
  var _jsxRuntime = require("react/jsx-runtime");
31
- var _excluded = ["disabled", "code", "dataSource", "defaultDisableValue", "onChange", "useRequest", "transformResponse", "fieldNames", "placeholder", "tooltip", "showSearch", "filterTreeNode", "treeNodeFilterProp", "defaultExpandAll", "expandedKeys", "treeCheckable", "onSearch", "otherProps", "width", "dropdownStyle", "popupClassName", "style", "allowClear", "listHeight", "showCodeName", "className", "checkStrictly", "checkable"],
32
- _excluded2 = ["children"];
32
+ var _excluded = ["disabled", "code", "dataSource", "defaultDisableValue", "onChange", "useRequest", "transformResponse", "fieldNames", "placeholder", "tooltip", "showSearch", "filterTreeNode", "treeNodeFilterProp", "defaultExpandAll", "expandedKeys", "treeCheckable", "onSearch", "otherProps", "width", "dropdownStyle", "popupClassName", "style", "allowClear", "listHeight", "showCodeName", "className", "checkStrictly", "checkable"];
33
33
  /* eslint-disable react/no-danger */
34
34
  /* eslint-disable react/jsx-closing-tag-location */
35
35
  var SHOW_PARENT = _treeSelect.default.SHOW_PARENT;
36
36
  var ProTreeSelect = (props, ref) => {
37
- var _useRequest$options;
37
+ var _useRequest$options, _useRequest$options3;
38
38
  // 全局属性配置在ConfigProvider
39
39
  var _ref = (0, _ProConfigProvider.useProConfig)('ProTreeSelect') || {},
40
40
  _ref$fieldNames = _ref.fieldNames,
@@ -42,14 +42,7 @@ var ProTreeSelect = (props, ref) => {
42
42
  var _useProConfig = (0, _ProConfigProvider.useProConfig)('ProEnum'),
43
43
  _useProConfig$dics = _useProConfig.dics,
44
44
  dics = _useProConfig$dics === void 0 ? {} : _useProConfig$dics;
45
- var label = 'label';
46
- var code = 'value';
47
- var uuidKey = 'value';
48
- if (proSelectFieldNames && Object.keys(proSelectFieldNames).length) {
49
- code = proSelectFieldNames.value;
50
- label = proSelectFieldNames.label;
51
- uuidKey = proSelectFieldNames.key || proSelectFieldNames.value;
52
- }
45
+
53
46
  // 配置属性
54
47
  var disabled = props.disabled,
55
48
  enumCode = props.code,
@@ -95,11 +88,32 @@ var ProTreeSelect = (props, ref) => {
95
88
  var _ref3 = otherProps || {},
96
89
  isView = _ref3.isView,
97
90
  viewEmpty = _ref3.viewEmpty;
98
- if (fieldNames && Object.keys(fieldNames).length) {
99
- code = fieldNames.value || 'value';
100
- label = fieldNames.label || 'label';
101
- uuidKey = fieldNames.key || code;
102
- }
91
+
92
+ // 合并全局和组件级别的 fieldNames,优先级:组件级 > 全局
93
+ var finalFieldNames = (0, _objectSpread2.default)((0, _objectSpread2.default)({
94
+ label: 'label',
95
+ value: 'value',
96
+ children: 'children'
97
+ }, proSelectFieldNames), fieldNames);
98
+
99
+ /**
100
+ * 使用 tools.transformDataName 统一转换字段名
101
+ * 将原始数据转换为标准格式(label, value, children)
102
+ * tools.transformDataName 会自动检查数据是否已经是标准格式,如果是则直接返回
103
+ */
104
+ var transformFieldNames = (0, _react.useCallback)(data => {
105
+ if (!data || !Array.isArray(data) || !data.length) {
106
+ return data || [];
107
+ }
108
+
109
+ // 使用 tools.transformDataName 转换字段名
110
+ // 它会自动检查数据是否已经是标准格式(label, value, children),如果是则直接返回
111
+ return _utils.tools.transformDataName(data, {
112
+ label: finalFieldNames.label,
113
+ value: finalFieldNames.value,
114
+ children: finalFieldNames.children
115
+ });
116
+ }, [finalFieldNames]);
103
117
  // 经过处理后的枚举数据,可能来自用户配置的处理函数后返回的结果
104
118
  var _useSetState = (0, _ahooks.useSetState)({}),
105
119
  _useSetState2 = (0, _slicedToArray2.default)(_useSetState, 2),
@@ -112,6 +126,7 @@ var ProTreeSelect = (props, ref) => {
112
126
 
113
127
  /**
114
128
  * 如果数据少于10条那么将数据平铺返回
129
+ * 注意:当 treeCheckable 为 false 时(单选模式),应保持树形结构,不进行平铺
115
130
  * @param dictsEnum 原始数据
116
131
  * @returns 平铺或者原始数据
117
132
  */
@@ -119,50 +134,33 @@ var ProTreeSelect = (props, ref) => {
119
134
  if (treeCheckable) {
120
135
  return dictsEnum;
121
136
  }
122
- var count = 0;
123
- var result = [];
124
- var loopCount = data => {
125
- data.map(item => {
126
- count += 1;
127
- var children = item.children,
128
- other = (0, _objectWithoutProperties2.default)(item, _excluded2);
129
- result.push((0, _objectSpread2.default)({}, other));
130
- if (item.children) {
131
- loopCount(item.children);
132
- }
133
- return item;
134
- });
135
- };
136
- if ((dictsEnum === null || dictsEnum === void 0 ? void 0 : dictsEnum.length) > 10) {
137
- return dictsEnum;
138
- }
139
- loopCount(dictsEnum);
140
- if (count <= 10) {
141
- return result;
142
- }
137
+ // 单选模式(treeCheckable=false)时,保持树形结构,不进行平铺
138
+ // 因为 TreeSelect 在单选模式下也需要树形结构来正确展示层级关系
143
139
  return dictsEnum;
144
140
  };
145
141
 
146
142
  /**
147
143
  * 如果要展示code-name,那么将源数据的label转为code-name
148
- * @param dataArr 源数据
144
+ * 注意:此时数据已经是标准格式(label, value, children)
145
+ * @param dataArr 源数据(标准格式)
149
146
  * @param showCodeAndName 是否展示code-name
150
147
  * @returns 转换结果
151
148
  */
152
149
  var transferDataSource = (dataArr, showCodeAndName) => {
150
+ if (!showCodeAndName) {
151
+ return dataArr;
152
+ }
153
153
  var copyData = (0, _lodash.cloneDeep)(dataArr);
154
154
  var loop = arr => {
155
155
  arr.map(item => {
156
- item[label] = `${item[code]}-${item[label]}`;
156
+ item.label = `${item.value}-${item.label}`;
157
157
  if (item.children) {
158
158
  loop(item.children);
159
159
  }
160
160
  return item;
161
161
  });
162
162
  };
163
- if (showCodeAndName) {
164
- loop(copyData);
165
- }
163
+ loop(copyData);
166
164
  return copyData;
167
165
  };
168
166
  var defaultOnSuccessFun = res => {
@@ -174,7 +172,9 @@ var ProTreeSelect = (props, ref) => {
174
172
  _message2.default.error(msg);
175
173
  return;
176
174
  }
177
- var resultData = transferDataSource(data, showCodeName);
175
+ // 先转换字段名,再处理 code-name 展示
176
+ var transformedData = transformFieldNames(data || []);
177
+ var resultData = transferDataSource(transformedData, showCodeName);
178
178
  setState({
179
179
  selectList: resultData || [],
180
180
  origDataSource: resultData || []
@@ -203,7 +203,9 @@ var ProTreeSelect = (props, ref) => {
203
203
  onSuccess: data => {
204
204
  if (transformResponse && typeof transformResponse === 'function') {
205
205
  var responseData = transformResponse(data);
206
- var resultData = transferDataSource(responseData, showCodeName);
206
+ // 先转换字段名,再处理 code-name 展示
207
+ var transformedData = transformFieldNames(responseData);
208
+ var resultData = transferDataSource(transformedData, showCodeName);
207
209
  setState({
208
210
  selectList: countChild(resultData),
209
211
  origDataSource: resultData
@@ -224,7 +226,9 @@ var ProTreeSelect = (props, ref) => {
224
226
  if (fetchFunction !== null && fetchFunction !== void 0 && fetchFunction.data, useRequest !== null && useRequest !== void 0 && (_useRequest$options2 = useRequest.options) !== null && _useRequest$options2 !== void 0 && _useRequest$options2.cacheKey) {
225
227
  if (transformResponse && typeof transformResponse === 'function') {
226
228
  var responseData = transformResponse(fetchFunction.data);
227
- var resultData = transferDataSource(responseData, showCodeName);
229
+ // 先转换字段名,再处理 code-name 展示
230
+ var transformedData = transformFieldNames(responseData);
231
+ var resultData = transferDataSource(transformedData, showCodeName);
228
232
  setState({
229
233
  selectList: countChild(resultData),
230
234
  origDataSource: resultData
@@ -233,23 +237,31 @@ var ProTreeSelect = (props, ref) => {
233
237
  defaultOnSuccessFun(fetchFunction.data);
234
238
  }
235
239
  }
236
- }, [fetchFunction === null || fetchFunction === void 0 ? void 0 : fetchFunction.data]);
240
+ // eslint-disable-next-line react-hooks/exhaustive-deps
241
+ }, [fetchFunction === null || fetchFunction === void 0 ? void 0 : fetchFunction.data, useRequest === null || useRequest === void 0 || (_useRequest$options3 = useRequest.options) === null || _useRequest$options3 === void 0 ? void 0 : _useRequest$options3.cacheKey]);
237
242
  (0, _ahooks.useDeepCompareEffect)(() => {
238
243
  if (enumCode) {
239
244
  var dictEnum = dics[enumCode] || [];
240
- var resultData = transferDataSource(dictEnum, showCodeName);
245
+ // 先转换字段名,再处理 code-name 展示
246
+ var transformedData = transformFieldNames(dictEnum);
247
+ var resultData = transferDataSource(transformedData, showCodeName);
248
+ var processedList = countChild(resultData);
241
249
  setState({
242
- selectList: countChild(resultData),
250
+ selectList: processedList,
243
251
  origDataSource: resultData
244
252
  });
245
253
  } else if (dataSource) {
246
- var _resultData = transferDataSource(dataSource, showCodeName);
254
+ // 先转换字段名,再处理 code-name 展示
255
+ var _transformedData = transformFieldNames(dataSource);
256
+ var _resultData = transferDataSource(_transformedData, showCodeName);
257
+ var _processedList = countChild(_resultData);
247
258
  setState({
248
- selectList: countChild(_resultData),
259
+ selectList: _processedList,
249
260
  origDataSource: _resultData
250
261
  });
251
262
  }
252
- }, [enumCode, dataSource]);
263
+ // eslint-disable-next-line react-hooks/exhaustive-deps
264
+ }, [enumCode, dataSource, showCodeName]);
253
265
  (0, _ahooks.useDeepCompareEffect)(() => {
254
266
  // code存在huo dataSource存在,不执行接口请求
255
267
  if (enumCode || dataSource) {
@@ -285,6 +297,7 @@ var ProTreeSelect = (props, ref) => {
285
297
 
286
298
  /**
287
299
  * 根据值进行回显
300
+ * 注意:此时数据已经是标准格式(label, value, children)
288
301
  * @param value 输入值
289
302
  * @returns 对应枚举label
290
303
  */
@@ -294,8 +307,8 @@ var ProTreeSelect = (props, ref) => {
294
307
  }
295
308
  var labelResult = [];
296
309
  var queryLabel = dicts => dicts.map(item => {
297
- if (value.includes(item[code])) {
298
- var labelText = item[label];
310
+ if (value.includes(item.value)) {
311
+ var labelText = item.label;
299
312
  labelResult.push(labelText);
300
313
  }
301
314
  if (item.children) {
@@ -340,15 +353,22 @@ var ProTreeSelect = (props, ref) => {
340
353
 
341
354
  /**
342
355
  * 自定义渲染子树
343
- * @param node 每个节点数据对象
356
+ * 注意:此时数据已经是标准格式(label, value, children)
357
+ * @param node 每个节点数据对象(标准格式)
344
358
  * @returns 整个react节点树
345
359
  */
346
360
  var renderTreeNode = (node, grade) => {
347
361
  var children = node.children,
348
- icon = node.icon;
349
- var labelText = node[label];
350
- var value = node[code];
351
- var key = node[uuidKey];
362
+ icon = node.icon,
363
+ label = node.label,
364
+ nodeValue = node.value,
365
+ nodeKey = node.key;
366
+ var labelText = label;
367
+ var value = nodeValue;
368
+ var key = nodeValue; // 使用 value 作为 key,如果有 key 字段则使用 key
369
+ if (nodeKey !== undefined) {
370
+ key = nodeKey;
371
+ }
352
372
  // 三无走默认
353
373
  if (['undefined-undefined', 'undefined'].includes(labelText) && !value && !key) {
354
374
  if (showCodeName) {
@@ -416,7 +436,8 @@ var ProTreeSelect = (props, ref) => {
416
436
 
417
437
  /**
418
438
  * 从树形数据中找出用户搜索得数据,并且将搜索字符串高亮标识
419
- * @param data 全量树
439
+ * 注意:此时数据已经是标准格式(label, value, children)
440
+ * @param data 全量树(标准格式)
420
441
  * @param searchStr 搜索字符串
421
442
  * @returns 处理后得树
422
443
  */
@@ -433,11 +454,11 @@ var ProTreeSelect = (props, ref) => {
433
454
  }
434
455
  // 迭代完子节点向上回溯,如果有匹配到得子节点,那么加入当前节点得孩子对象上,否则加入得是空数组
435
456
  item.children = currentNodeChild;
436
- // 判断节点title是否包含关键字 如果有,那么直接进行下一循环
457
+ // 判断节点label是否包含关键字 如果有,那么直接进行下一循环
437
458
  // @ts-ignore
438
- if (item[label].indexOf(keyWord) > -1 && (selectProps === null || selectProps === void 0 ? void 0 : selectProps.mode) !== 'treeSelect') {
459
+ if (item.label && item.label.indexOf(keyWord) > -1 && (selectProps === null || selectProps === void 0 ? void 0 : selectProps.mode) !== 'treeSelect') {
439
460
  var regExp = new RegExp(keyWord);
440
- item[label] = item[label].replace(regExp, `<span class="highlight-search-text">${keyWord}</span>`);
461
+ item.label = item.label.replace(regExp, `<span class="highlight-search-text">${keyWord}</span>`);
441
462
  }
442
463
  currentAllNodeChild.push(item);
443
464
  }
@@ -475,16 +496,23 @@ var ProTreeSelect = (props, ref) => {
475
496
  return _ref6.apply(this, arguments);
476
497
  };
477
498
  }(), 500);
499
+
500
+ /**
501
+ * 从树形数据中查找节点
502
+ * 注意:此时数据已经是标准格式(label, value, children)
503
+ * @param treeList 树形数据(标准格式)
504
+ * @param nodeValue 节点值
505
+ * @returns 找到的节点
506
+ */
478
507
  function findTreeNode(treeList, nodeValue) {
479
508
  var result = {};
480
509
  var filterData = function filterData(data) {
481
510
  for (var i = 0; i < data.length; i++) {
482
511
  var item = data[i];
483
- if (item[code] === nodeValue || Array.isArray(nodeValue) && nodeValue.includes(item[code])) {
512
+ if (item.value === nodeValue || Array.isArray(nodeValue) && nodeValue.includes(item.value)) {
484
513
  result = (0, _objectSpread2.default)({}, item);
485
- result.value = item[code];
486
- result.label = item[label];
487
- delete result[(fieldNames === null || fieldNames === void 0 ? void 0 : fieldNames.children) || 'children'];
514
+ // 删除 children 字段,避免循环引用
515
+ delete result.children;
488
516
  return null;
489
517
  }
490
518
  // 一直递归到最后一层子节点
@@ -496,6 +524,13 @@ var ProTreeSelect = (props, ref) => {
496
524
  filterData(treeList);
497
525
  return result;
498
526
  }
527
+ /**
528
+ * 根据值获取标签
529
+ * 注意:此时数据已经是标准格式(label, value, children)
530
+ * @param treeList 树形数据(标准格式)
531
+ * @param nodeValue 节点值
532
+ * @returns 标签对象或数组
533
+ */
499
534
  function getLabelByValue(treeList, nodeValue) {
500
535
  var result = nodeValue;
501
536
  if (nodeValue) {
@@ -507,19 +542,19 @@ var ProTreeSelect = (props, ref) => {
507
542
  return item;
508
543
  });
509
544
  } else {
510
- result = findTreeNode(treeList, nodeValue[code]);
545
+ result = findTreeNode(treeList, nodeValue.value);
511
546
  }
512
547
  }
513
548
  return result;
514
549
  }
515
550
  var handleChange = (newVal, label, extra) => {
516
551
  // newVal回来得一定是label、value
552
+ // 注意:此时数据已经是标准格式(label, value, children)
517
553
  var _selectList = selectList.map(item => {
518
- var label = item.label;
519
- var _label = label;
520
- if (label) {
554
+ var _label = item.label;
555
+ if (_label) {
521
556
  var regex = /<span class="highlight-search-text">(.*?)<\/span>/g;
522
- _label = item[label] = label === null || label === void 0 ? void 0 : label.replace(regex, '$1');
557
+ _label = item.label = _label.replace(regex, '$1');
523
558
  }
524
559
  return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, item), {}, {
525
560
  label: _label
@@ -1,6 +1,12 @@
1
1
  @root-entry-name: 'default';
2
2
  @import (reference) '~antd/es/style/themes/index.less';
3
3
 
4
+ .pro-tree-select-drop-down-container{
5
+ .@{ant-prefix}-select-tree-checkbox{
6
+ margin-top: 0;
7
+ }
8
+ }
9
+
4
10
  .pro-tree-modal-container .@{ant-prefix}-modal-content .@{ant-prefix}-modal-body {
5
11
  max-height: 498px;
6
12
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zat-design/sisyphus-react",
3
- "version": "3.14.2",
3
+ "version": "3.14.3",
4
4
  "license": "MIT",
5
5
  "engines": {
6
6
  "node": ">=18.19.0"
@@ -91,6 +91,7 @@
91
91
  "@commitlint/config-conventional": "^12.1.1",
92
92
  "@testing-library/jest-dom": "6.2.0",
93
93
  "@testing-library/react": "12.1.5",
94
+ "@testing-library/react-hooks": "^8.0.1",
94
95
  "@types/classnames": "^2.3.1",
95
96
  "@types/jest": "^29.5.11",
96
97
  "@types/lodash": "^4.14.171",