|
@@ -0,0 +1,166 @@
|
|
|
+import React, { useEffect, useRef, useState } from "react"
|
|
|
+import style from './index.less'
|
|
|
+import Folder from "./folder";
|
|
|
+import Material from "./material";
|
|
|
+import { Card } from "antd";
|
|
|
+import '../../tencentAdPutIn/index.less'
|
|
|
+import { DataNode, EventDataNode } from "antd/lib/tree";
|
|
|
+import { getFolderListApi } from "@/services/adqV3/cloudNew";
|
|
|
+import { useAjax } from "@/Hook/useAjax";
|
|
|
+import ManageFolder from "./manageFolder";
|
|
|
+import { FolderOpenOutlined, FolderOutlined } from "@ant-design/icons";
|
|
|
+
|
|
|
+export const DispatchCloudNew = React.createContext<CLOUDNEW.CloudNewReactContent | null>(null);
|
|
|
+
|
|
|
+/**
|
|
|
+ * 新版素材库
|
|
|
+ * @returns
|
|
|
+ */
|
|
|
+const CloudNew: React.FC = () => {
|
|
|
+
|
|
|
+ /**********************************/
|
|
|
+ const refMaterial = useRef(null);
|
|
|
+ const [treeData, setTreeData] = useState<DataNode[]>([]);
|
|
|
+ const [expandedKeys, setExpandedKeys] = useState<React.Key[]>([]);
|
|
|
+ const [queryFormFolder, setQueryFormFolder] = useState<CLOUDNEW.GetFolderListProps>({})
|
|
|
+ const [folderVisible, setFolderVisible] = useState<boolean>(false)
|
|
|
+ const [folderLoading, setFolderLoading] = useState<boolean>(false)
|
|
|
+ const [breadcrumdData, setBreadcrumdData] = useState<CLOUDNEW.BreadcrumdData[]>([{ label: '全部素材', key: 0, currentKey: '0' }])
|
|
|
+ const [loadedKeys, setLoadedKeys] = useState<string[]>([]) // 已经加载了的节点
|
|
|
+
|
|
|
+ const getFolderList = useAjax((params) => getFolderListApi(params))
|
|
|
+ /**********************************/
|
|
|
+
|
|
|
+ useEffect(() => {
|
|
|
+ handleGetFolder()
|
|
|
+ }, [queryFormFolder?.folderName])
|
|
|
+
|
|
|
+ // 获取顶级文件夹列表
|
|
|
+ const handleGetFolder = () => {
|
|
|
+ setFolderLoading(() => true)
|
|
|
+ setLoadedKeys(() => [])
|
|
|
+ getFolderList.run({ folderName: queryFormFolder?.folderName }).then(res => {
|
|
|
+ setFolderLoading(() => false)
|
|
|
+ setTreeData(() => res?.map((item: { folderName: any; id: any; }) => ({
|
|
|
+ title: item.folderName,
|
|
|
+ key: '0-' + item.id,
|
|
|
+ icon: ({ selected }: any) => (selected ? <FolderOpenOutlined style={{ color: 'rgb(255, 202, 40)' }} /> : <FolderOutlined style={{ color: 'rgb(255, 202, 40)' }} />),
|
|
|
+ })) || [])
|
|
|
+ }).catch(() => setFolderLoading(false))
|
|
|
+ }
|
|
|
+
|
|
|
+ // 下级目录
|
|
|
+ const handleUpdateFolder = (parentIdStr: string) => {
|
|
|
+ const parentIdArr = parentIdStr.split('-')
|
|
|
+ const parentIdArrLength = parentIdArr.length
|
|
|
+ const parentId = Number(parentIdArr[parentIdArrLength - 1])
|
|
|
+ return getFolderListApi({ parentId }).then(res => {
|
|
|
+ setLoadedKeys(loadedkeys => [...loadedkeys, parentIdStr])
|
|
|
+ setTreeData(origin =>
|
|
|
+ updateTreeData(origin, parentIdStr, res?.data?.map((item: { folderName: any; id: any; }) => ({
|
|
|
+ title: item.folderName,
|
|
|
+ key: parentIdStr + '-' + item.id,
|
|
|
+ icon: ({ selected }: any) => (selected ? <FolderOpenOutlined /> : <FolderOutlined />)
|
|
|
+ })) || []),
|
|
|
+ );
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ // 更新目录
|
|
|
+ const updateTreeData = (list: DataNode[], key: React.Key, children: DataNode[]): DataNode[] => {
|
|
|
+ return list.map(node => {
|
|
|
+ if (node.key === key) {
|
|
|
+ return {
|
|
|
+ ...node,
|
|
|
+ children,
|
|
|
+ };
|
|
|
+ }
|
|
|
+ if (node.children) {
|
|
|
+ return {
|
|
|
+ ...node,
|
|
|
+ children: updateTreeData(node.children, key, children),
|
|
|
+ };
|
|
|
+ }
|
|
|
+ return node;
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ // 查找所有菜单列表(m面包屑)
|
|
|
+ const findParentKeys = (key: string, tree: DataNode[]) => {
|
|
|
+ let newBreadcrumdData: CLOUDNEW.BreadcrumdData[] = [{ label: '全部素材', key: 0, currentKey: '0' }]
|
|
|
+ let keys = key.split('-')
|
|
|
+ let treeData: DataNode[] = JSON.parse(JSON.stringify(tree))
|
|
|
+ let currentKey: string = '0'
|
|
|
+ keys.forEach((item, index) => {
|
|
|
+ if (index !== 0) {
|
|
|
+ currentKey = currentKey + '-' + item
|
|
|
+ let treeD = treeData.find(item => item.key === currentKey)
|
|
|
+ if (treeD) {
|
|
|
+ if (treeD?.children) {
|
|
|
+ treeData = treeD.children
|
|
|
+ }
|
|
|
+ newBreadcrumdData.push({ label: treeD?.title as string, key: Number(item), currentKey })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+ setBreadcrumdData(newBreadcrumdData)
|
|
|
+ };
|
|
|
+
|
|
|
+ return <Card
|
|
|
+ style={{ height: '100%' }}
|
|
|
+ bodyStyle={{ padding: 0, overflow: 'auto hidden', height: '100%' }}
|
|
|
+ className="cardResetCss buttonResetCss"
|
|
|
+ bordered
|
|
|
+ >
|
|
|
+ <div className={style.cloudNew}>
|
|
|
+ <DispatchCloudNew.Provider value={{
|
|
|
+ treeData, setTreeData,
|
|
|
+ expandedKeys, setExpandedKeys,
|
|
|
+ queryFormFolder, setQueryFormFolder,
|
|
|
+ breadcrumdData, setBreadcrumdData,
|
|
|
+ loadedKeys, setLoadedKeys,
|
|
|
+ findParentKeys
|
|
|
+ }}>
|
|
|
+ {/* 文件夹 */}
|
|
|
+ <Folder
|
|
|
+ loading={folderLoading}
|
|
|
+ onLoadData={(treeNode: EventDataNode<DataNode>) => {
|
|
|
+ return new Promise<void>(async (resolve) => {
|
|
|
+ console.log('Trigger Select', treeNode);
|
|
|
+ await handleUpdateFolder(treeNode.key as string)
|
|
|
+ resolve()
|
|
|
+ })
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ {/* 素材列表 */}
|
|
|
+ <Material
|
|
|
+ onAddFolder={() => {
|
|
|
+ setFolderVisible(true)
|
|
|
+ }}
|
|
|
+ ref={refMaterial}
|
|
|
+ />
|
|
|
+ </DispatchCloudNew.Provider>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ {/* 文件夹新增修改 */}
|
|
|
+ {folderVisible && <ManageFolder
|
|
|
+ parentIdStr={expandedKeys?.[0] as string || '0'}
|
|
|
+ visible={folderVisible}
|
|
|
+ onClose={() => {
|
|
|
+ setFolderVisible(false)
|
|
|
+ }}
|
|
|
+ onChange={(newData) => {
|
|
|
+ setFolderVisible(false)
|
|
|
+ if (expandedKeys?.[0]) {
|
|
|
+ (refMaterial.current as any).folderRefresh()
|
|
|
+ handleUpdateFolder(expandedKeys[0] as string)
|
|
|
+ } else {
|
|
|
+ // handleGetFolder()
|
|
|
+ setTreeData(data => [...data, { title: newData.folderName, key: '0-' + newData.id, icon: ({ selected }: any) => (selected ? <FolderOpenOutlined style={{ color: 'rgb(255, 202, 40)' }} /> : <FolderOutlined style={{ color: 'rgb(255, 202, 40)' }} />) }])
|
|
|
+ }
|
|
|
+ }}
|
|
|
+ />}
|
|
|
+ </Card>
|
|
|
+}
|
|
|
+
|
|
|
+export default CloudNew
|