MemberItem.tsx 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. import { queryAcountListByInstitutionID } from '@/services/api/institution'
  2. import { queryInstitutionRoleList } from '@/services/api/project'
  3. import consts from '@/utils/consts'
  4. import { isArray, isString } from '@/utils/is'
  5. import { useRequest } from '@umijs/max'
  6. import { Select, TreeSelect } from 'antd'
  7. import { useState } from 'react'
  8. enum AuditType {
  9. ACCOUNT = 'account',
  10. INSTITUTION = 'institutionRole',
  11. ROLE = 'role'
  12. }
  13. const auditTypeOptions = [
  14. { label: '用户', value: AuditType.ACCOUNT },
  15. { label: '单位角色', value: AuditType.INSTITUTION }
  16. // { label: '审批角色', value: 'role'}
  17. ]
  18. type MemberItemProps = {
  19. value?: {
  20. type?: AuditType
  21. value?: string | string[]
  22. }
  23. onChange: (value?: { type: AuditType; value: string[] }) => void
  24. }
  25. type iState = {
  26. auditType: AuditType
  27. memberOptions: string[]
  28. members: {
  29. type: AuditType
  30. value: string | string[]
  31. }
  32. }
  33. const filterTreeNodes = (mode: AuditType, tree: string[]) =>
  34. tree.map(item => {
  35. const newItem = { title: item.name || item.institutionName }
  36. // 重新拼装id, 根据AuditType加上不同的前缀(后端同步前缀格式)
  37. switch (mode) {
  38. case AuditType.ACCOUNT:
  39. newItem.value = item.ID
  40. newItem.key = item.ID
  41. break
  42. case AuditType.INSTITUTION:
  43. newItem.value = item.institutionID
  44. break
  45. default:
  46. newItem.value = item.ID
  47. break
  48. }
  49. if (isArray(item.children)) {
  50. newItem.disabled = true
  51. newItem.children = filterTreeNodes(mode, item.children)
  52. return newItem
  53. }
  54. return newItem
  55. })
  56. const MemberItem: React.FC<MemberItemProps> = ({ value, onChange }) => {
  57. const [state, setState] = useState<iState>({
  58. auditType: value?.type || AuditType.ACCOUNT,
  59. memberOptions: [],
  60. members: value
  61. })
  62. useRequest(
  63. () => {
  64. let requestFn: Nullable<() => Promise<void>> = null
  65. switch (state.auditType) {
  66. case AuditType.ACCOUNT:
  67. requestFn = () => queryAcountListByInstitutionID({ pageSize: consts.MAX_PAGE_SIZE })
  68. break
  69. case AuditType.INSTITUTION:
  70. requestFn = () => queryInstitutionRoleList({ pageSize: consts.MAX_PAGE_SIZE })
  71. break
  72. default:
  73. break
  74. }
  75. return requestFn?.()
  76. },
  77. {
  78. refreshDeps: [state.auditType],
  79. onSuccess(data: { items: any[] }) {
  80. setState({
  81. ...state,
  82. memberOptions: filterTreeNodes(
  83. state.auditType,
  84. state.auditType === AuditType.ACCOUNT ? data : data.items
  85. )
  86. })
  87. }
  88. }
  89. )
  90. const toggleChange = value => {
  91. let val = value
  92. if (!isArray(val)) {
  93. val = [value]
  94. }
  95. if (value) {
  96. onChange?.({ type: state.auditType, value: val })
  97. }
  98. setState({ ...state, members: { ...state.members, value: val } })
  99. }
  100. const toggleAuditType = (value: AuditType) =>
  101. setState({ ...state, auditType: value, members: { type: value, value: [] } })
  102. return (
  103. <div className="flex flex-row">
  104. <Select
  105. value={state.auditType}
  106. options={auditTypeOptions}
  107. onChange={toggleAuditType}
  108. style={{ width: '30%' }}
  109. />
  110. {state.auditType === AuditType.ACCOUNT ? (
  111. <TreeSelect
  112. value={state.members?.value.map(item => {
  113. if (isString(item)) return item
  114. return item.ID
  115. })}
  116. placeholder="请选择"
  117. treeData={state.memberOptions}
  118. onChange={toggleChange}
  119. multiple
  120. maxTagCount="responsive"
  121. style={{ width: '70%', marginLeft: '4px' }}
  122. />
  123. ) : (
  124. <Select
  125. value={state.members?.value?.[0]?.ID || state.members?.value?.[0]}
  126. options={state.memberOptions}
  127. onChange={toggleChange}
  128. fieldNames={{ label: 'title' }}
  129. style={{ width: '70%', marginLeft: '4px' }}
  130. />
  131. )}
  132. </div>
  133. )
  134. }
  135. export default MemberItem