- 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.
		
			
				
	
	
		
			192 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			192 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
import {TotalTile} from './TotalTile.js?v=2';
 | 
						|
import {getQueryParams} from './utils/DataSource.js?v=2';
 | 
						|
import {handleAjaxError} from './utils/ErrorHandler.js?v=2';
 | 
						|
import {fireEvent} from './utils/Event.js?v=2';
 | 
						|
 | 
						|
export class Map {
 | 
						|
 | 
						|
    constructor(mapParams) {
 | 
						|
        this.config = mapParams;
 | 
						|
 | 
						|
        this.totalTile = new TotalTile();
 | 
						|
 | 
						|
        this.regions = {};
 | 
						|
 | 
						|
        const onRegionTipShow = this.onRegionTipShow.bind(this);
 | 
						|
        const onRegionClick = this.onRegionClick.bind(this);
 | 
						|
 | 
						|
        $('#world-map-markers').vectorMap({
 | 
						|
            map: 'world_mill_en',
 | 
						|
 | 
						|
            normalizeFunction: 'polynomial',
 | 
						|
            hoverOpacity: 0.7,
 | 
						|
            regionsSelectable: false,
 | 
						|
            markersSelectable: false,
 | 
						|
            zoomOnScroll: false,
 | 
						|
            hoverColor: false,
 | 
						|
 | 
						|
            series: {
 | 
						|
                regions: [
 | 
						|
                    {
 | 
						|
                        values: {},
 | 
						|
                        scale: ['#4e6964', '#01EE99'],
 | 
						|
                        normalizeFunction: 'polynomial'
 | 
						|
                    }
 | 
						|
                ]
 | 
						|
            },
 | 
						|
 | 
						|
            regionStyle: {
 | 
						|
                initial: {
 | 
						|
                    fill: '#575678'
 | 
						|
                },
 | 
						|
                selected: {
 | 
						|
                    fill: '#01EE99'
 | 
						|
                }
 | 
						|
            },
 | 
						|
 | 
						|
            onRegionTipShow: function(e, el, code) {
 | 
						|
                onRegionTipShow(el, code);
 | 
						|
            },
 | 
						|
            onRegionClick: function(e, code) {
 | 
						|
                onRegionClick(code);
 | 
						|
            },
 | 
						|
 | 
						|
            backgroundColor: '#131220'
 | 
						|
        });
 | 
						|
 | 
						|
        const onDateFilterChanged = this.onDateFilterChanged.bind(this);
 | 
						|
        window.addEventListener('dateFilterChanged', onDateFilterChanged, false);
 | 
						|
 | 
						|
        if (!this.config.sequential) {
 | 
						|
            this.loadData();
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    startLoader() {
 | 
						|
    }
 | 
						|
 | 
						|
    onRegionTipShow(tipEl, value) {
 | 
						|
        const regionValue = this.mapObject.series.regions[0].values[value];
 | 
						|
        const phrase      = this.getTooltipString(regionValue);
 | 
						|
 | 
						|
        tipEl.html(`${tipEl.html()} - ${phrase}`);
 | 
						|
    }
 | 
						|
 | 
						|
    onRegionClick(value) {
 | 
						|
        if (this.regions[value] !== undefined && this.regions[value][this.config.tooltipField] > 0) {
 | 
						|
            const url = `/country/${this.regions[value].id}`;
 | 
						|
            if (event.ctrlKey || event.metaKey) {
 | 
						|
                window.open(url, '_blank');
 | 
						|
            } else {
 | 
						|
                window.location.href = url;
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    getCountriesRegionsFromResponse(records) {
 | 
						|
        const me = this;
 | 
						|
        const regions = {};
 | 
						|
 | 
						|
        this.regions = {};
 | 
						|
 | 
						|
        records.forEach(rec => {
 | 
						|
            const country = rec.iso;
 | 
						|
            if (!regions[country]) {
 | 
						|
                regions[country] = 0;
 | 
						|
                this.regions[country] = 0;
 | 
						|
            }
 | 
						|
 | 
						|
            const value = me.getRegionValue(rec);
 | 
						|
            regions[country] = value;
 | 
						|
            this.regions[country] = {
 | 
						|
                [this.config.tooltipField]: value,
 | 
						|
                id: rec.id,
 | 
						|
            };
 | 
						|
        });
 | 
						|
 | 
						|
        return regions;
 | 
						|
    }
 | 
						|
 | 
						|
    getRegionValue(record) {
 | 
						|
        const field = this.config.tooltipField;
 | 
						|
        const value = record[field];
 | 
						|
 | 
						|
        return value;
 | 
						|
    }
 | 
						|
 | 
						|
    selectRegions(regions) {
 | 
						|
        const map  = this.mapObject;
 | 
						|
 | 
						|
        //Remove countries which does not exist in the vectormap: MU, BH, etc...
 | 
						|
        for (const [key, value] of Object.entries(regions)) {
 | 
						|
            if (!map.regions.hasOwnProperty(key)) {
 | 
						|
                delete regions[key];
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        //https://github.com/bjornd/jvectormap/issues/376
 | 
						|
        map.series.regions[0].params.min = undefined;
 | 
						|
        map.series.regions[0].params.max = undefined;
 | 
						|
 | 
						|
        map.series.regions[0].clear();
 | 
						|
        map.series.regions[0].setValues(regions);
 | 
						|
    }
 | 
						|
 | 
						|
    onDateFilterChanged() {
 | 
						|
        this.loadData();
 | 
						|
    }
 | 
						|
 | 
						|
    loadData() {
 | 
						|
        const me     = this;
 | 
						|
        const params = this.config.getParams();
 | 
						|
        const token  = document.head.querySelector('[name=\'csrf-token\'][content]').content;
 | 
						|
 | 
						|
        const data = getQueryParams(params);
 | 
						|
 | 
						|
        fireEvent('dateFilterChangedCaught');
 | 
						|
 | 
						|
        $.ajax({
 | 
						|
            type: 'get',
 | 
						|
            url: `/admin/loadMap?token=${token}`,
 | 
						|
            data: data,
 | 
						|
            scope: me,
 | 
						|
            success: me.onCountriesListLoaded,
 | 
						|
            error: handleAjaxError,
 | 
						|
            complete: function() {
 | 
						|
                fireEvent('dateFilterChangedCompleted');
 | 
						|
            },
 | 
						|
        });
 | 
						|
    }
 | 
						|
 | 
						|
    onCountriesListLoaded(data, status) {
 | 
						|
        if ('success' == status) {
 | 
						|
            const me = this.scope;
 | 
						|
 | 
						|
            const tableId = 'countries-table';
 | 
						|
 | 
						|
            me.totalTile.update(tableId, me.config.tileId, data.length);
 | 
						|
 | 
						|
            const regions = me.getCountriesRegionsFromResponse(data);
 | 
						|
 | 
						|
            me.selectRegions(regions);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    getTooltipString(value) {
 | 
						|
        value = value ? value : 0;
 | 
						|
 | 
						|
        let string = this.config.tooltipString;
 | 
						|
        if (1 !== value) {
 | 
						|
            string += 's';
 | 
						|
        }
 | 
						|
 | 
						|
        const tooltipPhrase = `${value} ${string}`;
 | 
						|
 | 
						|
        return tooltipPhrase;
 | 
						|
    }
 | 
						|
 | 
						|
    get mapObject() {
 | 
						|
        return $('#world-map-markers').vectorMap('get', 'mapObject');
 | 
						|
    }
 | 
						|
}
 |