postdischarge-ui/src/views/system/components/wangEditor.vue
2024-06-13 15:40:05 +08:00

936 lines
48 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div style="border: 1px solid #ccc">
<Toolbar
style="border-bottom: 1px solid #ccc"
:editor="editor"
:defaultConfig="toolbarConfig"
:mode="mode"
/>
<!-- 研究一下 如何清除这个富文本里的东西 我给加了标签不生效 他富文本自动编译class名字了 你百度一下 我搞杯咖啡区 困不行了好的 -->
<Editor
style="height: 500px; overflow-y: hidden"
v-model="html"
:defaultConfig="editorConfig"
:mode="mode"
@onChange="onChange"
@onCreated="onCreated"
@onFocus="handleFocus"
/>
<el-dialog
title="添加画像标签字段"
:visible.sync="labelshow"
width="40%"
:before-close="beforeClose"
>
<el-cascader-panel
:key="isResouceShow"
:options="labeloptions"
@change="panelchange"
v-if="labelshow"
:props="{
value: 'labelFieldId',
label: 'fieldName',
children: 'labelFieldContentList',
}"
></el-cascader-panel>
<div>
<div style="margin: 20px 0">结果预览:</div>
<el-input
type="textarea"
v-model="addnode.fileSpan"
disabled
></el-input>
</div>
<div slot="footer" class="dialog-footer">
<el-button @click="labelclick" type="primary">确定</el-button>
</div>
</el-dialog>
<el-dialog
title="添加知识库字段"
:visible.sync="fieldshow"
width="50%"
:before-close="beforeClose"
class="category-cascader-panel"
>
<!-- 在这里 -->
<el-cascader-panel
:options="fieldoptions"
@change="handleChange($event)"
:props="{
value: 'termCode',
label: 'termContent',
children: 'children',
checkStrictly: true,
multiple: true,
emitPath: false,
}"
ref="cascaderAddr"
>
<!-- dengyixia 看一下api -->
<!-- :props="{ checkStrictly: true, multiple: true, emitPath: false } -->
</el-cascader-panel>
<div style="margin: 20px 0">结果预览:</div>
<div style="width: 80%;height: 100%; border: 2px solid #ECEFF7 ;">
<div v-for="(item, index) of add" :key="index" >
<!-- <input type="text"> -->
<div >{{ item }}</div>
<!-- <el-input
type="textarea"
v-model="item[0]"
disabled
></el-input> -->
</div>
</div>
<div slot="footer" class="dialog-footer">
<el-button @click="fieldclick" type="primary">确定</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import {
DomEditor,
IDomEditor,
SlateElement,
SlateDescendant,
SlateTransforms,
SlateEditor,
SlateNode,
} from "@wangeditor/editor";
import { Editor, Toolbar } from "@wangeditor/editor-for-vue";
import { Boot } from "@wangeditor/editor";
import { h, VNode } from "snabbdom";
import {
labelFieldList,
richTextPictureUrl,
bankLevel,
} from "@/api/system/wangEditor.js";
// import menuConf from "./ModalMenu";
import { getToken } from "@/utils/auth";
var that;
export default {
props: ["nodeContent"],
components: { Editor, Toolbar },
name: "wangEditor",
data() {
return {
isResouceShow: 1,
searchForm: {},
labeloptions: [],
value: [],
flattenData: [],
placeholder: "请选择",
size: "medium",
disabled: false,
classes: "",
fieldoptions: [],
labelshow: false,
fieldshow: false,
editor: null,
menukeys: null,
toolbarConfig: {
insertKeys: {
index: 61,
keys: ["MyButtonMenu", "MyButtonMenutwo"],
},
excludeKeys: [
"fullScreen",
"insertLink",
"codeBlock",
"todo",
"insertVideo",
"insertImage",
"emotion",
"divider",
"insertTable",
],
},
editorConfig: {
placeholder: "请输入内容...",
MENU_CONF: {
uploadImage: {
server: process.env.VUE_APP_BASE_API + "/common/richTextPictureUrl",
headers: {
Authorization: "Bearer " + getToken(),
},
fieldName: "file", // 这里有个坑,如果返回的响应结果是没有上传文件,跟这里关系很大
customInsert(res, insertFn) {
if (res.code == 200) {
insertFn(res.url, null, null);
}
},
},
uploadVideo: {
//上传视频配置
customUpload: this.handleUpload,
},
},
},
mode: "default", // or 'simple'
timer: "",
html: `<p></p>`,
addnode: {
fileName: "",
fileSpan: "",
fieldMark: "",
},
add: [],
modify: false,
list: [],
elist: [],
termContent: "",
};
},
methods: {
// 我拿什么能知道当前选中的是不是最后一级 没有children就管吧 e里面拿不到哦哦
handleChange(e) {
console.log(e, "e");
this.add = [];
console.log(
this.$refs.cascaderAddr.getCheckedNodes(),
"---------------------"
);
this.$refs.cascaderAddr.getCheckedNodes().map((e) => {
console.log(e, "55555555555");
if(e.children.length == 0){
this.add.push(e.label);
}
// console.log(this.add, "777");
});
// // console.log(this.$refs["cascaderAddr"],'this.$refs["cascaderAddr"]')
// // const arr = this.$refs["cascaderAddr"].children.getCheckedNodes().termContent;
// // console.log(arr,'arr')
// this.elist.push(e);
// console.log(this.elist, "this.elist");
// if (this.fieldshow) {
// this.fieldoptions.forEach((e) => {
// // 第一层
// e.children.forEach((el) => {
// // 第二层
// el.children.forEach((f) => {
// // 第三层
// this.elist.forEach((m) => {
// // 选择的数组code
// // console.log(m, "m");
// m.forEach((r) => {
// // 最新选择的值
// if (r == f.termCode) {
// // if (this.add.indexOf(f.termContent)==-1) {
// // console.log("不存在")
// this.add=[]
// // console.log(arr, "arr")
// this.add.push(f.termContent);
// console.log(this.add, "add")
// // }
// }
// });
// });
// // console.log(f,'fffff')
// // console.log(this.add, "this.add");
// });
// });
// });
// }
// console.log(this.termContent, "this.termContent");
// el.children.forEach(f=>{
// console.log(f,'ff')
// let list=[]
// list.push(el)
// this.addnode
// console.log(list,'list')
// list = list.split(',')
// 将id相匹配的筛选出来
// const list = [{id: 1, name:2}, {id: 2, name:2}]
// const result = [1,2]
// let abbc=[]
// abbc=list.filter(item =>elist.includes(item.termCode))
// console.log(abbc,'abbc')
//这里的val.newData就是你帅选出的数据,如果你不想将他放到B数组当中,可以自己定义一个变量接收
// val.newData = A.filter(item => elist.includes(item.AId.toString()))
// let differentArr = list.filter((item) => elist.indexOf(item) != -1);
// console.log(differentArr, "differentArr");
// })
// if (el.labelFieldId == item) {
// this.addnode.fileSpan = el.fieldName;
// this.addnode.fileName = e.fieldName;
// this.addnode.fieldMark = el.fieldMark;
// }
// });
// });
// }
// let changeFlag = false;
// let nowItem = [];
// let firstItem = [];
// if (this.shareScopeEnd.length == 0) {
// this.searchForm.customerTags = val;
// } else {
// // 与原数组比对
// this.searchForm.customerTags.forEach((item) => {
// if (item[0] !== this.shareScopeEnd[0][0]) {
// // 一级标签不同
// changeFlag = true;
// firstItem.push(item);
// } else if (item[1] != this.shareScopeEnd[0][1]) {
// // 一级标签相同但是二级标签不同
// changeFlag = false;
// nowItem.push(item);
// }
// });
// }
// if (changeFlag && firstItem.length) {
// this.searchForm.customerTags = firstItem;
// } else if (!changeFlag && nowItem.length) {
// this.searchForm.customerTags = nowItem;
// }
// this.shareScopeEnd = this.searchForm.customerTags;
},
async handleUpload(file, insertFn) {
let form = new FormData();
form.append("file", file);
let res = await this.uploadFile(form); //此方法返回上传后的id
console.log(res);
const videoUrl = URL.createObjectURL(file);
// this.content += '<video poster=\"\" controls=\"true\" width=\"auto\" height=\"auto\"><source src=\"'+ res +'\" type=\"video/mp4\"/></video>'
// 这快需要注意一下我这res返回这快应该是后端返回一个预览服务的url才能直接在富文本以及后续展示的地方展示这个视频
this.html +=
'<video poster="" controls="true" width="auto" height="auto"><source src="' +
process.env.VUE_APP_BASE_API +
+
'" type="video/mp4"/></video>';
// 如果没有预览服务可以让后端写一下下载接口,然后在这里直接拼,但是这个接口前缀最好使用项目中接口配置的前缀
},
async uploadFile(form) {
let res = await richTextPictureUrl(form); //此处换为自己的上传接口地址
console.log(res);
return res;
},
emit() {
this.$emit("on-nodeContent", { nodeContent: this.html });
},
panelchange(item) {
console.log(item, "item");
if (this.labelshow) {
this.labeloptions.forEach((e) => {
e.labelFieldContentList.forEach((el) => {
if (el.labelFieldId == item[1]) {
this.addnode.fileSpan = el.fieldName;
this.addnode.fileName = e.fieldName;
this.addnode.fieldMark = el.fieldMark;
}
});
});
}
},
labelclick() {
this.labelshow = false;
setTimeout(() => {
this.editor.focus();
}, 30);
setTimeout(() => {
if (this.modify) {
this.modify = false;
this.editor.deleteBackward();
}
const resume = {
// JS 语法
type: "attachment",
link: "",
fileName: this.addnode.fileName,
fileSpan: this.addnode.fileSpan,
fieldMark: this.addnode.fieldMark,
children: [{ text: "" }], // void 元素必须有一个 children ,其中只有一个空字符串,重要!!!
};
this.editor.insertNode(resume);
this.addnode = {
fileName: "",
fileSpan: "",
fieldMark: "",
};
this.editor.focus();
}, 100);
},
fieldclick() {
// 先判断 富文本里有没有这个名字叫divBox的标签 有的话用原生js给他删掉 然后继续走下面的+=
// 如果富文本里面没有这个元素 就直接走+= divBox唯一标识符 这个能明白吗 这样就第二次选择的时候 会覆盖第一次选择的
var aaa = document.querySelectorAll('.divBox')
console.log(this.html,'this.html--before');
console.log(aaa,'打印dom')
if(aaa.length!=0){
console.log(this.html,'this.html111');
aaa.remove()
}else{
aaa.innerHTML = ''
this.html += `<p class="divBox">${this.add}</p>`
console.log(this.html,'this.html2222');
}
this.fieldshow = false;
setTimeout(() => {
this.editor.focus();
}, 30);
setTimeout(() => {
if (this.modify) {
this.modify = false;
this.editor.deleteBackward();
}
const resume = {
// JS 语法
type: "attachmenttwo",
link: "",
add: this.add,
// fileName: this.add.forEach((e) => e),
// fileSpan: this.addnode.fileSpan,
// fieldMark: this.addnode.fieldMark,
// children: [{ text: "" }], // void 元素必须有一个 children ,其中只有一个空字符串,重要!!!
};
this.editor.insertNode(resume);
console.log(this.html, "add是是是是是是所所所所所所");
// this.addnode = {
// fileName: "",
// fieldMark: "",
// fileSpan: "",
// };
this.add=[]
// this.editor.focus();
++this.isResouceShow;
}, 100);
},
onCreated(editor) {
this.editor = Object.seal(editor);
},
onChange(editor) {
// console.log("onChange", editor.getHtml()); // onChange 时获取编辑器最新内容
},
handleFocus(editor) {
// console.log("focus", editor);
},
info() {
labelFieldList("PORTRAIT_LABEL_FIELD").then((res) => {
res.data.data.forEach((e) => {
e.labelFieldContentList.forEach((el) => {
el.labelFieldId = el.labelFieldContentId;
el.fieldName = el.contentName;
});
});
this.labeloptions = res.data.data;
});
bankLevel("3").then((res) => {
console.log(res,'打印res值')
// res.forEach((e) => {
// e.children.forEach((el) => {
// el.children.forEach((f) => {
// this.fieldoptions.push(f);
// console.log(f, "fffffffff");
// f.termCode = f.termCode;
// f.termContent = f.termContent;
// });
// });
// });
this.fieldoptions = res;
console.log(this.fieldoptions ,'***')
});
},
beforeClose() {
++this.isResouceShow;
this.modify = false;
this.fieldshow = false;
this.labelshow = false;
},
},
watch: {
nodeContent(newValue, oldValue) {
console.log(newValue, oldValue);
this.html = newValue;
},
},
mounted() {
this.html = this.nodeContent;
},
beforeDestroy() {
const editor = this.editor;
if (editor == null) return;
editor.destroy(); // 组件销毁时,及时销毁编辑器
},
created() {
that = this;
this.info();
},
};
class MyButtonMenu {
// JS 语法
constructor(vueInstance) {
this.vueInstance = vueInstance;
this.title = "添加画像标签字段";
this.iconSvg =
'<svg t="1711951668796" class="icon" viewBox="0 0 1119 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4490" xmlns:xlink="http://www.w3.org/1999/xlink" width="218.5546875" height="200"><path d="M25.415082 562.922053a25.1989 25.1989 0 0 1-17.745705-43.299519L542.347456 7.392772A25.110172 25.110172 0 1 1 577.040308 43.682738L42.894601 555.9125a25.110172 25.110172 0 0 1-17.479519 7.009553z" p-id="4491"></path><path d="M1094.061411 562.922053a25.110172 25.110172 0 0 1-17.745704-7.009553L542.347456 43.682738A25.110172 25.110172 0 1 1 577.040308 7.392772l534.323165 512.229762a25.1989 25.1989 0 0 1-17.745704 43.299519zM559.738247 1023.955458a380.467906 380.467906 0 0 1-380.024264-380.112992 25.1989 25.1989 0 0 1 50.309073 0 330.070105 330.070105 0 0 0 329.715191 329.80392 25.1989 25.1989 0 1 1 0 50.309072z" p-id="4492"></path><path d="M1009.769315 799.472295H618.3878a25.1989 25.1989 0 0 1 0-50.309072h391.381515a25.1989 25.1989 0 0 1 0 50.309072z" fill="#231815" p-id="4493"></path><path d="M814.122922 996.005974a25.1989 25.1989 0 0 1-25.198901-25.198901V579.869201a25.1989 25.1989 0 1 1 50.309073 0v390.937872a25.1989 25.1989 0 0 1-25.110172 25.198901z" fill="#231815" p-id="4494"></path></svg>';
this.tag = "button";
this.showModal = true;
}
// 菜单是否需要激活(如选中加粗文本,“加粗”菜单会激活),用不到则返回 false
isActive(editor) {
return false;
}
// 获取菜单执行时的 value ,用不到则返回空 字符串或 false
getValue(editor) {
return "";
}
// 菜单是否需要禁用(如选中 H1 ,“引用”菜单被禁用),用不到则返回 false
isDisabled(editor) {
return false;
}
// 点击菜单时触发的函数
exec(editor, value) {
this.vueInstance.labelshow = true;
}
}
class MyButtonMenutwo {
// JS 语法
constructor(vueInstance) {
this.vueInstance = vueInstance;
this.title = "添加知识库字段";
this.iconSvg =
'<svg t="1711422779479" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2507" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M831.6 639.6h-63.9v127.9H639.9v63.9h127.8v127.9h63.9V831.4h127.9v-63.9H831.6z" p-id="2508"></path><path d="M564.3 925.2c0-18.5-15-33.6-33.6-33.6H287.3c-86.2 0-156.4-70.2-156.4-156.4V286.9c0-86.2 70.1-156.4 156.4-156.4h448.4c86.2 0 156.4 70.2 156.4 156.4v238.8c0 18.5 15 33.6 33.6 33.6s33.6-15 33.6-33.6V286.9C959.2 163.6 859 63.3 735.7 63.3H287.3C164 63.3 63.7 163.6 63.7 286.8v448.3c0 123.2 100.3 223.5 223.6 223.5h243.4c18.6 0.1 33.6-14.9 33.6-33.4z" p-id="2509"></path></svg>';
this.tag = "button";
this.showModal = true;
}
// 菜单是否需要激活(如选中加粗文本,“加粗”菜单会激活),用不到则返回 false
isActive(editor) {
return false;
}
// 获取菜单执行时的 value ,用不到则返回空 字符串或 false
getValue(editor) {
return "";
}
// 菜单是否需要禁用(如选中 H1 ,“引用”菜单被禁用),用不到则返回 false
isDisabled(editor) {
return false;
}
// 点击菜单时触发的函数
exec(editor, value) {
this.vueInstance.fieldshow = true;
}
}
const menuConf = {
key: "MyButtonMenu", // 定义 menu key :要保证唯一、不重复(重要)
factory() {
return new MyButtonMenu(that);
},
};
const menuConftwo = {
key: "MyButtonMenutwo", // 定义 menu key :要保证唯一、不重复(重要)
factory() {
return new MyButtonMenutwo(that);
},
};
const module = {
// JS 语法
menus: [menuConf, menuConftwo],
// 其他功能,下文讲解...
};
Boot.registerModule(module);
function withAttachment(editor) {
// JS 语法
const { isInline, isVoid } = editor;
const newEditor = editor;
newEditor.isInline = (elem) => {
const type = DomEditor.getNodeType(elem);
if (type === "attachment") return true; // 针对 type: attachment ,设置为 inline
if (type === "attachmenttwo") return true; // 针对 type: attachment ,设置为 inline
return isInline(elem);
};
newEditor.isVoid = (elem) => {
const type = DomEditor.getNodeType(elem);
if (type === "attachment") return true; // 针对 type: attachment ,设置为 void
if (type === "attachmenttwo") return true; // 针对 type: attachment ,设置为 void
return isVoid(elem);
};
return newEditor; // 返回 newEditor ,重要!!!
}
Boot.registerPlugin(withAttachment);
function renderAttachment(elem, children, editor) {
// JS 语法
// 获取“附件”的数据,参考上文 myResume 数据结构
const { fileName = "", link = "", fileSpan = "", fieldMark = "" } = elem;
// 附件 icon 图标 vnode
const iconVnode = h(
// HTML tag
"span",
// HTML 属性
{
props: {}, // HTML 属性,驼峰式写法
style: {
width: "16px",
height: "16px",
margin: "0 0 0 6px",
display: "inline-block",
transform: "translateY(20%)",
backgroundSize: "100% 100%",
backgroundImage:
"url(data:image/png;base64,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)" /* 其他... */,
}, // HTML style ,驼峰式写法
on: {
click() {
editor.deleteBackward();
} /* 其他... */,
},
}
// img 没有子节点,所以第三个参数不用写
);
const nameiconVnode = h(
// HTML tag
"span",
// HTML 属性
{
props: {}, // HTML 属性,驼峰式写法
style: {
width: "16px",
height: "16px",
margin: "0 0 0 6px",
display: "inline-block",
transform: "translateY(20%)",
backgroundSize: "100% 100%",
backgroundImage:
"url(data:image/png;base64,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)" /* 其他... */,
}, // HTML style ,驼峰式写法
on: {
click() {
that.modify = true;
that.labelshow = true;
} /* 其他... */,
},
}
// img 没有子节点,所以第三个参数不用写
);
const spanVnode = h(
// HTML tag
"span",
// HTML 属性
{
props: { contentEditable: false }, // HTML 属性,驼峰式写法
style: {
color: "#22343C",
background: "red",
padding: "5px 10px" /* 其他... */,
}, // style ,驼峰式写法
on: { click() {} /* 其他... */ },
},
// img 没有子节点,所以第三个参数不用写
[fileSpan, iconVnode]
);
const nameVnode = h(
// HTML tag
"span",
// HTML 属性
{
props: { contentEditable: false }, // HTML 属性,驼峰式写法
style: {
color: "#fff",
background: "#009A82",
padding: "5px 10px" /* 其他... */,
}, // style ,驼峰式写法
on: { click() {} /* 其他... */ },
},
// img 没有子节点,所以第三个参数不用写
[fileName, nameiconVnode]
);
// 附件元素 vnode
const attachVnode = h(
// HTML tag
"span",
// HTML 属性、样式、事件
{
props: { contentEditable: false, class: "text" }, // HTML 属性,驼峰式写法
style: {}, // style ,驼峰式写法
on: {
click() {} /* 其他... */,
},
},
// 子节点
[nameVnode, spanVnode]
);
return attachVnode;
}
function renderAttachmenttwo(elem, children, editor) {
// JS 语法
// 获取“附件”的数据,参考上文 myResume 数据结构
const { fileName = "", link = "", fileSpan = "", fieldMark = "" } = elem;
// 附件 icon 图标 vnode
const iconVnode = h(
// HTML tag
"span",
// HTML 属性
{
props: {}, // HTML 属性,驼峰式写法
style: {
width: "16px",
height: "16px",
margin: "0 0 0 6px",
display: "inline-block",
transform: "translateY(20%)",
backgroundSize: "100% 100%",
backgroundImage:
"url(data:image/png;base64,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)" /* 其他... */,
}, // HTML style ,驼峰式写法
on: {
click() {
editor.deleteBackward();
} /* 其他... */,
},
}
// img 没有子节点,所以第三个参数不用写
);
const nameiconVnode = h(
// HTML tag
"span",
// HTML 属性
{
props: {}, // HTML 属性,驼峰式写法
style: {
width: "16px",
height: "16px",
margin: "0 0 0 6px",
display: "inline-block",
transform: "translateY(20%)",
backgroundSize: "100% 100%",
backgroundImage:
"url(data:image/png;base64,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)" /* 其他... */,
}, // HTML style ,驼峰式写法
on: {
click() {
that.modify = true;
that.fieldshow = true;
this.add=[]
} /* 其他... */,
},
}
// img 没有子节点,所以第三个参数不用写
);
const spanVnode = h(
// HTML tag
"span",
// HTML 属性
{
props: { contentEditable: false }, // HTML 属性,驼峰式写法
style: {
color: "#22343C",
background: "yellow",
padding: "5px 10px" /* 其他... */,
}, // style ,驼峰式写法
on: { click() {} /* 其他... */ },
},
// img 没有子节点,所以第三个参数不用写
[fileSpan, iconVnode]
);
const nameVnode = h(
// HTML tag
"span",
// HTML 属性
{
props: { contentEditable: false }, // HTML 属性,驼峰式写法
style: {
color: "#fff",
background: "orange",
padding: "5px 10px" /* 其他... */,
}, // style ,驼峰式写法
on: { click() {} /* 其他... */ },
},
// img 没有子节点,所以第三个参数不用写
[fileName, nameiconVnode]
);
// 附件元素 vnode
const attachVnode = h(
// HTML tag
"span",
// HTML 属性、样式、事件
{
props: { contentEditable: false, class: "text" }, // HTML 属性,驼峰式写法
style: {}, // style ,驼峰式写法
on: {
click() {} /* 其他... */,
},
},
// 子节点
[nameVnode, spanVnode]
);
return attachVnode;
}
const renderElemConf = {
type: "attachment", // 新元素 type ,重要!!!
renderElem: renderAttachment,
};
const renderElemConftwo = {
type: "attachmenttwo", // 新元素 type ,重要!!!
renderElem: renderAttachmenttwo,
};
const rendermodule = {
// JS 语法
// menus: [menu1Conf, menu2Conf, menu3Conf], // 菜单
// editorPlugin: withBreakAndDelete, // 插件
renderElems: [renderElemConf, renderElemConftwo /* 其他元素... */], // renderElem
// 其他功能,下文讲解...
};
Boot.registerModule(rendermodule);
function attachmentToHtml(elem, childrenHtml) {
// JS 语法
// 获取附件元素的数据
const { link = "", fileName = "", fileSpan = "", fieldMark = "" } = elem;
// 生成 HTML 代码
const html = `<span data-w-e-type="attachment"
data-w-e-is-void
data-w-e-is-inline
data-link="${link}"
data-fileSpan="${fileSpan}"
data-fieldMark="${fieldMark}"
data-fileName="${fileName}">
<span class="path-tag-wrap">
<span>${fileName}</span>
<span>${fileSpan}</span>
</span>
</span>`;
return html;
}
function attachmentToHtmltwo(elem, childrenHtml) {
// JS 语法
// 获取附件元素的数据
const { link = "", fileName = "", fileSpan = "", fieldMark = "" } = elem;
// 生成 HTML 代码
const html = `<span data-w-e-type="attachmenttwo"
data-w-e-is-void
data-w-e-is-inline
data-link="${link}"
data-fileSpan="${fileSpan}"
data-fieldMark="${fieldMark}"
data-fileName="${fileName}">
<span class="path-tag-wrap">
<span>${fileName}</span>
<span>${fileSpan}</span>
</span>
</span>`;
return html;
}
const elemToHtmlConf = {
type: "attachment", // 新元素的 type ,重要!!!
elemToHtml: attachmentToHtml,
};
const elemToHtmlConftwo = {
type: "attachmenttwo", // 新元素的 type ,重要!!!
elemToHtml: attachmentToHtmltwo,
};
const elemToHtmlConfmodule = {
// JS 语法
elemsToHtml: [elemToHtmlConf, elemToHtmlConftwo /* 其他元素... */], // elemToHtml
};
Boot.registerModule(elemToHtmlConfmodule);
function parseAttachmentHtml(domElem, children, editor) {
// JS 语法
// 从 DOM element 中获取“附件”的信息
const link = domElem.getAttribute("data-link") || "";
const fileName = domElem.getAttribute("data-fileName") || "";
const fileSpan = domElem.getAttribute("data-fileSpan") || "";
const fieldMark = domElem.getAttribute("data-fieldMark") || "";
// 生成“附件”元素(按照此前约定的数据结构)
const myResume = {
type: "attachment",
link,
fileName,
fileSpan,
fieldMark,
children: [{ text: "" }], // void node 必须有 children ,其中有一个空字符串,重要!!!
};
return myResume;
}
function parseAttachmentHtmltwo(domElem, children, editor) {
// JS 语法
// 从 DOM element 中获取“附件”的信息
const link = domElem.getAttribute("data-link") || "";
const fileName = domElem.getAttribute("data-fileName") || "";
const fileSpan = domElem.getAttribute("data-fileSpan") || "";
const fieldMark = domElem.getAttribute("data-fieldMark") || "";
// 生成“附件”元素(按照此前约定的数据结构)
const myResume = {
type: "attachmenttwo",
link,
fileName,
fileSpan,
fieldMark,
children: [{ text: "" }], // void node 必须有 children ,其中有一个空字符串,重要!!!
};
return myResume;
}
const parseHtmlConf = {
selector: 'span[data-w-e-type="attachment"]', // CSS 选择器,匹配特定的 HTML 标签
parseElemHtml: parseAttachmentHtml,
};
const parseHtmlConftwo = {
selector: 'span[data-w-e-type="attachmenttwo"]', // CSS 选择器,匹配特定的 HTML 标签
parseElemHtml: parseAttachmentHtmltwo,
};
const parseHtmlConfmodule = {
parseElemsHtml: [parseHtmlConf, parseHtmlConftwo], // parseElemHtml
};
Boot.registerModule(parseHtmlConfmodule);
</script>
<!-- <style lang="scss">
</style> -->
<style lang="scss" >
.category-cascader-panel {
.el-cascader-panel {
// background-color: red !important;
li[aria-haspopup="true"] {
.el-checkbox {
display: none !important;
}
}
}
}
// ::v-deep .el-textarea__inner {
// color: black !important;
// background-color: #fff !important;
// cursor: default !important;
// }
// ::v-deep .el-cascader-panel {
// ::v-deep.el-scrollbar:first-child {
// ::v-deep .el-checkbox {
// display: none;
// }
// }
// ::v-deep.el-scrollbar:nth-child(2) {
// ::v-deep.el-checkbox {
// display: none;
// }
// }
// }
// .path-tag-wrap {
// font-size: 18px;
// line-height: 32px;
// border-radius: 5px;
// }
</style>
<style src="@wangeditor/editor/dist/css/style.css"></style>