2019-04-14 16:20:04 +08:00
|
|
|
|
<template>
|
|
|
|
|
<div class="tinymce-editor">
|
|
|
|
|
<editor
|
2020-07-11 12:54:57 +08:00
|
|
|
|
v-if="!reloading"
|
2019-04-14 16:20:04 +08:00
|
|
|
|
v-model="myValue"
|
|
|
|
|
:init="init"
|
|
|
|
|
:disabled="disabled"
|
|
|
|
|
@onClick="onClick">
|
|
|
|
|
</editor>
|
|
|
|
|
</div>
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<script>
|
|
|
|
|
import tinymce from 'tinymce/tinymce'
|
|
|
|
|
import Editor from '@tinymce/tinymce-vue'
|
|
|
|
|
import 'tinymce/themes/silver/theme'
|
|
|
|
|
import 'tinymce/plugins/image'
|
2019-12-25 13:25:10 +08:00
|
|
|
|
import 'tinymce/plugins/link'
|
2019-04-14 16:20:04 +08:00
|
|
|
|
import 'tinymce/plugins/media'
|
|
|
|
|
import 'tinymce/plugins/table'
|
|
|
|
|
import 'tinymce/plugins/lists'
|
|
|
|
|
import 'tinymce/plugins/contextmenu'
|
|
|
|
|
import 'tinymce/plugins/wordcount'
|
|
|
|
|
import 'tinymce/plugins/colorpicker'
|
|
|
|
|
import 'tinymce/plugins/textcolor'
|
2019-07-05 15:38:38 +08:00
|
|
|
|
import 'tinymce/plugins/fullscreen'
|
2020-07-11 12:54:57 +08:00
|
|
|
|
import 'tinymce/icons/default'
|
2020-05-03 12:43:53 +08:00
|
|
|
|
import { uploadAction,getFileAccessHttpUrl } from '@/api/manage'
|
2020-07-11 12:54:57 +08:00
|
|
|
|
import { getVmParentByName } from '@/utils/util'
|
2019-04-14 16:20:04 +08:00
|
|
|
|
export default {
|
|
|
|
|
components: {
|
|
|
|
|
Editor
|
|
|
|
|
},
|
|
|
|
|
props: {
|
|
|
|
|
value: {
|
|
|
|
|
type: String,
|
|
|
|
|
required:false
|
|
|
|
|
},
|
2019-05-19 18:54:09 +08:00
|
|
|
|
triggerChange:{
|
|
|
|
|
type: Boolean,
|
|
|
|
|
default: false,
|
|
|
|
|
required:false
|
|
|
|
|
},
|
2019-04-14 16:20:04 +08:00
|
|
|
|
disabled: {
|
|
|
|
|
type: Boolean,
|
|
|
|
|
default: false
|
|
|
|
|
},
|
|
|
|
|
plugins: {
|
|
|
|
|
type: [String, Array],
|
2019-12-25 13:25:10 +08:00
|
|
|
|
default: 'lists image link media table textcolor wordcount contextmenu fullscreen'
|
2019-04-14 16:20:04 +08:00
|
|
|
|
},
|
|
|
|
|
toolbar: {
|
|
|
|
|
type: [String, Array],
|
2019-12-25 13:25:10 +08:00
|
|
|
|
default: 'undo redo | formatselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | lists link unlink image media table | removeformat | fullscreen',
|
|
|
|
|
branding:false
|
2019-04-14 16:20:04 +08:00
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
data() {
|
|
|
|
|
return {
|
|
|
|
|
//初始化配置
|
|
|
|
|
init: {
|
|
|
|
|
language_url: '/tinymce/langs/zh_CN.js',
|
|
|
|
|
language: 'zh_CN',
|
|
|
|
|
skin_url: '/tinymce/skins/lightgray',
|
|
|
|
|
height: 300,
|
|
|
|
|
plugins: this.plugins,
|
|
|
|
|
toolbar: this.toolbar,
|
|
|
|
|
branding: false,
|
|
|
|
|
menubar: false,
|
2019-11-21 18:17:25 +08:00
|
|
|
|
toolbar_drawer: false,
|
2019-04-14 16:20:04 +08:00
|
|
|
|
images_upload_handler: (blobInfo, success) => {
|
2020-05-03 12:43:53 +08:00
|
|
|
|
let formData = new FormData()
|
|
|
|
|
formData.append('file', blobInfo.blob(), blobInfo.filename());
|
|
|
|
|
formData.append('biz', "jeditor");
|
|
|
|
|
formData.append("jeditor","1");
|
|
|
|
|
uploadAction(window._CONFIG['domianURL']+"/sys/common/upload", formData).then((res) => {
|
|
|
|
|
if (res.success) {
|
|
|
|
|
if(res.message == 'local'){
|
|
|
|
|
const img = 'data:image/jpeg;base64,' + blobInfo.base64()
|
|
|
|
|
success(img)
|
|
|
|
|
}else{
|
|
|
|
|
let img = getFileAccessHttpUrl(res.message)
|
|
|
|
|
success(img)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
})
|
2019-04-14 16:20:04 +08:00
|
|
|
|
}
|
|
|
|
|
},
|
2020-07-11 12:54:57 +08:00
|
|
|
|
myValue: this.value,
|
|
|
|
|
reloading: false,
|
2019-04-14 16:20:04 +08:00
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
mounted() {
|
2020-07-11 12:54:57 +08:00
|
|
|
|
this.initATabsChangeAutoReload()
|
2019-04-14 16:20:04 +08:00
|
|
|
|
},
|
|
|
|
|
methods: {
|
|
|
|
|
|
2020-07-11 12:54:57 +08:00
|
|
|
|
reload() {
|
|
|
|
|
this.reloading = true
|
|
|
|
|
this.$nextTick(() => this.reloading = false)
|
|
|
|
|
},
|
|
|
|
|
|
2019-04-14 16:20:04 +08:00
|
|
|
|
onClick(e) {
|
|
|
|
|
this.$emit('onClick', e, tinymce)
|
|
|
|
|
},
|
|
|
|
|
//可以添加一些自己的自定义事件,如清空内容
|
|
|
|
|
clear() {
|
|
|
|
|
this.myValue = ''
|
2020-07-11 12:54:57 +08:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 自动判断父级是否是 <a-tabs/> 组件,然后添加事件监听,自动触发reload()
|
|
|
|
|
*
|
|
|
|
|
* 由于 tabs 组件切换会导致 tinymce 无法输入,
|
|
|
|
|
* 只有重新加载才能使用(无论是vue版的还是jQuery版tinymce都有这个通病)
|
|
|
|
|
*/
|
|
|
|
|
initATabsChangeAutoReload() {
|
|
|
|
|
// 获取父级
|
|
|
|
|
let tabs = getVmParentByName(this, 'ATabs')
|
|
|
|
|
let tabPane = getVmParentByName(this, 'ATabPane')
|
|
|
|
|
if (tabs && tabPane) {
|
|
|
|
|
// 用户自定义的 key
|
|
|
|
|
let currentKey = tabPane.$vnode.key
|
|
|
|
|
// 添加事件监听
|
|
|
|
|
tabs.$on('change', (key) => {
|
|
|
|
|
// 切换到自己时执行reload
|
|
|
|
|
if (currentKey === key) {
|
|
|
|
|
this.reload()
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
|
2019-04-14 16:20:04 +08:00
|
|
|
|
},
|
|
|
|
|
watch: {
|
|
|
|
|
value(newValue) {
|
2019-08-24 00:15:45 +08:00
|
|
|
|
this.myValue = (newValue == null ? '' : newValue)
|
2019-04-14 16:20:04 +08:00
|
|
|
|
},
|
|
|
|
|
myValue(newValue) {
|
2019-05-19 18:54:09 +08:00
|
|
|
|
if(this.triggerChange){
|
|
|
|
|
this.$emit('change', newValue)
|
|
|
|
|
}else{
|
|
|
|
|
this.$emit('input', newValue)
|
|
|
|
|
}
|
2019-04-14 16:20:04 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
</script>
|
|
|
|
|
<style scoped>
|
|
|
|
|
</style>
|