selectFolder.tsx 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import { useAjax } from "@/Hook/useAjax"
  2. import { getFolderListApi } from "@/services/adqV3/cloudNew"
  3. import { DataNode, DirectoryTreeProps, EventDataNode } from "antd/lib/tree";
  4. import React, { useEffect, useState } from "react"
  5. import { updateTreeData } from "./const";
  6. import style from './index.less'
  7. import { Button, Empty, Spin, Tree } from "antd";
  8. interface Props {
  9. selectedKeys?: number
  10. onChange?: (selectedKeys?: number) => void
  11. }
  12. /**
  13. * 文件夹
  14. * @returns
  15. */
  16. const SelectFolder: React.FC<Props> = ({ selectedKeys, onChange }) => {
  17. /******************************/
  18. const [treeData, setTreeData] = useState<DataNode[]>([]);
  19. const getFolderList = useAjax((params) => getFolderListApi(params))
  20. /******************************/
  21. useEffect(() => {
  22. getFolder()
  23. }, [])
  24. const getFolder = () => {
  25. getFolderList.run({}).then(res => {
  26. setTreeData(() => res?.map((item: { folderName: any; id: any; createBy: number }) => ({
  27. title: item.folderName,
  28. value: item.id,
  29. key: item.id,
  30. })) || [])
  31. })
  32. }
  33. // 下级目录
  34. const handleUpdateFolder = (parentId: number) => {
  35. return getFolderListApi({ parentId }).then(res => {
  36. setTreeData(origin =>
  37. updateTreeData(origin, parentId, res?.data?.map((item: { folderName: any; id: any; createBy: number }) => ({
  38. title: item.folderName,
  39. value: item.id,
  40. key: item.id,
  41. })) || []),
  42. );
  43. })
  44. }
  45. // 选中文件
  46. const onSelect: DirectoryTreeProps['onSelect'] = (keys, info) => {
  47. console.log('Trigger Expand', keys, info);
  48. onChange?.(keys?.length > 0 ? keys[0] : undefined as any)
  49. };
  50. return <div className={style.folder} style={{ width: 180 }}>
  51. <div className={style.top}>
  52. <Button
  53. style={{ padding: 0, height: 'auto', width: 71, fontSize: 14 }}
  54. onClick={() => {
  55. onChange?.()
  56. }}
  57. type="link"
  58. >全部素材</Button>
  59. </div>
  60. <div className={style.bottom}>
  61. <Spin spinning={getFolderList.loading}>
  62. <Tree
  63. showIcon
  64. blockNode={true}
  65. selectedKeys={selectedKeys ? [selectedKeys] : undefined}
  66. loadData={(treeNode: EventDataNode<DataNode>) => {
  67. return new Promise<void>(async (resolve) => {
  68. console.log('Trigger Select', treeNode);
  69. await handleUpdateFolder(Number(treeNode.key))
  70. resolve()
  71. })
  72. }}
  73. onSelect={onSelect}
  74. treeData={treeData}
  75. />
  76. {!(treeData?.length > 0) && (getFolderList.loading ? <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', height: 200 }} ></div> : <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} description="暂无文件夹" />)}
  77. </Spin>
  78. </div>
  79. </div>
  80. }
  81. export default React.memo(SelectFolder)