import { BizValueType, ButtonAccess } from '@/components'; import { formLayout } from '@/utils/formLayout'; import { useIntl } from '@@/exports'; import { DrawerForm, ModalForm, ProCard, ProDescriptions, ProFormDependency, } from '@ant-design/pro-components'; import { useState } from 'react'; import { BizDetailProps } from './typing'; export default function BizDetail< BizVO extends Record, Func extends Record, >(props: BizDetailProps) { const { row, rowId, rowKey, permission, intlPrefix, formType, method, methodUpper, func, formContext, formContextMode = 'tab', trigger, fieldProps, initValues, isMobile, columns, positionKey, showDetail = true, } = props; const [open, setOpen] = useState(false); const intl = useIntl(); /** 渲染 formContext 内容 */ const renderFormContext = (data: any, form: any, colSpan: number) => { if (!formContext) return null; const contextItems = formContext(data?.[`${method}VO`], async () => { const { data } = await func?.[`show${methodUpper}`]({ [`${method}ShowQry`]: { [`${rowKey}`]: rowId, }, }); form.setFieldValue(`${method}VO`, data); })?.filter((item) => { // @ts-ignore return !item.display || item.display(data?.[`${method}VO`]); }); // 平铺模式:直接垂直堆叠所有内容 if (formContextMode === 'flat') { return contextItems?.map((item, index) => ( {item.children} )); } // Tab 模式:使用 tabs 渲染 return ( { form.setFieldValue('activeKey', key); }, }} /> ); }; let rest = { title: intl.formatMessage({ id: intlPrefix + '.modal.view.title', }), autoFocusFirstInput: true, submitTimeout: 2000, open: fieldProps?.open || open, onOpenChange: fieldProps?.onOpenChange || setOpen, request: async (): Promise => { const { data } = await func?.[`show${methodUpper}`]({ [`${method}ShowQry`]: { [`${rowKey}`]: rowId, }, }); const extra = await initValues?.(rowId!); return { [`${rowKey}`]: rowId, [`${method}VO`]: data, ...extra, isMobile, }; }, }; const renderForm = () => { if (formType === 'drawer' || formType === 'step') { return ( {...fieldProps} {...formLayout(isMobile)} width={isMobile ? '100%' : '85%'} drawerProps={{ destroyOnHidden: true, }} submitter={{ searchConfig: { resetText: '关闭', }, submitButtonProps: { style: { display: 'none', }, }, }} {...rest} > {columns && showDetail && ( {(data, form) => { return ( params={{ data: data[`${method}VO`] }} request={async (params) => Promise.resolve({ success: true, data: params?.data, }) } columns={[...columns]} /> {renderFormContext(data, form, 24)} ); }} )} ); } if (formType === 'modal') { return ( {...fieldProps} {...formLayout(isMobile)} modalProps={{ destroyOnHidden: true, }} submitter={{ searchConfig: { resetText: '关闭', }, submitButtonProps: { style: { display: 'none', }, }, }} {...rest} > {columns && ( {(data, form) => { return ( params={{ data: data[`${method}VO`] }} request={async (params) => Promise.resolve({ success: true, data: params?.data, }) } columns={[...columns]} /> {renderFormContext(data, form, 24)} ); }} )} ); } }; const renderTrigger = () => { if (trigger) { return (
{ setOpen(true); }} > {trigger?.(row)}
); } return ( { setOpen(true); event.stopPropagation(); }} positionKey={positionKey} > {intl.formatMessage({ id: intlPrefix + '.modal.view.button', })} ); }; return ( <> {renderTrigger()} {renderForm()} ); }