MemberItem.tsx 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. import { queryAccountList } from '@/services/api/institution'
  2. import { queryInstitutionRoleList } from '@/services/api/project'
  3. import consts from '@/utils/consts'
  4. import { useRequest } from '@umijs/max'
  5. import { Select, TreeSelect } from 'antd'
  6. import { useState } from 'react'
  7. enum AuditType {
  8. ACCOUNT = 'account',
  9. INSTITUTION = 'institution',
  10. ROLE = 'role'
  11. }
  12. const auditTypeOptions = [
  13. { label: '用户', value: AuditType.ACCOUNT },
  14. { label: '单位角色', value: AuditType.INSTITUTION }
  15. // { label: '审批角色', value: 'role'}
  16. ]
  17. type MemberItemProps = {
  18. value: string[]
  19. onChange: (value?: string) => void
  20. }
  21. type iState = {
  22. auditType: AuditType
  23. memberOptions: string[]
  24. members: string[]
  25. }
  26. const filterTreeNodes = (mode: AuditType, tree: string[]) =>
  27. tree.map(item => {
  28. const newItem = { ...item }
  29. // 重新拼装id, 根据AuditType加上不同的前缀(后端同步前缀格式)
  30. switch (mode) {
  31. case AuditType.ACCOUNT:
  32. newItem.ID = `a_${newItem.ID}`
  33. break
  34. case AuditType.INSTITUTION:
  35. newItem.ID = `i_${newItem.ID}`
  36. break
  37. default:
  38. newItem.ID = `r_${newItem.ID}`
  39. break
  40. }
  41. if (newItem.children) {
  42. newItem.disabled = true
  43. newItem.children = filterTreeNodes(newItem.children)
  44. return newItem
  45. }
  46. return newItem
  47. })
  48. const MemberItem: React.FC<MemberItemProps> = ({ value, onChange }) => {
  49. const [state, setState] = useState<iState>({
  50. auditType: AuditType.ACCOUNT,
  51. memberOptions: [],
  52. members: value
  53. })
  54. useRequest(
  55. () => {
  56. let requestFn: Nullable<() => Promise<void>> = null
  57. switch (state.auditType) {
  58. case AuditType.ACCOUNT:
  59. requestFn = () => queryAccountList({ pageSize: consts.MAX_PAGE_SIZE })
  60. break
  61. case AuditType.INSTITUTION:
  62. requestFn = () => queryInstitutionRoleList({ pageSize: consts.MAX_PAGE_SIZE })
  63. break
  64. default:
  65. break
  66. }
  67. return requestFn?.()
  68. },
  69. {
  70. refreshDeps: [state.auditType],
  71. onSuccess(data: { items: any[] }) {
  72. setState({ ...state, memberOptions: filterTreeNodes(state.auditType, data.items) })
  73. }
  74. }
  75. )
  76. const toggleChange = value => {
  77. if (value) {
  78. onChange?.(value)
  79. }
  80. setState({ ...state, members: value })
  81. }
  82. const toggleAuditType = (value: AuditType) => setState({ ...state, auditType: value, members: [] })
  83. return (
  84. <div className="ant-form-item">
  85. <div className="ant-row ant-form-item-row">
  86. <div className="ant-col ant-col-5 ant-form-item-label">
  87. <label className="ant-form-item-required">成员</label>
  88. </div>
  89. <div className="ant-col ant-form-item-control">
  90. <div className="ant-form-item-control-input">
  91. <div className="ant-form-item-control-input-content">
  92. <Select
  93. defaultValue={state.auditType}
  94. options={auditTypeOptions}
  95. onChange={toggleAuditType}
  96. style={{ width: '100%' }}
  97. />
  98. <TreeSelect
  99. value={state.members}
  100. options={state.memberOptions}
  101. onChange={toggleChange}
  102. style={{ width: '100%', marginTop: '4px' }}
  103. />
  104. </div>
  105. </div>
  106. </div>
  107. </div>
  108. </div>
  109. )
  110. }
  111. export default MemberItem