From ac755ac3d0328a2ca8e77d6f8b117b8b349e1bd0 Mon Sep 17 00:00:00 2001 From: roymondchen Date: Thu, 23 Apr 2026 15:06:45 +0800 Subject: [PATCH] =?UTF-8?q?feat(form):=20group-list=20=E6=94=AF=E6=8C=81?= =?UTF-8?q?=20max=20=E9=99=90=E5=88=B6=E5=92=8C=20beforeAddRow=20=E5=89=8D?= =?UTF-8?q?=E7=BD=AE=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - group-list 新增 max 配置项,限制最大行数 - group-list 支持 beforeAddRow 异步前置校验回调 - table 的 beforeAddRow 支持返回 Promise Made-with: Cursor --- packages/form-schema/src/base.ts | 5 ++++- packages/form/src/containers/GroupList.vue | 16 +++++++++++++++- packages/form/src/table/useAdd.ts | 2 +- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/packages/form-schema/src/base.ts b/packages/form-schema/src/base.ts index 0447fad2..f10e2307 100644 --- a/packages/form-schema/src/base.ts +++ b/packages/form-schema/src/base.ts @@ -761,7 +761,7 @@ export interface TableConfig extends FormItem { titleTip?: FilterFunction; rowKey?: string; /** table 新增行时前置回调 */ - beforeAddRow?: (mForm: FormState | undefined, data: any) => boolean; + beforeAddRow?: (mForm: FormState | undefined, data: any) => boolean | Promise; addButtonConfig?: { props?: Record; text?: string; @@ -804,6 +804,9 @@ export interface GroupListConfig extends FormItem { props?: Record; text?: string; }; + /** 最大行数 */ + max?: number; + beforeAddRow?: (mForm: FormState | undefined, data: any) => boolean | Promise; } interface StepItemConfig extends FormItem, ContainerCommonConfig { diff --git a/packages/form/src/containers/GroupList.vue b/packages/form/src/containers/GroupList.vue index 8ac4aa71..ad2d3973 100644 --- a/packages/form/src/containers/GroupList.vue +++ b/packages/form/src/containers/GroupList.vue @@ -50,7 +50,7 @@ import { computed, inject } from 'vue'; import { Grid, Plus } from '@element-plus/icons-vue'; import { cloneDeep } from 'lodash-es'; -import { TMagicButton } from '@tmagic/design'; +import { TMagicButton, tMagicMessage } from '@tmagic/design'; import type { ContainerChangeEventData, FormState, GroupListConfig } from '../schema'; import { initValue } from '../utils/form'; @@ -102,6 +102,20 @@ const changeHandler = (v: any, eventData: ContainerChangeEventData) => { const addHandler = async () => { if (!props.name) return false; + if (props.config.max && props.model[props.name].length >= props.config.max) { + tMagicMessage.error(`最多新增配置不能超过${props.config.max}条`); + return; + } + + if (typeof props.config.beforeAddRow === 'function') { + const beforeCheckRes = await props.config.beforeAddRow(mForm, { + model: props.model[props.name], + formValue: mForm?.values, + prop: props.prop, + }); + if (!beforeCheckRes) return; + } + let initValues = {}; if (typeof props.config.defaultAdd === 'function') { diff --git a/packages/form/src/table/useAdd.ts b/packages/form/src/table/useAdd.ts index 78a05c60..2152e083 100644 --- a/packages/form/src/table/useAdd.ts +++ b/packages/form/src/table/useAdd.ts @@ -37,7 +37,7 @@ export const useAdd = ( } if (typeof props.config.beforeAddRow === 'function') { - const beforeCheckRes = props.config.beforeAddRow(mForm, { + const beforeCheckRes = await props.config.beforeAddRow(mForm, { model: props.model[modelName], formValue: mForm?.values, prop: props.prop,