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) => {