suneditor
Version:
Pure JavaScript based WYSIWYG web editor
101 lines (79 loc) • 3.04 kB
JavaScript
/*
* wysiwyg web editor
*
* suneditor.js
* Copyright 2017 JiHong Lee.
* MIT license.
*/
'use strict';
import colorPicker from '../modules/_colorPicker';
export default {
name: 'fontColor',
display: 'submenu',
add: function (core, targetElement) {
core.addModule([colorPicker]);
const context = core.context;
context.fontColor = {
previewEl: null,
colorInput: null,
colorList: null
};
/** set submenu */
let listDiv = this.setSubmenu.call(core);
context.fontColor.colorInput = listDiv.querySelector('._se_color_picker_input');
/** add event listeners */
context.fontColor.colorInput.addEventListener('keyup', this.onChangeInput.bind(core));
listDiv.querySelector('._se_color_picker_submit').addEventListener('click', this.submit.bind(core));
listDiv.querySelector('._se_color_picker_remove').addEventListener('click', this.remove.bind(core));
listDiv.addEventListener('click', this.pickup.bind(core));
context.fontColor.colorList = listDiv.querySelectorAll('li button');
/** append target button menu */
core.initMenuTarget(this.name, targetElement, listDiv);
/** empty memory */
listDiv = null;
},
setSubmenu: function () {
const colorArea = this.context.colorPicker.colorListHTML;
const listDiv = this.util.createElement('DIV');
listDiv.className = 'se-submenu se-list-layer';
listDiv.innerHTML = colorArea;
return listDiv;
},
/**
* @overriding submenu
*/
on: function () {
const contextPicker = this.context.colorPicker;
const contextFontColor = this.context.fontColor;
contextPicker._colorInput = contextFontColor.colorInput;
contextPicker._defaultColor = '#333333';
contextPicker._styleProperty = 'color';
contextPicker._colorList = contextFontColor.colorList;
this.plugins.colorPicker.init.call(this, this.getSelectionNode(), null);
},
/**
* @overriding _colorPicker
*/
onChangeInput: function (e) {
this.plugins.colorPicker.setCurrentColor.call(this, e.target.value);
},
submit: function () {
this.plugins.fontColor.applyColor.call(this, this.context.colorPicker._currentColor);
},
pickup: function (e) {
e.preventDefault();
e.stopPropagation();
this.plugins.fontColor.applyColor.call(this, e.target.getAttribute('data-value'));
},
remove: function () {
this.nodeChange(null, ['color'], ['span'], true);
this.submenuOff();
},
applyColor: function (color) {
if (!color) return;
const newNode = this.util.createElement('SPAN');
newNode.style.color = color;
this.nodeChange(newNode, ['color'], null, null);
this.submenuOff();
}
};