@kademi/keditor
Version:
KEditor is a jQuery plugin which provides a content editor with drag n drop, configurable contents
105 lines (90 loc) • 4.73 kB
JavaScript
import '../styles/keditor-component-text.less';
import KEditor from 'keditor';
import CKEDITOR from 'ckeditor';
CKEDITOR.disableAutoInline = true;
// Fix issue: Scroll to bottom when pasting text or pressing ENTER in CKEditor
CKEDITOR.dom.element.prototype.scrollIntoView = () => { return; };
CKEDITOR.dom.selection.prototype.scrollIntoView = () => { return; };
CKEDITOR.dom.range.prototype.scrollIntoView = () => { return; };
// Text component
// ---------------------------------------------------------------------
KEditor.components['text'] = {
options: {
toolbarGroups: [
{ name: 'document', groups: ['mode', 'document', 'doctools'] },
{ name: 'editing', groups: ['find', 'selection', 'spellchecker', 'editing'] },
{ name: 'forms', groups: ['forms'] },
{ name: 'basicstyles', groups: ['basicstyles', 'cleanup'] },
{ name: 'paragraph', groups: ['list', 'indent', 'blocks', 'align', 'bidi', 'paragraph'] },
{ name: 'links', groups: ['links'] },
{ name: 'insert', groups: ['insert'] },
'/',
{ name: 'clipboard', groups: ['clipboard', 'undo'] },
{ name: 'styles', groups: ['styles'] },
{ name: 'colors', groups: ['colors'] },
],
title: false,
allowedContent: true, // DISABLES Advanced Content Filter. This is so templates with classes: allowed through
bodyId: 'editor',
templates_replaceContent: false,
enterMode: 'P',
forceEnterMode: true,
format_tags: 'p;h1;h2;h3;h4;h5;h6',
removePlugins: 'table,magicline,tableselection,tabletools',
removeButtons: 'Save,NewPage,Preview,Print,Templates,PasteText,PasteFromWord,Find,Replace,SelectAll,Scayt,Form,HiddenField,ImageButton,Button,Select,Textarea,TextField,Radio,Checkbox,Outdent,Indent,Blockquote,CreateDiv,Language,Table,HorizontalRule,Smiley,SpecialChar,PageBreak,Iframe,Styles,BGColor,Maximize,About,ShowBlocks,BidiLtr,BidiRtl,Flash,Image,Subscript,Superscript,Anchor',
minimumChangeMilliseconds: 100,
},
init: function (contentArea, container, component, keditor) {
let self = this;
let options = keditor.options;
let componentContent = component.children('.keditor-component-content');
componentContent.prop('contenteditable', true);
componentContent.on('input', function (e) {
if (typeof options.onComponentChanged === 'function') {
options.onComponentChanged.call(keditor, e, component);
}
if (typeof options.onContainerChanged === 'function') {
options.onContainerChanged.call(keditor, e, container, contentArea);
}
if (typeof options.onContentChanged === 'function') {
options.onContentChanged.call(keditor, e, contentArea);
}
});
let editor = CKEDITOR.inline(componentContent[0], self.options);
editor.on('instanceReady', function () {
$('#cke_' + componentContent.attr('id')).appendTo(keditor.wrapper);
if (typeof options.onComponentReady === 'function') {
options.onComponentReady.call(contentArea, component, editor);
}
});
editor.on('key', function (event) {
const isCtrl = event.data.domEvent.$.ctrlKey;
if ((isCtrl && event.data.domEvent.$.keyCode === 86) || event.data.domEvent.$.keyCode === 13) {
console.log('Dont scroll!!')
keditor.iframeBody.scrollTop($(editor.element.$).offset().top);
// componentContent.css('height', 200);
// keditor.iframeBody.css('overflow', 'visible');
setTimeout(() => {
// event.cancel();
// console.log(window);
// keditor.iframeBody.css('overflow', '');
// keditor.iframeBody.scrollTop($(editor.element.$).offset().top);
}, 10);
}
}, editor);
},
getContent: function (component, keditor) {
let componentContent = component.find('.keditor-component-content');
let id = componentContent.attr('id');
let editor = CKEDITOR.instances[id];
if (editor) {
return editor.getData();
} else {
return componentContent.html();
}
},
destroy: function (component, keditor) {
let id = component.find('.keditor-component-content').attr('id');
CKEDITOR.instances[id] && CKEDITOR.instances[id].destroy();
},
};