|
@@ -15,7 +15,8 @@
|
|
|
<template #dropdown>
|
|
<template #dropdown>
|
|
|
<el-dropdown-menu>
|
|
<el-dropdown-menu>
|
|
|
<el-dropdown-item
|
|
<el-dropdown-item
|
|
|
- v-for="item in widgetType === 'page' ? pageMenus : widgetMenus"
|
|
|
|
|
|
|
+ v-for="item in currentMenus"
|
|
|
|
|
+ :key="item.value"
|
|
|
:icon="item.icon"
|
|
:icon="item.icon"
|
|
|
:divided="item.divider"
|
|
:divided="item.divider"
|
|
|
@click="item.onclick"
|
|
@click="item.onclick"
|
|
@@ -33,27 +34,37 @@
|
|
|
<script setup lang="ts">
|
|
<script setup lang="ts">
|
|
|
import type { DropdownInstance } from 'element-plus'
|
|
import type { DropdownInstance } from 'element-plus'
|
|
|
|
|
|
|
|
-import { onBeforeUnmount, ref } from 'vue'
|
|
|
|
|
|
|
+import { computed, onBeforeUnmount, ref } from 'vue'
|
|
|
|
|
+import { useEventBus } from '@vueuse/core'
|
|
|
import {
|
|
import {
|
|
|
|
|
+ LuArrowDown,
|
|
|
|
|
+ LuArrowDownToLine,
|
|
|
|
|
+ LuArrowUp,
|
|
|
|
|
+ LuArrowUpToLine,
|
|
|
|
|
+ LuClipboard,
|
|
|
LuCopy,
|
|
LuCopy,
|
|
|
LuCopyPlus,
|
|
LuCopyPlus,
|
|
|
- LuScissors,
|
|
|
|
|
- LuClipboard,
|
|
|
|
|
- LuTrash2,
|
|
|
|
|
LuEyeOff,
|
|
LuEyeOff,
|
|
|
LuLock,
|
|
LuLock,
|
|
|
|
|
+ LuScissors,
|
|
|
|
|
+ LuStar,
|
|
|
|
|
+ LuTrash2,
|
|
|
LuUnlock,
|
|
LuUnlock,
|
|
|
- LuArrowUpToLine,
|
|
|
|
|
- LuArrowDownToLine,
|
|
|
|
|
- LuArrowUp,
|
|
|
|
|
- LuArrowDown,
|
|
|
|
|
LuZap,
|
|
LuZap,
|
|
|
- LuStar
|
|
|
|
|
|
|
+ LuUnlink
|
|
|
} from 'vue-icons-plus/lu'
|
|
} from 'vue-icons-plus/lu'
|
|
|
|
|
|
|
|
-import { useEventBus } from '@vueuse/core'
|
|
|
|
|
import { useActionStore } from '@/store/modules/action'
|
|
import { useActionStore } from '@/store/modules/action'
|
|
|
|
|
|
|
|
|
|
+type MenuItem = {
|
|
|
|
|
+ label: string
|
|
|
|
|
+ value: string
|
|
|
|
|
+ fastKey: string
|
|
|
|
|
+ icon: any
|
|
|
|
|
+ divider?: boolean
|
|
|
|
|
+ onclick: () => void
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
const props = defineProps<{
|
|
const props = defineProps<{
|
|
|
id: string
|
|
id: string
|
|
|
virtualRef: any
|
|
virtualRef: any
|
|
@@ -75,119 +86,133 @@ onBeforeUnmount(() => {
|
|
|
unsubscribe()
|
|
unsubscribe()
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
-/**
|
|
|
|
|
- * 创建自定义组件
|
|
|
|
|
- */
|
|
|
|
|
const createCustomComponent = () => {
|
|
const createCustomComponent = () => {
|
|
|
createCustomCompBus.emit('create', props.id)
|
|
createCustomCompBus.emit('create', props.id)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-const widgetMenus = [
|
|
|
|
|
- {
|
|
|
|
|
- label: '复制',
|
|
|
|
|
- value: 'copy',
|
|
|
|
|
- fastKey: 'Ctrl+C',
|
|
|
|
|
- icon: LuCopy,
|
|
|
|
|
- onclick: () => actionStore.onCopy()
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- label: '复用',
|
|
|
|
|
- value: 'duplicate',
|
|
|
|
|
- fastKey: 'Ctrl+D',
|
|
|
|
|
- icon: LuCopyPlus,
|
|
|
|
|
- onclick: () => actionStore.onCopyFrom()
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- label: '剪切',
|
|
|
|
|
- value: 'cut',
|
|
|
|
|
- fastKey: 'Ctrl+X',
|
|
|
|
|
- icon: LuScissors,
|
|
|
|
|
- onclick: () => actionStore.onCut()
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- label: '粘贴',
|
|
|
|
|
- value: 'paste',
|
|
|
|
|
- fastKey: 'Ctrl+V',
|
|
|
|
|
- icon: LuClipboard,
|
|
|
|
|
- onclick: () => actionStore.onPaste()
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- label: '删除',
|
|
|
|
|
- value: 'delete',
|
|
|
|
|
- fastKey: 'Delete/Backspace',
|
|
|
|
|
- icon: LuTrash2,
|
|
|
|
|
- divider: true,
|
|
|
|
|
- onclick: () => actionStore.onDelete()
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- label: '隐藏',
|
|
|
|
|
- value: 'hidden',
|
|
|
|
|
- fastKey: 'Ctrl+H',
|
|
|
|
|
- icon: LuEyeOff,
|
|
|
|
|
- onclick: () => actionStore.onHidden(true)
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- label: '锁定',
|
|
|
|
|
- value: 'locked',
|
|
|
|
|
- fastKey: 'Ctrl+L',
|
|
|
|
|
- icon: LuLock,
|
|
|
|
|
- onclick: () => actionStore.onLock(true)
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- label: '解锁',
|
|
|
|
|
- value: 'unlock',
|
|
|
|
|
- fastKey: 'Ctrl+Shift+L',
|
|
|
|
|
- icon: LuUnlock,
|
|
|
|
|
- onclick: () => actionStore.onLock(false)
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- label: '上移一层',
|
|
|
|
|
- value: 'up',
|
|
|
|
|
- fastKey: 'Ctrl+Up',
|
|
|
|
|
- icon: LuArrowUp,
|
|
|
|
|
- divider: true,
|
|
|
|
|
- onclick: () => actionStore.onLevel('up')
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- label: '下移一层',
|
|
|
|
|
- value: 'down',
|
|
|
|
|
- fastKey: 'Ctrl+Down',
|
|
|
|
|
- icon: LuArrowDown,
|
|
|
|
|
- onclick: () => actionStore.onLevel('down')
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- label: '置顶',
|
|
|
|
|
- value: 'top',
|
|
|
|
|
- fastKey: 'Ctrl+Shift+Up',
|
|
|
|
|
- icon: LuArrowUpToLine,
|
|
|
|
|
- onclick: () => actionStore.onLevel('top')
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- label: '置底',
|
|
|
|
|
- value: 'bottom',
|
|
|
|
|
- fastKey: 'Ctrl+Shift+Down',
|
|
|
|
|
- icon: LuArrowDownToLine,
|
|
|
|
|
- onclick: () => actionStore.onLevel('bottom')
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- label: '添加事件',
|
|
|
|
|
- value: 'event',
|
|
|
|
|
- fastKey: '',
|
|
|
|
|
- icon: LuZap,
|
|
|
|
|
- divider: true,
|
|
|
|
|
- onclick: () => actionStore.onShowEvent()
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- label: '创建自定义组件',
|
|
|
|
|
- value: 'custom-component',
|
|
|
|
|
- fastKey: '',
|
|
|
|
|
- icon: LuStar,
|
|
|
|
|
- divider: true,
|
|
|
|
|
- onclick: createCustomComponent
|
|
|
|
|
|
|
+const widgetMenus = computed<MenuItem[]>(() => {
|
|
|
|
|
+ const menus: MenuItem[] = [
|
|
|
|
|
+ {
|
|
|
|
|
+ label: '复制',
|
|
|
|
|
+ value: 'copy',
|
|
|
|
|
+ fastKey: 'Ctrl+C',
|
|
|
|
|
+ icon: LuCopy,
|
|
|
|
|
+ onclick: () => actionStore.onCopy()
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ label: '复用',
|
|
|
|
|
+ value: 'duplicate',
|
|
|
|
|
+ fastKey: 'Ctrl+D',
|
|
|
|
|
+ icon: LuCopyPlus,
|
|
|
|
|
+ onclick: () => actionStore.onCopyFrom()
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ label: '剪切',
|
|
|
|
|
+ value: 'cut',
|
|
|
|
|
+ fastKey: 'Ctrl+X',
|
|
|
|
|
+ icon: LuScissors,
|
|
|
|
|
+ onclick: () => actionStore.onCut()
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ label: '粘贴',
|
|
|
|
|
+ value: 'paste',
|
|
|
|
|
+ fastKey: 'Ctrl+V',
|
|
|
|
|
+ icon: LuClipboard,
|
|
|
|
|
+ onclick: () => actionStore.onPaste()
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ label: '删除',
|
|
|
|
|
+ value: 'delete',
|
|
|
|
|
+ fastKey: 'Delete/Backspace',
|
|
|
|
|
+ icon: LuTrash2,
|
|
|
|
|
+ divider: true,
|
|
|
|
|
+ onclick: () => actionStore.onDelete()
|
|
|
|
|
+ }
|
|
|
|
|
+ ]
|
|
|
|
|
+
|
|
|
|
|
+ if (actionStore.isWidgetBoundById(props.id)) {
|
|
|
|
|
+ menus.push({
|
|
|
|
|
+ label: '解绑',
|
|
|
|
|
+ value: 'unbind',
|
|
|
|
|
+ fastKey: '',
|
|
|
|
|
+ icon: LuUnlink,
|
|
|
|
|
+ onclick: () => actionStore.onUnbind([props.id])
|
|
|
|
|
+ })
|
|
|
}
|
|
}
|
|
|
-]
|
|
|
|
|
|
|
|
|
|
-const pageMenus = [
|
|
|
|
|
|
|
+ menus.push(
|
|
|
|
|
+ {
|
|
|
|
|
+ label: '隐藏',
|
|
|
|
|
+ value: 'hidden',
|
|
|
|
|
+ fastKey: 'Ctrl+H',
|
|
|
|
|
+ icon: LuEyeOff,
|
|
|
|
|
+ onclick: () => actionStore.onHidden(true)
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ label: '锁定',
|
|
|
|
|
+ value: 'locked',
|
|
|
|
|
+ fastKey: 'Ctrl+L',
|
|
|
|
|
+ icon: LuLock,
|
|
|
|
|
+ onclick: () => actionStore.onLock(true)
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ label: '解锁',
|
|
|
|
|
+ value: 'unlock',
|
|
|
|
|
+ fastKey: 'Ctrl+Shift+L',
|
|
|
|
|
+ icon: LuUnlock,
|
|
|
|
|
+ onclick: () => actionStore.onLock(false)
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ label: '上移一层',
|
|
|
|
|
+ value: 'up',
|
|
|
|
|
+ fastKey: 'Ctrl+Up',
|
|
|
|
|
+ icon: LuArrowUp,
|
|
|
|
|
+ divider: true,
|
|
|
|
|
+ onclick: () => actionStore.onLevel('up')
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ label: '下移一层',
|
|
|
|
|
+ value: 'down',
|
|
|
|
|
+ fastKey: 'Ctrl+Down',
|
|
|
|
|
+ icon: LuArrowDown,
|
|
|
|
|
+ onclick: () => actionStore.onLevel('down')
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ label: '置顶',
|
|
|
|
|
+ value: 'top',
|
|
|
|
|
+ fastKey: 'Ctrl+Shift+Up',
|
|
|
|
|
+ icon: LuArrowUpToLine,
|
|
|
|
|
+ onclick: () => actionStore.onLevel('top')
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ label: '置底',
|
|
|
|
|
+ value: 'bottom',
|
|
|
|
|
+ fastKey: 'Ctrl+Shift+Down',
|
|
|
|
|
+ icon: LuArrowDownToLine,
|
|
|
|
|
+ onclick: () => actionStore.onLevel('bottom')
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ label: '添加事件',
|
|
|
|
|
+ value: 'event',
|
|
|
|
|
+ fastKey: '',
|
|
|
|
|
+ icon: LuZap,
|
|
|
|
|
+ divider: true,
|
|
|
|
|
+ onclick: () => actionStore.onShowEvent()
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ label: '创建自定义组件',
|
|
|
|
|
+ value: 'custom-component',
|
|
|
|
|
+ fastKey: '',
|
|
|
|
|
+ icon: LuStar,
|
|
|
|
|
+ divider: true,
|
|
|
|
|
+ onclick: createCustomComponent
|
|
|
|
|
+ }
|
|
|
|
|
+ )
|
|
|
|
|
+
|
|
|
|
|
+ return menus
|
|
|
|
|
+})
|
|
|
|
|
+
|
|
|
|
|
+const pageMenus: MenuItem[] = [
|
|
|
{
|
|
{
|
|
|
label: '粘贴',
|
|
label: '粘贴',
|
|
|
value: 'paste',
|
|
value: 'paste',
|
|
@@ -226,6 +251,10 @@ const pageMenus = [
|
|
|
}
|
|
}
|
|
|
]
|
|
]
|
|
|
|
|
|
|
|
|
|
+const currentMenus = computed(() => {
|
|
|
|
|
+ return props.widgetType === 'page' ? pageMenus : widgetMenus.value
|
|
|
|
|
+})
|
|
|
|
|
+
|
|
|
defineExpose({
|
|
defineExpose({
|
|
|
handleClose: () => {
|
|
handleClose: () => {
|
|
|
dropdownRef.value?.handleClose()
|
|
dropdownRef.value?.handleClose()
|