From 82473027dad905318b9503a1a561d57aed143f5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A1=97=E8=A7=92=E5=B0=8F=E6=9E=97?= <1013335014@qq.com> Date: Wed, 14 Aug 2024 09:41:33 +0800 Subject: [PATCH] =?UTF-8?q?Demo=EF=BC=9A=E5=8F=B3=E9=94=AE=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=E6=96=B0=E5=A2=9E=E8=AE=BE=E7=BD=AE=E8=8A=82=E7=82=B9?= =?UTF-8?q?=E7=BC=96=E5=8F=B7=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- simple-mind-map/src/core/render/node/Node.js | 4 +- simple-mind-map/src/layouts/Base.js | 8 +- web/src/config/en.js | 60 ++++++++++ web/src/config/index.js | 22 +++- web/src/config/zh.js | 60 ++++++++++ web/src/lang/en_us.js | 3 +- web/src/lang/zh_cn.js | 3 +- web/src/pages/Edit/components/Contextmenu.vue | 111 +++++++++++++++++- web/src/pages/Edit/components/Edit.vue | 6 + web/src/store.js | 6 + 10 files changed, 267 insertions(+), 16 deletions(-) diff --git a/simple-mind-map/src/core/render/node/Node.js b/simple-mind-map/src/core/render/node/Node.js index 4b96b9a4..f584d307 100644 --- a/simple-mind-map/src/core/render/node/Node.js +++ b/simple-mind-map/src/core/render/node/Node.js @@ -218,8 +218,8 @@ class Node { this._tagData = this.createTagNode() this._noteData = this.createNoteNode() this._attachmentData = this.createAttachmentNode() - if (this.mindMap.number) { - this._numberData = this.mindMap.number.createNumberContent(this) + if (this.mindMap.numbers) { + this._numberData = this.mindMap.numbers.createNumberContent(this) } this._prefixData = createNodePrefixContent ? createNodePrefixContent(this) diff --git a/simple-mind-map/src/layouts/Base.js b/simple-mind-map/src/layouts/Base.js index c5bdf3b4..312b1f02 100644 --- a/simple-mind-map/src/layouts/Base.js +++ b/simple-mind-map/src/layouts/Base.js @@ -72,13 +72,13 @@ class Base { // 获取节点编号信息 getNumberInfo({ parent, ancestors, layerIndex, index }) { // 编号 - const hasNumberPlugin = !!this.mindMap.number + const hasNumberPlugin = !!this.mindMap.numbers const parentNumberStr = hasNumberPlugin && parent && parent._node.number ? parent._node.number : '' const newNumberStr = hasNumberPlugin - ? this.mindMap.number.getNodeNumberStr({ + ? this.mindMap.numbers.getNodeNumberStr({ ancestors, layerIndex, num: index + 1, @@ -122,7 +122,7 @@ class Base { // 判断编号是否改变 let isNumberChange = false if (hasNumberPlugin) { - isNumberChange = this.mindMap.number.updateNumber(newNode, newNumberStr) + isNumberChange = this.mindMap.numbers.updateNumber(newNode, newNumberStr) } // 主题或主题配置改变了、节点层级改变了,需要重新渲染节点文本等情况需要重新计算节点大小和布局 if ( @@ -167,7 +167,7 @@ class Base { // 判断编号是否改变 let isNumberChange = false if (hasNumberPlugin) { - isNumberChange = this.mindMap.number.updateNumber(newNode, newNumberStr) + isNumberChange = this.mindMap.numbers.updateNumber(newNode, newNumberStr) } if ( isResizeSource || diff --git a/web/src/config/en.js b/web/src/config/en.js index 28f32f16..5a5f0968 100644 --- a/web/src/config/en.js +++ b/web/src/config/en.js @@ -497,3 +497,63 @@ export const downTypeList = [ desc: 'Plain text file' } ] + +// 编号类型列表 +export const numberTypeList = [ + { + name: 'None', + value: '' + }, + { + name: '1, 2, 3', + value: 1 + }, + { + name: '1., 2., 3.', + value: 2 + }, + { + name: '(1), (2), (3)', + value: 3 + }, + { + name: 'a., b., c.', + value: 4 + }, + { + name: 'A., B., C.', + value: 5 + }, + { + name: 'i., ii., iii.', + value: 6 + }, + { + name: 'I., II., III.', + value: 7 + }, + { + name: '一、, 二、, 三、', + value: 8 + } +] + +// 编号层级列表 +export const numberLevelList = [ + { + name: '1 level', + value: 1 + }, + { + name: '2 level', + value: 2 + }, + { + name: '3 level', + value: 3 + }, + { + name: 'All level', + value: 0 + } +] diff --git a/web/src/config/index.js b/web/src/config/index.js index 9b8e115d..32affc86 100644 --- a/web/src/config/index.js +++ b/web/src/config/index.js @@ -19,7 +19,9 @@ import { backgroundSizeList as backgroundSizeListZh, downTypeList as downTypeListZh, shapeListMap as shapeListMapZh, - lineStyleMap as lineStyleMapZh + lineStyleMap as lineStyleMapZh, + numberTypeList as numberTypeListZh, + numberLevelList as numberLevelListZh } from './zh' import { fontFamilyList as fontFamilyListEn, @@ -32,7 +34,9 @@ import { shapeList as shapeListEn, sidebarTriggerList as sidebarTriggerListEn, backgroundSizeList as backgroundSizeListEn, - downTypeList as downTypeListEn + downTypeList as downTypeListEn, + numberTypeList as numberTypeListEn, + numberLevelList as numberLevelListEn } from './en' const fontFamilyList = { @@ -100,6 +104,16 @@ const downTypeList = { en: downTypeListEn } +const numberTypeList = { + zh: numberTypeListZh, + en: numberTypeListEn +} + +const numberLevelList = { + zh: numberLevelListZh, + en: numberLevelListEn +} + export { fontSizeList, lineHeightList, @@ -121,5 +135,7 @@ export { shapeList, shapeListMap, sidebarTriggerList, - downTypeList + downTypeList, + numberTypeList, + numberLevelList } diff --git a/web/src/config/zh.js b/web/src/config/zh.js index ea976986..3985d124 100644 --- a/web/src/config/zh.js +++ b/web/src/config/zh.js @@ -591,3 +591,63 @@ export const downTypeList = [ desc: '纯文本文件' } ] + +// 编号类型列表 +export const numberTypeList = [ + { + name: '无编号', + value: '' + }, + { + name: '1, 2, 3', + value: 1 + }, + { + name: '1., 2., 3.', + value: 2 + }, + { + name: '(1), (2), (3)', + value: 3 + }, + { + name: 'a., b., c.', + value: 4 + }, + { + name: 'A., B., C.', + value: 5 + }, + { + name: 'i., ii., iii.', + value: 6 + }, + { + name: 'I., II., III.', + value: 7 + }, + { + name: '一、, 二、, 三、', + value: 8 + } +] + +// 编号层级列表 +export const numberLevelList = [ + { + name: '编号首层', + value: 1 + }, + { + name: '编号前两层', + value: 2 + }, + { + name: '编号前三层', + value: 3 + }, + { + name: '编号所有层', + value: 0 + } +] diff --git a/web/src/lang/en_us.js b/web/src/lang/en_us.js index 73eeead3..5cd6ca70 100644 --- a/web/src/lang/en_us.js +++ b/web/src/lang/en_us.js @@ -110,7 +110,8 @@ export default { copyToTxt: 'Txt', copyToPng: 'Png', copySuccess: 'Copy success', - copyFail: 'Copy fail' + copyFail: 'Copy fail', + number: 'Number child nodes' }, count: { words: 'Words', diff --git a/web/src/lang/zh_cn.js b/web/src/lang/zh_cn.js index 3a05d242..f92b4c8e 100644 --- a/web/src/lang/zh_cn.js +++ b/web/src/lang/zh_cn.js @@ -110,7 +110,8 @@ export default { copyToTxt: 'Txt', copyToPng: '图片', copySuccess: '复制成功', - copyFail: '复制失败' + copyFail: '复制失败', + number: '编号其子节点' }, count: { words: '字数', diff --git a/web/src/pages/Edit/components/Contextmenu.vue b/web/src/pages/Edit/components/Contextmenu.vue index 8f6ed78c..2110cfbc 100644 --- a/web/src/pages/Edit/components/Contextmenu.vue +++ b/web/src/pages/Edit/components/Contextmenu.vue @@ -39,6 +39,7 @@ {{ $t('contextmenu.insertSummary') }} Ctrl + G +
{{ $t('contextmenu.moveDownNode') }} Ctrl + ↓
+
+ {{ $t('contextmenu.number') }} + +
+
+ {{ item.name }} + {{ numberType === item.value ? '√' : '' }} +
+
+
+ {{ item.name }} + {{ numberLevel === item.value ? '√' : '' }} +
+
+
+
{{ $t('contextmenu.deleteNode') }} Delete @@ -63,6 +95,7 @@ {{ $t('contextmenu.deleteCurrentNode') }} Shift + Backspace
+
{{ $t('contextmenu.pasteNode') }} Ctrl + V
+
{{ $t('contextmenu.removeHyperlink') }}
@@ -101,6 +135,7 @@ {{ $t('contextmenu.backCenter') }} Ctrl + Enter +
{{ $t('contextmenu.expandAll') }}
@@ -110,7 +145,11 @@
{{ $t('contextmenu.expandTo') }} -
+
+
{{ $t('contextmenu.arrangeLayout') }} Ctrl + L @@ -133,6 +173,7 @@ {{ $t('contextmenu.zenMode') }} {{ isZenMode ? '√' : '' }}
+
{{ $t('contextmenu.removeAllNodeCustomStyles') @@ -141,7 +182,11 @@
{{ $t('contextmenu.copyToClipboard') }} -
+
state.localConfig.isZenMode, - isDark: state => state.localConfig.isDark + isDark: state => state.localConfig.isDark, + supportNumbers: state => state.supportNumbers }), expandList() { return [ @@ -263,6 +313,12 @@ export default { }, hasNote() { return !!this.node.getData('note') + }, + numberTypeList() { + return numberTypeList[this.$i18n.locale] || numberTypeList.zh + }, + numberLevelList() { + return numberLevelList[this.$i18n.locale] || numberLevelList.zh } }, created() { @@ -288,9 +344,11 @@ export default { // 计算右键菜单元素的显示位置 getShowPosition(x, y) { + this.subItemsShowLeft = false const rect = this.$refs.contextmenuRef.getBoundingClientRect() if (x + rect.width > window.innerWidth) { x = x - rect.width - 20 + this.subItemsShowLeft = true } if (y + rect.height > window.innerHeight) { y = window.innerHeight - rect.height - 10 @@ -303,6 +361,11 @@ export default { this.type = 'node' this.isShow = true this.node = node + const number = this.node.getData('number') + if (number) { + this.numberType = number.type || 1 + this.numberLevel = number.level === '' ? 1 : number.level + } this.$nextTick(() => { const { x, y } = this.getShowPosition(e.clientX + 10, e.clientY + 10) this.left = x @@ -353,6 +416,9 @@ export default { this.left = -9999 this.top = -9999 this.type = '' + this.node = '' + this.numberType = '' + this.numberLevel = '' }, // 执行命令 @@ -403,6 +469,30 @@ export default { this.hide() }, + // 设置节点编号 + setNodeNumber(prop, value) { + if (prop === 'type') { + this.numberType = value + if (value === '') { + // 无编号 + this.numberLevel = '' + this.mindMap.execCommand('SET_NUMBER', [], null) + return + } else { + // 有编号 + if (this.numberLevel === '') { + this.numberLevel = 1 + } + } + } + if (prop === 'level') { + this.numberLevel = value + } + this.mindMap.execCommand('SET_NUMBER', [], { + [prop]: value + }) + }, + // 复制到剪贴板 async copyToClipboard(type) { try { @@ -478,6 +568,13 @@ export default { } } + .splitLine { + width: 95%; + height: 1px; + background-color: #e9edf2; + margin: 2px auto; + } + .item { position: relative; height: 28px; @@ -525,9 +622,13 @@ export default { .subItems { position: absolute; left: 100%; - top: 0; visibility: hidden; width: 150px; + cursor: auto; + + &.showLeft { + left: -150px; + } } } } diff --git a/web/src/pages/Edit/components/Edit.vue b/web/src/pages/Edit/components/Edit.vue index f3a82e1b..ecf1c353 100644 --- a/web/src/pages/Edit/components/Edit.vue +++ b/web/src/pages/Edit/components/Edit.vue @@ -77,6 +77,8 @@ import OuterFrame from 'simple-mind-map/src/plugins/OuterFrame.js' // import HandDrawnLikeStyle from 'simple-mind-map-plugin-handdrawnlikestyle' // 标记插件,该插件为付费插件,详情请查看开发文档 // import Notation from 'simple-mind-map-plugin-notation' +// 编号插件,该插件为付费插件,详情请查看开发文档 +// import Numbers from 'simple-mind-map-plugin-numbers' import OutlineSidebar from './OutlineSidebar' import Style from './Style' import BaseStyle from './BaseStyle' @@ -538,6 +540,10 @@ export default { this.mindMap.addPlugin(Notation) this.$store.commit('setSupportMark', true) } + if (typeof Numbers !== 'undefined') { + this.mindMap.addPlugin(Numbers) + this.$store.commit('setSupportNumbers', true) + } this.mindMap.keyCommand.addShortcut('Control+s', () => { this.manualSave() }) diff --git a/web/src/store.js b/web/src/store.js index 420fd486..ca5a76e4 100644 --- a/web/src/store.js +++ b/web/src/store.js @@ -30,6 +30,7 @@ const store = new Vuex.Store({ extraTextOnExport: '', // 导出时底部添加的文字 supportHandDrawnLikeStyle: false, // 是否支持设置手绘风格 supportMark: false, // 是否支持标记 + supportNumbers: false, // 是否支持编号 isDragOutlineTreeNode: false // 当前是否正在拖拽大纲树的节点 }, mutations: { @@ -87,6 +88,11 @@ const store = new Vuex.Store({ state.supportMark = data }, + // 设置是否支持编号 + setSupportNumbers(state, data) { + state.supportNumbers = data + }, + // 设置树节点拖拽 setIsDragOutlineTreeNode(state, data) { state.isDragOutlineTreeNode = data