MediaWiki:Common.js: Difference between revisions
From Hidden Mickey Wiki
No edit summary |
No edit summary Tag: Reverted |
||
| Line 91: | Line 91: | ||
}); | }); | ||
/ | // This version runs debug data on Mac/Safari | ||
(function () { | (function () { | ||
'use strict'; | 'use strict'; | ||
// | // ============================== | ||
// DETECT SAFARI ON MAC | |||
// ============================== | |||
function isMacSafari() { | |||
const ua = navigator.userAgent; | |||
const isMac = ua.indexOf('Mac OS X') !== -1; | |||
const isSafari = /^((?!chrome|android).)*safari/i.test(ua); | |||
return isMac && isSafari; | |||
} | |||
// ============================== | |||
// SHARED CONSTANTS & FUNCTIONS | |||
// ============================== | |||
window.mwTimestamp = window.mwTimestamp || {}; | window.mwTimestamp = window.mwTimestamp || {}; | ||
window.mwTimestamp.DEBUG = window.mwTimestamp.DEBUG !== undefined ? window.mwTimestamp.DEBUG : true; | window.mwTimestamp.DEBUG = window.mwTimestamp.DEBUG !== undefined ? window.mwTimestamp.DEBUG : true; | ||
var PREFIX = 'mw-checkbox-ts:'; | |||
function dbg() { if (!window.mwTimestamp.DEBUG) return; console.log.apply(console, arguments); } | |||
function formatTime(d) { | |||
function formatTime(d) { return d.toLocaleTimeString('en-US', { hour: 'numeric', minute: '2-digit', second: '2-digit' }); } | return d.toLocaleTimeString('en-US', { hour: 'numeric', minute: '2-digit', second: '2-digit' }); | ||
} | |||
function ensureTsBox(cb) { | function ensureTsBox(cb) { | ||
if (!cb) { return null; } | if (!cb) { return null; } | ||
var tr = cb.closest && cb.closest('tr'); | var tr = cb.closest && cb.closest('tr'); | ||
if (tr) { | if (tr) { | ||
var existing = tr.querySelector && tr.querySelector('.mw-ts-box'); | var existing = tr.querySelector && tr.querySelector('.mw-ts-box'); | ||
if (existing) | if (existing) return existing; | ||
var lastCell = tr.querySelector('td:last-child, th:last-child') || tr.lastElementChild; | var lastCell = tr.querySelector('td:last-child, th:last-child') || tr.lastElementChild; | ||
if (lastCell) { | if (lastCell) { | ||
| Line 118: | Line 130: | ||
} | } | ||
} | } | ||
var td = cb.closest && cb.closest('td') || cb.parentElement; | var td = cb.closest && cb.closest('td') || cb.parentElement; | ||
if (td && td.nextElementSibling) { | if (td && td.nextElementSibling) { | ||
| Line 126: | Line 137: | ||
return ts2; | return ts2; | ||
} | } | ||
var span = document.createElement('span'); | var span = document.createElement('span'); | ||
span.className = 'mw-ts-box'; | span.className = 'mw-ts-box'; | ||
| Line 134: | Line 144: | ||
function saveState(cb, tsBox) { | function saveState(cb, tsBox) { | ||
if (!cb || !cb.id) | if (!cb || !cb.id) return; | ||
var data = { | var data = { | ||
checked: !!cb.checked, | checked: !!cb.checked, | ||
| Line 143: | Line 151: | ||
try { | try { | ||
localStorage.setItem(PREFIX + cb.id, JSON.stringify(data)); | localStorage.setItem(PREFIX + cb.id, JSON.stringify(data)); | ||
} catch (e) { | } catch (e) {} | ||
} | } | ||
function restoreOne(id, data) { | function restoreOne(id, data) { | ||
var cb = document.getElementById(id); | var cb = document.getElementById(id); | ||
if (!cb) | if (!cb) return false; | ||
cb.checked = !!data.checked; | cb.checked = !!data.checked; | ||
var tsBox = ensureTsBox(cb); | var tsBox = ensureTsBox(cb); | ||
if (tsBox) | if (tsBox) tsBox.textContent = data.timestamp || ''; | ||
return true; | return true; | ||
} | } | ||
| Line 170: | Line 170: | ||
var id = k.slice(PREFIX.length); | var id = k.slice(PREFIX.length); | ||
var json = localStorage.getItem(k); | var json = localStorage.getItem(k); | ||
if (!json) | if (!json) return; | ||
try { | try { | ||
var data = JSON.parse(json); | var data = JSON.parse(json); | ||
restoreOne(id, data); | restoreOne(id, data); | ||
} catch (e) { | } catch (e) {} | ||
}); | }); | ||
} catch (e) { | } catch (e) {} | ||
} | } | ||
| Line 189: | Line 182: | ||
restoreAllOnce(); | restoreAllOnce(); | ||
if (window.mw && mw.hook) { | if (window.mw && mw.hook) { | ||
try { | try { mw.hook('wikipage.content').add(restoreAllOnce); } catch (e) {} | ||
} | } | ||
setTimeout(restoreAllOnce, 200); | |||
setTimeout(restoreAllOnce, 1200); | |||
if (window.MutationObserver) { | if (window.MutationObserver) { | ||
try { | try { | ||
| Line 218: | Line 201: | ||
} | } | ||
} | } | ||
if (want) | if (want) restoreAllOnce(); | ||
}); | }); | ||
observer.observe(document.body, { childList: true, subtree: true }); | observer.observe(document.body, { childList: true, subtree: true }); | ||
} catch (e) { | } catch (e) {} | ||
} | } | ||
} | } | ||
function handleCheckboxEvent(ev) { | function handleCheckboxEvent(ev) { | ||
var cb = ev.target; | |||
dbg('EVENT:', ev.type, ev.target, ev.target && ev.target.tagName); | |||
if (!cb || !cb.matches || !cb.matches('.mw-checkbox-ts')) return; | |||
var tsBox = ensureTsBox(cb); | |||
tsBox.textContent = cb.checked ? formatTime(new Date()) : ''; | |||
saveState(cb, tsBox); | |||
// Safari debug panel hook | |||
if (window.mwSafariDebugPanel) { | |||
window.mwSafariDebugPanel.innerText = 'Last event: ' + ev.type + ' on #' + cb.id + ' at ' + new Date().toLocaleTimeString(); | |||
} | |||
} | |||
// ============================== | |||
// SAFARI DEBUG PANEL | |||
// ============================== | |||
function createSafariDebugPanel() { | |||
var panel = document.createElement('div'); | |||
panel.style.position = 'fixed'; | |||
panel.style.bottom = '10px'; | |||
panel.style.right = '10px'; | |||
panel.style.background = 'rgba(0, 0, 0, 0.8)'; | |||
panel.style.color = '#0f0'; | |||
panel.style.fontSize = '12px'; | |||
panel.style.padding = '6px 10px'; | |||
panel.style.borderRadius = '6px'; | |||
panel.style.zIndex = '99999'; | |||
panel.style.fontFamily = 'monospace'; | |||
panel.innerText = '🧪 Safari Debug Mode Active'; | |||
document.body.appendChild(panel); | |||
window.mwSafariDebugPanel = panel; | |||
} | |||
// ============================== | |||
// SAFARI BRANCH | |||
// ============================== | |||
function initMacSafariCode() { | |||
console.log('✅ Running Safari-only checkbox/timestamp logic'); | |||
document.addEventListener('change', handleCheckboxEvent, false); | |||
document.addEventListener('click', handleCheckboxEvent, false); | |||
if (document.readyState === 'loading') { | |||
document.addEventListener('DOMContentLoaded', function() { | |||
initRestore(); | |||
createSafariDebugPanel(); | |||
}); | |||
} else { | |||
initRestore(); | |||
createSafariDebugPanel(); | |||
} | |||
} | } | ||
// | // ============================== | ||
document.addEventListener('change', handleCheckboxEvent, false); | // GENERAL BRANCH | ||
// ============================== | |||
function initGeneralCode() { | |||
console.log('✅ Running general (non-Safari) checkbox/timestamp logic'); | |||
document.addEventListener('change', handleCheckboxEvent, false); | |||
document.addEventListener('click', handleCheckboxEvent, false); | |||
if (document.readyState === 'loading') { | |||
document.addEventListener('DOMContentLoaded', initRestore); | |||
} else { | |||
initRestore(); | |||
} | |||
} | |||
// | // ============================== | ||
// ENTRY POINT | |||
// ============================== | |||
if (isMacSafari()) { | |||
initMacSafariCode(); | |||
} else { | } else { | ||
initGeneralCode(); | |||
} | } | ||
// | // Debug helpers | ||
window.mwTimestamp.restoreAll = restoreAllOnce; | window.mwTimestamp.restoreAll = restoreAllOnce; | ||
window.mwTimestamp.listSaved = function () { | window.mwTimestamp.listSaved = function () { | ||
Revision as of 09:51, 11 October 2025
/* Any JavaScript here will be loaded for all users on every page load. */
// JavaScript code to save checkbox state and restore it when the page loads
$(document).ready(function() {
// Function to save the state of checkboxes to localStorage
function saveCheckboxState() {
$('input[type="checkbox"]').each(function() {
localStorage.setItem($(this).attr('id'), $(this).prop('checked'));
});
}
// Function to load the state of checkboxes from localStorage
function loadCheckboxState() {
$('input[type="checkbox"]').each(function() {
const savedState = localStorage.getItem($(this).attr('id'));
if (savedState !== null) {
$(this).prop('checked', savedState === 'true');
}
});
}
// Load the saved checkbox state when the page is loaded
loadCheckboxState();
// Save the checkbox state whenever a checkbox is changed
$('input[type="checkbox"]').change(function() {
saveCheckboxState();
});
});
// Adjust the search box width
$(document).ready(function () {
$('#searchInput').css('width', '600px'); // Adjust width as needed
});
// Add Edit Source to user dropdown
mw.loader.using('mediawiki.util', function () {
mw.util.addPortletLink( 'p-personal', mw.util.getUrl( mw.config.get('wgPageName'), { action: 'edit' } ), 'Edit Source', 'pt-editsource' );
mw.util.addPortletLink( 'p-personal', mw.util.getUrl( mw.config.get('wgPageName'), { action: 'history' } ), 'View History', 'pt-history' );
mw.util.addPortletLink( 'p-personal', mw.util.getUrl( mw.config.get('wgPageName'), { action: 'delete' } ), 'Delete', 'pt-delete' );
var moveLink = document.getElementById('ca-move');
if (moveLink) {
var a = moveLink.querySelector('a');
mw.util.addPortletLink( 'p-personal', a.href, a.textContent.trim(), 'pt-move', a.title || 'Move this page' );
moveLink.remove();
}
mw.util.addPortletLink( 'p-personal', mw.util.getUrl( mw.config.get('wgPageName'), { action: 'protect' } ), 'Protect', 'pt-protect' );
mw.util.addPortletLink( 'p-personal', mw.util.getUrl( mw.config.get('wgPageName'), { action: 'unwatch' } ), 'Unwatch', 'pt-unwatch' );
var talkLink = document.getElementById('pt-mytalk');
talkLink.remove();
var whatLinksHereLink = document.getElementById('t-whatlinkshere');
if (whatLinksHereLink) {
var a = whatLinksHereLink.querySelector('a');
mw.util.addPortletLink( 'p-personal', a.href, a.textContent.trim(), 'pt-whatlinkshere', a.title || 'What Links Here' );
whatLinksHereLink.remove();
}
var relatedChangesLink = document.getElementById('t-recentchangeslinked');
if (relatedChangesLink) {
var a = relatedChangesLink.querySelector('a');
mw.util.addPortletLink( 'p-personal', a.href, a.textContent.trim(), 'pt-recentchanges', a.title || 'Recent Changes' );
relatedChangesLink.remove();
}
var uploadLink = document.getElementById('t-upload');
if (uploadLink) {
var a = uploadLink.querySelector('a');
mw.util.addPortletLink( 'p-personal', a.href, a.textContent.trim(), 'pt-upload', a.title || 'Upload File' );
uploadLink.remove();
}
var specialPagesLink = document.getElementById('t-specialpages');
if (specialPagesLink) {
var a = specialPagesLink.querySelector('a');
mw.util.addPortletLink( 'p-personal', a.href, a.textContent.trim(), 'pt-specialpages', a.title || 'Special Pages' );
specialPagesLink.remove();
}
var permanentLink = document.getElementById('t-permalink');
if (permanentLink) {
var a = permanentLink.querySelector('a');
mw.util.addPortletLink( 'p-personal', a.href, a.textContent.trim(), 'pt-permalink', a.title || 'Permanent Link' );
permanentLink.remove();
}
var pageInfoLink = document.getElementById('t-info');
if (pageInfoLink) {
var a = pageInfoLink.querySelector('a');
mw.util.addPortletLink( 'p-personal', a.href, a.textContent.trim(), 'pt-info', a.title || 'Page Info' );
pageInfoLink.remove();
}
var printLink = document.getElementById('t-print');
if (printLink) {
var a = printLink.querySelector('a');
printLink.remove();
}
});
// This version runs debug data on Mac/Safari
(function () {
'use strict';
// ==============================
// DETECT SAFARI ON MAC
// ==============================
function isMacSafari() {
const ua = navigator.userAgent;
const isMac = ua.indexOf('Mac OS X') !== -1;
const isSafari = /^((?!chrome|android).)*safari/i.test(ua);
return isMac && isSafari;
}
// ==============================
// SHARED CONSTANTS & FUNCTIONS
// ==============================
window.mwTimestamp = window.mwTimestamp || {};
window.mwTimestamp.DEBUG = window.mwTimestamp.DEBUG !== undefined ? window.mwTimestamp.DEBUG : true;
var PREFIX = 'mw-checkbox-ts:';
function dbg() { if (!window.mwTimestamp.DEBUG) return; console.log.apply(console, arguments); }
function formatTime(d) {
return d.toLocaleTimeString('en-US', { hour: 'numeric', minute: '2-digit', second: '2-digit' });
}
function ensureTsBox(cb) {
if (!cb) { return null; }
var tr = cb.closest && cb.closest('tr');
if (tr) {
var existing = tr.querySelector && tr.querySelector('.mw-ts-box');
if (existing) return existing;
var lastCell = tr.querySelector('td:last-child, th:last-child') || tr.lastElementChild;
if (lastCell) {
var ts = lastCell.querySelector('.mw-ts-box');
if (!ts) { ts = document.createElement('span'); ts.className = 'mw-ts-box'; lastCell.appendChild(ts); }
return ts;
}
}
var td = cb.closest && cb.closest('td') || cb.parentElement;
if (td && td.nextElementSibling) {
var next = td.nextElementSibling;
var ts2 = next.querySelector && next.querySelector('.mw-ts-box');
if (!ts2) { ts2 = document.createElement('span'); ts2.className = 'mw-ts-box'; next.appendChild(ts2); }
return ts2;
}
var span = document.createElement('span');
span.className = 'mw-ts-box';
if (cb.parentNode) cb.parentNode.insertBefore(span, cb.nextSibling);
return span;
}
function saveState(cb, tsBox) {
if (!cb || !cb.id) return;
var data = {
checked: !!cb.checked,
timestamp: tsBox ? tsBox.textContent : ''
};
try {
localStorage.setItem(PREFIX + cb.id, JSON.stringify(data));
} catch (e) {}
}
function restoreOne(id, data) {
var cb = document.getElementById(id);
if (!cb) return false;
cb.checked = !!data.checked;
var tsBox = ensureTsBox(cb);
if (tsBox) tsBox.textContent = data.timestamp || '';
return true;
}
function restoreAllOnce() {
try {
var keys = Object.keys(localStorage);
keys.forEach(function (k) {
if (k.indexOf(PREFIX) !== 0) return;
var id = k.slice(PREFIX.length);
var json = localStorage.getItem(k);
if (!json) return;
try {
var data = JSON.parse(json);
restoreOne(id, data);
} catch (e) {}
});
} catch (e) {}
}
function initRestore() {
restoreAllOnce();
if (window.mw && mw.hook) {
try { mw.hook('wikipage.content').add(restoreAllOnce); } catch (e) {}
}
setTimeout(restoreAllOnce, 200);
setTimeout(restoreAllOnce, 1200);
if (window.MutationObserver) {
try {
var observer = new MutationObserver(function (mutations) {
var want = false;
for (var i = 0; i < mutations.length && !want; i++) {
var added = mutations[i].addedNodes;
for (var j = 0; j < added.length && !want; j++) {
var node = added[j];
if (node.nodeType !== 1) continue;
if (node.matches && node.matches('.mw-checkbox-ts')) want = true;
if (node.querySelector && (node.querySelector('.mw-checkbox-ts') || node.querySelector('.mw-ts-box'))) want = true;
}
}
if (want) restoreAllOnce();
});
observer.observe(document.body, { childList: true, subtree: true });
} catch (e) {}
}
}
function handleCheckboxEvent(ev) {
var cb = ev.target;
dbg('EVENT:', ev.type, ev.target, ev.target && ev.target.tagName);
if (!cb || !cb.matches || !cb.matches('.mw-checkbox-ts')) return;
var tsBox = ensureTsBox(cb);
tsBox.textContent = cb.checked ? formatTime(new Date()) : '';
saveState(cb, tsBox);
// Safari debug panel hook
if (window.mwSafariDebugPanel) {
window.mwSafariDebugPanel.innerText = 'Last event: ' + ev.type + ' on #' + cb.id + ' at ' + new Date().toLocaleTimeString();
}
}
// ==============================
// SAFARI DEBUG PANEL
// ==============================
function createSafariDebugPanel() {
var panel = document.createElement('div');
panel.style.position = 'fixed';
panel.style.bottom = '10px';
panel.style.right = '10px';
panel.style.background = 'rgba(0, 0, 0, 0.8)';
panel.style.color = '#0f0';
panel.style.fontSize = '12px';
panel.style.padding = '6px 10px';
panel.style.borderRadius = '6px';
panel.style.zIndex = '99999';
panel.style.fontFamily = 'monospace';
panel.innerText = '🧪 Safari Debug Mode Active';
document.body.appendChild(panel);
window.mwSafariDebugPanel = panel;
}
// ==============================
// SAFARI BRANCH
// ==============================
function initMacSafariCode() {
console.log('✅ Running Safari-only checkbox/timestamp logic');
document.addEventListener('change', handleCheckboxEvent, false);
document.addEventListener('click', handleCheckboxEvent, false);
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', function() {
initRestore();
createSafariDebugPanel();
});
} else {
initRestore();
createSafariDebugPanel();
}
}
// ==============================
// GENERAL BRANCH
// ==============================
function initGeneralCode() {
console.log('✅ Running general (non-Safari) checkbox/timestamp logic');
document.addEventListener('change', handleCheckboxEvent, false);
document.addEventListener('click', handleCheckboxEvent, false);
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initRestore);
} else {
initRestore();
}
}
// ==============================
// ENTRY POINT
// ==============================
if (isMacSafari()) {
initMacSafariCode();
} else {
initGeneralCode();
}
// Debug helpers
window.mwTimestamp.restoreAll = restoreAllOnce;
window.mwTimestamp.listSaved = function () {
return Object.keys(localStorage).filter(function (k) { return k.indexOf(PREFIX) === 0; });
};
window.mwTimestamp.getSaved = function (id) {
var j = localStorage.getItem(PREFIX + id);
try { return j ? JSON.parse(j) : null; } catch (e) { dbg('getSaved parse error', e); return null; }
};
})();