diff --git a/packages/canvas/DesignCanvas/src/api/useCanvas.js b/packages/canvas/DesignCanvas/src/api/useCanvas.js index 67fe01fa9b..63009839d4 100644 --- a/packages/canvas/DesignCanvas/src/api/useCanvas.js +++ b/packages/canvas/DesignCanvas/src/api/useCanvas.js @@ -239,6 +239,11 @@ const initData = (schema = { ...defaultSchema }, currentPage) => { }) } + publish({ + topic: 'pageOrBlockInit', + data: schema + }) + useHistory().addHistory(schema) } diff --git a/packages/plugins/block/src/composable/useBlock.js b/packages/plugins/block/src/composable/useBlock.js index b30da4dda0..7b8ca981a7 100644 --- a/packages/plugins/block/src/composable/useBlock.js +++ b/packages/plugins/block/src/composable/useBlock.js @@ -24,6 +24,7 @@ import { useTranslate, useBreadcrumb, useLayout, + useMessage, getMetaApi, META_APP, getMergeMeta, @@ -297,6 +298,11 @@ const initBlock = async (block = {}, _langs = {}, isEdit) => { addBlock(block) setSaved(false) } + + useMessage().publish({ + topic: 'pageOrBlockInit', + data: block.content + }) } const createBlock = ({ name_cn, label, path, categories }) => { diff --git a/packages/toolbars/redoundo/src/composable/useHistory.js b/packages/toolbars/redoundo/src/composable/useHistory.js index 52860d20d4..ae707deb11 100644 --- a/packages/toolbars/redoundo/src/composable/useHistory.js +++ b/packages/toolbars/redoundo/src/composable/useHistory.js @@ -73,14 +73,12 @@ const go = (addend, valid) => { const back = () => { if (historyState.back) { go(-1) - useCanvas().setSaved(false) } } const forward = () => { if (historyState.forward) { go(1) - useCanvas().setSaved(historyState.index === list.length - 1) } } @@ -95,7 +93,6 @@ const clear = () => { const addHistory = (schema) => { if (!schema) { - useCanvas().setSaved(false) push(useCanvas().getSchema()) } else { clear() diff --git a/packages/toolbars/save/src/Main.vue b/packages/toolbars/save/src/Main.vue index d15a558974..fa184973b6 100644 --- a/packages/toolbars/save/src/Main.vue +++ b/packages/toolbars/save/src/Main.vue @@ -58,7 +58,7 @@ import { reactive, ref, onUnmounted, onMounted } from 'vue' import { VueMonaco } from '@opentiny/tiny-engine-common' import { Button, Popover, DialogBox, Checkbox, Select } from '@opentiny/vue' -import { useCanvas } from '@opentiny/tiny-engine-meta-register' +import { useCanvas, useMessage } from '@opentiny/tiny-engine-meta-register' import { ToolbarBase } from '@opentiny/tiny-engine-common' import { openCommon, saveCommon } from './js/index' import { isLoading, setAutoSaveStatus, getAutoSaveStatus } from './js/index' @@ -90,8 +90,6 @@ export default { } }, setup() { - const { isSaved } = useCanvas() - const delayOptions = [ { value: 5, label: '5分钟' }, { value: 10, label: '10分钟' }, @@ -101,14 +99,62 @@ export default { visible: false, code: '', originalCode: '', - disabled: false, - timeValue: 5, checked: false, + timeValue: 5, preservationTime: null }) const editor = ref(null) + const { isSaved, setSaved, getSchema } = useCanvas() + + const { subscribe, unsubscribe } = useMessage() + const subscriber = 'toolbar-save' + + const originSchema = ref(null) + + onMounted(() => { + // 订阅页面/区块初始化事件 + subscribe({ + topic: 'pageOrBlockInit', + subscriber, + callback: (schema) => { + originSchema.value = JSON.stringify(schema) + setSaved(true) // 初始化时标记为已保存 + } + }) + + // 订阅 schema 变更事件 + subscribe({ + topic: 'schemaChange', + subscriber, + callback: () => { + if (originSchema.value) { + const hasChange = JSON.stringify(getSchema()) === originSchema.value + setSaved(hasChange) + } + } + }) + + // 订阅 schema 导入事件 + subscribe({ + topic: 'schemaImport', + subscriber, + callback: () => { + if (originSchema.value) { + const hasChange = JSON.stringify(getSchema()) === originSchema.value + setSaved(hasChange) + } + } + }) + }) + + onUnmounted(() => { + unsubscribe({ topic: 'pageOrBlockInit', subscriber }) + unsubscribe({ topic: 'schemaChange', subscriber }) + unsubscribe({ topic: 'schemaImport', subscriber }) + }) + const close = () => { state.visible = false state.originalCode = ''