mirror of
https://gitee.com/dromara/mayfly-go
synced 2025-12-25 09:06:34 +08:00
feat: monaco主题移至全局配置
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="monaco-editor">
|
<div class="monaco-editor" style="border: 1px solid #ccc;">
|
||||||
<div ref="monacoTextarea" :style="{ height: height }"></div>
|
<div ref="monacoTextarea" :style="{ height: height }"></div>
|
||||||
<el-select v-if="canChangeMode" class="code-mode-select" v-model="languageMode" @change="changeLanguage">
|
<el-select v-if="canChangeMode" class="code-mode-select" v-model="languageMode" @change="changeLanguage">
|
||||||
<el-option v-for="mode in languages" :key="mode.value" :label="mode.label" :value="mode.value"> </el-option>
|
<el-option v-for="mode in languages" :key="mode.value" :label="mode.label" :value="mode.value"> </el-option>
|
||||||
@@ -23,7 +23,6 @@ import { editor } from 'monaco-editor';
|
|||||||
// import Dracula from 'monaco-themes/themes/Dracula.json'
|
// import Dracula from 'monaco-themes/themes/Dracula.json'
|
||||||
import SolarizedLight from 'monaco-themes/themes/Solarized-light.json'
|
import SolarizedLight from 'monaco-themes/themes/Solarized-light.json'
|
||||||
import { language as shellLan } from 'monaco-editor/esm/vs/basic-languages/shell/shell.js';
|
import { language as shellLan } from 'monaco-editor/esm/vs/basic-languages/shell/shell.js';
|
||||||
|
|
||||||
import { ElOption, ElSelect } from 'element-plus';
|
import { ElOption, ElSelect } from 'element-plus';
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
@@ -138,14 +137,14 @@ const {
|
|||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
state.languageMode = props.language;
|
state.languageMode = props.language;
|
||||||
initMonacoEditor();
|
initMonacoEditorIns();
|
||||||
setEditorValue(props.modelValue);
|
setEditorValue(props.modelValue);
|
||||||
registerCompletionItemProvider();
|
registerCompletionItemProvider();
|
||||||
});
|
});
|
||||||
|
|
||||||
onBeforeUnmount(() => {
|
onBeforeUnmount(() => {
|
||||||
if (monacoEditor) {
|
if (monacoEditorIns) {
|
||||||
monacoEditor.dispose();
|
monacoEditorIns.dispose();
|
||||||
}
|
}
|
||||||
if (completionItemProvider) {
|
if (completionItemProvider) {
|
||||||
completionItemProvider.dispose();
|
completionItemProvider.dispose();
|
||||||
@@ -153,9 +152,9 @@ onBeforeUnmount(() => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
watch(() => props.modelValue, (newValue: any) => {
|
watch(() => props.modelValue, (newValue: any) => {
|
||||||
if (!monacoEditor.hasTextFocus()) {
|
if (!monacoEditorIns.hasTextFocus()) {
|
||||||
state.languageMode = props.language
|
state.languageMode = props.language
|
||||||
monacoEditor?.setValue(newValue)
|
monacoEditorIns?.setValue(newValue)
|
||||||
changeLanguage(state.languageMode)
|
changeLanguage(state.languageMode)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -163,7 +162,7 @@ watch(() => props.modelValue, (newValue: any) => {
|
|||||||
|
|
||||||
const monacoTextarea: any = ref(null);
|
const monacoTextarea: any = ref(null);
|
||||||
|
|
||||||
let monacoEditor: editor.IStandaloneCodeEditor = null;
|
let monacoEditorIns: editor.IStandaloneCodeEditor = null;
|
||||||
let completionItemProvider: any = null;
|
let completionItemProvider: any = null;
|
||||||
|
|
||||||
self.MonacoEnvironment = {
|
self.MonacoEnvironment = {
|
||||||
@@ -172,17 +171,19 @@ self.MonacoEnvironment = {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const initMonacoEditor = () => {
|
const initMonacoEditorIns = () => {
|
||||||
console.log('初始化monaco编辑器')
|
console.log('初始化monaco编辑器')
|
||||||
// options参数参考 https://microsoft.github.io/monaco-editor/api/interfaces/monaco.editor.IStandaloneEditorConstructionOptions.html#language
|
// options参数参考 https://microsoft.github.io/monaco-editor/api/interfaces/monaco.editor.IStandaloneEditorConstructionOptions.html#language
|
||||||
// 初始化一些主题
|
// 初始化一些主题
|
||||||
monaco.editor.defineTheme('SolarizedLight', SolarizedLight);
|
monaco.editor.defineTheme('SolarizedLight', SolarizedLight);
|
||||||
options.language = state.languageMode;
|
options.language = state.languageMode;
|
||||||
monacoEditor = monaco.editor.create(monacoTextarea.value, Object.assign(options, props.options));
|
// 从localStorage中获取,通过store可能存在父子组件都使用store报错
|
||||||
|
options.theme = JSON.parse(localStorage.getItem('themeConfig') as string).editorTheme || 'vs';
|
||||||
|
monacoEditorIns = monaco.editor.create(monacoTextarea.value, Object.assign(options, props.options));
|
||||||
|
|
||||||
// 监听内容改变,双向绑定
|
// 监听内容改变,双向绑定
|
||||||
monacoEditor.onDidChangeModelContent(() => {
|
monacoEditorIns.onDidChangeModelContent(() => {
|
||||||
emit('update:modelValue', monacoEditor.getModel().getValue());
|
emit('update:modelValue', monacoEditorIns.getModel().getValue());
|
||||||
})
|
})
|
||||||
|
|
||||||
// 动态设置主题
|
// 动态设置主题
|
||||||
@@ -192,11 +193,11 @@ const initMonacoEditor = () => {
|
|||||||
const changeLanguage = (value: any) => {
|
const changeLanguage = (value: any) => {
|
||||||
console.log('change lan');
|
console.log('change lan');
|
||||||
// 获取当前的文档模型
|
// 获取当前的文档模型
|
||||||
let oldModel = monacoEditor.getModel()
|
let oldModel = monacoEditorIns.getModel()
|
||||||
// 创建一个新的文档模型
|
// 创建一个新的文档模型
|
||||||
let newModel = monaco.editor.createModel(oldModel.getValue(), value)
|
let newModel = monaco.editor.createModel(oldModel.getValue(), value)
|
||||||
// 设置成新的
|
// 设置成新的
|
||||||
monacoEditor.setModel(newModel)
|
monacoEditorIns.setModel(newModel)
|
||||||
// 销毁旧的模型
|
// 销毁旧的模型
|
||||||
if (oldModel) {
|
if (oldModel) {
|
||||||
oldModel.dispose()
|
oldModel.dispose()
|
||||||
@@ -206,7 +207,7 @@ const changeLanguage = (value: any) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const setEditorValue = (value: any) => {
|
const setEditorValue = (value: any) => {
|
||||||
monacoEditor.getModel().setValue(value)
|
monacoEditorIns.getModel().setValue(value)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ export interface ThemeConfigState {
|
|||||||
terminalCursor: string;
|
terminalCursor: string;
|
||||||
terminalFontSize: number;
|
terminalFontSize: number;
|
||||||
terminalFontWeight: string;
|
terminalFontWeight: string;
|
||||||
|
editorTheme: string;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -115,6 +115,9 @@ const themeConfigModule: Module<ThemeConfigState, RootStateTypes> = {
|
|||||||
terminalFontSize: 15,
|
terminalFontSize: 15,
|
||||||
terminalFontWeight: 'normal',
|
terminalFontWeight: 'normal',
|
||||||
|
|
||||||
|
// 编辑器主题
|
||||||
|
editorTheme: 'vs',
|
||||||
|
|
||||||
|
|
||||||
/* 后端控制路由
|
/* 后端控制路由
|
||||||
------------------------------- */
|
------------------------------- */
|
||||||
|
|||||||
@@ -50,6 +50,18 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<el-divider content-position="left">monaco editor</el-divider>
|
||||||
|
<div class="layout-breadcrumb-seting-bar-flex">
|
||||||
|
<div class="layout-breadcrumb-seting-bar-flex-label">主题</div>
|
||||||
|
<div class="layout-breadcrumb-seting-bar-flex-value">
|
||||||
|
<el-select @change="setLocalThemeConfig" v-model="getThemeConfig.editorTheme" size="small" style="width: 130px">
|
||||||
|
<el-option label="vs" value="vs"> </el-option>
|
||||||
|
<el-option label="vs-dark" value="vs-dark"> </el-option>
|
||||||
|
<el-option label="SolarizedLight" value="SolarizedLight"> </el-option>
|
||||||
|
</el-select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!-- 全局主题 -->
|
<!-- 全局主题 -->
|
||||||
<el-divider content-position="left">全局主题</el-divider>
|
<el-divider content-position="left">全局主题</el-divider>
|
||||||
<div class="layout-breadcrumb-seting-bar-flex">
|
<div class="layout-breadcrumb-seting-bar-flex">
|
||||||
|
|||||||
@@ -87,14 +87,6 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div style="float: right" class="fl">
|
<div style="float: right" class="fl">
|
||||||
<el-select v-model="monacoOptions.theme" placeholder="切换编辑器主题"
|
|
||||||
@change="changeEditorTheme" filterable allow-create default-first-option
|
|
||||||
size="small" class="mr10">
|
|
||||||
<el-option v-for="item in monacoOptions.defaultThemes as string" :key="item"
|
|
||||||
:label="item" :value="item">
|
|
||||||
{{ item }}
|
|
||||||
</el-option>
|
|
||||||
</el-select>
|
|
||||||
<el-select v-model="sqlName" placeholder="选择or输入SQL模板名" @change="changeSqlTemplate"
|
<el-select v-model="sqlName" placeholder="选择or输入SQL模板名" @change="changeSqlTemplate"
|
||||||
filterable allow-create default-first-option size="small" class="mr10">
|
filterable allow-create default-first-option size="small" class="mr10">
|
||||||
<el-option v-for="item in sqlNames as any" :key="item" :label="item.database"
|
<el-option v-for="item in sqlNames as any" :key="item" :label="item.database"
|
||||||
@@ -254,7 +246,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { onMounted, toRefs, reactive, ref, watch } from 'vue';
|
import { onMounted, computed, toRefs, reactive, ref, watch } from 'vue';
|
||||||
import { dbApi } from './api';
|
import { dbApi } from './api';
|
||||||
|
|
||||||
import { format as sqlFormatter } from 'sql-formatter';
|
import { format as sqlFormatter } from 'sql-formatter';
|
||||||
@@ -342,8 +334,6 @@ const state = reactive({
|
|||||||
height: '',
|
height: '',
|
||||||
tableMaxHeight: 250,
|
tableMaxHeight: 250,
|
||||||
dbTables: {},
|
dbTables: {},
|
||||||
theme: 'vs',
|
|
||||||
defaultThemes: ['SolarizedLight', 'vs', 'vs-dark'],
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
const {
|
const {
|
||||||
@@ -367,6 +357,11 @@ const {
|
|||||||
monacoOptions
|
monacoOptions
|
||||||
} = toRefs(state)
|
} = toRefs(state)
|
||||||
|
|
||||||
|
// 获取布局配置信息
|
||||||
|
const getThemeConfig: any = computed(() => {
|
||||||
|
return store.state.themeConfig.themeConfig;
|
||||||
|
});
|
||||||
|
|
||||||
let monacoEditor = {} as editor.IStandaloneCodeEditor;
|
let monacoEditor = {} as editor.IStandaloneCodeEditor;
|
||||||
let completionItemProvider: any = null;
|
let completionItemProvider: any = null;
|
||||||
|
|
||||||
@@ -382,7 +377,7 @@ const initMonacoEditor = () => {
|
|||||||
monaco.editor.defineTheme('SolarizedLight', SolarizedLight);
|
monaco.editor.defineTheme('SolarizedLight', SolarizedLight);
|
||||||
monacoEditor = monaco.editor.create(monacoTextarea.value, {
|
monacoEditor = monaco.editor.create(monacoTextarea.value, {
|
||||||
language: 'sql',
|
language: 'sql',
|
||||||
theme: state.monacoOptions.theme,
|
theme: getThemeConfig.value.editorTheme,
|
||||||
automaticLayout: true, //自适应宽高布局
|
automaticLayout: true, //自适应宽高布局
|
||||||
folding: false,
|
folding: false,
|
||||||
roundedSelection: false, // 禁用选择文本背景的圆角
|
roundedSelection: false, // 禁用选择文本背景的圆角
|
||||||
@@ -1179,10 +1174,6 @@ const changeSqlTemplate = () => {
|
|||||||
getUserSql();
|
getUserSql();
|
||||||
};
|
};
|
||||||
|
|
||||||
const changeEditorTheme = () => {
|
|
||||||
monaco.editor.setTheme(state.monacoOptions.theme);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取用户保存的sql模板内容
|
* 获取用户保存的sql模板内容
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user