From e3d8a95809c68bdf1956847ae77aefe6bfc2c9f9 Mon Sep 17 00:00:00 2001 From: Zeke Zhang <958414905@qq.com> Date: Tue, 26 Mar 2024 11:42:46 +0800 Subject: [PATCH] =?UTF-8?q?fix(associationBlock):=20fix=20association=20bl?= =?UTF-8?q?ocks=20for=20parent=20collection=20f=E2=80=A6=20(#3813)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(associationBlock): fix association blocks for parent collection fields * test: add e2e --- .../hooks/useDataBlockSourceId.tsx | 17 +- .../table/__e2e__/schemaInitializer.test.ts | 41 ++- .../table/__e2e__/templatesOfBug.ts | 259 ++++++++++++++++++ packages/core/test/src/e2e/e2eUtils.ts | 5 + 4 files changed, 317 insertions(+), 5 deletions(-) diff --git a/packages/core/client/src/block-provider/hooks/useDataBlockSourceId.tsx b/packages/core/client/src/block-provider/hooks/useDataBlockSourceId.tsx index 755694776f..b7efefeff6 100644 --- a/packages/core/client/src/block-provider/hooks/useDataBlockSourceId.tsx +++ b/packages/core/client/src/block-provider/hooks/useDataBlockSourceId.tsx @@ -1,4 +1,10 @@ -import { useCollection, useCollectionManager, useCollectionParentRecordData, useCollectionRecordData } from '../..'; +import { + InheritanceCollectionMixin, + useCollection, + useCollectionManager, + useCollectionParentRecordData, + useCollectionRecordData, +} from '../..'; /** * 注意:这里有一个需要更改 schema 才能解决的问题,就是在获取 sourceId 的时候无法确定(在关系字段和当前表同表时) @@ -11,14 +17,17 @@ export const useDataBlockSourceId = ({ association }: { association: string }) = const recordData = useCollectionRecordData(); const parentRecordData = useCollectionParentRecordData(); const cm = useCollectionManager(); - const collectionOutsideBlock = useCollection(); + const collectionOutsideBlock = useCollection(); if (!association) return; const associationField = cm.getCollectionField(association); - const associationCollection = cm.getCollection(associationField.collectionName); + const associationCollection = cm.getCollection(associationField.collectionName); - if (collectionOutsideBlock.name === associationCollection.name) { + if ( + collectionOutsideBlock.name === associationCollection.name || + collectionOutsideBlock.getParentCollectionsName?.().includes(associationCollection.name) + ) { return recordData?.[ associationField.sourceKey || associationCollection.filterTargetKey || 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 6cd1128463..157dbdd011 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 @@ -1,4 +1,5 @@ import { createBlockInPage, expect, oneEmptyTable, test } from '@nocobase/test/e2e'; +import { T3686 } from './templatesOfBug'; test.describe('where table block can be added', () => { test('page', async ({ page, mockPage }) => { @@ -9,7 +10,45 @@ test.describe('where table block can be added', () => { await expect(page.getByLabel('block-item-CardItem-users-table')).toBeVisible(); }); - test('popup', async () => {}); + test('popup', async ({ page, mockPage, mockRecord }) => { + await mockPage(T3686).goto(); + await mockRecord('parentCollection'); + const childRecord = await mockRecord('childCollection'); + + // 打开弹窗 + await page.getByLabel('action-Action.Link-View').click(); + + // 添加当前表关系区块 + await page.getByLabel('schema-initializer-Grid-popup').hover(); + await page.getByRole('menuitem', { name: 'table Table right' }).hover(); + await page.getByRole('menuitem', { name: 'childAssociationField ->' }).click(); + await page + .getByTestId('drawer-Action.Container-childCollection-View record') + .getByLabel('schema-initializer-TableV2-') + .hover(); + await page.getByRole('menuitem', { name: 'childTargetText' }).click(); + + // 添加父表关系区块 + await page.getByLabel('schema-initializer-Grid-popup').hover(); + await page.getByRole('menuitem', { name: 'table Table right' }).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(); + + // 普通关系区块应该显示正常 + await expect( + page + .getByLabel('block-item-CardItem-childTargetCollection-table') + .getByText(childRecord.childAssociationField[0].childTargetText), + ).toBeVisible(); + + // 父表关系区块应该显示正常 + await expect( + page + .getByLabel('block-item-CardItem-parentTargetCollection-table') + .getByText(childRecord.parentAssociationField[0].parentTargetText), + ).toBeVisible(); + }); }); test.describe('configure actions', () => { diff --git a/packages/core/client/src/modules/blocks/data-blocks/table/__e2e__/templatesOfBug.ts b/packages/core/client/src/modules/blocks/data-blocks/table/__e2e__/templatesOfBug.ts index 0e544064fa..e13a50b0f5 100644 --- a/packages/core/client/src/modules/blocks/data-blocks/table/__e2e__/templatesOfBug.ts +++ b/packages/core/client/src/modules/blocks/data-blocks/table/__e2e__/templatesOfBug.ts @@ -1,3 +1,5 @@ +import { PageConfig } from '@nocobase/test/e2e'; + export const T2183 = { pageSchema: { _isJSONSchemaObject: true, @@ -670,3 +672,260 @@ export const T2187 = { 'x-index': 1, }, }; + +export const T3686: PageConfig = { + collections: [ + { + name: 'parentTargetCollection', + fields: [ + { + name: 'parentTargetText', + interface: 'input', + }, + ], + }, + { + name: 'childTargetCollection', + fields: [ + { + name: 'childTargetText', + interface: 'input', + }, + ], + }, + { + name: 'childCollection', + inherits: ['parentCollection'], + fields: [ + { + name: 'childAssociationField', + interface: 'm2m', + target: 'childTargetCollection', + }, + ], + }, + { + name: 'parentCollection', + fields: [ + { + name: 'parentAssociationField', + interface: 'm2m', + target: 'parentTargetCollection', + }, + ], + }, + ], + pageSchema: { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-component': 'Page', + properties: { + fa2wzem9pud: { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-component': 'Grid', + 'x-initializer': 'page:addBlock', + properties: { + '14kr5bu1min': { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-component': 'Grid.Row', + properties: { + uc0jyubx2p3: { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-component': 'Grid.Col', + properties: { + k22vt5rvlf8: { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-decorator': 'TableBlockProvider', + 'x-acl-action': 'childCollection:list', + 'x-use-decorator-props': 'useTableBlockDecoratorProps', + 'x-decorator-props': { + collection: 'childCollection', + dataSource: 'main', + action: 'list', + params: { + pageSize: 20, + }, + rowKey: 'id', + showIndex: true, + dragSort: false, + }, + 'x-toolbar': 'BlockSchemaToolbar', + 'x-settings': 'blockSettings:table', + 'x-component': 'CardItem', + 'x-filter-targets': [], + properties: { + actions: { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-initializer': 'table:configureActions', + 'x-component': 'ActionBar', + 'x-component-props': { + style: { + marginBottom: 'var(--nb-spacing)', + }, + }, + 'x-uid': '42xfns3215b', + 'x-async': false, + 'x-index': 1, + }, + mv0fpgnz9x4: { + _isJSONSchemaObject: true, + version: '2.0', + type: 'array', + 'x-initializer': 'table:configureColumns', + 'x-component': 'TableV2', + 'x-use-component-props': 'useTableBlockProps', + 'x-component-props': { + rowKey: 'id', + rowSelection: { + type: 'checkbox', + }, + }, + properties: { + actions: { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + title: '{{ t("Actions") }}', + 'x-action-column': 'actions', + 'x-decorator': 'TableV2.Column.ActionBar', + 'x-component': 'TableV2.Column', + 'x-designer': 'TableV2.ActionColumnDesigner', + 'x-initializer': 'table:configureItemActions', + properties: { + '4pr5w722wko': { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-decorator': 'DndContext', + 'x-component': 'Space', + 'x-component-props': { + split: '|', + }, + properties: { + '0z54f36l29g': { + 'x-uid': '6ga7ofdmqac', + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + title: 'View record', + 'x-action': 'view', + 'x-toolbar': 'ActionSchemaToolbar', + 'x-settings': 'actionSettings:view', + 'x-component': 'Action.Link', + 'x-component-props': { + openMode: 'drawer', + danger: false, + }, + 'x-decorator': 'ACLActionProvider', + 'x-designer-props': { + linkageAction: true, + }, + properties: { + drawer: { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + title: '{{ t("View record") }}', + 'x-component': 'Action.Container', + 'x-component-props': { + className: 'nb-action-popup', + }, + properties: { + tabs: { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-component': 'Tabs', + 'x-component-props': {}, + 'x-initializer': 'TabPaneInitializers', + properties: { + tab1: { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + title: '{{t("Details")}}', + 'x-component': 'Tabs.TabPane', + 'x-designer': 'Tabs.Designer', + 'x-component-props': {}, + properties: { + grid: { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-component': 'Grid', + 'x-initializer': 'popup:common:addBlock', + 'x-uid': '8isg655oydv', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': 'avctzq7wpne', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': '8mimixsn47i', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': 'l491lw6ud7u', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': '0y6h0doaa8s', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': 'cusyvu100n5', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': 'kp6yhoecxt4', + 'x-async': false, + 'x-index': 2, + }, + }, + 'x-uid': '6fsjzz00845', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': 'gbcojp8p120', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': '18neqdk2pbg', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': '7przcz662jy', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': 'teroosp0elp', + 'x-async': true, + 'x-index': 1, + }, +}; diff --git a/packages/core/test/src/e2e/e2eUtils.ts b/packages/core/test/src/e2e/e2eUtils.ts index 1dc9fe9c00..bf948d5fec 100644 --- a/packages/core/test/src/e2e/e2eUtils.ts +++ b/packages/core/test/src/e2e/e2eUtils.ts @@ -53,6 +53,7 @@ export interface CollectionSetting { * @default false */ inherit?: boolean; + inherits?: string[]; category?: any[]; hidden?: boolean; description?: string; @@ -580,6 +581,10 @@ const deleteCollections = async (collectionNames: string[]) => { const result = await api.post(`/api/collections:destroy?${params}`, { headers, + params: { + // 自动删除依赖于集合的对象(如视图),进而删除依赖于这些对象的所有对象 + cascade: true, + }, }); if (!result.ok()) {