From 32b3b761725712b12b30c0bf6d0032b15716e3e0 Mon Sep 17 00:00:00 2001 From: Zeke Zhang <958414905@qq.com> Date: Fri, 18 Oct 2024 12:09:29 +0800 Subject: [PATCH] fix(variable): fix issue of not parsing URL variables (#5454) * fix(variable): fix issue of not parsing URL variables * test: add e2e test --- .../actions/__e2e__/link/basic.test.ts | 16 +- .../modules/actions/__e2e__/link/templates.ts | 314 ++++++++++++++++++ .../form-item/hooks/useParseDefaultValue.ts | 2 +- packages/core/test/src/e2e/e2eUtils.ts | 9 +- 4 files changed, 337 insertions(+), 4 deletions(-) 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 a1068fa949..048b30f3de 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 @@ -8,7 +8,12 @@ */ import { expect, test } from '@nocobase/test/e2e'; -import { PopupAndSubPageWithParams, oneEmptyTableWithUsers, openInNewWidow } from './templates'; +import { + PopupAndSubPageWithParams, + URLSearchParamsUseAssociationFieldValue, + oneEmptyTableWithUsers, + openInNewWidow, +} from './templates'; test.describe('Link', () => { test('basic', async ({ page, mockPage, mockRecords }) => { @@ -140,4 +145,13 @@ test.describe('Link', () => { await page.reload(); await expect(page.getByLabel('block-item-CollectionField-').getByRole('textbox')).toHaveValue('abc'); }); + + test('URL search params: use association field value', async ({ page, mockPage, mockRecords }) => { + await mockPage(URLSearchParamsUseAssociationFieldValue).goto(); + + // After clicking the Link button, the browser URL will change, and the value of the input box using variables will be updated + await page.getByLabel('action-Action.Link-Link-').click(); + await page.waitForTimeout(100); + await expect(page.getByLabel('block-item-CollectionField-')).toHaveText(`Roles:adminmemberroot`); + }); }); diff --git a/packages/core/client/src/modules/actions/__e2e__/link/templates.ts b/packages/core/client/src/modules/actions/__e2e__/link/templates.ts index 97a8ce5487..e9578e32ad 100644 --- a/packages/core/client/src/modules/actions/__e2e__/link/templates.ts +++ b/packages/core/client/src/modules/actions/__e2e__/link/templates.ts @@ -757,3 +757,317 @@ export const PopupAndSubPageWithParams = { 'x-index': 1, }, }; +export const URLSearchParamsUseAssociationFieldValue = { + pageSchema: { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-component': 'Page', + 'x-app-version': '1.3.33-beta', + properties: { + gbfvfwym8ds: { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-component': 'Grid', + 'x-initializer': 'page:addBlock', + 'x-app-version': '1.3.33-beta', + properties: { + '33bst9cikf7': { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-component': 'Grid.Row', + 'x-app-version': '1.3.33-beta', + properties: { + fewb4k72bc8: { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-component': 'Grid.Col', + 'x-app-version': '1.3.33-beta', + properties: { + '5cfypzqvw57': { + _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.3.33-beta', + 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.3.33-beta', + 'x-uid': '1xy1166yc9k', + 'x-async': false, + 'x-index': 1, + }, + '6a59q3gjjqu': { + _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.3.33-beta', + 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.3.33-beta', + properties: { + lzxiek232g3: { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-decorator': 'DndContext', + 'x-component': 'Space', + 'x-component-props': { + split: '|', + }, + 'x-app-version': '1.3.33-beta', + properties: { + qhrjv5sk1tc: { + 'x-uid': 'o7zrp842yhz', + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + title: '{{ t("Link") }}', + 'x-action': 'customize:link', + 'x-toolbar': 'ActionSchemaToolbar', + 'x-settings': 'actionSettings:link', + 'x-component': 'Action.Link', + 'x-use-component-props': 'useLinkActionProps', + 'x-designer-props': { + linkageAction: true, + }, + 'x-component-props': { + url: '/admin/ids0d9esx8k', + params: [ + { + name: 'roles', + value: '{{$nRecord.roles}}', + }, + ], + }, + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': 'y0m958j0dh0', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': '4d4wnl1b6xx', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': '238yee6oghy', + 'x-async': false, + 'x-index': 2, + }, + }, + 'x-uid': 'gjzmrbmobaf', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': 'z4rsa4oitvz', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': '6tec1zys03w', + 'x-async': false, + 'x-index': 1, + }, + sbdgc6nmy9x: { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-component': 'Grid.Row', + 'x-app-version': '1.3.33-beta', + properties: { + '3sfuujjet76': { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-component': 'Grid.Col', + 'x-app-version': '1.3.33-beta', + properties: { + p3zmu2uua0x: { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-acl-action-props': { + skipScopeCheck: true, + }, + 'x-acl-action': 'users:create', + 'x-decorator': 'FormBlockProvider', + 'x-use-decorator-props': 'useCreateFormBlockDecoratorProps', + 'x-decorator-props': { + dataSource: 'main', + collection: 'users', + }, + 'x-toolbar': 'BlockSchemaToolbar', + 'x-settings': 'blockSettings:createForm', + 'x-component': 'CardItem', + 'x-app-version': '1.3.33-beta', + properties: { + '1oq2w1ia4jy': { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-component': 'FormV2', + 'x-use-component-props': 'useCreateFormBlockProps', + 'x-app-version': '1.3.33-beta', + properties: { + grid: { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-component': 'Grid', + 'x-initializer': 'form:configureFields', + 'x-app-version': '1.3.33-beta', + properties: { + efdbxp35iht: { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-component': 'Grid.Row', + 'x-app-version': '1.3.33-beta', + properties: { + k40ivzy5kcu: { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-component': 'Grid.Col', + 'x-app-version': '1.3.33-beta', + properties: { + roles: { + 'x-uid': 'v8jvm1d9j8q', + _isJSONSchemaObject: true, + version: '2.0', + type: 'string', + 'x-toolbar': 'FormItemSchemaToolbar', + 'x-settings': 'fieldSettings:FormItem', + 'x-component': 'CollectionField', + 'x-decorator': 'FormItem', + 'x-collection-field': 'users.roles', + 'x-component-props': { + fieldNames: { + label: 'name', + value: 'name', + }, + }, + 'x-app-version': '1.3.33-beta', + default: '{{$nURLSearchParams.roles}}', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': '3rs4fwe2gak', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': 'tuqcvp6tzbg', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': 'dz9070niyqm', + 'x-async': false, + 'x-index': 1, + }, + '5mu8w85umxn': { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-initializer': 'createForm:configureActions', + 'x-component': 'ActionBar', + 'x-component-props': { + layout: 'one-column', + }, + 'x-app-version': '1.3.33-beta', + 'x-uid': 'xgak2t61ukm', + 'x-async': false, + 'x-index': 2, + }, + }, + 'x-uid': 'asfu0o75c3k', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': 'tgsr3gv33qk', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': 'pjd4g9evi3v', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': 'hj4wq3bdtip', + 'x-async': false, + 'x-index': 2, + }, + }, + 'x-uid': '1xgpa64dn71', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': 'ocal3pnltf2', + 'x-async': true, + 'x-index': 1, + }, + keepUid: true, + pageUid: 'ids0d9esx8k', +}; diff --git a/packages/core/client/src/schema-component/antd/form-item/hooks/useParseDefaultValue.ts b/packages/core/client/src/schema-component/antd/form-item/hooks/useParseDefaultValue.ts index e935e42fa9..703b2a43b8 100644 --- a/packages/core/client/src/schema-component/antd/form-item/hooks/useParseDefaultValue.ts +++ b/packages/core/client/src/schema-component/antd/form-item/hooks/useParseDefaultValue.ts @@ -108,9 +108,9 @@ const useParseDefaultValue = () => { fieldOperator: getOperator(fieldSchema.name), }); - // fix https://tasks.aliyun.nocobase.com/admin/ugmnj2ycfgg/popups/1qlw5c38t3b/puid/dz42x7ffr7i/filterbytk/199 if ( collectionField.target && + collectionNameOfVariable && collectionField.target !== collectionNameOfVariable && !isInherit({ collectionName: collectionField.target, diff --git a/packages/core/test/src/e2e/e2eUtils.ts b/packages/core/test/src/e2e/e2eUtils.ts index 75f7141e28..a52a74904c 100644 --- a/packages/core/test/src/e2e/e2eUtils.ts +++ b/packages/core/test/src/e2e/e2eUtils.ts @@ -181,6 +181,8 @@ export interface PageConfig { pageSchema?: any; /** 如果为 true 则表示不会更改 PageSchema 的 uid */ keepUid?: boolean; + /** 在 URL 中的 uid,例如:/admin/0ig6xhe03u2 */ + pageUid?: string; } export interface MobilePageConfig extends Omit { @@ -199,6 +201,8 @@ interface CreatePageOptions { pageSchema?: any; /** 如果为 true 则表示不会更改 PageSchema 的 uid */ keepUid?: boolean; + /** 在 URL 中的 uid,例如:/admin/0ig6xhe03u2 */ + pageUid?: string; } interface CreateMobilePageOptions extends Omit { @@ -346,6 +350,7 @@ export class NocoPage { pageSchema: this.options?.pageSchema, url: this.options?.url, keepUid: this.options?.keepUid, + pageUid: this.options?.pageUid, }), ); @@ -706,7 +711,7 @@ const updateUidOfPageSchema = (uiSchema: any) => { * 在 NocoBase 中创建一个页面 */ const createPage = async (options?: CreatePageOptions) => { - const { type = 'page', url, name, pageSchema, keepUid } = options || {}; + const { type = 'page', url, name, pageSchema, keepUid, pageUid: pageUidFromOptions } = options || {}; const api = await request.newContext({ storageState: process.env.PLAYWRIGHT_AUTH_FILE, }); @@ -728,7 +733,7 @@ const createPage = async (options?: CreatePageOptions) => { }; const state = await api.storageState(); const headers = getHeaders(state); - const pageUid = uid(); + const pageUid = pageUidFromOptions || uid(); const gridName = uid(); const result = await api.post(`/api/uiSchemas:insertAdjacent/nocobase-admin-menu?position=beforeEnd`, {