diff --git a/packages/core/client/src/block-provider/BlockProvider.tsx b/packages/core/client/src/block-provider/BlockProvider.tsx index 66f289a1a0..9c2adab0f5 100644 --- a/packages/core/client/src/block-provider/BlockProvider.tsx +++ b/packages/core/client/src/block-provider/BlockProvider.tsx @@ -289,13 +289,14 @@ export const useBlockAssociationContext = () => { return useContext(BlockAssociationContext) || association; }; -export const useFilterByTk = () => { +export const useFilterByTk = (blockProps?: any) => { const { resource, __parent } = useBlockRequestContext(); const recordIndex = useRecordIndex(); const recordData = useCollectionRecordData(); const collection = useCollection_deprecated(); const { getCollectionField } = useCollectionManager_deprecated(); - const assoc = useBlockAssociationContext(); + const association = useBlockAssociationContext(); + const assoc = blockProps?.association || association; const withoutTableFieldResource = useContext(WithoutTableFieldResource); if (!withoutTableFieldResource) { @@ -344,8 +345,8 @@ export const useSourceIdFromParentRecord = () => { * @internal * @returns */ -export const useParamsFromRecord = () => { - const filterByTk = useFilterByTk(); +export const useParamsFromRecord = (props?: any) => { + const filterByTk = useFilterByTk(props); const record = useRecord(); const { fields } = useCollection_deprecated(); const fieldSchema = useFieldSchema(); diff --git a/packages/core/client/src/modules/blocks/data-blocks/details-single/hooks/useDetailsDecoratorProps.ts b/packages/core/client/src/modules/blocks/data-blocks/details-single/hooks/useDetailsDecoratorProps.ts index 20d4967f6b..ff33c98512 100644 --- a/packages/core/client/src/modules/blocks/data-blocks/details-single/hooks/useDetailsDecoratorProps.ts +++ b/packages/core/client/src/modules/blocks/data-blocks/details-single/hooks/useDetailsDecoratorProps.ts @@ -20,7 +20,7 @@ import { * @returns */ export function useDetailsDecoratorProps(props) { - const params = useParamsFromRecord(); + const params = useParamsFromRecord(props); let parentRecord; // association 的值是固定不变的,所以可以在条件中使用 hooks diff --git a/packages/core/client/src/schema-component/antd/association-field/InternalViewer.tsx b/packages/core/client/src/schema-component/antd/association-field/InternalViewer.tsx index 0183ad36ad..c9d1517343 100644 --- a/packages/core/client/src/schema-component/antd/association-field/InternalViewer.tsx +++ b/packages/core/client/src/schema-component/antd/association-field/InternalViewer.tsx @@ -10,8 +10,8 @@ import { observer, RecursionField, useField, useFieldSchema } from '@formily/react'; import { toArr } from '@formily/shared'; import _ from 'lodash'; -import React, { FC, Fragment, useEffect, useRef, useState } from 'react'; -import { useDesignable } from '../../'; +import React, { FC, Fragment, useCallback, useEffect, useRef, useState } from 'react'; +import { useDesignable, usePopupSettings } from '../../'; import { WithoutTableFieldResource } from '../../../block-provider'; import { CollectionRecordProvider, useCollectionManager, useCollectionRecordData } from '../../../data-source'; import { useOpenModeContext } from '../../../modules/popup/OpenModeProvider'; @@ -47,6 +47,7 @@ export interface ButtonListProps { label: string; value: string; }; + onClick?: (props: { recordData: any }) => void; } const RenderRecord = React.memo( @@ -66,6 +67,7 @@ const RenderRecord = React.memo( ellipsisWithTooltipRef, value, setBtnHover, + onClick, }: { fieldNames: any; isTreeCollection: boolean; @@ -82,6 +84,7 @@ const RenderRecord = React.memo( ellipsisWithTooltipRef: React.MutableRefObject; value: any; setBtnHover: any; + onClick?: (props: { recordData: any }) => void; }) => { const [loading, setLoading] = useState(true); const [result, setResult] = useState([]); @@ -126,6 +129,7 @@ const RenderRecord = React.memo( } if (fieldSchema.properties) { + onClick?.({ recordData: record }); openPopup({ recordData: record, parentRecordData: recordData, @@ -209,6 +213,7 @@ const ButtonLinkList: FC = (props) => { ellipsisWithTooltipRef={ellipsisWithTooltipRef} value={props.value} setBtnHover={props.setBtnHover} + onClick={props.onClick} /> ); }; @@ -254,12 +259,18 @@ export const ReadPrettyInternalViewer: React.FC = observer( const { visibleWithURL, setVisibleWithURL } = usePopupUtils(); const [btnHover, setBtnHover] = useState(!!visibleWithURL); const { defaultOpenMode } = useOpenModeContext(); - const recordData = useCollectionRecordData(); + const parentRecordData = useCollectionRecordData(); + const [recordData, setRecordData] = useState(null); + const { isPopupVisibleControlledByURL } = usePopupSettings(); + + const onClickItem = useCallback((props: { recordData: any }) => { + setRecordData(props.recordData); + }, []); const btnElement = ( - - + + ); @@ -268,21 +279,43 @@ export const ReadPrettyInternalViewer: React.FC = observer( return btnElement; } - const renderWithoutTableFieldResourceProvider = () => ( - // The recordData here is only provided when the popup is opened, not the current row record - - - { - return s['x-component'] === 'AssociationField.Viewer'; - }} - /> - - - ); + const renderWithoutTableFieldResourceProvider = () => { + if (isPopupVisibleControlledByURL()) { + return ( + // The recordData here is only provided when the popup is opened, not the current row record + + + { + return s['x-component'] === 'AssociationField.Viewer'; + }} + /> + + + ); + } + + return ( + + {/* The recordData here is only provided when the popup is opened, not the current row record */} + + + { + return s['x-component'] === 'AssociationField.Viewer'; + }} + /> + + + + ); + }; return (