/* panel */ import $ from '../util/dom-core.js' import replaceLang from '../util/replace-lang.js' const emptyFn = () => {} // 记录已经显示 panel 的菜单 let _isCreatedPanelMenus = [] // 构造函数 function Panel(menu, opt) { this.menu = menu this.opt = opt } // 原型 Panel.prototype = { constructor: Panel, // 显示(插入DOM) show: function () { const menu = this.menu if (_isCreatedPanelMenus.indexOf(menu) >= 0) { // 该菜单已经创建了 panel 不能再创建 return } const editor = menu.editor const $body = $('body') const $textContainerElem = editor.$textContainerElem const opt = this.opt // panel 的容器 const $container = $('
') const width = opt.width || 300 // 默认 300px $container.css('width', width + 'px') .css('margin-left', (0 - width)/2 + 'px') // 添加关闭按钮 const $closeBtn = $('') $container.append($closeBtn) $closeBtn.on('click', () => { this.hide() }) // 准备 tabs 容器 const $tabTitleContainer = $('') const $tabContentContainer = $('
') $container.append($tabTitleContainer).append($tabContentContainer) // 设置高度 const height = opt.height if (height) { $tabContentContainer.css('height', height + 'px').css('overflow-y', 'auto') } // tabs const tabs = opt.tabs || [] const tabTitleArr = [] const tabContentArr = [] tabs.forEach((tab, tabIndex) => { if (!tab) { return } let title = tab.title || '' let tpl = tab.tpl || '' // 替换多语言 title = replaceLang(editor, title) tpl = replaceLang(editor, tpl) // 添加到 DOM const $title = $(`
  • ${title}
  • `) $tabTitleContainer.append($title) const $content = $(tpl) $tabContentContainer.append($content) // 记录到内存 $title._index = tabIndex tabTitleArr.push($title) tabContentArr.push($content) // 设置 active 项 if (tabIndex === 0) { $title._active = true $title.addClass('w-e-active') } else { $content.hide() } // 绑定 tab 的事件 $title.on('click', e => { if ($title._active) { return } // 隐藏所有的 tab tabTitleArr.forEach($title => { $title._active = false $title.removeClass('w-e-active') }) tabContentArr.forEach($content => { $content.hide() }) // 显示当前的 tab $title._active = true $title.addClass('w-e-active') $content.show() }) }) // 绑定关闭事件 $container.on('click', e => { // 点击时阻止冒泡 e.stopPropagation() }) $body.on('click', e => { this.hide() }) // 添加到 DOM $textContainerElem.append($container) // 绑定 opt 的事件,只有添加到 DOM 之后才能绑定成功 tabs.forEach((tab, index) => { if (!tab) { return } const events = tab.events || [] events.forEach(event => { const selector = event.selector const type = event.type const fn = event.fn || emptyFn const $content = tabContentArr[index] $content.find(selector).on(type, (e) => { e.stopPropagation() const needToHide = fn(e) // 执行完事件之后,是否要关闭 panel if (needToHide) { this.hide() } }) }) }) // focus 第一个 elem let $inputs = $container.find('input[type=text],textarea') if ($inputs.length) { $inputs.get(0).focus() } // 添加到属性 this.$container = $container // 隐藏其他 panel this._hideOtherPanels() // 记录该 menu 已经创建了 panel _isCreatedPanelMenus.push(menu) }, // 隐藏(移除DOM) hide: function () { const menu = this.menu const $container = this.$container if ($container) { $container.remove() } // 将该 menu 记录中移除 _isCreatedPanelMenus = _isCreatedPanelMenus.filter(item => { if (item === menu) { return false } else { return true } }) }, // 一个 panel 展示时,隐藏其他 panel _hideOtherPanels: function () { if (!_isCreatedPanelMenus.length) { return } _isCreatedPanelMenus.forEach(menu => { const panel = menu.panel || {} if (panel.hide) { panel.hide() } }) } } export default Panel