From 5fe91e89b77f151f66548e86643eeb45ddac6060 Mon Sep 17 00:00:00 2001 From: roymondchen Date: Fri, 19 Dec 2025 20:19:55 +0800 Subject: [PATCH] =?UTF-8?q?feat(form,tdesign-vue-next-adapter):=20table=20?= =?UTF-8?q?=E5=A4=9A=E9=80=89=E6=A1=86=E6=94=BE=E5=88=B0=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E7=9A=84=E6=93=8D=E4=BD=9C=E5=89=8D=E9=9D=A2,=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E9=85=8D=E7=BD=AEcopy=E7=9A=84=E5=B9=B2=E9=A2=84?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/form-schema/src/base.ts | 1 + packages/form/src/table/ActionsColumn.vue | 13 ++++++++++- packages/form/src/table/useTableColumns.ts | 22 +++++++++---------- .../tdesign-vue-next-adapter/src/Table.vue | 4 ++++ 4 files changed, 28 insertions(+), 12 deletions(-) diff --git a/packages/form-schema/src/base.ts b/packages/form-schema/src/base.ts index e364aea4..021fc935 100644 --- a/packages/form-schema/src/base.ts +++ b/packages/form-schema/src/base.ts @@ -716,6 +716,7 @@ export interface TableConfig extends FormItem { selection?: (mForm: FormState | undefined, data: any) => boolean | boolean | 'single'; /** 新增的默认行 */ defaultAdd?: (mForm: FormState | undefined, data: any) => any; + copyHandler?: (mForm: FormState | undefined, data: any) => any; onSelect?: (mForm: FormState | undefined, data: any) => any; defautSort?: SortProp; defaultSort?: SortProp; diff --git a/packages/form/src/table/ActionsColumn.vue b/packages/form/src/table/ActionsColumn.vue index f0de9af1..51dbf6e9 100644 --- a/packages/form/src/table/ActionsColumn.vue +++ b/packages/form/src/table/ActionsColumn.vue @@ -63,7 +63,18 @@ const removeHandler = (index: number) => { }; const copyHandler = (index: number) => { - const inputs = cloneDeep(props.model[props.name][index]); + let inputs = cloneDeep(props.model[props.name][index]); + + if (typeof props.config.copyHandler === 'function') { + const modelName = props.name || props.config.name || ''; + inputs = props.config.copyHandler(mForm, { + model: props.model[modelName], + prop: props.prop, + formValue: mForm?.values, + inputs, + }); + } + const { length } = props.model[props.name]; if (props.sortKey && length) { inputs[props.sortKey] = props.model[props.name][length - 1][props.sortKey] - 1; diff --git a/packages/form/src/table/useTableColumns.ts b/packages/form/src/table/useTableColumns.ts index b2c1cae4..4fd7f04d 100644 --- a/packages/form/src/table/useTableColumns.ts +++ b/packages/form/src/table/useTableColumns.ts @@ -101,6 +101,17 @@ export const useTableColumns = ( }); } + if (selection.value) { + columns.push({ + props: { + align: 'center', + headerAlign: 'center', + type: 'selection', + width: 45, + }, + }); + } + let actionFixed: 'left' | 'right' | undefined = props.config.fixed === false ? undefined : 'left'; if (typeof props.config.fixed === 'string' && ['left', 'right'].includes(props.config.fixed)) { @@ -159,17 +170,6 @@ export const useTableColumns = ( }); } - if (selection.value) { - columns.push({ - props: { - align: 'center', - headerAlign: 'center', - type: 'selection', - width: 45, - }, - }); - } - if (props.showIndex && props.config.showIndex) { columns.push({ props: { diff --git a/packages/tdesign-vue-next-adapter/src/Table.vue b/packages/tdesign-vue-next-adapter/src/Table.vue index dda7bc36..9fa806e0 100644 --- a/packages/tdesign-vue-next-adapter/src/Table.vue +++ b/packages/tdesign-vue-next-adapter/src/Table.vue @@ -60,6 +60,10 @@ const tableColumns = computed(() => { align: item.props?.align, }; + if (item.props.type === 'selection') { + column.type = 'multiple'; + } + // 处理自定义单元格渲染 if (item.cell) { column.cell = (h: any, { row, rowIndex }: any) => {