mirror of
https://github.com/jeecgboot/JeecgBoot.git
synced 2025-12-08 17:12:28 +08:00
247 lines
7.5 KiB
Java
247 lines
7.5 KiB
Java
<template>
|
|
<div class="tinymce-containerty" :style="{width:containerWidth}">
|
|
<textarea :id="tinymceId" class="tinymce-textarea" @change="ada"/>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
/**
|
|
* docs:
|
|
* https://panjiachen.github.io/vue-element-admin-site/feature/component/rich-editor.html#tinymce
|
|
*/
|
|
import load from './load'
|
|
//const toolbar = ['searchreplace bold italic underline strikethrough alignleft aligncenter alignright outdent indent blockquote undo redo removeformat subscript superscript code codesample', 'hr bullist numlist link image charmap preview anchor pagebreak insertdatetime media table emoticons forecolor backcolor fullscreen']
|
|
//const plugins = ['advlist anchor autolink autosave code codesample colorpicker colorpicker contextmenu directionality emoticons fullscreen hr image imagetools insertdatetime link lists media nonbreaking noneditable pagebreak paste preview print save searchreplace spellchecker tabfocus table template textcolor textpattern visualblocks visualchars wordcount']
|
|
// why use this cdn, detail see https://github.com/PanJiaChen/tinymce-all-in-one
|
|
const tinymceCDN = 'https://cdn.jsdelivr.net/npm/tinymce-all-in-one@4.9.3/tinymce.min.js'
|
|
|
|
export default {
|
|
name: 'JEditorDyn',
|
|
props: {
|
|
id: {
|
|
type: String,
|
|
default: function() {
|
|
return 'vue-tinymce-' + +new Date() + ((Math.random() * 1000).toFixed(0) + '')
|
|
}
|
|
},
|
|
value: {
|
|
type: String,
|
|
default: ''
|
|
},
|
|
toolbar: {
|
|
type: [String, Array],
|
|
required: false,
|
|
default: 'undo redo | formatselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | lists link unlink image media table | removeformat | fullscreen',
|
|
},
|
|
menubar: {
|
|
type: String,
|
|
default: 'file edit insert view format table'
|
|
},
|
|
height: {
|
|
type: [Number, String],
|
|
required: false,
|
|
default: 360
|
|
},
|
|
width: {
|
|
type: [Number, String],
|
|
required: false,
|
|
default: 'auto'
|
|
},
|
|
plugins: {
|
|
type: [String, Array],
|
|
default: 'lists image link media table textcolor wordcount contextmenu fullscreen'
|
|
}
|
|
},
|
|
data() {
|
|
return {
|
|
hasChange: false,
|
|
hasInit: false,
|
|
tinymceId: this.id,
|
|
fullscreen: false,
|
|
languageTypeList: {
|
|
'en': 'en',
|
|
'zh': 'zh_CN',
|
|
'es': 'es_MX',
|
|
'ja': 'ja'
|
|
}
|
|
}
|
|
},
|
|
computed: {
|
|
containerWidth() {
|
|
const width = this.width
|
|
if (/^[\d]+(\.[\d]+)?$/.test(width)) { // matches `100`, `'100'`
|
|
return `${width}px`
|
|
}
|
|
return width
|
|
}
|
|
},
|
|
watch: {
|
|
value(val) {
|
|
if (!this.hasChange && this.hasInit) {
|
|
this.$nextTick(() =>
|
|
window.tinymce.get(this.tinymceId).setContent(val || ''))
|
|
}
|
|
}
|
|
},
|
|
mounted() {
|
|
this.init()
|
|
},
|
|
activated() {
|
|
if (window.tinymce) {
|
|
this.initTinymce()
|
|
}
|
|
},
|
|
deactivated() {
|
|
this.destroyTinymce()
|
|
},
|
|
destroyed() {
|
|
this.destroyTinymce()
|
|
},
|
|
methods: {
|
|
ada() {
|
|
console.log('change')
|
|
},
|
|
init() {
|
|
// dynamic load tinymce from cdn
|
|
load(tinymceCDN, (err) => {
|
|
if (err) {
|
|
this.$message.error(err.message)
|
|
return
|
|
}
|
|
this.initTinymce()
|
|
})
|
|
},
|
|
initTinymce() {
|
|
const _this = this
|
|
window.tinymce.init({
|
|
selector: `#${this.tinymceId}`,
|
|
language: this.languageTypeList['zh'],
|
|
height: this.height,
|
|
body_class: 'panel-body ',
|
|
object_resizing: false,
|
|
toolbar: this.toolbar,
|
|
menubar: false,
|
|
plugins: this.plugins,
|
|
end_container_on_empty_block: true,
|
|
powerpaste_word_import: 'clean',
|
|
code_dialog_height: 450,
|
|
code_dialog_width: 1000,
|
|
advlist_bullet_styles: 'square',
|
|
advlist_number_styles: 'default',
|
|
imagetools_cors_hosts: ['www.tinymce.com', 'codepen.io'],
|
|
default_link_target: '_blank',
|
|
link_title: false,
|
|
nonbreaking_force_tab: true, // inserting nonbreaking space need Nonbreaking Space Plugin
|
|
init_instance_callback: editor => {
|
|
if (_this.value) {
|
|
editor.setContent(_this.value)
|
|
}
|
|
_this.hasInit = true
|
|
editor.on('NodeChange Change KeyUp SetContent', () => {
|
|
this.hasChange = true
|
|
this.$emit('input', editor.getContent())
|
|
})
|
|
},
|
|
setup(editor) {
|
|
editor.on('FullscreenStateChanged', (e) => {
|
|
_this.fullscreen = e.state
|
|
})
|
|
},
|
|
// it will try to keep these URLs intact
|
|
// https://www.tiny.cloud/docs-3x/reference/configuration/Configuration3x@convert_urls/
|
|
// https://stackoverflow.com/questions/5196205/disable-tinymce-absolute-to-relative-url-conversions
|
|
convert_urls: false
|
|
// 整合七牛上传
|
|
// images_dataimg_filter(img) {
|
|
// setTimeout(() => {
|
|
// const $image = $(img);
|
|
// $image.removeAttr('width');
|
|
// $image.removeAttr('height');
|
|
// if ($image[0].height && $image[0].width) {
|
|
// $image.attr('data-wscntype', 'image');
|
|
// $image.attr('data-wscnh', $image[0].height);
|
|
// $image.attr('data-wscnw', $image[0].width);
|
|
// $image.addClass('wscnph');
|
|
// }
|
|
// }, 0);
|
|
// return img
|
|
// },
|
|
// images_upload_handler(blobInfo, success, failure, progress) {
|
|
// progress(0);
|
|
// const token = _this.$store.getters.token;
|
|
// getToken(token).then(response => {
|
|
// const url = response.data.qiniu_url;
|
|
// const formData = new FormData();
|
|
// formData.append('token', response.data.qiniu_token);
|
|
// formData.append('key', response.data.qiniu_key);
|
|
// formData.append('file', blobInfo.blob(), url);
|
|
// upload(formData).then(() => {
|
|
// success(url);
|
|
// progress(100);
|
|
// })
|
|
// }).catch(err => {
|
|
// failure('err')
|
|
// console.log(err);
|
|
// });
|
|
// },
|
|
})
|
|
},
|
|
destroyTinymce() {
|
|
const tinymce = window.tinymce.get(this.tinymceId)
|
|
if (this.fullscreen) {
|
|
tinymce.execCommand('mceFullScreen')
|
|
}
|
|
|
|
if (tinymce) {
|
|
tinymce.destroy()
|
|
}
|
|
},
|
|
setContent(value) {
|
|
window.tinymce.get(this.tinymceId).setContent(value)
|
|
},
|
|
getContent() {
|
|
window.tinymce.get(this.tinymceId).getContent()
|
|
},
|
|
imageSuccessCBK(arr) {
|
|
arr.forEach(v => window.tinymce.get(this.tinymceId).insertContent(`<img class="wscnph" src="${v.url}" >`))
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style lang="less" scoped>
|
|
.tinymce-containerty {
|
|
position: relative;
|
|
line-height: normal;
|
|
}
|
|
|
|
.tinymce-containerty {
|
|
::v-deep {
|
|
.mce-fullscreen {
|
|
z-index: 10000;
|
|
}
|
|
}
|
|
}
|
|
|
|
.tinymce-textarea {
|
|
visibility: hidden;
|
|
z-index: -1;
|
|
}
|
|
|
|
.editor-custom-btn-container {
|
|
position: absolute;
|
|
right: 4px;
|
|
top: 4px;
|
|
/*z-index: 2005;*/
|
|
}
|
|
|
|
.fullscreen .editor-custom-btn-container {
|
|
z-index: 10000;
|
|
position: fixed;
|
|
}
|
|
|
|
.editor-upload-btn {
|
|
display: inline-block;
|
|
}
|
|
</style>
|