import { useIntl } from 'umi'; import type { Field } from '@formily/core'; import { createForm } from '@formily/core'; import { createSchemaField } from '@formily/react'; import React from 'react'; import * as ICONS from '@ant-design/icons'; import { Form, FormGrid, FormItem, Input, Select } from '@formily/antd'; import type { ISchema } from '@formily/json-schema'; import { action } from '@formily/reactive'; import type { Response } from '@/utils/typings'; import { service } from '@/pages/system/Relationship'; import { Modal } from '@/components'; import { message } from 'antd'; interface Props { data: Partial; close: () => void; } const Save = (props: Props) => { const intl = useIntl(); const getTypes = () => service.getTypes(); const useAsyncDataSource = (api: any) => (field: Field) => { field.loading = true; api(field).then( action.bound!((resp: Response) => { field.dataSource = resp.result?.map((item: Record) => ({ ...item, label: item.name, value: JSON.stringify({ objectType: item.id, objectTypeName: item.name, }), })); field.loading = false; }), ); }; const form = createForm({ validateFirst: true, initialValues: props.data, }); const SchemaField = createSchemaField({ components: { FormItem, Input, Select, FormGrid, }, scope: { icon(name: any) { return React.createElement(ICONS[name]); }, }, }); const schema: ISchema = { type: 'object', properties: { layout: { type: 'void', 'x-decorator': 'FormGrid', 'x-decorator-props': { maxColumns: 2, minColumns: 2, columnGap: 24, }, properties: { name: { title: '名称', type: 'string', 'x-decorator': 'FormItem', 'x-component': 'Input', 'x-decorator-props': { gridSpan: 2, }, 'x-component-props': { placeholder: '请输入名称', }, name: 'name', 'x-validator': [ { max: 64, message: '最多可输入64个字符', }, { required: true, message: '请输入名称', }, ], }, relation: { title: '标识', 'x-decorator-props': { gridSpan: 2, }, type: 'string', 'x-disabled': !!props.data?.id, 'x-decorator': 'FormItem', 'x-component': 'Input', 'x-component-props': { placeholder: '请输入标识', }, 'x-validator': [ { max: 64, message: '最多可输入64个字符', }, { required: true, message: '请输入标识', }, // { // triggerType: 'onBlur', // // validator: (value: string) => { // // return new Promise((resolve) => { // // service // // .validateField('username', value) // // .then((resp) => { // // if (resp.status === 200) { // // if (resp.result.passed) { // // resolve(''); // // } else { // // resolve(model === 'edit' ? '' : resp.result.reason); // // } // // } // // resolve(''); // // }) // // .catch(() => { // // return '验证失败!'; // // }); // // }); // // }, // }, ], name: 'relation', required: true, }, object: { title: '关联方', 'x-decorator-props': { gridSpan: 1, }, type: 'string', 'x-decorator': 'FormItem', 'x-disabled': !!props.data?.id, 'x-component': 'Select', 'x-component-props': { placeholder: '请选择关联方', showArrow: true, filterOption: (input: string, option: any) => option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0, }, required: true, 'x-reactions': ['{{useAsyncDataSource(getTypes)}}'], }, target: { title: '被关联方', 'x-decorator-props': { gridSpan: 1, }, type: 'string', 'x-decorator': 'FormItem', 'x-disabled': !!props.data?.id, 'x-component': 'Select', 'x-component-props': { placeholder: '请选择被关联方', }, 'x-reactions': { dependencies: ['..object'], fulfill: { state: { dataSource: '{{JSON.parse($deps[0] || "{}").objectType==="device"?[{label: "用户", value: JSON.stringify({"targetType":"user", "targetTypeName": "用户"})}] : []}}', }, }, }, required: true, }, description: { title: '说明', 'x-decorator': 'FormItem', 'x-component': 'Input.TextArea', 'x-component-props': { rows: 5, placeholder: '请输入说明', }, 'x-decorator-props': { gridSpan: 2, }, 'x-validator': [ { max: 200, message: '最多可输入200个字符', }, ], }, }, }, }, }; const save = async () => { const value = await form.submit(); const temp: any = { ...props.data, ...value, ...JSON.parse(value?.object || '{}'), ...JSON.parse(value?.target || '{}'), }; delete temp.object; delete temp.target; const response: any = await service[!props.data?.id ? 'save' : 'update']({ ...temp }); if (response.status === 200) { message.success( intl.formatMessage({ id: 'pages.data.option.success', defaultMessage: '操作成功', }), ); props.close(); } else { message.error('操作失败!'); } }; return (
); }; export default Save;