diff --git a/packages/core/client/src/schema-settings/VariableInput/hooks/useBaseVariable.tsx b/packages/core/client/src/schema-settings/VariableInput/hooks/useBaseVariable.tsx index 98f36ba8ee..53b38cb086 100644 --- a/packages/core/client/src/schema-settings/VariableInput/hooks/useBaseVariable.tsx +++ b/packages/core/client/src/schema-settings/VariableInput/hooks/useBaseVariable.tsx @@ -10,7 +10,8 @@ import { ISchema, Schema } from '@formily/json-schema'; import { Tooltip } from 'antd'; import React, { useContext, useMemo } from 'react'; -import { CollectionFieldOptions_deprecated, useCollectionManager_deprecated } from '../../../collection-manager'; +import { CollectionFieldOptions_deprecated } from '../../../collection-manager'; +import { useCollectionManager } from '../../../data-source/collection/CollectionManagerProvider'; import { useCompile, useGetFilterOptions } from '../../../schema-component'; import { isSpecialCaseField } from '../../../schema-component/antd/form-item/hooks/useSpecialCase'; import { FieldOption, Option } from '../type'; @@ -171,7 +172,7 @@ export const useBaseVariable = ({ const compile = useCompile(); const getFilterOptions = useGetFilterOptions(); const { isDisabled } = useContext(BaseVariableContext) || {}; - const { getCollectionField } = useCollectionManager_deprecated(dataSource); + const cm = useCollectionManager(); const loadChildren = (option: Option): Promise => { if (!option.field?.target) { @@ -192,7 +193,7 @@ export const useBaseVariable = ({ loadChildren, compile, isDisabled: isDisabled || isDisabledDefault, - getCollectionField, + getCollectionField: cm.getCollectionField, deprecated, }) || [] ) diff --git a/packages/core/client/src/variables/VariablesProvider.tsx b/packages/core/client/src/variables/VariablesProvider.tsx index e29e2646e9..e890868cce 100644 --- a/packages/core/client/src/variables/VariablesProvider.tsx +++ b/packages/core/client/src/variables/VariablesProvider.tsx @@ -28,10 +28,13 @@ import { uniq } from './utils/uniq'; export const VariablesContext = createContext(null); VariablesContext.displayName = 'VariablesContext'; -const variableToCollectionName: { - collectionName?: string; - dataSource?: string; -} = {}; +const variableToCollectionName: Record< + string, + { + collectionName?: string; + dataSource?: string; + } +> = {}; const getFieldPath = (variablePath: string, variableToCollectionName: Record) => { let dataSource; @@ -260,17 +263,18 @@ const VariablesProvider = ({ children }) => { localVariables = _.isArray(localVariables) ? localVariables : [localVariables]; } - const path = getPath(variableString); - const { fieldPath, dataSource } = getFieldPath( - path, - mergeVariableToCollectionNameWithLocalVariables(variableToCollectionName, localVariables as VariableOption[]), + const _variableToCollectionName = mergeVariableToCollectionNameWithLocalVariables( + variableToCollectionName, + localVariables as VariableOption[], ); + const path = getPath(variableString); + const { fieldPath, dataSource } = getFieldPath(path, _variableToCollectionName); let result = getCollectionJoinField(fieldPath, dataSource); // 当仅有一个例如 `$user` 这样的字符串时,需要拼一个假的 `collectionField` 返回 if (!result && !path.includes('.')) { result = { - target: variableToCollectionName[path]?.collectionName, + target: _variableToCollectionName[path]?.collectionName, }; } @@ -335,7 +339,13 @@ function mergeCtxWithLocalVariables(ctx: Record, localVariables?: V } function mergeVariableToCollectionNameWithLocalVariables( - variableToCollectionName: Record, + variableToCollectionName: Record< + string, + { + collectionName?: string; + dataSource?: string; + } + >, localVariables?: VariableOption[], ) { variableToCollectionName = { ...variableToCollectionName }; diff --git a/packages/core/client/src/variables/__tests__/useVariables.test.tsx b/packages/core/client/src/variables/__tests__/useVariables.test.tsx index 6ae1a65f48..116699e938 100644 --- a/packages/core/client/src/variables/__tests__/useVariables.test.tsx +++ b/packages/core/client/src/variables/__tests__/useVariables.test.tsx @@ -694,6 +694,36 @@ describe('useVariables', () => { }); }); + it('getCollectionFiled with only variable name', async () => { + const { result } = renderHook(() => useVariables(), { + wrapper: Providers, + }); + + await waitFor(async () => { + expect(await result.current.getCollectionField('{{ $user }}')).toEqual({ + target: 'users', + }); + }); + }); + + it('getCollectionFiled with local variable name', async () => { + const { result } = renderHook(() => useVariables(), { + wrapper: Providers, + }); + + await waitFor(async () => { + expect( + await result.current.getCollectionField('{{ $local }}', { + name: '$local', + ctx: {}, + collectionName: 'local', + }), + ).toEqual({ + target: 'local', + }); + }); + }); + it('getCollectionField with no exist variable', async () => { const { result } = renderHook(() => useVariables(), { wrapper: Providers,