From dfd2d0218bbcea93b4bfb0e7ca7ac9b1cc1cc7da Mon Sep 17 00:00:00 2001
From: Ben Lin <maobin001@msn.com>
Date: 星期四, 27 六月 2024 16:08:28 +0800
Subject: [PATCH] 工艺路线树形增加客户编码

---
 src/components/Tinymce/src/Editor.vue |  442 ++++++++++++++++++++++++++-----------------------------
 1 files changed, 209 insertions(+), 233 deletions(-)

diff --git a/src/components/Tinymce/src/Editor.vue b/src/components/Tinymce/src/Editor.vue
index 759b5d5..53a4e82 100644
--- a/src/components/Tinymce/src/Editor.vue
+++ b/src/components/Tinymce/src/Editor.vue
@@ -18,7 +18,7 @@
   </div>
 </template>
 
-<script lang="ts">
+<script lang="ts" setup>
   import type { Editor, RawEditorSettings } from 'tinymce';
   import tinymce from 'tinymce/tinymce';
   import 'tinymce/themes/silver';
@@ -54,7 +54,6 @@
   import 'tinymce/plugins/wordcount';
 
   import {
-    defineComponent,
     computed,
     nextTick,
     ref,
@@ -63,18 +62,21 @@
     onDeactivated,
     onBeforeUnmount,
     PropType,
+    useAttrs,
   } from 'vue';
   import ImgUpload from './ImgUpload.vue';
-  import { toolbar, plugins } from './tinymce';
-  import { buildShortUUID } from '/@/utils/uuid';
+  import { plugins as defaultPlugins, toolbar as defaultToolbar } 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 { useDesign } from '@/hooks/web/useDesign';
+  import { isNumber } from '@/utils/is';
+  import { useLocale } from '@/locales/useLocale';
+  import { useAppStore } from '@/store/modules/app';
 
-  const tinymceProps = {
+  defineOptions({ name: 'Tinymce', inheritAttrs: false });
+
+  const props = defineProps({
     options: {
       type: Object as PropType<Partial<RawEditorSettings>>,
       default: () => ({}),
@@ -85,11 +87,11 @@
 
     toolbar: {
       type: Array as PropType<string[]>,
-      default: toolbar,
+      default: defaultToolbar,
     },
     plugins: {
       type: Array as PropType<string[]>,
-      default: plugins,
+      default: defaultPlugins,
     },
     modelValue: {
       type: String,
@@ -108,230 +110,204 @@
       type: Boolean,
       default: true,
     },
-  };
-
-  export default defineComponent({
-    name: 'Tinymce',
-    components: { ImgUpload },
-    inheritAttrs: false,
-    props: tinymceProps,
-    emits: ['change', 'update:modelValue', 'inited', 'init-error'],
-    setup(props, { emit, attrs }) {
-      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 tinymceContent = computed(() => props.modelValue);
-
-      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', 'en'].includes(lang) ? lang : 'zh_CN';
-      });
-
-      const initOptions = computed((): RawEditorSettings => {
-        const { height, options, toolbar, plugins } = props;
-        const publicPath = import.meta.env.VITE_PUBLIC_PATH || '/';
-        return {
-          selector: `#${unref(tinymceId)}`,
-          height,
-          toolbar,
-          menubar: 'file edit insert view format table',
-          plugins,
-          language_url: publicPath + 'resource/tinymce/langs/' + langName.value + '.js',
-          language: langName.value,
-          branding: false,
-          default_link_target: '_blank',
-          link_title: false,
-          object_resizing: false,
-          auto_focus: true,
-          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!);
-        }
-      }
-
-      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;
-        }
-        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 bindModelHandlers(editor: any) {
-        const modelEvents = attrs.modelEvents ? attrs.modelEvents : null;
-        const normalizedEvents = Array.isArray(modelEvents) ? modelEvents.join(' ') : modelEvents;
-
-        watch(
-          () => props.modelValue,
-          (val: string, prevVal: string) => {
-            setValue(editor, val, prevVal);
-          },
-        );
-
-        watch(
-          () => props.value,
-          (val: string, prevVal: string) => {
-            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;
-        }
-        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;
-        }
-        const content = editor?.getContent() ?? '';
-        const val = content?.replace(getUploadingImgName(name), `<img src="${url}"/>`) ?? '';
-        setValue(editor, val);
-      }
-
-      function getUploadingImgName(name: string) {
-        return `[uploading:${name}]`;
-      }
-
-      return {
-        prefixCls,
-        containerWidth,
-        initOptions,
-        tinymceContent,
-        elRef,
-        tinymceId,
-        handleImageUploading,
-        handleDone,
-        editorRef,
-        fullscreen,
-        disabled,
-      };
-    },
   });
+
+  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', 'en'].includes(lang) ? lang : 'zh_CN';
+  });
+
+  const initOptions = computed((): RawEditorSettings => {
+    const { height, options, toolbar, plugins } = props;
+    const publicPath = import.meta.env.VITE_PUBLIC_PATH || '/';
+    return {
+      selector: `#${unref(tinymceId)}`,
+      height,
+      toolbar,
+      menubar: 'file edit insert view format table',
+      plugins,
+      language_url: publicPath + 'resource/tinymce/langs/' + langName.value + '.js',
+      language: langName.value,
+      branding: false,
+      default_link_target: '_blank',
+      link_title: false,
+      object_resizing: false,
+      auto_focus: true,
+      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!);
+    }
+  }
+
+  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;
+    }
+    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 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;
+    }
+    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;
+    }
+    const content = editor?.getContent() ?? '';
+    const val = content?.replace(getUploadingImgName(name), `<img src="${url}"/>`) ?? '';
+    setValue(editor, val);
+  }
+
+  function getUploadingImgName(name: string) {
+    return `[uploading:${name}]`;
+  }
 </script>
-
-<style lang="less" scoped></style>
-
 <style lang="less">
   @prefix-cls: ~'@{namespace}-tinymce-container';
 

--
Gitblit v1.9.3