@zat-design/sisyphus-react 3.14.2 → 3.14.3-beta.1

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,13 +23,13 @@ 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;
@@ -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,29 @@ var ProTreeSelect = (props, ref) => {
233
237
  defaultOnSuccessFun(fetchFunction.data);
234
238
  }
235
239
  }
236
- }, [fetchFunction === null || fetchFunction === void 0 ? void 0 : fetchFunction.data]);
240
+ }, [fetchFunction === null || fetchFunction === void 0 ? void 0 : fetchFunction.data, transformFieldNames]);
237
241
  (0, _ahooks.useDeepCompareEffect)(() => {
238
242
  if (enumCode) {
239
243
  var dictEnum = dics[enumCode] || [];
240
- var resultData = transferDataSource(dictEnum, showCodeName);
244
+ // 先转换字段名,再处理 code-name 展示
245
+ var transformedData = transformFieldNames(dictEnum);
246
+ var resultData = transferDataSource(transformedData, showCodeName);
247
+ var processedList = countChild(resultData);
241
248
  setState({
242
- selectList: countChild(resultData),
249
+ selectList: processedList,
243
250
  origDataSource: resultData
244
251
  });
245
252
  } else if (dataSource) {
246
- var _resultData = transferDataSource(dataSource, showCodeName);
253
+ // 先转换字段名,再处理 code-name 展示
254
+ var _transformedData = transformFieldNames(dataSource);
255
+ var _resultData = transferDataSource(_transformedData, showCodeName);
256
+ var _processedList = countChild(_resultData);
247
257
  setState({
248
- selectList: countChild(_resultData),
258
+ selectList: _processedList,
249
259
  origDataSource: _resultData
250
260
  });
251
261
  }
252
- }, [enumCode, dataSource]);
262
+ }, [enumCode, dataSource, transformFieldNames]);
253
263
  (0, _ahooks.useDeepCompareEffect)(() => {
254
264
  // code存在huo dataSource存在,不执行接口请求
255
265
  if (enumCode || dataSource) {
@@ -285,6 +295,7 @@ var ProTreeSelect = (props, ref) => {
285
295
 
286
296
  /**
287
297
  * 根据值进行回显
298
+ * 注意:此时数据已经是标准格式(label, value, children)
288
299
  * @param value 输入值
289
300
  * @returns 对应枚举label
290
301
  */
@@ -294,8 +305,8 @@ var ProTreeSelect = (props, ref) => {
294
305
  }
295
306
  var labelResult = [];
296
307
  var queryLabel = dicts => dicts.map(item => {
297
- if (value.includes(item[code])) {
298
- var labelText = item[label];
308
+ if (value.includes(item.value)) {
309
+ var labelText = item.label;
299
310
  labelResult.push(labelText);
300
311
  }
301
312
  if (item.children) {
@@ -340,15 +351,22 @@ var ProTreeSelect = (props, ref) => {
340
351
 
341
352
  /**
342
353
  * 自定义渲染子树
343
- * @param node 每个节点数据对象
354
+ * 注意:此时数据已经是标准格式(label, value, children)
355
+ * @param node 每个节点数据对象(标准格式)
344
356
  * @returns 整个react节点树
345
357
  */
346
358
  var renderTreeNode = (node, grade) => {
347
359
  var children = node.children,
348
- icon = node.icon;
349
- var labelText = node[label];
350
- var value = node[code];
351
- var key = node[uuidKey];
360
+ icon = node.icon,
361
+ label = node.label,
362
+ nodeValue = node.value,
363
+ nodeKey = node.key;
364
+ var labelText = label;
365
+ var value = nodeValue;
366
+ var key = nodeValue; // 使用 value 作为 key,如果有 key 字段则使用 key
367
+ if (nodeKey !== undefined) {
368
+ key = nodeKey;
369
+ }
352
370
  // 三无走默认
353
371
  if (['undefined-undefined', 'undefined'].includes(labelText) && !value && !key) {
354
372
  if (showCodeName) {
@@ -416,7 +434,8 @@ var ProTreeSelect = (props, ref) => {
416
434
 
417
435
  /**
418
436
  * 从树形数据中找出用户搜索得数据,并且将搜索字符串高亮标识
419
- * @param data 全量树
437
+ * 注意:此时数据已经是标准格式(label, value, children)
438
+ * @param data 全量树(标准格式)
420
439
  * @param searchStr 搜索字符串
421
440
  * @returns 处理后得树
422
441
  */
@@ -433,11 +452,11 @@ var ProTreeSelect = (props, ref) => {
433
452
  }
434
453
  // 迭代完子节点向上回溯,如果有匹配到得子节点,那么加入当前节点得孩子对象上,否则加入得是空数组
435
454
  item.children = currentNodeChild;
436
- // 判断节点title是否包含关键字 如果有,那么直接进行下一循环
455
+ // 判断节点label是否包含关键字 如果有,那么直接进行下一循环
437
456
  // @ts-ignore
438
- if (item[label].indexOf(keyWord) > -1 && (selectProps === null || selectProps === void 0 ? void 0 : selectProps.mode) !== 'treeSelect') {
457
+ if (item.label && item.label.indexOf(keyWord) > -1 && (selectProps === null || selectProps === void 0 ? void 0 : selectProps.mode) !== 'treeSelect') {
439
458
  var regExp = new RegExp(keyWord);
440
- item[label] = item[label].replace(regExp, `<span class="highlight-search-text">${keyWord}</span>`);
459
+ item.label = item.label.replace(regExp, `<span class="highlight-search-text">${keyWord}</span>`);
441
460
  }
442
461
  currentAllNodeChild.push(item);
443
462
  }
@@ -475,16 +494,23 @@ var ProTreeSelect = (props, ref) => {
475
494
  return _ref6.apply(this, arguments);
476
495
  };
477
496
  }(), 500);
497
+
498
+ /**
499
+ * 从树形数据中查找节点
500
+ * 注意:此时数据已经是标准格式(label, value, children)
501
+ * @param treeList 树形数据(标准格式)
502
+ * @param nodeValue 节点值
503
+ * @returns 找到的节点
504
+ */
478
505
  function findTreeNode(treeList, nodeValue) {
479
506
  var result = {};
480
507
  var filterData = function filterData(data) {
481
508
  for (var i = 0; i < data.length; i++) {
482
509
  var item = data[i];
483
- if (item[code] === nodeValue || Array.isArray(nodeValue) && nodeValue.includes(item[code])) {
510
+ if (item.value === nodeValue || Array.isArray(nodeValue) && nodeValue.includes(item.value)) {
484
511
  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'];
512
+ // 删除 children 字段,避免循环引用
513
+ delete result.children;
488
514
  return null;
489
515
  }
490
516
  // 一直递归到最后一层子节点
@@ -496,6 +522,13 @@ var ProTreeSelect = (props, ref) => {
496
522
  filterData(treeList);
497
523
  return result;
498
524
  }
525
+ /**
526
+ * 根据值获取标签
527
+ * 注意:此时数据已经是标准格式(label, value, children)
528
+ * @param treeList 树形数据(标准格式)
529
+ * @param nodeValue 节点值
530
+ * @returns 标签对象或数组
531
+ */
499
532
  function getLabelByValue(treeList, nodeValue) {
500
533
  var result = nodeValue;
501
534
  if (nodeValue) {
@@ -507,19 +540,19 @@ var ProTreeSelect = (props, ref) => {
507
540
  return item;
508
541
  });
509
542
  } else {
510
- result = findTreeNode(treeList, nodeValue[code]);
543
+ result = findTreeNode(treeList, nodeValue.value);
511
544
  }
512
545
  }
513
546
  return result;
514
547
  }
515
548
  var handleChange = (newVal, label, extra) => {
516
549
  // newVal回来得一定是label、value
550
+ // 注意:此时数据已经是标准格式(label, value, children)
517
551
  var _selectList = selectList.map(item => {
518
- var label = item.label;
519
- var _label = label;
520
- if (label) {
552
+ var _label = item.label;
553
+ if (_label) {
521
554
  var regex = /<span class="highlight-search-text">(.*?)<\/span>/g;
522
- _label = item[label] = label === null || label === void 0 ? void 0 : label.replace(regex, '$1');
555
+ _label = item.label = _label.replace(regex, '$1');
523
556
  }
524
557
  return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, item), {}, {
525
558
  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-beta.1",
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",