From 3ad1a4f5a69b4242d55e6bc17aceab7279241e14 Mon Sep 17 00:00:00 2001 From: vben Date: Mon, 11 Jan 2021 21:20:40 +0800 Subject: [PATCH] feat(tinymce): add image upload #170 --- CHANGELOG.zh_CN.md | 2 + src/components/Tinymce/src/Editor.vue | 72 ++++++++++++------- src/components/Tinymce/src/ImgUpload.vue | 72 +++++++++++++++++++ src/components/Tinymce/src/props.ts | 12 ++-- .../header/components/user-dropdown/index.vue | 9 ++- src/layouts/default/header/index.vue | 1 - src/locales/lang/en/component/upload.ts | 1 + src/locales/lang/zh_CN/component/upload.ts | 1 + 8 files changed, 133 insertions(+), 37 deletions(-) create mode 100644 src/components/Tinymce/src/ImgUpload.vue diff --git a/CHANGELOG.zh_CN.md b/CHANGELOG.zh_CN.md index 8f09c977..700c81b2 100644 --- a/CHANGELOG.zh_CN.md +++ b/CHANGELOG.zh_CN.md @@ -16,6 +16,7 @@ - 新增`PageWrapper`组件。并应用于示例页面 - 新增标签页折叠功能 - 兼容旧版浏览器 +- tinymce 新增图片上传· ### 🐛 Bug Fixes @@ -24,6 +25,7 @@ - 修复表格内存溢出问题 - 修复`layout` 收缩展开功能在分割模式下失效 - 修复 modal 高度计算错误 +- 修复文件上传错误 ### 🎫 Chores diff --git a/src/components/Tinymce/src/Editor.vue b/src/components/Tinymce/src/Editor.vue index 7c01c4ec..a28b8a3c 100644 --- a/src/components/Tinymce/src/Editor.vue +++ b/src/components/Tinymce/src/Editor.vue @@ -1,5 +1,11 @@ @@ -24,6 +30,8 @@ import { bindHandlers } from './helper'; import lineHeight from './lineHeight'; import { onMountedOrActivated } from '/@/hooks/core/onMountedOrActivated'; + import ImgUpload from './ImgUpload.vue'; + import { useDesign } from '/@/hooks/web/useDesign'; const CDN_URL = 'https://cdn.bootcdn.net/ajax/libs/tinymce/5.5.1'; @@ -33,12 +41,15 @@ name: 'Tinymce', inheritAttrs: false, props: basicProps, + components: { ImgUpload }, emits: ['change', 'update:modelValue'], setup(props, { emit, attrs }) { const editorRef = ref(null); const tinymceId = ref(snowUuid('tiny-vue')); const elRef = ref>(null); + const { prefixCls } = useDesign('tinymce-container'); + const tinymceContent = computed(() => { return props.modelValue; }); @@ -140,7 +151,7 @@ bindHandlers(e, attrs, unref(editorRef)); } - function setValue(editor: any, val: string, prevVal: string) { + function setValue(editor: Recordable, val: string, prevVal?: string) { if ( editor && typeof val === 'string' && @@ -179,45 +190,54 @@ }); } + function handleImageUploading(name: string) { + const editor = unref(editorRef); + if (!editor) return; + const content = editor?.getContent() ?? ''; + setValue(editor, `${content}\n${getImgName(name)}`); + } + + function handleDone(name: string, url: string) { + const editor = unref(editorRef); + if (!editor) return; + + const content = editor?.getContent() ?? ''; + const val = content?.replace(getImgName(name), ``) ?? ''; + setValue(editor, val); + } + + function getImgName(name: string) { + return `[uploading:${name}]`; + } + return { + prefixCls, containerWidth, initOptions, tinymceContent, tinymceScriptSrc, elRef, tinymceId, + handleImageUploading, + handleDone, + editorRef, }; }, }); - + + diff --git a/src/components/Tinymce/src/ImgUpload.vue b/src/components/Tinymce/src/ImgUpload.vue new file mode 100644 index 00000000..0813c7ee --- /dev/null +++ b/src/components/Tinymce/src/ImgUpload.vue @@ -0,0 +1,72 @@ + + + diff --git a/src/components/Tinymce/src/props.ts b/src/components/Tinymce/src/props.ts index ca072529..4da600c3 100644 --- a/src/components/Tinymce/src/props.ts +++ b/src/components/Tinymce/src/props.ts @@ -1,18 +1,13 @@ import { PropType } from 'vue'; +import { propTypes } from '/@/utils/propTypes'; export const basicProps = { options: { type: Object as PropType, default: {}, }, - value: { - type: String as PropType, - // default: '' - }, - modelValue: { - type: String as PropType, - // default: '' - }, + value: propTypes.string, + modelValue: propTypes.string, // 高度 height: { type: [Number, String] as PropType, @@ -26,4 +21,5 @@ export const basicProps = { required: false, default: 'auto', }, + showImageUpload: propTypes.bool.def(true), }; diff --git a/src/layouts/default/header/components/user-dropdown/index.vue b/src/layouts/default/header/components/user-dropdown/index.vue index 2b59af64..90a647f8 100644 --- a/src/layouts/default/header/components/user-dropdown/index.vue +++ b/src/layouts/default/header/components/user-dropdown/index.vue @@ -9,8 +9,13 @@