fix(template): restrict block templates to their respective block types (#4842)

* test: add e2e test

* fix(template): restrict block templates to their respective block types
This commit is contained in:
Zeke Zhang 2024-07-10 11:35:56 +08:00 committed by GitHub
parent 8792cbf61c
commit 68f53f5110
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 917 additions and 15 deletions

View File

@ -0,0 +1,104 @@
/**
* This file is part of the NocoBase (R) project.
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
* Authors: NocoBase Team.
*
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
* For more information, please refer to: https://www.nocobase.com/agreement.
*/
import { expect, test } from '@nocobase/test/e2e';
import { ordinaryBlockTemplatesCannotBeUsedToCreateAssociationBlocksAndViceVersa } from './templatesOfBug';
test.describe('block template', () => {
test('Ordinary block templates cannot be used to create association blocks, and vice versa', async ({
page,
mockPage,
clearBlockTemplates,
}) => {
await mockPage(ordinaryBlockTemplatesCannotBeUsedToCreateAssociationBlocksAndViceVersa).goto();
// ensure the block templates are cleared at the end of the test
await clearBlockTemplates();
// Save the table block on the page as a template -------------------------------------------
await page.getByLabel('block-item-CardItem-roles-').hover();
await page.getByLabel('designer-schema-settings-CardItem-blockSettings:table-roles').hover();
await page.getByRole('menuitem', { name: 'Save as template' }).click();
await page.getByRole('button', { name: 'OK', exact: true }).click();
// The template saved above cannot be used to create a association block.
await page.getByLabel('action-Action.Link-View-view-').click();
await page.getByLabel('schema-initializer-Grid-popup').hover();
await page.getByRole('menuitem', { name: 'table Table right' }).hover();
await page.getByRole('menuitem', { name: 'Associated records right' }).hover();
// The saved template should not be displayed (no arrow should be shown)
await expect(page.getByRole('menuitem', { name: 'Roles' })).toBeVisible();
await expect(page.getByRole('menuitem', { name: 'Roles right' })).not.toBeVisible();
// but can be used to create an other blocks by the "Other record" option
await page.getByRole('menuitem', { name: 'Other records right' }).hover();
await page.getByRole('menuitem', { name: 'Roles right' }).hover();
await page.getByRole('menuitem', { name: 'Duplicate template right' }).hover();
await expect(page.getByRole('menuitem', { name: 'Roles_Table' })).toBeVisible();
await page.mouse.move(300, 0);
// Save the details block on the drawer as a template -------------------------------------------
await page.getByLabel('block-item-CardItem-roles-details').hover();
await page.getByLabel('designer-schema-settings-CardItem-blockSettings:detailsWithPagination-roles').hover();
await page.getByRole('menuitem', { name: 'Save as template' }).click();
await page.getByRole('button', { name: 'OK', exact: true }).click();
await page.mouse.move(300, 0);
// make more stable
await page.waitForTimeout(500);
await page.getByLabel('schema-initializer-Grid-popup').hover();
await page.getByRole('menuitem', { name: 'table Details right' }).hover();
await page.getByRole('menuitem', { name: 'Associated records right' }).hover();
await page.getByRole('menuitem', { name: 'Roles right' }).hover();
await page.getByRole('menuitem', { name: 'Duplicate template right' }).hover();
await expect(page.getByRole('menuitem', { name: 'Roles_Details' })).toBeVisible();
await page.mouse.move(300, 0);
// Save the association block on the drawer as a template -------------------------------------------
await page
.getByTestId('drawer-Action.Container-users-View record')
.getByLabel('block-item-CardItem-roles-table')
.hover();
await page
.getByTestId('drawer-Action.Container-users-View record')
.getByLabel('designer-schema-settings-CardItem-blockSettings:table-roles')
.hover();
await page.getByRole('menuitem', { name: 'Save as template' }).click();
await page.getByLabel('Save as template').getByRole('textbox').fill('association_block');
await page.getByRole('button', { name: 'OK', exact: true }).click();
// close the drawer
await page.getByLabel('drawer-Action.Container-users-View record-mask').click();
// The template saved above cannot be used to create a non-association block.
await page.getByLabel('schema-initializer-Grid-page:').hover();
await page.getByRole('menuitem', { name: 'table Table right' }).hover();
await page.getByRole('menuitem', { name: 'Roles right' }).hover();
await page.getByRole('menuitem', { name: 'Duplicate template right' }).hover();
await expect(page.getByRole('menuitem', { name: 'Roles_Table' })).toBeVisible();
await expect(page.getByRole('menuitem', { name: 'association_block' })).not.toBeVisible();
await page.mouse.move(300, 0);
// Click on the association field to open the drawer --------------------------------------
await page.getByText('member').click();
await page.getByLabel('block-item-CardItem-roles-details').hover();
await page.getByLabel('designer-schema-settings-CardItem-blockSettings:details-roles').hover();
await page.getByRole('menuitem', { name: 'Save as block template' }).click();
await page.getByRole('textbox').fill('association_block_detail_item');
await page.getByRole('button', { name: 'OK', exact: true }).click();
await page.getByLabel('schema-initializer-Grid-popup').hover();
await page.getByRole('menuitem', { name: 'table Details right' }).hover();
await page.getByRole('menuitem', { name: 'Current record right' }).hover();
await page.getByRole('menuitem', { name: 'Duplicate template right' }).hover();
await expect(page.getByRole('menuitem', { name: 'association_block_detail_item' })).toBeVisible();
await page.mouse.move(300, 0);
});
});

View File

@ -3830,3 +3830,784 @@ export const T4334 = {
}, },
}, },
}; };
export const ordinaryBlockTemplatesCannotBeUsedToCreateAssociationBlocksAndViceVersa = {
pageSchema: {
_isJSONSchemaObject: true,
version: '2.0',
type: 'void',
'x-component': 'Page',
'x-app-version': '1.2.12-alpha',
'x-index': 1,
properties: {
vp18xr4s94r: {
_isJSONSchemaObject: true,
version: '2.0',
type: 'void',
'x-component': 'Grid',
'x-initializer': 'page:addBlock',
'x-app-version': '1.2.12-alpha',
'x-index': 1,
properties: {
'48xijrvwe7f': {
_isJSONSchemaObject: true,
version: '2.0',
type: 'void',
'x-component': 'Grid.Row',
'x-app-version': '1.2.12-alpha',
'x-index': 1,
properties: {
a01jv0ma085: {
_isJSONSchemaObject: true,
version: '2.0',
type: 'void',
'x-component': 'Grid.Col',
'x-app-version': '1.2.12-alpha',
'x-index': 1,
properties: {
nkjq9mnwl3t: {
_isJSONSchemaObject: true,
version: '2.0',
type: 'void',
'x-decorator': 'TableBlockProvider',
'x-acl-action': 'users:list',
'x-use-decorator-props': 'useTableBlockDecoratorProps',
'x-decorator-props': {
collection: 'users',
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': [],
'x-app-version': '1.2.12-alpha',
'x-index': 1,
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-app-version': '1.2.12-alpha',
'x-index': 1,
'x-uid': 'lo4ajp7tg96',
'x-async': false,
},
r6045g8do83: {
_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',
},
},
'x-app-version': '1.2.12-alpha',
'x-index': 2,
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-toolbar': 'TableColumnSchemaToolbar',
'x-initializer': 'table:configureItemActions',
'x-settings': 'fieldSettings:TableColumn',
'x-toolbar-props': {
initializer: 'table:configureItemActions',
},
'x-app-version': '1.2.12-alpha',
'x-index': 1,
properties: {
kw1qyuhqrnx: {
_isJSONSchemaObject: true,
version: '2.0',
type: 'void',
'x-decorator': 'DndContext',
'x-component': 'Space',
'x-component-props': {
split: '|',
},
'x-app-version': '1.2.12-alpha',
'x-index': 1,
properties: {
'53cdeamnxph': {
_isJSONSchemaObject: true,
version: '2.0',
type: 'void',
title: '{{ t("View") }}',
'x-action': 'view',
'x-toolbar': 'ActionSchemaToolbar',
'x-settings': 'actionSettings:view',
'x-component': 'Action.Link',
'x-component-props': {
openMode: 'drawer',
},
'x-decorator': 'ACLActionProvider',
'x-designer-props': {
linkageAction: true,
},
'x-index': 1,
properties: {
drawer: {
_isJSONSchemaObject: true,
version: '2.0',
type: 'void',
title: '{{ t("View record") }}',
'x-component': 'Action.Container',
'x-component-props': {
className: 'nb-action-popup',
},
'x-index': 1,
properties: {
tabs: {
_isJSONSchemaObject: true,
version: '2.0',
type: 'void',
'x-component': 'Tabs',
'x-component-props': {},
'x-initializer': 'popup:addTab',
'x-index': 1,
properties: {
tab1: {
_isJSONSchemaObject: true,
version: '2.0',
type: 'void',
title: '{{t("Details")}}',
'x-component': 'Tabs.TabPane',
'x-designer': 'Tabs.Designer',
'x-component-props': {},
'x-index': 1,
properties: {
grid: {
_isJSONSchemaObject: true,
version: '2.0',
type: 'void',
'x-component': 'Grid',
'x-initializer': 'popup:common:addBlock',
'x-index': 1,
properties: {
'1pwkkpqufg4': {
_isJSONSchemaObject: true,
version: '2.0',
type: 'void',
'x-component': 'Grid.Row',
'x-app-version': '1.2.12-alpha',
'x-index': 1,
properties: {
'410gicqpds5': {
_isJSONSchemaObject: true,
version: '2.0',
type: 'void',
'x-component': 'Grid.Col',
'x-app-version': '1.2.12-alpha',
'x-index': 1,
properties: {
vbb6lo1bnqc: {
_isJSONSchemaObject: true,
version: '2.0',
type: 'void',
'x-decorator': 'TableBlockProvider',
'x-acl-action': 'users.roles:list',
'x-use-decorator-props': 'useTableBlockDecoratorProps',
'x-decorator-props': {
association: 'users.roles',
dataSource: 'main',
action: 'list',
params: {
pageSize: 20,
},
rowKey: 'name',
showIndex: true,
dragSort: false,
},
'x-toolbar': 'BlockSchemaToolbar',
'x-settings': 'blockSettings:table',
'x-component': 'CardItem',
'x-filter-targets': [],
'x-app-version': '1.2.12-alpha',
'x-component-props': {
title: '关系区块的模板,不能用于创建普通区块',
},
'x-index': 1,
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-app-version': '1.2.12-alpha',
'x-index': 1,
'x-uid': '89jsznsarlc',
'x-async': false,
},
'5mevwu3x22a': {
_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',
},
},
'x-app-version': '1.2.12-alpha',
'x-index': 2,
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-toolbar': 'TableColumnSchemaToolbar',
'x-initializer': 'table:configureItemActions',
'x-settings': 'fieldSettings:TableColumn',
'x-toolbar-props': {
initializer: 'table:configureItemActions',
},
'x-app-version': '1.2.12-alpha',
'x-index': 1,
properties: {
lobrzqzg75z: {
_isJSONSchemaObject: true,
version: '2.0',
type: 'void',
'x-decorator': 'DndContext',
'x-component': 'Space',
'x-component-props': {
split: '|',
},
'x-app-version': '1.2.12-alpha',
'x-index': 1,
'x-uid': 't9lq3pqh9h1',
'x-async': false,
},
},
'x-uid': '8aph6mvtbaw',
'x-async': false,
},
},
'x-uid': '55dwvglgnmi',
'x-async': false,
},
},
'x-uid': 'mwxf08z03rr',
'x-async': false,
},
},
'x-uid': '62g2wjaszmy',
'x-async': false,
},
},
'x-uid': '6g3vj6hb2lg',
'x-async': false,
},
r3lzmtigz5q: {
_isJSONSchemaObject: true,
version: '2.0',
type: 'void',
'x-component': 'Grid.Row',
'x-app-version': '1.2.12-alpha',
'x-index': 2,
properties: {
rmopf61sxaz: {
_isJSONSchemaObject: true,
version: '2.0',
type: 'void',
'x-component': 'Grid.Col',
'x-app-version': '1.2.12-alpha',
'x-index': 1,
properties: {
'03ilzp6slqk': {
_isJSONSchemaObject: true,
version: '2.0',
type: 'void',
'x-acl-action': 'users.roles:view',
'x-decorator': 'DetailsBlockProvider',
'x-use-decorator-props':
'useDetailsWithPaginationDecoratorProps',
'x-decorator-props': {
dataSource: 'main',
association: 'users.roles',
readPretty: true,
action: 'list',
params: {
pageSize: 1,
},
},
'x-toolbar': 'BlockSchemaToolbar',
'x-settings': 'blockSettings:detailsWithPagination',
'x-component': 'CardItem',
'x-app-version': '1.2.12-alpha',
'x-component-props': {
title:
'关系详情区块模板,应该显示在 Current record 不显示在 Other records',
},
'x-index': 1,
properties: {
cdskpgjl62l: {
_isJSONSchemaObject: true,
version: '2.0',
type: 'void',
'x-component': 'Details',
'x-read-pretty': true,
'x-use-component-props':
'useDetailsWithPaginationProps',
'x-app-version': '1.2.12-alpha',
'x-index': 1,
properties: {
q8kra0mo3on: {
_isJSONSchemaObject: true,
version: '2.0',
type: 'void',
'x-initializer': 'details:configureActions',
'x-component': 'ActionBar',
'x-component-props': {
style: {
marginBottom: 24,
},
},
'x-app-version': '1.2.12-alpha',
'x-index': 1,
'x-uid': 'dbcwxoi2byj',
'x-async': false,
},
grid: {
_isJSONSchemaObject: true,
version: '2.0',
type: 'void',
'x-component': 'Grid',
'x-initializer': 'details:configureFields',
'x-app-version': '1.2.12-alpha',
'x-index': 2,
'x-uid': 'gb7bawzlsa3',
'x-async': false,
},
pagination: {
_isJSONSchemaObject: true,
version: '2.0',
type: 'void',
'x-component': 'Pagination',
'x-use-component-props':
'useDetailsPaginationProps',
'x-app-version': '1.2.12-alpha',
'x-index': 3,
'x-uid': '97u0q2xu0py',
'x-async': false,
},
},
'x-uid': 'khwmfni4kxq',
'x-async': false,
},
},
'x-uid': 'siec695mn67',
'x-async': false,
},
},
'x-uid': 'vphskdrk6yl',
'x-async': false,
},
},
'x-uid': 'vgsps35j6we',
'x-async': false,
},
},
'x-uid': '0hvmphl4vke',
'x-async': false,
},
},
'x-uid': 'zmlej955vyh',
'x-async': false,
},
},
'x-uid': '0ljl5s1wrv4',
'x-async': false,
},
},
'x-uid': 'u9dly44dmb5',
'x-async': false,
},
},
'x-uid': 'fdfbyibqlt9',
'x-async': false,
},
},
'x-uid': 'dxqtinx68eu',
'x-async': false,
},
},
'x-uid': '8quw3whqnlu',
'x-async': false,
},
iejl76kjob6: {
_isJSONSchemaObject: true,
version: '2.0',
type: 'void',
'x-decorator': 'TableV2.Column.Decorator',
'x-toolbar': 'TableColumnSchemaToolbar',
'x-settings': 'fieldSettings:TableColumn',
'x-component': 'TableV2.Column',
'x-app-version': '1.2.12-alpha',
properties: {
roles: {
_isJSONSchemaObject: true,
version: '2.0',
'x-collection-field': 'users.roles',
'x-component': 'CollectionField',
'x-component-props': {
fieldNames: {
value: 'name',
label: 'name',
},
ellipsis: true,
size: 'small',
},
'x-read-pretty': true,
'x-decorator': null,
'x-decorator-props': {
labelStyle: {
display: 'none',
},
},
'x-app-version': '1.2.12-alpha',
properties: {
'1bvhtfs19vo': {
_isJSONSchemaObject: true,
version: '2.0',
type: 'void',
title: '{{ t("View record") }}',
'x-component': 'AssociationField.Viewer',
'x-component-props': {
className: 'nb-action-popup',
},
'x-index': 1,
'x-app-version': '1.2.12-alpha',
properties: {
tabs: {
_isJSONSchemaObject: true,
version: '2.0',
type: 'void',
'x-component': 'Tabs',
'x-component-props': {},
'x-initializer': 'popup:addTab',
'x-app-version': '1.2.12-alpha',
properties: {
tab1: {
_isJSONSchemaObject: true,
version: '2.0',
type: 'void',
title: '{{t("Details")}}',
'x-component': 'Tabs.TabPane',
'x-designer': 'Tabs.Designer',
'x-component-props': {},
'x-app-version': '1.2.12-alpha',
properties: {
grid: {
_isJSONSchemaObject: true,
version: '2.0',
type: 'void',
'x-component': 'Grid',
'x-initializer': 'popup:common:addBlock',
'x-app-version': '1.2.12-alpha',
properties: {
'7y164ln4t02': {
_isJSONSchemaObject: true,
version: '2.0',
type: 'void',
'x-component': 'Grid.Row',
'x-app-version': '1.2.12-alpha',
properties: {
xvah1ee6t1s: {
_isJSONSchemaObject: true,
version: '2.0',
type: 'void',
'x-component': 'Grid.Col',
'x-app-version': '1.2.12-alpha',
properties: {
'9s7dkj8074h': {
_isJSONSchemaObject: true,
version: '2.0',
type: 'void',
'x-acl-action': 'users.roles:get',
'x-decorator': 'DetailsBlockProvider',
'x-use-decorator-props': 'useDetailsDecoratorProps',
'x-decorator-props': {
dataSource: 'main',
association: 'users.roles',
readPretty: true,
action: 'get',
},
'x-toolbar': 'BlockSchemaToolbar',
'x-settings': 'blockSettings:details',
'x-component': 'CardItem',
'x-is-current': true,
'x-app-version': '1.2.12-alpha',
properties: {
'531zk0xnik4': {
_isJSONSchemaObject: true,
version: '2.0',
type: 'void',
'x-component': 'Details',
'x-read-pretty': true,
'x-use-component-props': 'useDetailsProps',
'x-app-version': '1.2.12-alpha',
properties: {
'3omnlflcggh': {
_isJSONSchemaObject: true,
version: '2.0',
type: 'void',
'x-initializer': 'details:configureActions',
'x-component': 'ActionBar',
'x-component-props': {
style: {
marginBottom: 24,
},
},
'x-app-version': '1.2.12-alpha',
'x-uid': 'ym6lh2x98dj',
'x-async': false,
'x-index': 1,
},
grid: {
_isJSONSchemaObject: true,
version: '2.0',
type: 'void',
'x-component': 'Grid',
'x-initializer': 'details:configureFields',
'x-app-version': '1.2.12-alpha',
'x-uid': 'qqtgr6x5ymn',
'x-async': false,
'x-index': 2,
},
},
'x-uid': 'rb5nttjwcvw',
'x-async': false,
'x-index': 1,
},
},
'x-uid': 'vl2i6hfkkl8',
'x-async': false,
'x-index': 1,
},
},
'x-uid': 'r02zci8a2b9',
'x-async': false,
'x-index': 1,
},
},
'x-uid': 'h7944lifss1',
'x-async': false,
'x-index': 1,
},
},
'x-uid': 'folxpxboig0',
'x-async': false,
'x-index': 1,
},
},
'x-uid': 'lj3p0oeb0mp',
'x-async': false,
'x-index': 1,
},
},
'x-uid': '0tl5555ulg9',
'x-async': false,
'x-index': 1,
},
},
'x-uid': 'layx1foi3xz',
'x-async': false,
},
},
'x-uid': '084q5ucj2hg',
'x-async': false,
'x-index': 1,
},
},
'x-uid': 'uag0rx0s4j3',
'x-async': false,
'x-index': 2,
},
},
'x-uid': 'rf2ulrqfw0r',
'x-async': false,
},
},
'x-uid': 'd7c6p0kxuga',
'x-async': false,
},
},
'x-uid': 'ufl6l2izdx8',
'x-async': false,
},
},
'x-uid': 'o2nc3g5be81',
'x-async': false,
},
maf7gojs1zc: {
_isJSONSchemaObject: true,
version: '2.0',
type: 'void',
'x-component': 'Grid.Row',
'x-app-version': '1.2.12-alpha',
'x-index': 2,
properties: {
'6trihtcvyik': {
_isJSONSchemaObject: true,
version: '2.0',
type: 'void',
'x-component': 'Grid.Col',
'x-app-version': '1.2.12-alpha',
'x-index': 1,
properties: {
wjj8dg4gupk: {
_isJSONSchemaObject: true,
version: '2.0',
type: 'void',
'x-decorator': 'TableBlockProvider',
'x-acl-action': 'roles:list',
'x-use-decorator-props': 'useTableBlockDecoratorProps',
'x-decorator-props': {
collection: 'roles',
dataSource: 'main',
action: 'list',
params: {
pageSize: 20,
},
rowKey: 'name',
showIndex: true,
dragSort: false,
},
'x-toolbar': 'BlockSchemaToolbar',
'x-settings': 'blockSettings:table',
'x-component': 'CardItem',
'x-filter-targets': [],
'x-app-version': '1.2.12-alpha',
'x-component-props': {
title: '普通区块的模板,不能用于创建关系区块',
},
'x-index': 1,
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-app-version': '1.2.12-alpha',
'x-index': 1,
'x-uid': '93zayim5y7t',
'x-async': false,
},
'1uuqwvjlji9': {
_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',
},
},
'x-app-version': '1.2.12-alpha',
'x-index': 2,
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-toolbar': 'TableColumnSchemaToolbar',
'x-initializer': 'table:configureItemActions',
'x-settings': 'fieldSettings:TableColumn',
'x-toolbar-props': {
initializer: 'table:configureItemActions',
},
'x-app-version': '1.2.12-alpha',
'x-index': 1,
properties: {
'5n2lezgtg4q': {
_isJSONSchemaObject: true,
version: '2.0',
type: 'void',
'x-decorator': 'DndContext',
'x-component': 'Space',
'x-component-props': {
split: '|',
},
'x-app-version': '1.2.12-alpha',
'x-index': 1,
'x-uid': 't9o0l4b3jjf',
'x-async': false,
},
},
'x-uid': '834ecrjnrz7',
'x-async': false,
},
},
'x-uid': '9argmfxe42w',
'x-async': false,
},
},
'x-uid': 'bakwhqmelgh',
'x-async': false,
},
},
'x-uid': 't5tifk4xmwz',
'x-async': false,
},
},
'x-uid': 'g8r6sibh2yq',
'x-async': false,
},
},
'x-uid': 'j0lfty8wr99',
'x-async': false,
},
},
'x-uid': 'mratid7w4zu',
'x-async': true,
},
};

View File

@ -357,6 +357,7 @@ export const DataBlockInitializer: FC<DataBlockInitializerProps> = (props) => {
itemsFromProps || itemsFromProps ||
// eslint-disable-next-line react-hooks/rules-of-hooks // eslint-disable-next-line react-hooks/rules-of-hooks
useCollectionDataSourceItems({ useCollectionDataSourceItems({
name,
componentName: componentType, componentName: componentType,
filter, filter,
filterDataSource, filterDataSource,

View File

@ -17,6 +17,7 @@ import {
DataBlockInitializer, DataBlockInitializer,
DataSource, DataSource,
SchemaInitializerItemType, SchemaInitializerItemType,
useAssociationName,
useCollection, useCollection,
useCollectionManager, useCollectionManager,
useDataSourceKey, useDataSourceKey,
@ -842,6 +843,7 @@ export const useRecordCollectionDataSourceItems = (
}; };
export const useCollectionDataSourceItems = ({ export const useCollectionDataSourceItems = ({
name,
componentName, componentName,
filter = () => true, filter = () => true,
onlyCurrentDataSource = false, onlyCurrentDataSource = false,
@ -854,7 +856,8 @@ export const useCollectionDataSourceItems = ({
currentText, currentText,
otherText, otherText,
}: { }: {
componentName; name: string;
componentName: string;
filter?: (options: { collection?: Collection; associationField?: CollectionFieldOptions }) => boolean; filter?: (options: { collection?: Collection; associationField?: CollectionFieldOptions }) => boolean;
onlyCurrentDataSource?: boolean; onlyCurrentDataSource?: boolean;
showAssociationFields?: boolean; showAssociationFields?: boolean;
@ -877,6 +880,7 @@ export const useCollectionDataSourceItems = ({
const dataSourceKey = useDataSourceKey(); const dataSourceKey = useDataSourceKey();
const collection = useCollection(); const collection = useCollection();
const associationFields = useAssociationFields({ componentName, filterCollections: filter, showAssociationFields }); const associationFields = useAssociationFields({ componentName, filterCollections: filter, showAssociationFields });
const association = useAssociationName();
let allCollections = dm.getAllCollections({ let allCollections = dm.getAllCollections({
filterCollection: (collection) => { filterCollection: (collection) => {
@ -900,6 +904,8 @@ export const useCollectionDataSourceItems = ({
type: 'subMenu', type: 'subMenu',
children: [ children: [
...getChildren({ ...getChildren({
name,
association,
collections, collections,
componentName, componentName,
searchValue: '', searchValue: '',
@ -1383,6 +1389,8 @@ export const createTableBlockSchema = (options) => {
}; };
const getChildren = ({ const getChildren = ({
name,
association,
collections, collections,
dataSource, dataSource,
componentName, componentName,
@ -1390,6 +1398,8 @@ const getChildren = ({
getTemplatesByCollection, getTemplatesByCollection,
t, t,
}: { }: {
name: string;
association: string;
collections: any[]; collections: any[];
componentName: string; componentName: string;
searchValue: string; searchValue: string;
@ -1422,13 +1432,21 @@ const getChildren = ({
?.map((item, index) => { ?.map((item, index) => {
const title = item.title || item.tableName || item.label; const title = item.title || item.tableName || item.label;
const templates = getTemplatesByCollection(dataSource, item.name).filter((template) => { const templates = getTemplatesByCollection(dataSource, item.name).filter((template) => {
return ( // 弹窗中的 Current record 选项
componentName && const isCurrentRecordOption = name !== 'otherRecords' && association;
template.componentName === componentName &&
(['FormItem', 'ReadPrettyFormItem'].includes(componentName) || if (isCurrentRecordOption) {
!template.resourceName || if (template.resourceName !== association) {
template.resourceName === item.name) return false;
); }
return componentName && template.componentName === componentName;
}
if (!isCurrentRecordOption && template?.resourceName?.includes('.')) {
return false;
}
return componentName && template.componentName === componentName;
}); });
if (!templates.length) { if (!templates.length) {
return { return {
@ -1539,6 +1557,10 @@ function useAssociationFields({
.map((field, index) => { .map((field, index) => {
const title = compile(field.uiSchema.title || field.name); const title = compile(field.uiSchema.title || field.name);
const templates = getTemplatesByCollection(dataSource, field.target).filter((template) => { const templates = getTemplatesByCollection(dataSource, field.target).filter((template) => {
if (template.resourceName !== `${field.collectionName}.${field.name}`) {
return false;
}
// 针对弹窗中的详情区块 // 针对弹窗中的详情区块
if (componentName === 'ReadPrettyFormItem') { if (componentName === 'ReadPrettyFormItem') {
if (['hasOne', 'belongsTo'].includes(field.type)) { if (['hasOne', 'belongsTo'].includes(field.type)) {
@ -1548,13 +1570,7 @@ function useAssociationFields({
} }
} }
return ( return template.componentName === componentName;
componentName &&
template.componentName === componentName &&
(['FormItem', 'ReadPrettyFormItem'].includes(componentName) ||
!template.resourceName ||
template.resourceName === `${field.collectionName}.${field.name}`)
);
}); });
if (!templates.length) { if (!templates.length) {
return { return {