mirror of
https://github.com/Tencent/tmagic-editor.git
synced 2025-09-22 06:49:57 +08:00
125 lines
3.5 KiB
Vue
125 lines
3.5 KiB
Vue
<template>
|
|
<m-editor
|
|
ref="editor"
|
|
:menu="menu"
|
|
:runtime-url="runtimeUrl"
|
|
:component-group-list="componentList"
|
|
:modelValue="uiConfigs"
|
|
:props-values="magicPresetValues"
|
|
:props-configs="magicPresetConfigs"
|
|
:event-method-list="magicPresetEvents"
|
|
:default-selected="editorDefaultSelected"
|
|
:moveable-options="moveableOptions"
|
|
></m-editor>
|
|
</template>
|
|
|
|
<script lang="ts">
|
|
import { Component, computed, defineComponent, markRaw, ref } from 'vue';
|
|
import { useRoute } from 'vue-router';
|
|
import { Edit, FolderOpened, SwitchButton, Tickets } from '@element-plus/icons';
|
|
|
|
import type { MoveableOptions } from '@tmagic/editor';
|
|
import { ComponentGroup } from '@tmagic/editor';
|
|
import { NodeType } from '@tmagic/schema';
|
|
import StageCore from '@tmagic/stage';
|
|
import { asyncLoadJs } from '@tmagic/utils';
|
|
|
|
import editorApi from '@src/api/editor';
|
|
import magicStore from '@src/store/index';
|
|
import { topMenu } from '@src/use/use-menu';
|
|
import { initConfigByActId } from '@src/use/use-publish';
|
|
|
|
const icons: Record<string, Component> = {
|
|
'folder-opened': markRaw(FolderOpened),
|
|
tickets: markRaw(Tickets),
|
|
'switch-button': markRaw(SwitchButton),
|
|
};
|
|
|
|
export default defineComponent({
|
|
name: 'App',
|
|
|
|
setup() {
|
|
const route = useRoute();
|
|
const editor = ref();
|
|
|
|
const uiConfigs = computed(() => magicStore.get('uiConfigs'));
|
|
const editorDefaultSelected = computed(() => magicStore.get('editorDefaultSelected'));
|
|
const componentList = ref<ComponentGroup[]>([]);
|
|
|
|
const magicPresetValues = ref<Record<string, any>>({});
|
|
const magicPresetConfigs = ref<Record<string, any>>({});
|
|
const magicPresetEvents = ref<Record<string, any>>({});
|
|
// 获取编辑器左侧组件树
|
|
const getComponentList = async () => {
|
|
const { data: list } = await editorApi.getComponentList();
|
|
if (!list) return;
|
|
componentList.value = list.map((item) => ({
|
|
...item,
|
|
items: item.items.map((item) => ({
|
|
...item,
|
|
icon: (typeof item.icon === 'string' ? icons[item.icon] : item.icon) || Edit,
|
|
})),
|
|
}));
|
|
};
|
|
// 根据活动id获取活动配置
|
|
const getActById = async () => {
|
|
await initConfigByActId({ actId: Number(route.params.actId) });
|
|
};
|
|
|
|
asyncLoadJs('/runtime/vue3/assets/config.js').then(() => {
|
|
magicPresetConfigs.value = (window as any).magicPresetConfigs;
|
|
});
|
|
asyncLoadJs('/runtime/vue3/assets/value.js').then(() => {
|
|
magicPresetValues.value = (window as any).magicPresetValues;
|
|
});
|
|
asyncLoadJs('/runtime/vue3/assets/event.js').then(() => {
|
|
magicPresetEvents.value = (window as any).magicPresetEvents;
|
|
});
|
|
|
|
getComponentList();
|
|
getActById();
|
|
|
|
return {
|
|
editor,
|
|
componentList,
|
|
menu: topMenu(),
|
|
uiConfigs,
|
|
runtimeUrl: '/runtime/vue3/playground.html',
|
|
magicPresetValues,
|
|
magicPresetConfigs,
|
|
magicPresetEvents,
|
|
editorDefaultSelected,
|
|
moveableOptions: (core?: StageCore): MoveableOptions => {
|
|
const options: MoveableOptions = {};
|
|
const id = core?.dr?.target?.id;
|
|
|
|
if (!id || !editor.value) return options;
|
|
|
|
const node = editor.value.editorService.getNodeById(id);
|
|
|
|
if (!node) return options;
|
|
|
|
const isPage = node.type === NodeType.PAGE;
|
|
|
|
options.draggable = !isPage;
|
|
options.resizable = !isPage;
|
|
|
|
return options;
|
|
},
|
|
};
|
|
},
|
|
});
|
|
</script>
|
|
<style lang="scss">
|
|
#app {
|
|
width: 100%;
|
|
height: 100%;
|
|
display: flex;
|
|
}
|
|
|
|
.m-editor {
|
|
flex: 1;
|
|
height: 100%;
|
|
}
|
|
</style>
|