94 lines
2.0 KiB
TypeScript

import { createApp, onBeforeUnmount, Plugin } from 'vue';
import cssStyle from 'element-plus/dist/index.css?raw';
import type { FormConfig, StageCore } from '@tmagic/editor';
import { editorService, formPlugin, injectStyle, Layout, propsService, uiService } from '@tmagic/editor';
import commonConfig from './form-config/common';
import App from './App.vue';
import formConfigs from './form-config';
export * from './component-group-list';
export const propsConfigs = formConfigs;
export const useRuntime = ({
plugins = [],
fillConfig = (config) => config,
}: {
plugins?: Plugin[];
fillConfig?: (config: FormConfig, mForm: any) => FormConfig;
} = {}) => {
const render = (stage: StageCore) => {
const doc = stage.renderer?.getDocument();
if (doc) {
injectStyle(doc, cssStyle);
injectStyle(
doc,
`html,
body,
#app {
width: 100%;
height: 100%;
margin: 0;
}
::-webkit-scrollbar {
width: 0;
}
`,
);
}
const el: HTMLDivElement = globalThis.document.createElement('div');
el.id = 'app';
el.style.overflow = 'auto';
const vueApp = createApp(App, {
stage,
fillConfig,
});
vueApp.use(formPlugin);
plugins.forEach((plugin) => vueApp.use(plugin));
vueApp.mount(el);
setTimeout(() => {
uiService.set('showRule', false);
});
return el;
};
propsService.usePlugin({
async afterFillConfig(config: FormConfig, itemConfig: FormConfig, labelWidth = '80px') {
return [
{
type: 'tab',
items: [
{
title: '属性',
labelWidth,
items: [...commonConfig, ...itemConfig],
},
],
},
] as FormConfig;
},
});
editorService.usePlugin({
async afterGetLayout() {
return Layout.RELATIVE;
},
});
onBeforeUnmount(() => {
propsService.removeAllPlugins();
editorService.removeAllPlugins();
});
return {
render,
};
};