Feature:1.支持配置插入节点时的初始文字;2.优化历史记录添加逻辑;3.节点插入和删除命令支持传入指定节点和初始节点数据

This commit is contained in:
wanglin2 2023-03-24 15:26:24 +08:00
parent 2b4ab4a322
commit 6efe4a3fd6
3 changed files with 42 additions and 19 deletions

View File

@ -68,7 +68,11 @@ const defaultOpt = {
// 鼠标滚动的行为如果customHandleMousewheel传了自定义函数这个属性不生效 // 鼠标滚动的行为如果customHandleMousewheel传了自定义函数这个属性不生效
mousewheelAction: 'zoom',// zoom放大缩小、move上下移动 mousewheelAction: 'zoom',// zoom放大缩小、move上下移动
// 当mousewheelAction设为move时可以通过该属性控制鼠标滚动一下视图移动的步长单位px // 当mousewheelAction设为move时可以通过该属性控制鼠标滚动一下视图移动的步长单位px
mousewheelMoveStep: 100 mousewheelMoveStep: 100,
// 默认插入的二级节点的文字
defaultInsertSecondLevelNodeText: '二级节点',
// 默认插入的二级以下节点的文字
defaultInsertBelowSecondLevelNodeText: '分支主题'
} }
// 思维导图 // 思维导图

View File

@ -81,6 +81,8 @@ class Command {
if (this.history.length > 0 && JSON.stringify(this.history[this.history.length - 1]) === JSON.stringify(data)) { if (this.history.length > 0 && JSON.stringify(this.history[this.history.length - 1]) === JSON.stringify(data)) {
return return
} }
// 删除当前历史指针后面的数据
this.history = this.history.slice(0, this.activeHistoryIndex + 1)
this.history.push(simpleDeepClone(data)) this.history.push(simpleDeepClone(data))
this.activeHistoryIndex = this.history.length - 1 this.activeHistoryIndex = this.history.length - 1
this.mindMap.emit('data_change', data) this.mindMap.emit('data_change', data)

View File

@ -353,17 +353,26 @@ class Render {
} }
} }
// 规范指定节点数据
formatAppointNodes(appointNodes) {
if (!appointNodes) return []
return Array.isArray(appointNodes) ? appointNodes: [appointNodes]
}
// 插入同级节点,多个节点只会操作第一个节点 // 插入同级节点,多个节点只会操作第一个节点
insertNode(openEdit = true) { insertNode(openEdit = true, appointNodes = [], appointData = null) {
if (this.activeNodeList.length <= 0) { appointNodes = this.formatAppointNodes(appointNodes)
if (this.activeNodeList.length <= 0 && appointNodes.length <= 0) {
return return
} }
let first = this.activeNodeList[0] let { defaultInsertSecondLevelNodeText, defaultInsertBelowSecondLevelNodeText } = this.mindMap.opt
let list = appointNodes.length > 0 ? appointNodes : this.activeNodeList
let first = list[0]
if (first.isRoot) { if (first.isRoot) {
this.insertChildNode() this.insertChildNode(openEdit, appointNodes, appointData)
} else { } else {
let text = first.layerIndex === 1 ? '二级节点' : '分支主题' let text = first.layerIndex === 1 ? defaultInsertSecondLevelNodeText : defaultInsertBelowSecondLevelNodeText
if (first.layerIndex === 1) { if (first.layerIndex === 1) {
first.parent.initRender = true first.parent.initRender = true
} }
@ -372,7 +381,8 @@ class Render {
inserting: openEdit, inserting: openEdit,
data: { data: {
text: text, text: text,
expand: true expand: true,
...(appointData || {})
}, },
children: [] children: []
}) })
@ -382,20 +392,24 @@ class Render {
// 插入子节点 // 插入子节点
insertChildNode(openEdit = true) { insertChildNode(openEdit = true, appointNodes = [], appointData = null) {
if (this.activeNodeList.length <= 0) { appointNodes = this.formatAppointNodes(appointNodes)
if (this.activeNodeList.length <= 0 && appointNodes.length <= 0) {
return return
} }
this.activeNodeList.forEach(node => { let { defaultInsertSecondLevelNodeText, defaultInsertBelowSecondLevelNodeText } = this.mindMap.opt
let list = appointNodes.length > 0 ? appointNodes : this.activeNodeList
list.forEach(node => {
if (!node.nodeData.children) { if (!node.nodeData.children) {
node.nodeData.children = [] node.nodeData.children = []
} }
let text = node.isRoot ? '二级节点' : '分支主题' let text = node.isRoot ? defaultInsertSecondLevelNodeText : defaultInsertBelowSecondLevelNodeText
node.nodeData.children.push({ node.nodeData.children.push({
inserting: openEdit, inserting: openEdit,
data: { data: {
text: text, text: text,
expand: true expand: true,
...(appointData || {})
}, },
children: [] children: []
}) })
@ -548,11 +562,14 @@ class Render {
// 移除节点 // 移除节点
removeNode() { removeNode(appointNodes = []) {
if (this.activeNodeList.length <= 0) { appointNodes = this.formatAppointNodes(appointNodes)
if (this.activeNodeList.length <= 0 && appointNodes.length <= 0) {
return return
} }
let root = this.activeNodeList.find((node) => { let isAppointNodes = appointNodes.length > 0
let list = isAppointNodes ? appointNodes : this.activeNodeList
let root = list.find((node) => {
return node.isRoot return node.isRoot
}) })
if (root) { if (root) {
@ -563,8 +580,9 @@ class Render {
root.children = [] root.children = []
root.nodeData.children = [] root.nodeData.children = []
} else { } else {
for (let i = 0; i < this.activeNodeList.length; i++) { for (let i = 0; i < list.length; i++) {
let node = this.activeNodeList[i] let node = list[i]
if (isAppointNodes) list.splice(i, 1)
if (node.isGeneralization) { if (node.isGeneralization) {
// 删除概要节点 // 删除概要节点
this.setNodeData(node.generalizationBelongNode, { this.setNodeData(node.generalizationBelongNode, {
@ -580,8 +598,7 @@ class Render {
} }
} }
} }
this.activeNodeList = [] this.mindMap.emit('node_active', null, this.activeNodeList)
this.mindMap.emit('node_active', null, [])
this.mindMap.render() this.mindMap.render()
} }