MediaWiki:Gadget-OralHistoryRecords-Updated.js: Difference between revisions
Appearance
No edit summary |
No edit summary Tag: Reverted |
||
| Line 1: | Line 1: | ||
/* ===== OralHistoryRecords-Updated.js | /* ===== OralHistoryRecords-Updated.js ===== */ | ||
/* global mw */ | /* global mw */ | ||
(function () { | (function () { | ||
'use strict'; | 'use strict'; | ||
var COL = { | var COL = { | ||
personKey: 'Person Key', | personKey: 'Person Key', | ||
| Line 20: | Line 19: | ||
}; | }; | ||
var PEOPLE = []; | |||
var PEOPLE = []; | |||
var FILTER = { q: '' }; | var FILTER = { q: '' }; | ||
function $(id) { return document.getElementById(id); } | function $(id) { return document.getElementById(id); } | ||
| Line 33: | Line 30: | ||
function esc(s) { | function esc(s) { | ||
return (s || '').replace(/[&<>"']/g, function (c) { | |||
return ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[c]); | return ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[c]); | ||
}); | }); | ||
| Line 40: | Line 36: | ||
function norm(s) { | function norm(s) { | ||
return (s || '') | return (s || '').toString().toLowerCase(); | ||
} | } | ||
| Line 56: | Line 48: | ||
} | } | ||
function extractUrls(value) { | function extractUrls(value) { | ||
if (!value) return []; | if (!value) return []; | ||
var re = /https?:\/\/[^\s"'<>()]+/g; | var re = /https?:\/\/[^\s"'<>()]+/g; | ||
return (value.match(re) || []); | |||
} | } | ||
function buildToolbar(root) { | function buildToolbar(root) { | ||
var toolbar = document.createElement('div'); | var toolbar = document.createElement('div'); | ||
| Line 132: | Line 62: | ||
search.type = 'search'; | search.type = 'search'; | ||
search.placeholder = 'Search names, bios…'; | search.placeholder = 'Search names, bios…'; | ||
var count = document.createElement('div'); | var count = document.createElement('div'); | ||
count.id = 'ohr-count'; | count.id = 'ohr-count'; | ||
count.className = 'ohr-count'; | count.className = 'ohr-count'; | ||
toolbar.appendChild(search); | toolbar.appendChild(search); | ||
| Line 143: | Line 71: | ||
root.insertBefore(toolbar, root.firstChild); | root.insertBefore(toolbar, root.firstChild); | ||
} | } | ||
function makeAccordionPerson(person, idx) { | function makeAccordionPerson(person, idx) { | ||
| Line 402: | Line 78: | ||
var panelId = 'ohr-panel-' + idx; | var panelId = 'ohr-panel-' + idx; | ||
var btnId = 'ohr-btn-' + idx; | var btnId = 'ohr-btn-' + idx; | ||
div.innerHTML = | div.innerHTML = | ||
'<div class="ohr-head">' + | '<div class="ohr-head">' + | ||
'<div class="ohr-titleblock">' + | |||
'<h3 class="ohr-name">' + esc(person.name) + '</h3>' + | |||
'</div>' + | |||
'<button class="ohr-acc-btn" id="' + btnId + '" type="button" aria-expanded="false" aria-controls="' + panelId + '">Details</button>' + | '<button class="ohr-acc-btn" id="' + btnId + '" type="button" aria-expanded="false" aria-controls="' + panelId + '">Details</button>' + | ||
'</div>' + | '</div>' + | ||
'<div class="ohr-acc-panel ohr-hidden" id="' + panelId + '">' + | '<div class="ohr-acc-panel ohr-hidden" id="' + panelId + '">' + | ||
person.content + | |||
'</div>'; | '</div>'; | ||
var btn = div.querySelector('#' + btnId); | var btn = div.querySelector('#' + btnId); | ||
var panel = div.querySelector('#' + panelId); | var panel = div.querySelector('#' + panelId); | ||
if (btn && panel) { | if (btn && panel) { | ||
btn.addEventListener('click', function () { | btn.addEventListener('click', function () { | ||
var | var isOpen = !panel.classList.contains('ohr-hidden'); | ||
if ( | |||
if (isOpen) { | |||
panel.classList.add('ohr-hidden'); | panel.classList.add('ohr-hidden'); | ||
div.classList.remove('is-open'); | |||
btn.setAttribute('aria-expanded', 'false'); | btn.setAttribute('aria-expanded', 'false'); | ||
btn.textContent = 'Details'; | btn.textContent = 'Details'; | ||
} else { | } else { | ||
panel.classList.remove('ohr-hidden'); | panel.classList.remove('ohr-hidden'); | ||
div.classList.add('is-open'); | |||
btn.setAttribute('aria-expanded', 'true'); | btn.setAttribute('aria-expanded', 'true'); | ||
btn.textContent = 'Hide'; | btn.textContent = 'Hide'; | ||
| Line 440: | Line 112: | ||
return div; | return div; | ||
} | } | ||
onReady(function () { | onReady(function () { | ||
if ($('ohr-directory')) { | if ($('ohr-directory')) { | ||
buildToolbar($('ohr-directory')); | |||
} | } | ||
}); | }); | ||
})(); | })(); | ||
Revision as of 17:42, 22 February 2026
/* ===== OralHistoryRecords-Updated.js ===== */
/* global mw */
(function () {
'use strict';
var COL = {
personKey: 'Person Key',
first: 'First Name',
last: 'Last Name',
birth: 'Birth Year',
death: 'Death Year',
dateFrom: 'Date From',
dateTo: 'Date To',
bio: 'Short Bio',
wiki: 'Wiki Link',
audio: 'Audio Link',
video: 'Video Link',
transcripts: 'Transcript Link'
};
var PEOPLE = [];
var FILTER = { q: '' };
function $(id) { return document.getElementById(id); }
function onReady(fn) {
if (document.readyState !== 'loading') fn();
else document.addEventListener('DOMContentLoaded', fn);
}
function esc(s) {
return (s || '').replace(/[&<>"']/g, function (c) {
return ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[c]);
});
}
function norm(s) {
return (s || '').toString().toLowerCase();
}
function debounce(fn, ms) {
var t;
return function () {
var a = arguments, self = this;
clearTimeout(t);
t = setTimeout(function () { fn.apply(self, a); }, ms);
};
}
function extractUrls(value) {
if (!value) return [];
var re = /https?:\/\/[^\s"'<>()]+/g;
return (value.match(re) || []);
}
function buildToolbar(root) {
var toolbar = document.createElement('div');
toolbar.className = 'ohr-toolbar';
var search = document.createElement('input');
search.id = 'ohr-search';
search.type = 'search';
search.placeholder = 'Search names, bios…';
var count = document.createElement('div');
count.id = 'ohr-count';
count.className = 'ohr-count';
toolbar.appendChild(search);
toolbar.appendChild(count);
root.insertBefore(toolbar, root.firstChild);
}
function makeAccordionPerson(person, idx) {
var div = document.createElement('div');
div.className = 'ohr-item';
var panelId = 'ohr-panel-' + idx;
var btnId = 'ohr-btn-' + idx;
div.innerHTML =
'<div class="ohr-head">' +
'<div class="ohr-titleblock">' +
'<h3 class="ohr-name">' + esc(person.name) + '</h3>' +
'</div>' +
'<button class="ohr-acc-btn" id="' + btnId + '" type="button" aria-expanded="false" aria-controls="' + panelId + '">Details</button>' +
'</div>' +
'<div class="ohr-acc-panel ohr-hidden" id="' + panelId + '">' +
person.content +
'</div>';
var btn = div.querySelector('#' + btnId);
var panel = div.querySelector('#' + panelId);
if (btn && panel) {
btn.addEventListener('click', function () {
var isOpen = !panel.classList.contains('ohr-hidden');
if (isOpen) {
panel.classList.add('ohr-hidden');
div.classList.remove('is-open');
btn.setAttribute('aria-expanded', 'false');
btn.textContent = 'Details';
} else {
panel.classList.remove('ohr-hidden');
div.classList.add('is-open');
btn.setAttribute('aria-expanded', 'true');
btn.textContent = 'Hide';
}
});
}
return div;
}
onReady(function () {
if ($('ohr-directory')) {
buildToolbar($('ohr-directory'));
}
});
})();