diff --git a/packages/core/client/src/flag-provider/FlagProvider.tsx b/packages/core/client/src/flag-provider/FlagProvider.tsx index 229bfb5dd..b6cedae68 100644 --- a/packages/core/client/src/flag-provider/FlagProvider.tsx +++ b/packages/core/client/src/flag-provider/FlagProvider.tsx @@ -1,4 +1,4 @@ -import React, { useMemo } from 'react'; +import React from 'react'; export interface FlagProviderProps { /** @@ -13,19 +13,19 @@ export interface FlagProviderProps { * 是否存在于 `表单数据模板` 中 */ isInFormDataTemplate?: boolean; + /** + * 是否存在于 `子表格` 中 + */ + isInSubTable?: boolean; + /** + * 是否存在于 `子表单` 中 + */ + isInSubForm?: boolean; children: any; } export const FlagContext = React.createContext<Omit<FlagProviderProps, 'children'>>(null); export const FlagProvider = (props: FlagProviderProps) => { - const value = useMemo(() => { - return { - isInAssignFieldValues: props.isInAssignFieldValues, - isInSetDefaultValueDialog: props.isInSetDefaultValueDialog, - isInFormDataTemplate: props.isInFormDataTemplate, - }; - }, [props.isInAssignFieldValues, props.isInFormDataTemplate, props.isInSetDefaultValueDialog]); - - return <FlagContext.Provider value={value}>{props.children}</FlagContext.Provider>; + return <FlagContext.Provider value={props}>{props.children}</FlagContext.Provider>; }; diff --git a/packages/core/client/src/schema-component/antd/association-field/Nester.tsx b/packages/core/client/src/schema-component/antd/association-field/Nester.tsx index 802bf6f29..8c85bfe86 100644 --- a/packages/core/client/src/schema-component/antd/association-field/Nester.tsx +++ b/packages/core/client/src/schema-component/antd/association-field/Nester.tsx @@ -9,6 +9,7 @@ import { Button, Card, Divider, Tooltip } from 'antd'; import React, { useCallback, useContext } from 'react'; import { useTranslation } from 'react-i18next'; import { FormActiveFieldsProvider } from '../../../block-provider'; +import { FlagProvider } from '../../../flag-provider'; import { RecordIndexProvider, RecordProvider } from '../../../record-provider'; import { isPatternDisabled, isSystemField } from '../../../schema-settings'; import { @@ -23,10 +24,18 @@ import { useAssociationFieldContext } from './hooks'; export const Nester = (props) => { const { options } = useContext(AssociationFieldContext); if (['hasOne', 'belongsTo'].includes(options.type)) { - return <ToOneNester {...props} />; + return ( + <FlagProvider isInSubForm> + <ToOneNester {...props} /> + </FlagProvider> + ); } if (['hasMany', 'belongsToMany'].includes(options.type)) { - return <ToManyNester {...props} />; + return ( + <FlagProvider isInSubForm> + <ToManyNester {...props} /> + </FlagProvider> + ); } return null; }; diff --git a/packages/core/client/src/schema-component/antd/association-field/SubTable.tsx b/packages/core/client/src/schema-component/antd/association-field/SubTable.tsx index 199eabe8c..0fd73eadc 100644 --- a/packages/core/client/src/schema-component/antd/association-field/SubTable.tsx +++ b/packages/core/client/src/schema-component/antd/association-field/SubTable.tsx @@ -8,6 +8,7 @@ import { isArr } from '@formily/shared'; import { Button } from 'antd'; import React from 'react'; import { FormActiveFieldsProvider } from '../../../block-provider'; +import { FlagProvider } from '../../../flag-provider'; import { useSubTableSpecialCase } from '../form-item/hooks/useSpecialCase'; import { Table } from '../table-v2/Table'; import { useAssociationFieldContext } from './hooks'; @@ -62,46 +63,48 @@ export const SubTable: any = observer( } `} > - <FormActiveFieldsProvider name="nester"> - <Table - className={css` - .ant-formily-item.ant-formily-item-feedback-layout-loose { - margin-bottom: 0px !important; + <FlagProvider isInSubTable> + <FormActiveFieldsProvider name="nester"> + <Table + className={css` + .ant-formily-item.ant-formily-item-feedback-layout-loose { + margin-bottom: 0px !important; + } + .ant-formily-editable { + vertical-align: sub; + } + `} + bordered + size={'small'} + field={field} + showIndex + dragSort={field.editable} + showDel={field.editable} + pagination={false} + rowSelection={{ type: 'none', hideSelectAll: true }} + footer={() => + field.editable && ( + <Button + type={'text'} + block + className={css` + display: block; + `} + onClick={() => { + field.value = field.value || []; + field.value.push({}); + field.onInput(field.value); + }} + icon={<PlusOutlined />} + > + {/* {t('Add new')} */} + </Button> + ) } - .ant-formily-editable { - vertical-align: sub; - } - `} - bordered - size={'small'} - field={field} - showIndex - dragSort={field.editable} - showDel={field.editable} - pagination={false} - rowSelection={{ type: 'none', hideSelectAll: true }} - footer={() => - field.editable && ( - <Button - type={'text'} - block - className={css` - display: block; - `} - onClick={() => { - field.value = field.value || []; - field.value.push({}); - field.onInput(field.value); - }} - icon={<PlusOutlined />} - > - {/* {t('Add new')} */} - </Button> - ) - } - isSubTable={true} - /> - </FormActiveFieldsProvider> + isSubTable={true} + /> + </FormActiveFieldsProvider> + </FlagProvider> </div> ); }, diff --git a/packages/core/client/src/schema-settings/SchemaSettings.tsx b/packages/core/client/src/schema-settings/SchemaSettings.tsx index bb063cfc8..3bc328b6d 100644 --- a/packages/core/client/src/schema-settings/SchemaSettings.tsx +++ b/packages/core/client/src/schema-settings/SchemaSettings.tsx @@ -78,7 +78,7 @@ import { isSameCollection, useSupportedBlocks, } from '../filter-provider/utils'; -import { FlagProvider } from '../flag-provider'; +import { FlagProvider, useFlag } from '../flag-provider'; import { useCollectMenuItem, useCollectMenuItems, useMenuItem } from '../hooks/useMenuItem'; import { getTargetKey } from '../schema-component/antd/association-filter/utilts'; import { DynamicComponentProps } from '../schema-component/antd/filter/DynamicComponent'; @@ -1555,6 +1555,7 @@ SchemaSettings.DefaultValue = function DefaultValueConfigure(props: { fieldSchem const record = useRecord(); const { form } = useFormBlockContext(); const currentFormFields = useCollectionFilterOptions(collection); + const { isInSubForm, isInSubTable } = useFlag() || {}; const { name } = collection; const collectionField = getField(fieldSchema['name']) || getCollectionJoinField(fieldSchema['x-collection-field']); @@ -1596,7 +1597,7 @@ SchemaSettings.DefaultValue = function DefaultValueConfigure(props: { fieldSchem FormLayout, VariableInput: (props) => { return ( - <FlagProvider isInSetDefaultValueDialog={true}> + <FlagProvider isInSubForm={isInSubForm} isInSubTable={isInSubTable} isInSetDefaultValueDialog> <VariableInput {...props} /> </FlagProvider> ); @@ -1825,6 +1826,7 @@ SchemaSettings.DataScope = function DataScopeConfigure(props: DataScopeProps) { const variables = useVariables(); const localVariables = useLocalVariables(); const { getAllCollectionsInheritChain } = useCollectionManager(); + const { isInSubForm, isInSubTable } = useFlag() || {}; const dynamicComponent = (props: DynamicComponentProps) => { return ( @@ -1855,7 +1857,13 @@ SchemaSettings.DataScope = function DataScopeConfigure(props: DataScopeProps) { properties: { filter: { enum: props.collectionFilterOption || options, - 'x-decorator': BaseVariableProvider, + 'x-decorator': (props) => ( + <BaseVariableProvider {...props}> + <FlagProvider isInSubForm={isInSubForm} isInSubTable={isInSubTable}> + {props.children} + </FlagProvider> + </BaseVariableProvider> + ), 'x-decorator-props': { isDisabled, }, diff --git a/packages/core/client/src/schema-settings/VariableInput/hooks/useVariableOptions.ts b/packages/core/client/src/schema-settings/VariableInput/hooks/useVariableOptions.ts index 3017f1848..192349ec5 100644 --- a/packages/core/client/src/schema-settings/VariableInput/hooks/useVariableOptions.ts +++ b/packages/core/client/src/schema-settings/VariableInput/hooks/useVariableOptions.ts @@ -2,7 +2,7 @@ import { Form } from '@formily/core'; import { ISchema, Schema } from '@formily/react'; import { useMemo } from 'react'; import { useFormBlockType } from '../../../block-provider/FormBlockProvider'; -import { CollectionFieldOptions } from '../../../collection-manager'; +import { CollectionFieldOptions, useCollection } from '../../../collection-manager'; import { useFlag } from '../../../flag-provider'; import { useBlockCollection } from './useBlockCollection'; import { useDateVariable } from './useDateVariable'; @@ -46,10 +46,9 @@ export const useVariableOptions = ({ targetFieldSchema, }: Props) => { const { name: blockCollectionName } = useBlockCollection(); - const { isInSetDefaultValueDialog } = useFlag() || {}; + const { isInSubForm, isInSubTable } = useFlag() || {}; const { type: formBlockType } = useFormBlockType(); - - const fieldCollectionName = collectionField?.collectionName; + const { name } = useCollection(); const userVariable = useUserVariable({ maxDepth: 3, uiSchema: uiSchema, @@ -66,7 +65,7 @@ export const useVariableOptions = ({ targetFieldSchema, }); const iterationVariable = useIterationVariable({ - currentCollection: fieldCollectionName, + currentCollection: name, collectionField, schema: uiSchema, noDisabled, @@ -85,12 +84,7 @@ export const useVariableOptions = ({ userVariable, dateVariable, form && !form.readPretty && formVariable, - form && - fieldCollectionName && - blockCollectionName && - fieldCollectionName !== blockCollectionName && - isInSetDefaultValueDialog && - iterationVariable, + (isInSubForm || isInSubTable) && iterationVariable, formBlockType === 'update' && currentRecordVariable, ].filter(Boolean); }, [ @@ -98,9 +92,8 @@ export const useVariableOptions = ({ dateVariable, form, formVariable, - fieldCollectionName, - blockCollectionName, - isInSetDefaultValueDialog, + isInSubForm, + isInSubTable, iterationVariable, currentRecordVariable, ]);