142 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			142 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
const adjustTableHeight = () => {
 | 
						|
    const tablesContainer = document.getElementById('tables-container');
 | 
						|
    if (!tablesContainer)
 | 
						|
        return;
 | 
						|
    const upperDistance = tablesContainer.getBoundingClientRect().top;
 | 
						|
 | 
						|
    const containerHeight = window.innerHeight - upperDistance;
 | 
						|
    tablesContainer.style.maxHeight = `calc(${containerHeight}px - 1rem)`;
 | 
						|
 | 
						|
    const tableWrappers = document.getElementsByClassName('table-wrapper');
 | 
						|
    for(let i=0; i < tableWrappers.length; i++){
 | 
						|
        const maxHeight = (window.innerHeight - upperDistance) / 2;
 | 
						|
        tableWrappers[i].style.maxHeight = `calc(${maxHeight}px - 1rem)`;
 | 
						|
    }
 | 
						|
};
 | 
						|
 | 
						|
window.addEventListener('load', () => {
 | 
						|
    const tables = $(".table").DataTable({
 | 
						|
        paging: false,
 | 
						|
        info: false,
 | 
						|
        dom: "t",
 | 
						|
        stateSave: true,
 | 
						|
        stateSaveCallback: function(settings, data) {
 | 
						|
            delete data.search;
 | 
						|
            localStorage.setItem(`DataTables_${settings.sInstance}_/tracker`, JSON.stringify(data));
 | 
						|
        },
 | 
						|
        stateLoadCallback: function(settings) {
 | 
						|
            return JSON.parse(localStorage.getItem(`DataTables_${settings.sInstance}_/tracker`));
 | 
						|
        },
 | 
						|
        columnDefs: [
 | 
						|
            {
 | 
						|
                targets: 'hours',
 | 
						|
                render: function (data, type, row) {
 | 
						|
                    if (type === "sort" || type === 'type') {
 | 
						|
                        if (data === "None")
 | 
						|
                            return -1;
 | 
						|
 | 
						|
                        return parseInt(data);
 | 
						|
                    }
 | 
						|
                    if (data === "None")
 | 
						|
                        return data;
 | 
						|
 | 
						|
                    let hours   = Math.floor(data / 3600);
 | 
						|
                    let minutes = Math.floor((data - (hours * 3600)) / 60);
 | 
						|
 | 
						|
                    if (minutes < 10) {minutes = "0"+minutes;}
 | 
						|
                    return hours+':'+minutes;
 | 
						|
                }
 | 
						|
            },
 | 
						|
            {
 | 
						|
                targets: 'number',
 | 
						|
                render: function (data, type, row) {
 | 
						|
                    if (type === "sort" || type === 'type') {
 | 
						|
                        return parseFloat(data);
 | 
						|
                    }
 | 
						|
                    return data;
 | 
						|
                }
 | 
						|
            },
 | 
						|
            {
 | 
						|
                targets: 'fraction',
 | 
						|
                render: function (data, type, row) {
 | 
						|
                    let splitted = data.split("/", 1);
 | 
						|
                    let current = splitted[0]
 | 
						|
                    if (type === "sort" || type === 'type') {
 | 
						|
                        return parseInt(current);
 | 
						|
                    }
 | 
						|
                    return data;
 | 
						|
                }
 | 
						|
            },
 | 
						|
        ],
 | 
						|
 | 
						|
        // DO NOT use the scrollX or scrollY options. They cause DataTables to split the thead from
 | 
						|
        // the tbody and render two separate tables.
 | 
						|
    });
 | 
						|
 | 
						|
    const searchBox = document.getElementById("search");
 | 
						|
    searchBox.value = tables.search();
 | 
						|
    searchBox.focus();
 | 
						|
    searchBox.select();
 | 
						|
    const doSearch = () => {
 | 
						|
        tables.search(searchBox.value);
 | 
						|
        tables.draw();
 | 
						|
    };
 | 
						|
    searchBox.addEventListener("keyup", doSearch);
 | 
						|
    window.addEventListener("keydown", (event) => {
 | 
						|
        if (!event.ctrlKey && !event.altKey && event.key.length === 1 && document.activeElement !== searchBox) {
 | 
						|
            searchBox.focus();
 | 
						|
            searchBox.select();
 | 
						|
        }
 | 
						|
        if (!event.ctrlKey && !event.altKey && !event.shiftKey && event.key === "Escape") {
 | 
						|
            if (searchBox.value !== "") {
 | 
						|
                searchBox.value = "";
 | 
						|
                doSearch();
 | 
						|
            }
 | 
						|
            searchBox.blur();
 | 
						|
            if (!document.getElementById("tables-container"))
 | 
						|
                window.scroll(0, 0);
 | 
						|
            event.preventDefault();
 | 
						|
        }
 | 
						|
    });
 | 
						|
    const tracker = document.getElementById('tracker-wrapper').getAttribute('data-tracker');
 | 
						|
    const target_second = document.getElementById('tracker-wrapper').getAttribute('data-second') + 3;
 | 
						|
 | 
						|
    function getSleepTimeSeconds(){
 | 
						|
        // -40 % 60 is -40, which is absolutely wrong and should burn
 | 
						|
        var sleepSeconds = (((target_second - new Date().getSeconds()) % 60) + 60) % 60;
 | 
						|
        return sleepSeconds || 60;
 | 
						|
    }
 | 
						|
 | 
						|
    const update = () => {
 | 
						|
        const target = $("<div></div>");
 | 
						|
        console.log("Updating Tracker...");
 | 
						|
        target.load(location.href, function (response, status) {
 | 
						|
            if (status === "success") {
 | 
						|
                target.find(".table").each(function (i, new_table) {
 | 
						|
                    const new_trs = $(new_table).find("tbody>tr");
 | 
						|
                    const old_table = tables.eq(i);
 | 
						|
                    const topscroll = $(old_table.settings()[0].nScrollBody).scrollTop();
 | 
						|
                    const leftscroll = $(old_table.settings()[0].nScrollBody).scrollLeft();
 | 
						|
                    old_table.clear();
 | 
						|
                    old_table.rows.add(new_trs).draw();
 | 
						|
                    $(old_table.settings()[0].nScrollBody).scrollTop(topscroll);
 | 
						|
                    $(old_table.settings()[0].nScrollBody).scrollLeft(leftscroll);
 | 
						|
                });
 | 
						|
                $("#multi-stream-link").replaceWith(target.find("#multi-stream-link"));
 | 
						|
            } else {
 | 
						|
                console.log("Failed to connect to Server, in order to update Table Data.");
 | 
						|
                console.log(response);
 | 
						|
            }
 | 
						|
        })
 | 
						|
        setTimeout(update, getSleepTimeSeconds()*1000);
 | 
						|
    }
 | 
						|
    setTimeout(update, getSleepTimeSeconds()*1000);
 | 
						|
 | 
						|
    window.addEventListener('resize', () => {
 | 
						|
        adjustTableHeight();
 | 
						|
        tables.draw();
 | 
						|
    });
 | 
						|
 | 
						|
    adjustTableHeight();
 | 
						|
});
 |