From 1749705694bc160884f6c35ba3fe2dbfc964a7e6 Mon Sep 17 00:00:00 2001 From: wanglin2 <1013335014@qq.com> Date: Wed, 21 Jun 2023 10:50:26 +0800 Subject: [PATCH 01/39] =?UTF-8?q?Fix=EF=BC=9A=E4=BF=AE=E5=A4=8D=E6=A6=82?= =?UTF-8?q?=E8=A6=81=E8=8A=82=E7=82=B9=E4=BC=9A=E5=93=8D=E5=BA=94=E5=BF=AB?= =?UTF-8?q?=E6=8D=B7=E9=94=AE=E6=B7=BB=E5=8A=A0=E8=8A=82=E7=82=B9=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- simple-mind-map/src/core/render/Render.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/simple-mind-map/src/core/render/Render.js b/simple-mind-map/src/core/render/Render.js index b2e3464a..bc60b374 100644 --- a/simple-mind-map/src/core/render/Render.js +++ b/simple-mind-map/src/core/render/Render.js @@ -425,6 +425,9 @@ class Render { let { defaultInsertSecondLevelNodeText, defaultInsertBelowSecondLevelNodeText } = this.mindMap.opt let list = appointNodes.length > 0 ? appointNodes : this.activeNodeList let first = list[0] + if (first.isGeneralization) { + return + } if (first.isRoot) { this.insertChildNode(openEdit, appointNodes, appointData) } else { @@ -455,6 +458,9 @@ class Render { let { defaultInsertSecondLevelNodeText, defaultInsertBelowSecondLevelNodeText } = this.mindMap.opt let list = appointNodes.length > 0 ? appointNodes : this.activeNodeList list.forEach(node => { + if (node.isGeneralization) { + return + } if (!node.nodeData.children) { node.nodeData.children = [] } From 749a4d0e81d9709662aa1d5b0bbed181dbc8b3c1 Mon Sep 17 00:00:00 2001 From: wanglin2 <1013335014@qq.com> Date: Wed, 21 Jun 2023 14:57:22 +0800 Subject: [PATCH 02/39] =?UTF-8?q?Feat=EF=BC=9A=E6=94=AF=E6=8C=81=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E8=8A=82=E7=82=B9=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- simple-mind-map/index.js | 122 +---------------- .../src/constants/defaultOptions.js | 126 ++++++++++++++++++ simple-mind-map/src/core/render/TextEdit.js | 9 +- simple-mind-map/src/core/render/node/Node.js | 29 +++- .../core/render/node/nodeCreateContents.js | 30 ++++- simple-mind-map/src/utils/index.js | 11 ++ 6 files changed, 201 insertions(+), 126 deletions(-) create mode 100644 simple-mind-map/src/constants/defaultOptions.js diff --git a/simple-mind-map/index.js b/simple-mind-map/index.js index 3802b389..90ab5156 100644 --- a/simple-mind-map/index.js +++ b/simple-mind-map/index.js @@ -11,127 +11,7 @@ import { layoutValueList, CONSTANTS } from './src/constants/constant' import { SVG } from '@svgdotjs/svg.js' import { simpleDeepClone } from './src/utils' import defaultTheme, { checkIsNodeSizeIndependenceConfig } from './src/themes/default' - -// 默认选项配置 -const defaultOpt = { - // 是否只读 - readonly: false, - // 布局 - layout: CONSTANTS.LAYOUT.LOGICAL_STRUCTURE, - // 如果结构为鱼骨图,那么可以通过该选项控制倾斜角度 - fishboneDeg: 45, - // 主题 - theme: 'default', // 内置主题:default(默认主题) - // 主题配置,会和所选择的主题进行合并 - themeConfig: {}, - // 放大缩小的增量比例 - scaleRatio: 0.1, - // 最多显示几个标签 - maxTag: 5, - // 导出图片时的内边距 - exportPadding: 20, - // 展开收缩按钮尺寸 - expandBtnSize: 20, - // 节点里图片和文字的间距 - imgTextMargin: 5, - // 节点里各种文字信息的间距,如图标和文字的间距 - textContentMargin: 2, - // 多选节点时鼠标移动到边缘时的画布移动偏移量 - selectTranslateStep: 3, - // 多选节点时鼠标移动距边缘多少距离时开始偏移 - selectTranslateLimit: 20, - // 自定义节点备注内容显示 - customNoteContentShow: null, - /* - { - show(){}, - hide(){} - } - */ - // 是否开启节点自由拖拽 - enableFreeDrag: false, - // 水印配置 - watermarkConfig: { - text: '', - lineSpacing: 100, - textSpacing: 100, - angle: 30, - textStyle: { - color: '#999', - opacity: 0.5, - fontSize: 14 - } - }, - // 达到该宽度文本自动换行 - textAutoWrapWidth: 500, - // 自定义鼠标滚轮事件处理 - // 可以传一个函数,回调参数为事件对象 - customHandleMousewheel: null, - // 鼠标滚动的行为,如果customHandleMousewheel传了自定义函数,这个属性不生效 - mousewheelAction: CONSTANTS.MOUSE_WHEEL_ACTION.ZOOM,// zoom(放大缩小)、move(上下移动) - // 当mousewheelAction设为move时,可以通过该属性控制鼠标滚动一下视图移动的步长,单位px - mousewheelMoveStep: 100, - // 默认插入的二级节点的文字 - defaultInsertSecondLevelNodeText: '二级节点', - // 默认插入的二级以下节点的文字 - defaultInsertBelowSecondLevelNodeText: '分支主题', - // 展开收起按钮的颜色 - expandBtnStyle: { - color: '#808080', - fill: '#fff' - }, - // 自定义展开收起按钮的图标 - expandBtnIcon: { - open: '',// svg字符串 - close: '' - }, - // 是否只有当鼠标在画布内才响应快捷键事件 - enableShortcutOnlyWhenMouseInSvg: true, - // 是否开启节点动画过渡 - enableNodeTransitionMove: true, - // 如果开启节点动画过渡,可以通过该属性设置过渡的时间,单位ms - nodeTransitionMoveDuration: 300, - // 初始根节点的位置 - initRootNodePosition: null, - // 导出png、svg、pdf时的图形内边距 - exportPaddingX: 10, - exportPaddingY: 10, - // 节点文本编辑框的z-index - nodeTextEditZIndex: 3000, - // 节点备注浮层的z-index - nodeNoteTooltipZIndex: 3000, - // 是否在点击了画布外的区域时结束节点文本的编辑状态 - isEndNodeTextEditOnClickOuter: true, - // 最大历史记录数 - maxHistoryCount: 1000, - // 是否一直显示节点的展开收起按钮,默认为鼠标移上去和激活时才显示 - alwaysShowExpandBtn: false, - // 扩展节点可插入的图标 - iconList: [ - // { - // name: '',// 分组名称 - // type: '',// 分组的值 - // list: [// 分组下的图标列表 - // { - // name: '',// 图标名称 - // icon:''// 图标,可以传svg或图片 - // } - // ] - // } - ], - // 节点最大缓存数量 - maxNodeCacheCount: 1000, - // 关联线默认文字 - defaultAssociativeLineText: '关联', - // 思维导图适应画布大小时的内边距 - fitPadding: 50, - // 是否开启按住ctrl键多选节点功能 - enableCtrlKeyNodeSelection: true, - // 设置为左键多选节点,右键拖动画布 - useLeftKeySelectionRightKeyDrag: false, - // 节点即将进入编辑前的回调方法,如果该方法返回true以外的值,那么将取消编辑,函数可以返回一个值,或一个Promise,回调参数为节点实例 - beforeTextEdit: null -} +import { defaultOpt } from './src/constants/defaultOptions' // 思维导图 class MindMap { diff --git a/simple-mind-map/src/constants/defaultOptions.js b/simple-mind-map/src/constants/defaultOptions.js new file mode 100644 index 00000000..51d68aea --- /dev/null +++ b/simple-mind-map/src/constants/defaultOptions.js @@ -0,0 +1,126 @@ +import { CONSTANTS } from './constant' + +// 默认选项配置 +export const defaultOpt = { + // 是否只读 + readonly: false, + // 布局 + layout: CONSTANTS.LAYOUT.LOGICAL_STRUCTURE, + // 如果结构为鱼骨图,那么可以通过该选项控制倾斜角度 + fishboneDeg: 45, + // 主题 + theme: 'default', // 内置主题:default(默认主题) + // 主题配置,会和所选择的主题进行合并 + themeConfig: {}, + // 放大缩小的增量比例 + scaleRatio: 0.1, + // 最多显示几个标签 + maxTag: 5, + // 导出图片时的内边距 + exportPadding: 20, + // 展开收缩按钮尺寸 + expandBtnSize: 20, + // 节点里图片和文字的间距 + imgTextMargin: 5, + // 节点里各种文字信息的间距,如图标和文字的间距 + textContentMargin: 2, + // 多选节点时鼠标移动到边缘时的画布移动偏移量 + selectTranslateStep: 3, + // 多选节点时鼠标移动距边缘多少距离时开始偏移 + selectTranslateLimit: 20, + // 自定义节点备注内容显示 + customNoteContentShow: null, + /* + { + show(){}, + hide(){} + } + */ + // 是否开启节点自由拖拽 + enableFreeDrag: false, + // 水印配置 + watermarkConfig: { + text: '', + lineSpacing: 100, + textSpacing: 100, + angle: 30, + textStyle: { + color: '#999', + opacity: 0.5, + fontSize: 14 + } + }, + // 达到该宽度文本自动换行 + textAutoWrapWidth: 500, + // 自定义鼠标滚轮事件处理 + // 可以传一个函数,回调参数为事件对象 + customHandleMousewheel: null, + // 鼠标滚动的行为,如果customHandleMousewheel传了自定义函数,这个属性不生效 + mousewheelAction: CONSTANTS.MOUSE_WHEEL_ACTION.ZOOM, // zoom(放大缩小)、move(上下移动) + // 当mousewheelAction设为move时,可以通过该属性控制鼠标滚动一下视图移动的步长,单位px + mousewheelMoveStep: 100, + // 默认插入的二级节点的文字 + defaultInsertSecondLevelNodeText: '二级节点', + // 默认插入的二级以下节点的文字 + defaultInsertBelowSecondLevelNodeText: '分支主题', + // 展开收起按钮的颜色 + expandBtnStyle: { + color: '#808080', + fill: '#fff' + }, + // 自定义展开收起按钮的图标 + expandBtnIcon: { + open: '', // svg字符串 + close: '' + }, + // 是否只有当鼠标在画布内才响应快捷键事件 + enableShortcutOnlyWhenMouseInSvg: true, + // 是否开启节点动画过渡 + enableNodeTransitionMove: true, + // 如果开启节点动画过渡,可以通过该属性设置过渡的时间,单位ms + nodeTransitionMoveDuration: 300, + // 初始根节点的位置 + initRootNodePosition: null, + // 导出png、svg、pdf时的图形内边距 + exportPaddingX: 10, + exportPaddingY: 10, + // 节点文本编辑框的z-index + nodeTextEditZIndex: 3000, + // 节点备注浮层的z-index + nodeNoteTooltipZIndex: 3000, + // 是否在点击了画布外的区域时结束节点文本的编辑状态 + isEndNodeTextEditOnClickOuter: true, + // 最大历史记录数 + maxHistoryCount: 1000, + // 是否一直显示节点的展开收起按钮,默认为鼠标移上去和激活时才显示 + alwaysShowExpandBtn: false, + // 扩展节点可插入的图标 + iconList: [ + // { + // name: '',// 分组名称 + // type: '',// 分组的值 + // list: [// 分组下的图标列表 + // { + // name: '',// 图标名称 + // icon:''// 图标,可以传svg或图片 + // } + // ] + // } + ], + // 节点最大缓存数量 + maxNodeCacheCount: 1000, + // 关联线默认文字 + defaultAssociativeLineText: '关联', + // 思维导图适应画布大小时的内边距 + fitPadding: 50, + // 是否开启按住ctrl键多选节点功能 + enableCtrlKeyNodeSelection: true, + // 设置为左键多选节点,右键拖动画布 + useLeftKeySelectionRightKeyDrag: false, + // 节点即将进入编辑前的回调方法,如果该方法返回true以外的值,那么将取消编辑,函数可以返回一个值,或一个Promise,回调参数为节点实例 + beforeTextEdit: null, + // 是否开启自定义节点内容 + isUseCustomNodeContent: false, + // 自定义返回节点内容的方法 + customCreateNodeContent: null +} diff --git a/simple-mind-map/src/core/render/TextEdit.js b/simple-mind-map/src/core/render/TextEdit.js index 888ef7e3..56efc9f6 100644 --- a/simple-mind-map/src/core/render/TextEdit.js +++ b/simple-mind-map/src/core/render/TextEdit.js @@ -66,10 +66,15 @@ export default class TextEdit { // 显示文本编辑框 async show(node) { - if (typeof this.mindMap.opt.beforeTextEdit === 'function') { + // 使用了自定义节点内容那么不响应编辑事件 + if (node.isUseCustomNodeContent()) { + return + } + let { beforeTextEdit } = this.mindMap.opt + if (typeof beforeTextEdit === 'function') { let isShow = false try { - isShow = await this.mindMap.opt.beforeTextEdit(node) + isShow = await beforeTextEdit(node) } catch (error) { isShow = false } diff --git a/simple-mind-map/src/core/render/node/Node.js b/simple-mind-map/src/core/render/node/Node.js index 3d2bab6f..7934a6e7 100644 --- a/simple-mind-map/src/core/render/node/Node.js +++ b/simple-mind-map/src/core/render/node/Node.js @@ -1,7 +1,7 @@ import Style from './Style' import Shape from './Shape' -import { asyncRun } from '../../../utils' -import { G, Rect } from '@svgdotjs/svg.js' +import { asyncRun, nodeToHTML } from '../../../utils' +import { G, Rect, ForeignObject, SVG } from '@svgdotjs/svg.js' import nodeGeneralizationMethods from './nodeGeneralization' import nodeExpandBtnMethods from './nodeExpandBtn' import nodeCommandWrapsMethods from './nodeCommandWraps' @@ -59,6 +59,7 @@ class Node { this.group = null this.shapeNode = null // 节点形状节点 // 节点内容对象 + this._customNodeContent = null this._imgData = null this._iconData = null this._textData = null @@ -154,6 +155,13 @@ class Node { // 创建节点的各个内容对象数据 createNodeData() { + // 自定义节点内容 + let { isUseCustomNodeContent, customCreateNodeContent } = this.mindMap.opt + if (isUseCustomNodeContent && customCreateNodeContent) { + this._customNodeContent = customCreateNodeContent(this) + } + // 如果没有返回内容,那么还是使用内置的节点内容 + if (this._customNodeContent) return this._imgData = this.createImgNode() this._iconData = this.createIconNode() this._textData = this.createTextNode() @@ -176,6 +184,14 @@ class Node { // 计算节点尺寸信息 getNodeRect() { + // 自定义节点内容 + if (this.isUseCustomNodeContent()) { + let rect = this.measureCustomNodeContentSize(this._customNodeContent) + return { + width: rect.width, + height: rect.height + } + } // 宽高 let imgContentWidth = 0 let imgContentHeight = 0 @@ -266,6 +282,15 @@ class Node { if (this.isGeneralization && this.generalizationBelongNode) { this.group.addClass('generalization_' + this.generalizationBelongNode.uid) } + // 如果存在自定义节点内容,那么使用自定义节点内容 + if (this.isUseCustomNodeContent()) { + let foreignObject = new ForeignObject() + foreignObject.width(width) + foreignObject.height(height) + foreignObject.add(SVG(this._customNodeContent)) + this.group.add(foreignObject) + return + } // 图片节点 let imgHeight = 0 if (this._imgData) { diff --git a/simple-mind-map/src/core/render/node/nodeCreateContents.js b/simple-mind-map/src/core/render/node/nodeCreateContents.js index e175455f..2cdd4ce4 100644 --- a/simple-mind-map/src/core/render/node/nodeCreateContents.js +++ b/simple-mind-map/src/core/render/node/nodeCreateContents.js @@ -280,6 +280,32 @@ function createNoteNode() { } } +// 测量自定义节点内容元素的宽高 +let warpEl = null +function measureCustomNodeContentSize (content) { + if (!warpEl) { + warpEl = document.createElement('div') + warpEl.style.cssText = ` + position: fixed; + left: -99999px; + top: -99999px; + ` + this.mindMap.el.appendChild(warpEl) + } + warpEl.innerHTML = '' + warpEl.appendChild(content) + let rect = warpEl.getBoundingClientRect() + return { + width: rect.width, + height: rect.height + } +} + +// 是否使用的是自定义节点内容 +function isUseCustomNodeContent() { + return !!this._customNodeContent +} + export default { createImgNode, getImgShowSize, @@ -288,5 +314,7 @@ export default { createTextNode, createHyperlinkNode, createTagNode, - createNoteNode + createNoteNode, + measureCustomNodeContentSize, + isUseCustomNodeContent } \ No newline at end of file diff --git a/simple-mind-map/src/utils/index.js b/simple-mind-map/src/utils/index.js index d8e95df2..66a4778e 100644 --- a/simple-mind-map/src/utils/index.js +++ b/simple-mind-map/src/utils/index.js @@ -356,4 +356,15 @@ export const readBlob = (blob) => { } reader.readAsDataURL(blob) }) +} + +// 将dom节点转换成html字符串 +let nodeToHTMLWrapEl = null +export const nodeToHTML = (node) => { + if (!nodeToHTMLWrapEl) { + nodeToHTMLWrapEl = document.createElement('div') + } + nodeToHTMLWrapEl.innerHTML = '' + nodeToHTMLWrapEl.appendChild(node) + return nodeToHTMLWrapEl.innerHTML } \ No newline at end of file From bdb6078df63914ac01ed4cff397f6453b77d7b2b Mon Sep 17 00:00:00 2001 From: wanglin2 <1013335014@qq.com> Date: Wed, 21 Jun 2023 15:33:51 +0800 Subject: [PATCH 03/39] =?UTF-8?q?'=E6=9B=B4=E6=96=B0=E6=96=87=E6=A1=A3'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- simple-mind-map/package.json | 2 +- web/src/pages/Doc/catalogList.js | 2 +- web/src/pages/Doc/en/changelog/index.md | 6 ++ web/src/pages/Doc/en/changelog/index.vue | 3 + web/src/pages/Doc/en/constructor/index.md | 2 + web/src/pages/Doc/en/constructor/index.vue | 14 +++ web/src/pages/Doc/routerList.js | 1 + web/src/pages/Doc/zh/changelog/index.md | 6 ++ web/src/pages/Doc/zh/changelog/index.vue | 3 + web/src/pages/Doc/zh/constructor/index.md | 2 + web/src/pages/Doc/zh/constructor/index.vue | 14 +++ web/src/pages/Doc/zh/course20/index.md | 98 +++++++++++++++++++ web/src/pages/Doc/zh/course20/index.vue | 93 ++++++++++++++++++ .../Edit/components/CustomNodeContent.vue | 36 +++++++ web/src/pages/Edit/components/Edit.vue | 35 ++++++- 15 files changed, 313 insertions(+), 4 deletions(-) create mode 100644 web/src/pages/Doc/zh/course20/index.md create mode 100644 web/src/pages/Doc/zh/course20/index.vue create mode 100644 web/src/pages/Edit/components/CustomNodeContent.vue diff --git a/simple-mind-map/package.json b/simple-mind-map/package.json index 9c15737f..f575f5fe 100644 --- a/simple-mind-map/package.json +++ b/simple-mind-map/package.json @@ -1,6 +1,6 @@ { "name": "simple-mind-map", - "version": "0.6.2", + "version": "0.6.3", "description": "一个简单的web在线思维导图", "authors": [ { diff --git a/web/src/pages/Doc/catalogList.js b/web/src/pages/Doc/catalogList.js index cdc0ec6f..f17a2f61 100644 --- a/web/src/pages/Doc/catalogList.js +++ b/web/src/pages/Doc/catalogList.js @@ -11,7 +11,7 @@ let langList = [ } ] let StartList = ['introduction', 'start', 'deploy', 'client', 'translate', 'changelog'] -let CourseList = new Array(19).fill(0).map((_, index) => { +let CourseList = new Array(20).fill(0).map((_, index) => { return 'course' + (index + 1) }) let APIList = [ diff --git a/web/src/pages/Doc/en/changelog/index.md b/web/src/pages/Doc/en/changelog/index.md index b2ec82a8..4e9f98b7 100644 --- a/web/src/pages/Doc/en/changelog/index.md +++ b/web/src/pages/Doc/en/changelog/index.md @@ -1,5 +1,11 @@ # Changelog +## 0.6.3 + +Fix: 1.Fix the issue where the summary node will respond to inserting node shortcuts. + +New: 1.Support custom node content. + ## 0.6.2 Fix: 1.Fixed the problem that the new node does not change with the theme in rich Text mode. diff --git a/web/src/pages/Doc/en/changelog/index.vue b/web/src/pages/Doc/en/changelog/index.vue index f75ec873..b03cad68 100644 --- a/web/src/pages/Doc/en/changelog/index.vue +++ b/web/src/pages/Doc/en/changelog/index.vue @@ -1,6 +1,9 @@ From 710128901ae1e5c56f2ecd65147951c72a030787 Mon Sep 17 00:00:00 2001 From: wanglin2 <1013335014@qq.com> Date: Mon, 26 Jun 2023 09:56:10 +0800 Subject: [PATCH 06/39] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=BE=A4=E4=BA=8C?= =?UTF-8?q?=E7=BB=B4=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ qrcode.jpg | Bin 50001 -> 50012 bytes 2 files changed, 2 insertions(+) diff --git a/README.md b/README.md index 12a304a2..208560d1 100644 --- a/README.md +++ b/README.md @@ -92,6 +92,8 @@ MIT +如果已过期,可以微信添加`wanglinguanfang`拉你入群。 + # 请作者喝杯咖啡 > 厚椰乳一盒 + 纯牛奶半盒 + 冰块 + 咖啡液 = 生椰拿铁 yyds diff --git a/qrcode.jpg b/qrcode.jpg index 507f313563b6cb243ab34e261add6f5fbd42d1a7..5aab74d8eac8590b3b8dd1b7488ec1d29eef2866 100644 GIT binary patch delta 37031 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

@o$v2eP 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 P)Ln>k)azn*VW0j3Cr*Xw delta 37040 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 From 66c9805efce17bd92d47bede880b14cead90aa32 Mon Sep 17 00:00:00 2001 From: wanglin2 <1013335014@qq.com> Date: Mon, 26 Jun 2023 10:32:36 +0800 Subject: [PATCH 07/39] Doc: update --- index.html | 2 +- web/src/pages/Doc/en/start/index.md | 2 +- web/src/pages/Doc/en/start/index.vue | 2 +- web/src/pages/Doc/zh/course20/index.md | 7 ++++++- web/src/pages/Doc/zh/course20/index.vue | 5 ++++- web/src/pages/Doc/zh/start/index.md | 2 +- web/src/pages/Doc/zh/start/index.vue | 2 +- 7 files changed, 15 insertions(+), 7 deletions(-) diff --git a/index.html b/index.html index d4d2eb08..8b4d8856 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -一个简单的web思维导图实现

\ No newline at end of file +一个简单的web思维导图实现
\ No newline at end of file diff --git a/web/src/pages/Doc/en/start/index.md b/web/src/pages/Doc/en/start/index.md index cf7bf663..7531d047 100644 --- a/web/src/pages/Doc/en/start/index.md +++ b/web/src/pages/Doc/en/start/index.md @@ -77,7 +77,7 @@ If you need a file in the format of `umd` module, such as `CDN` in the browser, ``` -A global variable `window.simpleMindMap` will be created. +A global variable `window.simpleMindMap` will be created. you can get `MindMap` constructor by `window.simpleMindMap.default`, for more detail info you can log `window.simpleMindMap`. The disadvantage of this method is that it will contain all the content, including the plugins you have not registered, so the overall volume will be relatively large. diff --git a/web/src/pages/Doc/en/start/index.vue b/web/src/pages/Doc/en/start/index.vue index ae5c83d0..40a59e22 100644 --- a/web/src/pages/Doc/en/start/index.vue +++ b/web/src/pages/Doc/en/start/index.vue @@ -57,7 +57,7 @@ compile this dependency:

<link rel="stylesheet" href="simpleMindMap.css">
 <script scr="simpleMindMap.umd.min.js"></script>
 
-

A global variable window.simpleMindMap will be created.

+

A global variable window.simpleMindMap will be created. you can get MindMap constructor by window.simpleMindMap.default, for more detail info you can log window.simpleMindMap.

The disadvantage of this method is that it will contain all the content, including the plugins you have not registered, so the overall volume will be relatively large.

(v0.5.4+)If you want to use the ES module directly on the browser side, you can find the simpleMindMap.esm.js and simpleMindMap.esm.css files in the /simple-mind-map/dist/ directory.

Development

diff --git a/web/src/pages/Doc/zh/course20/index.md b/web/src/pages/Doc/zh/course20/index.md index bbe61ec4..19851e13 100644 --- a/web/src/pages/Doc/zh/course20/index.md +++ b/web/src/pages/Doc/zh/course20/index.md @@ -2,7 +2,7 @@ > 该特性v0.6.3+版本支持 -如果你想自定义节点的内容,那么可以在实例化`simple-mind-map`时传入一下选项: +如果你想自定义节点的内容,那么可以在实例化`simple-mind-map`时传入以下选项: ```js new MindMap({ @@ -23,6 +23,8 @@ node.nodeData.data `customCreateNodeContent`方法需要返回`DOM`节点,如果某个节点你不想自定义,那么可以返回`null`,那么还是会走内置的节点渲染逻辑。 +返回的`DOM`节点的宽高需要是确定的,如果是动态的那么会导致宽高获取错误,最终导致节点定位错误和发生重叠等问题。 + 如果使用了自定义节点内容,那么内置的插入节点内容的相关方法你都不应该再使用,因为相当于整个节点内容都由你自己控制,另外,节点样式设置也不会再生效,切换主题也只会切换非节点内容的样式,最后,双击节点也不会再进入编辑,所以这个功能一般用于展示性的需求。 ## 示例1:渲染自定义DOM节点 @@ -112,3 +114,6 @@ import CustomNodeContent from './CustomNodeContent.vue' } ``` +## 示例4:渲染react组件 + +如果你成功渲染了`react`组件,欢迎[提交](https://github.com/wanglin2/mind-map/issues/new)示例代码给我~ \ No newline at end of file diff --git a/web/src/pages/Doc/zh/course20/index.vue b/web/src/pages/Doc/zh/course20/index.vue index 482e42ae..e57bc24a 100644 --- a/web/src/pages/Doc/zh/course20/index.vue +++ b/web/src/pages/Doc/zh/course20/index.vue @@ -4,7 +4,7 @@

该特性v0.6.3+版本支持

-

如果你想自定义节点的内容,那么可以在实例化simple-mind-map时传入一下选项:

+

如果你想自定义节点的内容,那么可以在实例化simple-mind-map时传入以下选项:

new MindMap({
     isUseCustomNodeContent: true,
     customCreateNodeContent: (node) => {
@@ -17,6 +17,7 @@
 

其他节点实例属性你可以自行打印出来看看。

customCreateNodeContent方法需要返回DOM节点,如果某个节点你不想自定义,那么可以返回null,那么还是会走内置的节点渲染逻辑。

+

返回的DOM节点的宽高需要是确定的,如果是动态的那么会导致宽高获取错误,最终导致节点定位错误和发生重叠等问题。

如果使用了自定义节点内容,那么内置的插入节点内容的相关方法你都不应该再使用,因为相当于整个节点内容都由你自己控制,另外,节点样式设置也不会再生效,切换主题也只会切换非节点内容的样式,最后,双击节点也不会再进入编辑,所以这个功能一般用于展示性的需求。

示例1:渲染自定义DOM节点

{
@@ -92,6 +93,8 @@
     }
 }
 
+

示例4:渲染react组件

+

如果你成功渲染了react组件,欢迎提交示例代码给我~

diff --git a/web/src/pages/Doc/zh/start/index.md b/web/src/pages/Doc/zh/start/index.md index 97087456..8d3ce04f 100644 --- a/web/src/pages/Doc/zh/start/index.md +++ b/web/src/pages/Doc/zh/start/index.md @@ -72,7 +72,7 @@ const mindMap = new MindMap({ ``` -会创建一个全局变量`window.simpleMindMap`。 +会创建一个全局变量`window.simpleMindMap`,可以通过`window.simpleMindMap.default`获取到`MindMap`构造函数,详细信息可以把`window.simpleMindMap`打印出来看一下。 这种方式的缺点是会包含所有的内容,包括你没有注册的插件,所以整体体积会比较大。 diff --git a/web/src/pages/Doc/zh/start/index.vue b/web/src/pages/Doc/zh/start/index.vue index 826934db..c1a26a82 100644 --- a/web/src/pages/Doc/zh/start/index.vue +++ b/web/src/pages/Doc/zh/start/index.vue @@ -51,7 +51,7 @@
<link rel="stylesheet" href="simpleMindMap.css">
 <script scr="simpleMindMap.umd.min.js"></script>
 
-

会创建一个全局变量window.simpleMindMap

+

会创建一个全局变量window.simpleMindMap,可以通过window.simpleMindMap.default获取到MindMap构造函数,详细信息可以把window.simpleMindMap打印出来看一下。

这种方式的缺点是会包含所有的内容,包括你没有注册的插件,所以整体体积会比较大。

(v0.5.4+)如果你想直接在浏览器端通过ES模块的方式来使用,你可以在/simple-mind-map/dist/目录中找到simpleMindMap.esm.jssimpleMindMap.esm.css文件。

开发

From b262336f083112d76ede22a8e3459097ddfc1933 Mon Sep 17 00:00:00 2001 From: Hao Huang Date: Mon, 26 Jun 2023 05:41:18 +0000 Subject: [PATCH 08/39] =?UTF-8?q?Feat:=20=E4=BB=A5=E7=94=BB=E5=B8=83?= =?UTF-8?q?=E4=B8=BA=E4=B8=AD=E5=BF=83=E8=BF=9B=E8=A1=8C=E7=BC=A9=E6=94=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- simple-mind-map/src/core/view/View.js | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/simple-mind-map/src/core/view/View.js b/simple-mind-map/src/core/view/View.js index 98df7ee0..a3a12d41 100644 --- a/simple-mind-map/src/core/view/View.js +++ b/simple-mind-map/src/core/view/View.js @@ -170,8 +170,8 @@ class View { // 应用变换 transform() { this.mindMap.draw.transform({ + origin: [0, 0], scale: this.scale, - // origin: 'center center', translate: [this.x, this.y] }) this.mindMap.emit('view_data_change', this.getTransformData()) @@ -191,22 +191,36 @@ class View { // 缩小 narrow() { + let scale if (this.scale - this.mindMap.opt.scaleRatio > 0.1) { - this.scale -= this.mindMap.opt.scaleRatio + scale = this.scale - this.mindMap.opt.scaleRatio } else { - this.scale = 0.1 + scale = 0.1 } + this.scaleInCenter(this.mindMap.width / 2, this.mindMap.height / 2, scale) this.transform() this.mindMap.emit('scale', this.scale) } // 放大 enlarge() { - this.scale += this.mindMap.opt.scaleRatio + const scale = this.scale + this.mindMap.opt.scaleRatio + this.scaleInCenter(this.mindMap.width / 2, this.mindMap.height / 2, scale) this.transform() this.mindMap.emit('scale', this.scale) } + // 基于画布中心进行缩放 + scaleInCenter(cx, cy, scale) { + const prevScale = this.scale + const dx = (cx - this.x) * (1 - scale / prevScale) + const dy = (cy - this.y) * (1 - scale / prevScale) + + this.x += dx; + this.y += dy; + this.scale = scale + } + // 设置缩放 setScale(scale) { this.scale = scale From 1b6467728c0db7455dbf1b6f0288d8988ba41cb6 Mon Sep 17 00:00:00 2001 From: wanglin2 <1013335014@qq.com> Date: Mon, 26 Jun 2023 15:57:45 +0800 Subject: [PATCH 09/39] =?UTF-8?q?Feat:=E4=BC=98=E5=8C=96=E6=8C=87=E5=AE=9A?= =?UTF-8?q?=E4=B8=AD=E5=BF=83=E7=82=B9=E7=BC=A9=E6=94=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- simple-mind-map/package.json | 2 +- simple-mind-map/src/core/view/View.js | 18 +++++++++--------- simple-mind-map/src/plugins/TouchEvent.js | 13 +++++++------ web/src/pages/Edit/components/Edit.vue | 2 ++ 4 files changed, 19 insertions(+), 16 deletions(-) diff --git a/simple-mind-map/package.json b/simple-mind-map/package.json index f575f5fe..20d16df5 100644 --- a/simple-mind-map/package.json +++ b/simple-mind-map/package.json @@ -1,6 +1,6 @@ { "name": "simple-mind-map", - "version": "0.6.3", + "version": "0.6.4", "description": "一个简单的web在线思维导图", "authors": [ { diff --git a/simple-mind-map/src/core/view/View.js b/simple-mind-map/src/core/view/View.js index a3a12d41..3586f362 100644 --- a/simple-mind-map/src/core/view/View.js +++ b/simple-mind-map/src/core/view/View.js @@ -190,22 +190,22 @@ class View { } // 缩小 - narrow() { + narrow(cx = this.mindMap.width / 2, cy = this.mindMap.height / 2) { let scale if (this.scale - this.mindMap.opt.scaleRatio > 0.1) { scale = this.scale - this.mindMap.opt.scaleRatio } else { scale = 0.1 } - this.scaleInCenter(this.mindMap.width / 2, this.mindMap.height / 2, scale) + this.scaleInCenter(cx, cy, scale) this.transform() this.mindMap.emit('scale', this.scale) } // 放大 - enlarge() { + enlarge(cx = this.mindMap.width / 2, cy = this.mindMap.height / 2) { const scale = this.scale + this.mindMap.opt.scaleRatio - this.scaleInCenter(this.mindMap.width / 2, this.mindMap.height / 2, scale) + this.scaleInCenter(cx, cy, scale) this.transform() this.mindMap.emit('scale', this.scale) } @@ -213,11 +213,11 @@ class View { // 基于画布中心进行缩放 scaleInCenter(cx, cy, scale) { const prevScale = this.scale - const dx = (cx - this.x) * (1 - scale / prevScale) - const dy = (cy - this.y) * (1 - scale / prevScale) - - this.x += dx; - this.y += dy; + const ratio = 1 - scale / prevScale + const dx = (cx - this.x) * ratio + const dy = (cy - this.y) * ratio + this.x += dx + this.y += dy this.scale = scale } diff --git a/simple-mind-map/src/plugins/TouchEvent.js b/simple-mind-map/src/plugins/TouchEvent.js index 135d6ece..641c4f9d 100644 --- a/simple-mind-map/src/plugins/TouchEvent.js +++ b/simple-mind-map/src/plugins/TouchEvent.js @@ -50,16 +50,17 @@ class TouchEvent { } else if (len === 2) { let touch1 = e.touches[0] let touch2 = e.touches[1] - let distance = Math.sqrt( - Math.pow(touch1.clientX - touch2.clientX, 2) + - Math.pow(touch1.clientY - touch2.clientY, 2) - ) + let ox = touch1.clientX - touch2.clientX + let oy = touch1.clientY - touch2.clientY + let distance = Math.sqrt(Math.pow(ox, 2) + Math.pow(oy, 2)) + let cx = (touch1.clientX + touch2.clientX) / 2 + let cy = (touch1.clientY + touch2.clientY) / 2 if (distance > this.doubleTouchmoveDistance) { // 放大 - this.mindMap.view.enlarge() + this.mindMap.view.enlarge(cx, cy) } else { // 缩小 - this.mindMap.view.narrow() + this.mindMap.view.narrow(cx, cy) } this.doubleTouchmoveDistance = distance } diff --git a/web/src/pages/Edit/components/Edit.vue b/web/src/pages/Edit/components/Edit.vue index ad6402a0..d4e6a54f 100644 --- a/web/src/pages/Edit/components/Edit.vue +++ b/web/src/pages/Edit/components/Edit.vue @@ -32,6 +32,7 @@ import Drag from 'simple-mind-map/src/plugins/Drag.js' import Select from 'simple-mind-map/src/plugins/Select.js' import RichText from 'simple-mind-map/src/plugins/RichText.js' import AssociativeLine from 'simple-mind-map/src/plugins/AssociativeLine.js' +import TouchEvent from 'simple-mind-map/src/plugins/TouchEvent.js' import Outline from './Outline' import Style from './Style' import BaseStyle from './BaseStyle' @@ -67,6 +68,7 @@ MindMap .usePlugin(Export) .usePlugin(Select) .usePlugin(AssociativeLine) + // .usePlugin(TouchEvent) // 注册自定义主题 // customThemeList.forEach((item) => { From 98e27841ad1ef766cf845832fbf4c1f92b62ff06 Mon Sep 17 00:00:00 2001 From: wanglin2 <1013335014@qq.com> Date: Mon, 26 Jun 2023 16:15:20 +0800 Subject: [PATCH 10/39] Doc: update --- simple-mind-map/src/core/view/View.js | 8 ++++-- simple-mind-map/src/plugins/TouchEvent.js | 7 ++++-- web/src/pages/Doc/en/changelog/index.md | 4 +++ web/src/pages/Doc/en/changelog/index.vue | 2 ++ web/src/pages/Doc/en/view/index.md | 18 +++++++++++--- web/src/pages/Doc/en/view/index.vue | 30 ++++++++++++++++++++--- web/src/pages/Doc/zh/changelog/index.md | 4 +++ web/src/pages/Doc/zh/changelog/index.vue | 2 ++ web/src/pages/Doc/zh/view/index.md | 21 +++++++++++++--- web/src/pages/Doc/zh/view/index.vue | 30 ++++++++++++++++++++--- 10 files changed, 109 insertions(+), 17 deletions(-) diff --git a/simple-mind-map/src/core/view/View.js b/simple-mind-map/src/core/view/View.js index 3586f362..3f756dc7 100644 --- a/simple-mind-map/src/core/view/View.js +++ b/simple-mind-map/src/core/view/View.js @@ -222,8 +222,12 @@ class View { } // 设置缩放 - setScale(scale) { - this.scale = scale + setScale(scale, cx, cy) { + if (cx !== undefined && cy !== undefined) { + this.scaleInCenter(cx, cy, scale) + } else { + this.scale = scale + } this.transform() this.mindMap.emit('scale', this.scale) } diff --git a/simple-mind-map/src/plugins/TouchEvent.js b/simple-mind-map/src/plugins/TouchEvent.js index 641c4f9d..1cb7ec70 100644 --- a/simple-mind-map/src/plugins/TouchEvent.js +++ b/simple-mind-map/src/plugins/TouchEvent.js @@ -53,8 +53,11 @@ class TouchEvent { let ox = touch1.clientX - touch2.clientX let oy = touch1.clientY - touch2.clientY let distance = Math.sqrt(Math.pow(ox, 2) + Math.pow(oy, 2)) - let cx = (touch1.clientX + touch2.clientX) / 2 - let cy = (touch1.clientY + touch2.clientY) / 2 + // 以两指中心点进行缩放 + let { x: touch1ClientX, y: touch1ClientY } = this.mindMap.toPos(touch1.clientX, touch1.clientY) + let { x: touch2ClientX, y: touch2ClientY } = this.mindMap.toPos(touch2.clientX, touch2.clientY) + let cx = (touch1ClientX + touch2ClientX) / 2 + let cy = (touch1ClientY + touch2ClientY) / 2 if (distance > this.doubleTouchmoveDistance) { // 放大 this.mindMap.view.enlarge(cx, cy) diff --git a/web/src/pages/Doc/en/changelog/index.md b/web/src/pages/Doc/en/changelog/index.md index 4e9f98b7..7f4e7bf2 100644 --- a/web/src/pages/Doc/en/changelog/index.md +++ b/web/src/pages/Doc/en/changelog/index.md @@ -1,5 +1,9 @@ # Changelog +## 0.6.4 + +New: 1.The default is to scale at the center point of the canvas. 2.Optimize the scaling of both fingers on the mobile end, with the center position of the two fingers as the center point for scaling. + ## 0.6.3 Fix: 1.Fix the issue where the summary node will respond to inserting node shortcuts. diff --git a/web/src/pages/Doc/en/changelog/index.vue b/web/src/pages/Doc/en/changelog/index.vue index b03cad68..ef06826e 100644 --- a/web/src/pages/Doc/en/changelog/index.vue +++ b/web/src/pages/Doc/en/changelog/index.vue @@ -1,6 +1,8 @@