diff --git a/packages/core/client/src/schema-settings/LinkageRules/bindLinkageRulesToFiled.ts b/packages/core/client/src/schema-settings/LinkageRules/bindLinkageRulesToFiled.ts index be17782a4e..cca6b7df71 100644 --- a/packages/core/client/src/schema-settings/LinkageRules/bindLinkageRulesToFiled.ts +++ b/packages/core/client/src/schema-settings/LinkageRules/bindLinkageRulesToFiled.ts @@ -416,7 +416,9 @@ export async function replaceVariables( } const waitForParsing = value.match(REGEX_OF_VARIABLE_IN_EXPRESSION)?.map(async (item) => { - const { value: parsedValue } = await variables.parseVariable(item, localVariables); + const { value: parsedValue } = await variables.parseVariable(item, localVariables, { + doNotRequest: item.includes('$nForm'), + }); // 在开头加 `_` 是为了保证 id 不能以数字开头,否则在解析表达式的时候(不是解析变量)会报错 const id = `_${uid()}`; diff --git a/packages/core/client/src/schema-settings/__e2e__/linkageRules.test.ts b/packages/core/client/src/schema-settings/__e2e__/linkageRules.test.ts index 7729b8a8ce..f52d12eba1 100644 --- a/packages/core/client/src/schema-settings/__e2e__/linkageRules.test.ts +++ b/packages/core/client/src/schema-settings/__e2e__/linkageRules.test.ts @@ -10,6 +10,7 @@ import { expect, test } from '@nocobase/test/e2e'; import { formFieldDependsOnSubtableFieldsWithLinkageRules, + whenClearingARelationshipFieldTheValueOfTheAssociatedFieldShouldBeCleared, whenSetToHideRetainedValueItShouldNotImpactTheFieldSDefaultValueVariables, } from './template'; @@ -81,6 +82,25 @@ test.describe('linkage rules', () => { page.getByRole('button', { name: 'block-item-CardItem-roles-' }).getByRole('row', { name: '123456789' }), ).toBeVisible(); }); + + test('When clearing a relationship field, the value of the associated field should be cleared', async ({ + page, + mockPage, + }) => { + await mockPage(whenClearingARelationshipFieldTheValueOfTheAssociatedFieldShouldBeCleared).goto(); + + // 1. 点击 Edit 按钮打开编辑表单弹窗 + await page.getByLabel('action-Action.Link-Edit-').click(); + + // 2. 清空 roles 字段的值,nickname 字段的值应该被清空 + await page.getByTestId('select-object-multiple').hover(); + await page.getByLabel('icon-close-select').click(); + await expect( + page + .getByRole('button', { name: 'block-item-CollectionField-users-form-users.nickname-Nickname' }) + .getByRole('textbox'), + ).toBeEmpty(); + }); }); function calcResult(record) { diff --git a/packages/core/client/src/schema-settings/__e2e__/template.ts b/packages/core/client/src/schema-settings/__e2e__/template.ts index 0f0eaa5364..81ddd8af78 100644 --- a/packages/core/client/src/schema-settings/__e2e__/template.ts +++ b/packages/core/client/src/schema-settings/__e2e__/template.ts @@ -1534,3 +1534,433 @@ export const whenSetToHideRetainedValueItShouldNotImpactTheFieldSDefaultValueVar 'x-async': true, }, }; +export const whenClearingARelationshipFieldTheValueOfTheAssociatedFieldShouldBeCleared = { + pageSchema: { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-component': 'Page', + 'x-app-version': '1.5.16', + properties: { + '3fiy31f6txn': { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-component': 'Grid', + 'x-initializer': 'page:addBlock', + 'x-app-version': '1.5.16', + properties: { + '0rcyz4b3efw': { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-component': 'Grid.Row', + 'x-app-version': '1.5.16', + properties: { + u3mg5s9lzv6: { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-component': 'Grid.Col', + 'x-app-version': '1.5.16', + properties: { + ezm6z8plx83: { + _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.5.16', + 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.5.16', + 'x-uid': 'tt6xllenhim', + 'x-async': false, + 'x-index': 1, + }, + jv0ofysjinb: { + _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.5.16', + 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.5.16', + properties: { + bngzha8iw7k: { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-decorator': 'DndContext', + 'x-component': 'Space', + 'x-component-props': { + split: '|', + }, + 'x-app-version': '1.5.16', + properties: { + tkzbokuc018: { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + title: '{{ t("Edit") }}', + 'x-action': 'update', + 'x-toolbar': 'ActionSchemaToolbar', + 'x-settings': 'actionSettings:edit', + 'x-component': 'Action.Link', + 'x-component-props': { + openMode: 'drawer', + icon: 'EditOutlined', + }, + 'x-action-context': { + dataSource: 'main', + collection: 'users', + }, + 'x-decorator': 'ACLActionProvider', + 'x-designer-props': { + linkageAction: true, + }, + properties: { + drawer: { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + title: '{{ t("Edit 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': 'popup:addTab', + properties: { + tab1: { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + title: '{{t("Edit")}}', + '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', + properties: { + q2nw699fdes: { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-component': 'Grid.Row', + 'x-app-version': '1.5.16', + properties: { + '8rf37n96jy1': { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-component': 'Grid.Col', + 'x-app-version': '1.5.16', + properties: { + '83f2yyxkgew': { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-acl-action-props': { + skipScopeCheck: false, + }, + 'x-acl-action': 'users:update', + 'x-decorator': 'FormBlockProvider', + 'x-use-decorator-props': + 'useEditFormBlockDecoratorProps', + 'x-decorator-props': { + action: 'get', + dataSource: 'main', + collection: 'users', + }, + 'x-toolbar': 'BlockSchemaToolbar', + 'x-settings': 'blockSettings:editForm', + 'x-component': 'CardItem', + 'x-app-version': '1.5.16', + properties: { + ztcsjl3kutq: { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-component': 'FormV2', + 'x-use-component-props': 'useEditFormBlockProps', + 'x-app-version': '1.5.16', + properties: { + grid: { + 'x-uid': 'jk5os75m30w', + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-component': 'Grid', + 'x-initializer': 'form:configureFields', + 'x-app-version': '1.5.16', + 'x-linkage-rules': [ + { + condition: { + $and: [], + }, + actions: [ + { + targetFields: ['nickname'], + operator: 'value', + value: { + mode: 'express', + value: '{{$nForm.roles.title}}', + result: '{{$nForm.roles.title}}', + }, + }, + ], + }, + ], + properties: { + al791aryfpm: { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-component': 'Grid.Row', + 'x-app-version': '1.5.16', + properties: { + s2o1ubyy97y: { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-component': 'Grid.Col', + 'x-app-version': '1.5.16', + properties: { + roles: { + _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.5.16', + 'x-uid': 'y5r3pw94du5', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': '1mlc7m6h27k', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': 'l5bz655ppju', + 'x-async': false, + 'x-index': 1, + }, + jsl0ebbnp4x: { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-component': 'Grid.Row', + 'x-app-version': '1.5.16', + properties: { + e19ihogekwg: { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-component': 'Grid.Col', + 'x-app-version': '1.5.16', + properties: { + nickname: { + _isJSONSchemaObject: true, + version: '2.0', + type: 'string', + 'x-toolbar': + 'FormItemSchemaToolbar', + 'x-settings': + 'fieldSettings:FormItem', + 'x-component': 'CollectionField', + 'x-decorator': 'FormItem', + 'x-collection-field': + 'users.nickname', + 'x-component-props': {}, + 'x-app-version': '1.5.16', + 'x-uid': 'nr2wsugko9w', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': 'vmsrhpme9qo', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': 'b7v16npd5y2', + 'x-async': false, + 'x-index': 2, + }, + }, + 'x-async': false, + 'x-index': 1, + }, + p3zp9livz6w: { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-initializer': 'editForm:configureActions', + 'x-component': 'ActionBar', + 'x-component-props': { + layout: 'one-column', + }, + 'x-app-version': '1.5.16', + 'x-uid': 'd3qzyf73gu6', + 'x-async': false, + 'x-index': 2, + }, + }, + 'x-uid': 'j4j1fy7tkmh', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': 't4mmnie8cll', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': 'bnugjy38s7u', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': 'tb4c9r9s844', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': 'dlbfog0xc8b', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': 'nvl54jerwsi', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': '8d1h9bm3lnb', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': 'f7xutqb1iyw', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': 'kquc4rim0g2', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': 'sb10ua8lfsl', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': 'wa210opt4kb', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': 'sumvmy4epmf', + 'x-async': false, + 'x-index': 2, + }, + }, + 'x-uid': 'jyssn2zrfs6', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': 'n1iy8cfg2nj', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': 'q9we7w410nr', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': 'hajsh396zq6', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': 'utv8yv0hu55', + 'x-async': true, + 'x-index': 1, + }, +};