Jump to content

User:Bradv/Scripts/Superlinks.js

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Bradv (talk | contribs) at 05:14, 15 March 2019 (clickable links in NPP flowchart). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
(function($, mw) {
    'use strict';

    var ns = mw.config.get("wgNamespaceNumber");
    if (ns >= 0) {
        var pp = {
            styleSheet: mw.util.addCSS(
                "#superlinks {display:inline-block; line-height: 24px} " +
                "#superlinks-links {font-size: 0.75em; color:#555;} " +
                "#superlinks-links label {padding: 0 0.2em;} " +
                "#superlinks-links > span:before {content: '('} " +
                "#superlinks-links > span:after {content: ') '} " +
                "#superlinks-links > span > a {text-transform: lowercase; } " +
                "#superlinks-links a {padding: 0 0.2em; color: #0645ad !important; text-decoration: none !important; } " +
                "#superlinks-links a.active, #superlinks-links a:hover {border-bottom: 2px solid #a7d7f9} " +
                "#superlinks-window {position: absolute; top: 48px; right: 5px; border: 2px solid #a7d7f9; width: 45vw; height: 75vh; box-shadow: 0px 0px 4px 2px #eee } " +
                "#superlinks-window:before {content: ''; position: absolute; top: -20px; width: 0; height: 0; border: 10px solid transparent; border-bottom-color: #a7d7f9; margin-right: -16px} " +
                "#superlinks-window:after  {content: ''; position: absolute; top: -17px; width: 0; height: 0; border: 10px solid transparent; border-bottom-color: transparent; margin-right: -16px;} " +
                "#superlinks-icons {position:absolute; left:-2px; top:-14px; font-size:10px; line-height:10px; background-color:#a7d7f9; padding: 2px 8px; } " +
                "#superlinks-icons a:not(:first-child) {margin-left: 20px} " +
                "#superlinks-icons img {height: 8px; margin-top: -1px;} " +
                "#superlinks-content {overflow: auto; height: calc(100% - 10px); width: calc(100% - 10px); font-size: 90%; padding:5px; background-color: #f6fbfe;  } " +
                "#superlinks-content > ul#pagehistory > li > input {display: none} " +
                "#superlinks-content > #empty {position:absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); color: #a7d7f9; font-size: 1.5em; font-weight: bold; text-align:center;} " +
                "#superlinks-content > #empty img {width: 30px; height: 30px; opacity:0.5;} " +
                "#superlinks-content > #empty #empty-sub {font-size: 0.8em; font-weight: normal; padding-top: 1em;} " +
                "#superlinks-content > #empty #empty-sub a {opacity: 0.5}; " +
                "#superlinks-content .mw-changeslist-separator:empty:before {content: '. .'} " +
                "#superlinks-content .mw-changeslist-links {display: inline-block; margin: 0; padding: 0} " +
                "#superlinks-content .mw-changeslist-links:before {content: '('} " +
                "#superlinks-content .mw-changeslist-links:after {content: ')'} " +
                "#superlinks-content .mw-changeslist-links > span:not(:first-child):before {content: ' | '} " +
                ""
            ),
            links: {},
            init: function () {
                function mk(caption, group) {
                    var link = document.createElement("a");
                    link.append(document.createTextNode(caption));
                    link.href="#";
                    if (group) {
                        group.append(link);
                    } else {
                        $("#superlinks-links").append(link);
                    }
                    $(link).click(pp.click);
                    return link;
                }
                function mkgroup(caption) {
                    if (caption) {
                        var lbl = document.createElement("label");
                        var t = document.createTextNode(caption);
                        lbl.append(t);
                        $("#superlinks-links").append(lbl);
                    }
                    var grp = document.createElement("span");
                    $("#superlinks-links").append(grp);
                    return grp;
                }

                var div = document.createElement("div");
                div.id="superlinks";
                $("div.mw-indicators.mw-body-content").prepend(div);
                div.append(document.createTextNode("["));
                var el = document.createElement("span");
                el.id="superlinks-links";
                div.append(el);

                pp.articleElement = $("#p-namespaces > ul > li:first-child");
                pp.talkElement = $("#ca-talk");
                pp.historyElement =  $("#ca-history");
                pp.relevantUser = mw.config.get("wgRelevantUserName");

                if (pp.articleElement.hasClass("selected")) { //on article or article history
                    if (!pp.articleElement.hasClass("new")) {
                        if (pp.historyElement.hasClass("selected")) { //on history page
                            pp.links.article = mk(pp.articleElement.find("a").text());
                        }
                        if (pp.historyElement.length && (!pp.historyElement.hasClass("selected"))) { //not on history page (but it exists)
                            pp.links.history = mk("History");
                        }
                    }
                    if (!pp.relevantUser) { //not in userspace
                        pp.links.logs = mk("Log");
                    }
                    pp.links.filter = mk("Filter");
                    if (!pp.talkElement.hasClass("new")) { //talk exists
                        pp.links.talk = mk("Talk");
                    }
                } else { //on talk or talk history
                    var pagegrp, talkgrp;
                    if (!pp.articleElement.hasClass("new")) { //article exists
                        pp.links.article = mk(pp.articleElement.find("a").text());
                        pagegrp = mkgroup();
                        pp.links.articleHistory = mk("History", pagegrp);
                        if (!pp.relevantUser) pp.links.articleLogs = mk("Log", pagegrp);
                        pp.links.articleFilter = mk("Filter", pagegrp);
                    }
                    if (!pp.talkElement.hasClass("new")) { //talk exists
                        if (pp.historyElement.hasClass("selected")) { //on history page
                            pp.links.talk = mk("Talk");
                            talkgrp = mkgroup();
                        } else {
                            talkgrp = mkgroup("Talk");
                            pp.links.history = mk("History", talkgrp);
                        }
                    } else {
                        talkgrp = mkgroup("Talk");
                    }
                    pp.links.logs = mk("Log", talkgrp);
                    pp.links.filter = mk("Filter", talkgrp);
                }

                if (pp.relevantUser) {
                    pp.relevantUser = mw.util.wikiUrlencode(pp.relevantUser);
                    var usergrp = mkgroup("User");
                    pp.links.contribs = mk("Contribs", usergrp);
                    pp.links.actions = mk("Actions", usergrp);
                    pp.links.articleLogs = mk("Log", usergrp);
                    pp.links.userFilter = mk("Filter", usergrp);
                    pp.links.blocklog = mk("Blocks", usergrp);
                }

                if (ns==0 && mw.config.get("wgPageTriagePagePrefixedText")) {
                    pp.links.nppflowchart = mk("NPP Flowchart");
                }

                if (mw.config.get("wgCategories").indexOf("Pending AfC submissions")>-1) {
                    pp.links.afcflowchart = mk("AfC Flowchart");
                }

                div.append(document.createTextNode("]"));
            },
            click: function(e) {
                function msg(text) { //blank for loading icon
                    var c = $("#superlinks-content");
                    c.empty();
                    var div = document.createElement("div");
                    div.id="empty";
                    if (text) {
                        div.append(document.createTextNode(text));
                    } else {
                        var svg = document.createElement("img");
                        svg.src="/media/wikipedia/commons/3/30/Chromiumthrobber.svg";
                        div.append(svg);
                    }
                    c.append(div);
                }
                function msgErr() {
                    var c = $("#superlinks-content");
                    c.empty();
                    var div = document.createElement("div");
                    div.id="empty";
                    c.append(div);
                    $(div).html("Error loading results.<div id='empty-sub'>Report this error <a href='/wiki/User_talk:Bradv/Scripts/Superlinks' target='_blank'>here</a>.");
                }
                function loadcheck(response, status, xhr) {
                    if(status=="success") {
                        console.log(xhr);
                        var c = $("#superlinks-content");
                        if (c.children().length===0) msg("No results");
                        $(c).find("a[href]").attr('target', '_blank');
                        try {
                            $("#superlinks-content .mw-collapsible").makeCollapsible();
                        } catch (e)
                        {}
                    } else {
                        msgErr();
                    }
                }
                function loadpopout(url) {
                    $("#superlinks-popout").remove();
                    if (url) {
                        var popout = document.createElement("a");
                        popout.id="superlinks-popout";
                        popout.href = url;
                        popout.target = "_blank";
                        var img = document.createElement("img");
                        img.src = "/media/wikipedia/commons/e/eb/OOjs_UI_icon_newWindow-ltr.svg";
                        popout.append(img);
                        $("#superlinks-icons").append(popout);
                    }
                }

                e.preventDefault();
                if (pp.active == e.target) {
                    pp.close();
                } else {
                    pp.close();
                    pp.active=e.target;
                    $(pp.active).addClass("active");
                    var wnd = document.createElement("div");
                    wnd.id="superlinks-window";
                    $("#superlinks").append(wnd);

                    var el = $(e.target)[0];
                    var pos = el.offsetParent.offsetWidth - el.offsetLeft - (el.offsetWidth/2);
                    pp.sstemp = mw.util.addCSS('#superlinks-window:before {right: ' + pos + 'px} #superlinks-window:after {right: ' + pos + 'px}');

                    var icons = document.createElement("span");
                    icons.id="superlinks-icons";
                    var closeLink = document.createElement("a");
                    closeLink.href="#";
                    closeLink.append(document.createTextNode("close"));
                    icons.append(closeLink);
                    $(closeLink).click(pp.close);
                    $(wnd).append(icons);

                    var content = document.createElement("div");
                    content.id = "superlinks-content";
                    wnd.append(content);
                    msg();

                    var url='';
                    switch (e.target) {
                        case pp.links.article:
                            url=pp.articleElement.find("a")[0].href.replace('/wiki/', '/w/index.php?action=render&title=');
                            $(content).load(url, loadcheck);
                            loadpopout(pp.articleElement.find("a")[0].href);
                            break;
                        case pp.links.articleHistory:
                            url=pp.articleElement.find("a")[0].href.replace('/wiki/', '/w/index.php?action=history&safemode=1&limit=100&title=');
                            $(content).load(url + " #pagehistory", loadcheck);
                            loadpopout(pp.articleElement.find("a")[0].href.replace('/wiki/', '/w/index.php?action=history&title='));
                            break;
                        case pp.links.talk:
                            url=$("#ca-talk > span > a")[0].href.replace('/wiki/', '/w/index.php?action=render&title=');
                            $(content).load(url, loadcheck);
                            loadpopout($("#ca-talk > span > a")[0].href);
                            break;
                        case pp.links.history:
                            url=$("#ca-history > span > a")[0].href+'&safemode=1&limit=100';
                            $(content).load(url + " #pagehistory", loadcheck);
                            loadpopout($("#ca-history > span > a")[0].href);
                            break;
                        case pp.links.articleLogs:
                            url=pp.articleElement.find("a")[0].href.replace('/wiki/', '/wiki/Special:Log?wpfilters%5B%5D=patrol&safemode=1&limit=100&page=');
                            $(content).load(url + " #mw-content-text ul", loadcheck);
                            loadpopout(pp.articleElement.find("a")[0].href.replace('/wiki/', '/wiki/Special:Log?wpfilters%5B%5D=patrol&page='));
                            break;
                        case pp.links.logs:
                            url='/w/index.php?title=Special:Log&wpfilters%5B%5D=patrol&page='+mw.config.get("wgPageName")+'&safemode=1&limit=100';
                            $(content).load(url + " #mw-content-text ul", loadcheck);
                            loadpopout('/w/index.php?title=Special:Log&wpfilters%5B%5D=patrol&page='+mw.config.get("wgPageName"));
                            break;
                        case pp.links.contribs:
                            url='/w/index.php?title=Special:Contributions/'+pp.relevantUser+'&safemode=1&limit=100';
                            $(content).load(url + " #mw-content-text ul.mw-contributions-list", loadcheck);
                            loadpopout('/w/index.php?title=Special:Contributions/'+pp.relevantUser);
                            break;
                        case pp.links.actions:
                            url='/wiki/Special:Log/' + pp.relevantUser;
                            $(content).load(url + " #mw-content-text ul", loadcheck);
                            loadpopout('/wiki/Special:Log/' + pp.relevantUser);
                            break;
                        case pp.links.blocklog:
                            url='/w/index.php?title=Special:Log/block&page='+pp.relevantUser+'&safemode=1';
                            $(content).load(url + " #mw-content-text ul", loadcheck);
                            loadpopout('/w/index.php?title=Special:Log/block&page='+pp.relevantUser);
                            break;
                        case pp.links.filter:
                            url='/w/index.php?title=Special:AbuseLog&wpSearchTitle='+mw.config.get("wgPageName")+'&safemode=1';
                            $(content).load(url + " #mw-content-text ul", loadcheck);
                            loadpopout('/w/index.php?title=Special:AbuseLog&wpSearchTitle='+mw.config.get("wgPageName"));
                            break;
                        case pp.links.articleFilter:
                            url=pp.articleElement.find("a")[0].href.replace('/wiki/', '/wiki/Special:AbuseLog?safemode=1&wpSearchTitle=');
                            $(content).load(url + " #mw-content-text ul", loadcheck);
                            loadpopout(pp.articleElement.find("a")[0].href.replace('/wiki/', '/wiki/Special:AbuseLog?wpSearchTitle='));
                            break;
                        case pp.links.userFilter:
                            url='/w/index.php?title=Special:AbuseLog&wpSearchUser='+pp.relevantUser+'&safemode=1';
                            $(content).load(url + " #mw-content-text ul", loadcheck);
                            loadpopout('/w/index.php?title=Special:AbuseLog&wpSearchUser='+pp.relevantUser);
                            break;
                        case pp.links.nppflowchart:
                            var nppsvg = document.createElement('object')
                            nppsvg.id = 'nppsvg';
                            nppsvg.data = '/media/wikipedia/en/f/f4/NPP_flowchart.svg';
                            nppsvg.type = 'image/svg+xml';
                            nppsvg.width = '100%';
                            $(content).empty().append(nppsvg);
                            break;
                        case pp.links.afcflowchart:
                            var afcimg = document.createElement('img');
                            afcimg.src = '/media/wikipedia/en/a/a8/Flow_chart_for_AFC_3.1.png';
                            afcimg.style='width: 100%';
                            $(content).empty().append(afcimg);
                            break;
                    }

                    pp.keyup = $("body").on("keyup", function(event) {
                        if (event.which == 27) {
                            pp.close();
                        }
                    });
                }
            },
            close: function(e) {
                if (e) e.preventDefault();
                $("body").off("keyup", pp.keyup);
                if (pp.sstemp) {
                    $(pp.sstemp.ownerNode).remove();
                    pp.sstemp = null;
                }
                $("#superlinks-window").remove();
                $(pp.active).removeClass("active");
                pp.active=null;
            }
        };
        pp.init();
    }
}(jQuery, mediaWiki));