/*
menu - link
*/
import $ from '../../util/dom-core.js'
import { getRandom } from '../../util/util.js'
import Panel from '../panel.js'
// 构造函数
function Link(editor) {
this.editor = editor
this.$elem = $('
')
this.type = 'panel'
// 当前是否 active 状态
this._active = false
}
// 原型
Link.prototype = {
constructor: Link,
// 点击事件
onClick: function (e) {
const editor = this.editor
let $linkelem
if (this._active) {
// 当前选区在链接里面
$linkelem = editor.selection.getSelectionContainerElem()
if (!$linkelem) {
return
}
// 将该元素都包含在选取之内,以便后面整体替换
editor.selection.createRangeByElem($linkelem)
editor.selection.restoreSelection()
// 显示 panel
this._createPanel($linkelem.text(), $linkelem.attr('href'))
} else {
// 当前选区不在链接里面
if (editor.selection.isSelectionEmpty()) {
// 选区是空的,未选中内容
this._createPanel('', '')
} else {
// 选中内容了
this._createPanel(editor.selection.getSelectionText(), '')
}
}
},
// 创建 panel
_createPanel: function (text, link) {
// panel 中需要用到的id
const inputLinkId = getRandom('input-link')
const inputTextId = getRandom('input-text')
const btnOkId = getRandom('btn-ok')
const btnDelId = getRandom('btn-del')
// 是否显示“删除链接”
const delBtnDisplay = this._active ? 'inline-block' : 'none'
// 初始化并显示 panel
const panel = new Panel(this, {
width: 300,
// panel 中可包含多个 tab
tabs: [
{
// tab 的标题
title: '链接',
// 模板
tpl: ``,
// 事件绑定
events: [
// 插入链接
{
selector: '#' + btnOkId,
type: 'click',
fn: () => {
// 执行插入链接
const $link = $('#' + inputLinkId)
const $text = $('#' + inputTextId)
const link = $link.val()
const text = $text.val()
this._insertLink(text, link)
// 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
return true
}
},
// 删除链接
{
selector: '#' + btnDelId,
type: 'click',
fn: () => {
// 执行删除链接
this._delLink()
// 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
return true
}
}
]
} // tab end
] // tabs end
})
// 显示 panel
panel.show()
// 记录属性
this.panel = panel
},
// 删除当前链接
_delLink: function () {
if (!this._active) {
return
}
const editor = this.editor
const $selectionELem = editor.selection.getSelectionContainerElem()
if (!$selectionELem) {
return
}
const selectionText = editor.selection.getSelectionText()
editor.cmd.do('insertHTML', '' + selectionText + '')
},
// 插入链接
_insertLink: function (text, link) {
const editor = this.editor
const config = editor.config
const linkCheck = config.linkCheck
let checkResult = true // 默认为 true
if (linkCheck && typeof linkCheck === 'function') {
checkResult = linkCheck(text, link)
}
if (checkResult === true) {
editor.cmd.do('insertHTML', `${text}`)
} else {
alert(checkResult)
}
},
// 试图改变 active 状态
tryChangeActive: function (e) {
const editor = this.editor
const $elem = this.$elem
const $selectionELem = editor.selection.getSelectionContainerElem()
if (!$selectionELem) {
return
}
if ($selectionELem.getNodeName() === 'A') {
this._active = true
$elem.addClass('w-e-active')
} else {
this._active = false
$elem.removeClass('w-e-active')
}
}
}
export default Link