From 62f10d9c9773754f4b8433178fe3ebb60a765d25 Mon Sep 17 00:00:00 2001 From: gchust Date: Wed, 12 Mar 2025 08:46:38 +0800 Subject: [PATCH] chore: upgrade ant design to 5.24.2 (#6343) * chore: upgrade ant design to 5.24.2 * chore: fix errors after upgrade ant design * fix: ts errors * fix: ts error * fix: ts error * chore: keep original code format * chore: revert format changes * chore: keep code format * fix: unit tests error after upgrade ant design * fix: style issues for variable inputs * fix: inbox style issue * fix: some buttons not showing in drawer * chore: fix formily antd version * fix: incorrect details block pagination style [skip ci] * fix: incorrect cron style after upgrade ant design [skip ci] * fix: unit tests errors after upgrading ant design * fix: update unit tests for collection select and color picker components * fix: e2e tests errors * fix: e2e tests failing * fix: tests error * fix: e2e test cases * fix: some e2e tests failing * fix: e2e testing errors * fix: e2e build failing * fix: update yarn.lock to avoid comment ci timeout * Revert "fix: update yarn.lock to avoid comment ci timeout" This reverts commit 6f117f57a0fd1d605de7ef18022c5c3e658e24af. * chore: comment ci timeout * chore: e2e * fix: workflow approval e2e testing * fix: e2e stable for some tests --- package.json | 6 +- packages/core/client/package.json | 4 +- .../src/acl/Configuration/ConfigureCenter.tsx | 4 +- .../src/acl/Configuration/MenuConfigure.tsx | 6 +- .../Configuration/RolesResourcesActions.tsx | 6 +- .../src/acl/Configuration/StrategyActions.tsx | 4 +- .../client/src/block-provider/hooks/index.ts | 2 + .../Configuration/AddFieldAction.tsx | 3 +- .../templates/components/PresetFields.tsx | 2 +- .../client/src/global-theme/defaultTheme.ts | 3 +- .../__e2e__/bulk-destroy/basic.test.ts | 5 +- .../actions/__e2e__/link/basic.test.ts | 3 + .../associate/__e2e__/associate.test.ts | 1 + .../disassociate/__e2e__/disassociate.test.ts | 2 +- .../__e2e__/schemaInitializer.test.ts | 4 + .../__e2e__/schemaSettings.test.ts | 1 + .../setDataLoadingModeSettingsItem.test.ts | 22 +- .../__e2e__/schemaInitializer.test.ts | 4 +- .../form-create/schemaInitializer.test.ts | 10 +- .../form-create/schemaSettings.test.ts | 2 +- .../form-create/schemaSettings1.test.ts | 2 +- .../form-create/schemaSettings2.test.ts | 19 +- .../__e2e__/form-edit/bulkEditForm.test.ts | 2 + .../form-edit/deprecatedVariables.test.ts | 2 + .../__e2e__/form-edit/schemaSettings.test.ts | 1 + .../__e2e__/schemaInitializer.test.ts | 16 +- .../grid-card/__e2e__/schemaSettings.test.ts | 1 + .../list/__e2e__/schemaInitializer.test.ts | 4 + .../__e2e__/schemaInitializer.test.ts | 2 +- .../table/__e2e__/hideColumn.test.ts | 1 + .../table/__e2e__/schemaInitializer.test.ts | 14 +- .../table/__e2e__/schemaInitializer1.test.ts | 7 +- .../table/__e2e__/schemaSettings.test.ts | 28 +- .../__e2e__/schemaInitializer.test.ts | 7 + .../collapse/__e2e__/schemaSettings.test.ts | 2 +- .../autoFilterWhenSettingDefaultValue.test.ts | 4 +- .../AssociationSelect/dataScope.test.ts | 2 +- .../Select/__e2e__/selectDataScope.test.ts | 2 +- .../page/__e2e__/schemaSettings.test.ts | 4 + .../popup/__e2e__/schemaInitializer.test.ts | 6 +- .../popup/__e2e__/schemaInitializer1.test.ts | 9 +- .../popup/__e2e__/schemaSettings.test.ts | 1 + .../variable/__e2e__/parentObject.test.ts | 1 + packages/core/client/src/pm/PluginManager.tsx | 4 +- .../action/hooks/useSetAriaLabelForDrawer.ts | 2 +- .../appends-tree-select/AppendsTreeSelect.tsx | 6 +- .../antd/cascader/Cascader.tsx | 1 + .../__tests__/collection-select.test.tsx | 60 +- .../__tests__/ColorPicker.test.tsx | 10 +- .../src/schema-component/antd/cron/Cron.tsx | 4 + .../antd/date-picker/DatePicker.tsx | 26 +- .../antd/details/__tests__/details.test.tsx | 2 +- .../__tests__/icon-picker.test.tsx | 2 +- .../pagination/__tests__/pagination.test.tsx | 6 +- .../antd/time-picker/TimePicker.tsx | 4 +- .../__tests__/UnixTimestamp.test.tsx | 9 +- .../schema-component/antd/variable/Input.tsx | 2 +- .../antd/variable/TextArea.tsx | 2 +- .../LinkageRules/ValueDynamicComponent.tsx | 6 +- .../src/schema-settings/SchemaSettings.tsx | 1 + .../user/CurrentUserSettingsMenuProvider.tsx | 2 +- packages/core/client/src/user/Help.tsx | 5 +- .../templates/app/package.json.tpl | 2 +- packages/core/test/src/e2e/e2eUtils.ts | 1 + .../src/client/__e2e__/configure.test.ts | 9 +- .../client/permissions/MenuPermissions.tsx | 4 +- .../client/permissions/PluginPermissions.tsx | 6 +- .../permissions/RolesResourcesActions.tsx | 14 +- .../client/permissions/StrategyActions.tsx | 4 +- .../src/client/__e2e__/schemaSettings.test.ts | 3 +- .../src/client/__e2e__/popup.test.ts | 2 +- .../src/client/Configuration.tsx | 23 +- .../client/__e2e__/schemaInitializer.test.ts | 2 +- .../fields/color/schemaSettings.test.ts | 4 +- .../fields/color/schemaSettings1.test.ts | 4 +- .../src/client/__e2e__/utils.ts | 2 +- .../CollectionsManager/AddFieldAction.tsx | 4 +- .../RolesResourcesActions.tsx | 6 +- .../PermissionManager/StrategyActions.tsx | 3 +- .../client/__e2e__/schemaInitailizer.test.ts | 10 +- .../src/client/MenuPermissions.tsx | 4 +- .../src/client/__e2e__/permissions.test.ts | 2 + .../src/client/TableTransfer.tsx | 2 +- .../src/client/components/Inbox.tsx | 16 +- .../plugin-snapshot-field/package.json | 3 +- .../antd-token-previewer/ThemeSelect.tsx | 4 +- .../component-demos/transfer/danger.tsx | 2 +- .../component-demos/transfer/disabled.tsx | 2 +- .../component-demos/transfer/transfer.tsx | 2 +- .../component-demos/transfer/warning.tsx | 2 +- .../token-panel-pro/TokenContent.tsx | 2 +- .../src/client/AddNodeContext.tsx | 3 +- .../continueWhenYesBasicType.test.ts | 1 + .../deleteRecordNode/DeleteRecord.test.ts | 2 + yarn.lock | 635 ++++++++++-------- 95 files changed, 674 insertions(+), 496 deletions(-) diff --git a/package.json b/package.json index 02fefd9951..b530c0c628 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,9 @@ "react": "^18.0.0", "react-dom": "^18.0.0", "nwsapi": "2.2.7", - "antd": "5.12.8", + "antd": "5.24.2", + "@formily/antd-v5": "1.2.3", + "dayjs": "1.11.13", "@ant-design/icons": "^5.6.1" }, "config": { @@ -93,4 +95,4 @@ "yarn": "1.22.19" }, "dependencies": {} -} +} \ No newline at end of file diff --git a/packages/core/client/package.json b/packages/core/client/package.json index ba4050c143..60361fda4a 100644 --- a/packages/core/client/package.json +++ b/packages/core/client/package.json @@ -17,7 +17,7 @@ "@dnd-kit/modifiers": "^6.0.0", "@dnd-kit/sortable": "^6.0.0", "@emotion/css": "^11.7.1", - "@formily/antd-v5": "1.1.9", + "@formily/antd-v5": "1.2.3", "@formily/core": "^2.2.27", "@formily/grid": "^2.2.27", "@formily/json-schema": "^2.2.27", @@ -31,7 +31,7 @@ "@nocobase/sdk": "1.7.0-alpha.1", "@nocobase/utils": "1.7.0-alpha.1", "ahooks": "^3.7.2", - "antd": "5.12.8", + "antd": "5.24.2", "antd-style": "3.7.1", "axios": "^1.7.0", "bignumber.js": "^9.1.2", diff --git a/packages/core/client/src/acl/Configuration/ConfigureCenter.tsx b/packages/core/client/src/acl/Configuration/ConfigureCenter.tsx index ddb4bb16c5..038e8c1192 100644 --- a/packages/core/client/src/acl/Configuration/ConfigureCenter.tsx +++ b/packages/core/client/src/acl/Configuration/ConfigureCenter.tsx @@ -7,7 +7,7 @@ * For more information, please refer to: https://www.nocobase.com/agreement. */ -import { Checkbox, message, Table } from 'antd'; +import { Checkbox, message, Table, TableProps } from 'antd'; import { omit } from 'lodash'; import React, { createContext, useContext, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; @@ -139,7 +139,7 @@ export const SettingsCenterConfigure = () => { return handleChange(checked, record)} />; }, }, - ]} + ] as TableProps['columns']} dataSource={settings .filter((v) => { return v.isTopLevel !== false; diff --git a/packages/core/client/src/acl/Configuration/MenuConfigure.tsx b/packages/core/client/src/acl/Configuration/MenuConfigure.tsx index 9f31491b89..7726dcb00d 100644 --- a/packages/core/client/src/acl/Configuration/MenuConfigure.tsx +++ b/packages/core/client/src/acl/Configuration/MenuConfigure.tsx @@ -7,7 +7,7 @@ * For more information, please refer to: https://www.nocobase.com/agreement. */ -import { Checkbox, message, Table } from 'antd'; +import { Checkbox, message, Table, TableProps } from 'antd'; import { uniq } from 'lodash'; import React, { useState } from 'react'; import { useTranslation } from 'react-i18next'; @@ -149,12 +149,12 @@ export const MenuConfigure = () => { {t('Accessible')} ), - render: (_, schema) => { + render: (_, schema: { uid: string }) => { const checked = uids.includes(schema.uid); return handleChange(checked, schema)} />; }, }, - ]} + ] as TableProps['columns']} dataSource={translateTitle(items)} /> ); diff --git a/packages/core/client/src/acl/Configuration/RolesResourcesActions.tsx b/packages/core/client/src/acl/Configuration/RolesResourcesActions.tsx index da896e68d5..7bceb4e67e 100644 --- a/packages/core/client/src/acl/Configuration/RolesResourcesActions.tsx +++ b/packages/core/client/src/acl/Configuration/RolesResourcesActions.tsx @@ -10,7 +10,7 @@ import { FormItem, FormLayout } from '@formily/antd-v5'; import { ArrayField } from '@formily/core'; import { connect, useField, useForm } from '@formily/react'; -import { Checkbox, Table, Tag } from 'antd'; +import { Checkbox, Table, Tag, TableProps } from 'antd'; import { isEmpty } from 'lodash'; import React, { createContext } from 'react'; import { useTranslation } from 'react-i18next'; @@ -146,7 +146,7 @@ export const RolesResourcesActions = connect((props) => { /> ), }, - ]} + ] as TableProps['columns']} dataSource={availableActions?.map((item) => { let enabled = false; let scope = null; @@ -222,7 +222,7 @@ export const RolesResourcesActions = connect((props) => { ), }; }), - ]} + ] as TableProps['columns']} /> diff --git a/packages/core/client/src/acl/Configuration/StrategyActions.tsx b/packages/core/client/src/acl/Configuration/StrategyActions.tsx index df501db691..1f97af946c 100644 --- a/packages/core/client/src/acl/Configuration/StrategyActions.tsx +++ b/packages/core/client/src/acl/Configuration/StrategyActions.tsx @@ -9,7 +9,7 @@ import { ArrayField } from '@formily/core'; import { connect, useField } from '@formily/react'; -import { Checkbox, Select, Table, Tag } from 'antd'; +import { Checkbox, Select, Table, Tag, TableProps } from 'antd'; import React from 'react'; import { useTranslation } from 'react-i18next'; import { useCompile } from '../..'; @@ -110,7 +110,7 @@ export const StrategyActions = connect((props) => { /> ), }, - ]} + ] as TableProps['columns']} dataSource={availableActions?.map((item) => { let scope = 'all'; let enabled = false; diff --git a/packages/core/client/src/block-provider/hooks/index.ts b/packages/core/client/src/block-provider/hooks/index.ts index 168374889f..81962db3c8 100644 --- a/packages/core/client/src/block-provider/hooks/index.ts +++ b/packages/core/client/src/block-provider/hooks/index.ts @@ -1153,6 +1153,7 @@ export const useDetailsPaginationProps = () => { current: ctx.service?.data?.meta?.page || 1, pageSize: 1, showSizeChanger: false, + align: 'center', async onChange(page) { const params = ctx.service?.params?.[0]; ctx.service.run({ ...params, page }); @@ -1178,6 +1179,7 @@ export const useDetailsPaginationProps = () => { total: count, pageSize: 1, showSizeChanger: false, + align: 'center', async onChange(page) { const params = ctx.service?.params?.[0]; ctx.service.run({ ...params, page }); diff --git a/packages/core/client/src/collection-manager/Configuration/AddFieldAction.tsx b/packages/core/client/src/collection-manager/Configuration/AddFieldAction.tsx index 0fb0ad2965..2e44491840 100644 --- a/packages/core/client/src/collection-manager/Configuration/AddFieldAction.tsx +++ b/packages/core/client/src/collection-manager/Configuration/AddFieldAction.tsx @@ -25,6 +25,7 @@ import { useCollectionManager_deprecated } from '../hooks'; import useDialect from '../hooks/useDialect'; import * as components from './components'; import { useFieldInterfaceOptions } from './interfaces'; +import { ItemType, MenuItemType } from 'antd/es/menu/interface'; const getSchema = (schema: CollectionFieldInterface, record: any, compile) => { if (!schema) { @@ -231,7 +232,7 @@ export const AddFieldAction = (props) => { }, [getTemplate, record]); const items = useMemo(() => { return getFieldOptions() - .map((option) => { + .map((option): ItemType & { title: string; children?: ItemType[] } => { if (option?.children?.length === 0) { return null; } diff --git a/packages/core/client/src/collection-manager/templates/components/PresetFields.tsx b/packages/core/client/src/collection-manager/templates/components/PresetFields.tsx index 675617818e..5f52ca897b 100644 --- a/packages/core/client/src/collection-manager/templates/components/PresetFields.tsx +++ b/packages/core/client/src/collection-manager/templates/components/PresetFields.tsx @@ -96,7 +96,7 @@ export const PresetFields = observer( rowSelection={{ type: 'checkbox', selectedRowKeys, - getCheckboxProps: (record) => ({ + getCheckboxProps: (record: { name: string }) => ({ name: record.name, disabled: props?.disabled || props?.presetFieldsDisabledIncludes?.includes?.(record.name), }), diff --git a/packages/core/client/src/global-theme/defaultTheme.ts b/packages/core/client/src/global-theme/defaultTheme.ts index eb5de459d5..78c11135cf 100644 --- a/packages/core/client/src/global-theme/defaultTheme.ts +++ b/packages/core/client/src/global-theme/defaultTheme.ts @@ -29,7 +29,8 @@ const defaultTheme: ThemeConfig = { // 动画相关 motionUnit: 0.03, - motion: !process.env.__E2E__, + // ant design 升级到5.24.2后,Modal.confirm在E2E中如果关闭动画,会出现ant-modal-mask不销毁的问题 + // motion: !process.env.__E2E__, }, }; diff --git a/packages/core/client/src/modules/actions/__e2e__/bulk-destroy/basic.test.ts b/packages/core/client/src/modules/actions/__e2e__/bulk-destroy/basic.test.ts index 777b9bb5c1..3a45772323 100644 --- a/packages/core/client/src/modules/actions/__e2e__/bulk-destroy/basic.test.ts +++ b/packages/core/client/src/modules/actions/__e2e__/bulk-destroy/basic.test.ts @@ -28,7 +28,7 @@ test.describe('bulk-destroy', () => { // 3. 点击批量删除按钮,Table 显示无数据 await page.getByLabel('action-Action-Delete-destroy-').click(); await page.getByRole('button', { name: 'OK', exact: true }).click(); - await expect(page.getByLabel('block-item-CardItem-general-').getByText('No data')).toBeVisible(); + await expect(page.getByLabel('block-item-CardItem-general-').getByText('No data').last()).toBeVisible(); }); test('Secondary confirmation', async ({ page, mockPage, mockRecords }) => { @@ -45,6 +45,7 @@ test.describe('bulk-destroy', () => { await page.getByLabel('designer-schema-settings-Action-actionSettings:bulkDelete-general').hover(); await page.getByRole('menuitem', { name: 'Secondary confirmation' }).click(); await page.getByLabel('Enable secondary confirmation').uncheck(); + await expect(page.getByRole('button', { name: 'OK' })).toHaveCount(1); await page.getByRole('button', { name: 'OK' }).click(); await page.mouse.move(500, 0); @@ -53,6 +54,6 @@ test.describe('bulk-destroy', () => { // 3. 点击批量删除按钮,Table 显示无数据 await page.getByLabel('action-Action-Delete-destroy-').click(); - await expect(page.getByLabel('block-item-CardItem-general-').getByText('No data')).toBeVisible(); + await expect(page.getByLabel('block-item-CardItem-general-').getByText('No data').last()).toBeVisible(); }); }); diff --git a/packages/core/client/src/modules/actions/__e2e__/link/basic.test.ts b/packages/core/client/src/modules/actions/__e2e__/link/basic.test.ts index ca11ae838b..8b2a31eddb 100644 --- a/packages/core/client/src/modules/actions/__e2e__/link/basic.test.ts +++ b/packages/core/client/src/modules/actions/__e2e__/link/basic.test.ts @@ -28,6 +28,9 @@ test.describe('Link', () => { // 2. config the Link button await page.getByLabel('action-Action.Link-Link-customize:link-users-table-0').hover(); + await expect( + page.getByRole('button', { name: 'designer-schema-settings-Action.Link-actionSettings:link-users' }), + ).toHaveCount(1); await page.getByRole('button', { name: 'designer-schema-settings-Action.Link-actionSettings:link-users' }).hover(); await page.getByRole('menuitem', { name: 'Edit link' }).click(); await page diff --git a/packages/core/client/src/modules/actions/associate/__e2e__/associate.test.ts b/packages/core/client/src/modules/actions/associate/__e2e__/associate.test.ts index 5b22c812ff..6274bd3f37 100644 --- a/packages/core/client/src/modules/actions/associate/__e2e__/associate.test.ts +++ b/packages/core/client/src/modules/actions/associate/__e2e__/associate.test.ts @@ -29,6 +29,7 @@ test('basic', async ({ page, mockPage, mockRecord }) => { await expect(page.getByRole('tooltip').getByText('Disassociate')).toBeVisible(); await page.getByLabel('block-item-CardItem-cc-table').hover(); + await page.getByRole('menuitem', { name: 'Associate' }).waitFor({ state: 'detached' }); await page.getByLabel('schema-initializer-ActionBar-table:configureActions-cc').hover(); await page.getByRole('menuitem', { name: 'Associate' }).click(); //点击 associate 出现弹窗 diff --git a/packages/core/client/src/modules/actions/disassociate/__e2e__/disassociate.test.ts b/packages/core/client/src/modules/actions/disassociate/__e2e__/disassociate.test.ts index f9e2832325..ee224d48f6 100644 --- a/packages/core/client/src/modules/actions/disassociate/__e2e__/disassociate.test.ts +++ b/packages/core/client/src/modules/actions/disassociate/__e2e__/disassociate.test.ts @@ -18,7 +18,7 @@ test('basic', async ({ page, mockPage, mockRecord }) => { await page.getByLabel('action-Action.Link-Edit record-update-collection1-table-0').click(); await page.getByLabel('schema-initializer-Grid-popup').hover(); await page.getByRole('menuitem', { name: 'Table right' }).hover(); - await page.getByRole('menuitem', { name: 'Associated records' }).hover(); + await page.getByRole('menuitem', { name: 'Associated records' }).last().hover(); await page.getByRole('menuitem', { name: 'manyToMany' }).click(); // 2. Table 中显示 Role UID 字段 diff --git a/packages/core/client/src/modules/blocks/data-blocks/details-multi/__e2e__/schemaInitializer.test.ts b/packages/core/client/src/modules/blocks/data-blocks/details-multi/__e2e__/schemaInitializer.test.ts index 42f32a51c8..54684025a7 100644 --- a/packages/core/client/src/modules/blocks/data-blocks/details-multi/__e2e__/schemaInitializer.test.ts +++ b/packages/core/client/src/modules/blocks/data-blocks/details-multi/__e2e__/schemaInitializer.test.ts @@ -12,6 +12,7 @@ import { oneEmptyTableWithUsers } from './templatesOfBug'; const deleteButton = async (page: Page, name: string) => { await page.getByRole('button', { name }).hover(); + await page.getByRole('menuitem', { name: 'Delete' }).waitFor({ state: 'detached' }); await page.getByRole('button', { name }).getByLabel('designer-schema-settings-').hover(); await page.getByRole('menuitem', { name: 'Delete' }).click(); await page.getByRole('button', { name: 'OK', exact: true }).click(); @@ -31,6 +32,7 @@ test.describe('where multi data details block can be added', () => { // 1. 打开弹窗,通过 Associated records 添加一个详情区块 await page.getByLabel('action-Action.Link-View').click(); await page.getByLabel('schema-initializer-Grid-popup').hover(); + await page.getByRole('menuitem', { name: 'Associated records right' }).waitFor({ state: 'detached' }); await page.getByRole('menuitem', { name: 'Details right' }).hover(); await page.getByRole('menuitem', { name: 'Associated records right' }).hover(); await page.getByRole('menuitem', { name: 'Roles' }).click(); @@ -41,6 +43,7 @@ test.describe('where multi data details block can be added', () => { await expect(page.getByLabel('block-item-CollectionField-').getByText('admin')).toBeVisible(); // 2. 打开弹窗,通过 Other records 添加一个详情区块 + await page.getByRole('menuitem', { name: 'Details right' }).waitFor({ state: 'detached' }); await page.getByLabel('schema-initializer-Grid-popup').hover(); await page.getByRole('menuitem', { name: 'Details right' }).hover(); await page.getByRole('menuitem', { name: 'Other records right' }).hover(); @@ -116,6 +119,7 @@ test.describe('configure actions', () => { await page.getByText('Delete').click(); await page.mouse.move(300, 0); + await expect(page.getByRole('button', { name: 'Edit' })).toHaveCount(1); await expect(page.getByRole('button', { name: 'Edit' })).toBeVisible(); await expect(page.getByRole('button', { name: 'Delete' })).toBeVisible(); diff --git a/packages/core/client/src/modules/blocks/data-blocks/details-multi/__e2e__/schemaSettings.test.ts b/packages/core/client/src/modules/blocks/data-blocks/details-multi/__e2e__/schemaSettings.test.ts index 23faffa28b..4168cb2752 100644 --- a/packages/core/client/src/modules/blocks/data-blocks/details-multi/__e2e__/schemaSettings.test.ts +++ b/packages/core/client/src/modules/blocks/data-blocks/details-multi/__e2e__/schemaSettings.test.ts @@ -76,6 +76,7 @@ test.describe('actions schema settings', () => { await expectSettingsMenu({ page, showMenu: async () => { + await expect(page.getByRole('button', { name: 'Edit' })).toHaveCount(1); await page.getByRole('button', { name: 'Edit' }).hover(); await page.getByRole('button', { name: 'designer-schema-settings-Action' }).hover(); }, diff --git a/packages/core/client/src/modules/blocks/data-blocks/details-multi/__e2e__/setDataLoadingModeSettingsItem.test.ts b/packages/core/client/src/modules/blocks/data-blocks/details-multi/__e2e__/setDataLoadingModeSettingsItem.test.ts index eaa98da272..3402c78d39 100644 --- a/packages/core/client/src/modules/blocks/data-blocks/details-multi/__e2e__/setDataLoadingModeSettingsItem.test.ts +++ b/packages/core/client/src/modules/blocks/data-blocks/details-multi/__e2e__/setDataLoadingModeSettingsItem.test.ts @@ -50,10 +50,10 @@ test.describe('setDataLoadingModeSettingsItem', () => { await page.getByRole('button', { name: 'OK', exact: true }).click(); // 所有区块应该显示 No data - await expect(page.getByLabel('block-item-CardItem-users-table').getByText('No data')).toBeVisible(); - await expect(page.getByLabel('block-item-CardItem-users-details').getByText('No data')).toBeVisible(); - await expect(page.getByLabel('block-item-CardItem-users-list').getByText('No data')).toBeVisible(); - await expect(page.getByLabel('block-item-BlockItem-users-').getByText('No data')).toBeVisible(); + await expect(page.getByLabel('block-item-CardItem-users-table').getByText('No data').last()).toBeVisible(); + await expect(page.getByLabel('block-item-CardItem-users-details').getByText('No data').last()).toBeVisible(); + await expect(page.getByLabel('block-item-CardItem-users-list').getByText('No data').last()).toBeVisible(); + await expect(page.getByLabel('block-item-BlockItem-users-').getByText('No data').last()).toBeVisible(); // 3. 在筛选表单中数据一个筛选条件,点击筛选按钮,区块内应该显示数据 await page.getByLabel('block-item-CollectionField-').getByRole('textbox').click(); @@ -67,10 +67,10 @@ test.describe('setDataLoadingModeSettingsItem', () => { // 4. 点击筛选表单的 Reset 按钮,区块内应该显示 No data await page.getByLabel('action-Action-Reset to empty-users-').click(); - await expect(page.getByLabel('block-item-CardItem-users-table').getByText('No data')).toBeVisible(); - await expect(page.getByLabel('block-item-CardItem-users-details').getByText('No data')).toBeVisible(); - await expect(page.getByLabel('block-item-CardItem-users-list').getByText('No data')).toBeVisible(); - await expect(page.getByLabel('block-item-BlockItem-users-').getByText('No data')).toBeVisible(); + await expect(page.getByLabel('block-item-CardItem-users-table').getByText('No data').last()).toBeVisible(); + await expect(page.getByLabel('block-item-CardItem-users-details').getByText('No data').last()).toBeVisible(); + await expect(page.getByLabel('block-item-CardItem-users-list').getByText('No data').last()).toBeVisible(); + await expect(page.getByLabel('block-item-BlockItem-users-').getByText('No data').last()).toBeVisible(); }); test('When the data block has data scope settings and dataLoadingMode is manual, data should not be displayed after the first page load', async ({ @@ -78,7 +78,7 @@ test.describe('setDataLoadingModeSettingsItem', () => { mockPage, }) => { await mockPage(TableBlockWithDataScope).goto(); - await expect(page.getByLabel('block-item-CardItem-users-table').getByText('No data')).toBeVisible(); + await expect(page.getByLabel('block-item-CardItem-users-table').getByText('No data').last()).toBeVisible(); // 此时点击 filter 按钮,应该还是没数据,因为表单没有值 await page.getByLabel('action-Action-Filter-submit-').click({ @@ -87,7 +87,7 @@ test.describe('setDataLoadingModeSettingsItem', () => { y: 10, }, }); - await expect(page.getByLabel('block-item-CardItem-users-table').getByText('No data')).toBeVisible(); + await expect(page.getByLabel('block-item-CardItem-users-table').getByText('No data').last()).toBeVisible(); // 点击 Reset 按钮,也是一样 await page.getByLabel('action-Action-Reset-users-').click({ @@ -96,6 +96,6 @@ test.describe('setDataLoadingModeSettingsItem', () => { y: 10, }, }); - await expect(page.getByLabel('block-item-CardItem-users-table').getByText('No data')).toBeVisible(); + await expect(page.getByLabel('block-item-CardItem-users-table').getByText('No data').last()).toBeVisible(); }); }); diff --git a/packages/core/client/src/modules/blocks/data-blocks/details-single/__e2e__/schemaInitializer.test.ts b/packages/core/client/src/modules/blocks/data-blocks/details-single/__e2e__/schemaInitializer.test.ts index ceb518239b..97c246cfcc 100644 --- a/packages/core/client/src/modules/blocks/data-blocks/details-single/__e2e__/schemaInitializer.test.ts +++ b/packages/core/client/src/modules/blocks/data-blocks/details-single/__e2e__/schemaInitializer.test.ts @@ -69,7 +69,7 @@ test.describe('where single data details block can be added', () => { // 3.通过 Associated records 创建一个详情区块 await page.getByLabel('schema-initializer-Grid-popup').hover(); await page.getByRole('menuitem', { name: 'Details right' }).hover(); - await page.getByRole('menuitem', { name: 'Associated records' }).hover(); + await page.getByRole('menuitem', { name: 'Associated records' }).last().hover(); await page.getByRole('menuitem', { name: 'manyToOne' }).hover(); await page.getByRole('menuitem', { name: 'Blank block' }).click(); await page.mouse.move(300, 0); @@ -82,7 +82,7 @@ test.describe('where single data details block can be added', () => { // 4.通过 Associated records 创建一个详情区块,使用模板 await page.getByLabel('schema-initializer-Grid-popup').hover(); await page.getByRole('menuitem', { name: 'Details right' }).hover(); - await page.getByRole('menuitem', { name: 'Associated records' }).hover(); + await page.getByRole('menuitem', { name: 'Associated records' }).last().hover(); await page.getByRole('menuitem', { name: 'manyToOne' }).hover(); await page.getByRole('menuitem', { name: 'Duplicate template' }).hover(); await page.getByRole('menuitem', { name: 'example_Details (Fields only)' }).click(); diff --git a/packages/core/client/src/modules/blocks/data-blocks/form/__e2e__/form-create/schemaInitializer.test.ts b/packages/core/client/src/modules/blocks/data-blocks/form/__e2e__/form-create/schemaInitializer.test.ts index 9eec7020d5..c806156f37 100644 --- a/packages/core/client/src/modules/blocks/data-blocks/form/__e2e__/form-create/schemaInitializer.test.ts +++ b/packages/core/client/src/modules/blocks/data-blocks/form/__e2e__/form-create/schemaInitializer.test.ts @@ -60,10 +60,10 @@ test.describe('configure fields', () => { await expect(page.getByRole('menuitem', { name: 'ID', exact: true }).getByRole('switch')).toBeChecked(); // add association fields - await page.getByRole('menuitem', { name: 'Many to one' }).nth(1).hover(); + await page.getByRole('menuitem', { name: 'Many to one right' }).hover(); await page.getByRole('menuitem', { name: 'Nickname' }).click(); - await page.getByRole('menuitem', { name: 'Many to one' }).nth(1).hover(); + await page.getByRole('menuitem', { name: 'Many to one right' }).hover(); await expect(page.getByRole('menuitem', { name: 'Nickname' }).getByRole('switch')).toBeChecked(); await page.mouse.move(300, 0); @@ -72,13 +72,14 @@ test.describe('configure fields', () => { // delete fields await page.getByLabel('schema-initializer-Grid-form:configureFields-general').hover(); + await expect(page.getByRole('menuitem', { name: 'ID', exact: true })).toHaveCount(1); await page.getByRole('menuitem', { name: 'ID', exact: true }).click(); await expect(page.getByRole('menuitem', { name: 'ID', exact: true }).getByRole('switch')).not.toBeChecked(); - await page.getByRole('menuitem', { name: 'Many to one' }).nth(1).hover(); + await page.getByRole('menuitem', { name: 'Many to one right' }).hover(); await page.getByRole('menuitem', { name: 'Nickname' }).click(); - await page.getByRole('menuitem', { name: 'Many to one' }).nth(1).hover(); + await page.getByRole('menuitem', { name: 'Many to one right' }).hover(); await expect(page.getByRole('menuitem', { name: 'Nickname' }).getByRole('switch')).not.toBeChecked(); await page.mouse.move(300, 0); @@ -119,6 +120,7 @@ test.describe('configure actions', () => { // add button await page.getByRole('menuitem', { name: 'Submit' }).click(); await page.mouse.move(300, 0); + await expect(page.getByRole('button', { name: 'Submit' })).toHaveCount(1); await expect(page.getByRole('button', { name: 'Submit' })).toBeVisible(); // delete button diff --git a/packages/core/client/src/modules/blocks/data-blocks/form/__e2e__/form-create/schemaSettings.test.ts b/packages/core/client/src/modules/blocks/data-blocks/form/__e2e__/form-create/schemaSettings.test.ts index e210a3172e..86eda66087 100644 --- a/packages/core/client/src/modules/blocks/data-blocks/form/__e2e__/form-create/schemaSettings.test.ts +++ b/packages/core/client/src/modules/blocks/data-blocks/form/__e2e__/form-create/schemaSettings.test.ts @@ -279,7 +279,7 @@ test.describe('set default value', () => { await page.getByRole('button', { name: 'OK', exact: true }).click(); // 2. 设置的 ‘abcd’ 应该立即显示在 Nickname 字段的输入框中 - await expect(page.getByLabel('block-item-CollectionField-').getByRole('textbox')).toHaveValue('abcd'); + await expect(page.getByLabel('block-item-CollectionField-').getByRole('textbox').last()).toHaveValue('abcd'); }); test('Current popup record', async ({ page, mockPage }) => { diff --git a/packages/core/client/src/modules/blocks/data-blocks/form/__e2e__/form-create/schemaSettings1.test.ts b/packages/core/client/src/modules/blocks/data-blocks/form/__e2e__/form-create/schemaSettings1.test.ts index 99965cbaab..31e53ebdce 100644 --- a/packages/core/client/src/modules/blocks/data-blocks/form/__e2e__/form-create/schemaSettings1.test.ts +++ b/packages/core/client/src/modules/blocks/data-blocks/form/__e2e__/form-create/schemaSettings1.test.ts @@ -248,7 +248,7 @@ test.describe('creation form block schema settings', () => { // 重新选择一下数据,字段值才会被填充 // TODO: 保存后,数据应该直接被填充上 - await page.getByLabel('icon-close-select').click(); + await page.getByLabel('icon-close-select').last().click(); await page.getByTestId('select-object-single').click(); await page.getByRole('option', { name: '2' }).click(); diff --git a/packages/core/client/src/modules/blocks/data-blocks/form/__e2e__/form-create/schemaSettings2.test.ts b/packages/core/client/src/modules/blocks/data-blocks/form/__e2e__/form-create/schemaSettings2.test.ts index 1f9cdfa55b..a3a6a6290e 100644 --- a/packages/core/client/src/modules/blocks/data-blocks/form/__e2e__/form-create/schemaSettings2.test.ts +++ b/packages/core/client/src/modules/blocks/data-blocks/form/__e2e__/form-create/schemaSettings2.test.ts @@ -128,9 +128,14 @@ test.describe('linkage rules', () => { // 增加一条规则:当 number 字段的值等于 123 时 await page.getByRole('button', { name: 'plus Add linkage rule' }).click(); - await page.locator('.ant-collapse-header').nth(1).getByRole('img', { name: 'right' }).click(); + await page.locator('.ant-collapse-header .ant-collapse-expand-icon').nth(1).click(); - await page.getByLabel('Linkage rules').getByRole('tabpanel').getByText('Add condition', { exact: true }).click(); + await page + .getByLabel('Linkage rules') + .getByRole('tabpanel') + .getByText('Add condition', { exact: true }) + .last() + .click(); await page.getByRole('button', { name: 'Select field' }).click(); await page.getByRole('menuitemcheckbox', { name: 'number' }).click(); await page.getByLabel('Linkage rules').getByRole('spinbutton').click(); @@ -146,19 +151,19 @@ test.describe('linkage rules', () => { // action: 为 longText 字段赋上常量值 await page.getByLabel('Linkage rules').getByRole('tabpanel').getByText('Add property').click(); await page.getByRole('button', { name: 'Select field' }).click(); - await page.getByRole('tree').getByText('longText').click(); + await page.getByRole('tree').getByText('longText').last().click(); await page.getByRole('button', { name: 'action', exact: true }).click(); - await page.getByRole('option', { name: 'Value', exact: true }).click(); + await page.getByRole('option', { name: 'Value', exact: true }).last().click(); await page.getByLabel('dynamic-component-linkage-rules').getByRole('textbox').fill('456'); // action: 为 integer 字段附上一个表达式,使其值等于 number 字段的值 await page.getByLabel('Linkage rules').getByRole('tabpanel').getByText('Add property').click(); await page.getByRole('button', { name: 'Select field' }).click(); - await page.getByRole('tree').getByText('integer').click(); + await page.getByRole('tree').getByText('integer').last().click(); await page.getByRole('button', { name: 'action', exact: true }).click(); - await page.getByRole('option', { name: 'Value', exact: true }).click(); - await page.getByTestId('select-linkage-value-type').nth(1).click(); + await page.getByRole('option', { name: 'Value', exact: true }).last().click(); + await page.getByTestId('select-linkage-value-type').last().click(); await page.getByText('Expression').click(); await page.getByText('xSelect a variable').click(); diff --git a/packages/core/client/src/modules/blocks/data-blocks/form/__e2e__/form-edit/bulkEditForm.test.ts b/packages/core/client/src/modules/blocks/data-blocks/form/__e2e__/form-edit/bulkEditForm.test.ts index d4d5c94351..5dcdb7979d 100644 --- a/packages/core/client/src/modules/blocks/data-blocks/form/__e2e__/form-edit/bulkEditForm.test.ts +++ b/packages/core/client/src/modules/blocks/data-blocks/form/__e2e__/form-edit/bulkEditForm.test.ts @@ -33,6 +33,7 @@ test.describe('bulk edit form', () => { await expect(page.getByLabel('block-item-BulkEditField-').getByText('*')).toBeVisible(); // 3. 输入值,点击提交 + await expect(page.getByLabel('block-item-BulkEditField-').getByRole('textbox')).toHaveCount(1); await page.getByLabel('block-item-BulkEditField-').getByRole('textbox').fill('123'); await page.getByRole('button', { name: 'Submit' }).click(); @@ -65,6 +66,7 @@ test.describe('bulk edit form', () => { await expect(page.getByLabel('block-item-BulkEditField-').getByText('*')).toBeVisible(); // 4. 点击提交按钮,应该提示一个错误 + await expect(page.getByRole('button', { name: 'Submit' })).toHaveCount(1); await page.getByRole('button', { name: 'Submit' }).click(); await expect(page.getByLabel('block-item-BulkEditField-').getByText('The field value is required')).toBeVisible(); diff --git a/packages/core/client/src/modules/blocks/data-blocks/form/__e2e__/form-edit/deprecatedVariables.test.ts b/packages/core/client/src/modules/blocks/data-blocks/form/__e2e__/form-edit/deprecatedVariables.test.ts index 8e27ae035c..25c80340d2 100644 --- a/packages/core/client/src/modules/blocks/data-blocks/form/__e2e__/form-edit/deprecatedVariables.test.ts +++ b/packages/core/client/src/modules/blocks/data-blocks/form/__e2e__/form-edit/deprecatedVariables.test.ts @@ -34,6 +34,7 @@ test.describe('deprecated variables', () => { // 表达式输入框也是一样 await page.getByText('xSelect a variable').click(); + await expect(page.getByRole('menuitemcheckbox', { name: 'Current record right' })).toHaveCount(1); await page.getByRole('menuitemcheckbox', { name: 'Current record right' }).hover({ position: { x: 40, y: 12 } }); await expect(page.getByRole('tooltip', { name: 'This variable has been deprecated' })).toBeVisible(); await expect(page.getByRole('menuitemcheckbox', { name: 'Current record right' })).toHaveClass( @@ -45,6 +46,7 @@ test.describe('deprecated variables', () => { // 3. 当设置为其它变量后,再次打开,变量列表中的弃用变量不再显示 await page.locator('button').filter({ hasText: /^x$/ }).click(); + await expect(page.getByRole('menuitemcheckbox', { name: 'Current form right' })).toHaveCount(1); await page.getByRole('menuitemcheckbox', { name: 'Current form right' }).click(); await page.getByRole('menuitemcheckbox', { name: 'Nickname' }).click(); await expect(page.getByLabel('variable-tag').getByText('Current form / Nickname')).toBeVisible(); diff --git a/packages/core/client/src/modules/blocks/data-blocks/form/__e2e__/form-edit/schemaSettings.test.ts b/packages/core/client/src/modules/blocks/data-blocks/form/__e2e__/form-edit/schemaSettings.test.ts index 787d818657..48a0412023 100644 --- a/packages/core/client/src/modules/blocks/data-blocks/form/__e2e__/form-edit/schemaSettings.test.ts +++ b/packages/core/client/src/modules/blocks/data-blocks/form/__e2e__/form-edit/schemaSettings.test.ts @@ -18,6 +18,7 @@ import { import { T3825 } from './templatesOfBug'; const clickOption = async (page: Page, optionName: string) => { await page.getByLabel('block-item-CardItem-general-form').hover(); + await page.getByRole('menuitem', { name: optionName }).waitFor({ state: 'detached' }); await page.getByLabel('designer-schema-settings-CardItem-FormV2.Designer-general').hover(); await page.getByRole('menuitem', { name: optionName }).click(); }; diff --git a/packages/core/client/src/modules/blocks/data-blocks/grid-card/__e2e__/schemaInitializer.test.ts b/packages/core/client/src/modules/blocks/data-blocks/grid-card/__e2e__/schemaInitializer.test.ts index 5582f3b32e..506094cbc0 100644 --- a/packages/core/client/src/modules/blocks/data-blocks/grid-card/__e2e__/schemaInitializer.test.ts +++ b/packages/core/client/src/modules/blocks/data-blocks/grid-card/__e2e__/schemaInitializer.test.ts @@ -13,6 +13,7 @@ import { oneGridCardWithInheritFields } from './templatesOfBug'; const deleteButton = async (page: Page, name: string) => { await page.getByRole('button', { name }).hover(); + await page.getByRole('menuitem', { name: 'Delete' }).waitFor({ state: 'detached' }); await page.getByRole('button', { name }).getByLabel('designer-schema-settings-').hover(); await page.getByRole('menuitem', { name: 'Delete' }).click(); await page.getByRole('button', { name: 'OK', exact: true }).click(); @@ -47,6 +48,7 @@ test.describe('where grid card block can be added', () => { // 2. 通过 Other records 创建一个列表区块 await page.getByLabel('schema-initializer-Grid-popup').hover(); + await page.getByRole('menuitem', { name: 'Other records right' }).waitFor({ state: 'detached' }); await page.getByRole('menuitem', { name: 'Grid Card right' }).hover(); await page.getByRole('menuitem', { name: 'Other records right' }).hover(); await page.getByRole('menuitem', { name: 'Users' }).click(); @@ -151,10 +153,10 @@ test.describe('configure fields', () => { // add association fields await page.mouse.wheel(0, 300); - await page.getByRole('menuitem', { name: 'Many to one' }).nth(1).hover(); + await page.getByRole('menuitem', { name: 'Many to one right' }).hover(); await page.getByRole('menuitem', { name: 'Nickname' }).click(); - await page.getByRole('menuitem', { name: 'Many to one' }).nth(1).hover(); + await page.getByRole('menuitem', { name: 'Many to one right' }).hover(); await expect(page.getByRole('menuitem', { name: 'Nickname' }).getByRole('switch')).toBeChecked(); await page.mouse.move(300, 0); @@ -165,14 +167,14 @@ test.describe('configure fields', () => { // delete fields await formItemInitializer.hover(); - await page.getByRole('menuitem', { name: 'ID', exact: true }).click(); - await expect(page.getByRole('menuitem', { name: 'ID', exact: true }).getByRole('switch')).not.toBeChecked(); + await page.getByRole('menuitem', { name: 'ID', exact: true }).first().click(); + await expect(page.getByRole('menuitem', { name: 'ID', exact: true }).getByRole('switch').first()).not.toBeChecked(); await page.mouse.wheel(0, 300); - await page.getByRole('menuitem', { name: 'Many to one' }).nth(1).hover(); + await page.getByRole('menuitem', { name: 'Many to one right' }).hover(); await page.getByRole('menuitem', { name: 'Nickname' }).click(); - await page.getByRole('menuitem', { name: 'Many to one' }).nth(1).hover(); + await page.getByRole('menuitem', { name: 'Many to one right' }).hover(); await expect(page.getByRole('menuitem', { name: 'Nickname' }).getByRole('switch')).not.toBeChecked(); await page.mouse.move(300, 0); @@ -185,7 +187,7 @@ test.describe('configure fields', () => { // add markdown await formItemInitializer.hover(); - await page.getByRole('menuitem', { name: 'ID', exact: true }).hover(); + await page.getByRole('menuitem', { name: 'ID', exact: true }).first().hover(); await page.mouse.wheel(0, 300); await page.getByRole('menuitem', { name: 'Add Markdown' }).click(); diff --git a/packages/core/client/src/modules/blocks/data-blocks/grid-card/__e2e__/schemaSettings.test.ts b/packages/core/client/src/modules/blocks/data-blocks/grid-card/__e2e__/schemaSettings.test.ts index fec8fa7ba9..cf4c79f1cb 100644 --- a/packages/core/client/src/modules/blocks/data-blocks/grid-card/__e2e__/schemaSettings.test.ts +++ b/packages/core/client/src/modules/blocks/data-blocks/grid-card/__e2e__/schemaSettings.test.ts @@ -18,6 +18,7 @@ test.describe('grid card block schema settings', () => { page, showMenu: async () => { await page.getByLabel('block-item-BlockItem-general-grid-card').hover(); + await page.waitForTimeout(1000); await page.getByLabel('designer-schema-settings-BlockItem-GridCard.Designer-general').hover(); }, supportedOptions: [ diff --git a/packages/core/client/src/modules/blocks/data-blocks/list/__e2e__/schemaInitializer.test.ts b/packages/core/client/src/modules/blocks/data-blocks/list/__e2e__/schemaInitializer.test.ts index 3c7db0668b..c9b0519b6b 100644 --- a/packages/core/client/src/modules/blocks/data-blocks/list/__e2e__/schemaInitializer.test.ts +++ b/packages/core/client/src/modules/blocks/data-blocks/list/__e2e__/schemaInitializer.test.ts @@ -12,6 +12,7 @@ import { oneEmptyTableWithUsers } from '../../details-multi/__e2e__/templatesOfB const deleteButton = async (page: Page, name: string) => { await page.getByRole('button', { name }).hover(); + await page.getByRole('menuitem', { name: 'Delete' }).waitFor({ state: 'detached' }); await page.getByRole('button', { name }).getByLabel('designer-schema-settings-').hover(); await page.getByRole('menuitem', { name: 'Delete' }).click(); await page.getByRole('button', { name: 'OK', exact: true }).click(); @@ -71,6 +72,9 @@ test.describe('configure global actions', () => { await page.getByRole('menuitem', { name: 'Refresh' }).click(); await page.mouse.move(300, 0); + await expect(page.getByRole('button', { name: 'Filter' })).toHaveCount(1); + await expect(page.getByRole('button', { name: 'Add new' })).toHaveCount(1); + await expect(page.getByRole('button', { name: 'Refresh' })).toHaveCount(1); await expect(page.getByRole('button', { name: 'Filter' })).toBeVisible(); await expect(page.getByRole('button', { name: 'Add new' })).toBeVisible(); await expect(page.getByRole('button', { name: 'Refresh' })).toBeVisible(); diff --git a/packages/core/client/src/modules/blocks/data-blocks/table-selector/__e2e__/schemaInitializer.test.ts b/packages/core/client/src/modules/blocks/data-blocks/table-selector/__e2e__/schemaInitializer.test.ts index 4da6804303..6cccd9cfde 100644 --- a/packages/core/client/src/modules/blocks/data-blocks/table-selector/__e2e__/schemaInitializer.test.ts +++ b/packages/core/client/src/modules/blocks/data-blocks/table-selector/__e2e__/schemaInitializer.test.ts @@ -90,7 +90,7 @@ test.describe('configure actions column', () => { // 列宽度默认为 100 await expectActionsColumnWidth(100); - await page.getByText('Actions', { exact: true }).hover(); + await page.getByText('Actions', { exact: true }).hover({ force: true }); await page.getByLabel('designer-schema-settings-TableV2.Column-fieldSettings:TableColumn-users').hover(); await page.getByRole('menuitem', { name: 'Column width' }).click(); diff --git a/packages/core/client/src/modules/blocks/data-blocks/table/__e2e__/hideColumn.test.ts b/packages/core/client/src/modules/blocks/data-blocks/table/__e2e__/hideColumn.test.ts index 8a14b3db12..2dded11a76 100644 --- a/packages/core/client/src/modules/blocks/data-blocks/table/__e2e__/hideColumn.test.ts +++ b/packages/core/client/src/modules/blocks/data-blocks/table/__e2e__/hideColumn.test.ts @@ -25,6 +25,7 @@ test.describe('hide column', () => { // 2. Sub table: hide column await page.getByRole('button', { name: 'Role name' }).hover(); + await page.getByRole('menuitem', { name: 'Hide column question-circle' }).waitFor({ state: 'detached' }); await page .getByRole('button', { name: 'designer-schema-settings-TableV2.Column-fieldSettings:TableColumn-roles' }) .hover(); diff --git a/packages/core/client/src/modules/blocks/data-blocks/table/__e2e__/schemaInitializer.test.ts b/packages/core/client/src/modules/blocks/data-blocks/table/__e2e__/schemaInitializer.test.ts index 352afc0fdb..bcabdba6a9 100644 --- a/packages/core/client/src/modules/blocks/data-blocks/table/__e2e__/schemaInitializer.test.ts +++ b/packages/core/client/src/modules/blocks/data-blocks/table/__e2e__/schemaInitializer.test.ts @@ -295,19 +295,19 @@ test.describe('configure actions column', () => { await nocoPage.goto(); // add view & Edit & Delete & Duplicate ------------------------------------------------------------ - await page.getByText('Actions', { exact: true }).hover(); + await page.getByText('Actions', { exact: true }).hover({ force: true }); await page.getByLabel('designer-schema-initializer-TableV2.Column-TableV2.ActionColumnDesigner-').hover(); await page.getByRole('menuitem', { name: 'View' }).click(); - await page.getByText('Actions', { exact: true }).hover(); + await page.getByText('Actions', { exact: true }).hover({ force: true }); await page.getByLabel('designer-schema-initializer-TableV2.Column-TableV2.ActionColumnDesigner-').hover(); await page.getByRole('menuitem', { name: 'Edit' }).click(); - await page.getByText('Actions', { exact: true }).hover(); + await page.getByText('Actions', { exact: true }).hover({ force: true }); await page.getByLabel('designer-schema-initializer-TableV2.Column-TableV2.ActionColumnDesigner-').hover(); await page.getByRole('menuitem', { name: 'Delete' }).click(); - await page.getByText('Actions', { exact: true }).hover(); + await page.getByText('Actions', { exact: true }).hover({ force: true }); await page.getByLabel('designer-schema-initializer-TableV2.Column-TableV2.ActionColumnDesigner-').hover(); await page.getByRole('menuitem', { name: 'Duplicate' }).click(); @@ -330,11 +330,11 @@ test.describe('configure actions column', () => { await expect(page.getByLabel('action-Action.Link-Duplicate-duplicate-t_unp4scqamw9-table-0')).not.toBeVisible(); // add custom action ------------------------------------------------------------ - await page.getByText('Actions', { exact: true }).hover(); + await page.getByText('Actions', { exact: true }).hover({ force: true }); await page.getByLabel('designer-schema-initializer-TableV2.Column-TableV2.ActionColumnDesigner-').hover(); await page.getByRole('menuitem', { name: 'Popup' }).click(); - await page.getByText('Actions', { exact: true }).hover(); + await page.getByText('Actions', { exact: true }).hover({ force: true }); await page.getByLabel('designer-schema-initializer-TableV2.Column-TableV2.ActionColumnDesigner-').hover(); await page.getByRole('menuitem', { name: 'Update record' }).click(); @@ -351,7 +351,7 @@ test.describe('configure actions column', () => { // 列宽度默认为 100 await expect(page.getByRole('columnheader', { name: 'Actions', exact: true })).toHaveJSProperty('offsetWidth', 100); - await page.getByText('Actions', { exact: true }).hover(); + await page.getByText('Actions', { exact: true }).hover({ force: true }); await page.getByLabel('designer-schema-settings-TableV2.Column-TableV2.ActionColumnDesigner-').hover(); await page.getByRole('menuitem', { name: 'Column width' }).click(); diff --git a/packages/core/client/src/modules/blocks/data-blocks/table/__e2e__/schemaInitializer1.test.ts b/packages/core/client/src/modules/blocks/data-blocks/table/__e2e__/schemaInitializer1.test.ts index 05e7877d27..7975f16665 100644 --- a/packages/core/client/src/modules/blocks/data-blocks/table/__e2e__/schemaInitializer1.test.ts +++ b/packages/core/client/src/modules/blocks/data-blocks/table/__e2e__/schemaInitializer1.test.ts @@ -12,6 +12,7 @@ import { T3686, T4005 } from './templatesOfBug'; const deleteButton = async (page: Page, name: string) => { await page.getByRole('button', { name }).hover(); + await page.getByRole('menuitem', { name: 'Delete' }).waitFor({ state: 'detached' }); await page.getByRole('button', { name }).getByLabel('designer-schema-settings-').hover(); await page.getByRole('menuitem', { name: 'Delete' }).click(); await page.getByRole('button', { name: 'OK', exact: true }).click(); @@ -37,7 +38,8 @@ test.describe('where table block can be added', () => { // 添加当前表关系区块 await page.getByLabel('schema-initializer-Grid-popup').hover(); await page.getByRole('menuitem', { name: 'Table right' }).hover(); - await page.getByRole('menuitem', { name: 'Associated records' }).hover(); + await page.getByRole('menuitem', { name: 'childAssociationField' }).waitFor({ state: 'detached' }); + await page.getByRole('menuitem', { name: 'Associated records' }).last().hover(); await page.getByRole('menuitem', { name: 'childAssociationField' }).click(); await page .getByTestId('drawer-Action.Container-childCollection-View record') @@ -46,9 +48,10 @@ test.describe('where table block can be added', () => { await page.getByRole('menuitem', { name: 'childTargetText' }).click(); // 添加父表关系区块 + await page.getByRole('menuitem', { name: 'Table right' }).waitFor({ state: 'detached' }); await page.getByLabel('schema-initializer-Grid-popup').hover(); await page.getByRole('menuitem', { name: 'Table right' }).hover(); - await page.getByRole('menuitem', { name: 'Associated records' }).hover(); + await page.getByRole('menuitem', { name: 'Associated records' }).last().hover(); await page.getByRole('menuitem', { name: 'parentAssociationField' }).click(); await page.getByLabel('schema-initializer-TableV2-table:configureColumns-parentTargetCollection').hover(); await page.getByRole('menuitem', { name: 'parentTargetText' }).click(); diff --git a/packages/core/client/src/modules/blocks/data-blocks/table/__e2e__/schemaSettings.test.ts b/packages/core/client/src/modules/blocks/data-blocks/table/__e2e__/schemaSettings.test.ts index 226d3a271b..f51e03f878 100644 --- a/packages/core/client/src/modules/blocks/data-blocks/table/__e2e__/schemaSettings.test.ts +++ b/packages/core/client/src/modules/blocks/data-blocks/table/__e2e__/schemaSettings.test.ts @@ -87,7 +87,7 @@ test.describe('actions schema settings', () => { // 切换为 dialog await page.getByRole('menuitem', { name: 'Open mode' }).click(); - await page.getByRole('option', { name: 'Dialog' }).click(); + await page.getByRole('option', { name: 'Dialog' }).last().click(); await page.getByRole('button', { name: 'Add new' }).click(); await expect(page.getByTestId('modal-Action.Container-general-Add record')).toBeVisible(); @@ -97,7 +97,7 @@ test.describe('actions schema settings', () => { await page.getByLabel('action-Action-Add new-create-').hover(); await page.getByRole('button', { name: 'designer-schema-settings-Action-Action.Designer-general' }).hover(); await page.getByRole('menuitem', { name: 'Open mode Dialog' }).click(); - await page.getByRole('option', { name: 'Page' }).click(); + await page.getByRole('option', { name: 'Page' }).last().click(); // 点击按钮后会跳转到一个页面 await page.getByLabel('action-Action-Add new-create-').click(); @@ -116,7 +116,7 @@ test.describe('actions schema settings', () => { // 创建一条数据后返回,列表中应该有这条数据 await page.getByTestId('select-single').click(); - await page.getByRole('option', { name: 'option3' }).click(); + await page.getByRole('option', { name: 'option3' }).last().click(); // 提交后会自动返回 await page.getByLabel('action-Action-Submit-submit-').click(); @@ -136,7 +136,7 @@ test.describe('actions schema settings', () => { // 切换为 small await page.getByRole('menuitem', { name: 'Popup size' }).click(); - await page.getByRole('option', { name: 'Small' }).click(); + await page.getByRole('option', { name: 'Small' }).last().click(); await page.getByRole('button', { name: 'Add new' }).click(); const drawerWidth = @@ -148,7 +148,7 @@ test.describe('actions schema settings', () => { // 切换为 large await showMenu(page); await page.getByRole('menuitem', { name: 'Popup size' }).click(); - await page.getByRole('option', { name: 'Large' }).click(); + await page.getByRole('option', { name: 'Large' }).last().click(); await page.getByRole('button', { name: 'Add new' }).click(); const drawerWidth2 = @@ -325,7 +325,7 @@ test.describe('actions schema settings', () => { await page.getByText('Add property').click(); await page.getByLabel('block-item-ArrayCollapse-general').click(); await page.getByTestId('select-linkage-properties').click(); - await page.getByRole('option', { name: 'Disabled' }).click(); + await page.getByRole('option', { name: 'Disabled' }).last().click(); await page.getByRole('button', { name: 'OK', exact: true }).click(); await expect(page.getByLabel('action-Action.Link-View record-view-general-table-0')).toHaveAttribute( @@ -336,10 +336,10 @@ test.describe('actions schema settings', () => { // 设置第二组规则 -------------------------------------------------------------------------- await openLinkageRules(); await page.getByRole('button', { name: 'plus Add linkage rule' }).click(); - await page.locator('.ant-collapse-header').nth(1).getByRole('img', { name: 'right' }).click(); + await page.locator('.ant-collapse-header .ant-collapse-expand-icon').nth(1).click(); // 添加一个条件:ID 等于 1 - await page.getByRole('tabpanel').getByText('Add condition', { exact: true }).click(); + await page.getByRole('tabpanel').getByText('Add condition', { exact: true }).last().click(); await page.getByRole('button', { name: 'Select field' }).click(); await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click(); await page.getByRole('spinbutton').click(); @@ -348,7 +348,7 @@ test.describe('actions schema settings', () => { // action: 使按钮可用 await page.getByRole('tabpanel').getByText('Add property').click(); await page.locator('.ant-select', { hasText: 'action' }).click(); - await page.getByRole('option', { name: 'Enabled' }).click(); + await page.getByRole('option', { name: 'Enabled' }).last().click(); await page.getByRole('button', { name: 'OK', exact: true }).click(); // 后面的 action 会覆盖前面的 @@ -533,7 +533,7 @@ test.describe('actions schema settings', () => { await page.getByLabel('action-Action.Link-View').hover(); await page.getByLabel('designer-schema-settings-Action.Link-actionSettings:view-users').hover(); await page.getByRole('menuitem', { name: 'Open mode Drawer' }).click(); - await page.getByRole('option', { name: 'Page' }).click(); + await page.getByRole('option', { name: 'Page' }).last().click(); // 跳转到子页面后,其内容应该和弹窗中的内容一致 await page.getByLabel('action-Action.Link-View').click(); @@ -706,7 +706,7 @@ test.describe('actions schema settings', () => { .getByRole('button', { name: 'designer-schema-settings-Action.Link-actionSettings:view-roles' }) .hover(); await page.getByRole('menuitem', { name: 'Open mode Drawer' }).click(); - await page.getByRole('option', { name: 'Page' }).click(); + await page.getByRole('option', { name: 'Page' }).last().click(); // 点击按钮跳转到子页面 await page.getByLabel('action-Action.Link-View role-view-roles-table-admin').click(); @@ -955,7 +955,7 @@ test.describe('actions schema settings', () => { await page.getByLabel('action-Action.Link-Add child-').hover(); await page.getByLabel('designer-schema-settings-Action.Link-actionSettings:addChild-treeCollection').hover(); await page.getByRole('menuitem', { name: 'Open mode Drawer' }).click(); - await page.getByRole('option', { name: 'Page' }).click(); + await page.getByRole('option', { name: 'Page' }).last().click(); // open popup with page mode await page.getByLabel('action-Action.Link-Add child-').click(); @@ -994,7 +994,7 @@ test.describe('table column schema settings', () => { // 1. 关系字段下拉框中应该有数据 await page.locator('.nb-sub-table-addNew').click(); await page.getByTestId('select-object-multiple').click(); - await expect(page.getByRole('option', { name: record1.singleLineText, exact: true })).toBeVisible(); + await expect(page.getByRole('option', { name: record1.singleLineText, exact: true }).last()).toBeVisible(); // 2. 为该关系字段设置一个数据范围后,下拉框中应该有一个匹配项 await page.getByRole('button', { name: 'manyToMany1', exact: true }).hover(); @@ -1009,7 +1009,7 @@ test.describe('table column schema settings', () => { await page.reload(); await page.locator('.nb-sub-table-addNew').click(); await page.getByTestId('select-object-multiple').click(); - await expect(page.getByRole('option', { name: record1.singleLineText, exact: true })).toBeVisible(); + await expect(page.getByRole('option', { name: record1.singleLineText, exact: true }).last()).toBeVisible(); }); test('fixed column', async ({ page, mockPage }) => { diff --git a/packages/core/client/src/modules/blocks/filter-blocks/__e2e__/schemaInitializer.test.ts b/packages/core/client/src/modules/blocks/filter-blocks/__e2e__/schemaInitializer.test.ts index ebdc65a7c9..3d76b13799 100644 --- a/packages/core/client/src/modules/blocks/filter-blocks/__e2e__/schemaInitializer.test.ts +++ b/packages/core/client/src/modules/blocks/filter-blocks/__e2e__/schemaInitializer.test.ts @@ -35,7 +35,11 @@ test.describe('where filter block can be added', () => { // 3. 与 Table、Details、List、GridCard 等区块建立连接 const connectByForm = async (name: string) => { + await page + .getByLabel('designer-schema-settings-CardItem-blockSettings:filterForm-users') + .waitFor({ state: 'hidden' }); await page.getByLabel('block-item-CardItem-users-filter-form').hover(); + await page.getByRole('menuitem', { name: 'Connect data blocks right' }).waitFor({ state: 'detached' }); await page.getByLabel('designer-schema-settings-CardItem-blockSettings:filterForm-users').hover(); await page.getByRole('menuitem', { name: 'Connect data blocks right' }).hover(); await page.getByRole('menuitem', { name }).click(); @@ -43,6 +47,7 @@ test.describe('where filter block can be added', () => { const connectByCollapse = async (name: string) => { await page.mouse.move(-500, 0); await page.getByLabel('block-item-CardItem-users-filter-collapse').hover(); + await page.getByRole('menuitem', { name: 'Connect data blocks right' }).waitFor({ state: 'detached' }); await page.getByLabel('designer-schema-settings-CardItem-blockSettings:filterCollapse-users').hover(); await page.getByRole('menuitem', { name: 'Connect data blocks right' }).hover(); await page.getByRole('menuitem', { name }).click(); @@ -150,7 +155,9 @@ test.describe('where filter block can be added', () => { } // 2. 测试用表单筛选其它区块 + await page.getByRole('menuitem', { name: 'Form right' }).waitFor({ state: 'detached' }); await page.getByLabel('schema-initializer-Grid-popup').hover(); + await page.getByRole('menuitem', { name: 'Users' }).waitFor({ state: 'detached' }); await page.getByRole('menuitem', { name: 'Form right' }).hover(); await page.getByRole('menuitem', { name: 'Users' }).click(); await page.getByLabel('schema-initializer-Grid-filterForm:configureFields-users').hover(); diff --git a/packages/core/client/src/modules/blocks/filter-blocks/collapse/__e2e__/schemaSettings.test.ts b/packages/core/client/src/modules/blocks/filter-blocks/collapse/__e2e__/schemaSettings.test.ts index 5bfbfa7818..04b3bf5f91 100644 --- a/packages/core/client/src/modules/blocks/filter-blocks/collapse/__e2e__/schemaSettings.test.ts +++ b/packages/core/client/src/modules/blocks/filter-blocks/collapse/__e2e__/schemaSettings.test.ts @@ -46,7 +46,7 @@ test.describe('collapse schema settings', () => { await page.getByRole('menuitem', { name: 'General' }).click(); // 点击一个选项,进行筛选 - await page.getByRole('button', { name: 'right singleSelect search' }).click(); + await page.getByRole('button', { name: 'collapsed singleSelect search' }).click(); await page.getByLabel('block-item-CardItem-general-filter-collapse').getByText('Option1').click(); // 注意:在本地运行时,由于运行结束后不会清空之前创建的数据,所以在第一次运行之后,下面会报错。如果遇到这种情况,可以先不管 diff --git a/packages/core/client/src/modules/blocks/filter-blocks/form/__e2e__/autoFilterWhenSettingDefaultValue.test.ts b/packages/core/client/src/modules/blocks/filter-blocks/form/__e2e__/autoFilterWhenSettingDefaultValue.test.ts index 605c7e64a9..0a420f3da1 100644 --- a/packages/core/client/src/modules/blocks/filter-blocks/form/__e2e__/autoFilterWhenSettingDefaultValue.test.ts +++ b/packages/core/client/src/modules/blocks/filter-blocks/form/__e2e__/autoFilterWhenSettingDefaultValue.test.ts @@ -126,7 +126,7 @@ test.describe('filter form', () => { y: 10, }, }); - await expect(page.getByLabel('block-item-CardItem-users-table').getByText('No data')).toBeVisible(); + await expect(page.getByLabel('block-item-CardItem-users-table').getByText('No data').last()).toBeVisible(); // 4. 此时点击 Reset 按钮,应该只显示一条数据,因为会把 nickname 的值重置为 {{$user.nickname}} await page.getByLabel('action-Action-Reset-users-').click({ @@ -152,6 +152,6 @@ test.describe('filter form', () => { y: 10, }, }); - await expect(page.getByLabel('block-item-CardItem-users-table').getByText('No data')).toBeVisible(); + await expect(page.getByLabel('block-item-CardItem-users-table').getByText('No data').last()).toBeVisible(); }); }); diff --git a/packages/core/client/src/modules/fields/__e2e__/component/AssociationSelect/dataScope.test.ts b/packages/core/client/src/modules/fields/__e2e__/component/AssociationSelect/dataScope.test.ts index eda935801a..cf9444da71 100644 --- a/packages/core/client/src/modules/fields/__e2e__/component/AssociationSelect/dataScope.test.ts +++ b/packages/core/client/src/modules/fields/__e2e__/component/AssociationSelect/dataScope.test.ts @@ -53,7 +53,7 @@ test.describe('AssociationSelect ', () => { .getByLabel('block-item-CollectionField-test-form-test.b-b') .getByTestId('select-object-multiple') .click(); - await expect(page.getByText('No data')).toBeVisible(); + await expect(page.getByText('No data').last()).toBeVisible(); // 2. 当给字段 a 选择一个值后,字段 b 的下拉列表中会显示符合条件的值 await page diff --git a/packages/core/client/src/modules/fields/component/Select/__e2e__/selectDataScope.test.ts b/packages/core/client/src/modules/fields/component/Select/__e2e__/selectDataScope.test.ts index 368503878c..341e3be388 100644 --- a/packages/core/client/src/modules/fields/component/Select/__e2e__/selectDataScope.test.ts +++ b/packages/core/client/src/modules/fields/component/Select/__e2e__/selectDataScope.test.ts @@ -34,6 +34,6 @@ test.describe('data scope of component Select', () => { await page.getByTestId('select-object-multiple').click(); await expect(page.getByRole('option', { name: 'admin' })).toBeHidden(); await expect(page.getByRole('option', { name: 'member' })).toBeHidden(); - await expect(page.getByText('No data')).toBeVisible(); + await expect(page.getByText('No data').last()).toBeVisible(); }); }); diff --git a/packages/core/client/src/modules/page/__e2e__/schemaSettings.test.ts b/packages/core/client/src/modules/page/__e2e__/schemaSettings.test.ts index ed8c0a7879..8c43d6fc56 100644 --- a/packages/core/client/src/modules/page/__e2e__/schemaSettings.test.ts +++ b/packages/core/client/src/modules/page/__e2e__/schemaSettings.test.ts @@ -63,9 +63,11 @@ test.describe('page schema settings', () => { await page.getByLabel('block-item-Input-Tab name').getByRole('textbox').fill('new tab'); // 选择一个图标 await page.getByRole('button', { name: 'Select icon' }).click(); + await expect(page.getByLabel('account-book').locator('svg')).toHaveCount(1); await page.getByLabel('account-book').locator('svg').click(); await page.getByRole('button', { name: 'OK', exact: true }).click(); await expect(page.getByText('new tab')).toBeVisible(); + await expect(page.getByLabel('account-book').locator('svg')).toHaveCount(1); await expect(page.getByLabel('account-book').locator('svg')).toBeVisible(); }); }); @@ -92,10 +94,12 @@ test.describe('tabs schema settings', () => { await page.getByLabel('block-item-Input-Tab name').getByRole('textbox').click(); await page.getByLabel('block-item-Input-Tab name').getByRole('textbox').fill('new name of page tab'); await page.getByRole('button', { name: 'Select icon' }).click(); + await expect(page.getByLabel('account-book').locator('svg')).toHaveCount(1); await page.getByLabel('account-book').locator('svg').click(); await page.getByRole('button', { name: 'OK', exact: true }).click(); await expect(page.getByText('new name of page tab')).toBeVisible(); + await expect(page.getByLabel('account-book').locator('svg')).toHaveCount(1); await expect(page.getByLabel('account-book').locator('svg')).toBeVisible(); }); diff --git a/packages/core/client/src/modules/popup/__e2e__/schemaInitializer.test.ts b/packages/core/client/src/modules/popup/__e2e__/schemaInitializer.test.ts index 6ec7d36c03..d684443399 100644 --- a/packages/core/client/src/modules/popup/__e2e__/schemaInitializer.test.ts +++ b/packages/core/client/src/modules/popup/__e2e__/schemaInitializer.test.ts @@ -55,7 +55,7 @@ test.describe('add blocks to the popup', () => { // 通过 Association records 创建一个关系区块 await page.getByLabel('schema-initializer-Grid-popup').hover(); await page.getByRole('menuitem', { name: 'Details right' }).hover(); - await page.getByRole('menuitem', { name: 'Associated records' }).hover(); + await page.getByRole('menuitem', { name: 'Associated records' }).last().hover(); await page.getByRole('menuitem', { name: 'Roles' }).click(); await page.getByLabel('schema-initializer-Grid-details:configureFields-roles').hover(); await page.getByRole('menuitem', { name: 'Role UID' }).click(); @@ -87,7 +87,7 @@ test.describe('add blocks to the popup', () => { // 通过 Association records 创建关系区块 await page.getByLabel('schema-initializer-Grid-popup').hover(); await page.getByRole('menuitem', { name: 'Table right' }).hover(); - await page.getByRole('menuitem', { name: 'Associated records' }).hover(); + await page.getByRole('menuitem', { name: 'Associated records' }).last().hover(); await page.getByRole('menuitem', { name: 'manyToMany' }).click(); await page.mouse.move(-300, 0); await page @@ -135,7 +135,7 @@ test.describe('add blocks to the popup', () => { // 通过 Association records 创建一个关系区块 await page.getByLabel('schema-initializer-Grid-popup').hover(); await page.getByRole('menuitem', { name: 'Table right' }).hover(); - await page.getByRole('menuitem', { name: 'Associated records' }).hover(); + await page.getByRole('menuitem', { name: 'Associated records' }).last().hover(); await page.getByRole('menuitem', { name: 'Roles' }).click(); await page .getByTestId('drawer-Action.Container-users-View record') diff --git a/packages/core/client/src/modules/popup/__e2e__/schemaInitializer1.test.ts b/packages/core/client/src/modules/popup/__e2e__/schemaInitializer1.test.ts index 7d9b481842..5efa1553bc 100644 --- a/packages/core/client/src/modules/popup/__e2e__/schemaInitializer1.test.ts +++ b/packages/core/client/src/modules/popup/__e2e__/schemaInitializer1.test.ts @@ -124,10 +124,13 @@ test.describe('where to open a popup and what can be added to it', () => { async function addBlock(names: string[]) { await page.getByLabel('schema-initializer-Grid-popup').hover(); + await page.waitForTimeout(500); for (let i = 0; i < names.length - 1; i++) { const name = names[i]; await page.getByRole('menuitem', { name }).hover(); + await page.waitForTimeout(500); } + await expect(page.getByRole('menuitem', { name: names[names.length - 1] })).toHaveCount(1); await page.getByRole('menuitem', { name: names[names.length - 1] }).click(); await page.mouse.move(300, 0); } @@ -206,13 +209,14 @@ test.describe('where to open a popup and what can be added to it', () => { await page.getByLabel('schema-initializer-Grid-popup:common:addBlock-general').hover(); await page.getByRole('menuitem', { name: 'Details' }).hover(); - await page.getByRole('menuitem', { name: 'Associated records' }).hover(); + await page.getByRole('menuitem', { name: 'Associated records' }).last().hover(); await page.getByRole('menuitem', { name: 'Many to one' }).click(); await page.mouse.move(300, 0); await expect(page.getByLabel('block-item-CardItem-users-')).toBeVisible(); await page.getByLabel('schema-initializer-Grid-popup:common:addBlock-general').hover(); await page.getByRole('menuitem', { name: 'Table right' }).hover(); + await expect(page.getByRole('menuitem', { name: 'Associated records' })).toHaveCount(1); await page.getByRole('menuitem', { name: 'Associated records' }).hover(); await page.getByRole('menuitem', { name: 'One to many' }).click(); await page.mouse.move(300, 0); @@ -272,13 +276,14 @@ test.describe('where to open a popup and what can be added to it', () => { await page.getByLabel('schema-initializer-Grid-popup:common:addBlock-general').hover(); await page.getByRole('menuitem', { name: 'Details' }).hover(); - await page.getByRole('menuitem', { name: 'Associated records' }).hover(); + await page.getByRole('menuitem', { name: 'Associated records' }).last().hover(); await page.getByRole('menuitem', { name: 'Many to one' }).click(); await page.mouse.move(300, 0); await expect(page.getByLabel('block-item-CardItem-users-')).toBeVisible(); await page.getByLabel('schema-initializer-Grid-popup:common:addBlock-general').hover(); await page.getByRole('menuitem', { name: 'Table right' }).hover(); + await expect(page.getByRole('menuitem', { name: 'Associated records' })).toHaveCount(1); await page.getByRole('menuitem', { name: 'Associated records' }).hover(); await page.getByRole('menuitem', { name: 'One to many' }).click(); await page.mouse.move(300, 0); diff --git a/packages/core/client/src/modules/popup/__e2e__/schemaSettings.test.ts b/packages/core/client/src/modules/popup/__e2e__/schemaSettings.test.ts index 7da9ed5c43..23c5bbfa7c 100644 --- a/packages/core/client/src/modules/popup/__e2e__/schemaSettings.test.ts +++ b/packages/core/client/src/modules/popup/__e2e__/schemaSettings.test.ts @@ -44,6 +44,7 @@ test.describe('tabs schema settings', () => { await page.getByRole('button', { name: 'OK', exact: true }).click(); await expect(page.getByText('Add new with new name')).toBeVisible(); + await expect(page.getByLabel('account-book').locator('svg')).toHaveCount(1); await expect(page.getByLabel('account-book').locator('svg')).toBeVisible(); }); diff --git a/packages/core/client/src/modules/variable/__e2e__/parentObject.test.ts b/packages/core/client/src/modules/variable/__e2e__/parentObject.test.ts index 9e040459b4..d8c825b7ca 100644 --- a/packages/core/client/src/modules/variable/__e2e__/parentObject.test.ts +++ b/packages/core/client/src/modules/variable/__e2e__/parentObject.test.ts @@ -55,6 +55,7 @@ test.describe('variable: parent object', () => { // 1. Use "Current form" and "Parent object" variables in nested subforms and subtables await page.getByLabel('block-item-CollectionField-collection1-form-collection1.m2m1-m2m1').hover(); + await page.getByRole('menuitem', { name: 'Linkage rules' }).waitFor({ state: 'detached' }); await page .getByLabel('designer-schema-settings-CollectionField-fieldSettings:FormItem-collection1-collection1.m2m1', { exact: true, diff --git a/packages/core/client/src/pm/PluginManager.tsx b/packages/core/client/src/pm/PluginManager.tsx index 76365d1537..f1a1de64f0 100644 --- a/packages/core/client/src/pm/PluginManager.tsx +++ b/packages/core/client/src/pm/PluginManager.tsx @@ -10,7 +10,7 @@ export * from './PluginManagerLink'; import { PageHeader } from '@ant-design/pro-layout'; import { useDebounce } from 'ahooks'; -import { Button, Col, Divider, Input, List, Modal, Result, Row, Space, Spin, Table, Tabs } from 'antd'; +import { Button, Col, Divider, Input, List, Modal, Result, Row, Space, Spin, Table, Tabs, TableProps } from 'antd'; import _ from 'lodash'; import React, { useEffect, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; @@ -145,7 +145,7 @@ function BulkEnableButton({ plugins = [] }) { width: 300, ellipsis: true, }, - ]} + ] as TableProps['columns']} dataSource={items} /> diff --git a/packages/core/client/src/schema-component/antd/action/hooks/useSetAriaLabelForDrawer.ts b/packages/core/client/src/schema-component/antd/action/hooks/useSetAriaLabelForDrawer.ts index 0846c17817..4b28f6509d 100644 --- a/packages/core/client/src/schema-component/antd/action/hooks/useSetAriaLabelForDrawer.ts +++ b/packages/core/client/src/schema-component/antd/action/hooks/useSetAriaLabelForDrawer.ts @@ -18,7 +18,7 @@ export function useSetAriaLabelForDrawer(visible: boolean) { if (visible) { // 因为 Action 是点击后渲染内容,所以需要延迟一下 setTimeout(() => { - const wrappers = [...document.querySelectorAll('.ant-drawer-wrapper-body')]; + const wrappers = [...document.querySelectorAll('.ant-drawer-body')]; const masks = [...document.querySelectorAll('.ant-drawer-mask')]; // 如果存在多个 mask,最后一个 mask 为当前打开的 mask;wrapper 也是同理 const currentMask = masks[masks.length - 1]; diff --git a/packages/core/client/src/schema-component/antd/appends-tree-select/AppendsTreeSelect.tsx b/packages/core/client/src/schema-component/antd/appends-tree-select/AppendsTreeSelect.tsx index e62aea2aac..e372f451f9 100644 --- a/packages/core/client/src/schema-component/antd/appends-tree-select/AppendsTreeSelect.tsx +++ b/packages/core/client/src/schema-component/antd/appends-tree-select/AppendsTreeSelect.tsx @@ -7,12 +7,13 @@ * For more information, please refer to: https://www.nocobase.com/agreement. */ -import { CloseCircleFilled } from '@ant-design/icons'; +import { CloseCircleFilled, DownOutlined } from '@ant-design/icons'; import { Tag, TreeSelect } from 'antd'; -import type { DefaultOptionType, TreeSelectProps } from 'rc-tree-select/es/TreeSelect'; +import type { TreeSelectProps } from 'rc-tree-select/es/TreeSelect'; import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { CollectionFieldOptions_deprecated, parseCollectionName, useApp, useCompile } from '../../..'; +import { DefaultOptionType } from 'antd/es/select'; export type AppendsTreeSelectProps = { value: string[] | string; @@ -261,6 +262,7 @@ export const AppendsTreeSelect: React.FC} /> ); }; diff --git a/packages/core/client/src/schema-component/antd/cascader/Cascader.tsx b/packages/core/client/src/schema-component/antd/cascader/Cascader.tsx index addae97746..055e169f5c 100644 --- a/packages/core/client/src/schema-component/antd/cascader/Cascader.tsx +++ b/packages/core/client/src/schema-component/antd/cascader/Cascader.tsx @@ -116,6 +116,7 @@ export const Cascader = withDynamicSchemaProps( { expect(container).toMatchInlineSnapshot(`