blob: fc7df7be47af2025a0095d9bc7b8fd338933ddcc [file] [log] [blame]
<!--
~ Licensed to the Apache Software Foundation (ASF) under one or more
~ contributor license agreements. See the NOTICE file distributed with
~ this work for additional information regarding copyright ownership.
~ The ASF licenses this file to You under the Apache License, Version 2.0
~ (the "License"); you may not use this file except in compliance with
~ the License. You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
<template>
<div
:id="editorId"
:style="{
width: typeof width === 'number' ? width + 'px' : width,
height: typeof height === 'number' ? height + 'px' : height
}"
></div>
</template>
<script lang="ts" setup>
import { onMounted, watch } from 'vue'
import useMonaco from './MonacoEditor'
const emit = defineEmits(['update:modelValue', 'blur'])
const props = defineProps({
modelValue: {
type: String,
default: ''
},
width: {
type: [String, Number],
default: '100%'
},
height: {
type: [String, Number],
default: '100%'
},
theme: {
type: String,
default: 'vs-light'
},
language: {
type: String,
default: 'json'
},
editorId: {
type: String,
default: 'editor'
},
editorOptions: {
type: Object,
default: () => ({})
},
readonly: {
type: Boolean,
default: false
}
})
const { createEditor, updateVal, getEditor, onFormatDoc } = useMonaco(props.language)
const updateMonacoVal = (_val?: string) => {
const val = _val || props.modelValue
updateVal(val)
}
watch(
() => props.modelValue,
(val) => {
val !== getEditor()?.getValue() && updateMonacoVal(val)
}
)
onMounted(() => {
const editor = createEditor(document.querySelector(`#${props.editorId}`), {
theme: props.theme,
readOnly: props.readonly,
...props.editorOptions
})
updateMonacoVal()
if (editor) {
editor.onDidChangeModelContent(() => {
emit('update:modelValue', editor.getValue())
})
editor.onDidBlurEditorText(() => {
emit('blur')
})
}
})
defineExpose({
onFormatDoc
})
</script>