vue-admin-core
Version:
A Component Library for Vue 3
1 lines • 15.4 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","sources":["../../../../../../package/components/msg-editor/src/index.tsx"],"sourcesContent":["import { computed, defineComponent, h, onMounted, ref, shallowRef, watchEffect } from \"vue\";\nimport type { PropType, Ref } from \"vue\";\nimport { coreCreateEditor } from \"@wangeditor/core\";\nimport type { IDomEditor } from \"@wangeditor/core\";\nimport { CHANGE_EVENT, UPDATE_MODEL_EVENT } from \"element-plus\";\nimport plugin from \"./plugin\";\nimport paragraphPlugin from \"./paragraph/plugin\";\nimport Popper from \"./Popper\";\nimport { getPrefixCls } from \"@vue-admin-core/utils/const\";\nimport emitter from \"./mitt\";\nimport { nodeToText, textToHtml, textToNode } from \"./utils\";\nimport { isEmpty } from \"lodash-es\";\nimport { onClickOutside } from \"@vueuse/core\";\n\nconst prefixCls = getPrefixCls(\"msg-editor\");\n\nexport default defineComponent({\n name: \"VacMsgEditor\",\n props: {\n /**\n * 编辑器内容\n */\n modelValue: {\n type: String,\n default: \"\"\n },\n /**\n * 变量下拉选项数据\n */\n options: {\n type: Array as PropType<{ label: string; value: string }[]>,\n default: () => []\n },\n /**\n * 占位符\n */\n placeholder: {\n type: String\n },\n /** 是否禁用 */\n disabled: {\n type: Boolean\n },\n readOnly: {\n type: Boolean\n },\n /**\n * 变量前缀\n */\n prefix: {\n type: String,\n default: \"\\\\$\\\\{\"\n },\n /**\n * 变量后缀\n */\n suffix: {\n type: String,\n default: \"\\\\}\"\n }\n },\n emits: [\n CHANGE_EVENT,\n UPDATE_MODEL_EVENT,\n /**\n * 创建完成事件\n * @params editor\n */\n \"created\",\n /**\n * 销毁事件\n * @params editor\n */\n \"destroyed\",\n \"maxLength\",\n /**\n * 获取焦点\n * @params editor\n */\n \"focus\",\n /**\n * 失去焦点\n * @params editor\n */\n \"blur\",\n \"customAlert\",\n /**\n * 自定义粘贴\n * @params editor, event\n * @return res\n */\n \"customPaste\"\n ],\n setup(props, context) {\n const selector = ref();\n const visible = ref(false);\n const editorRef = shallowRef<null | IDomEditor>(null); // editor 实例,必须用 shallowRef\n const curValue = ref(\"\"); // 记录 editor 当前 html 内容\n const position = ref();\n const editor = ref();\n const popper = ref<{ setValue: (item: any) => void; target: Ref<HTMLDivElement> }>();\n const selectValue = ref();\n let isCreated = false;\n\n const optionMap = computed(() =>\n props.options.reduce((acc, item) => ({ ...acc, [item.value]: item }), {})\n );\n\n const initEditor = () => {\n if (!selector.value) return;\n editor.value = coreCreateEditor({\n selector: selector.value,\n config: {\n placeholder: props.placeholder,\n readOnly: props.disabled || props.readOnly,\n onCreated(editor) {\n editorRef.value = editor; // 记录 editor 实例\n setTimeout(() => (isCreated = true));\n },\n onChange(editor) {\n const editorHtml = editor.getHtml();\n curValue.value = editorHtml; // 记录当前内容\n if (isCreated) {\n context.emit(\n \"update:modelValue\",\n nodeToText(editor.children, { prefix: props.prefix, suffix: props.suffix })\n ); // 触发 v-model 值变化\n context.emit(\n \"change\",\n nodeToText(editor.children, { prefix: props.prefix, suffix: props.suffix }),\n editor\n );\n }\n },\n onDestroyed(editor) {\n context.emit(\"destroyed\", editor);\n },\n onMaxLength(editor) {\n context.emit(\"maxLength\", editor);\n },\n onFocus(editor) {\n context.emit(\"focus\", editor);\n },\n onBlur(editor) {\n // emitter.emit(\"hide\", editor);\n context.emit(\"blur\", editor);\n },\n customAlert(info, type) {\n context.emit(\"customAlert\", info, type);\n },\n customPaste: (editor, event): any => {\n const clipboardData = event.clipboardData;\n const pastedText = clipboardData?.getData(\"text\");\n editor.insertNode(\n textToNode(\n { prefix: props.prefix, suffix: props.suffix },\n pastedText,\n optionMap.value\n ) as any\n );\n return false;\n }\n },\n html: textToHtml(props.modelValue, optionMap.value, {\n prefix: props.prefix,\n suffix: props.suffix\n }), //curValue.value,\n plugins: [paragraphPlugin, plugin]\n });\n emitter.on(\"show\", ({ value, ..._position }) => {\n position.value = _position;\n visible.value = true;\n selectValue.value = value;\n // @ts-ignore\n if (value) popper.value?.setValue(optionMap.value[value]);\n });\n emitter.on(\"hide\", () => {\n visible.value = false;\n });\n onClickOutside(selector.value, (event) => {\n if (!popper.value?.target.value?.contains(event.target as HTMLElement)) {\n visible.value = false;\n }\n });\n };\n\n watchEffect(() => {\n if (!editor.value) return;\n if (props.disabled || props.readOnly) {\n emitter.emit(\"hide\", editor.value);\n editor.value.disable();\n } else {\n editor.value.enable();\n }\n });\n\n /**\n * 设置 HTML\n * @param newHtml new html\n */\n function setHtml(newHtml: string) {\n const editor = editorRef.value;\n if (editor == null) return;\n editor.setHtml(newHtml);\n }\n\n /**\n * 元素挂在后初始化编辑器\n */\n onMounted(() => {\n initEditor();\n });\n\n /**\n * 监听 v-model 值变化\n */\n watchEffect(() => {\n if (isEmpty(optionMap.value)) return;\n const _val = textToHtml(props.modelValue, optionMap.value, {\n prefix: props.prefix,\n suffix: props.suffix\n });\n if (_val === curValue.value) return; // 和当前内容一样,则忽略\n // 重新设置 HTML\n setHtml(_val);\n });\n return () =>\n h(\n \"div\",\n {\n ...context.attrs,\n class: [prefixCls, \"el-textarea\", context.attrs.class]\n },\n {\n default: () => [\n h(\"div\", {\n ref: selector,\n class: [`${prefixCls}__content`, { \"is-disabled\": props.disabled }],\n onKeydown: (e: KeyboardEvent) => {\n if (e.key === \"ArrowDown\" || e.key === \"ArrowUp\" || e.key === \"Enter\") {\n if (visible.value) {\n e.preventDefault();\n emitter.emit(e.key, e);\n }\n }\n }\n }),\n h(Popper, {\n ref: popper,\n class: `${prefixCls}__popper`,\n visible: visible.value,\n position: position,\n editor: editor.value,\n value: selectValue.value,\n options: props.options\n })\n ]\n }\n );\n }\n});\n"],"names":["prefixCls","getPrefixCls","defineComponent","name","props","modelValue","type","String","default","options","Array","placeholder","disabled","Boolean","readOnly","prefix","suffix","emits","CHANGE_EVENT","UPDATE_MODEL_EVENT","setup","context","selector","ref","visible","editorRef","shallowRef","curValue","position","editor","popper","selectValue","isCreated","optionMap","computed","reduce","acc","item","value","initEditor","coreCreateEditor","config","onCreated","setTimeout","onChange","editorHtml","getHtml","emit","nodeToText","children","onDestroyed","onMaxLength","onFocus","onBlur","customAlert","info","customPaste","event","clipboardData","pastedText","getData","insertNode","textToNode","html","textToHtml","plugins","paragraphPlugin","plugin","emitter","on","_position","setValue","onClickOutside","target","contains","watchEffect","disable","enable","setHtml","newHtml","onMounted","isEmpty","_val","h","attrs","class","onKeydown","e","key","preventDefault","Popper"],"mappings":"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"}