You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

84 lines
2.4 KiB

1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
  1. import { Empty, Spin, Tree } from 'antd'
  2. import { MenuItem } from '@/global'
  3. import { useStyle } from '../style.ts'
  4. import { useTranslation } from '@/i18n.ts'
  5. import { useSetAtom } from 'jotai'
  6. import { batchIdsAtom, menuDataAtom, selectedMenuAtom } from '@/store/menu.ts'
  7. import { FormInstance } from 'antd/lib'
  8. import { useAtomValue } from 'jotai'
  9. import { TreeNodeRender } from './TreeNodeRender.tsx'
  10. import { useEffect, useRef } from 'react'
  11. import { flattenTree } from '@/utils'
  12. import { useDeepCompareEffect } from 'react-use'
  13. const MenuTree = ({ form }: { form: FormInstance }) => {
  14. const { styles } = useStyle()
  15. const { t } = useTranslation()
  16. const setCurrentMenu = useSetAtom(selectedMenuAtom)
  17. const setIds = useSetAtom(batchIdsAtom)
  18. const { data = [], isLoading } = useAtomValue(menuDataAtom)
  19. const flattenMenusRef = useRef<MenuItem[]>([])
  20. useDeepCompareEffect(() => {
  21. if (isLoading) return
  22. // eslint-disable-next-line @typescript-eslint/ban-ts-comment
  23. // @ts-ignore array
  24. if (data.length) {
  25. // @ts-ignore flattenTree
  26. flattenMenusRef.current = flattenTree<MenuItem[]>(data as any)
  27. // console.log(flattenMenusRef.current)
  28. }
  29. }, [ data, isLoading ])
  30. useEffect(() => {
  31. return () => {
  32. setCurrentMenu({} as MenuItem)
  33. setIds([])
  34. }
  35. }, [])
  36. const renderEmpty = () => {
  37. if ((data as any).length > 0 || isLoading) return null
  38. return <Empty description={t('message.emptyDataAdd', '暂无数据,点击添加')}/>
  39. }
  40. return (
  41. <>
  42. <Spin spinning={isLoading} style={{ minHeight: 200 }}>
  43. {
  44. renderEmpty()
  45. }
  46. <Tree.DirectoryTree
  47. className={styles.tree}
  48. treeData={data as any}
  49. defaultExpandAll={true}
  50. // draggable={true}
  51. titleRender={(node) => {
  52. return (<TreeNodeRender node={node as any} form={form}/>)
  53. }}
  54. fieldNames={{
  55. title: 'title',
  56. key: 'id'
  57. }}
  58. onSelect={(item) => {
  59. const current = flattenMenusRef.current?.find((menu) => menu.id === item[0])
  60. setCurrentMenu(current as MenuItem)
  61. form.setFieldsValue({ ...current })
  62. }}
  63. onCheck={(item) => {
  64. setIds(item as number[])
  65. }}
  66. checkable={true}
  67. showIcon={false}
  68. />
  69. </Spin>
  70. </>
  71. )
  72. }
  73. export default MenuTree