From ff810d09e41163834f0ac9fd2057bd9fb9d53c55 Mon Sep 17 00:00:00 2001 From: roymondchen Date: Tue, 26 May 2026 21:05:01 +0800 Subject: [PATCH] =?UTF-8?q?feat(editor):=20=E6=95=B0=E6=8D=AE=E6=BA=90?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E9=80=89=E6=8B=A9=E6=8C=89=E9=92=AE=E5=9C=A8?= =?UTF-8?q?=E5=AF=B9=E6=AF=94=E6=A8=A1=E5=BC=8F=E4=B8=8E=E7=A6=81=E7=94=A8?= =?UTF-8?q?=E6=80=81=E4=B8=8B=E7=A6=81=E6=AD=A2=E5=88=87=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 按钮新增 disabled 绑定 (props.disabled || mForm?.isCompare) - 抽取 onToggleDataSourceFieldSelectHandler 增加 guard 防御 - 补充对应单元测试 --- .../fields/DataSourceFieldSelect/Index.vue | 9 ++- .../unit/fields/DataSourceFieldSelect.spec.ts | 60 +++++++++++++++++++ 2 files changed, 68 insertions(+), 1 deletion(-) diff --git a/packages/editor/src/fields/DataSourceFieldSelect/Index.vue b/packages/editor/src/fields/DataSourceFieldSelect/Index.vue index b1cbdc2c..3b9812e5 100644 --- a/packages/editor/src/fields/DataSourceFieldSelect/Index.vue +++ b/packages/editor/src/fields/DataSourceFieldSelect/Index.vue @@ -35,7 +35,8 @@ @@ -185,4 +186,10 @@ const onChangeHandler = (value: string[], eventData?: ContainerChangeEventData) emit('change', [dsId], eventData); } }; + +const onToggleDataSourceFieldSelectHandler = () => { + // 禁用或对比模式下禁止切换 + if (props.disabled || mForm?.isCompare) return; + showDataSourceFieldSelect.value = !showDataSourceFieldSelect.value; +}; diff --git a/packages/editor/tests/unit/fields/DataSourceFieldSelect.spec.ts b/packages/editor/tests/unit/fields/DataSourceFieldSelect.spec.ts index ef0293da..fac98ba6 100644 --- a/packages/editor/tests/unit/fields/DataSourceFieldSelect.spec.ts +++ b/packages/editor/tests/unit/fields/DataSourceFieldSelect.spec.ts @@ -242,4 +242,64 @@ describe('DataSourceFieldSelect Index', () => { }); expect(wrapper.findAll('.fake-cascader').length).toBeGreaterThan(0); }); + + test('disabled 为 true 时切换按钮被禁用,点击不切换 showDataSourceFieldSelect', async () => { + const wrapper = mount(DSFSIndex, { + props: { + config: { fieldConfig: { type: 'text' } }, + model: { v: [] }, + name: 'v', + disabled: true, + } as any, + }); + + const toggleBtn = wrapper.find('.fake-btn'); + expect((toggleBtn.element as HTMLButtonElement).hasAttribute('disabled')).toBe(true); + + // 点击不应切换显示 FieldSelect + await toggleBtn.trigger('click'); + expect(wrapper.findAll('.fake-cascader').length).toBe(0); + }); + + test('对比模式(mForm.isCompare=true)下切换按钮被禁用,点击不切换 showDataSourceFieldSelect', async () => { + const wrapper = mount(DSFSIndex, { + props: { + config: { fieldConfig: { type: 'text' } }, + model: { v: [] }, + name: 'v', + } as any, + global: { + provide: { + mForm: { isCompare: true }, + }, + }, + }); + + const toggleBtn = wrapper.find('.fake-btn'); + expect((toggleBtn.element as HTMLButtonElement).hasAttribute('disabled')).toBe(true); + + await toggleBtn.trigger('click'); + expect(wrapper.findAll('.fake-cascader').length).toBe(0); + }); + + test('非对比模式且未 disabled 时按钮可用,点击可切换', async () => { + const wrapper = mount(DSFSIndex, { + props: { + config: { fieldConfig: { type: 'text' } }, + model: { v: [] }, + name: 'v', + } as any, + global: { + provide: { + mForm: { isCompare: false }, + }, + }, + }); + + const toggleBtn = wrapper.find('.fake-btn'); + expect((toggleBtn.element as HTMLButtonElement).hasAttribute('disabled')).toBe(false); + + await toggleBtn.trigger('click'); + expect(wrapper.findAll('.fake-cascader').length).toBeGreaterThan(0); + }); });