Skip to content
Snippets Groups Projects
dbp-lit-element.js 4.06 KiB
Newer Older
import {AdapterLitElement} from "./src/adapter-lit-element";
export default class DBPLitElement extends AdapterLitElement {
    constructor() {
        super();
        this.htmlOverrides = '';
    }

    /**
     * See: https://lit-element.polymer-project.org/guide/properties#initialize
     */
    static get properties() {
        return {
            ...super.properties,
            htmlOverrides: { type: String, attribute: 'html-overrides' },
        };


    connectedCallback() {
        this.updateComplete.then(() => {
            // transform all global override templates or named template slots in the light DOM to named div slots
            this.transformSlots();
    _(selector) {
        return this.shadowRoot === null ? this.querySelector(selector) : this.shadowRoot.querySelector(selector);
    }

    getTagName() {
        const tagName = this.dataset ? (this.dataset.tagName || '') : '';

        return tagName !== '' ? tagName : this.tagName.toLowerCase();
    }

     * Transforms all global override templates or named template slots in the light DOM to named div slots
        // query all named slots of the component
        const slots = this.shadowRoot.querySelectorAll("slot[name]");

        // if there are no slots we can exit
        if (slots.length === 0) {
            return;
        }

            // search if there is a template with the name of the slot in the light DOM of the component
            const templateElem = this.querySelector("template[slot=" + slotName + "]");

            if (!templateElem) {
                return;
            }

            // create a slot div container to put in the cloned template content
            const divElem = document.createElement('div');
            divElem.appendChild(templateElem.content.cloneNode(true));

            templateElem.remove();

            // put the slot div container with the cloned template in the light DOM
            this.appendChild(divElem);
        });

        // check if we have an "html-override" attribute set so we need to check for the global override template
        if (this.htmlOverrides !== '') {
            const globalOverrideTemplateElem = document.querySelector('template#' + this.htmlOverrides);

            if (globalOverrideTemplateElem) {
                // we need to clone the element so we can access the content
                const overrideTemplateElemClone = globalOverrideTemplateElem.content.cloneNode(true);
                const tagName = this.getTagName();

                // then we will look if there is an override for the current tag
                const templateOverrideElem = overrideTemplateElemClone.querySelector('template#' + tagName);

                if (templateOverrideElem) {
                    // if there is an override we again need to clone that template so we can access the content
                    const templateOverrideElemClone = templateOverrideElem.content.cloneNode(true);

                    // now we need to look for slots in the override
                    slots.forEach((slot) => {
                        const slotName = slot.name;

                        // if a slot is found we need to remove the current slot in the light DOM
                        // so we are not showing the old and new content at the same time
                        if (templateOverrideElemClone.querySelector('[slot="' + slotName + '"]')) {
                            const currentSlotElement = this.querySelector('[slot="' + slotName + '"]');

                            if (currentSlotElement) {
                                currentSlotElement.remove();
                            }
                        }
                    });

                    // append the cloned template to the light DOM
                    this.appendChild(templateOverrideElemClone);
                }
            }
        }