<template>
    <div style="border: 1px solid #ccc;">
        <Toolbar style="border-bottom: 1px solid #ccc" :editor="editor" :defaultConfig="toolbarConfig" :mode="mode" />
        <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="show" width="70%">
            <el-cascader-panel :options="options"></el-cascader-panel>
            <div @click="click">确定</div>
        </el-dialog>
    </div>
</template>

<script>
import { DomEditor, IDomEditor, SlateElement } from '@wangeditor/editor'
import { Editor, Toolbar } from "@wangeditor/editor-for-vue";
import { Boot } from '@wangeditor/editor'
import { h, VNode } from 'snabbdom'
// import menuConf from "./ModalMenu";

export default ({
    components: { Editor, Toolbar },
    data() {
        return {
            options: [{
                value: 'zhinan',
                label: '指南',
                children: [{
                    value: 'shejiyuanze',
                    label: '设计原则',
                    children: [{
                        value: 'yizhi',
                        label: '一致'
                    }, {
                        value: 'fankui',
                        label: '反馈'
                    }, {
                        value: 'xiaolv',
                        label: '效率'
                    }, {
                        value: 'kekong',
                        label: '可控'
                    }]
                }, {
                    value: 'daohang',
                    label: '导航',
                    children: [{
                        value: 'cexiangdaohang',
                        label: '侧向导航'
                    }, {
                        value: 'dingbudaohang',
                        label: '顶部导航'
                    }]
                }]
            }, {
                value: 'zujian',
                label: '组件',
                children: [{
                    value: 'basic',
                    label: 'Basic',
                    children: [{
                        value: 'layout',
                        label: 'Layout 布局'
                    }, {
                        value: 'color',
                        label: 'Color 色彩'
                    }, {
                        value: 'typography',
                        label: 'Typography 字体'
                    }, {
                        value: 'icon',
                        label: 'Icon 图标'
                    }, {
                        value: 'button',
                        label: 'Button 按钮'
                    }]
                }, {
                    value: 'form',
                    label: 'Form',
                    children: [{
                        value: 'radio',
                        label: 'Radio 单选框'
                    }, {
                        value: 'checkbox',
                        label: 'Checkbox 多选框'
                    }, {
                        value: 'input',
                        label: 'Input 输入框'
                    }, {
                        value: 'input-number',
                        label: 'InputNumber 计数器'
                    }, {
                        value: 'select',
                        label: 'Select 选择器'
                    }, {
                        value: 'cascader',
                        label: 'Cascader 级联选择器'
                    }, {
                        value: 'switch',
                        label: 'Switch 开关'
                    }, {
                        value: 'slider',
                        label: 'Slider 滑块'
                    }, {
                        value: 'time-picker',
                        label: 'TimePicker 时间选择器'
                    }, {
                        value: 'date-picker',
                        label: 'DatePicker 日期选择器'
                    }, {
                        value: 'datetime-picker',
                        label: 'DateTimePicker 日期时间选择器'
                    }, {
                        value: 'upload',
                        label: 'Upload 上传'
                    }, {
                        value: 'rate',
                        label: 'Rate 评分'
                    }, {
                        value: 'form',
                        label: 'Form 表单'
                    }]
                }, {
                    value: 'data',
                    label: 'Data',
                    children: [{
                        value: 'table',
                        label: 'Table 表格'
                    }, {
                        value: 'tag',
                        label: 'Tag 标签'
                    }, {
                        value: 'progress',
                        label: 'Progress 进度条'
                    }, {
                        value: 'tree',
                        label: 'Tree 树形控件'
                    }, {
                        value: 'pagination',
                        label: 'Pagination 分页'
                    }, {
                        value: 'badge',
                        label: 'Badge 标记'
                    }]
                }, {
                    value: 'notice',
                    label: 'Notice',
                    children: [{
                        value: 'alert',
                        label: 'Alert 警告'
                    }, {
                        value: 'loading',
                        label: 'Loading 加载'
                    }, {
                        value: 'message',
                        label: 'Message 消息提示'
                    }, {
                        value: 'message-box',
                        label: 'MessageBox 弹框'
                    }, {
                        value: 'notification',
                        label: 'Notification 通知'
                    }]
                }, {
                    value: 'navigation',
                    label: 'Navigation',
                    children: [{
                        value: 'menu',
                        label: 'NavMenu 导航菜单'
                    }, {
                        value: 'tabs',
                        label: 'Tabs 标签页'
                    }, {
                        value: 'breadcrumb',
                        label: 'Breadcrumb 面包屑'
                    }, {
                        value: 'dropdown',
                        label: 'Dropdown 下拉菜单'
                    }, {
                        value: 'steps',
                        label: 'Steps 步骤条'
                    }]
                }, {
                    value: 'others',
                    label: 'Others',
                    children: [{
                        value: 'dialog',
                        label: 'Dialog 对话框'
                    }, {
                        value: 'tooltip',
                        label: 'Tooltip 文字提示'
                    }, {
                        value: 'popover',
                        label: 'Popover 弹出框'
                    }, {
                        value: 'card',
                        label: 'Card 卡片'
                    }, {
                        value: 'carousel',
                        label: 'Carousel 走马灯'
                    }, {
                        value: 'collapse',
                        label: 'Collapse 折叠面板'
                    }]
                }]
            }, {
                value: 'ziyuan',
                label: '资源',
                children: [{
                    value: 'axure',
                    label: 'Axure Components'
                }, {
                    value: 'sketch',
                    label: 'Sketch Templates'
                }, {
                    value: 'jiaohu',
                    label: '组件交互文档'
                }]
            }],
            editor: null,
            toolbarConfig: {
                insertKeys: {
                    index: 30,
                    keys: ['MyButtonMenu']
                }
            },
            html: "<p><span style='color:red'>22222222</span></p>",
            editorConfig: { placeholder: '请输入内容...' },
            mode: 'simple', // or 'simple'
            show: false,
            timer: '',
        }
    },
    methods: {
        click() {
            this.show = false
            this.editor.focus()
            this.timer = setInterval(() => {
                if (this.editor.isFocused()) {
                    const resume = {                    // JS 语法
                        type: 'attachment',
                        fileName: '用药',
                        fileSpan: '药品名称',
                        link: 'https://xxx.com/files/resume.pdf',
                        children: [{ text: '123' }]  // void 元素必须有一个 children ，其中只有一个空字符串，重要！！！
                    }
                    this.editor.insertNode(resume)
                    clearInterval(this.timer)
                }
            }, 200);
        },
        onCreated(editor) {
            // console.log("created", editor);
            this.editor = Object.seal(editor); // 【注意】一定要用 Object.seal() 否则会报错
        },
        onChange(editor) {
            // console.log("onChange", editor.getHtml()); // onChange 时获取编辑器最新内容
        },
        handleFocus(editor) {
            // console.log("focus", editor);
        },
    },
    mounted() {

    },
    beforeDestroy() {
        const editor = this.editor
        if (editor == null) return
        editor.destroy() // 组件销毁时，及时销毁编辑器
    },
    created() {
        let that = this
        const menuConf = {
            key: 'MyButtonMenu', // 定义 menu key ：要保证唯一、不重复（重要）
            factory() {
                return new MyButtonMenu(that)
            },
        };
        Boot.registerMenu(menuConf)
        Boot.registerPlugin(withAttachment)
        const renderElemConf = {
            type: 'attachment', // 新元素 type ，重要！！！
            renderElem: renderAttachment,
        }
        Boot.registerRenderElem(renderElemConf)
    }
})
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
        return isInline(elem)
    }
    newEditor.isVoid = elem => {
        const type = DomEditor.getNodeType(elem)
        if (type === 'attachment') return true // 针对 type: attachment ，设置为 void
        return isVoid(elem)
    }
    return newEditor // 返回 newEditor ，重要！！！
}
function renderAttachment(elem, children, editor) {                                                // JS 语法
    console.log(h)
    // 获取“附件”的数据，参考上文 myResume 数据结构
    const { fileName = '', link = '', fileSpan = '' } = elem
    // 附件 icon 图标 vnode
    const iconVnode = h(
        // HTML tag
        'img',
        // HTML 属性
        {
            props: { src: 'https://hekou-nurse-api.xinyilu.cn/profile/weChatPicture/dygmainPage.png' }, // HTML 属性，驼峰式写法
            style: { width: '1em', marginRight: '0.1em', transform: 'translateY(15%)'  /* 其他... */ } // HTML style ，驼峰式写法
        }
        // img 没有子节点，所以第三个参数不用写
    )
    const spanVnode = h(
        // HTML tag
        'span',
        // HTML 属性
        {
            props: { contentEditable: false }, // HTML 属性，驼峰式写法
            style: { display: 'inline-block', marginLeft: '3px', color: '#22343C', background: '#E5F5F2', /* 其他... */ }, // style ，驼峰式写法
            on: { click() { console.log('clicked', link, elem) }, /* 其他... */ }
        },
        // img 没有子节点，所以第三个参数不用写
        [iconVnode, fileSpan]
    )
    // 附件元素 vnode
    const attachVnode = h(
        // HTML tag
        'span',
        // HTML 属性、样式、事件
        {
            props: { contentEditable: false }, // HTML 属性，驼峰式写法
            style: { display: 'inline-block', marginLeft: '3px', color: '#fff', background: '#009A82', /* 其他... */ }, // style ，驼峰式写法
            on: { click() { console.log('clicked', link, elem), elem.fileName = '123' } /* 其他... */ }
        },
        // 子节点
        [iconVnode, fileName, spanVnode]
    )
    return attachVnode
}

class MyButtonMenu {                       // 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.show = true
    }
}
</script>

<style src="@wangeditor/editor/dist/css/style.css"></style>
