/** * @description link 菜单 panel tab 配置 * @author wangfupeng */ import Editor from '../../editor/index' import { PanelConf } from '../menu-constructors/Panel' import { getRandom } from '../../utils/util' import $, { DomElement } from '../../utils/dom-core' import isActive from './is-active' export default function (editor: Editor, text: string, link: string): PanelConf { // panel 中需要用到的id const inputLinkId = getRandom('input-link') const inputTextId = getRandom('input-text') const btnOkId = getRandom('btn-ok') const btnDelId = getRandom('btn-del') // 是否显示“取消链接” const delBtnDisplay = isActive(editor) ? 'inline-block' : 'none' let $selectedLink: DomElement /** * 选中整个链接元素 */ function selectLinkElem(): void { if (!isActive(editor)) return const $linkElem = editor.selection.getSelectionContainerElem() if (!$linkElem) return editor.selection.createRangeByElem($linkElem) editor.selection.restoreSelection() $selectedLink = $linkElem // 赋值给函数内全局变量 } /** * 插入链接 * @param text 文字 * @param link 链接 */ function insertLink(text: string, link: string): void { if (isActive(editor)) { // 选区处于链接中,则选中整个菜单,再执行 insertHTML selectLinkElem() editor.cmd.do('insertHTML', `${text}`) } else { // 选区未处于链接中,直接插入即可 editor.cmd.do('insertHTML', `${text}`) } } /** * 取消链接 */ function delLink(): void { if (!isActive(editor)) { return } // 选中整个链接 selectLinkElem() // 用文本替换链接 const selectionText = $selectedLink.text() editor.cmd.do('insertHTML', '' + selectionText + '') } /** * 校验链接是否合法 * @param link 链接 */ function checkLink(text: string, link: string): boolean { //查看开发者自定义配置的返回值 const check = editor.config.linkCheck(text, link) if (check === undefined) { //用户未能通过开发者的校验,且开发者不希望编辑器提示用户 } else if (check === true) { //用户通过了开发者的校验 return true } else { //用户未能通过开发者的校验,开发者希望我们提示这一字符串 editor.config.customAlert(check, 'warning') } return false } const conf = { width: 300, height: 0, // panel 中可包含多个 tab tabs: [ { // tab 的标题 title: editor.i18next.t('menus.panelMenus.link.链接'), // 模板 tpl: `
`, // 事件绑定 events: [ // 插入链接 { selector: '#' + btnOkId, type: 'click', fn: () => { // 执行插入链接 const $link = $('#' + inputLinkId) const $text = $('#' + inputTextId) let link = $link.val().trim() let text = $text.val().trim() // 链接为空,则不插入 if (!link) return // 文本为空,则用链接代替 if (!text) text = link // 校验链接是否满足用户的规则,若不满足则不插入 if (!checkLink(text, link)) return insertLink(text, link) // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭 return true }, }, // 取消链接 { selector: '#' + btnDelId, type: 'click', fn: () => { // 执行取消链接 delLink() // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭 return true }, }, ], }, // tab end ], // tabs end } return conf }