material.tsx 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604
  1. import React, { forwardRef, Ref, useContext, useEffect, useImperativeHandle, useRef, useState } from "react"
  2. import style from './index.less'
  3. import { Breadcrumb, Button, Card, Checkbox, Dropdown, Empty, message, Modal, Pagination, Popconfirm, Radio, Spin, Typography } from "antd"
  4. import { DispatchCloudNew } from "."
  5. import { deleteBatchApi, delMaterialApi, getFolderListApi, getMaterialListApi } from "@/services/adqV3/cloudNew"
  6. import { useAjax } from "@/Hook/useAjax"
  7. import { useDrag, useSize } from "ahooks"
  8. import './global.less'
  9. import { useModel } from "umi"
  10. import { CheckboxValueType } from "antd/lib/checkbox/Group"
  11. import MoveFile from "./moveFile"
  12. import { ItemType } from "antd/lib/menu/hooks/useItems"
  13. import UploadFile from "./uploadFile"
  14. import UpdateCreate from "./updateCreate"
  15. import { formatSecondsToTime, getVideoImgUrl } from "@/utils/utils"
  16. import { ExclamationCircleOutlined, MenuOutlined } from "@ant-design/icons"
  17. import UpdateFile from "./updateFile"
  18. import Details from "./details"
  19. import useFileDrop from "@/Hook/useFileDrop"
  20. import UploadsTable from "./uploadsTable"
  21. import Lazyimg from "react-lazyimg-component"
  22. import CopyFile from "./copyFile"
  23. const { Text } = Typography;
  24. interface Props {
  25. /** 新增文件夹 */
  26. onAddFolder?: () => void
  27. onUpdateFolder?: (data: any) => void
  28. onDelFolder?: (id: number, name: string) => void
  29. }
  30. interface MaterialRef {
  31. folderRefresh: () => void
  32. search: (value: {
  33. searchType: "file" | "folder";
  34. keyword?: string;
  35. }) => void
  36. onRefreshMaterial: () => void
  37. }
  38. /**
  39. * 素材列表
  40. * @returns
  41. */
  42. const Material = forwardRef(({ onAddFolder, onUpdateFolder, onDelFolder }: Props, ref1: Ref<MaterialRef>) => {
  43. /********************************/
  44. const { initialState } = useModel('@@initialState');
  45. const { breadcrumdData, setSelectedKeys, setBreadcrumdData, setMaterialParams, materialParams, selectedKeys, treeData, folderCreateBy, findParentKeys, loadedKeys, handleUpdateFolder, batchFolderVisible, setBatchFolderVisible, handleType, setHandleType, setDragging, dragging } = useContext(DispatchCloudNew)!;
  46. const ref = useRef<HTMLDivElement>(null);
  47. const size = useSize(ref);
  48. const [folderList, setFolderList] = useState<{ id: number, folderName: string, createBy: number, description?: string }[]>([])
  49. const [rowNum, setRowNum] = useState<number>(0)
  50. const [checkedFolderList, setCheckedFolderList] = useState<CheckboxValueType[]>([])
  51. const [checkFolderAll, setCheckFolderAll] = useState<boolean>(false);
  52. const [indeterminateFolder, setIndeterminateFolder] = useState<boolean>(false);
  53. const [moveVisible, setMoveVisible] = useState<boolean>(false)
  54. const [moveType, setMoveType] = useState<'folder' | 'file'>('folder')
  55. const [batchType, setBatchType] = useState<'folder' | 'file'>()
  56. const [checkedList, setCheckedList] = useState<CheckboxValueType[]>([])
  57. const [uploadVisible, setUploadVisible] = useState<boolean>(false)
  58. const [updateOwnerData, setUpdateOwnerData] = useState<{ visible?: boolean, folderId: number }>({ folderId: 0 })
  59. const [updateFileData, setUpdateFileData] = useState<{ visible?: boolean, initialValues: any }>({ visible: false, initialValues: {} })
  60. const [detailsData, setDetailsData] = useState<{ visible?: boolean, data: any }>({ visible: false, data: {} })
  61. const [copyVisible, setCopyVisible] = useState<boolean>(false)
  62. const getFolderList = useAjax((params) => getFolderListApi(params))
  63. const delMaterial = useAjax((params) => delMaterialApi(params))
  64. const deleteBatch = useAjax((params) => deleteBatchApi(params))
  65. const getMaterialList = useAjax((params) => getMaterialListApi(params))
  66. /********************************/
  67. useImperativeHandle(ref1, () => ({
  68. // 刷新文件夹
  69. folderRefresh() {
  70. getFolder()
  71. },
  72. search(value) {
  73. setHandleType('file')
  74. setMaterialParams(data => ({ ...data, ...value, pageNum: 1 }))
  75. },
  76. onRefreshMaterial() {
  77. getMaterialList.refresh()
  78. }
  79. }));
  80. // 根据内容宽度计算列数
  81. useEffect(() => {
  82. if (size?.width) {
  83. let rowNum = Math.floor((size?.width - 26) / 200)
  84. setRowNum(rowNum || 1)
  85. }
  86. }, [size?.width])
  87. useEffect(() => {
  88. cancelSelect()
  89. if (isShowFolder()) {
  90. // 文件夹
  91. getFolder()
  92. } else {
  93. // 文件
  94. getFile()
  95. }
  96. }, [selectedKeys, handleType, materialParams])
  97. /** 获取下级文件夹 */
  98. const getFolder = () => {
  99. let parentId: number | undefined;
  100. if (selectedKeys?.length) {
  101. const parentIdArr = (selectedKeys[0] as string).split('-')
  102. const parentIdArrLength = parentIdArr.length
  103. parentId = Number(parentIdArr[parentIdArrLength - 1])
  104. }
  105. getFolderList.run({ parentId }).then(res => {
  106. setFolderList(() => res || [])
  107. })
  108. }
  109. // 搜索素材
  110. const getFile = () => {
  111. let parentId: number | undefined;
  112. if (selectedKeys?.length) {
  113. const parentIdArr = (selectedKeys[0] as string).split('-')
  114. const parentIdArrLength = parentIdArr.length
  115. parentId = Number(parentIdArr[parentIdArrLength - 1])
  116. }
  117. let params = JSON.parse(JSON.stringify(materialParams))
  118. if (params?.width || params?.height) {
  119. params.sizeQueries = [{ width: params?.width, height: params?.height, relation: '=' }]
  120. delete params?.width
  121. delete params?.height
  122. } else {
  123. delete params?.sizeQueries
  124. }
  125. getMaterialList.run({ ...params, folderId: parentId })
  126. }
  127. // 文件夹选择
  128. const onCheckboxChange = (checkedValues: CheckboxValueType[]) => {
  129. let data: any[] = []
  130. if (batchType === 'folder') {
  131. data = folderList
  132. } else {
  133. data = getMaterialList?.data?.records || []
  134. }
  135. setCheckedFolderList(checkedValues)
  136. setIndeterminateFolder(!!checkedValues.length && checkedValues.length < data.length);
  137. setCheckFolderAll(checkedValues.length === data.length);
  138. };
  139. // 取消选择
  140. const cancelSelect = () => {
  141. setCheckFolderAll(false)
  142. setCheckedFolderList([])
  143. setIndeterminateFolder(false)
  144. setCheckedList([])
  145. }
  146. // 是否管理员
  147. const isAdmin = () => {
  148. return ['999'].includes(initialState?.currentUser?.powerLevel?.toString() || '')
  149. }
  150. // 是否有权限
  151. const isPermission = (createBy: any) => {
  152. return initialState?.currentUser?.userId?.toString() === createBy.toString()
  153. }
  154. // 文件夹更多
  155. const getItems = (item: any) => {
  156. let data: ItemType[] = []
  157. if (isPermission(item.createBy)) {
  158. data.push({ label: '编辑', style: { fontSize: 12 }, key: 'edit', onClick: () => onUpdateFolder?.(item) })
  159. if (!!selectedKeys?.[0]) {
  160. data.push({
  161. label: '移动', style: { fontSize: 12 }, key: 'move', onClick: () => {
  162. setCheckedList([item.id])
  163. setMoveType('folder')
  164. setMoveVisible(true)
  165. }
  166. })
  167. } else if (isAdmin()) {
  168. data.push({
  169. label: '修改文件夹所属人', style: { fontSize: 12 }, key: 'createBy', onClick: () => {
  170. setUpdateOwnerData({ visible: true, folderId: item.id })
  171. }
  172. })
  173. }
  174. data.push({ label: <span style={{ color: 'red', fontSize: 12 }}>删除</span>, key: 'del', onClick: () => onDelFolder?.(item.id, item?.folderName) })
  175. } else {
  176. if (isAdmin() && !selectedKeys?.[0]) {
  177. data.push({
  178. label: '修改文件夹所属人', style: { fontSize: 12 }, key: 'createBy', onClick: () => {
  179. setUpdateOwnerData({ visible: true, folderId: item.id })
  180. }
  181. })
  182. }
  183. }
  184. return data
  185. }
  186. // 删除素材
  187. const delFile = (id: number, name: string) => {
  188. Modal.confirm({
  189. title: <strong>{`删除素材“${name}”`}</strong>,
  190. icon: <ExclamationCircleOutlined />,
  191. content: '是否确定删除该素材',
  192. okText: '确认',
  193. cancelText: '取消',
  194. className: 'modalResetCss',
  195. onOk: () => {
  196. return new Promise((resolve: (value: unknown) => void) => {
  197. delMaterial.run(id).then(res => {
  198. if (res) {
  199. message.success('删除成功');
  200. getMaterialList.refresh()
  201. resolve('')
  202. }
  203. })
  204. })
  205. }
  206. });
  207. }
  208. // 操作素材 更多
  209. const getItemsFile = (item: any) => {
  210. let data: ItemType[] = []
  211. if (isPermission(item.createBy)) {
  212. data.push({
  213. label: <div onClick={(e) => {
  214. e.stopPropagation()
  215. e.preventDefault()
  216. setUpdateFileData({ visible: true, initialValues: item })
  217. }}>编辑</div>, style: { fontSize: 12 }, key: 'edit'
  218. })
  219. if (!!selectedKeys?.[0]) {
  220. data.push({
  221. label: <div onClick={(e) => {
  222. e.stopPropagation()
  223. e.preventDefault()
  224. setCheckedList([item.id])
  225. setMoveType('file')
  226. setMoveVisible(true)
  227. }}>移动</div>, style: { fontSize: 12 }, key: 'move'
  228. })
  229. }
  230. data.push({
  231. label: <div style={{ color: 'red', fontSize: 12 }} onClick={(e) => {
  232. e.stopPropagation()
  233. e.preventDefault()
  234. delFile(item.id, item?.materialName)
  235. }}>删除</div>, key: 'del'
  236. })
  237. }
  238. return data
  239. }
  240. // 是否展示文件夹
  241. const isShowFolder = () => {
  242. return handleType === 'folder'
  243. }
  244. // 获取拖拽的文件
  245. const [fileList, setFileList] = useState<FileList>()
  246. const [uploadsVisible, setUploadsVisible] = useState<boolean>(false)
  247. const { isDragOver, dropAreaProps } = useFileDrop((fileList) => {
  248. if (!dragging) {
  249. setFileList(fileList)
  250. setUploadsVisible(true)
  251. }
  252. });
  253. const getDragProps = useDrag({
  254. onDragStart: (data, e) => {
  255. const dragImage = new Image();
  256. dragImage.width = 50
  257. dragImage.src = data.materialType === 'image' ? data.ossUrl : getVideoImgUrl(data.ossUrl);
  258. e.dataTransfer.setDragImage((e.target as any).parentNode.querySelector('.lazy') || dragImage, 0, 0);
  259. setDragging(data);
  260. },
  261. onDragEnd: () => {
  262. setDragging(null);
  263. },
  264. });
  265. return <div className={style.material}>
  266. <div className={style.operates}>
  267. <div className={style.left_bts}>
  268. <Checkbox
  269. onChange={(e) => {
  270. setHandleType(e.target.checked ? 'folder' : 'file')
  271. setMaterialParams({ pageNum: 1, pageSize: 30 })
  272. setBatchFolderVisible(false)
  273. cancelSelect()
  274. }}
  275. checked={handleType === 'folder'}
  276. ><span style={{ fontSize: 12 }}>是否操作文件夹</span></Checkbox>
  277. {handleType === 'folder' && <Button onClick={() => onAddFolder?.()} disabled={folderCreateBy ? !isPermission(folderCreateBy) : false}>新建文件夹</Button>}
  278. {(!selectedKeys?.[0] && handleType === 'folder') && <>
  279. <Button type="primary" disabled={folderCreateBy ? !isPermission(folderCreateBy) : false} onClick={() => setUploadVisible(true)}>上传素材</Button>
  280. </>}
  281. {handleType === 'folder' ? <>
  282. {!!selectedKeys?.[0] && <Button onClick={() => { setBatchFolderVisible(true); setBatchType('folder') }} disabled={folderCreateBy ? !isPermission(folderCreateBy) : false}>批量操作文件夹</Button>}
  283. </> : <>
  284. <Button type="primary" disabled={folderCreateBy ? !isPermission(folderCreateBy) : false} onClick={() => setUploadVisible(true)}>上传素材</Button>
  285. <Button onClick={() => { setBatchFolderVisible(true); setBatchType('file') }} disabled={folderCreateBy ? !isPermission(folderCreateBy) : false}>批量操作素材</Button>
  286. </>}
  287. </div>
  288. <div className={style.left_bts}>
  289. <Button type="link" loading={getMaterialList.loading} onClick={() => {
  290. getMaterialList.refresh()
  291. }}>刷新</Button>
  292. </div>
  293. </div>
  294. {batchFolderVisible ? <div className={style.operates}>
  295. <div className={style.left_bts}>
  296. <Checkbox
  297. onChange={(e) => {
  298. setCheckedFolderList(
  299. e.target.checked ? batchType === 'folder' ?
  300. folderList.map(item => item.id) :
  301. getMaterialList?.data?.records?.filter((item: { createBy: any }) => isPermission(item.createBy)).map((item: { id: any }) => item.id) :
  302. []
  303. )
  304. setIndeterminateFolder(false)
  305. setCheckFolderAll(e.target.checked)
  306. }}
  307. disabled={batchType === 'folder' ? folderList?.length ? false : true : !getMaterialList?.data?.records?.some((item: { createBy: any }) => isPermission(item.createBy))}
  308. indeterminate={indeterminateFolder}
  309. checked={checkFolderAll}
  310. >全选</Checkbox>
  311. <span style={{ color: '#1890FF' }}>已选{checkedFolderList?.length || 0}个{batchType === 'file' ? '素材' : '文件夹'}</span>
  312. </div>
  313. <div className={style.left_bts}>
  314. <Button disabled={checkedFolderList?.length === 0} onClick={() => {
  315. setCheckedList(checkedFolderList)
  316. setMoveVisible(true)
  317. setMoveType(batchType as any)
  318. }}>{batchType === 'folder' ? '移动文件夹' : '移动素材'}</Button>
  319. {batchType === 'file' && <Button
  320. disabled={checkedFolderList?.length === 0}
  321. onClick={() => {
  322. setCheckedList(checkedFolderList)
  323. setCopyVisible(true)
  324. }}
  325. >复制素材到</Button>}
  326. {batchType === 'file' && <Popconfirm
  327. title="确定删除?"
  328. onConfirm={() => {
  329. const hide = message.loading('正在删除...', 0, () => { });
  330. deleteBatch.run(checkedFolderList).then(res => {
  331. hide()
  332. if (res) {
  333. getMaterialList.refresh()
  334. message.success('删除成功')
  335. }
  336. }).catch(() => hide())
  337. }}
  338. >
  339. <Button danger disabled={checkedFolderList?.length === 0} loading={deleteBatch.loading}>删除</Button>
  340. </Popconfirm>}
  341. <Button type="primary" onClick={() => {
  342. setBatchFolderVisible(false)
  343. }}>完成</Button>
  344. </div>
  345. </div> : (materialParams?.materialName || materialParams?.materialType || (materialParams?.designerIds && materialParams?.designerIds?.length > 0) || materialParams?.width || materialParams?.height) ? <div className={style.operates}>
  346. <span>搜索「素材」
  347. {materialParams?.materialName && <span style={{ fontSize: 12 }}>关键词【{materialParams.materialName}】</span>}
  348. {(materialParams?.designerIds && materialParams?.designerIds?.length > 0) && <span style={{ fontSize: 12 }}>设计师ID【{materialParams.designerIds.join(',')}】</span>}
  349. {materialParams?.materialType && <span style={{ fontSize: 12 }}>素材类型【{materialParams.materialType === 'video' ? '视频' : '图片'}】</span>}
  350. {materialParams?.width && <span style={{ fontSize: 12 }}>素材宽【{materialParams.width}】</span>}
  351. {materialParams?.height && <span style={{ fontSize: 12 }}>素材高【{materialParams.height}】</span>}
  352. </span>
  353. </div> : <div className={style.operates}>
  354. <Breadcrumb>
  355. {breadcrumdData.map((item, index) => <Breadcrumb.Item key={item.key}>
  356. {breadcrumdData.length !== index + 1 ? <a
  357. style={{ color: '#1890ff' }}
  358. onClick={() => {
  359. setBreadcrumdData(data => data.splice(0, index + 1))
  360. setSelectedKeys(item.currentKey === '0' ? [] : [item.currentKey])
  361. }}
  362. >{item.label}</a> : item.label}
  363. </Breadcrumb.Item>)}
  364. </Breadcrumb>
  365. </div>}
  366. <div className={`${style.content} content_global`}>
  367. <Spin spinning={getFolderList.loading || getMaterialList.loading}>
  368. <div className={style.content_scroll} ref={ref} {...dropAreaProps}>
  369. {(isDragOver && !dragging) && <div className={`${style.placeholder} ${isDragOver ? style.dragOver : ''}`}><span>拖动文件到这里</span></div>}
  370. {(isShowFolder() && folderList.length > 0) || (!isShowFolder() && getMaterialList?.data?.records?.length > 0) ? <Checkbox.Group value={checkedFolderList} style={{ width: '100%' }} onChange={onCheckboxChange}>
  371. <div className={style.content_scroll_div}>
  372. {isShowFolder() ? folderList.map((item) => <div key={item.id} className={style.content_row} style={{ width: rowNum ? (1 / rowNum * 100) + '%' : 200 }}>
  373. <Card
  374. hoverable
  375. bodyStyle={{ padding: 0 }}
  376. className={`${style.content_col}`}
  377. cover={<div className={style.content_cover} style={{ height: 120 }}>
  378. {batchFolderVisible && <div className={style.checkbox}><Checkbox value={item.id} disabled={!isPermission(item.createBy)} /></div>}
  379. <img src={require('../../../../../public/file.png')} height={'100%'} alt="" />
  380. </div>}
  381. onDoubleClick={() => {
  382. if (!batchFolderVisible) {
  383. let newExpandedKeys = '0-' + item.id
  384. if (selectedKeys?.[0]) {
  385. newExpandedKeys = selectedKeys[0] + '-' + item.id
  386. }
  387. findParentKeys(newExpandedKeys, treeData)
  388. setSelectedKeys([newExpandedKeys])
  389. // 判断是否加载了下级文件 加载了 就不更新
  390. if (!loadedKeys.includes(newExpandedKeys))
  391. handleUpdateFolder(newExpandedKeys)
  392. }
  393. }}
  394. >
  395. <div className={style.body}>
  396. <Text ellipsis>{item?.folderName}</Text>
  397. </div>
  398. <div className={style.actions}>
  399. <div style={{ height: 22 }}></div>
  400. {isPermission(item.createBy) || (!selectedKeys?.[0] && isAdmin()) ? <Dropdown menu={{
  401. items: getItems(item)
  402. }}>
  403. <a onClick={e => e.preventDefault()} style={{ fontSize: 11 }}>更多</a>
  404. </Dropdown> : <a style={{ fontSize: 11 }}>无权限操作</a>}
  405. </div>
  406. </Card>
  407. </div>) : getMaterialList?.data?.records.map((item: any) => <div key={item.id} className={style.content_row} style={{ width: rowNum ? (1 / rowNum * 100) + '%' : 200 }}>
  408. <Card
  409. hoverable
  410. bodyStyle={{ padding: 0 }}
  411. className={`${style.content_col}`}
  412. cover={<div style={{ height: 120, padding: 0 }} className={style.content_cover}>
  413. {batchFolderVisible && <div className={style.checkbox} onClick={(e) => { e.stopPropagation(); }}><Checkbox value={item.id} disabled={!isPermission(item.createBy)} /></div>}
  414. {item.materialType === 'video' && <div className={style.playr}>
  415. <img src={require('../../../../../public/image/play.png')} alt="" />
  416. </div>}
  417. <div className={style.file_info}>
  418. <div>{item.width}*{item.height}</div>
  419. {item.materialType === 'video' && <div>{formatSecondsToTime(Math.floor(item.videoDuration))}</div>}
  420. </div>
  421. <Lazyimg
  422. animateType="transition"
  423. src={item.materialType === 'image' ? item.ossUrl : getVideoImgUrl(item.ossUrl)}
  424. className={`${style.coverImg} lazy`}
  425. animateClassName={['transition-enter', 'transition-enter-active']}
  426. />
  427. {item.createBy?.toString() === initialState?.currentUser?.userId?.toString() && <div
  428. className={style.move}
  429. {...getDragProps(item)}
  430. ><MenuOutlined /></div>}
  431. </div>}
  432. onClick={() => { setDetailsData({ visible: true, data: item }) }}
  433. >
  434. <div className={style.body} style={{ paddingBottom: 0 }}>
  435. <div className={style.title}><Text ellipsis>{item?.materialName}</Text></div>
  436. <a className={style.detailBt}>详情</a>
  437. </div>
  438. <div className={style.actions}>
  439. <div style={{ height: 20, width: 100, flex: '1 0' }}>
  440. <Text ellipsis={{ tooltip: true }} style={{ fontSize: 11 }}>{item?.description}</Text>
  441. </div>
  442. {isPermission(item.createBy) ? <Dropdown
  443. menu={{
  444. items: getItemsFile(item)
  445. }}
  446. >
  447. <a onClick={e => { e.preventDefault(); e.stopPropagation() }} style={{ fontSize: 11 }}>更多</a>
  448. </Dropdown> : <a style={{ fontSize: 11 }}>无权限操作</a>}
  449. </div>
  450. </Card>
  451. </div>)}
  452. </div>
  453. </Checkbox.Group> : <div style={{ height: '100%', width: '100%', alignContent: 'center' }}><Empty image={Empty.PRESENTED_IMAGE_SIMPLE} /></div>}
  454. </div>
  455. </Spin>
  456. </div>
  457. {handleType === 'file' && <div className={style.fotter}>
  458. <Pagination
  459. size="small"
  460. total={getMaterialList?.data?.totalRow || 0}
  461. showSizeChanger
  462. showQuickJumper
  463. pageSize={getMaterialList?.data?.pageSize || 30}
  464. current={getMaterialList?.data?.pageNumber || 1}
  465. onChange={(page: number, pageSize: number) => {
  466. ref.current?.scrollTo({ top: 0 })
  467. setTimeout(() => setMaterialParams({ ...materialParams, pageNum: page, pageSize }), 50)
  468. }}
  469. />
  470. </div>}
  471. {/* 移动文件 素材 */}
  472. {moveVisible && <MoveFile
  473. moveType={moveType}
  474. checkedList={checkedList}
  475. userId={initialState?.currentUser?.userId?.toString() || ''}
  476. visible={moveVisible}
  477. onClose={() => {
  478. setMoveVisible(false)
  479. cancelSelect()
  480. }}
  481. onChange={(selectedKey: string) => {
  482. getFolder()
  483. setMoveVisible(false)
  484. if (moveType === 'folder') {
  485. handleUpdateFolder(selectedKeys[0] as string)
  486. if (loadedKeys.includes(selectedKey)) {
  487. handleUpdateFolder(selectedKey)
  488. }
  489. } else {
  490. getMaterialList.refresh()
  491. }
  492. cancelSelect()
  493. setBatchFolderVisible(false)
  494. }}
  495. />}
  496. {/* 复制 素材 */}
  497. {copyVisible && <CopyFile
  498. checkedList={checkedList}
  499. userId={initialState?.currentUser?.userId?.toString() || ''}
  500. visible={copyVisible}
  501. onClose={() => {
  502. setCopyVisible(false)
  503. cancelSelect()
  504. }}
  505. onChange={() => {
  506. setCopyVisible(false)
  507. getMaterialList.refresh()
  508. cancelSelect()
  509. setBatchFolderVisible(false)
  510. }}
  511. />}
  512. {/* 上传文件 */}
  513. {uploadVisible && <UploadFile
  514. folderId={breadcrumdData[breadcrumdData.length - 1].key}
  515. userId={(initialState?.currentUser?.userId || 0) as number}
  516. visible={uploadVisible}
  517. onChange={() => {
  518. setUploadVisible(false)
  519. getMaterialList.refresh()
  520. }}
  521. onClose={() => {
  522. setUploadVisible(false)
  523. }}
  524. />}
  525. {/* 修改所属人 */}
  526. {updateOwnerData.visible && <UpdateCreate
  527. {...updateOwnerData}
  528. onClose={() => {
  529. setUpdateOwnerData({ visible: false, folderId: 0 })
  530. }}
  531. onChange={() => {
  532. getFolder()
  533. setUpdateOwnerData({ visible: false, folderId: 0 })
  534. }}
  535. />}
  536. {/* 修改素材 */}
  537. {updateFileData?.visible && <UpdateFile
  538. {...updateFileData}
  539. onClose={() => {
  540. setUpdateFileData({ visible: false, initialValues: {} })
  541. }}
  542. onChange={() => {
  543. getMaterialList.refresh()
  544. setUpdateFileData({ visible: false, initialValues: {} })
  545. }}
  546. />}
  547. {/* 素材详情 */}
  548. {detailsData?.visible && <Details
  549. {...detailsData}
  550. onClose={() => {
  551. setDetailsData({ visible: false, data: {} })
  552. }}
  553. onChange={() => {
  554. getMaterialList.refresh()
  555. }}
  556. />}
  557. {/* 拖动上传 */}
  558. {uploadsVisible && <UploadsTable
  559. folderId={breadcrumdData[breadcrumdData.length - 1].key}
  560. userId={(initialState?.currentUser?.userId || 0) as number}
  561. visible={uploadsVisible}
  562. fileList={fileList}
  563. isPermission={!!(folderCreateBy && isPermission(folderCreateBy))}
  564. onClose={() => {
  565. setUploadsVisible(false)
  566. setFileList(undefined)
  567. }}
  568. onChange={() => {
  569. setUploadsVisible(false)
  570. setFileList(undefined)
  571. getMaterialList.refresh()
  572. }}
  573. />}
  574. </div>
  575. })
  576. export default React.memo(Material)