@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 +9 -1
- package/package.json +1 -1
- package/src/DetailModal/index.jsx +7 -2
- package/src/FormModal/index.tsx +7 -2
- package/src/common/handleReactions.js +72 -72
- package/src/components/Formily/FormilyEditTable.tsx +15 -7
- package/src/list-render.jsx +11 -12
- package/src/table-render/index.jsx +0 -4
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
|
@@ -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
|
-
|
|
45
|
+
formRef,
|
|
41
46
|
scenario: "detail",
|
|
42
47
|
};
|
|
43
48
|
if (modalConf?.footer) {
|
package/src/FormModal/index.tsx
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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,
|
package/src/list-render.jsx
CHANGED
|
@@ -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
|
-
|
|
371
|
-
if (
|
|
366
|
+
// 整行编辑的模式下列表数据回填
|
|
367
|
+
if (editMode == "line") {
|
|
372
368
|
return tableRef.current.onEditByTable(data, id);
|
|
373
369
|
}
|
|
374
|
-
|
|
375
|
-
|
|
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:
|
|
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
|
>
|