Search results

Third Party Integration

The RichTextEditor can be integrated with third-party to suite the application scenario.

Code-Mirror Integration

RichTextEditor comes with a basic HTML source editor through view-source property. Code mirror plugin can be used to highlight the syntax of HTML. CodeMirror plugin for RichTextEditor makes editing of HTML source code with a pleasant experience.

Import necessary CSS and JS files of CodeMirror to the HTML page.

Required JS files of code mirror.

 <script src="scripts/CodeMirror/codemirror.js" type="text/javascript"></script>
 <script src="scripts/CodeMirror/javascript.js" type="text/javascript"></script>
 <script src="scripts/CodeMirror/css.js" type="text/javascript"></script>
 <script src="scripts/CodeMirror/htmlmixed.js" type="text/javascript"></script>

Required CSS file of code mirror.

 <link href="scripts/CodeMirror/codemirror.min.css" rel="stylesheet" />

Add a custom icon for HTML source editor in the toolbar of RichTextEditor using template option of toolbarSettings and define the code mirror plugins, and then pass the RichTextEditor content as argument in actionComplete event.

razor
<div class="control-section">
    @Html.EJS().RichTextEditor("default").ToolbarSettings(e=>e.Items((object)ViewBag.tools)).Value((string)ViewBag.value).ShowCharCount(true).MaxLength(2000).Created("created").ActionComplete("actionCompleteHandler").Render()
</div>

<link href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.39.0/codemirror.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.3.0/codemirror.js" type="text/javascript"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.3.0/mode/css/css.js" type="text/javascript"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.3.0/mode/xml/xml.js" type="text/javascript"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.3.0/mode/htmlmixed/htmlmixed.js" type="text/javascript"></script>

<style>
    .e-code-mirror::before {
        content: '\e345';
    }

    .e-html-preview::before {
        content: '\e350';
    }

    .CodeMirror-linenumber,
    .CodeMirror-gutters {
        display: none;
    }
</style>

<script type="text/javascript">
    var defaultRTE;
    var divPreview;
    var myCodeMirror;
    var textArea
    divPreview = document.getElementById('DIV_Preview');
    function created() {
        defaultRTE = this;
        textArea = defaultRTE.contentModule.getEditPanel();

    }
    function mirrorConversion(e) {
        var id = defaultRTE.getID() + 'mirror-view';
        var mirrorView = defaultRTE.element.querySelector('#' + id);
        var charCount = defaultRTE.element.querySelector('.e-rte-character-count');
        if (e.targetItem === 'Preview') {
            textArea.style.display = 'block';
            mirrorView.style.display = 'none';
            textArea.innerHTML = myCodeMirror.getValue();
            charCount.style.display = 'block';
        }
        else {
            if (!mirrorView) {
                mirrorView = ej.base.createElement('div', { className: 'e-content' });
                mirrorView.id = id;
                textArea.parentNode.appendChild(mirrorView);
            }
            else {
                mirrorView.innerHTML = '';
            }
            textArea.style.display = 'none';
            mirrorView.style.display = 'block';
            renderCodeMirror(mirrorView, defaultRTE.value);
            charCount.style.display = 'none';
        }
    }
    function renderCodeMirror(mirrorView, content) {
        myCodeMirror = CodeMirror(mirrorView, {
            value: content,
            lineNumbers: true,
            mode: 'text/html',
            lineWrapping: true,
        });
    }
    function actionCompleteHandler(e) {
        if (e.targetItem && (e.targetItem === 'SourceCode' || e.targetItem === 'Preview')) {
            this.sourceCodeModule.getPanel().style.display = 'none';
            mirrorConversion(e);
        }
        else {
            setTimeout(function () { defaultRTE.toolbarModule.refreshToolbarOverflow(); }, 400);
        }
    }
</script>

At.js Integration

RichTextEditor can easily be integrated with At.js library. To display the autocomplete list, type ‘@’.

Include At.JS style.

 <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/at.js/1.4.0/css/jquery.atwho.min.css">

Include At.JS javascript.

<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/at.js/1.4.0/js/jquery.atwho.min.js"></script>

Define the At.js configuration

In below configuration, email id of employees list - email id of employees from the data source.

var config = {
    at: "@",
    data: [email id of employees list],
    displayTpl: '<li>${name} <small>${email}</small></li>',
    limit: 200
  }

Populate the employee’s email id from local or remote data and set the result to the data of At.js configuration.

razor
<div class="control-section">
    @Html.EJS().RichTextEditor("thirdparty").Value((string)ViewBag.value).Height("500").Created("created").ToolbarSettings(e=>e.Items((object)ViewBag.items)).Render()
</div>
<script src="//cdn.syncfusion.com/js/assets/external/jquery-1.11.3.min.js" type="text/javascript"></script>
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/at.js/1.4.0/css/jquery.atwho.min.css">
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/at.js/1.4.0/js/jquery.atwho.min.js"></script>
<script>
    // Build data to be used in At.JS config.
    var employeeList = [
        { id: 'emp01', name: 'Jacob', email: 'jacob@mail.com' },
        { id: 'emp02', name: 'Isabella', email: 'isabella@mail.com' },
        { id: 'emp03', name: 'Ethan', email: 'ethan@mail.com' },
        { id: 'emp04', name: 'Emma', email: 'emma@mail.com' },
        { id: 'emp05', name: 'Michael', email: 'michael@mail.com' },
        { id: 'emp06', name: 'Olivia', email: 'olivia@mail.com' },
        { id: 'emp07', name: 'Jeniffer', email: 'jeniffer@mail.com' }
    ];
       var config = {
        at: "@@",
        data: employeeList,
        displayTpl: '<li>${name} <small>${email}</small></li>',
        limit: 200
    };
    function created(args) {
        var textArea = this.contentModule.getEditPanel();
        $(textArea).atwho(config);
        $(textArea).on('keydown', function (e) {
            if (e.keyCode == 13 && $(textArea).atwho('isSelecting'))
                return false;
        });
    }
</script>

Embed.ly Integration

RichTextEditor easily integrate with Embed.ly which is probably the best service when it comes to embed the rich content such as Twitter, Facebook, Instagram and lots of other publishing platform embeds.

<script src="https://cdn.embedly.com/widgets/platform.js" charset="UTF-8"></script>

In the following sample, the Embed.ly class embedly-card has been added to <a> tag in actionComplete event.

razor
<div class="control-section">
    @Html.EJS().RichTextEditor("thirdparty").Value((string)ViewBag.value).Height("500").ActionComplete("actionComplete").ToolbarSettings(e=>e.Items((object)ViewBag.items)).Render()
</div>
<script async src="https://cdn.embedly.com/widgets/platform.js" charset="UTF-8"></script>
<script>
  function actionComplete(args) {
        if(args.requestType === 'Links') {
            if (args.elements[0].parentNode && args.elements[0].parentNode.tagName === 'A') {
                var emberEle = document.createElement('blockquote');
                emberEle.setAttribute('class', 'embedly-card');
                emberEle.appendChild(args.elements[0].parentElement);
                emberEle.appendChild(document.createElement('p'));
                args.range.insertNode(emberEle);
            }
        }
    }
</script>