Files
mayfly-go/frontend/src/components/monaco/MonacoEditorBox.ts
2025-01-18 13:43:01 +08:00

86 lines
2.9 KiB
TypeScript
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.

import { VNode, h, render } from 'vue';
import MonacoEditorDialog from './MonacoEditorDialog.vue';
import * as monaco from 'monaco-editor';
import { ElMessage } from 'element-plus';
export type MonacoEditorDialogProps = {
content: string;
title: string;
language: string;
height?: string;
width?: string;
options?: any; // 可选项,如字体大小等
canChangeLang?: boolean; // 是否可以切换语言
showConfirmButton?: boolean;
confirmFn?: Function; // 点击确认的回调函数入参editor value
closeFn?: Function; // 点击取消 或 关闭弹窗的回调函数
completionItemProvider?: monaco.languages.CompletionItemProvider; // 自定义补全项
};
const MonacoEditorBox = (props: MonacoEditorDialogProps): void => {
const boxId = 'monaco-editor-dialog-id';
let boxInstance: VNode;
const container = document.getElementById(boxId);
if (!container) {
const container = document.createElement('div');
container.id = boxId;
if (props.showConfirmButton === undefined) {
props.showConfirmButton = true;
}
if (props.canChangeLang === undefined) {
props.canChangeLang = true;
}
if (props.content === undefined) {
props.content = '';
}
// 创建 虚拟dom
boxInstance = h(MonacoEditorDialog, {
...props,
modelValue: props.content,
'onUpdate:modelValue': (value: string) => {
props.content = value;
},
// 'onUpdate:visible': (value: boolean) => {},
visible: true,
onClose: () => {
// 卸载组件
if (boxInstance) {
render(null, container);
boxInstance = null as any;
}
// 移除 container DOM 元素
document.body.removeChild(container);
props.closeFn && props.closeFn();
},
onConfirm: () => {
let value = props.content;
if (props.language === 'json') {
let val;
try {
val = JSON.parse(value);
if (typeof val !== 'object') {
ElMessage.error('Invalid json');
return;
}
} catch (e) {
ElMessage.error('Invalid json');
return;
}
// 压缩json字符串
value = JSON.stringify(val);
}
props.confirmFn && props.confirmFn(value);
},
});
// 将虚拟dom渲染到 container dom 上
render(boxInstance, container);
// 最后将 container 追加到 body 上
document.body.appendChild(container);
}
};
export default MonacoEditorBox;