tiny-engine/packages/toolbars/refresh/src/Main.vue

85 lines
2.2 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<tiny-popover
trigger="hover"
:open-delay="1000"
popper-class="toolbar-right-popover"
append-to-body
content="刷新画布"
>
<template #reference>
<span class="icon" @click="refresh">
<svg-icon :name="icon"></svg-icon>
</span>
</template>
</tiny-popover>
</template>
<script>
import { Popover } from '@opentiny/vue'
import { useResource, useCanvas, useModal, useLayout, useBlock } from '@opentiny/tiny-engine-controller'
export default {
components: {
TinyPopover: Popover
},
props: {
icon: {
type: String,
default: 'refresh'
}
},
setup() {
const { confirm } = useModal()
const { isBlock, isSaved, pageState, initData } = useCanvas()
const { PLUGIN_NAME, activePlugin, isEmptyPage } = useLayout()
const { getCurrentBlock, initBlock } = useBlock()
const refreshResouce = () => {
// 清空区块缓存(不能清空组件缓存),保证画布刷新后可以重新注册最新的区块资源
useResource().clearBlockResources()
// 因为webcomponents无法重复注册所以需要刷新内部iframe
useCanvas().canvasApi.value.getDocument().location.reload()
}
const refreshBlock = async () => {
const block = getCurrentBlock()
// 第二个参数true表示不激活区块管理面板
const api = await activePlugin(PLUGIN_NAME.BlockManage, true)
await api.refreshBlockData(block)
await initBlock(block, {}, true)
refreshResouce()
}
const refreshPage = async () => {
if (isEmptyPage()) {
return
}
const { currentPage } = pageState
const api = await activePlugin(PLUGIN_NAME.AppManage, true)
const page = await api.getPageById(currentPage.id)
await initData(page['page_content'], page)
refreshResouce()
}
const refresh = () => {
if (isSaved()) {
isBlock() ? refreshBlock() : refreshPage()
} else {
confirm({
title: '提示',
message: `${isBlock() ? '区块' : '页面'}尚未保存,是否要继续刷新?`,
exec: () => {
isBlock() ? refreshBlock() : refreshPage()
}
})
}
}
return {
refresh
}
}
}
</script>