index.tsx 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. import { Z1_APIgetDictZhi } from '@/store/action/Z1dict'
  2. import { Checkbox, Collapse, CollapseProps, Modal, Tree } from 'antd'
  3. import { FC, useEffect, useState } from 'react'
  4. export interface RelicModalProps {
  5. isModalOpen: boolean
  6. checkedIds: string[][]
  7. setIsModalOpen: (v: boolean) => void
  8. onChange: (v: string[][]) => void
  9. onColumnChange?: (v: any[]) => void
  10. }
  11. const getMatchedItems = (res: any[], checkedIds: string[]) => {
  12. const result: { title: string; dataIndex: string }[] = []
  13. function traverse(nodes: any[]) {
  14. for (const node of nodes) {
  15. if (checkedIds.includes(node.id || node.value)) {
  16. result.push({ title: node.name || node.label, dataIndex: node.id || node.value })
  17. }
  18. if (node.children) {
  19. traverse(node.children)
  20. }
  21. }
  22. }
  23. traverse(res)
  24. return result
  25. }
  26. export const RelicModal: FC<RelicModalProps> = ({
  27. isModalOpen,
  28. checkedIds,
  29. setIsModalOpen,
  30. onChange,
  31. onColumnChange
  32. }) => {
  33. const [cate1List, setCate1List] = useState<any[]>([])
  34. const [cate2List, setCate2List] = useState<any[]>([])
  35. const [cate3List, setCate3List] = useState<any[]>([])
  36. const [checked1Ids, setChecked1Ids] = useState<string[]>([])
  37. const [checked2Ids, setChecked2Ids] = useState<string[]>([])
  38. const [checked3Ids, setChecked3Ids] = useState<string[]>([])
  39. const categories: CollapseProps['items'] = [
  40. {
  41. label: '文物类别',
  42. key: 12001,
  43. children: (
  44. <Checkbox.Group value={checked1Ids} options={cate1List} onChange={v => setChecked1Ids(v)} />
  45. )
  46. },
  47. {
  48. label: '馆内分类1',
  49. key: 12015,
  50. children: (
  51. <Checkbox.Group value={checked2Ids} options={cate2List} onChange={v => setChecked2Ids(v)} />
  52. )
  53. },
  54. {
  55. label: '馆内分类2',
  56. key: 12016,
  57. children: (
  58. <Tree
  59. checkable
  60. checkedKeys={checked3Ids}
  61. treeData={cate3List}
  62. fieldNames={{ title: 'name', key: 'id' }}
  63. onCheck={v => setChecked3Ids(v as string[])}
  64. />
  65. )
  66. }
  67. ]
  68. const handleOk = () => {
  69. onChange([[...checked1Ids], [...checked2Ids], [...checked3Ids]])
  70. setIsModalOpen(false)
  71. }
  72. const handleCancel = () => {
  73. setIsModalOpen(false)
  74. }
  75. const getList = async (id: number) => {
  76. const res = await Z1_APIgetDictZhi(`${id}`)
  77. return res
  78. }
  79. const init = () => {
  80. Promise.all([
  81. getList(categories[0].key as number),
  82. getList(categories[1].key as number),
  83. getList(categories[2].key as number)
  84. ]).then(res => {
  85. setCate1List(res[0].data.map((i: any) => ({ label: i.name, value: i.id })))
  86. setCate2List(res[1].data.map((i: any) => ({ label: i.name, value: i.id })))
  87. setCate3List(res[2].data)
  88. })
  89. }
  90. useEffect(() => {
  91. init()
  92. // eslint-disable-next-line react-hooks/exhaustive-deps
  93. }, [])
  94. useEffect(() => {
  95. if (isModalOpen) {
  96. setChecked1Ids(checkedIds[0])
  97. setChecked2Ids(checkedIds[1])
  98. setChecked3Ids(checkedIds[2])
  99. }
  100. }, [checkedIds, isModalOpen])
  101. useEffect(() => {
  102. onColumnChange?.([
  103. ...getMatchedItems(cate1List, checkedIds[0]),
  104. ...getMatchedItems(cate2List, checkedIds[1]),
  105. ...getMatchedItems(cate3List, checkedIds[2])
  106. ])
  107. }, [cate1List, cate2List, cate3List, checkedIds, onColumnChange])
  108. return (
  109. <Modal
  110. title='统计分类'
  111. destroyOnClose
  112. width={800}
  113. open={isModalOpen}
  114. onOk={handleOk}
  115. onCancel={handleCancel}
  116. >
  117. <Collapse items={categories} defaultActiveKey={categories.map(i => i.key as number)} />
  118. </Modal>
  119. )
  120. }