From c220e9eed0c2e59423d394a2151ecf8110e9d4ff Mon Sep 17 00:00:00 2001 From: chilingling Date: Mon, 15 Apr 2024 19:43:12 -0700 Subject: [PATCH 1/3] feat(canvasApi): use canvasApi to access canvas methods --- .../components/container/CanvasContainer.vue | 6 +- .../src/components/container/container.js | 44 +++++++++ .../src/components/render/RenderMain.js | 16 ---- packages/canvas/src/index.js | 94 +------------------ .../common/component/BlockDeployDialog.vue | 9 +- packages/common/component/BlockLinkEvent.vue | 8 +- packages/common/component/BlockLinkField.vue | 9 +- packages/common/component/LifeCycles.vue | 10 +- .../common/component/MetaBindVariable.vue | 24 +++-- .../common/component/MetaRelatedEditor.vue | 3 +- packages/common/component/MetaSlot.vue | 5 +- .../common/component/MetaTableColumns.vue | 5 +- packages/controller/src/useBlock.js | 4 +- packages/controller/src/useCanvas.js | 18 ++-- packages/controller/src/useHistory.js | 4 +- packages/controller/src/useProperties.js | 2 +- packages/controller/src/useResource.js | 6 +- packages/controller/src/useTranslate.js | 8 +- packages/design-core/src/App.vue | 20 +++- packages/design-core/src/DesignCanvas.vue | 40 +++++--- packages/plugins/bridge/src/js/resource.js | 7 +- packages/plugins/data/src/Main.vue | 10 +- .../plugins/datasource/src/DataSourceList.vue | 2 +- .../datasource/src/DataSourceRecordList.vue | 5 +- .../plugins/materials/src/block/BlockList.vue | 4 +- .../plugins/materials/src/component/Main.vue | 6 +- packages/plugins/schema/src/Main.vue | 3 +- packages/plugins/script/src/js/method.js | 5 +- packages/plugins/tree/src/Main.vue | 11 ++- .../events/src/components/AdvanceConfig.vue | 4 +- packages/settings/styles/src/Main.vue | 4 +- .../components/classNamesContainer/index.vue | 4 +- packages/settings/styles/src/js/useEditor.js | 5 +- packages/settings/styles/src/js/useStyle.js | 11 ++- packages/toolbars/generate-vue/src/Main.vue | 2 +- packages/toolbars/media/src/Main.vue | 7 +- packages/toolbars/preview/src/Main.vue | 5 +- packages/toolbars/refresh/src/Main.vue | 3 +- packages/toolbars/save/src/js/index.js | 5 +- 39 files changed, 222 insertions(+), 216 deletions(-) diff --git a/packages/canvas/src/components/container/CanvasContainer.vue b/packages/canvas/src/components/container/CanvasContainer.vue index 21abc307f9..fc90e172b3 100644 --- a/packages/canvas/src/components/container/CanvasContainer.vue +++ b/packages/canvas/src/components/container/CanvasContainer.vue @@ -55,7 +55,8 @@ import { initCanvas, clearLineState, querySelectById, - getCurrent + getCurrent, + canvasApi } from './container' export default { @@ -105,6 +106,8 @@ export default { } } + useCanvas().initCanvasApi(canvasApi) + const beforeCanvasReady = () => { if (iframe.value) { const win = iframe.value.contentWindow @@ -119,7 +122,6 @@ export default { iframeMonitoring() initCanvas({ emit, renderer: detail, iframe: iframe.value, controller: props.controller }) - useCanvas().renderer.value = { ...detail, ...window.canvasApi } const doc = iframe.value.contentDocument const win = iframe.value.contentWindow diff --git a/packages/canvas/src/components/container/container.js b/packages/canvas/src/components/container/container.js index 0d438fd5d2..4d267744ec 100644 --- a/packages/canvas/src/components/container/container.js +++ b/packages/canvas/src/components/container/container.js @@ -28,6 +28,7 @@ export const POSITION = Object.freeze({ IN: 'in' }) import { isVsCodeEnv } from '@opentiny/tiny-engine-controller/js/environments' +import Builtin from '../builtin/builtin.json' const initialDragState = { keydown: false, @@ -853,6 +854,49 @@ export const canvasDispatch = (name, data, doc = getDocument()) => { doc.dispatchEvent(new CustomEvent(name, data)) } +export const canvasApi = { + dragStart, + updateRect, + getContext, + getNodePath, + dragMove, + setLocales, + setState, + deleteState, + getRenderer, + clearSelect, + selectNode, + hoverNode, + insertNode, + removeNode, + addComponent, + setPageCss, + addScript, + addStyle, + getNode, + getCurrent, + setSchema, + setUtils, + updateUtils, + deleteUtils, + getSchema, + setI18n, + getCanvasType, + setCanvasType, + setProps, + setGlobalState, + getGlobalState, + getDocument, + canvasDispatch, + Builtin, + setDataSourceMap: (...args) => { + return canvasState.renderer.setDataSourceMap(...args) + }, + getDataSourceMap: (...args) => { + return canvasState.renderer.getDataSourceMap(...args) + } +} + export const initCanvas = ({ renderer, iframe, emit, controller }) => { const currentSchema = getSchema() diff --git a/packages/canvas/src/components/render/RenderMain.js b/packages/canvas/src/components/render/RenderMain.js index 97040fc15c..6081d487ed 100644 --- a/packages/canvas/src/components/render/RenderMain.js +++ b/packages/canvas/src/components/render/RenderMain.js @@ -18,8 +18,6 @@ import { generateFunction } from '@opentiny/tiny-engine-controller/utils' import renderer, { parseData, setConfigure, setController, globalNotify, isStateAccessor } from './render' import { getNode as getNodeById, clearNodes, getRoot, setContext, getContext, setCondition, context } from './context' import CanvasEmpty from './CanvasEmpty.vue' -import { getCurrent, setLocales, updateRect, addStyle, addScript, canvasDispatch } from '../container/container' -import Builtin from '../builtin/builtin.json' const { BROADCAST_CHANNEL } = constants @@ -426,17 +424,3 @@ export const api = { setDataSourceMap, setGlobalState } - -const canvasApi = { - getCurrent, - setLocales, - getNodeById: getNode, - updateRect, - addStyle, - addScript, - canvasDispatch -} - -window.api = api -window.canvasApi = canvasApi -window.Builtin = Builtin diff --git a/packages/canvas/src/index.js b/packages/canvas/src/index.js index fcf1d07eeb..b61e634b94 100644 --- a/packages/canvas/src/index.js +++ b/packages/canvas/src/index.js @@ -10,93 +10,7 @@ * */ -import CanvasContainer from './components/container/CanvasContainer.vue' -import CanvasAction from './components/container/CanvasAction.vue' -import CanvasDragItem from './components/container/CanvasDragItem.vue' -import CanvasFooter from './components/container/CanvasFooter.vue' -import CanvasResize from './components/container/CanvasResize.vue' -import Builtin from './components/builtin/builtin.json' -import RenderMain, { api as renderApi } from './components/render/RenderMain' -import { createRender } from './components/render/runner' -import { - dragStart, - updateRect, - getContext, - getNodePath, - dragMove, - setLocales, - setState, - deleteState, - getRenderer, - clearSelect, - selectNode, - hoverNode, - insertNode, - removeNode, - addComponent, - setPageCss, - addScript, - addStyle, - getNode, - getCurrent, - setSchema, - setUtils, - updateUtils, - deleteUtils, - getSchema, - setI18n, - getCanvasType, - setCanvasType, - setProps, - setGlobalState, - getGlobalState, - getDocument, - canvasDispatch -} from './components/container/container' - -export { - CanvasContainer, - CanvasAction, - CanvasFooter, - CanvasDragItem, - CanvasResize, - RenderMain, - renderApi, - Builtin, - dragStart, - dragMove, - updateRect, - getContext, - getNodePath, - getNode, - getCurrent, - setSchema, - setUtils, - updateUtils, - deleteUtils, - getSchema, - setLocales, - setState, - deleteState, - setI18n, - getRenderer, - clearSelect, - selectNode, - insertNode, - removeNode, - hoverNode, - addComponent, - setPageCss, - addScript, - addStyle, - getCanvasType, - setCanvasType, - setProps, - setGlobalState, - getGlobalState, - getDocument, - canvasDispatch, - createRender -} - -export default CanvasContainer +export { default as CanvasContainer } from './components/container/CanvasContainer.vue' +export { default as CanvasDragItem } from './components/container/CanvasDragItem.vue' +export { default as CanvasFooter } from './components/container/CanvasFooter.vue' +export { createRender } from './components/render/runner' diff --git a/packages/common/component/BlockDeployDialog.vue b/packages/common/component/BlockDeployDialog.vue index 5a6e194829..5e86bc1884 100644 --- a/packages/common/component/BlockDeployDialog.vue +++ b/packages/common/component/BlockDeployDialog.vue @@ -82,8 +82,7 @@ import { FormItem as TinyFormItem } from '@opentiny/vue' import { theme } from '@opentiny/tiny-engine-controller/adapter' -import { useLayout, useNotify } from '@opentiny/tiny-engine-controller' -import { getSchema, setSchema } from '@opentiny/tiny-engine-canvas' +import { useLayout, useNotify, useCanvas } from '@opentiny/tiny-engine-controller' import { constants } from '@opentiny/tiny-engine-utils' import VueMonaco from './VueMonaco.vue' @@ -188,9 +187,10 @@ export default { const remote = await api.getBlockById(block?.id) const originalObj = remote?.content || {} state.originalCode = JSON.stringify(originalObj, null, 2) + const getSchema = useCanvas().canvasApi.getSchema // 转为普通对象,和线上代码顺序保持一致 - const pageSchema = getSchema() || {} + const pageSchema = getSchema?.() || {} if (pageSchema.componentName === 'Block') { state.code = JSON.stringify(pageSchema, null, 2) } else { @@ -220,7 +220,8 @@ export default { } try { const pageSchema = JSON.parse(state.newCode) - setSchema({ ...pageSchema, componentName: COMPONENT_NAME.Block }) + const setSchema = useCanvas().canvasApi.setSchema + setSchema?.({ ...pageSchema, componentName: COMPONENT_NAME.Block }) close() } catch (err) { useNotify({ diff --git a/packages/common/component/BlockLinkEvent.vue b/packages/common/component/BlockLinkEvent.vue index cfc162415b..5df20af684 100644 --- a/packages/common/component/BlockLinkEvent.vue +++ b/packages/common/component/BlockLinkEvent.vue @@ -21,7 +21,6 @@ import { capitalize } from '@vue/shared' import { extend } from '@opentiny/vue-renderless/common/object' import { Input as TinyInput, Form as TinyForm, FormItem as TinyFormItem, Popover as TinyPopover } from '@opentiny/vue' import { useLayout, useModal, useCanvas, useBlock } from '@opentiny/tiny-engine-controller' -import { getSchema, getCurrent } from '@opentiny/tiny-engine-canvas' export default { components: { @@ -38,7 +37,8 @@ export default { const { pageState } = useCanvas() const { addBlockEvent, removeEventLink, getCurrentBlock, appendEventEmit } = useBlock() const { PLUGIN_NAME, activePlugin } = useLayout() - const { schema } = getSchema() + + const { schema } = useCanvas().canvasApi.value?.getSchema?.() || {} const events = schema?.events || [] const eventsList = Object.entries(events).map(([key, value]) => { return { @@ -88,7 +88,7 @@ export default { const { schema: { id, componentName } - } = getCurrent() + } = useCanvas().canvasApi.value?.getCurrent?.() || {} const newEvent = extend(true, {}, data.metaEvent, { linked: { @@ -117,7 +117,7 @@ export default { const editEvent = (item, data) => { const { schema: { id, componentName } - } = getCurrent() + } = useCanvas().canvasApi.value?.getCurrent?.() || {} const oldEventName = data.linkedEventName diff --git a/packages/common/component/BlockLinkField.vue b/packages/common/component/BlockLinkField.vue index 95d2a2bb11..a7a8384304 100644 --- a/packages/common/component/BlockLinkField.vue +++ b/packages/common/component/BlockLinkField.vue @@ -22,7 +22,6 @@ import { reactive, computed } from 'vue' import { extend } from '@opentiny/vue-renderless/common/object' import { Input as TinyInput, Popover as TinyPopover } from '@opentiny/vue' import { useLayout, useModal, useCanvas, useBlock, useHistory } from '@opentiny/tiny-engine-controller' -import { getSchema, getCurrent } from '@opentiny/tiny-engine-canvas' export default { components: { @@ -36,10 +35,10 @@ export default { }, setup(props) { const { confirm } = useModal() - const { pageState } = useCanvas() + const { pageState, canvasApi } = useCanvas() const { addBlockProperty, removePropertyLink, getCurrentBlock, editBlockProperty } = useBlock() const { PLUGIN_NAME, activePlugin } = useLayout() - const { schema } = getSchema() + const { schema } = canvasApi.value.getSchema?.() || {} const state = reactive({ newPropertyName: '' @@ -68,7 +67,7 @@ export default { exec() { const { schema: { id, componentName } - } = getCurrent() + } = canvasApi.value?.getCurrent?.() || {} const newProperty = extend(true, {}, property, { property: state.newPropertyName || `${property.property}${id}`, linked: { @@ -87,7 +86,7 @@ export default { const editProperty = (property) => { const { schema: { id, componentName } - } = getCurrent() + } = canvasApi.value?.getCurrent?.() || {} // 如果之前有关联关系,则需要去除关联 if (props.data?.linked) { diff --git a/packages/common/component/LifeCycles.vue b/packages/common/component/LifeCycles.vue index a608d0a81d..2bc954f9b6 100644 --- a/packages/common/component/LifeCycles.vue +++ b/packages/common/component/LifeCycles.vue @@ -78,9 +78,8 @@