diff --git a/zyplayer-doc-ui/wiki-ui/src/components/single/MessagePrompt.js b/zyplayer-doc-ui/wiki-ui/src/components/single/MessagePrompt.js
new file mode 100644
index 00000000..7401453b
--- /dev/null
+++ b/zyplayer-doc-ui/wiki-ui/src/components/single/MessagePrompt.js
@@ -0,0 +1,41 @@
+import { createVNode, render } from "vue";
+import PromptDialog from "./PromptDialog.vue";
+
+/**
+ * 生成一个带输入框的弹窗
+ * @author zyplayer-doc
+ * @date 2024-12-08
+ */
+let promise = null;
+function getInstance(config) {
+ if (promise) {
+ try {
+ promise.close();
+ } catch (error) {}
+ }
+ const div = document.createElement("div");
+ const conf = Object.assign({cancelText: '取消', okText: '确定'}, config);
+ const close = () => {
+ try {
+ document.body.removeChild(div);
+ promise.reject();
+ promise = null;
+ } catch (error) {}
+ };
+ conf.close = close;
+ conf.ok = (value) => {
+ promise.resolve(value);
+ };
+ const node = createVNode(PromptDialog, conf);
+ render(node, div);
+ document.body.appendChild(div);
+ return new Promise((resolve, reject) => {
+ promise = {resolve, reject, close};
+ });
+}
+const MessagePrompt = (opts) => {
+ return getInstance(opts);
+};
+
+export default MessagePrompt;
+
diff --git a/zyplayer-doc-ui/wiki-ui/src/components/single/PromptDialog.vue b/zyplayer-doc-ui/wiki-ui/src/components/single/PromptDialog.vue
new file mode 100644
index 00000000..e5908221
--- /dev/null
+++ b/zyplayer-doc-ui/wiki-ui/src/components/single/PromptDialog.vue
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+
+
+ {{cancelText}}
+ {{okText}}
+
+
+
+
+
+
+
diff --git a/zyplayer-doc-ui/wiki-ui/src/views/view/PageLayout.vue b/zyplayer-doc-ui/wiki-ui/src/views/view/PageLayout.vue
index 3dc4bb0a..5e07fb25 100644
--- a/zyplayer-doc-ui/wiki-ui/src/views/view/PageLayout.vue
+++ b/zyplayer-doc-ui/wiki-ui/src/views/view/PageLayout.vue
@@ -129,69 +129,3 @@ body {
}
-
-
diff --git a/zyplayer-doc-ui/wiki-ui/src/views/view/aside/AddMenu.vue b/zyplayer-doc-ui/wiki-ui/src/views/view/aside/AddMenu.vue
index 3c51fbda..f0ec1819 100644
--- a/zyplayer-doc-ui/wiki-ui/src/views/view/aside/AddMenu.vue
+++ b/zyplayer-doc-ui/wiki-ui/src/views/view/aside/AddMenu.vue
@@ -3,18 +3,18 @@
-
- 创建富文本
+
+ 新建富文本
-
- 创建Markdown
+
+ 新建Markdown
-
- 创建文件夹
-
-
- 从模板创建
+
+ 新建文件夹
+
+
+
@@ -38,6 +38,7 @@ import axios from "axios";
import IconDocument from '@/components/base/IconDocument.vue'
import {useStorePageData} from "@/store/pageData";
import {useStoreSpaceData} from "@/store/spaceData";
+import MessagePrompt from "@/components/single/MessagePrompt";
let router = useRouter();
let storePage = useStorePageData();
@@ -45,7 +46,6 @@ let storeSpace = useStoreSpaceData();
let uploadFileUrl = ref(import.meta.env.VITE_APP_BASE_API + '/zyplayer-doc-wiki/page/file/import/upload');
let fileList = ref([]);
-let emit = defineEmits(['createWikiByTemplate']);
let props = defineProps({
pageId: Number
});
@@ -78,30 +78,47 @@ const doAUpload = (data) => {
ElMessage.error('导入失败:' + e.message);
});
}
-const createWikiByTemplate = () => {
+const createPageByTemplate = () => {
// TODO
}
-const createWiki = (editorType) => {
- if (storeSpace.chooseSpaceId > 0) {
- let name = "新建文档";
- if (editorType === 0) name = "新建文件夹";
- pageApi.updatePage({
- spaceId: storeSpace.chooseSpaceId,
- parentId: props.pageId,
- editorType: editorType,
- name: name,
- content: '',
- preview: ''
- }).then((json) => {
- storePage.eventPageListUpdate = !storePage.eventPageListUpdate;
- ElMessage.success('创建成功');
- if (editorType !== 0) {
- router.push({path: '/page/edit', query: {parentId: props.pageId, pageId: json.data.id}});
- }
- })
- } else {
+const createPage = (editorType, confirmName) => {
+ if (!storeSpace.chooseSpaceId) {
ElMessage.warning('请先选择或创建空间');
+ return;
}
+ let name = "新建文档";
+ if (editorType === 0) name = confirmName || "新建文件夹";
+ pageApi.updatePage({
+ spaceId: storeSpace.chooseSpaceId,
+ parentId: props.pageId,
+ editorType: editorType,
+ name: name,
+ content: '',
+ preview: ''
+ }).then((json) => {
+ storePage.eventPageListUpdate = !storePage.eventPageListUpdate;
+ ElMessage.success('创建成功');
+ if (editorType !== 0) {
+ router.push({path: '/page/edit', query: {parentId: props.pageId, pageId: json.data.id}});
+ }
+ });
+}
+let createFolder = () => {
+ MessagePrompt({
+ title: '新建文件夹',
+ label: '文件夹名称',
+ placeholder: '请输入文件夹名称',
+ validator: (value) => {
+ if (!value || !value.trim()) return '请输入文件夹名称';
+ if (value && value.length > 40) return '文件夹名称不能超过40个字符';
+ return true;
+ }
+ }).then((value) => {
+ if (value && value.trim()) {
+ createPage(0, value.trim());
+ }
+ }).catch(() => {
+ });
}
diff --git a/zyplayer-doc-ui/wiki-ui/src/views/view/aside/LeftAside.vue b/zyplayer-doc-ui/wiki-ui/src/views/view/aside/LeftAside.vue
index a79c0e72..8f344a15 100644
--- a/zyplayer-doc-ui/wiki-ui/src/views/view/aside/LeftAside.vue
+++ b/zyplayer-doc-ui/wiki-ui/src/views/view/aside/LeftAside.vue
@@ -58,19 +58,17 @@
{{data.shareStatus === 1 ? '公共模板' : '个人模板'}}
-
-
+
{{ node.label }}
-
+
-
+
重命名
@@ -126,6 +124,7 @@ import {ElMessageBox, ElMessage} from 'element-plus'
import {useStoreSpaceData} from "@/store/spaceData";
import Navigation from "@/views/page/show/Navigation.vue";
import PageZan from "@/views/page/show/PageZan.vue";
+import MessagePrompt from "@/components/single/MessagePrompt";
let route = useRoute();
let router = useRouter();
@@ -206,8 +205,29 @@ const createWikiByTemplate = () => {
const choosePageIdFunc = (id) => {
storePage.optionPageId = id;
}
-const rename = (node, data) => {
- data.renaming = true;
+const renamePage = (node, data) => {
+ MessagePrompt({
+ title: '重命名',
+ label: '文档名称',
+ placeholder: '请输入文档名称',
+ value: data.name,
+ validator: (value) => {
+ if (!value || !value.trim()) return '文档名称不能为空';
+ if (value && value.length > 255) return '文档名称不能超过255个字符';
+ return true;
+ }
+ }).then((value) => {
+ if (value && value.trim()) {
+ let name = value.trim();
+ if (data.name !== name) {
+ pageApi.renamePage({id: data.id, name: name}).then(json => {
+ data.name = name;
+ ElMessage.success('重命名成功');
+ });
+ }
+ }
+ }).catch(() => {
+ });
}
const openMoveMenu = (onlyMove) => {
// TODO
@@ -243,7 +263,6 @@ const doRename = (node, data) => {
pageApi.renamePage({"id": data.id, "name": data.name}).then((json) => {
doGetPageList();
ElMessage.success('重命名成功');
- data.renaming = false;
});
}
const doGetPageList = () => {
@@ -347,10 +366,59 @@ defineExpose({searchByKeywords})
overflow-y: auto;
overflow-x: hidden;
padding-bottom: 10px;
+
+ .el-tree-node__content {
+ height: 35px;
+ position: relative;
+
+ .page-tree-node {
+ width: 100%;
+
+ .label {
+ .el-icon {
+ vertical-align: middle;
+ }
+
+ .text {
+ margin-left: 5px;
+ vertical-align: middle;
+ max-width: calc(100% - 40px);
+ display: inline-block;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+ }
+
+ .page-action-box {
+ position: absolute;
+ right: 0;
+ top: 0;
+ height: 35px;
+ line-height: 35px;
+ background: #fafafa;
+ border-radius: 4px;
+ display: none;
+
+ button {
+ padding: 5px 8px;
+ height: 35px;
+ }
+ }
+ }
+
+ &:hover .page-action-box {
+ display: block;
+ }
+ }
}
}
.search-autocomplete-popper {
width: 600px !important;
}
+
+.space-folder-box {
+ position: relative;
+}