index.tsx 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. import { delProject, getProjectList } from '@/services/api/project'
  2. import ProTable from '@ant-design/pro-table'
  3. import type { ProColumnType, ActionType } from '@ant-design/pro-table'
  4. import { Button, Popconfirm } from 'antd'
  5. import consts from '@/utils/consts'
  6. import { useRef, useState, useEffect } from 'react'
  7. import { connect, useRequest } from 'umi'
  8. import type { ConnectProps } from 'umi'
  9. import type { ProjectModelState } from '../model'
  10. import { DeleteOutlined } from '@ant-design/icons'
  11. import ProjectModal, { ModalType } from './components/ProjectModal'
  12. import dayjs from 'dayjs'
  13. import { PageContainer } from '@ant-design/pro-layout'
  14. import type { SchemaBaseModelState } from '@/pages/Schema/Base/model'
  15. import { BaseMenuEnum } from '@/pages/Schema/Base'
  16. import { generateColumns } from '@/utils/util'
  17. import Detail from './components/Detail'
  18. import AnimateContent from '@/components/AnimateContent'
  19. type ListProps = ConnectProps & {
  20. pTypeList: { label: string; value: string }[]
  21. schema?: Record<string, any> | null
  22. }
  23. const List: React.FC<ListProps> = ({ schema, dispatch, pTypeList }) => {
  24. const tRef = useRef<ActionType>(null)
  25. useEffect(() => {
  26. if (!pTypeList.length) {
  27. dispatch({
  28. type: 'project/queryProjectTypeList'
  29. })
  30. }
  31. dispatch({
  32. type: 'schemaBase/querySchema',
  33. payload: {
  34. columnType: BaseMenuEnum.PROJECT
  35. }
  36. })
  37. }, [])
  38. const [state, setState] = useState({
  39. params: {
  40. search: null
  41. },
  42. visible: false,
  43. visibles: false,
  44. readOnly: true,
  45. currentModalType: ModalType.ADD,
  46. defaultFormData: null
  47. })
  48. const { run: tryDelProject } = useRequest(delProject, {
  49. manual: true,
  50. onSuccess: () => tRef.current?.reload()
  51. })
  52. const columns: ProColumnType<API.ProjectListItem>[] = [
  53. {
  54. dataIndex: 'ID',
  55. hideInTable: true
  56. },
  57. {
  58. dataIndex: 'name',
  59. title: '项目名称',
  60. render: (name, record) => (
  61. <div
  62. className="text-primary cursor-pointer hover:text-hex-967bbd"
  63. onClick={() => {
  64. setState({
  65. ...state,
  66. visible: true,
  67. readOnly: true,
  68. defaultFormData: {
  69. ID: record.ID,
  70. name: record.name,
  71. projectTypeID: record.projectType.ID
  72. }
  73. })
  74. }}>
  75. {name}
  76. </div>
  77. )
  78. },
  79. {
  80. dataIndex: 'createdTime',
  81. title: '创建时间',
  82. renderText: text => dayjs(text * 1000).format('YYYY-MM-DD')
  83. },
  84. {
  85. dataIndex: 'projectTypeID',
  86. title: '项目类型',
  87. filters: true,
  88. filterMultiple: false,
  89. render: (_, record) => <div>{record.projectType.name}</div>,
  90. valueEnum: pTypeList.reduce((prev, curr) => {
  91. const items = { ...prev }
  92. items[curr.value] = {
  93. text: curr.label
  94. }
  95. return items
  96. }, {})
  97. },
  98. {
  99. dataIndex: 'created',
  100. key: 'created',
  101. title: '创建人'
  102. },
  103. {
  104. dataIndex: 'reportAccount',
  105. key: 'reportAccount',
  106. title: '数据上报',
  107. renderText: (_, record) => record.reportAccount?.name
  108. },
  109. {
  110. dataIndex: 'approval',
  111. key: 'approval',
  112. title: '审批流程',
  113. renderText: (_, record) => record.approval?.name
  114. },
  115. {
  116. title: '操作',
  117. dataIndex: 'operation',
  118. render: (_, record) => (
  119. <div className="divide-x divide-bg-gray-400 flex flex-row">
  120. <div
  121. className="pr-2 text-primary cursor-pointer hover:text-hex-967bbd"
  122. onClick={() => {
  123. setState({
  124. ...state,
  125. visibles: true,
  126. currentModalType: ModalType.UPDATE,
  127. defaultFormData: {
  128. ID: record.ID,
  129. name: record.name,
  130. projectTypeID: record.projectType.ID
  131. }
  132. })
  133. }}>
  134. 编辑
  135. </div>
  136. <Popconfirm
  137. title="确认删除吗?"
  138. okText="确认"
  139. cancelText="取消"
  140. onConfirm={() => tryDelProject({ ID: record.ID })}>
  141. <div className="pl-2 text-hex-fd3995 cursor-pointer hover:text-hex-e7026e">
  142. <DeleteOutlined />
  143. </div>
  144. </Popconfirm>
  145. </div>
  146. )
  147. }
  148. ]
  149. return (
  150. <PageContainer title={false}>
  151. <ProTable<API.ProjectListItem>
  152. rowKey="ID"
  153. params={state.params}
  154. actionRef={tRef}
  155. columns={generateColumns(columns, schema)}
  156. request={async (params, filter, sorter) => {
  157. const { code = -1, data: { items = [], totle = 0 } = {} } = await getProjectList({
  158. ...params,
  159. ...filter,
  160. ...sorter
  161. })
  162. return {
  163. data: items,
  164. success: code === consts.RET_CODE.SUCCESS,
  165. totle
  166. }
  167. }}
  168. toolbar={{
  169. search: {
  170. onSearch: val => setState({ ...state, params: { ...state.params, search: val } })
  171. },
  172. actions: [
  173. // <Button onClick={() => history.push('/project/management/add')}>新建项目</Button>
  174. <Button
  175. type="primary"
  176. onClick={() =>
  177. setState({ ...state, visibles: true, currentModalType: ModalType.ADD })
  178. }>
  179. 新建项目
  180. </Button>
  181. ]
  182. }}
  183. search={false}
  184. />
  185. <ProjectModal
  186. type={state.currentModalType}
  187. defaultFormData={state.defaultFormData}
  188. pTypeList={pTypeList}
  189. visibles={state.visibles}
  190. reloadTable={() => tRef.current?.reload()}
  191. setVisible={(visibles: boolean) => setState({ ...state, visibles })}
  192. />
  193. <AnimateContent
  194. visible={state.visible}
  195. onVisibleChange={visible => setState({ ...state, visible })}>
  196. <Detail
  197. visible={state.visible}
  198. onVisibleChange={visible => setState({ ...state, visible })}
  199. defaultFormData={state.defaultFormData}
  200. pTypeList={pTypeList}
  201. readOnly={state.readOnly}
  202. reloadTable={() => tRef.current?.reload()}
  203. />
  204. </AnimateContent>
  205. {/* <DetailModal
  206. defaultFormData={state.defaultFormData}
  207. pTypeList={pTypeList}
  208. visibles={state.visibles}
  209. readOnly={state.readOnly}
  210. reloadTable={() => tRef.current?.reload()}
  211. setVisible={(visibles: boolean) => setState({ ...state, visibles })}
  212. /> */}
  213. </PageContainer>
  214. )
  215. }
  216. export default connect(
  217. ({ project, schemaBase }: { project: ProjectModelState; schemaBase: SchemaBaseModelState }) => ({
  218. pTypeList: project.projectTypeList.map(item => ({ label: item.name, value: item.ID })),
  219. schema: schemaBase.base[BaseMenuEnum.PROJECT]?.schema
  220. })
  221. )(List)