|
|
@@ -2,13 +2,15 @@ import ProTable from '@ant-design/pro-table'
|
|
|
import React, { useEffect, useState } from 'react'
|
|
|
import { Button, Tag } from 'antd'
|
|
|
import { ColumnsType } from 'antd/lib/table'
|
|
|
-import styles from './index.less'
|
|
|
import useModal from '@/components/Modal'
|
|
|
-import AddAssemblyModal from './AddAssemblyModal'
|
|
|
+import AddAssembly from './AddAssembly'
|
|
|
import { queryMatterDetail } from '@/services/api/business'
|
|
|
import consts from '@/utils/consts'
|
|
|
import useEventEmitter from '@/utils/emit'
|
|
|
import { EmitterType } from '@/enums/emit'
|
|
|
+import useDrawer from '@/components/Drawer'
|
|
|
+import FormDesignable from './FormDesignable'
|
|
|
+import { isString } from '@/utils/is'
|
|
|
|
|
|
export enum Assembly {
|
|
|
FORM = 'form', // 表单
|
|
|
@@ -17,30 +19,28 @@ export enum Assembly {
|
|
|
}
|
|
|
|
|
|
export const assemblyToMap = {
|
|
|
- [Assembly.FORM]: { name: '表单', type: '通用型', title: '项目信息' },
|
|
|
- [Assembly.COSTPROFILE]: { name: '送审资料', type: '唯一型', title: '送审资料' },
|
|
|
- [Assembly.DATAPROFILE]: { name: '造价文件', type: '唯一型', title: '造价文件' }
|
|
|
+ [Assembly.FORM]: { name: '表单', type: '通用型' },
|
|
|
+ [Assembly.COSTPROFILE]: { name: '送审资料', type: '唯一型' },
|
|
|
+ [Assembly.DATAPROFILE]: { name: '造价文件', type: '唯一型' }
|
|
|
}
|
|
|
|
|
|
type AssemblyDetailProps = {
|
|
|
record?: API.MatterTreeItem
|
|
|
refresh?: () => void
|
|
|
}
|
|
|
-interface IState {
|
|
|
- matterDetail: API.MatterTreeItem
|
|
|
-}
|
|
|
+type IState = Pick<API.MatterItem, 'ID' | 'formSchema' | 'assembly'>
|
|
|
|
|
|
const AssemblyDetail: React.FC<AssemblyDetailProps> = ({ refresh, assemblyID }) => {
|
|
|
- const [state, setState] = useState<IState>({
|
|
|
- matterDetail: {}
|
|
|
- })
|
|
|
+ const [state, setState] = useState<IState>()
|
|
|
|
|
|
+ const [drawer, DrawerDom] = useDrawer()
|
|
|
const [modal, ModalDOM] = useModal()
|
|
|
|
|
|
const initData = async params => {
|
|
|
const { data = {}, code = -1 } = await queryMatterDetail(params)
|
|
|
if (code === consts.RET_CODE.SUCCESS) {
|
|
|
- setState({ ...state, matterDetail: data })
|
|
|
+ const { ID, formSchema, assembly } = data as API.MatterItem
|
|
|
+ setState({ ID, formSchema, assembly })
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -50,10 +50,12 @@ const AssemblyDetail: React.FC<AssemblyDetailProps> = ({ refresh, assemblyID })
|
|
|
// }
|
|
|
|
|
|
const event$ = useEventEmitter({ global: true })
|
|
|
- event$.useSubscription(EmitterType.BUSINESS_MATTER_REFRESH, ({ params }) => {
|
|
|
- const { ID } = params[0]
|
|
|
+ event$.useSubscription(EmitterType.BUSINESS_MATTER_REFRESH, () => {
|
|
|
+ console.log('11')
|
|
|
+
|
|
|
+ // const { ID } = params[0]
|
|
|
|
|
|
- initData({ ID })
|
|
|
+ // initData({ ID })
|
|
|
})
|
|
|
|
|
|
useEffect(() => {
|
|
|
@@ -68,19 +70,25 @@ const AssemblyDetail: React.FC<AssemblyDetailProps> = ({ refresh, assemblyID })
|
|
|
okText: '确认',
|
|
|
cancelText: '取消',
|
|
|
width: 1000,
|
|
|
- wrapClassName: 'modalTableBox',
|
|
|
- children: (
|
|
|
- <AddAssemblyModal
|
|
|
- defaultData={state.matterDetail}
|
|
|
- // refreshData={refreshData}
|
|
|
- refresh={refresh}
|
|
|
- close={() => modal.close()}
|
|
|
- />
|
|
|
- ),
|
|
|
+ bodyStyle: { padding: 'unset' },
|
|
|
+ children: <AddAssembly defaultData={state} refresh={refresh} close={() => modal.close()} />,
|
|
|
footer: null
|
|
|
})
|
|
|
}
|
|
|
|
|
|
+ const openDesignable = (type: Assembly) => {
|
|
|
+ const templateSchema =
|
|
|
+ (state?.formSchema && isString(state.formSchema) && JSON.parse(state.formSchema)) || {}
|
|
|
+
|
|
|
+ drawer.open({
|
|
|
+ title: `(${assemblyToMap[type].name})组件配置`,
|
|
|
+ closeIcon: null,
|
|
|
+ bodyStyle: { padding: 'unset' },
|
|
|
+ destroyOnClose: true,
|
|
|
+ children: <FormDesignable dataID={assemblyID} templateSchema={templateSchema} />
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
const columns: ColumnsType<API.AssemblyItem> = [
|
|
|
{
|
|
|
title: '组件名称',
|
|
|
@@ -95,43 +103,41 @@ const AssemblyDetail: React.FC<AssemblyDetailProps> = ({ refresh, assemblyID })
|
|
|
renderText: (_, record) => <Tag color="blue">{assemblyToMap[record.type].type}</Tag>
|
|
|
},
|
|
|
{
|
|
|
- title: '组件标题',
|
|
|
- dataIndex: 'title',
|
|
|
- onHeaderCell: () => ({ style: { textAlign: 'center' } }),
|
|
|
- renderText: (_, record) => <span>{assemblyToMap[record.type].title}</span>
|
|
|
- },
|
|
|
- {
|
|
|
title: '操作',
|
|
|
dataIndex: 'operate',
|
|
|
align: 'center',
|
|
|
- renderText: () => (
|
|
|
+ renderText: (_, record) => (
|
|
|
<div className="divide-x divide-bg-gray-400 flex flex-row items-center">
|
|
|
- <span className="px-2 text-primary cursor-pointer hover:text-hex-967bbd">组件配置</span>
|
|
|
+ <span
|
|
|
+ className="px-2 text-primary cursor-pointer hover:text-hex-967bbd"
|
|
|
+ onClick={() => openDesignable(record.type)}>
|
|
|
+ 组件配置
|
|
|
+ </span>
|
|
|
</div>
|
|
|
)
|
|
|
}
|
|
|
]
|
|
|
|
|
|
- // drawerTableBox
|
|
|
return (
|
|
|
- <div className={[styles.assemblyContent, 'mt-24px'].join(' ')}>
|
|
|
- {state.matterDetail ? (
|
|
|
+ <div className="mt-24px">
|
|
|
+ {state?.assembly ? (
|
|
|
<ProTable
|
|
|
+ cardProps={{ bodyStyle: { padding: 'unset' } }}
|
|
|
search={false}
|
|
|
rowKey="type"
|
|
|
columns={columns}
|
|
|
- dataSource={state.matterDetail.assembly?.map(item => ({ type: item }))}
|
|
|
- className="absolute"
|
|
|
+ dataSource={state.assembly?.map(item => ({ type: item }))}
|
|
|
bordered
|
|
|
size="small"
|
|
|
pagination={false}
|
|
|
toolBarRender={false}
|
|
|
/>
|
|
|
) : null}
|
|
|
- <Button className="buttonBox" onClick={() => openModal()}>
|
|
|
- 添加组件
|
|
|
- </Button>
|
|
|
+ <div className="absolute right-4 top-4">
|
|
|
+ <Button onClick={() => openModal()}>添加组件</Button>
|
|
|
+ </div>
|
|
|
{ModalDOM}
|
|
|
+ {DrawerDom}
|
|
|
</div>
|
|
|
)
|
|
|
}
|