MindMap/mind-elixir-core-master/src/utils/domManipulation.ts

63 lines
1.9 KiB
TypeScript

import { LEFT, RIGHT, SIDE } from '../const'
import { rmSubline } from '../nodeOperation'
import type { MindElixirInstance, NodeObj } from '../types'
import type { Topic, Wrapper } from '../types/dom'
import { createExpander } from './dom'
// Judge new added node L or R
export const judgeDirection = function ({ map, direction }: MindElixirInstance, obj: NodeObj) {
if (direction === LEFT) {
return LEFT
} else if (direction === RIGHT) {
return RIGHT
} else if (direction === SIDE) {
const l = map.querySelector('.lhs')?.childElementCount || 0
const r = map.querySelector('.rhs')?.childElementCount || 0
if (l <= r) {
obj.direction = LEFT
return LEFT
} else {
obj.direction = RIGHT
return RIGHT
}
}
}
export const addChildDom = function (mei: MindElixirInstance, to: Topic, wrapper: Wrapper) {
const tpc = wrapper.children[0].children[0]
const top = to.parentElement
if (top.tagName === 'ME-PARENT') {
rmSubline(tpc)
if (top.children[1]) {
top.nextSibling.appendChild(wrapper)
} else {
const c = mei.createChildren([wrapper])
top.appendChild(createExpander(true))
top.insertAdjacentElement('afterend', c)
}
mei.linkDiv(wrapper.offsetParent as Wrapper)
} else if (top.tagName === 'ME-ROOT') {
const direction = judgeDirection(mei, tpc.nodeObj)
if (direction === LEFT) {
mei.container.querySelector('.lhs')?.appendChild(wrapper)
} else {
mei.container.querySelector('.rhs')?.appendChild(wrapper)
}
mei.linkDiv()
}
}
export const removeNodeDom = function (tpc: Topic, siblingLength: number) {
const p = tpc.parentNode
if (siblingLength === 0) {
// remove epd when children length === 0
const c = p.parentNode.parentNode
if (c.tagName !== 'ME-MAIN') {
// Root
c.previousSibling.children[1]!.remove() // remove epd
c.remove() // remove Children div
}
}
p.parentNode.remove()
}