From db42d08c39ae6129e2b95cd24c0d57c6769282e5 Mon Sep 17 00:00:00 2001
From: huangyinfeng <1244041895@qq.com>
Date: 星期日, 29 九月 2024 15:32:51 +0800
Subject: [PATCH] 邮件右键菜单

---
 src/components/Tinymce/src/Editor.vue |  779 +++++++++++++++++++++++++++++++++--------------------------
 1 files changed, 431 insertions(+), 348 deletions(-)

diff --git a/src/components/Tinymce/src/Editor.vue b/src/components/Tinymce/src/Editor.vue
index 8341568..025753a 100644
--- a/src/components/Tinymce/src/Editor.vue
+++ b/src/components/Tinymce/src/Editor.vue
@@ -1,393 +1,476 @@
 <template>
   <div :class="prefixCls" :style="{ width: containerWidth }">
-    <a-form-item>
-    <textarea :id="tinymceId" ref="elRef" :style="{ visibility: 'hidden' }" v-if="!initOptions.inline"></textarea>
+    <textarea
+      :id="tinymceId"
+      ref="elRef"
+      :style="{ visibility: 'hidden' }"
+      v-if="!initOptions.inline"
+    ></textarea>
     <slot v-else></slot>
     <div class="p-2 tox-statusbar">
-        <a-form-item-rest class="icon-text" type="success" size="23"> 
-          <ImgUpload :fullscreen="fullscreen" @uploading="handleImageUploading" @done="handleDone" v-if="showImageUpload"
-          v-show="editorRef" :title='"闄勪欢"' :disabled="disabled" :accept='".zip,.txt,.docx,.xls,.xlsx,.pptx"' />
-        </a-form-item-rest>
-
-        <a-form-item-rest class="icon-text" type="success" size="23">
-          <ImgUpload :fullscreen="fullscreen" @uploading="handleImageUploading" @done="handleDone" v-if="showImageUpload"
-          v-show="editorRef" :title='"鍥剧墖"' :disabled="disabled" :accept='".jpg,.jpeg,.gif,.png,.webp"' />
-        </a-form-item-rest>
-        <a-form-item-rest class="icon-text" type="success" size="23">
-          <a-button type="text" size='small'>蹇�熸枃鏈�</a-button>
-        </a-form-item-rest>
+      <ImgUpload
+        ref="fileRef"
+        :fullscreen="fullscreen"
+        :fileListTemp="fileListTemp"
+        @uploading="handleImageUploading"
+        @done="handleDone"
+        @fileListChange="fileListChange"
+        v-if="isImg"
+        v-show="editorRef"
+        :title="'闄勪欢'"
+        :type="'file'"
+        :disabled="disabled"
+      />
+      <div class="my-upload-list">
+        <div style="display: flex">
+          <ImgUpload
+            :fullscreen="fullscreen"
+            @uploading="handleImageUploading"
+            @done="handleDone"
+            v-if="isImg"
+            v-show="editorRef"
+            :title="'鍥剧墖'"
+            :type="'png'"
+            :disabled="disabled"
+            :accept="'.jpg,.jpeg,.gif,.png,.webp'"
+          />
+          <a-button v-if="isText" type="text" size="small">
+            <SnippetsOutlined />
+            蹇�熸枃鏈�</a-button
+          >
+        </div>
+      </div>
     </div>
-    </a-form-item>
-
   </div>
 </template>
 
 <script lang="ts" setup>
-import type { Editor, RawEditorSettings } from 'tinymce';
-import tinymce from 'tinymce/tinymce';
-import 'tinymce/themes/silver';
-import 'tinymce/icons/default/icons';
-import 'tinymce/plugins/advlist';
-import 'tinymce/plugins/anchor';
-import 'tinymce/plugins/autolink';
-import 'tinymce/plugins/autosave';
-import 'tinymce/plugins/code';
-import 'tinymce/plugins/codesample';
-import 'tinymce/plugins/directionality';
-import 'tinymce/plugins/fullscreen';
-import 'tinymce/plugins/hr';
-import 'tinymce/plugins/insertdatetime';
-import 'tinymce/plugins/link';
-import 'tinymce/plugins/lists';
-import 'tinymce/plugins/media';
-import 'tinymce/plugins/nonbreaking';
-import 'tinymce/plugins/noneditable';
-import 'tinymce/plugins/pagebreak';
-import 'tinymce/plugins/paste';
-import 'tinymce/plugins/preview';
-import 'tinymce/plugins/print';
-import 'tinymce/plugins/save';
-import 'tinymce/plugins/searchreplace';
-import 'tinymce/plugins/spellchecker';
-import 'tinymce/plugins/tabfocus';
-// import 'tinymce/plugins/table';
-import 'tinymce/plugins/template';
-import 'tinymce/plugins/textpattern';
-import 'tinymce/plugins/visualblocks';
-import 'tinymce/plugins/visualchars';
-import 'tinymce/plugins/wordcount';
+  import type { Editor, RawEditorSettings } from 'tinymce';
+  import { PaperClipOutlined, UploadOutlined, SnippetsOutlined } from '@ant-design/icons-vue';
+  import { useGlobSetting } from '@/hooks/setting';
 
-import 'tinymce/plugins/image';
-import 'tinymce/plugins/table';
-import 'tinymce/plugins/charmap';
-import 'tinymce/plugins/imagetools';
-import 'tinymce/plugins/help';
-import 'tinymce/plugins/emoticons';
-import 'tinymce/plugins/emoticons/js/emojis';
-// import 'tinymce/plugins/bdmap';
-// import 'tinymce/plugins/indent2em';
-import 'tinymce/plugins/autoresize';
-// import 'tinymce/plugins/formatpainter';
-// import 'tinymce/plugins/axupimgs';
+  import tinymce from 'tinymce/tinymce';
+  import 'tinymce/themes/silver';
+  import 'tinymce/icons/default/icons';
+  import 'tinymce/plugins/advlist';
+  import 'tinymce/plugins/anchor';
+  import 'tinymce/plugins/autolink';
+  import 'tinymce/plugins/autosave';
+  import 'tinymce/plugins/code';
+  import 'tinymce/plugins/codesample';
+  import 'tinymce/plugins/directionality';
+  import 'tinymce/plugins/fullscreen';
+  import 'tinymce/plugins/hr';
+  import 'tinymce/plugins/insertdatetime';
+  import 'tinymce/plugins/link';
+  import 'tinymce/plugins/lists';
+  import 'tinymce/plugins/media';
+  import 'tinymce/plugins/nonbreaking';
+  import 'tinymce/plugins/noneditable';
+  import 'tinymce/plugins/pagebreak';
+  import 'tinymce/plugins/paste';
+  import 'tinymce/plugins/preview';
+  import 'tinymce/plugins/print';
+  import 'tinymce/plugins/save';
+  import 'tinymce/plugins/searchreplace';
+  import 'tinymce/plugins/spellchecker';
+  import 'tinymce/plugins/tabfocus';
+  // import 'tinymce/plugins/table';
+  import 'tinymce/plugins/template';
+  import 'tinymce/plugins/textpattern';
+  import 'tinymce/plugins/visualblocks';
+  import 'tinymce/plugins/visualchars';
+  import 'tinymce/plugins/wordcount';
 
-// import 'tinymce/plugins/powerpaste';
-// import 'tinymce/plugins/casechange';
-import 'tinymce/plugins/importcss';
-// import 'tinymce/plugins/tinyddrive';
-// import 'tinymce/plugins/advcode';
-// import 'tinymce/plugins/mediaembed';
-import 'tinymce/plugins/toc';
-// import 'tinymce/plugins/checklist';
-// import 'tinymce/plugins/tinycespellchecker';
-// import 'tinymce/plugins/a11ychecker';
-// import 'tinymce/plugins/permanentpen';
-// import 'tinymce/plugins/pageembed';
-// import 'tinymce/plugins/tinycomments';
-// import 'tinymce/plugins/mentions';
-import 'tinymce/plugins/quickbars';
-// import 'tinymce/plugins/linkchecker';
-// import 'tinymce/plugins/advtable';
-// import 'tinymce/plugins/export';
+  import 'tinymce/plugins/image';
+  import 'tinymce/plugins/table';
+  import 'tinymce/plugins/charmap';
+  import 'tinymce/plugins/imagetools';
+  import 'tinymce/plugins/help';
+  import 'tinymce/plugins/emoticons';
+  import 'tinymce/plugins/emoticons/js/emojis';
+  // import 'tinymce/plugins/bdmap';
+  // import 'tinymce/plugins/indent2em';
+  import 'tinymce/plugins/autoresize';
+  // import 'tinymce/plugins/formatpainter';
+  // import 'tinymce/plugins/axupimgs';
 
-import {
-  computed,
-  nextTick,
-  ref,
-  unref,
-  watch,
-  onDeactivated,
-  onBeforeUnmount,
-  PropType,
-  useAttrs,
-} from 'vue';
-import ImgUpload from './ImgUpload.vue';
-import { plugins as defaultPlugins, toolbar as defaultToolbar, toolbar_groups as defaultStyleFormats } from './tinymce';
-import { buildShortUUID } from '@/utils/uuid';
-import { bindHandlers } from './helper';
-import { onMountedOrActivated } from '@vben/hooks';
-import { useDesign } from '@/hooks/web/useDesign';
-import { isNumber } from '@/utils/is';
-import { useLocale } from '@/locales/useLocale';
-import { useAppStore } from '@/store/modules/app';
+  // import 'tinymce/plugins/powerpaste';
+  // import 'tinymce/plugins/casechange';
+  import 'tinymce/plugins/importcss';
+  // import 'tinymce/plugins/tinyddrive';
+  // import 'tinymce/plugins/advcode';
+  // import 'tinymce/plugins/mediaembed';
+  import 'tinymce/plugins/toc';
+  // import 'tinymce/plugins/checklist';
+  // import 'tinymce/plugins/tinycespellchecker';
+  // import 'tinymce/plugins/a11ychecker';
+  // import 'tinymce/plugins/permanentpen';
+  // import 'tinymce/plugins/pageembed';
+  // import 'tinymce/plugins/tinycomments';
+  // import 'tinymce/plugins/mentions';
+  import 'tinymce/plugins/quickbars';
+  // import 'tinymce/plugins/linkchecker';
+  // import 'tinymce/plugins/advtable';
+  // import 'tinymce/plugins/export';
 
-defineOptions({ name: 'Tinymce', inheritAttrs: false });
+  import {
+    computed,
+    nextTick,
+    ref,
+    unref,
+    watch,
+    onDeactivated,
+    onBeforeUnmount,
+    PropType,
+    useAttrs,
+  } from 'vue';
+  import ImgUpload from '@/components/MyUpload/index.vue';
+  import {
+    plugins as defaultPlugins,
+    toolbar as defaultToolbar,
+    toolbar_groups as defaultStyleFormats,
+  } from './tinymce';
+  import { buildShortUUID } from '@/utils/uuid';
+  import { bindHandlers } from './helper';
+  import { onMountedOrActivated } from '@vben/hooks';
+  import { useDesign } from '@/hooks/web/useDesign';
+  import { isNumber } from '@/utils/is';
+  import { useLocale } from '@/locales/useLocale';
+  import { useAppStore } from '@/store/modules/app';
+  const { uploadUrl } = useGlobSetting();
+  // console.log(uploadUrl,'uploadUrl');
 
-const props = defineProps({
-  options: {
-    type: Object as PropType<Partial<RawEditorSettings>>,
-    default: () => ({}),
-  },
-  value: {
-    type: String,
-  },
+  defineOptions({ name: 'Tinymce', inheritAttrs: false });
 
-  toolbar: {
-    type: Array as PropType<string[]>,
-    default: defaultToolbar,
-  },
-  plugins: {
-    type: Array as PropType<string[]>,
-    default: defaultPlugins,
-  },
-  toolbar_groups: {
-    type: Object as PropType<{}>,
-    default: defaultStyleFormats,
-  },
-  modelValue: {
-    type: String,
-  },
-  height: {
-    type: [Number, String] as PropType<string | number>,
-    required: false,
-    default: 400,
-  },
-  width: {
-    type: [Number, String] as PropType<string | number>,
-    required: false,
-    default: 'auto',
-  },
-  showImageUpload: {
-    type: Boolean,
-    default: true,
-  },
-  fontsize: {
-    type: String
-  },
-});
-
-const emit = defineEmits(['change', 'update:modelValue', 'inited', 'init-error']);
-
-const attrs = useAttrs();
-const editorRef = ref<Editor | null>(null);
-const fullscreen = ref(false);
-const tinymceId = ref<string>(buildShortUUID('tiny-vue'));
-const elRef = ref<HTMLElement | null>(null);
-
-const { prefixCls } = useDesign('tinymce-container');
-
-const appStore = useAppStore();
-
-const containerWidth = computed(() => {
-  const width = props.width;
-  if (isNumber(width)) {
-    return `${width}px`;
-  }
-  return width;
-});
-
-const skinName = computed(() => {
-  return appStore.getDarkMode === 'light' ? 'oxide' : 'oxide-dark';
-});
-
-const langName = computed(() => {
-  const lang = useLocale().getLocale.value;
-  return ['zh_CN', ''].includes(lang) ? lang : 'zh_CN';
-});
-
-const initOptions = computed((): RawEditorSettings => {
-  const { height, options, toolbar, plugins, toolbar_groups } = props;
-
-  const publicPath = import.meta.env.VITE_PUBLIC_PATH || '/';
-  return {
-    selector: `#${unref(tinymceId)}`,
-    height,
-    min_height: 450,
-    font_formats: '寰蒋闆呴粦=Microsoft YaHei,Helvetica Neue,PingFang SC,sans-serif;鑻规灉鑻规柟=PingFang SC,Microsoft YaHei,sans-serif;瀹嬩綋=simsun,serif;浠垮畫浣�=FangSong,serif;榛戜綋=SimHei,sans-serif;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Andale Mono=andale mono,times;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Trebuchet MS=trebuchet ms,geneva;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats',
-    fontsize_formats: '10px 11px 12px 14px 16px 18px 24px 36px 48px 48px 56px 72px',
-    image_advtab: true,
-    importcss_append: true, // 鍏佽鏍峰紡鐢熸晥
-    toolbar,
-    toolbar_groups,
-    toolbar_sticky: true, // 绮樻�у伐鍏锋爮锛堟垨鍋滈潬宸ュ叿鏍忥級锛屽湪鍚戜笅婊氬姩缃戦〉鐩村埌涓嶅啀鍙缂栬緫鍣ㄦ椂锛屽皢宸ュ叿鏍忓拰鑿滃崟鍋滈潬鍦ㄥ睆骞曢《閮�
-    toolbar_mode: 'floating', //榛樿wrap涓嶆敹缂╁伐鍏锋爮锛屽彇鍊间负floating鎴杝liding鏃讹紝灏嗙涓�琛屾斁涓嶄笅鐨勫伐鍏锋爮鎸夐挳缂╄繘鎶藉眽锛�3涓偣鐨勫浘鏍囷級閲岋紝scrolling鍒欓噰鐢ㄧЩ鍔ㄧ鐨勬í绾挎粴鍔ㄦ柟寮忋��
-    // style_formats_autohide: true,
-    menubar: false,
-    branding: false,
-    elementpath: false,
-    // quickbars_selection_toolbar: 'bold italic | quicklink h2 h3 blockquote quickimage quicktable',
-    plugins,
-    language_url: publicPath + 'resource/tinymce/langs/' + langName.value + '.js',
-    language: langName.value,
-    default_link_target: '_blank',
-    link_title: false,
-    statusbar: false,
-    object_resizing: false,
-    auto_focus: true, //璁╃紪杈戝櫒鍔犺浇瀹屾垚鍚庤嚜鍔ㄨ幏寰楀厜鏍囩劍鐐�
-    autosave_ask_before_unload: true,
-    autosave_interval: '30s',
-    skin: skinName.value,
-    skin_url: publicPath + 'resource/tinymce/skins/ui/' + skinName.value,
-    content_css: publicPath + 'resource/tinymce/skins/ui/' + skinName.value + '/content.min.css',
-    ...options,
-    setup: (editor: Editor) => {
-      editorRef.value = editor;
-      editor.on('init', (e) => initSetup(e));
+  const props = defineProps({
+    options: {
+      type: Object as PropType<Partial<RawEditorSettings>>,
+      default: () => ({}),
     },
-  };
-});
+    value: {
+      type: String,
+    },
 
-const disabled = computed(() => {
-  const { options } = props;
-  const getdDisabled = options && Reflect.get(options, 'readonly');
-  const editor = unref(editorRef);
-  if (editor) {
-    editor.setMode(getdDisabled ? 'readonly' : 'design');
+    toolbar: {
+      type: Array as PropType<string[]>,
+      default: defaultToolbar,
+    },
+    plugins: {
+      type: Array as PropType<string[]>,
+      default: defaultPlugins,
+    },
+    toolbar_groups: {
+      type: Object as PropType<{}>,
+      default: defaultStyleFormats,
+    },
+    modelValue: {
+      type: String,
+    },
+    height: {
+      type: [Number, String] as PropType<string | number>,
+      required: false,
+      default: 400,
+    },
+    width: {
+      type: [Number, String] as PropType<string | number>,
+      required: false,
+      default: 'auto',
+    },
+    showImageUpload: {
+      type: Boolean,
+      default: true,
+    },
+    fontsize: {
+      type: String,
+    },
+    isElse: {
+      type: Boolean,
+      default: true,
+    },
+    isText: {
+      type: Boolean,
+      default: true,
+    },
+    isImg: {
+      type: Boolean,
+      default: true,
+    },
+  });
+
+  const emit = defineEmits(['change', 'update:modelValue', 'inited', 'init-error']);
+
+  const attrs = useAttrs();
+  const editorRef = ref<Editor | null>(null);
+  const fullscreen = ref(false);
+  const tinymceId = ref<string>(buildShortUUID('tiny-vue'));
+  const elRef = ref<HTMLElement | null>(null);
+
+  const { prefixCls } = useDesign('tinymce-container');
+
+  const appStore = useAppStore();
+
+  const containerWidth = computed(() => {
+    const width = props.width;
+    if (isNumber(width)) {
+      return `${width}px`;
+    }
+    return width;
+  });
+
+  const skinName = computed(() => {
+    return appStore.getDarkMode === 'light' ? 'oxide' : 'oxide-dark';
+  });
+
+  const langName = computed(() => {
+    const lang = useLocale().getLocale.value;
+    return ['zh_CN', ''].includes(lang) ? lang : 'zh_CN';
+  });
+
+  const initOptions = computed((): RawEditorSettings => {
+    const { height, options, toolbar, plugins, toolbar_groups } = props;
+
+    const publicPath = import.meta.env.VITE_PUBLIC_PATH || '/';
+    return {
+      selector: `#${unref(tinymceId)}`,
+      height,
+      min_height: 450,
+      font_formats:
+        '寰蒋闆呴粦=Microsoft YaHei,Helvetica Neue,PingFang SC,sans-serif;鑻规灉鑻规柟=PingFang SC,Microsoft YaHei,sans-serif;瀹嬩綋=simsun,serif;浠垮畫浣�=FangSong,serif;榛戜綋=SimHei,sans-serif;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Andale Mono=andale mono,times;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Trebuchet MS=trebuchet ms,geneva;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats',
+      fontsize_formats: '10px 11px 12px 14px 16px 18px 24px 36px 48px 48px 56px 72px',
+      image_advtab: true,
+      importcss_append: true, // 鍏佽鏍峰紡鐢熸晥
+      toolbar,
+      toolbar_groups,
+      toolbar_sticky: true, // 绮樻�у伐鍏锋爮锛堟垨鍋滈潬宸ュ叿鏍忥級锛屽湪鍚戜笅婊氬姩缃戦〉鐩村埌涓嶅啀鍙缂栬緫鍣ㄦ椂锛屽皢宸ュ叿鏍忓拰鑿滃崟鍋滈潬鍦ㄥ睆骞曢《閮�
+      toolbar_mode: 'floating', //榛樿wrap涓嶆敹缂╁伐鍏锋爮锛屽彇鍊间负floating鎴杝liding鏃讹紝灏嗙涓�琛屾斁涓嶄笅鐨勫伐鍏锋爮鎸夐挳缂╄繘鎶藉眽锛�3涓偣鐨勫浘鏍囷級閲岋紝scrolling鍒欓噰鐢ㄧЩ鍔ㄧ鐨勬í绾挎粴鍔ㄦ柟寮忋��
+      // style_formats_autohide: true,
+      menubar: false,
+      branding: false,
+      elementpath: false,
+      // quickbars_selection_toolbar: 'bold italic | quicklink h2 h3 blockquote quickimage quicktable',
+      plugins,
+      language_url: publicPath + 'resource/tinymce/langs/' + langName.value + '.js',
+      language: langName.value,
+      default_link_target: '_blank',
+      link_title: false,
+      statusbar: false,
+      object_resizing: false,
+      auto_focus: true, //璁╃紪杈戝櫒鍔犺浇瀹屾垚鍚庤嚜鍔ㄨ幏寰楀厜鏍囩劍鐐�
+      autosave_ask_before_unload: true,
+      autosave_interval: '30s',
+      skin: skinName.value,
+      skin_url: publicPath + 'resource/tinymce/skins/ui/' + skinName.value,
+      content_css: publicPath + 'resource/tinymce/skins/ui/' + skinName.value + '/content.min.css',
+      ...options,
+      setup: (editor: Editor) => {
+        editorRef.value = editor;
+        editor.on('init', (e) => initSetup(e));
+      },
+    };
+  });
+
+  const disabled = computed(() => {
+    const { options } = props;
+    const getdDisabled = options && Reflect.get(options, 'readonly');
+    const editor = unref(editorRef);
+    if (editor) {
+      editor.setMode(getdDisabled ? 'readonly' : 'design');
+    }
+    return getdDisabled ?? false;
+  });
+
+  watch(
+    () => attrs.disabled,
+    () => {
+      const editor = unref(editorRef);
+      if (!editor) {
+        return;
+      }
+      editor.setMode(attrs.disabled ? 'readonly' : 'design');
+    },
+  );
+
+  onMountedOrActivated(() => {
+    if (!initOptions.value.inline) {
+      tinymceId.value = buildShortUUID('tiny-vue');
+    }
+    nextTick(() => {
+      setTimeout(() => {
+        initEditor();
+      }, 30);
+    });
+  });
+
+  onBeforeUnmount(() => {
+    destory();
+  });
+
+  onDeactivated(() => {
+    destory();
+  });
+
+  function destory() {
+    if (tinymce !== null) {
+      tinymce?.remove?.(unref(initOptions).selector!);
+    }
   }
-  return getdDisabled ?? false;
-});
 
-watch(
-  () => attrs.disabled,
-  () => {
+  function initEditor() {
+    const el = unref(elRef);
+    if (el) {
+      el.style.visibility = '';
+    }
+    tinymce
+      .init(unref(initOptions))
+      .then((editor) => {
+        emit('inited', editor);
+      })
+      .catch((err) => {
+        emit('init-error', err);
+      });
+  }
+
+  function initSetup(e) {
     const editor = unref(editorRef);
     if (!editor) {
       return;
     }
-    editor.setMode(attrs.disabled ? 'readonly' : 'design');
-  },
-);
+    const value = props.modelValue || '';
 
-onMountedOrActivated(() => {
-  if (!initOptions.value.inline) {
-    tinymceId.value = buildShortUUID('tiny-vue');
+    editor.setContent(value);
+    bindModelHandlers(editor);
+    bindHandlers(e, attrs, unref(editorRef));
   }
-  nextTick(() => {
-    setTimeout(() => {
-      initEditor();
-    }, 30);
-  });
-});
 
-onBeforeUnmount(() => {
-  destory();
-});
-
-onDeactivated(() => {
-  destory();
-});
-
-function destory() {
-  if (tinymce !== null) {
-    tinymce?.remove?.(unref(initOptions).selector!);
+  function setValue(editor: Record<string, any>, val?: string, prevVal?: string) {
+    if (
+      editor &&
+      typeof val === 'string' &&
+      val !== prevVal &&
+      val !== editor.getContent({ format: attrs.outputFormat })
+    ) {
+      editor.setContent(val);
+    }
   }
-}
+  const fileRef = ref();
 
-function initEditor() {
-  const el = unref(elRef);
-  if (el) {
-    el.style.visibility = '';
-  }
-  tinymce
-    .init(unref(initOptions))
-    .then((editor) => {
-      emit('inited', editor);
-    })
-    .catch((err) => {
-      emit('init-error', err);
+  function bindModelHandlers(editor: any) {
+    const modelEvents = attrs.modelEvents ? attrs.modelEvents : null;
+    const normalizedEvents = Array.isArray(modelEvents) ? modelEvents.join(' ') : modelEvents;
+
+    watch(
+      () => props.modelValue,
+      (val, prevVal) => {
+        setValue(editor, val, prevVal);
+      },
+    );
+
+    watch(
+      () => props.value,
+      (val, prevVal) => {
+        setValue(editor, val, prevVal);
+      },
+      {
+        immediate: true,
+      },
+    );
+
+    editor.on(normalizedEvents ? normalizedEvents : 'change keyup undo redo', () => {
+      const content = editor.getContent({ format: attrs.outputFormat });
+      emit('update:modelValue', content);
+      const data = {
+        content,
+        fileUNID: fileListTemp.value,
+      };
+      emit('change', data);
     });
-}
 
-function initSetup(e) {
-  const editor = unref(editorRef);
-  if (!editor) {
-    return;
+    editor.on('FullscreenStateChanged', (e) => {
+      fullscreen.value = e.state;
+    });
   }
-  const value = props.modelValue || '';
 
-  editor.setContent(value);
-  bindModelHandlers(editor);
-  bindHandlers(e, attrs, unref(editorRef));
-}
-
-function setValue(editor: Record<string, any>, val?: string, prevVal?: string) {
-  if (
-    editor &&
-    typeof val === 'string' &&
-    val !== prevVal &&
-    val !== editor.getContent({ format: attrs.outputFormat })
-  ) {
-    editor.setContent(val);
+  function handleImageUploading(name: string) {
+    const editor = unref(editorRef);
+    if (!editor) {
+      return;
+    }
+    editor.execCommand('mceInsertContent', false, getUploadingImgName(name));
+    const content = editor?.getContent() ?? '';
+    setValue(editor, content);
   }
-}
 
-function bindModelHandlers(editor: any) {
-  const modelEvents = attrs.modelEvents ? attrs.modelEvents : null;
-  const normalizedEvents = Array.isArray(modelEvents) ? modelEvents.join(' ') : modelEvents;
-
-  watch(
-    () => props.modelValue,
-    (val, prevVal) => {
-      setValue(editor, val, prevVal);
-    },
-  );
-
-  watch(
-    () => props.value,
-    (val, prevVal) => {
-      setValue(editor, val, prevVal);
-    },
-    {
-      immediate: true,
-    },
-  );
-
-  editor.on(normalizedEvents ? normalizedEvents : 'change keyup undo redo', () => {
-    const content = editor.getContent({ format: attrs.outputFormat });
-    emit('update:modelValue', content);
-    emit('change', content);
-  });
-
-  editor.on('FullscreenStateChanged', (e) => {
-    fullscreen.value = e.state;
-  });
-}
-
-function handleImageUploading(name: string) {
-  const editor = unref(editorRef);
-  if (!editor) {
-    return;
+  function handleDone(name: string, url: string) {
+    const editor = unref(editorRef);
+    if (!editor) {
+      return;
+    }
+    const content = editor?.getContent() ?? '';
+    const val = content?.replace(getUploadingImgName(name), `<img src="${url}"/>`) ?? '';
+    setValue(editor, val);
   }
-  editor.execCommand('mceInsertContent', false, getUploadingImgName(name));
-  const content = editor?.getContent() ?? '';
-  setValue(editor, content);
-}
 
-function handleDone(name: string, url: string) {
-  const editor = unref(editorRef);
-  if (!editor) {
-    return;
+  function getUploadingImgName(name: string) {
+    return `[uploading:${name}]`;
   }
-  const content = editor?.getContent() ?? '';
-  const val = content?.replace(getUploadingImgName(name), `<img src="${url}"/>`) ?? '';
-  setValue(editor, val);
-}
 
-function getUploadingImgName(name: string) {
-  return `[uploading:${name}]`;
-}
+  // 闄勪欢
+  const fileListTemp = ref([]);
+  function fileListChange(data) {
+    fileListTemp.value = data;
+  }
 </script>
-<style lang="less">
-@prefix-cls: ~'@{namespace}-tinymce-container';
+<style lang="less" scope>
+  @prefix-cls: ~'@{namespace}-tinymce-container';
 
-.@{prefix-cls} {
-  position: relative;
-  line-height: normal;
+  .@{prefix-cls} {
+    position: relative;
+    line-height: normal;
 
-  textarea {
-    visibility: hidden;
-    z-index: -1;
+    textarea {
+      visibility: hidden;
+      z-index: -1;
+    }
   }
-}
 
-.tox-statusbar{
-  display: flex;
-  border-bottom-right-radius: 8px;
-  border-bottom-left-radius: 8px;
-  background: #f0f2f5;
-}
+  .my-upload-list {
+    // 杩囨浮
+    position: absolute;
+    left: 78px;
+    transition: all 0.3s;
+  }
 
-.icon-text{
-margin-right: 10px;
-font-size: 14px;
-}
+  .tox-statusbar {
+    display: flex;
+    // position: absolute;
+    min-height: 40px;
+    border-bottom-right-radius: 8px;
+    border-bottom-left-radius: 8px;
+    background: #f0f2f5;
+  }
+
+  .icon-text {
+    margin-right: 10px;
+    font-size: 14px;
+  }
+
+  .ant-upload-list-picture {
+    display: flex;
+    flex-wrap: wrap;
+  }
+
+  .ant-upload-list-picture-card {
+    display: flex;
+    justify-content: space-between;
+    width: 24vw;
+    margin-right: 10px;
+    padding: 5px 10px;
+    background-color: #edf3f9;
+
+    a {
+      padding: 0 5px;
+      font-size: 12px;
+    }
+  }
 </style>

--
Gitblit v1.8.0