Files
dvcp_v2_webapp/packages/bigscreen/designer/components/jsonEditor.vue
2024-03-25 17:49:57 +08:00

98 lines
2.1 KiB
Vue

<script>
export default {
name: "jsonEditor",
model: {
event: "input",
prop: "value"
},
props: {
value: {default: () => ({})}
},
data() {
return {
editor: null,
fullscreen: false
}
},
watch: {
value(v) {
const content = this.editor.get()
if (v && content && JSON.stringify(v) != JSON.stringify(content)) {
this.editor?.set(v)
}
}
},
methods: {
init() {
const {JSONEditor} = window
if (!this.editor && JSONEditor) {
const {mode, search, mainMenuBar, navigationBar} = this.$attrs
this.editor = new JSONEditor(this.$el, {
modes: ['code', 'form', 'tree'],
language: 'zh-CN', mode, search, mainMenuBar, navigationBar, statusBar: true,
onChange: () => {
this.$emit("input", this.editor.get())
},
}, this.value)
} else setTimeout(() => this.init(), 500)
const fullscreenBtn = this.$el.querySelector(".fullscreenBtn")
if (!fullscreenBtn) {
const btn = document.createElement("div")
btn.className = "fullscreenBtn el-icon-full-screen"
btn.onclick = evt => {
evt.stopPropagation()
this.fullscreen = !this.fullscreen
}
this.$el.appendChild(btn)
}
}
},
mounted() {
this.init()
},
beforeDestroy() {
this.editor?.destroy()
}
}
</script>
<template>
<section class="jsoneditor" @contextmenu.stop :class="{fullscreen}"/>
</template>
<style scoped lang="scss">
.jsoneditor {
position: relative;
&.fullscreen {
position: fixed;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
width: 80vw;
height: 80vh;
z-index: 202403221146;
}
:deep(.ace-jsoneditor) {
font-size: 14px !important;
}
:deep(.fullscreenBtn) {
position: absolute;
z-index: 202403221132;
right: 6px;
top: 0;
height: 35px;
color: white;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
&:hover {
color: rgba(white, .6);
}
}
}
</style>