Skip to content
Snippets Groups Projects
knowledge-base-web-page-element-view.js 6.94 KiB
Newer Older
import {i18n} from './i18n';
import {html, LitElement} from 'lit-element';
import {ScopedElementsMixin} from '@open-wc/scoped-elements';
import {MiniSpinner} from 'vpu-common';
import * as commonUtils from "vpu-common/utils";
import {unsafeHTML} from 'lit-html/directives/unsafe-html.js';

/**
 * KnowledgeBaseWebPageElementView web component
 */
export class KnowledgeBaseWebPageElementView extends ScopedElementsMixin(LitElement) {
    constructor() {
        super();
        this.lang = 'de';
        this.value = '';
        this.html = '';
        this.entryPointUrl = commonUtils.getAPiUrl();
        this.error = '';
        this.eyeClose = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA1ElEQVQ4ja3SMU5CURCF4c+ejpiILe5DZAGyASuJS5CKEoMGKhdAwWKgMkriKjQWFkAkBizgmckNPEgeJ7nVuee/M3eGI2mCehFAHZ/Hgtygizd84wsjPOHsEMgUqx1njvtd4R7uAmSIMipo4SeAHtLwdTCbG8gHLsOdVlJN9LwEY4nSFsh5AhhHwGtinoY/ySDlPEAjMbvByyDDvBbgOZi/eNxUkrUTp9NJw3CCNhbJS0vcBshgWzjqAn28W899Zr1U1dBObR8kT9nGXhWFTIoA/vUHQydS/iUcHx4AAAAASUVORK5CYII=';
        this.eyeOpen = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA5UlEQVQ4jc3SvS7EURAF8B+JioSsCokHUFgNiWewQqvzICRew2v4WLFUnoNS/msrazUaFOYm12RlVeIkk9ycM2fmztzLf8U02tiPaAc3EbM4Rh8fKfo4wdxP5nXcV4YhLnGO54p/wEY2b6akHhYqfR7dVHyriMt4qsQRWtiNaw+wFwWHaaQlcc161l4UblIyXKTcM7hL5FUk14tsgsvNumIhb2NG6ISxiXMrtJI3wErZwyHeK/E2DAWLuKn0F2xLOEgdRriOeK34sc9YsIpT37dd4hFHvj7bRMxElw52sIap3xj/Hp9rzGFBhiMSxAAAAABJRU5ErkJggg==';
        //this.css = 'kb.css';
        this.text = '';
        this.class = '';
    }

    static get scopedElements() {
        return {
          'vpu-mini-spinner': MiniSpinner,
        };
    }

    _(selector) {
        return this.shadowRoot === null ? this.querySelector(selector) : this.shadowRoot.querySelector(selector);
    }

    /**
     * See: https://lit-element.polymer-project.org/guide/properties#initialize
     */
    static get properties() {
        return {
            lang: { type: String },
            value: { type: String },
            html: { type: String, attribute: false },
            entryPointUrl: { type: String, attribute: 'entry-point-url' },
            id: { type: String, attribute: false},
            error: { type: String, attribute: false},
            //css: { type: String },
            text: { type: String },
        };
    }

    /*
    connectedCallback() {
        super.connectedCallback();
        const that = this;

        // JSONLD.initialize(this.entryPointUrl, function (jsonld) {
        //     const apiUrl = jsonld.getApiUrlForEntityName("KnowledgeBaseWebPageElement") + '/' +
        //         encodeURIComponent(commonUtils.base64EncodeUnicode(encodeURIComponent(that.value)));
        // });

        // disabled, load first on toggle to visible
        window.addEventListener("vpu-auth-init", () => that.loadWebPageElement());
    }
    */

    /**
     * Loads the data from the web page element
     */
    loadWebPageElement() {
        if (window.VPUAuthToken === undefined || window.VPUAuthToken === "") {
            return;
        }

        // sadly there there is no entity url without "collectionOperations" in entity KnowledgeBaseWebPageElement!
        const apiUrl = this.entryPointUrl + "/web_page_elements/knowledge_base_web_page_elements/" +
            encodeURIComponent(commonUtils.base64EncodeUnicode(encodeURIComponent(this.value))) +
            "?lang=" + encodeURIComponent(this.lang);

        var that = this;
        fetch(apiUrl, {
            headers: {
                'Content-Type': 'application/ld+json',
                'Authorization': 'Bearer ' + window.VPUAuthToken,
            },
        })
        .then(function (res) {
            if (!res.ok) {
                let status_msg;
                switch (res.status) {
                    case 403:
                        status_msg = i18n.t('is-forbidden');
                        break;
                    case 404:
                        status_msg = i18n.t('was-not-found');
                        break;
                    case 500:
                        status_msg = i18n.t('troubled-server');
                        break;
                    default:
                        status_msg = i18n.t('unknown-problems');
                }
                const error_head = i18n.t('error-head');
                that.error = html`<p>${error_head} "<b>${that.value}</b>" ${status_msg} (${res.status}).</p>`;
                that.html = "";
                throw new Error('HTTP ' + error_head + ' ' + that.value + ' ' + status_msg + ', status = ' + res.status);
            }
            return res.json();
        })
        .then(webPageElement => {
            if (webPageElement !== undefined && webPageElement.text !== undefined) {
                that.html = webPageElement.text;
            }
        })
        // catch e.g. 404 errors
        .catch();
    }

    update(changedProperties) {
        changedProperties.forEach((oldValue, propName) => {
            if (propName === "lang") {
                i18n.changeLanguage(this.lang);
            }

            switch(propName) {
                case "lang":
                case "value":
                case "entry-point-url":
                    this.html = '';
                    const img = this._('#A2');
                    if (img !== null) {
                        img.src = this.eyeOpen;
                    }
                    const div = this._('#A1');
                    if (div !== null) {
                        div.style.display = 'none';
                    }
                    break;
                case "text":
                    this.class = this.text !== '' ? 'has-text' : '';
                    break;
            }
        });

        super.update(changedProperties);
    }

    toggle(e) {
        const div = this._('#A1');
        const img = this._('#A2');
        const d = div.style.display;
        if(d === '' || d === 'none') {
            div.style.display = 'block';
            img.src = this.eyeClose;
        } else {
            div.style.display = 'none';
            img.src = this.eyeOpen;
        }
        if (this.html === '' && div.style.display !== 'none') {
            this.html = "<vpu-mini-spinner></vpu-mini-spinner>";
            this.loadWebPageElement();
        }
    }

    render() {
        return html`
            <style>
                .kb {
                    display: none;
                    border-radius: var(--KBBorderRadius, 0);
                    border: var(--KBBorder, 0);
                    margin: var(--KBMargin, 0);
                    padding: var(--KBPadding, 0);
                }
                span.has-text img {margin-left: 5px}
                span.with-pointer { cursor: pointer; }
            </style>
            <span class="with-pointer ${this.class}" @click="${this.toggle}">${this.text}<img src="${this.eyeOpen}" id="A2" alt="open/close"></span>
            <div class='kb' id="A1">
                ${unsafeHTML(this.html)}
                ${this.error}
            </div>
        `;
    }
}