diff --git a/packages/client/src/collection-manager/CollectionField.tsx b/packages/client/src/collection-manager/CollectionField.tsx index c29655f5f8..faa745c06e 100644 --- a/packages/client/src/collection-manager/CollectionField.tsx +++ b/packages/client/src/collection-manager/CollectionField.tsx @@ -1,5 +1,6 @@ import { Field } from '@formily/core'; import { connect, useField, useFieldSchema } from '@formily/react'; +import { merge } from '@formily/shared'; import React, { useEffect } from 'react'; import { useCompile, useComponent } from '..'; import { CollectionFieldProvider } from './CollectionFieldProvider'; @@ -33,7 +34,9 @@ const InternalField: React.FC = (props) => { setRequired(); // @ts-ignore field.dataSource = uiSchema.enum; - field.component = [component, uiSchema['x-component-props']]; + const originalProps = compile(uiSchema['x-component-props']); + const componentProps = field.componentProps; + field.component = [component, merge(originalProps, componentProps)]; }, [uiSchema?.title, uiSchema?.description, uiSchema?.required]); if (!uiSchema) { return null; diff --git a/packages/client/src/collection-manager/action-hooks.ts b/packages/client/src/collection-manager/action-hooks.ts index d7eb10eee9..313ff9cda7 100644 --- a/packages/client/src/collection-manager/action-hooks.ts +++ b/packages/client/src/collection-manager/action-hooks.ts @@ -30,7 +30,7 @@ export const useCancelFilterAction = () => { export const useCollectionFilterOptions = (collectionName: string) => { const { getCollectionFields, getInterface } = useCollectionManager(); const fields = getCollectionFields(collectionName); - const field2option = (field) => { + const field2option = (field, nochildren) => { if (!field.interface) { return; } @@ -45,21 +45,24 @@ export const useCollectionFilterOptions = (collectionName: string) => { schema: field?.uiSchema, operators: operators || [], }; + if (nochildren) { + return option; + } if (children?.length) { option['children'] = children; } if (nested) { const targetFields = getCollectionFields(field.target); - const options = getOptions(targetFields); + const options = getOptions(targetFields, true); option['children'] = option['children'] || []; option['children'].push(...options); } return option; }; - const getOptions = (fields) => { + const getOptions = (fields, nochildren = false) => { const options = []; fields.forEach((field) => { - const option = field2option(field); + const option = field2option(field, nochildren); if (option) { options.push(option); } diff --git a/packages/client/src/collection-manager/types.ts b/packages/client/src/collection-manager/types.ts index 356df241ba..716b630cf4 100644 --- a/packages/client/src/collection-manager/types.ts +++ b/packages/client/src/collection-manager/types.ts @@ -32,4 +32,6 @@ export interface CollectionFieldOptions { collectionName?: string; sourceKey?: string; // association field uiSchema?: ISchema; + target?: string; + [key: string]: any; } diff --git a/packages/client/src/schema-component/antd/filter/Filter.tsx b/packages/client/src/schema-component/antd/filter/Filter.tsx index 5e73077620..33e04725e3 100644 --- a/packages/client/src/schema-component/antd/filter/Filter.tsx +++ b/packages/client/src/schema-component/antd/filter/Filter.tsx @@ -26,7 +26,7 @@ export const Filter: any = observer((props: any) => { -
{JSON.stringify(field.value, null, 2)}
+ {/*
{JSON.stringify(field.value, null, 2)}
*/} ); }); diff --git a/packages/client/src/schema-component/antd/form-item/FormItem.tsx b/packages/client/src/schema-component/antd/form-item/FormItem.tsx index 9d5ae654a2..5d5ba5cdda 100644 --- a/packages/client/src/schema-component/antd/form-item/FormItem.tsx +++ b/packages/client/src/schema-component/antd/form-item/FormItem.tsx @@ -1,5 +1,10 @@ import { FormItem as Item } from '@formily/antd'; +import { Field } from '@formily/core'; +import { ISchema, useField, useFieldSchema, useForm } from '@formily/react'; import React from 'react'; +import { useActionContext } from '..'; +import { useCompile, useDesignable } from '../..'; +import { useCollection, useCollectionManager } from '../../../collection-manager'; import { GeneralSchemaDesigner, SchemaSettings } from '../../../schema-settings'; import { BlockItem } from '../block-item'; @@ -12,8 +17,144 @@ export const FormItem: any = (props) => { }; FormItem.Designer = () => { + const { getCollectionFields } = useCollectionManager(); + const { getField } = useCollection(); + const field = useField(); + const fieldSchema = useFieldSchema(); + const { dn, reset, refresh } = useDesignable(); + const compile = useCompile(); + const collectionField = getField(fieldSchema['name']); + const originalTitle = collectionField?.uiSchema?.title; + const targetFields = collectionField.target ? getCollectionFields(collectionField.target) : []; + const initialValue = { + title: field.title === originalTitle ? undefined : field.title, + }; + if (!field.readPretty) { + initialValue['required'] = field.required; + } + const options = targetFields + .filter((field) => !field?.target && field.type !== 'boolean') + .map((field) => ({ + value: field?.name, + label: compile(field?.uiSchema?.title) || field?.name, + })); return ( + + {collectionField?.target && ( + { + const schema = { + ['x-uid']: fieldSchema['x-uid'], + }; + const fieldNames = { + ...field.componentProps.fieldNames, + label, + }; + fieldSchema['x-component-props']['fieldNames'] = fieldNames; + field.componentProps.fieldNames = fieldNames; + schema['x-component-props'] = { + fieldNames, + }; + dn.emit('patch', { + schema, + }); + dn.refresh(); + }} + /> + )} + = (props) => { + + ); }; SchemaSettings.SwitchItem = (props) => { return null; }; -SchemaSettings.Popup = (props) => { +SchemaSettings.PopupItem = (props) => { const { schema, ...others } = props; const [visible, setVisible] = useState(false); + const ctx = useContext(SchemaSettingsContext); return ( { + ctx.setVisible(false); setVisible(true); }} > @@ -150,12 +173,3 @@ SchemaSettings.Popup = (props) => { ); }; - -SchemaSettings.DrawerItem = (props) => { - const [visible, setVisible] = useState(false); - return ( - - {props.children || props.title} - - ); -};