@openli1115/lowcode-edit-pro-table 1.0.72 → 1.0.74

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.
@@ -8,7 +8,8 @@ import { useProBoundValue } from "../../context/useProBoundValue";
8
8
  import { FORM_EMPTY_ARRAY } from "../../context/useComponentContext";
9
9
  var _window$React = window.React,
10
10
  createElement = _window$React.createElement,
11
- useCallback = _window$React.useCallback;
11
+ useCallback = _window$React.useCallback,
12
+ useMemo = _window$React.useMemo;
12
13
 
13
14
  /**
14
15
  * 按路径在树形 dataSource 上逐级匹配,取出每一层的 label(2 级、3 级…任意多级,长度由 pathValues 决定)。
@@ -32,27 +33,81 @@ function resolvePathLabels(dataSource, pathValues) {
32
33
  }
33
34
  return labels;
34
35
  }
35
- function normalizeCascaderPath(v) {
36
+ function isValidPathInTree(dataSource, pathValues) {
37
+ if (!Array.isArray(dataSource) || pathValues.length === 0) return false;
38
+ var level = dataSource;
39
+ var _loop2 = function _loop2() {
40
+ var pv = _step2.value;
41
+ var node = level.find(function (n) {
42
+ return String(n === null || n === void 0 ? void 0 : n.value) === String(pv);
43
+ });
44
+ if (!node) return {
45
+ v: false
46
+ };
47
+ level = Array.isArray(node.children) ? node.children : [];
48
+ },
49
+ _ret;
50
+ for (var _iterator2 = _createForOfIteratorHelperLoose(pathValues), _step2; !(_step2 = _iterator2()).done;) {
51
+ _ret = _loop2();
52
+ if (_ret) return _ret.v;
53
+ }
54
+ return true;
55
+ }
56
+
57
+ /** 回填仅有叶子 id(如 city=2977)时,递归反查完整路径 [provinceId, cityId] */
58
+ function findPathByNodeValue(dataSource, targetValue, parentPath) {
59
+ if (parentPath === void 0) {
60
+ parentPath = [];
61
+ }
62
+ if (!Array.isArray(dataSource) || targetValue === '') return [];
63
+ for (var _iterator3 = _createForOfIteratorHelperLoose(dataSource), _step3; !(_step3 = _iterator3()).done;) {
64
+ var node = _step3.value;
65
+ var curValue = node === null || node === void 0 ? void 0 : node.value;
66
+ if (curValue == null) continue;
67
+ var nextPath = parentPath.concat(String(curValue));
68
+ if (String(curValue) === targetValue) {
69
+ return nextPath;
70
+ }
71
+ var hit = findPathByNodeValue(node === null || node === void 0 ? void 0 : node.children, targetValue, nextPath);
72
+ if (hit.length > 0) return hit;
73
+ }
74
+ return [];
75
+ }
76
+ function normalizeCascaderPath(v, dataSource) {
77
+ var tryExpandByLeaf = function tryExpandByLeaf(leaf, fallback) {
78
+ if (fallback === void 0) {
79
+ fallback = [];
80
+ }
81
+ var fullPath = findPathByNodeValue(dataSource, leaf);
82
+ return fullPath.length > 0 ? fullPath : fallback;
83
+ };
36
84
  if (Array.isArray(v)) {
37
- return v.filter(function (x) {
85
+ var path = v.filter(function (x) {
38
86
  return x != null && x !== '';
39
87
  }).map(function (x) {
40
88
  return String(x);
41
89
  });
90
+ if (path.length === 0) return [];
91
+ if (isValidPathInTree(dataSource, path)) return path;
92
+ return tryExpandByLeaf(path[path.length - 1], path);
42
93
  }
43
94
  if (typeof v === 'number' && !Number.isNaN(v)) {
44
- /** 表单里有时是数字 id(2977),Fusion dataSource string 化,需对齐 */
45
- return [String(v)];
95
+ /** 表单里有时是数字 id(2977),需要根据 dataSource 找完整路径 */
96
+ return tryExpandByLeaf(String(v), [String(v)]);
46
97
  }
47
98
  if (typeof v === 'string' && v.trim()) {
48
99
  try {
49
100
  var parsed = JSON.parse(v);
50
- return Array.isArray(parsed) ? parsed.map(function (x) {
101
+ if (!Array.isArray(parsed)) return [];
102
+ var _path = parsed.map(function (x) {
51
103
  return String(x);
52
- }) : [];
104
+ });
105
+ if (_path.length === 0) return [];
106
+ if (isValidPathInTree(dataSource, _path)) return _path;
107
+ return tryExpandByLeaf(_path[_path.length - 1], _path);
53
108
  } catch (_unused) {
54
- /** 历史或单值存成非 JSON 字符串时,当作单选叶子 value */
55
- return [v];
109
+ /** 历史或接口单值回填时,当作叶子值反查完整路径 */
110
+ return tryExpandByLeaf(v, [v]);
56
111
  }
57
112
  }
58
113
  return [];
@@ -96,7 +151,8 @@ var ProCascaderSelect = function ProCascaderSelect(props) {
96
151
  disabledProp = props.disabled,
97
152
  _schemaValue = props.value,
98
153
  schemaOnChange = props.onChange,
99
- defaultValue = props.defaultValue;
154
+ defaultValue = props.defaultValue,
155
+ multiple = props.multiple;
100
156
  var _resolveProScreenBind = resolveProScreenBinding({
101
157
  screen_structure: screen_structure,
102
158
  screen_structure_field: screen_structure_field,
@@ -114,15 +170,31 @@ var ProCascaderSelect = function ProCascaderSelect(props) {
114
170
  commit(next);
115
171
  schemaOnChange === null || schemaOnChange === void 0 ? void 0 : schemaOnChange(next, structureName, structureField);
116
172
  };
117
- var displayValue = normalizeCascaderPath(value);
173
+
174
+ /** 表单/接口:优先完整路径;若仅有叶子 id(如 2977)则由 dataSource 反查完整路径 */
175
+ var displayValue = useMemo(function () {
176
+ return normalizeCascaderPath(value, dataSource);
177
+ }, [value, dataSource]);
118
178
 
119
179
  /**
120
- * Fusion 单选 getSingleData 对数组 value 只会用 value[0] 查节点,输入框文案不完整。
121
- * 表单存全路径 [省,市,区,...] 任意多级时,用 dataSource 拼「一级 / 二级 / …」。
180
+ * Fusion 单选:官方约定受控 value string[] | number[],且实现里只对数组取 value[0] 再查节点。
181
+ * 若传入完整路径 [父,子],会把「父」当成选中项,文案只有一级。
182
+ * 组件展示应传「叶子」单元素数组 [leaf],内部 getLabelPath(叶子节点) 会生成多级展示。
183
+ * 多选仍传 Fusion 所需的多个 value(与表单存值一致)。
122
184
  */
185
+ var valueForFusion = useMemo(function () {
186
+ var path = displayValue;
187
+ if (multiple) {
188
+ return path;
189
+ }
190
+ if (path.length === 0) return [];
191
+ return [path[path.length - 1]];
192
+ }, [displayValue, multiple]);
193
+
194
+ /** dataSource 未就绪或异步时,仍用自定义文案兜底 */
123
195
  var schemaDisplayRender = props.displayRender;
124
196
  var pathDisplayRender = useCallback(function (labels, data) {
125
- var fullLabels = resolvePathLabels(dataSource, normalizeCascaderPath(value));
197
+ var fullLabels = resolvePathLabels(dataSource, displayValue);
126
198
  if (fullLabels.length > 0) {
127
199
  return fullLabels.join(' / ');
128
200
  }
@@ -130,14 +202,14 @@ var ProCascaderSelect = function ProCascaderSelect(props) {
130
202
  return schemaDisplayRender(labels, data);
131
203
  }
132
204
  return (labels && labels.length ? labels.join(' / ') : '') || ((data === null || data === void 0 ? void 0 : data.label) != null ? String(data.label) : '');
133
- }, [dataSource, value, schemaDisplayRender]);
205
+ }, [dataSource, displayValue, schemaDisplayRender]);
134
206
  return /*#__PURE__*/React.createElement("span", {
135
207
  className: "field-wrapper " + (disableEdit ? 'disable-edit' : 'enable-edit')
136
208
  }, /*#__PURE__*/React.createElement(_CascaderSelect, _extends({}, props, {
137
209
  readOnly: disableEdit ? true : readOnlyProp,
138
210
  disabled: disabledProp,
139
211
  dataSource: dataSource,
140
- value: displayValue,
212
+ value: valueForFusion,
141
213
  onChange: handleChange,
142
214
  displayRender: pathDisplayRender
143
215
  })));
@@ -38,7 +38,11 @@ export var FormProvider = function FormProvider(_ref) {
38
38
 
39
39
  // 使用 ref 缓存初始值
40
40
  var initialValuesRef = useRef(initialValues);
41
- var _useState = useState(initialValues),
41
+
42
+ // 与外部 screenStructures 断开引用,避免逻辑流原地修改 window 对象时污染表单内部 state
43
+ var _useState = useState(function () {
44
+ return cloneDeep(initialValues);
45
+ }),
42
46
  values = _useState[0],
43
47
  setValues = _useState[1];
44
48
 
@@ -75,9 +79,11 @@ export var FormProvider = function FormProvider(_ref) {
75
79
 
76
80
  // 触发 onChange 回调,把新值通知给外部
77
81
  if (onChange) {
82
+ // 对外回传使用副本,避免 preview/window 与 FormProvider 共用同一对象引用
83
+ var outboundValues = cloneDeep(newValues);
78
84
  // 使用微任务避免阻塞渲染
79
85
  Promise.resolve().then(function () {
80
- onChange(newValues);
86
+ onChange(outboundValues);
81
87
  });
82
88
  }
83
89
  return newValues;
@@ -13,7 +13,8 @@ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r)
13
13
  function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
14
14
  var _window$React = window.React,
15
15
  createElement = _window$React.createElement,
16
- useCallback = _window$React.useCallback;
16
+ useCallback = _window$React.useCallback,
17
+ useMemo = _window$React.useMemo;
17
18
 
18
19
  /**
19
20
  * 按路径在树形 dataSource 上逐级匹配,取出每一层的 label(2 级、3 级…任意多级,长度由 pathValues 决定)。
@@ -37,27 +38,81 @@ function resolvePathLabels(dataSource, pathValues) {
37
38
  }
38
39
  return labels;
39
40
  }
40
- function normalizeCascaderPath(v) {
41
+ function isValidPathInTree(dataSource, pathValues) {
42
+ if (!Array.isArray(dataSource) || pathValues.length === 0) return false;
43
+ var level = dataSource;
44
+ var _loop2 = function _loop2() {
45
+ var pv = _step2.value;
46
+ var node = level.find(function (n) {
47
+ return String(n === null || n === void 0 ? void 0 : n.value) === String(pv);
48
+ });
49
+ if (!node) return {
50
+ v: false
51
+ };
52
+ level = Array.isArray(node.children) ? node.children : [];
53
+ },
54
+ _ret;
55
+ for (var _iterator2 = _createForOfIteratorHelperLoose(pathValues), _step2; !(_step2 = _iterator2()).done;) {
56
+ _ret = _loop2();
57
+ if (_ret) return _ret.v;
58
+ }
59
+ return true;
60
+ }
61
+
62
+ /** 回填仅有叶子 id(如 city=2977)时,递归反查完整路径 [provinceId, cityId] */
63
+ function findPathByNodeValue(dataSource, targetValue, parentPath) {
64
+ if (parentPath === void 0) {
65
+ parentPath = [];
66
+ }
67
+ if (!Array.isArray(dataSource) || targetValue === '') return [];
68
+ for (var _iterator3 = _createForOfIteratorHelperLoose(dataSource), _step3; !(_step3 = _iterator3()).done;) {
69
+ var node = _step3.value;
70
+ var curValue = node === null || node === void 0 ? void 0 : node.value;
71
+ if (curValue == null) continue;
72
+ var nextPath = parentPath.concat(String(curValue));
73
+ if (String(curValue) === targetValue) {
74
+ return nextPath;
75
+ }
76
+ var hit = findPathByNodeValue(node === null || node === void 0 ? void 0 : node.children, targetValue, nextPath);
77
+ if (hit.length > 0) return hit;
78
+ }
79
+ return [];
80
+ }
81
+ function normalizeCascaderPath(v, dataSource) {
82
+ var tryExpandByLeaf = function tryExpandByLeaf(leaf, fallback) {
83
+ if (fallback === void 0) {
84
+ fallback = [];
85
+ }
86
+ var fullPath = findPathByNodeValue(dataSource, leaf);
87
+ return fullPath.length > 0 ? fullPath : fallback;
88
+ };
41
89
  if (Array.isArray(v)) {
42
- return v.filter(function (x) {
90
+ var path = v.filter(function (x) {
43
91
  return x != null && x !== '';
44
92
  }).map(function (x) {
45
93
  return String(x);
46
94
  });
95
+ if (path.length === 0) return [];
96
+ if (isValidPathInTree(dataSource, path)) return path;
97
+ return tryExpandByLeaf(path[path.length - 1], path);
47
98
  }
48
99
  if (typeof v === 'number' && !Number.isNaN(v)) {
49
- /** 表单里有时是数字 id(2977),Fusion dataSource string 化,需对齐 */
50
- return [String(v)];
100
+ /** 表单里有时是数字 id(2977),需要根据 dataSource 找完整路径 */
101
+ return tryExpandByLeaf(String(v), [String(v)]);
51
102
  }
52
103
  if (typeof v === 'string' && v.trim()) {
53
104
  try {
54
105
  var parsed = JSON.parse(v);
55
- return Array.isArray(parsed) ? parsed.map(function (x) {
106
+ if (!Array.isArray(parsed)) return [];
107
+ var _path = parsed.map(function (x) {
56
108
  return String(x);
57
- }) : [];
109
+ });
110
+ if (_path.length === 0) return [];
111
+ if (isValidPathInTree(dataSource, _path)) return _path;
112
+ return tryExpandByLeaf(_path[_path.length - 1], _path);
58
113
  } catch (_unused) {
59
- /** 历史或单值存成非 JSON 字符串时,当作单选叶子 value */
60
- return [v];
114
+ /** 历史或接口单值回填时,当作叶子值反查完整路径 */
115
+ return tryExpandByLeaf(v, [v]);
61
116
  }
62
117
  }
63
118
  return [];
@@ -101,7 +156,8 @@ var ProCascaderSelect = function ProCascaderSelect(props) {
101
156
  disabledProp = props.disabled,
102
157
  _schemaValue = props.value,
103
158
  schemaOnChange = props.onChange,
104
- defaultValue = props.defaultValue;
159
+ defaultValue = props.defaultValue,
160
+ multiple = props.multiple;
105
161
  var _resolveProScreenBind = (0, _utils.resolveProScreenBinding)({
106
162
  screen_structure: screen_structure,
107
163
  screen_structure_field: screen_structure_field,
@@ -119,15 +175,31 @@ var ProCascaderSelect = function ProCascaderSelect(props) {
119
175
  commit(next);
120
176
  schemaOnChange === null || schemaOnChange === void 0 ? void 0 : schemaOnChange(next, structureName, structureField);
121
177
  };
122
- var displayValue = normalizeCascaderPath(value);
178
+
179
+ /** 表单/接口:优先完整路径;若仅有叶子 id(如 2977)则由 dataSource 反查完整路径 */
180
+ var displayValue = useMemo(function () {
181
+ return normalizeCascaderPath(value, dataSource);
182
+ }, [value, dataSource]);
123
183
 
124
184
  /**
125
- * Fusion 单选 getSingleData 对数组 value 只会用 value[0] 查节点,输入框文案不完整。
126
- * 表单存全路径 [省,市,区,...] 任意多级时,用 dataSource 拼「一级 / 二级 / …」。
185
+ * Fusion 单选:官方约定受控 value string[] | number[],且实现里只对数组取 value[0] 再查节点。
186
+ * 若传入完整路径 [父,子],会把「父」当成选中项,文案只有一级。
187
+ * 组件展示应传「叶子」单元素数组 [leaf],内部 getLabelPath(叶子节点) 会生成多级展示。
188
+ * 多选仍传 Fusion 所需的多个 value(与表单存值一致)。
127
189
  */
190
+ var valueForFusion = useMemo(function () {
191
+ var path = displayValue;
192
+ if (multiple) {
193
+ return path;
194
+ }
195
+ if (path.length === 0) return [];
196
+ return [path[path.length - 1]];
197
+ }, [displayValue, multiple]);
198
+
199
+ /** dataSource 未就绪或异步时,仍用自定义文案兜底 */
128
200
  var schemaDisplayRender = props.displayRender;
129
201
  var pathDisplayRender = useCallback(function (labels, data) {
130
- var fullLabels = resolvePathLabels(dataSource, normalizeCascaderPath(value));
202
+ var fullLabels = resolvePathLabels(dataSource, displayValue);
131
203
  if (fullLabels.length > 0) {
132
204
  return fullLabels.join(' / ');
133
205
  }
@@ -135,14 +207,14 @@ var ProCascaderSelect = function ProCascaderSelect(props) {
135
207
  return schemaDisplayRender(labels, data);
136
208
  }
137
209
  return (labels && labels.length ? labels.join(' / ') : '') || ((data === null || data === void 0 ? void 0 : data.label) != null ? String(data.label) : '');
138
- }, [dataSource, value, schemaDisplayRender]);
210
+ }, [dataSource, displayValue, schemaDisplayRender]);
139
211
  return /*#__PURE__*/React.createElement("span", {
140
212
  className: "field-wrapper " + (disableEdit ? 'disable-edit' : 'enable-edit')
141
213
  }, /*#__PURE__*/React.createElement(_cascaderSelect["default"], (0, _extends2["default"])({}, props, {
142
214
  readOnly: disableEdit ? true : readOnlyProp,
143
215
  disabled: disabledProp,
144
216
  dataSource: dataSource,
145
- value: displayValue,
217
+ value: valueForFusion,
146
218
  onChange: handleChange,
147
219
  displayRender: pathDisplayRender
148
220
  })));
@@ -44,7 +44,11 @@ var FormProvider = exports.FormProvider = function FormProvider(_ref) {
44
44
 
45
45
  // 使用 ref 缓存初始值
46
46
  var initialValuesRef = useRef(initialValues);
47
- var _useState = useState(initialValues),
47
+
48
+ // 与外部 screenStructures 断开引用,避免逻辑流原地修改 window 对象时污染表单内部 state
49
+ var _useState = useState(function () {
50
+ return (0, _lodash.cloneDeep)(initialValues);
51
+ }),
48
52
  values = _useState[0],
49
53
  setValues = _useState[1];
50
54
 
@@ -81,9 +85,11 @@ var FormProvider = exports.FormProvider = function FormProvider(_ref) {
81
85
 
82
86
  // 触发 onChange 回调,把新值通知给外部
83
87
  if (onChange) {
88
+ // 对外回传使用副本,避免 preview/window 与 FormProvider 共用同一对象引用
89
+ var outboundValues = (0, _lodash.cloneDeep)(newValues);
84
90
  // 使用微任务避免阻塞渲染
85
91
  Promise.resolve().then(function () {
86
- onChange(newValues);
92
+ onChange(outboundValues);
87
93
  });
88
94
  }
89
95
  return newValues;
@@ -101,7 +101,7 @@ function fillRealVersion(meta, packageName, version, basicLibraryVersion) {
101
101
  packageName = '@openli1115/lowcode-edit-pro-table';
102
102
  }
103
103
  if (version === void 0) {
104
- version = '1.0.72';
104
+ version = '1.0.74';
105
105
  }
106
106
  if (basicLibraryVersion === void 0) {
107
107
  basicLibraryVersion = {
@@ -106,7 +106,7 @@ function fillRealVersion(meta, packageName, version, basicLibraryVersion) {
106
106
  packageName = '@openli1115/lowcode-edit-pro-table';
107
107
  }
108
108
  if (version === void 0) {
109
- version = '1.0.72';
109
+ version = '1.0.74';
110
110
  }
111
111
  if (basicLibraryVersion === void 0) {
112
112
  basicLibraryVersion = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openli1115/lowcode-edit-pro-table",
3
- "version": "1.0.72",
3
+ "version": "1.0.74",
4
4
  "description": "@openli1115/lowcode-edit-pro-table",
5
5
  "main": "lib/index.js",
6
6
  "module": "es/index.js",
@@ -101,10 +101,10 @@
101
101
  },
102
102
  "componentConfig": {
103
103
  "isComponentLibrary": true,
104
- "materialSchema": "https://unpkg.com/@openli1115/lowcode-edit-pro-table@1.0.72/build/lowcode/assets-prod.json"
104
+ "materialSchema": "https://unpkg.com/@openli1115/lowcode-edit-pro-table@1.0.74/build/lowcode/assets-prod.json"
105
105
  },
106
106
  "lcMeta": {
107
107
  "type": "component"
108
108
  },
109
- "homepage": "https://unpkg.com/@openli1115/lowcode-edit-pro-table@1.0.72/build/index.html"
109
+ "homepage": "https://unpkg.com/@openli1115/lowcode-edit-pro-table@1.0.74/build/index.html"
110
110
  }