import { useEditor } from "@/modules/editor"; import { css } from "@linaria/core"; import { nextTick } from "process"; import { defineComponent, onMounted, onUnmounted, reactive, ref } from "vue"; import { string } from "vue-types"; import { useCompData } from "."; import { View } from "../View"; import HeadlessEditor from "./EditorCustom"; export const Component = defineComponent({ props: { compId: string().def(""), }, setup(props) { const comp = useCompData(props.compId); const { store, actions, controls } = useEditor(); const state = reactive({ editableId: "", }); if (store.isEditMode) { actions.on("textFocus", function (compId, focus) { if (compId != props.compId) return; if (focus) { state.editableId = "" + Date.now(); return; } state.editableId = ""; }); } return () => ( { if (store.isEditMode) { state.editableId = "" + Date.now(); } }} > {state.editableId ? ( { state.editableId = ""; controls.textEditorCtrl.setCurrEditor(null); }} /> ) : (
)} ); }, }); const EditorComp = defineComponent({ props: { compId: string().isRequired, }, emits: ["lost"], setup(props, { emit }) { let editorRefVal = ref().value; let editorDomRef=ref() const comp = useCompData(props.compId); const { store, actions, helper, controls } = useEditor(); let blurCanceler: any = null; onUnmounted(() => { blurCanceler?.(); }); const preHeight = ref(0); const initHeight = () => { const dom: HTMLElement | null = document.querySelector( `#editor_${props.compId}` ); if (!dom) { return false; } const h = helper.pxToDesignSize(dom.clientHeight); const isChange = Math.abs(preHeight.value - h) > 1; preHeight.value = h; actions.updateCompData(comp, "layout.size.1", preHeight.value); helper.extendStreamCard(store.currStreamCardId); if (isChange) { actions.selectObjs([]); setTimeout(() => { actions.selectObjs([props.compId]); }, 0); } }; function isInCkBodyWrapper(dom: HTMLElement) { const out = { in: false, stop: true }; if (editorRefVal) { const in1 = editorRefVal.ui.view.toolbar.element?.contains(dom) || editorRefVal.ui.view.editable.element?.contains(dom); if (in1) { out.in = true; return out; } const ckBodyWrapper = document.querySelector(".ck-body-wrapper"); if (ckBodyWrapper === dom || ckBodyWrapper?.contains(dom)) { out.in = true; return out; } } let n = 0; let curr: any = dom; do { if ( curr.id == "text_toolform" || curr.id == "toolbar" || curr.classList.contains("editor_text_color") || curr.classList.contains("ant-modal-input") || curr.classList.contains("ant-select-dropdown") ) { out.in = true; out.stop = false; return out; } curr = curr.parentElement; n += 1; if (n > 10) break; } while (curr); return out; } function blurHandle() { function blur(e: MouseEvent) { const target = e.target as HTMLElement; if (!editorRefVal) return; const test = isInCkBodyWrapper(target); if (test.in) { if (test.stop) { e.stopPropagation(); } return; } actions.submitUpdate(); emit("lost"); } document.addEventListener("mousedown", blur, { capture: true, }); return () => { document.removeEventListener("mousedown", blur, { capture: true }); }; } const initEditor = async () => { // const dom: HTMLElement | null = document.querySelector( // `#editor_${props.compId}` // ); if (!editorDomRef.value) { return; } editorRefVal = await HeadlessEditor.create(editorDomRef.value); editorRefVal.setData(comp.value); editorRefVal.focus(); const range = document.createRange(); range.selectNodeContents(editorDomRef.value); const selection = window.getSelection(); selection?.removeAllRanges(); selection?.addRange(range); editorRefVal.model.document.on("change:data", () => { const value = editorRefVal?.getData(); if (comp.value !== value) { actions.updateCompData(comp, "value", value); nextTick(() => { const element = editorRefVal?.ui.view.editable.element || null; if (!element) { return; } const h = helper.pxToDesignSize(element.clientHeight); const isChange = Math.abs(preHeight.value - h) > 1; preHeight.value = h; actions.updateCompData(comp, "layout.size.1", preHeight.value); helper.extendStreamCard(store.currStreamCardId); if (isChange) { actions.selectObjs([]); setTimeout(() => { actions.selectObjs([props.compId]); }, 0); } }); } }); controls.textEditorCtrl.setCurrEditor(editorRefVal); }; onMounted(() => { initEditor(); blurCanceler = blurHandle(); nextTick(() => { initHeight(); }); }); return () => { return
; }; }, }); const textStyle = css` font-size: 14px; width: 100%; color: #666; word-break: break-all; p { margin: 0; } .ck.ck-editor__editable_inline { cursor: text; overflow: hidden; border: none !important; > :last-child, > :first-child { margin-top: 0; margin-bottom: 0; } padding: 0 !important; } `;