diff --git a/packages/core/client/src/modules/actions/add-new/addNewActionSettings.tsx b/packages/core/client/src/modules/actions/add-new/addNewActionSettings.tsx index f0e79b3eb7..d4b629c1d3 100644 --- a/packages/core/client/src/modules/actions/add-new/addNewActionSettings.tsx +++ b/packages/core/client/src/modules/actions/add-new/addNewActionSettings.tsx @@ -15,6 +15,8 @@ import { ButtonEditor, RemoveButton } from '../../../schema-component/antd/actio import { SchemaSettingOpenModeSchemaItems } from '../../../schema-items'; import { SchemaSettingsEnableChildCollections } from '../../../schema-settings/SchemaSettings'; import { useOpenModeContext } from '../../popup/OpenModeProvider'; +import { SchemaSettingsLinkageRules } from '../../../schema-settings'; +import { useDataBlockProps } from '../../../data-source'; export const addNewActionSettings = new SchemaSettings({ name: 'actionSettings:addNew', @@ -57,6 +59,24 @@ export const addNewActionSettings = new SchemaSettings({ return isChildCollectionAction; }, }, + { + name: 'linkageRules', + Component: SchemaSettingsLinkageRules, + useVisible() { + const { association } = useDataBlockProps() || {}; + return !!association; + }, + useComponentProps() { + const { association } = useDataBlockProps(); + const { getCollectionField } = useCollectionManager_deprecated(); + const associationField = getCollectionField(association); + const { linkageRulesProps } = useSchemaToolbar(); + return { + ...linkageRulesProps, + collectionName: associationField?.collectionName, + }; + }, + }, { name: 'delete', sort: 100, diff --git a/packages/core/client/src/modules/actions/bulk-destroy/bulkDeleteActionSettings.tsx b/packages/core/client/src/modules/actions/bulk-destroy/bulkDeleteActionSettings.tsx index be35280a42..897195f1fd 100644 --- a/packages/core/client/src/modules/actions/bulk-destroy/bulkDeleteActionSettings.tsx +++ b/packages/core/client/src/modules/actions/bulk-destroy/bulkDeleteActionSettings.tsx @@ -15,6 +15,9 @@ import { SecondConFirm, RefreshDataBlockRequest, } from '../../../schema-component/antd/action/Action.Designer'; +import { SchemaSettingsLinkageRules } from '../../../schema-settings'; +import { useCollectionManager_deprecated } from '../../../collection-manager'; +import { useDataBlockProps } from '../../../data-source'; export const bulkDeleteActionSettings = new SchemaSettings({ name: 'actionSettings:bulkDelete', @@ -40,6 +43,24 @@ export const bulkDeleteActionSettings = new SchemaSettings({ }; }, }, + { + name: 'linkageRules', + Component: SchemaSettingsLinkageRules, + useVisible() { + const { association } = useDataBlockProps() || {}; + return !!association; + }, + useComponentProps() { + const { association } = useDataBlockProps() || {}; + const { getCollectionField } = useCollectionManager_deprecated(); + const associationField = getCollectionField(association); + const { linkageRulesProps } = useSchemaToolbar(); + return { + ...linkageRulesProps, + collectionName: associationField?.collectionName, + }; + }, + }, { name: 'remove', sort: 100, diff --git a/packages/core/client/src/modules/actions/link/customizeLinkActionSettings.tsx b/packages/core/client/src/modules/actions/link/customizeLinkActionSettings.tsx index c5a0cb87c8..de1c577861 100644 --- a/packages/core/client/src/modules/actions/link/customizeLinkActionSettings.tsx +++ b/packages/core/client/src/modules/actions/link/customizeLinkActionSettings.tsx @@ -16,12 +16,14 @@ import { useSchemaToolbar } from '../../../application'; import { SchemaSettings } from '../../../application/schema-settings/SchemaSettings'; import { useCollection_deprecated } from '../../../collection-manager'; import { ButtonEditor, RemoveButton } from '../../../schema-component/antd/action/Action.Designer'; +import { useCollectionManager_deprecated } from '../../../collection-manager'; import { SchemaSettingsLinkageRules, SchemaSettingsModalItem, SchemaSettingAccessControl, } from '../../../schema-settings'; import { useURLAndHTMLSchema } from './useURLAndHTMLSchema'; +import { useDataBlockProps } from '../../../data-source'; export const SchemaSettingsActionLinkItem: FC = () => { const field = useField(); @@ -96,14 +98,18 @@ export const customizeLinkActionSettings = new SchemaSettings({ Component: SchemaSettingsLinkageRules, useVisible() { const record = useCollectionRecord(); - return !_.isEmpty(record?.data); + const { association } = useDataBlockProps() || {}; + return !_.isEmpty(record?.data) || !!association; }, useComponentProps() { const { name } = useCollection_deprecated(); const { linkageRulesProps } = useSchemaToolbar(); + const { association } = useDataBlockProps() || {}; + const { getCollectionField } = useCollectionManager_deprecated(); + const associationField = getCollectionField(association); return { ...linkageRulesProps, - collectionName: name, + collectionName: associationField?.collectionName || name, }; }, }, diff --git a/packages/core/client/src/modules/actions/view-edit-popup/customizePopupActionSettings.tsx b/packages/core/client/src/modules/actions/view-edit-popup/customizePopupActionSettings.tsx index 4e86e008d8..985c3e02e9 100644 --- a/packages/core/client/src/modules/actions/view-edit-popup/customizePopupActionSettings.tsx +++ b/packages/core/client/src/modules/actions/view-edit-popup/customizePopupActionSettings.tsx @@ -6,17 +6,17 @@ * 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 { useFieldSchema } from '@formily/react'; +import { isEmpty } from 'lodash'; import { useSchemaToolbar } from '../../../application'; import { SchemaSettings } from '../../../application/schema-settings/SchemaSettings'; -import { useCollection_deprecated } from '../../../collection-manager'; -import { useCollection } from '../../../data-source'; +import { useCollection_deprecated, useCollectionManager_deprecated } from '../../../collection-manager'; +import { useCollection, useDataBlockProps } from '../../../data-source'; import { ButtonEditor, RemoveButton } from '../../../schema-component/antd/action/Action.Designer'; import { SchemaSettingOpenModeSchemaItems } from '../../../schema-items'; import { SchemaSettingsLinkageRules, SchemaSettingAccessControl } from '../../../schema-settings'; import { useOpenModeContext } from '../../popup/OpenModeProvider'; import { useCurrentPopupRecord } from '../../variable/variablesProvider/VariablePopupRecordProvider'; +import { useCollectionRecord } from '../../../'; export const customizePopupActionSettings = new SchemaSettings({ name: 'actionSettings:popup', @@ -35,15 +35,22 @@ export const customizePopupActionSettings = new SchemaSettings({ useComponentProps() { const { name } = useCollection_deprecated(); const { linkageRulesProps } = useSchemaToolbar(); + const { association } = useDataBlockProps() || {}; + const { getCollectionField } = useCollectionManager_deprecated(); + const associationField = getCollectionField(association); return { ...linkageRulesProps, - collectionName: name, + collectionName: associationField?.collectionName || name, }; }, useVisible() { const { collection } = useCurrentPopupRecord() || {}; const currentCollection = useCollection(); - return !collection || collection?.name === currentCollection?.name; + const record = useCollectionRecord(); + const { association } = useDataBlockProps() || {}; + return ( + (!isEmpty(record?.data) && (!collection || collection?.name === currentCollection?.name)) || !!association + ); }, }, { diff --git a/packages/core/client/src/schema-component/antd/action/Action.tsx b/packages/core/client/src/schema-component/antd/action/Action.tsx index 22a168b62b..eb78cc1296 100644 --- a/packages/core/client/src/schema-component/antd/action/Action.tsx +++ b/packages/core/client/src/schema-component/antd/action/Action.tsx @@ -20,6 +20,7 @@ import { ErrorFallback, StablePopover, TabsContextProvider, useActionContext } f import { useDesignable } from '../../'; import { useACLActionParamsContext } from '../../../acl'; import { + useCollectionParentRecord, useCollectionParentRecordData, useCollectionRecordData, useDataBlockRequestGetter, @@ -89,12 +90,15 @@ export const Action: ComposedAction = withDynamicSchemaProps( const fieldSchema = useFieldSchema(); const compile = useCompile(); const recordData = useCollectionRecordData(); + const parentRecord = useCollectionParentRecord(); const confirm = compile(fieldSchema['x-component-props']?.confirm) || propsConfirm; const linkageRules = useMemo(() => fieldSchema?.['x-linkage-rules'] || [], [fieldSchema?.['x-linkage-rules']]); const { designable } = useDesignable(); const tarComponent = useComponent(component) || component; const variables = useVariables(); - const localVariables = useLocalVariables({ currentForm: { values: recordData, readPretty: false } as any }); + const localVariables = useLocalVariables({ + currentForm: { values: recordData || parentRecord?.data, readPretty: false } as any, + }); const { visibleWithURL, setVisibleWithURL } = usePopupUtils(); const { setSubmitted } = useActionContext(); const { getAriaLabel } = useGetAriaLabelOfAction(title); diff --git a/packages/plugins/@nocobase/plugin-action-bulk-edit/src/client/BulkEditAction.Settings.tsx b/packages/plugins/@nocobase/plugin-action-bulk-edit/src/client/BulkEditAction.Settings.tsx index 713d5f0c1b..1e335c492e 100644 --- a/packages/plugins/@nocobase/plugin-action-bulk-edit/src/client/BulkEditAction.Settings.tsx +++ b/packages/plugins/@nocobase/plugin-action-bulk-edit/src/client/BulkEditAction.Settings.tsx @@ -21,6 +21,9 @@ import { SecondConFirm, AfterSuccess, RefreshDataBlockRequest, + SchemaSettingsLinkageRules, + useDataBlockProps, + useCollectionManager_deprecated, } from '@nocobase/client'; import { ModalProps } from 'antd'; import { isValid } from '@formily/shared'; @@ -158,6 +161,24 @@ export const bulkEditActionSettings = new SchemaSettings({ name: 'updateMode', Component: UpdateMode, }, + { + name: 'linkageRules', + Component: SchemaSettingsLinkageRules, + useVisible() { + const { association } = useDataBlockProps() || {}; + return !!association; + }, + useComponentProps() { + const { association } = useDataBlockProps() || {}; + const { getCollectionField } = useCollectionManager_deprecated(); + const associationField = getCollectionField(association); + const { linkageRulesProps } = useSchemaToolbar(); + return { + ...linkageRulesProps, + collectionName: associationField?.collectionName, + }; + }, + }, { name: 'remove', sort: 100, diff --git a/packages/plugins/@nocobase/plugin-action-bulk-update/src/client/BulkUpdateAction.Settings.tsx b/packages/plugins/@nocobase/plugin-action-bulk-update/src/client/BulkUpdateAction.Settings.tsx index 894faaaf7d..654aedfdcd 100644 --- a/packages/plugins/@nocobase/plugin-action-bulk-update/src/client/BulkUpdateAction.Settings.tsx +++ b/packages/plugins/@nocobase/plugin-action-bulk-update/src/client/BulkUpdateAction.Settings.tsx @@ -20,6 +20,9 @@ import { RefreshDataBlockRequest, useAfterSuccessOptions, useGlobalVariable, + SchemaSettingsLinkageRules, + useCollectionManager_deprecated, + useDataBlockProps, } from '@nocobase/client'; import { useTranslation } from 'react-i18next'; import React from 'react'; @@ -167,6 +170,24 @@ const schemaSettingsItems: SchemaSettingsItemType[] = [ }; }, }, + { + name: 'linkageRules', + Component: SchemaSettingsLinkageRules, + useVisible() { + const { association } = useDataBlockProps() || {}; + return !!association; + }, + useComponentProps() { + const { association } = useDataBlockProps() || {}; + const { getCollectionField } = useCollectionManager_deprecated(); + const associationField = getCollectionField(association); + const { linkageRulesProps } = useSchemaToolbar(); + return { + ...linkageRulesProps, + collectionName: associationField?.collectionName, + }; + }, + }, { name: 'remove', sort: 100, diff --git a/packages/plugins/@nocobase/plugin-action-custom-request/src/client/schemaSettings.ts b/packages/plugins/@nocobase/plugin-action-custom-request/src/client/schemaSettings.ts index ef4c43deb7..c74c1548a0 100644 --- a/packages/plugins/@nocobase/plugin-action-custom-request/src/client/schemaSettings.ts +++ b/packages/plugins/@nocobase/plugin-action-custom-request/src/client/schemaSettings.ts @@ -20,6 +20,8 @@ import { useCollectionRecord, useSchemaToolbar, SchemaSettingAccessControl, + useDataBlockProps, + useCollectionManager_deprecated, } from '@nocobase/client'; import { CustomRequestSettingsItem } from './components/CustomRequestActionDesigner'; @@ -42,14 +44,18 @@ export const customizeCustomRequestActionSettings = new SchemaSettings({ useComponentProps() { const { name } = useCollection() || {}; const { linkageRulesProps } = useSchemaToolbar(); + const { association } = useDataBlockProps(); + const { getCollectionField } = useCollectionManager_deprecated(); + const associationField = getCollectionField(association); return { ...linkageRulesProps, - collectionName: name, + collectionName: associationField?.collectionName || name, }; }, useVisible() { const record = useCollectionRecord(); - return record && record.data && !record?.isNew; + const { association } = useDataBlockProps() || {}; + return (record && record.data && !record?.isNew) || !!association; }, }, { diff --git a/packages/plugins/@nocobase/plugin-action-export/src/client/schemaSettings.ts b/packages/plugins/@nocobase/plugin-action-export/src/client/schemaSettings.ts index c1a066e16d..11779fa058 100644 --- a/packages/plugins/@nocobase/plugin-action-export/src/client/schemaSettings.ts +++ b/packages/plugins/@nocobase/plugin-action-export/src/client/schemaSettings.ts @@ -9,7 +9,15 @@ import { ArrayItems } from '@formily/antd-v5'; import { ISchema, useField, useFieldSchema } from '@formily/react'; -import { ButtonEditor, SchemaSettings, useDesignable, useSchemaToolbar } from '@nocobase/client'; +import { + ButtonEditor, + SchemaSettings, + useDesignable, + useSchemaToolbar, + SchemaSettingsLinkageRules, + useDataBlockProps, + useCollectionManager_deprecated, +} from '@nocobase/client'; import { useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useShared } from './useShared'; @@ -65,6 +73,24 @@ export const exportActionSchemaSettings = new SchemaSettings({ }; }, }, + { + name: 'linkageRules', + Component: SchemaSettingsLinkageRules, + useVisible() { + const { association } = useDataBlockProps() || {}; + return !!association; + }, + useComponentProps() { + const { association } = useDataBlockProps(); + const { getCollectionField } = useCollectionManager_deprecated(); + const associationField = getCollectionField(association); + const { linkageRulesProps } = useSchemaToolbar(); + return { + ...linkageRulesProps, + collectionName: associationField?.collectionName, + }; + }, + }, { name: 'divider', type: 'divider', diff --git a/packages/plugins/@nocobase/plugin-action-import/src/client/schemaSettings.tsx b/packages/plugins/@nocobase/plugin-action-import/src/client/schemaSettings.tsx index 968667acf0..091f0d91d3 100644 --- a/packages/plugins/@nocobase/plugin-action-import/src/client/schemaSettings.tsx +++ b/packages/plugins/@nocobase/plugin-action-import/src/client/schemaSettings.tsx @@ -9,7 +9,16 @@ import { ArrayItems } from '@formily/antd-v5'; import { ISchema, useField, useFieldSchema } from '@formily/react'; -import { ButtonEditor, SchemaSettings, type, useDesignable, useSchemaToolbar } from '@nocobase/client'; +import { + ButtonEditor, + SchemaSettings, + type, + useDesignable, + useSchemaToolbar, + SchemaSettingsLinkageRules, + useDataBlockProps, + useCollectionManager_deprecated, +} from '@nocobase/client'; import { useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useShared } from './useShared'; @@ -72,6 +81,24 @@ export const importActionSchemaSettings = new SchemaSettings({ }; }, }, + { + name: 'linkageRules', + Component: SchemaSettingsLinkageRules, + useVisible() { + const { association } = useDataBlockProps() || {}; + return !!association; + }, + useComponentProps() { + const { association } = useDataBlockProps(); + const { getCollectionField } = useCollectionManager_deprecated(); + const associationField = getCollectionField(association); + const { linkageRulesProps } = useSchemaToolbar(); + return { + ...linkageRulesProps, + collectionName: associationField?.collectionName, + }; + }, + }, { name: 'divider', type: 'divider',