kra/resource/package/web/pages/form.tsx.tpl

255 lines
5.6 KiB
Smarty

{{- $global := . }}
{{- if .IsAdd }}
// ============ 表单组件新增字段配置 ============
// 表单新增字段
{{- range .Fields}}
{{- if .Form}}
{{ GenerateReactFormItem . }}
{{- end }}
{{- end }}
{{- else }}
{{- if not .OnlyTemplate}}
/**
* KRA - {{.Description}}表单组件
* Auto-generated by KRA AutoCode
*/
import React, { useEffect, useState } from 'react';
import {
Modal,
Form,
Input,
message,
{{- if .HasTimer }}
DatePicker,
{{- end }}
{{- if or .DictTypes .HasDataSource }}
Select,
{{- end }}
{{- if .HasBool }}
Switch,
{{- end }}
{{- if .HasNumber }}
InputNumber,
{{- end }}
{{- if .IsTree }}
TreeSelect,
{{- end }}
} from 'antd';
import type { FormInstance } from 'antd/es/form';
import {
create{{.StructName}},
update{{.StructName}},
find{{.StructName}},
{{- if .HasDataSource }}
get{{.StructName}}DataSource,
{{- end }}
} from '@/services/kratos/{{.PackageName}}';
import type { {{.StructName}} } from '@/services/kratos/{{.PackageName}}';
{{- if .DictTypes }}
import { useDictionary } from '@/hooks/useDictionary';
{{- end }}
interface {{.StructName}}FormProps {
visible: boolean;
type: 'create' | 'edit';
record?: {{.StructName}} | null;
onClose: () => void;
onSuccess: () => void;
{{- if .IsTree }}
treeData?: {{.StructName}}[];
{{- end }}
}
const {{.StructName}}Form: React.FC<{{.StructName}}FormProps> = ({
visible,
type,
record,
onClose,
onSuccess,
{{- if .IsTree }}
treeData = [],
{{- end }}
}) => {
const [form] = Form.useForm<FormInstance>();
const [loading, setLoading] = useState(false);
const [detailLoading, setDetailLoading] = useState(false);
{{- if .HasDataSource }}
const [dataSource, setDataSource] = useState<Record<string, Array<{ label: string; value: any }>>>({});
{{- end }}
{{- if .DictTypes }}
//
{{- range $index, $element := .DictTypes}}
const { options: {{$element}}Options } = useDictionary('{{$element}}');
{{- end }}
{{- end }}
{{- if .HasDataSource }}
//
const fetchDataSource = async () => {
try {
const res = await get{{.StructName}}DataSource();
if (res.code === 0) {
setDataSource(res.data || {});
}
} catch (error) {
console.error('获取数据源失败:', error);
}
};
{{- end }}
//
const fetchDetail = async (id: {{ GenerateTSType .PrimaryField.FieldType }}) => {
setDetailLoading(true);
try {
const res = await find{{.StructName}}({ {{.PrimaryField.FieldJson}}: id });
if (res.code === 0 && res.data) {
form.setFieldsValue(res.data);
}
} catch (error) {
message.error('获取详情失败');
} finally {
setDetailLoading(false);
}
};
useEffect(() => {
if (visible) {
{{- if .HasDataSource }}
fetchDataSource();
{{- end }}
if (type === 'edit' && record?.{{.PrimaryField.FieldJson}}) {
fetchDetail(record.{{.PrimaryField.FieldJson}});
} else if (type === 'create') {
form.resetFields();
{{- if .IsTree }}
if (record?.parentID) {
form.setFieldsValue({ parentID: record.parentID });
}
{{- end }}
}
}
}, [visible, type, record]);
//
const handleSubmit = async () => {
try {
const values = await form.validateFields();
setLoading(true);
const submitData = type === 'edit'
? { ...record, ...values }
: values;
const res = type === 'create'
? await create{{.StructName}}(submitData)
: await update{{.StructName}}(submitData);
if (res.code === 0) {
message.success(type === 'create' ? '创建成功' : '更新成功');
handleClose();
onSuccess();
} else {
message.error(res.msg || (type === 'create' ? '创建失败' : '更新失败'));
}
} catch (error) {
//
} finally {
setLoading(false);
}
};
//
const handleClose = () => {
form.resetFields();
onClose();
};
return (
<Modal
title={type === 'create' ? '新增{{.Description}}' : '编辑{{.Description}}'}
open={visible}
onOk={handleSubmit}
onCancel={handleClose}
confirmLoading={loading}
destroyOnClose
width={600}
maskClosable={false}
>
<Form
form={form}
layout="vertical"
disabled={detailLoading}
>
{{- if .IsTree }}
<Form.Item name="parentID" label="父节点">
<TreeSelect
placeholder="请选择父节点"
allowClear
treeData={[{ {{.PrimaryField.FieldJson}}: 0, {{.TreeJson}}: '根节点', children: treeData }]}
fieldNames={{ "{{" }} label: '{{.TreeJson}}', value: '{{.PrimaryField.FieldJson}}', children: 'children' {{ "}}" }}
treeDefaultExpandAll
/>
</Form.Item>
{{- end }}
{{- range .Fields}}
{{- if .Form}}
{{ GenerateReactFormItem . }}
{{- end }}
{{- end }}
</Form>
</Modal>
);
};
export default {{.StructName}}Form;
{{- else}}
/**
* KRA - {{.Description}}表单组件
* Auto-generated by KRA AutoCode
*/
import React from 'react';
import { Modal, Form, Input } from 'antd';
interface {{.StructName}}FormProps {
visible: boolean;
type: 'create' | 'edit';
record?: any;
onClose: () => void;
onSuccess: () => void;
}
const {{.StructName}}Form: React.FC<{{.StructName}}FormProps> = ({
visible,
type,
onClose,
onSuccess,
}) => {
const [form] = Form.useForm();
return (
<Modal
title={type === 'create' ? '新增{{.Description}}' : '编辑{{.Description}}'}
open={visible}
onOk={() => {
form.validateFields().then(() => {
onSuccess();
onClose();
});
}}
onCancel={onClose}
destroyOnClose
>
<Form form={form} layout="vertical">
{/* */}
</Form>
</Modal>
);
};
export default {{.StructName}}Form;
{{- end }}
{{- end }}