- Add CloudronStack/output/CloudronPackages-Artifacts/tirreno/ directory and its contents - Includes package manifest, Dockerfile, source code, documentation, and build artifacts - Add tirreno-1761840148.tar.gz as a build artifact - Add tirreno-cloudron-package-1761841304.tar.gz as the Cloudron package - Include all necessary files for the tirreno Cloudron package This adds the complete tirreno Cloudron package artifacts to the repository.
		
			
				
	
	
		
			207 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			207 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
import {Loader} from '../Loader.js?v=2';
 | 
						|
import {Tooltip} from '../Tooltip.js?v=2';
 | 
						|
import {fireEvent} from '../utils/Event.js?v=2';
 | 
						|
import {handleAjaxError} from '../utils/ErrorHandler.js?v=2';
 | 
						|
 | 
						|
export class BasePanel {
 | 
						|
 | 
						|
    constructor(eventParams) {
 | 
						|
        this.enrichment = eventParams.enrichment;
 | 
						|
        this.type = eventParams.type;
 | 
						|
        this.url = eventParams.url;
 | 
						|
        this.cardId = eventParams.cardId;
 | 
						|
        this.panelClosed = eventParams.panelClosed;
 | 
						|
        this.closePanel = eventParams.closePanel;
 | 
						|
        this.rowClicked = eventParams.rowClicked;
 | 
						|
 | 
						|
        this.loader = new Loader();
 | 
						|
 | 
						|
        this.itemId = null;
 | 
						|
 | 
						|
        const onCloseDetailsPanel = this.onCloseDetailsPanel.bind(this);
 | 
						|
        window.addEventListener(this.closePanel, onCloseDetailsPanel, false);
 | 
						|
 | 
						|
        const onTableRowClicked = this.onTableRowClicked.bind(this);
 | 
						|
        window.addEventListener(this.rowClicked, onTableRowClicked, false);
 | 
						|
 | 
						|
        const onKeydown = this.onKeydown.bind(this);
 | 
						|
        window.addEventListener('keydown', onKeydown, false);
 | 
						|
 | 
						|
        const onCloseButtonClick = this.onCloseButtonClick.bind(this);
 | 
						|
        this.closeButton.addEventListener('click', onCloseButtonClick, false);
 | 
						|
 | 
						|
        if (this.enrichment) {
 | 
						|
            const onEnrichmentButtonClick = this.onEnrichmentButtonClick.bind(this);
 | 
						|
            this.reenrichmentButton.addEventListener('click', onEnrichmentButtonClick, false);
 | 
						|
        }
 | 
						|
 | 
						|
        this.allPanels = {
 | 
						|
            'event':    {id: 'event-card',  closeEvent: 'eventPanelClosed'},
 | 
						|
            'logbook':  {id: 'logbook-card',closeEvent: 'logbookPanelClosed'},
 | 
						|
            'email':    {id: 'email-card',  closeEvent: 'emailPanelClosed'},
 | 
						|
            'device':   {id: 'device-card', closeEvent: 'devicePanelClosed'},
 | 
						|
            'phone':    {id: 'phone-card',  closeEvent: 'phonePanelClosed'},
 | 
						|
        };
 | 
						|
    }
 | 
						|
 | 
						|
    //https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key
 | 
						|
    onKeydown(e) {
 | 
						|
        // procced keydown even if event was processed
 | 
						|
 | 
						|
        switch (e.key) {
 | 
						|
            case 'Esc': // IE/Edge specific value
 | 
						|
            case 'Escape': {
 | 
						|
                this.close();
 | 
						|
 | 
						|
                break;
 | 
						|
            }
 | 
						|
 | 
						|
            default: {
 | 
						|
                return;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        // Cancel the default action to avoid it being handled twice
 | 
						|
        e.preventDefault();
 | 
						|
    }
 | 
						|
 | 
						|
    onEnrichmentButtonClick(e) {
 | 
						|
        this.contentDiv.classList.add('is-hidden');
 | 
						|
        this.loaderDiv.classList.remove('is-hidden');
 | 
						|
        this.card.classList.remove('is-hidden');
 | 
						|
 | 
						|
        const el = this.loaderDiv;
 | 
						|
        this.loader.start(el);
 | 
						|
 | 
						|
        this.reenrichmentButton.setAttribute('disabled', '');
 | 
						|
        this.reenrichmentButton.classList.add('is-hidden');
 | 
						|
 | 
						|
        const onEnrichmentLoaded = this.onEnrichmentLoaded.bind(this);
 | 
						|
        const token = document.head.querySelector('[name=\'csrf-token\'][content]').content;
 | 
						|
 | 
						|
        $.ajax({
 | 
						|
            url: '/admin/reenrichment',
 | 
						|
            type: 'post',
 | 
						|
            data: {type: this.type, entityId: this.itemId, token: token},
 | 
						|
            success: onEnrichmentLoaded,
 | 
						|
            error: handleAjaxError,
 | 
						|
        });
 | 
						|
    }
 | 
						|
 | 
						|
    onEnrichmentLoaded(data, status) {
 | 
						|
        if ('success' !== status || 0 === data.length) {
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
        this.loadData(this.itemId);
 | 
						|
    }
 | 
						|
 | 
						|
    onCloseButtonClick(e) {
 | 
						|
        e.preventDefault();
 | 
						|
        this.close();
 | 
						|
    }
 | 
						|
 | 
						|
    onCloseDetailsPanel() {
 | 
						|
        this.close();
 | 
						|
    }
 | 
						|
 | 
						|
    loadData(id) {
 | 
						|
        this.contentDiv.classList.add('is-hidden');
 | 
						|
        this.loaderDiv.classList.remove('is-hidden');
 | 
						|
        this.card.classList.remove('is-hidden');
 | 
						|
 | 
						|
        const el = this.loaderDiv;
 | 
						|
        this.loader.start(el);
 | 
						|
 | 
						|
        const onDetailsLoaded = this.onDetailsLoaded.bind(this);
 | 
						|
        const token = document.head.querySelector('[name=\'csrf-token\'][content]').content;
 | 
						|
 | 
						|
        $.ajax({
 | 
						|
            url: this.url,
 | 
						|
            type: 'get',
 | 
						|
            data: {id: id, token: token},
 | 
						|
            success: onDetailsLoaded,
 | 
						|
            error: handleAjaxError,
 | 
						|
        });
 | 
						|
    }
 | 
						|
 | 
						|
    onTableRowClicked({detail}) {
 | 
						|
        this.itemId = detail.itemId;
 | 
						|
        this.loadData(this.itemId);
 | 
						|
    }
 | 
						|
 | 
						|
    onDetailsLoaded(data, status) {
 | 
						|
 | 
						|
        if ('success' !== status || 0 === data.length) {
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
        data = this.proceedData(data);
 | 
						|
 | 
						|
        if (this.enrichment && data.hasOwnProperty('checked') && this.reenrichmentButton) {
 | 
						|
            if (data.checked === false && data.enrichable) {
 | 
						|
                this.reenrichmentButton.removeAttribute('disabled');
 | 
						|
                this.reenrichmentButton.classList.remove('is-hidden');
 | 
						|
            } else {
 | 
						|
                this.reenrichmentButton.setAttribute('disabled', '');
 | 
						|
                this.reenrichmentButton.classList.add('is-hidden');
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        this.loader.stop();
 | 
						|
        this.contentDiv.classList.remove('is-hidden');
 | 
						|
        this.loaderDiv.classList.add('is-hidden');
 | 
						|
 | 
						|
        let span = null;
 | 
						|
        //todo: foreach and arrow fn ?
 | 
						|
        for (const key in data) {
 | 
						|
            span = this.card.querySelector(`#details_${key}`);
 | 
						|
            if (span) {
 | 
						|
                if (data[key] instanceof Node) {
 | 
						|
                    span.replaceChildren(data[key]);
 | 
						|
                } else {
 | 
						|
                    span.innerHTML = data[key];
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        this.initTooltips();
 | 
						|
    }
 | 
						|
 | 
						|
    initTooltips() {
 | 
						|
        Tooltip.addTooltipsToEventDetailsPanel();
 | 
						|
    }
 | 
						|
 | 
						|
    proceedData(data) {
 | 
						|
 | 
						|
        return {};
 | 
						|
    }
 | 
						|
 | 
						|
    close() {
 | 
						|
        fireEvent(this.panelClosed);
 | 
						|
        this.card.classList.add('is-hidden');
 | 
						|
 | 
						|
        return false;
 | 
						|
    }
 | 
						|
 | 
						|
    get loaderDiv() {
 | 
						|
        return this.card.querySelector('div.text-loader');
 | 
						|
    }
 | 
						|
 | 
						|
    get contentDiv() {
 | 
						|
        return this.card.querySelector('div.content');
 | 
						|
    }
 | 
						|
 | 
						|
    get card() {
 | 
						|
        return document.querySelector(`.details-card#${this.cardId}`);
 | 
						|
    }
 | 
						|
 | 
						|
    get closeButton() {
 | 
						|
        return this.card.querySelector('.delete');
 | 
						|
    }
 | 
						|
 | 
						|
    get reenrichmentButton() {
 | 
						|
        return this.card.querySelector('.reenrichment-button');
 | 
						|
    }
 | 
						|
}
 |