@hzab/list-render 1.10.9 → 1.10.11

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/CHANGELOG.md CHANGED
@@ -1,10 +1,18 @@
1
+ # @hzab/list-render@1.10.11
2
+
3
+ fix: 行内编辑统一onEdit获取数据,单元格编辑支持传入其他参数
4
+
5
+ # @hzab/list-render@1.10.10
6
+
7
+ fix: 解决 FormModal 与 DetailModal 相互影响的问题
8
+
1
9
  # @hzab/list-render@1.10.9
2
10
 
3
11
  fix: 行内编辑 解决 select 等表单项 focus 报错问题
4
12
 
5
13
  # @hzab/list-render@1.10.8
6
14
 
7
- feat: 行内编辑事件通过onEdit抛出 添加保存前自定义处理函数onEditReqVerify,返回Promise用于截断或正常执行
15
+ feat: 行内编辑事件通过 onEdit 抛出 添加保存前自定义处理函数 onEditReqVerify,返回 Promise 用于截断或正常执行
8
16
 
9
17
  # @hzab/list-render@1.10.7
10
18
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hzab/list-render",
3
- "version": "1.10.9",
3
+ "version": "1.10.11",
4
4
  "description": "",
5
5
  "main": "src",
6
6
  "scripts": {
@@ -18,7 +18,7 @@ function DetailModal(props, parentRef) {
18
18
  setOpen(true);
19
19
  // 处理 formRef.current 为 undefined 的问题
20
20
  setData(formData);
21
- setTitle(title || '详情')
21
+ setTitle(title || "详情");
22
22
  }
23
23
 
24
24
  function close() {
@@ -34,10 +34,15 @@ function DetailModal(props, parentRef) {
34
34
  formRef,
35
35
  }));
36
36
 
37
+ // Hack: 解决 FormModal DetailModal 相互影响的问题
38
+ if (!open) {
39
+ return null;
40
+ }
41
+
37
42
  let footer = undefined;
38
43
  const options = {
39
44
  close,
40
- form: formRef.current?.formRender,
45
+ formRef,
41
46
  scenario: "detail",
42
47
  };
43
48
  if (modalConf?.footer) {
@@ -62,6 +62,11 @@ export function FormModal(props, parentRef) {
62
62
  formRef,
63
63
  }));
64
64
 
65
+ // Hack: 解决 FormModal DetailModal 相互影响的问题
66
+ if (!open) {
67
+ return null;
68
+ }
69
+
65
70
  function onOk() {
66
71
  validate().then(async () => {
67
72
  const submitForm = _.cloneDeep(await formRef.current?.formRender?.values);
@@ -111,7 +116,7 @@ export function FormModal(props, parentRef) {
111
116
  cancel: close,
112
117
  onOk,
113
118
  close,
114
- form: formRef.current?.formRender,
119
+ formRef,
115
120
  validate,
116
121
  scenario: scenarioRef.current,
117
122
  };
@@ -177,7 +182,7 @@ export function FormModal(props, parentRef) {
177
182
  return (
178
183
  <CModal {..._modalProps}>
179
184
  {FormSlot ? (
180
- <FormSlot {...props} formRef={formRef} scenario={scenarioRef.current} schema={props.schema?.schema} />
185
+ <FormSlot {...props} formRef={formRef} scenario={scenarioRef.current} schema={props.schema} />
181
186
  ) : (
182
187
  <FormRender
183
188
  {...props.formProps}
@@ -1,72 +1,72 @@
1
- import { cloneDeep } from "lodash";
2
- import { autorun, observable } from "@formily/reactive";
3
- import { getStateFunc } from "./formily-utils";
4
-
5
- /**
6
- * 处理自己添加的变量
7
- * @param {Array} fieldList
8
- * @param {Object} opt
9
- * @returns
10
- */
11
- export function handleReactions(fieldList, opt = {}) {
12
- if (!Array.isArray(fieldList)) {
13
- console.warn("Error handleReactions: fieldList not array");
14
- return fieldList;
15
- }
16
- const resList = [];
17
- cloneDeep(fieldList).forEach((item) => {
18
- handleReaction(item, opt);
19
- resList.push(item);
20
- });
21
- return resList;
22
- }
23
-
24
- /**
25
- * 处理自己添加的变量
26
- * @param {Object} fieldSchema
27
- * @param {Object} opt
28
- * @returns
29
- */
30
- export function handleReaction(fieldSchema, opt = {}) {
31
- const { scope, formilyRef = {}, scenario } = opt || {};
32
-
33
- const field = fieldSchema?.field || fieldSchema;
34
- const { state, run } = field["x-reactions"]?.fulfill || {};
35
- const args = {
36
- scope,
37
- // $deps,
38
- $self: field,
39
- $effect: autorun.effect,
40
- // $form: $form,
41
- // $values: $values,
42
- $observable: observable,
43
- $memo: autorun.memo,
44
- $props: {
45
- // formilyRef.current.fields formilyRef.current.fieldSchemas
46
- formilyRef,
47
- },
48
- };
49
-
50
- // 自身变量
51
- if (field.inTable) {
52
- const inTableEffectFn = getStateFunc(field.inTable, args);
53
- if (inTableEffectFn) {
54
- const inTable = inTableEffectFn(args);
55
- field.inTable = inTable;
56
- }
57
- }
58
-
59
- // 属性响应器
60
- if (state) {
61
- }
62
-
63
- // 动作响应器
64
- // if (run) {
65
- // getFunc(run)(args);
66
- // }
67
-
68
- if (field.visible === false) {
69
- return field;
70
- }
71
- return field;
72
- }
1
+ import { cloneDeep } from "lodash";
2
+ import { autorun, observable } from "@formily/reactive";
3
+ import { getStateFunc } from "./formily-utils";
4
+
5
+ /**
6
+ * 处理自己添加的变量
7
+ * @param {Array} fieldList
8
+ * @param {Object} opt
9
+ * @returns
10
+ */
11
+ export function handleReactions(fieldList, opt = {}) {
12
+ if (!Array.isArray(fieldList)) {
13
+ console.warn("Error handleReactions: fieldList not array");
14
+ return fieldList;
15
+ }
16
+ const resList = [];
17
+ cloneDeep(fieldList).forEach((item) => {
18
+ handleReaction(item, opt);
19
+ resList.push(item);
20
+ });
21
+ return resList;
22
+ }
23
+
24
+ /**
25
+ * 处理自己添加的变量
26
+ * @param {Object} fieldSchema
27
+ * @param {Object} opt
28
+ * @returns
29
+ */
30
+ export function handleReaction(fieldSchema, opt = {}) {
31
+ const { scope, formilyRef = {}, scenario } = opt || {};
32
+
33
+ const field = fieldSchema?.field || fieldSchema;
34
+ const { state, run } = field["x-reactions"]?.fulfill || {};
35
+ const args = {
36
+ scope,
37
+ // $deps,
38
+ $self: field,
39
+ $effect: autorun.effect,
40
+ // $form: $form,
41
+ // $values: $values,
42
+ $observable: observable,
43
+ $memo: autorun.memo,
44
+ $props: {
45
+ // formilyRef.current.fields formilyRef.current.fieldSchemas
46
+ formilyRef,
47
+ },
48
+ };
49
+
50
+ // 自身变量
51
+ if (field.inTable) {
52
+ const inTableEffectFn = getStateFunc(field.inTable, args);
53
+ if (inTableEffectFn) {
54
+ const inTable = inTableEffectFn(args);
55
+ field.inTable = inTable;
56
+ }
57
+ }
58
+
59
+ // 属性响应器
60
+ if (state) {
61
+ }
62
+
63
+ // 动作响应器
64
+ // if (run) {
65
+ // getFunc(run)(args);
66
+ // }
67
+
68
+ if (field.visible === false) {
69
+ return field;
70
+ }
71
+ return field;
72
+ }
@@ -27,7 +27,7 @@ export interface EditableCellProps extends React.HTMLAttributes<HTMLElement> {
27
27
  index: number;
28
28
  editable: boolean;
29
29
  onEdit: (record: Partial<Item> & { key: React.Key }, dataIndex: string, opt: Object) => void;
30
- onSave: () => void;
30
+ onSave: (field: { type: string; name: string }) => void;
31
31
  onCancel: () => void;
32
32
  topProps: {
33
33
  config: { hasEdit: boolean | Function };
@@ -100,7 +100,7 @@ export const EditableCell: React.FC<EditableCellProps> = ({
100
100
  />
101
101
  {editMode !== "line" ? (
102
102
  <div className="cell-editing-actions">
103
- <CheckOutlined className="table-cell-confirm-icon" onClick={onSave} />
103
+ <CheckOutlined className="table-cell-confirm-icon" onClick={() => onSave(field)} />
104
104
  <CloseOutlined className="table-cell-cancel-icon" onClick={onCancel} />
105
105
  </div>
106
106
  ) : null}
@@ -195,13 +195,20 @@ export const useEditTable = (props) => {
195
195
  const onEdit = async (record: Partial<Item> & { key: React.Key }, key, opt = { fieldRef: null }) => {
196
196
  const { fieldRef } = opt || {};
197
197
  editingFiledRef.current = fieldRef;
198
-
199
- // const value = await (props.onEdit && props.onEdit(record));
200
198
  formRender?.setValues(record);
201
199
  setEditingId(record[idKey]);
202
200
  setEditingKey(key);
203
201
  };
204
202
 
203
+ /**
204
+ * 点击编辑按钮
205
+ * @param record
206
+ */
207
+ const onEditAFetch = async (record: Partial<Item> & { key: React.Key }, ...args) => {
208
+ const value = await (props.onEdit && props.onEdit(record));
209
+ onEdit.call(this, value, ...args);
210
+ };
211
+
205
212
  const onCancel = () => {
206
213
  setEditingId("");
207
214
  setEditingKey("");
@@ -211,11 +218,11 @@ export const useEditTable = (props) => {
211
218
  /**
212
219
  * 保存数据
213
220
  */
214
- const onSave = async () => {
221
+ const onSave = async (field) => {
215
222
  try {
216
223
  // 点击保存,数据抛出
217
224
  (await formRender?.validate()) as Item;
218
- onEditSubmit && (await onEditSubmit(formRender.values));
225
+ onEditSubmit && (await onEditSubmit(formRender.values, { field } ));
219
226
  // 清除编辑目标
220
227
  setEditingId("");
221
228
  setEditingKey("");
@@ -246,7 +253,7 @@ export const useEditTable = (props) => {
246
253
  ? isEditing(record) && isEditingCell(col.dataIndex)
247
254
  : isEditing(record),
248
255
  topProps: props.topProps,
249
- onEdit,
256
+ onEdit: onEditAFetch,
250
257
  onSave,
251
258
  onCancel,
252
259
  }),
@@ -274,6 +281,7 @@ export const useEditTable = (props) => {
274
281
  });
275
282
 
276
283
  return {
284
+ onEditAFetch,
277
285
  onEdit,
278
286
  SchemaField,
279
287
  mergedColumns,
@@ -70,7 +70,6 @@ const ListRender = forwardRef(function (props, parentRef) {
70
70
  const [total, setTotal] = useState(0);
71
71
  const [list, setList] = useState([]);
72
72
  const [formState, setFormState] = useState("");
73
- const [rowId, setRowId] = useState(0);
74
73
  const [listLoading, setListLoading] = useState(false);
75
74
  const formModalRef = useRef();
76
75
  const detailModalRef = useRef();
@@ -329,14 +328,11 @@ const ListRender = forwardRef(function (props, parentRef) {
329
328
  }
330
329
 
331
330
  function handleDetail(data, id) {
332
- setRowId(id);
333
331
  let title = data[modalConf?.title?.detailKey] || modalConf?.title?.detailText || "详情";
334
332
  detailModalRef.current.show(data, title);
335
333
  }
336
334
 
337
335
  function onEdit(row, idx) {
338
- //编辑的时候提前存id和状态
339
- setRowId(row[idKey]);
340
336
  setFormState("edit");
341
337
 
342
338
  if (props.fetchOnEdit !== false) {
@@ -367,24 +363,27 @@ const ListRender = forwardRef(function (props, parentRef) {
367
363
 
368
364
  function handleEdit(data, id) {
369
365
  const { editMode = "modal" } = props;
370
- const isEditTable = editMode !== "modal";
371
- if (isEditTable) {
366
+ // 整行编辑的模式下列表数据回填
367
+ if (editMode == "line") {
372
368
  return tableRef.current.onEditByTable(data, id);
373
369
  }
374
- let title = data[modalConf?.title?.editKey] || modalConf?.title?.editText || "编辑";
375
- formModalRef.current.show(data, title, "edit");
370
+ if (editMode === "modal") {
371
+ let title = data[modalConf?.title?.editKey] || modalConf?.title?.editText || "编辑";
372
+ formModalRef.current.show(data, title, "edit");
373
+ }
376
374
  }
377
375
 
378
- async function onEditSubmit(data) {
376
+ async function onEditSubmit(data, opt) {
379
377
  let _data = data;
380
378
  if (isPatchUpdate) {
381
379
  if (model?.patchMap === "function") {
382
- _data = model.patchMap(data);
380
+ _data = model.patchMap(data, opt);
383
381
  }
384
382
  } else if (typeof model?.updateMap === "function") {
385
- _data = model.updateMap(data);
383
+ _data = model.updateMap(data, opt);
386
384
  }
387
385
 
386
+ // 行内编辑确认前的校验
388
387
  if (props.onEditReqVerify) {
389
388
  await props.onEditReqVerify(_data);
390
389
  }
@@ -394,7 +393,7 @@ const ListRender = forwardRef(function (props, parentRef) {
394
393
  }
395
394
  const request = isPatchUpdate ? model?.patch : model?.update;
396
395
  return request
397
- .bind(model)(_data, { id: rowId })
396
+ .bind(model)(_data, { id: data[idKey] })
398
397
  .then((res) => {
399
398
  getList();
400
399
  message.success(res?._message || "编辑成功");
@@ -283,10 +283,6 @@ const TableRender = forwardRef(function (props, tableRef) {
283
283
  <Button
284
284
  type="link"
285
285
  onClick={() => {
286
- // // 可编辑表格使用对应回调
287
- // if (isEditTable) {
288
- // return onEditByTable && onEditByTable(record, index);
289
- // }
290
286
  props.onEdit && props.onEdit(record, index);
291
287
  }}
292
288
  >