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

201 lines
4.7 KiB
Smarty

{{- $global := . }}
{{- if .IsAdd }}
// ============ 详情组件新增字段配置 ============
// 详情新增字段
{{- range .Fields}}
{{- if .Desc }}
{{ GenerateReactDescriptionItem . }}
{{- end }}
{{- end }}
{{- else }}
{{- if not .OnlyTemplate}}
/**
* KRA - {{.Description}}详情组件
* Auto-generated by KRA AutoCode
*/
import React, { useEffect, useState } from 'react';
import {
Drawer,
Descriptions,
Spin,
message,
Tag,
{{- if .HasPic }}
Image,
{{- end }}
{{- if .IsTree }}
TreeSelect,
{{- end }}
} from 'antd';
import { find{{.StructName}} } from '@/services/kratos/{{.PackageName}}';
import type { {{.StructName}} } from '@/services/kratos/{{.PackageName}}';
{{- if .DictTypes }}
import { useDictionary } from '@/hooks/useDictionary';
{{- end }}
{{- if .HasDataSource }}
import { get{{.StructName}}DataSource } from '@/services/kratos/{{.PackageName}}';
{{- end }}
import dayjs from 'dayjs';
interface {{.StructName}}DetailProps {
visible: boolean;
record?: {{.StructName}} | null;
onClose: () => void;
{{- if .IsTree }}
treeData?: {{.StructName}}[];
{{- end }}
}
const {{.StructName}}Detail: React.FC<{{.StructName}}DetailProps> = ({
visible,
record,
onClose,
{{- if .IsTree }}
treeData = [],
{{- end }}
}) => {
const [loading, setLoading] = useState(false);
const [currentRecord, setCurrentRecord] = useState<{{.StructName}} | null>(null);
{{- if .HasDataSource }}
const [dataSource, setDataSource] = useState<Record<string, Array<{ label: string; value: any }>>>({});
{{- end }}
{{- if .DictTypes }}
//
{{- range $index, $element := .DictTypes}}
const { getLabel: get{{$element | toPascalCase}}Label } = 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 }}) => {
setLoading(true);
try {
const res = await find{{.StructName}}({ {{.PrimaryField.FieldJson}}: id });
if (res.code === 0 && res.data) {
setCurrentRecord(res.data);
} else {
message.error(res.msg || '获取详情失败');
}
} catch (error) {
message.error('获取详情失败');
} finally {
setLoading(false);
}
};
useEffect(() => {
if (visible && record?.{{.PrimaryField.FieldJson}}) {
{{- if .HasDataSource }}
fetchDataSource();
{{- end }}
fetchDetail(record.{{.PrimaryField.FieldJson}});
}
}, [visible, record]);
//
const handleClose = () => {
setCurrentRecord(null);
onClose();
};
return (
<Drawer
title="{{.Description}}详情"
open={visible}
onClose={handleClose}
width={600}
destroyOnClose
>
<Spin spinning={loading}>
{currentRecord && (
<Descriptions column={1} bordered>
{{- if .IsTree }}
<Descriptions.Item label="父节点">
<TreeSelect
value={currentRecord.parentID}
treeData={[{ {{.PrimaryField.FieldJson}}: 0, {{.TreeJson}}: '根节点', children: treeData }]}
fieldNames={{ "{{" }} label: '{{.TreeJson}}', value: '{{.PrimaryField.FieldJson}}', children: 'children' {{ "}}" }}
disabled
style={{ "{{" }} width: '100%' {{ "}}" }}
placeholder="根节点"
/>
</Descriptions.Item>
{{- end }}
{{- range .Fields}}
{{- if .Desc }}
{{ GenerateReactDescriptionItem . }}
{{- end }}
{{- end }}
{{- if .GvaModel }}
<Descriptions.Item label="创建时间">
{currentRecord.CreatedAt ? dayjs(currentRecord.CreatedAt).format('YYYY-MM-DD HH:mm:ss') : '-'}
</Descriptions.Item>
<Descriptions.Item label="更新时间">
{currentRecord.UpdatedAt ? dayjs(currentRecord.UpdatedAt).format('YYYY-MM-DD HH:mm:ss') : '-'}
</Descriptions.Item>
{{- end }}
</Descriptions>
)}
</Spin>
</Drawer>
);
};
export default {{.StructName}}Detail;
{{- else}}
/**
* KRA - {{.Description}}详情组件
* Auto-generated by KRA AutoCode
*/
import React from 'react';
import { Drawer, Descriptions } from 'antd';
interface {{.StructName}}DetailProps {
visible: boolean;
record?: any;
onClose: () => void;
}
const {{.StructName}}Detail: React.FC<{{.StructName}}DetailProps> = ({
visible,
record,
onClose,
}) => {
return (
<Drawer
title="{{.Description}}详情"
open={visible}
onClose={onClose}
width={600}
destroyOnClose
>
{record && (
<Descriptions column={1} bordered>
{/* */}
</Descriptions>
)}
</Drawer>
);
};
export default {{.StructName}}Detail;
{{- end }}
{{- end }}