Greasy Fork

Jira board presentation mode

Add presentation mode for the JIRA rapid board for use of casting to TV through a phone. Work in progress.

// ==UserScript==
// @name         Jira board presentation mode
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  Add presentation mode for the JIRA rapid board for use of casting to TV through a phone. Work in progress.
// @author       Wesley van Beelen
// @match        *.atlassian.net/secure/RapidBoard.jspa*
// @grant        none
// @require      https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js
// ==/UserScript==


(function() {
    'use strict';

    function hideAllExcept(id) {
        var el = document.getElementById(id);
        while (el && el != document.body) {
            // go one level up
            var parent = el.parentNode;
            // get siblings of our ancesotr
            var siblings = parent.childNodes;
            // loop through the siblings of our ancestor, but skip out actual ancestor
            for (var i = 0, len = siblings.length; i < len; i++) {
                var node = siblings[i];
                if (node != el) {
                    if (node.nodeType == 1) {
                        // only operate on element nodes
                        node.style.display = "none";
                    } else if (node.nodeType == 3) {
                        // wrap text node in span object so we can hide it
                        var span = document.createElement("span");
                        span.style.display = "none";
                        span.className = "xwrap";
                        node.parentNode.insertBefore(span, node);
                        // Be wary of the dynamic siblings nodeList changing
                        // when we add nodes.
                        // It actually works here because we add one
                        // and remove one so the nodeList stays constant.
                        span.appendChild(node);
                    }
                }
            }
            el = parent;
        }
    }
    hideAllExcept("ghx-pool");

    addButton('UP', function(){$(GH.Shortcut.previousIssue('k'))}, {position: 'absolute', top: '1%', left:'10%', height:'5%', width:'15%', 'z-index': 3})
    addButton('DOWN', function(){$(GH.Shortcut.nextIssue('j'))}, {position: 'absolute', top: '1%', left:'34%', height:'5%', width:'15%', 'z-index': 3})
    addButton('<', function(){AJS.$(GH.Shortcut.previousBox('p'))}, {position: 'absolute', top: '1%', left:'58%', height:'5%', width:'15%', 'z-index': 3})
    addButton('>', function(){AJS.$(GH.Shortcut.nextBox('n'))}, {position: 'absolute', top: '1%', left:'82%', height:'5%', width:'15%', 'z-index': 3})

    function addButton(text, onclick, cssObj) {
        cssObj = cssObj || {width: '100px', height:'100px'}
        let button = document.createElement('button'), btnStyle = button.style
        document.body.appendChild(button)
        button.innerHTML = text
        button.onclick = onclick
        Object.keys(cssObj).forEach(key => btnStyle[key] = cssObj[key])
        return button
    }

})();