HJV.DK+

Highlight my squad-members and create some statistics about who is participating on a given HJV aktivitet under the "Deltagere" tab.

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name     HJV.DK+
// @namespace    http://tampermonkey.net/
// @version      1.3.2
// @description  Highlight my squad-members and create some statistics about who is participating on a given HJV aktivitet under the "Deltagere" tab.
// @author       Sofus Würtz
// @match        https://www.hjv.dk/oe/*/_layouts/15/*
// @icon         https://www.google.com/s2/favicons?domain=hjv.dk
// @grant        none
// @run-at      document-idle
// ==/UserScript==

(function() {
    'use strict';

    //********************* Options    *********************
    let myGRP = 2
    let myDEL = 1
    //let alsoHighlightTheesePersons = ["Sofus Peter Würtz"] //To add more, write a name within "" and seperate each name with a , all between the []. example: ["hans", "grete", "bob"]
    let highligthMyGRP = true //Auto-tick your group to auto highlight
    let seeAllPlatoons = true //Make stats in the corner for just myDEL or for both 1/2DEL in INFHVKEJY on this aktivitet. Set to true or false
    let firstColor = "red" //Colour for 1.GRP / 1.DEL (should be some kind of red)
    let secondColor = "#c6c6c6" //Colour for 2.GRP / 2.DEL (should be some kind of white/grey)
    let thirdColor = "#7fcde6" //Colour for 3.GRP / 3.DEL (should be some kind of blue)
    //To pick your own color, use the link and cop the hex value: https://www.google.com/search?client=firefox-b-d&q=colourpicker
    //********************* Options end*********************

    let orgs = new Map()
    let myOrg = myGRP + "-GRP-" + myDEL + "-INFDEL-INFHVK-EJY-HDEJY"
    let tables = document.getElementsByTagName("table")
    let orgRows = tables[1].rows

    //Check if the tables are even present (wait for us to navigate to the tab "Deltagere")
    if(!tables[0].className.includes("ms-formtable")){
        return
    }

    //Make map of how many of each org-unit (eg. '2-GRP-2-INFDEL-INFHVK-EJY-HDEJY') and highlight my group
    for (let row of orgRows){
        let org = row.cells[4].innerText
        if (!orgs.has(org)){
            orgs.set(org, [row])
        } else{
            orgs.get(org).push(row)
        }
    };

    //Highlight/remove highlight a given org depending on checkedStatus (True/False)
    function highligth(org, checkedStatus){
        let delColor = org.includes("1-INFDEL") ? firstColor : secondColor
        let grpColor = org.includes("1-GRP") ? firstColor : (org.includes("2-GRP") ? secondColor :thirdColor)
        let rowsToHighlight = orgs.get(org)
        //let style = checkedStatus ? "background: rgba(106, 150, 59, 0.73); font-weight: bold;" : ""
        let color = checkedStatus ? grpColor : ""
        let border = checkedStatus ? ("2px solid " + delColor) : ""
        let fontWeight = checkedStatus ? "bold" : ""
        rowsToHighlight.forEach(function(entry){
            //entry.style = style
            entry.style.backgroundColor = color
            entry.style.border = border
            entry.style.fontWeight = fontWeight
        })
    }

    //Add the summed fields for each group
    let re = seeAllPlatoons ? new RegExp('\\d-GRP', 'i') : new RegExp('\\d-GRP-'+ myDEL, 'i')
    let Adel = 0
    let Bdel = 0
    for (let org of orgs){
        Adel += org[0].includes("1-INFDEL") ? org[1].length : 0
        Bdel += org[0].includes("2-INFDEL") ? org[1].length : 0
        if (!re.test(org)){
            continue
        }
        let newRow = tables[0].insertRow(1)
        let myUnitShort = org[0].slice(10,15)
        let myUnit = org[0].slice(16,17) + "-DEL-" + myUnitShort
        let orgShortName = seeAllPlatoons ? org[0].slice(6,7) + "-DEL-" + org[0].slice(0,5) : org[0].slice(0,5) //Slice eg. "2-GRP-2-INFDEL-INFHVK-EJY-HDEJY " to 2-GRP-2-INFDEL or just 1-GRP
        let checkbox = "<input id='" + org[0] + "' type='checkbox'></input>"
        newRow.innerHTML = '<td class="ms-formbody"><span>' + orgShortName + '</span></td><td class="ms-formbody"><span>'+ org[1].length +'</span></td><td class=""><span>'+ checkbox +'</span></td>'

        //Let the checkboxes listen for change
        let checkboxTag = document.getElementById(org[0])
        checkboxTag.addEventListener('change', function (event, org, orgs) {
            highligth(checkboxTag.id, checkboxTag.checked)
        });
        //Highlight my GRP
        console.log(org[0] + " /= " + myOrg)
        if(highligthMyGRP & org[0].includes(myOrg)){
            checkboxTag.checked = true
            highligth(checkboxTag.id, true)
        }
    }

    //**********Sort the summed fields. courtesy https://www.w3schools.com/howto/howto_js_sort_table.asp
    var table, rows, switching, i, x, y, shouldSwitch;
    table = tables[0]
    switching = true;
    /*Make a loop that will continue until no switching has been done:*/
    while (switching) {
        //start by saying: no switching is done:
        switching = false;
        rows = table.rows;
        /*Loop through all table rows (except the first, which contains table headers):*/
        for (i = 1; i < (rows.length - 2); i++) {
            //start by saying there should be no switching:
            shouldSwitch = false;
            /*Get the two elements you want to compare, one from current row and one from the next:*/
            x = rows[i].getElementsByTagName("TD")[0];
            y = rows[i + 1].getElementsByTagName("TD")[0];
            //check if the two rows should switch place:
            if (x.innerHTML.toLowerCase() > y.innerHTML.toLowerCase()) {
                //if so, mark as a switch and break the loop:
                shouldSwitch = true;
                break;
            }
        }
        if (shouldSwitch) {
            /*If a switch has been marked, make the switch and mark that a switch has been done:*/
            rows[i].parentNode.insertBefore(rows[i + 1], rows[i]);
            switching = true;
        }
    }
    //**********Sort the summed fields. courtesy https://www.w3schools.com/howto/howto_js_sort_table.asp

    //Insert the summed DEL (plattons) as the last thing
    function insertDEL(x){
        //let tableLength = tables[0].attributes.length
        let del = x === 1 ? Adel : Bdel
        tables[0].insertRow(-1).innerHTML = '<td class="ms-formbody"><span>' + x + '-INFDEL-SAMLET</span></td><td class="ms-formbody"><span>'+ del +'</span></td>'
    }

    if(seeAllPlatoons){
        insertDEL(2)
        insertDEL(1)
    } else{
        insertDEL(myDEL)
    }

    /*const sleep = (milliseconds) => {
        return new Promise(resolve => setTimeout(resolve, milliseconds))
    }*/

    /*async function sortOnLoad(){
        console.log("doing da sleeps...")
        await sleep(1750)
        orgs.get("Org-FORK")[0].cells[4].childNodes[1].click()
    }

    sortOnLoad()*/ // Work in progress

})();