(null);
@@ -28,7 +28,7 @@ export const FilterAction = observer(
return (
-
-
+
);
},
diff --git a/packages/core/client/src/schema-component/antd/filter/__tests__/filter.test.tsx b/packages/core/client/src/schema-component/antd/filter/__tests__/filter.test.tsx
index 9fc21997b2..2a83b382f7 100644
--- a/packages/core/client/src/schema-component/antd/filter/__tests__/filter.test.tsx
+++ b/packages/core/client/src/schema-component/antd/filter/__tests__/filter.test.tsx
@@ -34,6 +34,11 @@ describe('Filter', () => {
// 输入框中的默认值
expect(inputs[0]).toHaveValue('aa');
expect(inputs[1]).toHaveValue('aaa');
+
+ // 点击下拉框中的选项,Popover 不应该关闭。详见:https://nocobase.height.app/T-1508
+ await userEvent.click(screen.getByText(/any/i));
+ await userEvent.click(screen.getByText(/all/i));
+ expect(tooltip).toBeInTheDocument();
});
it('default value', () => {
@@ -95,6 +100,11 @@ describe('Filter', () => {
// 输入框中的默认值
expect(inputs[0]).toHaveValue('');
expect(inputs[1]).toHaveValue('aaa');
+
+ // 点击下拉框中的选项,Popover 不应该关闭。详见:https://nocobase.height.app/T-1508
+ await userEvent.click(screen.getByText(/any/i));
+ await userEvent.click(screen.getByText(/all/i));
+ expect(tooltip).toBeInTheDocument();
});
it('dynamic options', async () => {
diff --git a/packages/core/client/src/schema-component/antd/icon-picker/IconPicker.tsx b/packages/core/client/src/schema-component/antd/icon-picker/IconPicker.tsx
index f7546135ca..5ff332ec87 100644
--- a/packages/core/client/src/schema-component/antd/icon-picker/IconPicker.tsx
+++ b/packages/core/client/src/schema-component/antd/icon-picker/IconPicker.tsx
@@ -2,11 +2,11 @@ import { CloseOutlined, LoadingOutlined } from '@ant-design/icons';
import { useFormLayout } from '@formily/antd-v5';
import { connect, mapProps, mapReadPretty } from '@formily/react';
import { isValid } from '@formily/shared';
-import { Button, Input, Space } from 'antd';
+import { Button, Space } from 'antd';
import React, { useState } from 'react';
import { useTranslation } from 'react-i18next';
import { Icon, hasIcon, icons } from '../../../icon';
-import { PopoverWithStopPropagation } from '../popover';
+import { StablePopover } from '../popover';
function IconField(props: any) {
const layout = useFormLayout();
@@ -16,7 +16,7 @@ function IconField(props: any) {
return (
- {
@@ -47,7 +47,7 @@ function IconField(props: any) {
-
+
{value && !disabled && (
-
+
))}
-
+
))}
diff --git a/packages/plugins/@nocobase/plugin-collection-manager/src/client/__e2e__/schema-settings/form-item/form-creation/choices.test.ts b/packages/plugins/@nocobase/plugin-collection-manager/src/client/__e2e__/schema-settings/form-item/form-creation/choices.test.ts
index f194bb2ad1..dd7c74c3c0 100644
--- a/packages/plugins/@nocobase/plugin-collection-manager/src/client/__e2e__/schema-settings/form-item/form-creation/choices.test.ts
+++ b/packages/plugins/@nocobase/plugin-collection-manager/src/client/__e2e__/schema-settings/form-item/form-creation/choices.test.ts
@@ -132,7 +132,7 @@ test.describe('china region', () => {
showMenu: () => showMenu(page, 'chinaRegion'),
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
inputConstantValue: async () => {
- await page.getByLabel('block-item-VariableInput-').getByLabel('Search').click();
+ await page.getByLabel('block-item-VariableInput-').click();
await page.getByRole('menuitemcheckbox', { name: '北京市' }).click();
await page.getByRole('menuitemcheckbox', { name: '市辖区' }).click();
await page.getByRole('menuitemcheckbox', { name: '东城区' }).click();
@@ -154,7 +154,7 @@ test.describe('china region', () => {
expectEditable: async () => {
await page
.getByLabel('block-item-CollectionField-general-form-general.chinaRegion-chinaRegion')
- .getByRole('combobox', { name: 'Search' })
+ .locator('.ant-select')
.click();
await page.getByRole('menuitemcheckbox', { name: '北京市' }).click();
await page.getByRole('menuitemcheckbox', { name: '市辖区' }).click();
@@ -164,14 +164,16 @@ test.describe('china region', () => {
await expect(
page
.getByLabel('block-item-CollectionField-general-form-general.chinaRegion-chinaRegion')
- .getByRole('combobox', { name: 'Search' }),
+ .locator('.ant-select')
+ .getByRole('combobox'),
).toBeDisabled();
},
expectEasyReading: async () => {
await expect(
page
.getByLabel('block-item-CollectionField-general-form-general.chinaRegion-chinaRegion')
- .getByRole('combobox', { name: 'Search' }),
+ .locator('.ant-select')
+ .getByRole('combobox'),
).not.toBeVisible();
await expect(
page.getByLabel('block-item-CollectionField-general-form-general.chinaRegion-chinaRegion'),
@@ -311,7 +313,7 @@ test.describe('single select', () => {
showMenu: () => showMenu(page, 'singleSelect'),
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
inputConstantValue: async () => {
- await page.getByLabel('block-item-VariableInput-').getByLabel('Search').click();
+ await page.getByLabel('block-item-VariableInput-').click();
await page.getByRole('option', { name: 'Option1' }).click();
},
expectConstantValue: async () => {
diff --git a/packages/plugins/@nocobase/plugin-collection-manager/src/client/__e2e__/schema-settings/form-item/form-creation/relation.test.ts b/packages/plugins/@nocobase/plugin-collection-manager/src/client/__e2e__/schema-settings/form-item/form-creation/relation.test.ts
index c222ccbd4d..2ad6b8669c 100644
--- a/packages/plugins/@nocobase/plugin-collection-manager/src/client/__e2e__/schema-settings/form-item/form-creation/relation.test.ts
+++ b/packages/plugins/@nocobase/plugin-collection-manager/src/client/__e2e__/schema-settings/form-item/form-creation/relation.test.ts
@@ -100,7 +100,7 @@ test.describe('many to many', () => {
// 配置
await page.getByRole('button', { name: 'Add sort field' }).click();
- await page.getByTestId('select-single').getByLabel('Search').click();
+ await page.getByTestId('select-single').click();
await page.getByRole('option', { name: 'ID', exact: true }).click();
await page.getByText('DESC', { exact: true }).click();
await page.getByRole('button', { name: 'OK', exact: true }).click();
@@ -282,7 +282,7 @@ test.describe('many to one', () => {
// 数据应该被过滤了
await page
.getByLabel('block-item-CollectionField-general-form-general.manyToOne-manyToOne')
- .getByLabel('Search')
+ .getByTestId('select-object-single')
.click();
await expect(page.getByRole('option', { name: String(records[0].id), exact: true })).toBeVisible();
await expect(page.getByRole('option')).toHaveCount(1);
@@ -486,7 +486,7 @@ test.describe('one to one (belongs to)', () => {
// 数据应该被过滤了
await page
.getByLabel('block-item-CollectionField-general-form-general.oneToOneBelongsTo-oneToOneBelongsTo')
- .getByLabel('Search')
+ .getByTestId('select-object-single')
.click();
await expect(page.getByRole('option', { name: String(records[0].id), exact: true })).toBeVisible();
await expect(page.getByRole('option')).toHaveCount(1);
@@ -586,7 +586,7 @@ test.describe('one to one (has one)', () => {
// 数据应该被过滤了
await page
.getByLabel('block-item-CollectionField-general-form-general.oneToOneHasOne-oneToOneHasOne')
- .getByLabel('Search')
+ .getByTestId('select-object-single')
.click();
// 默认只显示 id 为 1 的数据,因为设置了只过滤 id 为 3 的数据,所以这里的下拉列表应该为空
await expect(page.getByRole('option')).toHaveCount(0);
diff --git a/packages/plugins/@nocobase/plugin-collection-manager/src/client/__e2e__/schema-settings/form-item/form-edit/choices.test.ts b/packages/plugins/@nocobase/plugin-collection-manager/src/client/__e2e__/schema-settings/form-item/form-edit/choices.test.ts
index ad376e9765..e4a0ff5be9 100644
--- a/packages/plugins/@nocobase/plugin-collection-manager/src/client/__e2e__/schema-settings/form-item/form-edit/choices.test.ts
+++ b/packages/plugins/@nocobase/plugin-collection-manager/src/client/__e2e__/schema-settings/form-item/form-edit/choices.test.ts
@@ -98,7 +98,7 @@ test.describe('china region', () => {
expectEditable: async () => {
await page
.getByLabel('block-item-CollectionField-general-form-general.chinaRegion-chinaRegion')
- .getByRole('combobox', { name: 'Search' })
+ .locator('.ant-select')
.click();
await page.getByRole('menuitemcheckbox', { name: '北京市' }).click();
await page.getByRole('menuitemcheckbox', { name: '市辖区' }).click();
@@ -108,14 +108,16 @@ test.describe('china region', () => {
await expect(
page
.getByLabel('block-item-CollectionField-general-form-general.chinaRegion-chinaRegion')
- .getByRole('combobox', { name: 'Search' }),
+ .locator('.ant-select')
+ .getByRole('combobox'),
).toBeDisabled();
},
expectEasyReading: async () => {
await expect(
page
.getByLabel('block-item-CollectionField-general-form-general.chinaRegion-chinaRegion')
- .getByRole('combobox', { name: 'Search' }),
+ .locator('.ant-select')
+ .getByRole('combobox'),
).not.toBeVisible();
await expect(
page.getByLabel('block-item-CollectionField-general-form-general.chinaRegion-chinaRegion'),
diff --git a/packages/plugins/@nocobase/plugin-collection-manager/src/client/__e2e__/schema-settings/form-item/form-edit/relation.test.ts b/packages/plugins/@nocobase/plugin-collection-manager/src/client/__e2e__/schema-settings/form-item/form-edit/relation.test.ts
index 7e1e48bad0..9b867b1301 100644
--- a/packages/plugins/@nocobase/plugin-collection-manager/src/client/__e2e__/schema-settings/form-item/form-edit/relation.test.ts
+++ b/packages/plugins/@nocobase/plugin-collection-manager/src/client/__e2e__/schema-settings/form-item/form-edit/relation.test.ts
@@ -78,7 +78,7 @@ test.describe('many to many', () => {
// 配置
await page.getByRole('button', { name: 'Add sort field' }).click();
- await page.getByTestId('select-single').getByLabel('Search').click();
+ await page.getByTestId('select-single').click();
await page.getByRole('option', { name: 'ID', exact: true }).click();
await page.getByText('DESC', { exact: true }).click();
await page.getByRole('button', { name: 'OK', exact: true }).click();
diff --git a/packages/plugins/@nocobase/plugin-gantt/src/client/__e2e__/schemaSettings.test.ts b/packages/plugins/@nocobase/plugin-gantt/src/client/__e2e__/schemaSettings.test.ts
index 19ae0226a4..4ebb937f45 100644
--- a/packages/plugins/@nocobase/plugin-gantt/src/client/__e2e__/schemaSettings.test.ts
+++ b/packages/plugins/@nocobase/plugin-gantt/src/client/__e2e__/schemaSettings.test.ts
@@ -1,6 +1,6 @@
import { expect, test } from '@nocobase/test/client';
-import { oneEmptyGantt } from './utils';
import { getYmd } from '../helpers/other-helper';
+import { oneEmptyGantt } from './utils';
const mockData = {
singleLineText: 'within apropos leaker whoever how',
singleLineText2: 'the inasmuch unwelcome gah hm cleverly muscle worriedly lazily',
@@ -21,7 +21,7 @@ test.describe('configure params in gantt block', () => {
await page.getByLabel('designer-schema-settings-CardItem-Gantt.Designer-general').hover();
await page.getByRole('menuitem', { name: 'Set the data scope' }).click();
await page.getByText('Add condition', { exact: true }).click();
- await page.getByTestId('select-filter-field').getByLabel('Search').click();
+ await page.getByTestId('select-filter-field').click();
await page.getByTitle('ID').getByText('ID').click();
await page.getByRole('spinbutton').fill('1');
const [request] = await Promise.all([
diff --git a/packages/plugins/@nocobase/plugin-graph-collection-manager/src/client/components/Entity.tsx b/packages/plugins/@nocobase/plugin-graph-collection-manager/src/client/components/Entity.tsx
index 054626c66c..0087142ef3 100644
--- a/packages/plugins/@nocobase/plugin-graph-collection-manager/src/client/components/Entity.tsx
+++ b/packages/plugins/@nocobase/plugin-graph-collection-manager/src/client/components/Entity.tsx
@@ -5,10 +5,10 @@ import { uid } from '@formily/shared';
import {
CollectionCategroriesContext,
CollectionProvider,
- PopoverWithStopPropagation,
SchemaComponent,
SchemaComponentProvider,
Select,
+ StablePopover,
collection,
useCollectionManager,
useCompile,
@@ -33,8 +33,8 @@ import { CollectionNodeProvder } from './CollectionNodeProvder';
import { ConnectAssociationAction } from './ConnectAssociationAction';
import { ConnectChildAction } from './ConnectChildAction';
import { ConnectParentAction } from './ConnectParentAction';
-import { EditCollectionAction } from './EditCollectionAction';
import { DeleteCollectionAction } from './DeleteCollectionAction';
+import { EditCollectionAction } from './EditCollectionAction';
import { EditFieldAction } from './EditFieldAction';
import { FieldSummary } from './FieldSummary';
import { OverrideFieldAction } from './OverrideFieldAction';
@@ -257,7 +257,7 @@ const PopoverContent = React.forwardRef((props: any, ref) => {
}}
onMouseLeave={() => setIsHovered(false)}
>
-