From 8d06b73c480a6e3deeaadc93c3e9828af59f6c99 Mon Sep 17 00:00:00 2001 From: katherinehhh Date: Wed, 17 Jan 2024 11:16:19 +0800 Subject: [PATCH] fix: varibales as & &Iteration is not correct in record picker (#3399) --- .../src/block-provider/FormBlockProvider.tsx | 3 +- .../antd/association-field/InternalPicker.tsx | 5 ++- .../antd/table-v2/TableSelectorDesigner.tsx | 37 ++++++++++++++++--- .../VariableInput/VariableInput.tsx | 18 ++++++++- .../VariableInput/hooks/useVariableOptions.ts | 10 ++++- 5 files changed, 62 insertions(+), 11 deletions(-) diff --git a/packages/core/client/src/block-provider/FormBlockProvider.tsx b/packages/core/client/src/block-provider/FormBlockProvider.tsx index 14dbd500b..b89173114 100644 --- a/packages/core/client/src/block-provider/FormBlockProvider.tsx +++ b/packages/core/client/src/block-provider/FormBlockProvider.tsx @@ -15,7 +15,7 @@ export const FormBlockContext = createContext({}); const InternalFormBlockProvider = (props) => { const ctx = useFormBlockContext(); - const { action, readPretty, params, association } = props; + const { action, readPretty, params, association, collection } = props; const field = useField(); const form = useMemo( () => @@ -40,6 +40,7 @@ const InternalFormBlockProvider = (props) => { resource, updateAssociationValues, formBlockRef, + collectionName: collection, }; }, [action, field, form, params, resource, service, updateAssociationValues]); diff --git a/packages/core/client/src/schema-component/antd/association-field/InternalPicker.tsx b/packages/core/client/src/schema-component/antd/association-field/InternalPicker.tsx index 0862b66e4..050b3aa1a 100644 --- a/packages/core/client/src/schema-component/antd/association-field/InternalPicker.tsx +++ b/packages/core/client/src/schema-component/antd/association-field/InternalPicker.tsx @@ -14,12 +14,13 @@ import { TableSelectorParamsProvider, useTableSelectorProps as useTsp, } from '../../../block-provider/TableSelectorProvider'; -import { CollectionProvider } from '../../../collection-manager'; +import { CollectionProvider, useCollection } from '../../../collection-manager'; import { useCompile } from '../../hooks'; import { ActionContextProvider } from '../action'; import { useAssociationFieldContext, useFieldNames, useInsertSchema } from './hooks'; import schema from './schema'; import { flatData, getLabelFormatValue, useLabelUiSchema } from './util'; +import { useFormBlockContext } from '../../../block-provider/FormBlockProvider'; export const useTableSelectorProps = () => { const field: any = useField(); @@ -69,6 +70,7 @@ export const InternalPicker = observer( const fieldSchema = useFieldSchema(); const insertSelector = useInsertSchema('Selector'); const { options: collectionField } = useAssociationFieldContext(); + const { collectionName } = useFormBlockContext(); const compile = useCompile(); const labelUiSchema = useLabelUiSchema(collectionField, fieldNames?.label || 'label'); const isAllowAddNew = fieldSchema['x-add-new']; @@ -99,6 +101,7 @@ export const InternalPicker = observer( selectedRows, setSelectedRows, collectionField, + currentFormCollection: collectionName, }; const getValue = () => { diff --git a/packages/core/client/src/schema-component/antd/table-v2/TableSelectorDesigner.tsx b/packages/core/client/src/schema-component/antd/table-v2/TableSelectorDesigner.tsx index ee4137423..774b23ec2 100644 --- a/packages/core/client/src/schema-component/antd/table-v2/TableSelectorDesigner.tsx +++ b/packages/core/client/src/schema-component/antd/table-v2/TableSelectorDesigner.tsx @@ -1,12 +1,14 @@ import { ArrayItems } from '@formily/antd-v5'; import { ISchema, useField, useFieldSchema } from '@formily/react'; -import { cloneDeep } from 'lodash'; -import React from 'react'; +import _ from 'lodash'; +import React, { useContext } from 'react'; import { useTranslation } from 'react-i18next'; import { useFormBlockContext, useTableSelectorContext } from '../../../block-provider'; import { recursiveParent } from '../../../block-provider/TableSelectorProvider'; import { useCollection, useCollectionManager } from '../../../collection-manager'; import { useSortFields } from '../../../collection-manager/action-hooks'; +import { useRecord } from '../../../record-provider'; +import { useLocalVariables, useVariables } from '../../../variables'; import { GeneralSchemaDesigner, SchemaSettingsDataScope, @@ -19,10 +21,13 @@ import { import { useSchemaTemplate } from '../../../schema-templates'; import { useDesignable } from '../../hooks'; import { removeNullCondition } from '../filter'; +import { VariableInput, getShouldChange } from '../../../schema-settings/VariableInput/VariableInput'; +import { RecordPickerContext } from '../../antd/record-picker'; export const TableSelectorDesigner = () => { const { name, title } = useCollection(); - const { getCollectionJoinField } = useCollectionManager(); + const { getCollectionJoinField, getAllCollectionsInheritChain } = useCollectionManager(); + const field = useField(); const fieldSchema = useFieldSchema(); const { form } = useFormBlockContext(); @@ -47,10 +52,13 @@ export const TableSelectorDesigner = () => { const template = useSchemaTemplate(); const collection = useCollection(); const { dragSort } = field.decoratorProps; + const record = useRecord(); + const variables = useVariables(); + const { currentFormCollection } = useContext(RecordPickerContext); + const localVariables = useLocalVariables({ collectionName: currentFormCollection }); return ( { @@ -59,7 +67,7 @@ export const TableSelectorDesigner = () => { params.filter = filter; field.decoratorProps.params = params; fieldSchema['x-decorator-props']['params'] = params; - let serviceFilter = cloneDeep(filter); + let serviceFilter = _.cloneDeep(filter); if (extraFilter) { if (serviceFilter) { serviceFilter = { @@ -77,6 +85,25 @@ export const TableSelectorDesigner = () => { }, }); }} + collectionName={name} + dynamicComponent={(props) => { + return ( + + ); + }} /> {collection?.tree && collectionField?.target === collectionField?.collectionName && ( { record, returnScope = _.identity, targetFieldSchema, + currentFormCollectionName, + currentIterationCollectionName, } = props; const { name: blockCollectionName } = useBlockCollection(); const scope = useVariableScope(); const { operator, schema: uiSchema = collectionField?.uiSchema } = useValues(); - const variableOptions = useVariableOptions({ collectionField, form, record, operator, uiSchema, targetFieldSchema }); + const variableOptions = useVariableOptions({ + collectionField, + form, + record, + operator, + uiSchema, + targetFieldSchema, + currentFormCollectionName, + currentIterationCollectionName, + }); const contextVariable = useContextAssociationFields({ schema, maxDepth: 2, contextCollectionName, collectionField }); const { compatOldVariables } = useCompatOldVariables({ collectionField, @@ -115,7 +130,6 @@ export const VariableInput = (props: Props) => { }, [onChange, shouldChange], ); - return ( { const { name: blockCollectionName = record?.__collectionName } = useBlockCollection(); const { isInSubForm, isInSubTable } = useFlag() || {}; @@ -68,13 +74,13 @@ export const useVariableOptions = ({ const dateVariable = useDateVariable({ operator, schema: uiSchema, noDisabled }); const formVariable = useFormVariable({ schema: uiSchema, - collectionName: blockCollectionName, + collectionName: currentFormCollectionName || blockCollectionName, collectionField, noDisabled, targetFieldSchema, }); const iterationVariable = useIterationVariable({ - currentCollection: name, + currentCollection: currentIterationCollectionName || name, collectionField, schema: uiSchema, noDisabled,