(function(window) { "use strict"; window.ls.container.get("view").add({ selector: "data-forms-pell", controller: function(element, window, document, markdown) { var div = document.createElement("div"); element.className = "pell hide"; div.className = "input pell"; element.parentNode.insertBefore(div, element); element.tabIndex = -1; var turndownService = new TurndownService(); turndownService.addRule("underline", { filter: ["u"], replacement: function(content) { return "__" + content + "__"; } }); var editor = window.pell.init({ element: div, onChange: function onChange(html) { element.value = turndownService.turndown(html); // Change HTML to Markdown }, defaultParagraphSeparator: "p", actions: [ { name: "bold", icon: '' }, { name: "underline", icon: '' }, { name: "italic", icon: '' }, { name: "olist", icon: '' }, { name: "ulist", icon: '' }, { name: "link", icon: '' } ] }); element.addEventListener("change", function() { editor.content.innerHTML = markdown.render(element.value); // Change Markdown to HTML (mainly for editing purpose) }); editor.content.setAttribute("placeholder", element.placeholder); editor.content.innerHTML = markdown.render(element.value); editor.content.tabIndex = 0; editor.content.onkeydown = function preventTab(event) { if (event.which === 9) { event.preventDefault(); // Inspired by: https://stackoverflow.com/a/35173443/2299554 //add all elements we want to include in our selection if (document.activeElement) { var focussable = Array.prototype.filter.call( document.querySelectorAll( 'a:not([disabled]), button:not([disabled]), select:not([disabled]), input[type=text]:not([disabled]), input[type=checkbox]:not([disabled]), [tabindex]:not([disabled]):not([tabindex="-1"])' ), function(element) { //check for visibility while always include the current activeElement return ( element.offsetWidth > 0 || element.offsetHeight > 0 || element === document.activeElement ); } ); var index = focussable.indexOf(document.activeElement); if (index > -1) { if (event.shiftKey) { // Move up var prevElement = focussable[index - 1] || focussable[focussable.length - 1]; prevElement.focus(); } else { // Move down var nextElement = focussable[index + 1] || focussable[0]; nextElement.focus(); } } } } }; var clean = function(e) { e.stopPropagation(); e.preventDefault(); var clipboardData = e.clipboardData || window.clipboardData; window.pell.exec("insertText", clipboardData.getData("Text")); return true; }; div.addEventListener("paste", clean); div.addEventListener("drop", clean); } }); })(window);