/**
* @description image 菜单 panel tab 配置
* @author wangfupeng
*/
import Editor from '../../editor/index'
import $, { DomElement } from '../../utils/dom-core'
import { getRandom } from '../../utils/util'
import { PanelConf, PanelTabConf, TabEventConf } from '../menu-constructors/Panel'
import UploadImg from './upload-img'
export type ImgPanelConf = {
onlyUploadConf?: {
$elem: DomElement
events: TabEventConf[]
}
} & PanelConf
export default function (editor: Editor): ImgPanelConf {
const config = editor.config
const uploadImg = new UploadImg(editor)
// panel 中需要用到的id
const upTriggerId = getRandom('up-trigger-id')
const upFileId = getRandom('up-file-id')
const linkUrlId = getRandom('input-link-url')
const linkUrlAltId = getRandom('input-link-url-alt')
const linkUrlHrefId = getRandom('input-link-url-href')
const linkBtnId = getRandom('btn-link')
const i18nPrefix = 'menus.panelMenus.image.'
const t = (text: string, prefix: string = i18nPrefix): string => {
return editor.i18next.t(prefix + text)
}
/**
* 校验网络图片链接是否合法
* @param linkImg 网络图片链接
*/
function checkLinkImg(src: string, linkUrlAltText?: string, linkUrlHrefText?: string): boolean {
//查看开发者自定义配置的返回值
const check = config.linkImgCheck(src)
if (check === true) {
return true
} else if (typeof check === 'string') {
//用户未能通过开发者的校验,开发者希望我们提示这一字符串
config.customAlert(check, 'error')
}
return false
}
// tabs 配置 -----------------------------------------
const fileMultipleAttr = config.uploadImgMaxLength === 1 ? '' : 'multiple="multiple"'
const accepts: string = config.uploadImgAccept.map((item: string) => `image/${item}`).join(',')
/**
* 设置模板的类名和icon图标
* w-e-menu是作为button菜单的模板
* w-e-up-img-container是做为panel菜单的窗口内容的模板
* @param containerClass 模板最外层的类名
* @param iconClass 模板中icon的类名
* @param titleName 模板中标题的名称 需要则设置不需要则设为空字符
*/
const getUploadImgTpl = (containerClass: string, iconClass: string, titleName: string) =>
`
`
const uploadEvents: TabEventConf[] = [
// 触发选择图片
{
selector: '#' + upTriggerId,
type: 'click',
fn: () => {
const uploadImgFromMedia = config.uploadImgFromMedia
if (uploadImgFromMedia && typeof uploadImgFromMedia === 'function') {
uploadImgFromMedia()
return true
}
const $file = $('#' + upFileId)
const fileElem = $file.elems[0]
if (fileElem) {
fileElem.click()
} else {
// 返回 true 可关闭 panel
return true
}
},
},
// 选择图片完毕
{
selector: '#' + upFileId,
type: 'change',
fn: () => {
const $file = $('#' + upFileId)
const fileElem = $file.elems[0] as HTMLInputElement
if (!fileElem) {
// 返回 true 可关闭 panel
return true
}
// 获取选中的 file 对象列表
const fileList = fileElem.files
if (fileList?.length) {
uploadImg.uploadImg(fileList)
}
// 判断用于打开文件的input,有没有值,如果有就清空,以防上传同一张图片时,不会触发change事件
// input的功能只是单单为了打开文件而已,获取到需要的文件参数,当文件数据获取到后,可以清空。
if (fileElem) {
fileElem.value = ''
}
// 返回 true 可关闭 panel
return true
},
},
]
const linkImgInputs = [
``,
]
if (config.showLinkImgAlt) {
linkImgInputs.push(`
`)
}
if (config.showLinkImgHref) {
linkImgInputs.push(`
`)
}
const tabsConf: PanelTabConf[] = [
// first tab
{
// 标题
title: t('上传图片'),
// 模板
tpl: getUploadImgTpl('w-e-up-img-container', 'w-e-icon-upload2', ''),
// 事件绑定
events: uploadEvents,
}, // first tab end
// second tab
{
title: t('网络图片'),
tpl: `
${linkImgInputs.join('')}
`,
events: [
{
selector: '#' + linkBtnId,
type: 'click',
fn: () => {
const $linkUrl = $('#' + linkUrlId)
const url = $linkUrl.val().trim()
//如果url为空则直接返回
if (!url) return
let linkUrlAltText
if (config.showLinkImgAlt) {
linkUrlAltText = $('#' + linkUrlAltId)
.val()
.trim()
}
let linkUrlHrefText
if (config.showLinkImgHref) {
linkUrlHrefText = $('#' + linkUrlHrefId)
.val()
.trim()
}
//如果不能通过校验也直接返回
if (!checkLinkImg(url, linkUrlAltText, linkUrlHrefText)) return
//插入图片url
uploadImg.insertImg(url, linkUrlAltText, linkUrlHrefText)
// 返回 true 表示函数执行结束之后关闭 panel
return true
},
bindEnter: true,
},
],
}, // second tab end
]
// tabs end
// 最终的配置 -----------------------------------------
const conf: ImgPanelConf = {
width: 300,
height: 0,
tabs: [],
onlyUploadConf: {
$elem: $(getUploadImgTpl('w-e-menu', 'w-e-icon-image', '图片')),
events: uploadEvents,
},
}
// 显示“上传图片”
if (
window.FileReader &&
(config.uploadImgShowBase64 ||
config.uploadImgServer ||
config.customUploadImg ||
config.uploadImgFromMedia)
) {
conf.tabs.push(tabsConf[0])
}
// 显示“插入网络图片”
if (config.showLinkImg) {
conf.tabs.push(tabsConf[1])
conf.onlyUploadConf = undefined
}
return conf
}