Rodeo Bar

Rodeo resource bar to display metrics to increase visibility for CF leads and sites alike

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         Rodeo Bar
// @namespace    https://github.com/samoore036/CF-TamperMonkey-Scripts
// @version      2.2.2
// @description  Rodeo resource bar to display metrics to increase visibility for CF leads and sites alike
// @author       mooshahe
// @match        https://rodeo-iad.amazon.com/*/ExSD*
// @grant        GM.xmlHttpRequest
// @grant        GM_addStyle
// ==/UserScript==


(function() {
    'use strict';

    const fc = document.getElementById("fcpn-site-input").value;

    //Thresholds - TNS/ARNS
    //Check for setting thresholds
    let type;
    switch(fc) {
        case "SAT1":
        case "DFW6":
        case "TPA2":
        case "OAK3":
        case "BFI3":
            type = "ARNS";
            break;
        default:
            type = "TNS";
    }

    const scannedThreshold = type === "ARNS" ? 800 : 350;
    const psThreshold = type === "ARNS" ? 100 : 50;

    //get rid of current text to make room for new div
    document.getElementsByClassName('process-path-title')[0].textContent = '';
    let parentDiv = document.getElementsByClassName('process-path-title')[0].parentElement;
    editParentDiv(parentDiv);

    makeCfDisplay();

    //edit the original parent div that the new divs will go into
    function editParentDiv(div) {
        let style = div.style;
        style.paddingTop = '1rem';
        style.paddingLeft = '3rem';
        style.display = 'flex';
    }

    //make all of the divs and put it into a main div that attaches to original parent div
    function makeCfDisplay() {
        const wipDiv = makeWipDiv();
        const pickableDiv = makePickableDiv();
        const psolveDiv = makePsolveDiv();
        const scannedDiv = makeScannedDiv();
        const divs = [wipDiv, pickableDiv, psolveDiv, scannedDiv];
        makeDisplayParentDiv(divs);
    }

    //make main div
    function makeDisplayParentDiv(divs) {
        let displayDiv = document.createElement('div');
        let style = displayDiv.style;
        style.display = 'flex';
        style.gap = '1vw';
        divs.forEach(div => displayDiv.appendChild(div));
        parentDiv.appendChild(displayDiv);
    }

    //wip is picking picked + rebin buffered + sorted for TNS. ARNS is the same + induct
    function makeWipDiv() {
        let totWip, rebinBuffered, sorted, induct
        let newDiv = document.createElement('div');

        const pickingPicked = document.getElementById('PickingPickedTable').getElementsByClassName('grand-total')[0].getElementsByClassName('subtotal')[0].textContent.trim();
        if (document.getElementById('RebinBufferedTable') === null) {
            rebinBuffered = 0;
        } else {
            rebinBuffered = document.getElementById('RebinBufferedTable').getElementsByClassName('grand-total')[0].getElementsByClassName('subtotal')[0].textContent.trim();
        }
        //check if there is anything in sorted to begin with
        if (document.getElementById('SortedTable') === null) {
            sorted = 0;
        } else {
            sorted = document.getElementById('SortedTable').getElementsByClassName('grand-total')[0].getElementsByClassName('subtotal')[0].textContent.trim();
        }

        if (type === 'ARNS') {
            if (document.getElementById('InductedTable') !== null) {
                induct = document.getElementById('InductedTable').getElementsByClassName('grand-total')[0].getElementsByClassName('subtotal')[0].textContent.trim();
            }
            totWip = parseInt(pickingPicked) + parseInt(induct) + parseInt(rebinBuffered) + parseInt(sorted);
            newDiv.textContent = `Total WIP: ${totWip} | PP: ${pickingPicked} | Induct: ${induct} | Rebin: ${rebinBuffered} | Sorted: ${sorted}`;
        } else {
            totWip = parseInt(pickingPicked) + parseInt(rebinBuffered) + parseInt(sorted);
            newDiv.textContent = `Total WIP: ${totWip} | PP: ${pickingPicked} | Rebin: ${rebinBuffered} | Sorted: ${sorted}`;
        }

        styleDiv(newDiv);
        return newDiv;
    }

    //psolve will flag yellow at 80% of threshold and red at 100% of threshold
    function makePsolveDiv() {
        let psolveTot;
        if (document.getElementById('ProblemSolvingTable') === null) {
            psolveTot = 0;
        } else {
            psolveTot = document.getElementById('ProblemSolvingTable').getElementsByClassName('grand-total')[0].getElementsByClassName('subtotal')[0].textContent.trim();
        }

        let newDiv = document.createElement('div');
        let style = newDiv.style;
        if (parseInt(psolveTot) < psThreshold * .8) {
            style.backgroundColor = '#C6EFCE'; style.color = '#006100';
        }
        if (parseInt(psolveTot) >= psThreshold * .8) {
            style.backgroundColor = '#FFEB9C'; style.color = '#9C6500';
        }
        if (parseInt(psolveTot) >= psThreshold) {
            style.backgroundColor = '#FFC7CE'; style.color = '#9C0006';
        }
        newDiv.textContent = `PS: ${psolveTot}`;
        styleDiv(newDiv);
        return newDiv;
    }

    //scanned will flag yellow at 80% of threshold and red at 100% of threshold
    function makeScannedDiv() {
        let scannedTot;
        if (document.getElementById('ScannedTable') === null) {
            scannedTot = 0;
        } else {
            scannedTot = document.getElementById('ScannedTable').getElementsByClassName('grand-total')[0].getElementsByClassName('subtotal')[0].textContent.trim();
        }

        let newDiv = document.createElement('div');
        let style = newDiv.style;
        if (parseInt(scannedTot) < scannedThreshold * .8) {
            style.backgroundColor = '#C6EFCE'; style.color = '#006100';
        }
        if (parseInt(scannedTot) >= scannedThreshold * .8 ) {
            style.backgroundColor = '#FFEB9C'; style.color = '#9C6500';
        }
        if (parseInt(scannedTot) >= scannedThreshold) {
            style.backgroundColor = '#FFC7CE'; style.color = '#9C0006';
        }
        newDiv.textContent = `Scanned: ${scannedTot}`;
        styleDiv(newDiv);
        return newDiv;
    }

    //pickable is RTP TOT + PNYP TOT - RTP NP TOT - PNYP NP TOT
    function makePickableDiv() {
        let rtpTot, rtpNpTot, pnypNpTot
        if (!document.getElementById('ReadyToPickTable')) {
            rtpTot = 0;
            rtpNpTot = 0;
        } else {
            if (!document.getElementById('ReadyToPickHardCappedTable')) {
                rtpNpTot = 0
            } else {
                rtpNpTot = document.getElementById('ReadyToPickHardCappedTable').getElementsByClassName('grand-total')[0].getElementsByClassName('subtotal')[0].textContent.trim();
            }
            rtpTot = document.getElementById('ReadyToPickTable').getElementsByClassName('grand-total')[0].getElementsByClassName('subtotal')[0].textContent.trim();
        }
        
        const pnypTot = document.getElementById('PickingNotYetPickedTable').getElementsByClassName('grand-total')[0].getElementsByClassName('subtotal')[0].textContent.trim();
        if (!document.getElementById('PickingNotYetPickedHardCappedTable')) {
            pnypNpTot = 0
        } else {
            pnypNpTot = document.getElementById('PickingNotYetPickedHardCappedTable').getElementsByClassName('grand-total')[0].getElementsByClassName('subtotal')[0].textContent.trim();
        }
        const pickable = parseInt(rtpTot) + parseInt(pnypTot) - parseInt(rtpNpTot) - parseInt(pnypNpTot);

        let newDiv = document.createElement('div');
        newDiv.textContent = `Total Pickable: ${pickable}`;
        styleDiv(newDiv);
        return newDiv;
    }

    //common styling for each div
    function styleDiv(div) {
        const style = div.style;
        style.padding = '1rem';
        style.border = '1px solid #e6e6e6';
        style.borderRadius = '5px';
        style.fontSize = '1.3rem';
        style.display = 'flex';
        return div;
    }
}());