diff --git a/src/components/ItemTree/DirAddDir/index.jsx b/src/components/ItemTree/DirAddDir/index.jsx
new file mode 100644
index 0000000..c4f412d
--- /dev/null
+++ b/src/components/ItemTree/DirAddDir/index.jsx
@@ -0,0 +1,51 @@
+import React, {useRef, useState} from 'react';
+import {Input, message, Modal} from 'antd';
+import {useDispatch, useSelector} from "react-redux";
+import {newDir} from "../../../utils/File";
+import {dirDirAdd} from "../../../redux/dirMessage_reducer";
+import {isEmpty} from "../../../utils/ObjectUtils";
+import {fileDirFormat} from "../../../utils/PathOperate";
+
+const DirAddDir = (prop) => {
+ console.log("prop",prop)
+ const [isModalOpen, setIsModalOpen] = useState(false);
+ const dispatch = useDispatch();
+ const inputValue = useRef(null);
+ const [messageApi, contextHolder] = message.useMessage();
+
+ const showModal = () => {
+ setIsModalOpen(true);
+ };
+ const handleOk = () => {
+ console.log("inputValue",inputValue.current.input.value)
+ // 如果为空则提示
+ if (isEmpty(inputValue.current.input.value)){
+ let messageType = messageApi.open({
+ type: 'error',
+ content: '文件夹名不能为空',
+ });
+ return
+ }
+ // 新建文件
+ let fileName = inputValue.current.input.value;
+ let filePath = fileDirFormat(prop.fileDir,fileName)
+ console.log("DirAddDir-filePath",filePath)
+ newDir(filePath)
+ // 更新树
+ dispatch(dirDirAdd({"filePath":filePath,"fileDir":prop.fileDir,fileName}))
+ setIsModalOpen(false);
+ prop.closeMenu()
+ };
+ const handleCancel = () => {
+ setIsModalOpen(false);
+ prop.closeMenu()
+ };
+ return <>
+ {contextHolder}
+ 添加文件夹
+
+
+
+ >;
+};
+export default DirAddDir;
\ No newline at end of file
diff --git a/src/components/ItemTree/DirAddFile/index.jsx b/src/components/ItemTree/DirAddFile/index.jsx
index df69c86..7d8e7b8 100644
--- a/src/components/ItemTree/DirAddFile/index.jsx
+++ b/src/components/ItemTree/DirAddFile/index.jsx
@@ -5,7 +5,7 @@ import {newFile} from "../../../utils/File";
import {dirFileAdd} from "../../../redux/dirMessage_reducer";
import {addTableBarItem} from "../../../redux/tableBarItem_reducer";
import {isEmpty} from "../../../utils/ObjectUtils";
-import {fileNameFormat} from "../../../utils/PathOperate";
+import {fileNameFormat, fullFileNameFormat} from "../../../utils/PathOperate";
const DirAddFile = (prop) => {
console.log("prop",prop)
@@ -28,16 +28,17 @@ const DirAddFile = (prop) => {
return
}
// 新建文件
- let fileName = fileNameFormat(prop.filePath,inputValue.current.input.value,".lexical")
- newFile(fileName)
+ let fileName = inputValue.current.input.value+".lexical";
+ let filePath = fullFileNameFormat(prop.fileDir,fileName)
+ newFile(filePath)
// 更新树
- dispatch(dirFileAdd({"filePath":prop.filePath,fileName}))
+ dispatch(dirFileAdd({"fileDir":prop.fileDir,"filePath":filePath,fileName}))
// 选中key,添加bar
dispatch(addTableBarItem({
- label: inputValue.current.input.value+".lexical",
- children: fileName,
- key: fileName,
- activeKey: fileName
+ label: fileName,
+ children: filePath,
+ key: filePath,
+ activeKey: filePath
}))
setIsModalOpen(false);
prop.closeMenu()
diff --git a/src/components/ItemTree/index.jsx b/src/components/ItemTree/index.jsx
index 50d87b9..cc21c21 100644
--- a/src/components/ItemTree/index.jsx
+++ b/src/components/ItemTree/index.jsx
@@ -1,8 +1,8 @@
import React, {useEffect, useMemo, useState} from 'react';
import {Input, Menu, Tree} from 'antd';
-import {FolderOutlined, FileMarkdownOutlined, FileOutlined, DeleteOutlined, RedoOutlined} from '@ant-design/icons';
+import {FolderOutlined, FileMarkdownOutlined, FileOutlined} from '@ant-design/icons';
import "./index.less"
-import {getFileDirByPath, getFileFullNameByPath, getFileNameByPath} from "../../utils/PathOperate";
+import {getFileNameByPath} from "../../utils/PathOperate";
const {Search} = Input;
import {useSelector, useDispatch} from "react-redux";
import {addExpandedKeys, addTableBarItem, setExpandedKeys} from "../../redux/tableBarItem_reducer";
@@ -14,6 +14,7 @@ import RefreshDir from "./RefreshDir";
import CloseDir from "./CloseDir";
import DirAddFile from "./DirAddFile";
import DirDeleteFile from "./DirDeleteFile";
+import DirAddDir from "./DirAddDir";
// const defaultData = [];
// 将树平铺用于查找
const dataList = [];
@@ -288,8 +289,12 @@ const ItemTree = (prop) => {
setState("")}/>
,
dirFlag &&
+
+ setState("")}/>
+ ,
+ dirFlag &&
- itemTreeAddFile(dirMessage)} closeMenu={() => setState("")}/>
+ itemTreeAddFile(dirMessage)} closeMenu={() => setState("")}/>
,
!dirFlag &&
@@ -326,7 +331,7 @@ const ItemTree = (prop) => {
// 是否自动展开父节点
autoExpandParent={autoExpandParent}
showIcon={true}
- selectedKeys={[useSelector(state => state.tableBarItem.activeKey)]}
+ // selectedKeys={[useSelector(state => state.tableBarItem.activeKey)]}
defaultExpandedKeys={useSelector(state => state.tableBarItem.expandedKeyList)}
// treeNodes 数据,如果设置则不需要手动构造 TreeNode 节点(key 在整个树范围内唯一)
treeData={defaultValueState}
diff --git a/src/redux/dirMessage_reducer.js b/src/redux/dirMessage_reducer.js
index 7775a31..f31fd5a 100644
--- a/src/redux/dirMessage_reducer.js
+++ b/src/redux/dirMessage_reducer.js
@@ -110,24 +110,49 @@ export const dirMessageSlice = createSlice({
},
dirFileAdd:(state,action)=>{
console.log("dirMessage:dirFileAdd", state, action)
+ let fileDir = action.payload.fileDir
let filePath = action.payload.filePath
let fileName = action.payload.fileName
let fileMessage = {
- "fileName": getFileFullNameByPath(fileName),
- "filePath": fileName,
+ "fileName": fileName,
+ "filePath": filePath,
"dirFlag": false,
"children": []
}
// 查找旧文件并且修改文件信息
state.data.forEach(file => {
- if (file.filePath === filePath) {
+ if (file.filePath === fileDir) {
if (Array.isArray(file.children)){
file.children.push(fileMessage)
}else {
file.children=[fileMessage]
}
- } else if (file.children.length > 0 && file.filePath.startsWith(filePath)) {
- dirFileAddChild(file.children, filePath, fileMessage)
+ } else if (file.children.length > 0 && filePath.startsWith(file.filePath)) {
+ dirFileAddChild(file.children, fileDir, fileMessage)
+ }
+ })
+ },
+ dirDirAdd:(state,action)=>{
+ console.log("dirMessage:dirDirAdd", state, action)
+ let filePath = action.payload.filePath
+ let fileDir = action.payload.fileDir
+ let fileName = action.payload.fileName
+ let fileMessage = {
+ "fileName": fileName,
+ "filePath": fileName,
+ "dirFlag": true,
+ "children": []
+ }
+ // 查找旧文件并且修改文件信息
+ state.data.forEach(file => {
+ if (file.filePath === fileDir) {
+ if (Array.isArray(file.children)){
+ file.children.push(fileMessage)
+ }else {
+ file.children=[fileMessage]
+ }
+ } else if (file.children.length > 0 && fileDir.startsWith(file.filePath)) {
+ dirFileAddChild(file.children, fileDir, fileMessage)
}
})
},
@@ -160,16 +185,16 @@ function dirFileRemoveChild(fileList, selectDirKey) {
})
}
-function dirFileAddChild(fileList, filePath, fileMessage){
+function dirFileAddChild(fileList, fileDir, fileMessage){
fileList.forEach(file => {
- if (file.filePath === filePath) {
+ if (file.filePath === fileDir) {
if (Array.isArray(file.children)){
file.children.push(fileMessage)
}else {
file.children=[fileMessage]
}
- } else if (file.children.length > 0 && file.filePath.startsWith(filePath)) {
- dirFileAddChild(file.children, filePath, fileMessage)
+ } else if (file.children.length > 0 && fileDir.startsWith(file.filePath)) {
+ dirFileAddChild(file.children, fileDir, fileMessage)
}
})
}
@@ -229,6 +254,7 @@ export const {
dirRemove,
updateFileName,
dirFileAdd,
+ dirDirAdd,
dirFileRemove,
refreshDir
} = dirMessageSlice.actions
diff --git a/src/utils/File/index.jsx b/src/utils/File/index.jsx
index 0303a38..10edf4e 100644
--- a/src/utils/File/index.jsx
+++ b/src/utils/File/index.jsx
@@ -35,10 +35,12 @@ export async function overWriteFile(filePath,jsonText) {
await fs.writeFile(filePath,jsonText,{"encoding":"utf-8"})
}
+export async function newDir(filePath) {
+ await fs.mkdir(filePath)
+}
export async function newFile(filePath) {
await fs.writeFile(filePath,"",{"encoding":"utf-8"})
}
-
export async function deleteFileAndDir(filePath) {
await fs.rm(filePath)
}
diff --git a/src/utils/PathOperate/index.jsx b/src/utils/PathOperate/index.jsx
index c4e7a57..0b11128 100644
--- a/src/utils/PathOperate/index.jsx
+++ b/src/utils/PathOperate/index.jsx
@@ -17,6 +17,9 @@ export function getFileDirByPath(fileName){
export function fileNameFormat(dir,fileName,ext){
return pathOperate.format({"dir":dir,"base":fileName+ext})
}
+export function fileDirFormat(dir,fileName){
+ return dir+pathOperate.sep+fileName
+}
export function fullFileNameFormat(dir,fileName){
return pathOperate.format({"dir":dir,"base":fileName})