From cb0792963c06149d71f0b4376aa8f49096c1918f Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Sat, 8 Aug 2026 11:21:56 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E6=94=B6=E6=8B=A2=E5=AE=A2?= =?UTF-8?q?=E6=88=B7=E5=88=97=E8=A1=A8=E6=AC=A1=E8=A6=81=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../customers/pages/CustomersView.test.ts | 36 +++++++++++++-- src/modules/customers/pages/CustomersView.vue | 46 +++++++++++++++++-- 2 files changed, 75 insertions(+), 7 deletions(-) diff --git a/src/modules/customers/pages/CustomersView.test.ts b/src/modules/customers/pages/CustomersView.test.ts index 0e4d3ce0..a704d945 100644 --- a/src/modules/customers/pages/CustomersView.test.ts +++ b/src/modules/customers/pages/CustomersView.test.ts @@ -100,6 +100,16 @@ function tableButtonByText(text: string) { .find((button) => button.textContent?.trim() === text) } +async function clickMoreAction(text: string) { + tableButtonByText('更多')?.click() + await flushPromises() + const item = [...document.querySelectorAll('.el-dropdown-menu__item')] + .find((candidate) => candidate.textContent?.trim() === text && !candidate.classList.contains('is-disabled')) + expect(item).toBeDefined() + item!.dispatchEvent(new MouseEvent('click', { bubbles: true })) + await flushPromises() +} + enableAutoUnmount(afterEach) describe('CustomersView', () => { @@ -445,8 +455,7 @@ describe('CustomersView', () => { mount(CustomersView, { attachTo: document.body, global: { plugins: [pinia, ElementPlus] } }) await flushPromises() - tableButtonByText('重置密码')?.click() - await flushPromises() + await clickMoreAction('重置密码') const password = document.querySelector('input[autocomplete="new-password"]') const confirmation = document.querySelector('input[placeholder="请再次输入新密码"]') @@ -470,9 +479,11 @@ describe('CustomersView', () => { useAccessPreviewStore().initializeAfterLogin() vi.mocked(archivePlatformTenant).mockResolvedValue({ ...fullTenant, status: 'DISABLED' }) - mount(CustomersView, { attachTo: document.body, global: { plugins: [pinia, ElementPlus] } }) + const wrapper = mount(CustomersView, { attachTo: document.body, global: { plugins: [pinia, ElementPlus] } }) await flushPromises() - tableButtonByText('删除')?.click() + const dropdowns = wrapper.findAllComponents({ name: 'ElDropdown' }) + expect(dropdowns.length).toBeGreaterThan(0) + dropdowns.at(-1)!.vm.$emit('command', 'delete') await flushPromises() const confirmation = document.querySelector('input[placeholder="TEN8"]') @@ -496,4 +507,21 @@ describe('CustomersView', () => { expect(document.querySelector('.el-table__fixed')).toBeNull() }) + + it('keeps frequent actions visible and groups secondary customer actions under more', async () => { + const auth = useAuthStore() + auth.permissions = [...auth.permissions, 'platform:customer:reset-password', 'platform:customer:impersonate', 'platform:customer:status', 'platform:customer:delete'] + useAccessPreviewStore().initializeAfterLogin() + vi.mocked(listPlatformTenants).mockResolvedValue({ records: [{ ...fullTenant, status: 'ACTIVE' }], page: 1, size: 10, total: 1, pages: 1 }) + + mount(CustomersView, { attachTo: document.body, global: { plugins: [pinia, ElementPlus] } }) + await flushPromises() + + expect(tableButtonByText('详情')).toBeDefined() + expect(tableButtonByText('编辑')).toBeDefined() + expect(tableButtonByText('更多')).toBeDefined() + expect(tableButtonByText('重置密码')).toBeUndefined() + await clickMoreAction('重置密码') + expect(document.querySelector('input[autocomplete="new-password"]')).toBeTruthy() + }) }) diff --git a/src/modules/customers/pages/CustomersView.vue b/src/modules/customers/pages/CustomersView.vue index d696f1a3..a26ad1f9 100644 --- a/src/modules/customers/pages/CustomersView.vue +++ b/src/modules/customers/pages/CustomersView.vue @@ -1,7 +1,7 @@