@stimulus-library/mixins
Version:
A library of useful controllers for Stimulus
38 lines (37 loc) • 1.71 kB
JavaScript
import { useMixin } from "./use_mixin";
export function useInjectedFragment(controller, targetElement, insertPosition, fragment, options = {}) {
const nodes = Array.from(fragment.childNodes);
const setup = () => {
const parent = targetElement.parentElement;
if (["beforebegin", "afterend"].includes(insertPosition) && parent == null) {
throw new Error("Cannot insert beforebegin into a node with no parent");
}
switch (insertPosition) {
case "beforeend":
targetElement.append(fragment);
break;
case "afterbegin":
targetElement.prepend(fragment);
break;
case "beforebegin":
parent.insertBefore(fragment, targetElement);
break;
case "afterend":
parent.insertBefore(fragment, targetElement);
break;
}
};
const teardown = options.cleanup ? () => nodes.forEach(node => node.remove()) : () => void 0;
useMixin(controller, setup, teardown);
return [nodes, teardown];
}
export function useInjectedHTML(controller, targetElement, insertPosition, html, options = {}) {
const fragment = document.createRange().createContextualFragment(html);
return useInjectedFragment(controller, targetElement, insertPosition, fragment, options);
}
export function useInjectedElement(controller, targetElement, insertPosition, element, options = {}) {
const fragment = new DocumentFragment();
fragment.append(element);
const [nodes, teardown] = useInjectedFragment(controller, targetElement, insertPosition, fragment, options);
return [nodes[0], teardown];
}