index.tsx 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import { Editable, FormItem, FormLayout, Input, Select } from '@formily/antd';
  2. import type { ISchema } from '@formily/react';
  3. import { createSchemaField } from '@formily/react';
  4. interface Props {
  5. config: MetadataConfig[];
  6. }
  7. const ConfigParam = (props: Props) => {
  8. const SchemaField = createSchemaField({
  9. components: {
  10. FormItem,
  11. Input,
  12. Select,
  13. Editable,
  14. FormLayout,
  15. },
  16. });
  17. const formatConfig = (config: MetadataConfig[]) => {
  18. if (!config) return {};
  19. return config.reduce((acc, t) => {
  20. const { properties } = t;
  21. const configSchema = properties.reduce((cur, i) => {
  22. return {
  23. ...cur,
  24. [i.property]: {
  25. title: i.name,
  26. 'x-decorator': 'FormItem',
  27. // 判断type 类型
  28. 'x-component': 'Select',
  29. enum: i.type.elements.map((e) => ({
  30. label: e.text,
  31. value: e.value,
  32. })),
  33. },
  34. };
  35. }, {});
  36. return {
  37. ...acc,
  38. [t.name]: {
  39. type: 'void',
  40. title: t.name,
  41. 'x-component': 'FormLayout',
  42. 'x-component-props': {
  43. layout: 'vertical',
  44. },
  45. 'x-decorator': 'Editable.Popover',
  46. 'x-decorator-props': {
  47. className: 'config-array',
  48. placement: 'left',
  49. },
  50. properties: configSchema,
  51. },
  52. };
  53. }, {});
  54. };
  55. const schema: ISchema = {
  56. type: 'object',
  57. properties: formatConfig(props.config),
  58. };
  59. return <SchemaField schema={schema} />;
  60. };
  61. export default ConfigParam;