folder.tsx 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. import React, { forwardRef, Ref, useContext, useImperativeHandle } from "react"
  2. import style from './index.less'
  3. import { Button, Empty, message, Spin, Tree } from "antd"
  4. import { DataNode, DirectoryTreeProps, EventDataNode } from "antd/lib/tree";
  5. import { DispatchCloudNew } from ".";
  6. import { useDrop } from "ahooks";
  7. import { useAjax } from "@/Hook/useAjax";
  8. import { moveMaterialApi } from "@/services/adqV3/cloudNew";
  9. interface FolderRef {
  10. folderRefresh: () => void
  11. }
  12. interface Props {
  13. loading: boolean
  14. onLoadData: (treeNode: EventDataNode<DataNode>) => Promise<void>
  15. onRefreshMaterial?: () => void
  16. }
  17. /**
  18. * 自定义头部
  19. * @param param0
  20. * @returns
  21. */
  22. const TreeTitleRender: React.FC<{ nodeData: any, dragging: any, onChange: () => void }> = ({ nodeData, dragging, onChange }) => {
  23. /***************************/
  24. const moveMaterial = useAjax((params) => moveMaterialApi(params))
  25. /***************************/
  26. const [props, { isHovering }] = useDrop({
  27. onDom: (content: any) => {
  28. const hide = message.loading('移动中。。。', 0)
  29. const parentIdArr = nodeData.key.split('-')
  30. const parentIdArrLength = parentIdArr.length
  31. const parentId = Number(parentIdArr[parentIdArrLength - 1])
  32. moveMaterial.run({ folderId: parentId, materialIds: [content.id] }).then(res => {
  33. hide()
  34. if (res) {
  35. message.success('移动成功')
  36. onChange?.()
  37. }
  38. }).catch(() => hide())
  39. },
  40. });
  41. return <span {...props} style={dragging ? { border: '1px dashed #f3c6c6', borderColor: isHovering ? '#1890ff' : '#f3c6c6' } : {}}>{nodeData.title}</span>
  42. }
  43. /**
  44. * 文件夹
  45. * @returns
  46. */
  47. const Folder = forwardRef(({ loading, onLoadData, onRefreshMaterial }: Props, ref: Ref<FolderRef>) => {
  48. /******************************/
  49. const { treeData, setSelectedKeys, selectedKeys, setMaterialParams, setBreadcrumdData, findParentKeys, loadedKeys, setBatchFolderVisible, handleUpdateFolder, expandedKeys, setExpandedKeys, dragging } = useContext(DispatchCloudNew)!;
  50. /******************************/
  51. useImperativeHandle(ref, () => ({
  52. folderRefresh() {
  53. }
  54. }));
  55. // 选中文件
  56. const onSelect: DirectoryTreeProps['onSelect'] = (keys, info) => {
  57. console.log('Trigger Expand', keys, info);
  58. if (!info.selected) {
  59. return
  60. }
  61. if (keys?.length) {
  62. findParentKeys(keys?.[0] as string, treeData)
  63. } else {
  64. setBreadcrumdData([{ label: '全部素材', key: 0, currentKey: '0' }])
  65. }
  66. // 判断是否加载了下级文件 加载了 就不更新
  67. if (!loadedKeys.includes(keys[0] as string))
  68. handleUpdateFolder(keys[0] as string)
  69. setBatchFolderVisible(false)
  70. setSelectedKeys(keys);
  71. setMaterialParams(data => ({ ...data, pageNum: 1 }))
  72. };
  73. const onExpand = (expandedKeysValue: React.Key[]) => {
  74. setExpandedKeys(expandedKeysValue);
  75. };
  76. return <div className={style.folder}>
  77. <div className={style.top}>
  78. <Button
  79. style={{ padding: 0, height: 'auto', width: 71, fontSize: 14 }}
  80. onClick={() => {
  81. setSelectedKeys([])
  82. setBreadcrumdData([{ label: '全部素材', key: 0, currentKey: '0' }])
  83. }}
  84. type="text"
  85. >全部素材</Button>
  86. {/* <Input.Search enterButton style={{marginTop: 6,}} allowClear placeholder="文件夹名称" onSearch={(value) => { setQueryFormFolder({ folderName: value }) }} /> */}
  87. </div>
  88. <div className={style.bottom}>
  89. <Spin spinning={loading}>
  90. <Tree
  91. showIcon
  92. blockNode={true}
  93. selectedKeys={selectedKeys}
  94. loadData={onLoadData}
  95. onSelect={onSelect}
  96. treeData={treeData}
  97. loadedKeys={loadedKeys}
  98. onExpand={onExpand}
  99. expandedKeys={expandedKeys}
  100. titleRender={(nodeData: any) => nodeData.isSelf ? <TreeTitleRender nodeData={nodeData} dragging={dragging} onChange={() => onRefreshMaterial?.()}/> : <span>{nodeData.title}</span>}
  101. />
  102. {!(treeData?.length > 0) && (loading ? <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', height: 200 }} ></div> : <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} description="暂无文件夹" />)}
  103. </Spin>
  104. </div>
  105. </div>
  106. })
  107. export default React.memo(Folder)