(function(window) { "use strict"; window.ls.container.get("view").add({ selector: "data-forms-clone", controller: function(element, document, view) { var template = element.innerHTML.toString(); var label = element.dataset["label"] || "Add"; var icon = element.dataset["icon"] || null; var target = element.dataset["target"] || null; var first = parseInt(element.dataset["first"] || 1); var button = document.createElement("button"); button.type = "button"; button.innerText = " " + label + " "; button.classList.add("margin-end"); button.classList.add("margin-bottom-small"); button.classList.add("reverse"); if (icon) { var iconElement = document.createElement("i"); iconElement.className = icon; button.insertBefore(iconElement, button.firstChild); } if (target) { target = document.getElementById(target); } button.addEventListener("click", function() { var clone = document.createElement(element.tagName); if (element.name) { clone.name = element.name; } clone.innerHTML = template; clone.className = element.className; view.render(clone); if (target) { target.appendChild(clone); } else { button.parentNode.insertBefore(clone, button); } clone.querySelector("input").focus(); Array.prototype.slice .call(clone.querySelectorAll("[data-remove]")) .map(function(obj) { obj.addEventListener("click", function() { clone.parentNode.removeChild(clone); obj.scrollIntoView({ behavior: "smooth" }); }); }); Array.prototype.slice .call(clone.querySelectorAll("[data-up]")) .map(function(obj) { obj.addEventListener("click", function() { if (clone.previousElementSibling) { clone.parentNode.insertBefore( clone, clone.previousElementSibling ); obj.scrollIntoView({ behavior: "smooth" }); } }); }); Array.prototype.slice .call(clone.querySelectorAll("[data-down]")) .map(function(obj) { obj.addEventListener("click", function() { if (clone.nextElementSibling) { clone.parentNode.insertBefore(clone.nextElementSibling, clone); obj.scrollIntoView({ behavior: "smooth" }); } }); }); }); element.parentNode.insertBefore(button, element.nextSibling); element.parentNode.removeChild(element); if (first) { button.click(); } } }); })(window);