index.tsx 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  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: (text, record) => (
  61. <div
  62. className="text-primary cursor-pointer hover:text-hex-967bbd"
  63. onClick={() => {
  64. console.log(record)
  65. const {
  66. ID,
  67. name,
  68. projectType: { ID: projectTypeID },
  69. approval: { ID: approvalID },
  70. reportAccount: { ID: reportAccountID },
  71. ...otherRecord
  72. } = record
  73. setState({
  74. ...state,
  75. visible: true,
  76. readOnly: true,
  77. defaultFormData: {
  78. ID,
  79. name,
  80. projectTypeID,
  81. approvalID,
  82. reportAccountID,
  83. ...otherRecord
  84. }
  85. })
  86. }}>
  87. {text}
  88. </div>
  89. )
  90. },
  91. {
  92. dataIndex: 'createdTime',
  93. title: '创建时间',
  94. renderText: text => dayjs(text * 1000).format('YYYY-MM-DD')
  95. },
  96. {
  97. dataIndex: 'projectTypeID',
  98. title: '项目类型',
  99. filters: true,
  100. filterMultiple: false,
  101. render: (_, record) => <div>{record.projectType.name}</div>,
  102. valueEnum: pTypeList.reduce((prev, curr) => {
  103. const items = { ...prev }
  104. items[curr.value] = {
  105. text: curr.label
  106. }
  107. return items
  108. }, {})
  109. },
  110. {
  111. dataIndex: 'created',
  112. key: 'created',
  113. title: '创建人'
  114. },
  115. {
  116. dataIndex: 'reportAccount',
  117. key: 'reportAccount',
  118. title: '数据上报',
  119. renderText: (_, record) => record.reportAccount?.name
  120. },
  121. {
  122. dataIndex: 'approval',
  123. key: 'approval',
  124. title: '审批流程',
  125. renderText: (_, record) => record.approval?.name
  126. },
  127. {
  128. title: '操作',
  129. dataIndex: 'operation',
  130. render: (_, record) => (
  131. <div className="divide-x divide-bg-gray-400 flex flex-row">
  132. <div
  133. className="pr-2 text-primary cursor-pointer hover:text-hex-967bbd"
  134. onClick={() => {
  135. setState({
  136. ...state,
  137. visibles: true,
  138. currentModalType: ModalType.UPDATE,
  139. defaultFormData: {
  140. ID: record.ID,
  141. name: record.name,
  142. projectTypeID: record.projectType.ID
  143. }
  144. })
  145. }}>
  146. 编辑
  147. </div>
  148. <Popconfirm
  149. title="确认删除吗?"
  150. okText="确认"
  151. cancelText="取消"
  152. onConfirm={() => tryDelProject({ ID: record.ID })}>
  153. <div className="pl-2 text-hex-fd3995 cursor-pointer hover:text-hex-e7026e">
  154. <DeleteOutlined />
  155. </div>
  156. </Popconfirm>
  157. </div>
  158. )
  159. }
  160. ]
  161. return (
  162. <PageContainer title={false}>
  163. <ProTable<API.ProjectListItem>
  164. rowKey="ID"
  165. params={state.params}
  166. actionRef={tRef}
  167. columns={generateColumns(columns, schema)}
  168. request={async (params, filter, sorter) => {
  169. const { code = -1, data: { items = [], totle = 0 } = {} } = await getProjectList({
  170. ...params,
  171. ...filter,
  172. ...sorter
  173. })
  174. return {
  175. data: items,
  176. success: code === consts.RET_CODE.SUCCESS,
  177. totle
  178. }
  179. }}
  180. toolbar={{
  181. search: {
  182. onSearch: val => setState({ ...state, params: { ...state.params, search: val } })
  183. },
  184. actions: [
  185. // <Button onClick={() => history.push('/project/management/add')}>新建项目</Button>
  186. <Button
  187. type="primary"
  188. onClick={() =>
  189. setState({ ...state, visibles: true, currentModalType: ModalType.ADD })
  190. }>
  191. 新建项目
  192. </Button>
  193. ]
  194. }}
  195. search={false}
  196. />
  197. <AnimateContent
  198. visible={state.visibles}
  199. onVisibleChange={visibles => setState({ ...state, visibles })}>
  200. <ProjectModal
  201. type={state.currentModalType}
  202. defaultFormData={state.defaultFormData}
  203. pTypeList={pTypeList}
  204. visibles={state.visibles}
  205. reloadTable={() => tRef.current?.reload()}
  206. setVisible={(visibles: boolean) => setState({ ...state, visibles })}
  207. />
  208. </AnimateContent>
  209. <AnimateContent
  210. visible={state.visible}
  211. onVisibleChange={visible => setState({ ...state, visible })}>
  212. <Detail
  213. defaultFormData={state.defaultFormData}
  214. pTypeList={pTypeList}
  215. readOnly={state.readOnly}
  216. reloadTable={() => tRef.current?.reload()}
  217. />
  218. </AnimateContent>
  219. </PageContainer>
  220. )
  221. }
  222. export default connect(
  223. ({ project, schemaBase }: { project: ProjectModelState; schemaBase: SchemaBaseModelState }) => ({
  224. pTypeList: project.projectTypeList.map(item => ({ label: item.name, value: item.ID })),
  225. schema: schemaBase.base[BaseMenuEnum.PROJECT]?.schema
  226. })
  227. )(List)