MediaWiki:Common.js

From DDO Compendium
Revision as of 15:40, 5 May 2018 by Ague (talk | contribs) (By request, adding from: https://greasyfork.org/en/scripts/10683-wikitable-filter)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
/* Any JavaScript here will be loaded for all users on every page load. */

// ==UserScript==
// @name        Wikitable filter
// @description Filter for wiki tables using the jQuery tablesorter filter widget
// @include     *wiki*
// @require     http://code.jquery.com/jquery-1.11.3.min.js
// @require     https://cdnjs.cloudflare.com/ajax/libs/jquery.tablesorter/2.22.1/js/jquery.tablesorter.min.js
// @require     https://cdnjs.cloudflare.com/ajax/libs/jquery.tablesorter/2.22.1/js/jquery.tablesorter.widgets.js
// @version     1.1.1
// @grant       GM_info
// @namespace https://greasyfork.org/users/12797
// ==/UserScript==

// Constants

SHOW_FILTERS_CLASS = "wikitable_show_filters";
FILTERED_CLASS = "wikitable_filter_filtered";

// Globals
style_initialised = false;

// Functions

showFilters = function () {
    var tbl = $(this).next(".wikitable");
    tbl.addClass("tablesorter");
    tbl.tablesorter({
        "widgets": ["filter"],
        "widgetOptions": {
            "filter_filteredRow": FILTERED_CLASS
        }
    });
    $(this).hide();
    return false;
}

addShowFiltersButton = function () {
    var btn = $("<button/>",
        {
            "type": "button",
            "class": SHOW_FILTERS_CLASS,
            "html": "\u2261 Filters"
        }
    );
    btn.click(showFilters);
    return btn;
}

initTables = function (tbl) {
    if (tbl.length > 0) {
        if (!style_initialised) {
            // Add our stylesheet
            var styleElem = document.createElement('style');
            document.head.appendChild(styleElem);
            styleSheet = styleElem.sheet;
            styleSheet.insertRule("tr." + FILTERED_CLASS + " { display: none; }", 0);
            style_initialised = true;
        }
        // Add button to show the filters
        tbl.before(addShowFiltersButton);
    }
}

// Main

// Check if there are wiki tables on this page in the first place
var tbl = $("table.wikitable");
// Initialise them (if necessary)
initTables(tbl.has("thead").has("tbody"));
// Register observer that initialises tables that were modified to fit our
// criteria.
var tblMutationObserver = new MutationObserver(function (mutations) {
    var mutatedNodes = new Array();
    mutations.forEach(function (mutation) {
        mutatedNodes.push(mutation.target);
    });
    var jqMutatedTbl = $(mutatedNodes);
    jqMutatedTbl = jqMutatedTbl.filter(".wikitable").has("thead").has("tbody");
    jqMutatedTbl = $.unique(jqMutatedTbl);
    // Do not initialise tables twice!
    jqMutatedTbl = jqMutatedTbl.not(".tablesorter");
    if (jqMutatedTbl.length <= 0) {
        return null;
    }
    console.log(jqMutatedTbl);
    initTables(jqMutatedTbl);
});
tbl.each(function (index, node) {
    tblMutationObserver.observe(
        // node to be observed
        node,
        // options
        {"childList": true}
    );
});