Difference between revisions of "MediaWiki:Common.js"
From Game Logs
(Revert overwrite of non-Grim code. Sorry.) |
(Add support for dynamic Right-to-Left positioning for Grimoire tooltips.) |
||
Line 16: | Line 16: | ||
return spell ? ("//thebombzen.com/grimoire/spells/" + spell) : false | return spell ? ("//thebombzen.com/grimoire/spells/" + spell) : false | ||
}; | }; | ||
+ | |||
+ | var alignPopup = function(contents) { | ||
+ | var popup = contents.parent(), | ||
+ | width = $(window).width(), | ||
+ | threshold = popup.offset().left + popup.outerWidth(); | ||
+ | popup.toggleClass("rtl", threshold > width); | ||
+ | }; | ||
+ | |||
$(".dnd5-grimoire").off("mouseover").on("mouseover", function(e) { | $(".dnd5-grimoire").off("mouseover").on("mouseover", function(e) { | ||
Line 30: | Line 38: | ||
if (embed.not(":visible")) | if (embed.not(":visible")) | ||
embed.parent().show(); | embed.parent().show(); | ||
+ | alignPopup(embed); | ||
return; | return; | ||
} | } | ||
Line 53: | Line 62: | ||
return console.log("Failed to find the DOM chunk with spell description"); | return console.log("Failed to find the DOM chunk with spell description"); | ||
embed.removeClass("dnd5-grimoire-loader").append(article); | embed.removeClass("dnd5-grimoire-loader").append(article); | ||
+ | alignPopup(embed); | ||
}) | }) | ||
.fail(function() { | .fail(function() { | ||
Line 58: | Line 68: | ||
}); | }); | ||
}); | }); | ||
− | + | ||
$(".dnd5-grimoire").off("mouseout").on("mouseout", function(e) { | $(".dnd5-grimoire").off("mouseout").on("mouseout", function(e) { | ||
var target = $(e.target).closest(".dnd5-grimoire-wrapper"); | var target = $(e.target).closest(".dnd5-grimoire-wrapper"); |
Revision as of 02:35, 6 January 2019
/* Any JavaScript here will be loaded for all users on every page load. */ /* TEMPLATE:GRIMOIRE STARTS */ $(function() { // Activate only on 5ed pages. if ((wgCategories || []).indexOf("DnD 5") === -1) return; // Convert readable spell name into a Grimoire link. var grimTextToURL = function(text) { var spell = text.trim().toLowerCase() .replace(/[^\w\d\ \-]/g, '') .replace(/\ +/g, '-'); return spell ? ("//thebombzen.com/grimoire/spells/" + spell) : false }; var alignPopup = function(contents) { var popup = contents.parent(), width = $(window).width(), threshold = popup.offset().left + popup.outerWidth(); popup.toggleClass("rtl", threshold > width); }; $(".dnd5-grimoire").off("mouseover").on("mouseover", function(e) { // Only one popup allowed. $(".dnd5-grimoire .dnd5-grimoire-wrapper").hide(); var link = $(e.target).closest(".dnd5-grimoire"), embed = link.find(".dnd5-grimoire-embed"), spellURL = grimTextToURL(link.text()); // Toggle visibility of the info div if it's already been populated. if (embed.length) { if (embed.not(":visible")) embed.parent().show(); alignPopup(embed); return; } if (!spellURL.length) return; var wrapper = $("<div></div>").addClass("dnd5-grimoire-wrapper").appendTo(link), embed = $("<div></div>").addClass("dnd5-grimoire-embed dnd5-grimoire-loader").appendTo(wrapper); // Show the block first, better with loader. // no Promises, damn. $.ajax({ "url": spellURL, "type": "get", "cache": true }) .then(function(data) { var doc = $(data); var article = doc.find("article"); if (!article.length) return console.log("Failed to find the DOM chunk with spell description"); embed.removeClass("dnd5-grimoire-loader").append(article); alignPopup(embed); }) .fail(function() { embed.removeClass("loading").html("<p>Failed to look up this spell :(</p>"); }); }); $(".dnd5-grimoire").off("mouseout").on("mouseout", function(e) { var target = $(e.target).closest(".dnd5-grimoire-wrapper"); if (!target.length) return; target.hide(); }); // Swap captions for ext-anchors to the Grim URL. $(".dnd5-grimoire").each(function() { var link = $(this); // Insert an external link to the Grimoire page on first hover. if (link.find("a").length) return; link.html( $("<a></a>").text(link.text()) .prop("href", "https:" + grimTextToURL(link.text())) .prop("target", "_blank") ); }); }); /* TEMPLATE:GRIMOIRE ENDS */ /* COLUMN-HOVER TABLE ACTUATOR STARTS */ $(function() { // Given a jQ pointer to a table cell, get a list of all cells at that pos. // Note: ignores rows that have merged cells. var getColumnCells = function(cell) { var items = [], targetPos = cell.index(); if (parseInt(cell.prop("colspan") || 1, 10) != 1) return items; cell.closest("table").find("tr").each(function() { // Make this work only on rows with no merged cells. if (parseInt($(this).find("[colspan]").prop("colspan") || 1, 10) != 1) return; var row = $(this).find("td:eq(" + targetPos + "), th:eq(" + targetPos + ")"); // either row.each(function() { items.push($(this)); }); }); return items; }; $("table.columns").on("mouseenter mouseleave", "td, th", function(e) { var cell = $(e.target).closest("td, th"), vertSiblings = getColumnCells(cell), method = e.type == "mouseenter" ? "addClass" : "removeClass"; vertSiblings.forEach(function(el) { $(el)[method]("hovered"); }); }); }); /* COLUMN-HOVER TABLE ACTUATOR ENDS */