Tip of the Day
Long pressing an item opens multi-selection options in the inventory.
MediaWiki:Common.js: Difference between revisions
From Walkscape Walkthrough
mNo edit summary Tag: Reverted |
mNo edit summary Tag: Reverted |
||
| Line 222: | Line 222: | ||
} | } | ||
mw.loader.using('jquery').then(function () { | mw.loader.using('jquery').then(function () { | ||
// Attribute names (change if you prefer different ones) | |||
var TABLE_KEY_ATTR = 'data-storage-key'; // per-table storage namespace | |||
var ROW_ID_ATTR = 'data-achievement-id'; // row unique id; change if needed | |||
// | // Build a default key if none provided on the table | ||
$ | function defaultKeyForTable($table) { | ||
// | // Use page name + local index so multiple tables on one page don't collide | ||
var page = mw.config.get('wgPageName') || 'UnknownPage'; | |||
var idx = $('table.mw-lighttable').index($table); | |||
return 'ws:lightTable:' + page + ':' + idx; | |||
} | |||
function getStorageKeyForTable($table) { | |||
return $table.attr(TABLE_KEY_ATTR) || defaultKeyForTable($table); | |||
} | |||
function readMap(key) { | |||
try { | |||
var raw = localStorage.getItem(key); | |||
return raw ? JSON.parse(raw) : {}; | |||
} catch (e) { return {}; } | |||
} | |||
function writeMap(key, map) { | |||
try { | |||
localStorage.setItem(key, JSON.stringify(map)); | |||
} catch (e) { /* ignore quota errors */ } | |||
} | |||
function getRowId($tr) { | |||
return $tr.attr(ROW_ID_ATTR) || ''; // empty means "not persistable" | |||
} | |||
function applyFromStorage($root) { | |||
$root.find('table.mw-lighttable').each(function () { | |||
var $table = $(this); | |||
var key = getStorageKeyForTable($table); | |||
var map = readMap(key); | |||
var $ | $table.find('tbody tr').each(function () { | ||
var $tr = $(this); | |||
var id = getRowId($tr); | |||
if (!id) return; // skip rows without an ID | |||
var on = map[id] === 1 || map[id] === '1'; | |||
$tr.toggleClass('highlight-on', on) | |||
.attr('aria-selected', on ? 'true' : 'false'); | |||
if (!$tr.attr('tabindex')) $tr.attr('tabindex', '0'); | |||
}); | |||
}); | }); | ||
} | |||
// | function bindHandlers($root) { | ||
$root.find('table.mw-lighttable').each(function () { | |||
var $table = $(this); | |||
var key = getStorageKeyForTable($table); | |||
} | $table.off('click.mwLighttable keydown.mwLighttable'); | ||
// Click to toggle (multi-select) | |||
$table.on('click.mwLighttable', 'tbody tr', function (e) { | |||
if ($(e.target).closest('a, button, input, label, select, textarea').length) return; | |||
var $tr = $(this); | |||
var id = getRowId($tr); | |||
if (!id) return; | |||
var map = readMap(key); | |||
var on = !$tr.hasClass('highlight-on'); | |||
$tr.toggleClass('highlight-on', on).attr('aria-selected', on ? 'true' : 'false'); | |||
map[id] = on ? 1 : 0; | |||
writeMap(key, map); | |||
}); | |||
// Keyboard toggle (Space/Enter) | |||
$table.on('keydown.mwLighttable', 'tbody tr', function (e) { | |||
if (e.key === ' ' || e.key === 'Enter') { | |||
e.preventDefault(); | |||
$(this).trigger('click'); | |||
} | |||
}); | |||
}); | }); | ||
} | } | ||
// Initial | // Initial run + on content updates | ||
$(function () { | $(function () { | ||
applyFromStorage($(document)); | |||
bindHandlers($(document)); | |||
}); | |||
mw.hook('wikipage.content').add(function ($c) { | |||
applyFromStorage($c); | |||
bindHandlers($c); | |||
}); | |||
}); | }); | ||
Revision as of 02:22, 13 August 2025
/* Any JavaScript here will be loaded for all users on every page load. */
/* VARIABLES ***********************************************************************************************************************/
var currentPageUrl = window.location.href;
var currentPageEditUrl = mw.util.getUrl( null, { action: 'edit' } );
var currentPageName = mw.util.getUrl( null, null ).replace('/wiki/', '');
var currentPageNamespaceID = mw.config.get('wgNamespaceNumber');
//variables needed after page load
var buttons, contents, allLinks;
//variables needed for the infobutton
var infobutton, infopanel;
/* *********************************************************************************************************************************/
// Matomo
var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
/*
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="https://matomo.tools.walkscape.app/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '5']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
*/
/* sticky edit button */
// display the button only if #mw-content is present, if we are not in the edit mode, and if we're not in the Special: or Community: namespace
/*
if (document.body.contains(document.getElementById("mw-content")) && !currentPageUrl.includes("action=") && currentPageNamespaceID != -1 && currentPageNamespaceID != 3004) {
document.getElementById("mw-content").insertAdjacentHTML('afterbegin', '<a href="https://wiki-temp.walkscape.app/' + currentPageEditUrl + '"><div id="custom-editbutton"><svg width="40" height="40" viewBox="-12 -10 50 50"><path d="M 20 2 L 26 8 L 8 26 L 2 26 L 2 20 Z M 16 6 L 22 12"></path></svg></div></a>');
}
*/
///////////////////////////////////////// ADDING THE INFO BUTTON
var infotitle = currentPageName + '/doc';
// add the info button ONLY when we use the edit mode now
if (document.body.contains(document.getElementById("mw-content")) && (currentPageUrl.includes("action=edit") || currentPageUrl.includes("action=submit")))
{
mw.loader.using('mediawiki.api', function() {
var api = new mw.Api();
api.get( {
action: "query",
titles: [infotitle],
} ).then( function( ret ) {
$.each( ret.query.pages, function() {
if ( this.missing !== "" ) {
pageExists();
}
} );
});
function pageExists() {
api.get( {
action: 'parse',
page: infotitle,
contentmodel: 'wikitext'
} ).done( function ( data ) {
InsertInfoPanel( data.parse.text['*'] );
});
}
});
}
function InsertInfoPanel( text )
{
//check which namespace we're in and adapt the text to it
var infopanelTitle = 'Page';
if (currentPageNamespaceID == 10) { //Template
infopanelTitle = 'Template';
}
else if (currentPageNamespaceID == 828) { //Module
infopanelTitle = 'Module';
}
// insert the panel and button
document.getElementById("mw-content").insertAdjacentHTML('afterbegin', '<div id="custom-infobutton"></div><div id="custom-infopanel" style="display: none"><div id="custom-infopanel-title">' + infopanelTitle + ' Info</div><div id="custom-infopanel-content">' + text + '</div></div>');
//set up containers
infopanel = document.getElementById("custom-infopanel");
infobutton = document.getElementById("custom-infobutton");
//add an event listener to the button
infobutton.addEventListener("click", infobuttonClicked);
}
function infobuttonClicked()
{
if (infopanel.style.display == 'none')
{
infopanel.style.display = 'block';
}
else
{
infopanel.style.display = 'none';
}
}
/* rename the "DISCUSSION" talk page button to "DOCUMENTATION" */
//if there is such a button and we're in the Template: namespace
if (document.body.contains(document.getElementById("ca-talk")) && currentPageNamespaceID == 10) {
document.getElementById("ca-talk").innerHTML = '<svg class="cosmos-button-icon" width="28" height="28" viewBox="-2 -2 20 20"><path d="M 4 2 Q 4 0 6 0 L 14 0 Q 16 0 16 2 L 8 2 Q 8 0 6 0 Q 4 0 4 2 L 4 12 Q 4 14 2 14 Q 0 14 0 12 L 2 12 L 0 12 Q 0 14 2 14 L 12 14 Q 14 14 14 12 L 14 4"></path></svg><span class="cosmos-button-text">Documentation</span>';
}
/* call specific functions when the page loads */
// old browsers or already loaded
if (document.readyState!="loading") AfterPageLoad();
// modern browsers
else if (document.addEventListener) document.addEventListener("DOMContentLoaded", AfterPageLoad);
/* FUNCTIONS **********************************************************************************************************************/
function AfterPageLoad()
{
StartTabs();
}
/* Tabs */
function StartTabs()
{
buttons = document.getElementsByClassName("tab-button");
contents = document.getElementsByClassName("tab-content");
if (buttons.length > 0){
clickfunction(buttons[0]);
for (var i = 0; i < buttons.length; i++)
{
//console.log("Added Event Listener!");
buttons[i].addEventListener("click", clickfunction);
}
}
}
function clickfunction(thing) {
if (thing.id == null)
{
thing = this;
}
//buttons
for (var i = 0; i < buttons.length; i++)
{
if (buttons[i].id == thing.id)
{
buttons[i].classList.remove("tab-disabled");
buttons[i].classList.add("tab-active");
}
else
{
buttons[i].classList.remove("tab-active");
buttons[i].classList.add("tab-disabled");
}
}
//contents
for (var i = 0; i < contents.length; i++)
{
if (contents[i].id == thing.id)
{
contents[i].style.display = 'block'
}
else
{
contents[i].style.display = 'none'
}
}
}
mw.loader.using('jquery').then(function () {
// Attribute names (change if you prefer different ones)
var TABLE_KEY_ATTR = 'data-storage-key'; // per-table storage namespace
var ROW_ID_ATTR = 'data-achievement-id'; // row unique id; change if needed
// Build a default key if none provided on the table
function defaultKeyForTable($table) {
// Use page name + local index so multiple tables on one page don't collide
var page = mw.config.get('wgPageName') || 'UnknownPage';
var idx = $('table.mw-lighttable').index($table);
return 'ws:lightTable:' + page + ':' + idx;
}
function getStorageKeyForTable($table) {
return $table.attr(TABLE_KEY_ATTR) || defaultKeyForTable($table);
}
function readMap(key) {
try {
var raw = localStorage.getItem(key);
return raw ? JSON.parse(raw) : {};
} catch (e) { return {}; }
}
function writeMap(key, map) {
try {
localStorage.setItem(key, JSON.stringify(map));
} catch (e) { /* ignore quota errors */ }
}
function getRowId($tr) {
return $tr.attr(ROW_ID_ATTR) || ''; // empty means "not persistable"
}
function applyFromStorage($root) {
$root.find('table.mw-lighttable').each(function () {
var $table = $(this);
var key = getStorageKeyForTable($table);
var map = readMap(key);
$table.find('tbody tr').each(function () {
var $tr = $(this);
var id = getRowId($tr);
if (!id) return; // skip rows without an ID
var on = map[id] === 1 || map[id] === '1';
$tr.toggleClass('highlight-on', on)
.attr('aria-selected', on ? 'true' : 'false');
if (!$tr.attr('tabindex')) $tr.attr('tabindex', '0');
});
});
}
function bindHandlers($root) {
$root.find('table.mw-lighttable').each(function () {
var $table = $(this);
var key = getStorageKeyForTable($table);
$table.off('click.mwLighttable keydown.mwLighttable');
// Click to toggle (multi-select)
$table.on('click.mwLighttable', 'tbody tr', function (e) {
if ($(e.target).closest('a, button, input, label, select, textarea').length) return;
var $tr = $(this);
var id = getRowId($tr);
if (!id) return;
var map = readMap(key);
var on = !$tr.hasClass('highlight-on');
$tr.toggleClass('highlight-on', on).attr('aria-selected', on ? 'true' : 'false');
map[id] = on ? 1 : 0;
writeMap(key, map);
});
// Keyboard toggle (Space/Enter)
$table.on('keydown.mwLighttable', 'tbody tr', function (e) {
if (e.key === ' ' || e.key === 'Enter') {
e.preventDefault();
$(this).trigger('click');
}
});
});
}
// Initial run + on content updates
$(function () {
applyFromStorage($(document));
bindHandlers($(document));
});
mw.hook('wikipage.content').add(function ($c) {
applyFromStorage($c);
bindHandlers($c);
});
});
