@ovine/craft
Version:
Ovine json editor.
244 lines (223 loc) • 5.79 kB
JavaScript
/**
* 选中元素的操作
*/
import { openContextMenus, toast } from 'amis'
import { camelCase, isArray, last } from 'lodash'
import { publish } from '@core/utils/message'
import { toggleSelector } from '@/components/selector'
import { nodeAction, message, nodeIdKey } from '@/constants'
import { previewStore } from '../store'
import { setSchemaNodeId } from '../utils'
const onNodeAction = (option) => {
const { activeKey, actionType, schemaToAdd, isSaveStore = true, pasteType = 'next' } = option
const { selectedCursor: cursor, setClipboard } = previewStore
const removeNode = () => {
if (cursor.isRoot()) {
toast.warning('根节点不能删除', '系统提示')
return
}
cursor.unset()
// 如果 是数组 且没有内容时 继续删除
if (cursor.up().get().length === 0) {
cursor.up().unset()
}
}
switch (actionType) {
case nodeAction.addChild: // 添加组件
cursor.set(activeKey, schemaToAdd)
break
case nodeAction.addLeftChild: // 数组最左边添加
case nodeAction.addTopChild:
cursor.select(activeKey).unshift(schemaToAdd)
break
case nodeAction.addRightChild: // 数组最右边添加
case nodeAction.addBottomChild:
cursor.select(activeKey).push(schemaToAdd)
break
case nodeAction.changePosition: // 换位置
break
case nodeAction.toPrev: // 左移动
case nodeAction.toNext:
{
// 右移动
// const current = cursor.get()
const parent = cursor.up()
if (!isArray(parent.get())) {
return
}
const index = last(cursor.path)
if (
(nodeAction.toPrev === actionType && index === 0) ||
(nodeAction.toNext === actionType && index === parent.get().length - 1)
) {
return
}
const oprIndex = nodeAction.toPrev === actionType ? index - 1 : index + 1
const opr = parent.select(oprIndex).get()
parent.splice([oprIndex, 1])
parent.splice([index, 0, opr])
}
break
case nodeAction.copy: // 复制
setClipboard()
break
case nodeAction.cut: // 前切
setClipboard()
removeNode()
break
case nodeAction.paste: // 粘贴
{
const current = cursor.get()
const parent = cursor.up()
const { clipboardSchema } = previewStore
let index = 0
if (!isArray(parent.get())) {
// 不是数组先转换为数组
parent.set([current])
} else {
index = last(cursor.path)
}
if (pasteType === 'next') {
parent.splice([index + 1, 0, clipboardSchema])
} else if (index === 0) {
parent.unshift(clipboardSchema)
} else {
parent.splice([index, 0, clipboardSchema])
}
}
break
case nodeAction.delete: // 删除
removeNode()
break
default:
}
if (isSaveStore) {
previewStore.saveBaobabSchema(cursor)
}
// 发布 修改 消息
publish(message.onNodeAction, option)
}
/**
* 添加组件时的 菜单
*/
export const onAddNode = (option) => {
const { position, node, container } = option
const onAdd = () => {
if (!node.template) {
toast.warning('该组件暂未支持。。。')
return
}
const { key, type } = container
const template = setSchemaNodeId(node.template, { isClone: true })
const isAdd = type === 'add'
onNodeAction({
activeKey: key,
actionType: isAdd ? nodeAction.addChild : camelCase(`add-${type}-child`),
schemaToAdd: isAdd ? [template] : template,
})
toggleSelector()
setTimeout(() => {
previewStore.setHoverId(template[nodeIdKey])
}, 500)
}
openContextMenus(position, [
{
label: '添加该组件',
icon: 'fa fa-check',
onSelect: onAdd,
},
{
label: '关闭',
icon: 'fa fa-close',
},
])
}
/**
* 右键点击选中节点菜单
*/
export const onNodeMenus = (option) => {
const { position } = option
openContextMenus(position, [
{
label: '取消选择',
icon: 'fa fa-close',
onSelect: () => {
previewStore.setSelectedId('')
},
},
{
label: '前移',
icon: 'fa fa-close',
onSelect: () => {
onNodeAction({
actionType: nodeAction.toPrev,
})
},
},
{
label: '后移',
icon: 'fa fa-close',
onSelect: () => {
onNodeAction({
actionType: nodeAction.toNext,
})
},
},
{
label: '复制',
icon: 'fa fa-close',
onSelect: () => {
onNodeAction({
actionType: nodeAction.copy,
isSaveStore: false,
})
},
},
{
label: '剪切',
icon: 'fa fa-close',
onSelect: () => {
onNodeAction({
actionType: nodeAction.cut,
})
previewStore.setSelectedId('')
},
},
{
label: '粘贴',
icon: 'fa fa-close',
children: [
{
label: '前方粘贴',
icon: 'fa fa-close',
onSelect: () => {
onNodeAction({
actionType: nodeAction.paste,
pasteType: 'font',
})
},
},
{
label: '后方粘贴',
icon: 'fa fa-close',
onSelect: () => {
onNodeAction({
actionType: nodeAction.paste,
pasteType: 'next',
})
},
},
],
},
{
label: '删除',
icon: 'fa fa-check',
onSelect: () => {
onNodeAction({
actionType: nodeAction.delete,
})
previewStore.setSelectedId('')
},
},
])
}