MediaWiki:CustomFiltered.js: Difference between revisions
From The Seven Sages of Rome
Created page with "(function ($) { function init() { var $container = $('.filtered-views-container'); if (!$container.length) return; // --- Build UI bar --- var $bar = $('<div>', { id: 'smw-filter-bar', css: { marginBottom: '10px', display: 'flex', gap: '16px', alignItems: 'center', flexWrap: 'wrap' } }); var $searchInput = $('<input>', { type: 'text', id: 'smw-search-input', placeholder: 'Search all columns…', css: { paddi..." |
No edit summary |
||
| Line 4: | Line 4: | ||
if (!$container.length) return; | if (!$container.length) return; | ||
var $bar = $('<div>', { | var $bar = $('<div>', { | ||
id: 'smw-filter-bar', | id: 'smw-filter-bar', | ||
| Line 25: | Line 24: | ||
$container.before($bar); | $container.before($bar); | ||
function snapshotSMW() { | function snapshotSMW() { | ||
$container.find('tr.filtered-table-item').each(function () { | $container.find('tr.filtered-table-item').each(function () { | ||
| Line 32: | Line 30: | ||
} | } | ||
function applySearch() { | function applySearch() { | ||
var term = $.trim($searchInput.val()).toLowerCase(); | var term = $.trim($searchInput.val()).toLowerCase(); | ||
| Line 58: | Line 55: | ||
} | } | ||
// | // Disconnect observer while applySearch runs so our own | ||
// display changes don't trigger a false SMW snapshot | |||
var observer = new MutationObserver(function () { | var observer = new MutationObserver(function () { | ||
observer.disconnect(); | |||
snapshotSMW(); | snapshotSMW(); | ||
applySearch(); | applySearch(); | ||
observer.observe($container[0], observerConfig); | |||
}); | }); | ||
var observerConfig = { | |||
subtree: true, | subtree: true, | ||
attributes: true, | attributes: true, | ||
attributeFilter: ['style'] | attributeFilter: ['style'] | ||
}); | }; | ||
observer.observe($container[0], observerConfig); | |||
$searchInput.on('input', function () { | $searchInput.on('input', function () { | ||
applySearch(); | applySearch(); | ||
}); | }); | ||
snapshotSMW(); | snapshotSMW(); | ||
applySearch(); | applySearch(); | ||
Revision as of 15:13, 27 February 2026
(function ($) {
function init() {
var $container = $('.filtered-views-container');
if (!$container.length) return;
var $bar = $('<div>', {
id: 'smw-filter-bar',
css: { marginBottom: '10px', display: 'flex', gap: '16px', alignItems: 'center', flexWrap: 'wrap' }
});
var $searchInput = $('<input>', {
type: 'text',
id: 'smw-search-input',
placeholder: 'Search all columns…',
css: { padding: '5px 10px', fontSize: '14px', border: '1px solid #ccc', borderRadius: '4px', minWidth: '250px' }
});
var $counter = $('<span>', {
id: 'smw-filter-counter',
css: { fontSize: '14px', color: '#555' }
});
$bar.append($searchInput, $counter);
$container.before($bar);
function snapshotSMW() {
$container.find('tr.filtered-table-item').each(function () {
$(this).data('smw-hidden', $(this).css('display') === 'none');
});
}
function applySearch() {
var term = $.trim($searchInput.val()).toLowerCase();
var total = 0;
var visible = 0;
$container.find('tr.filtered-table-item').each(function () {
var $row = $(this);
total++;
if ($row.data('smw-hidden')) {
$row.hide();
return;
}
if (!term || $row.text().toLowerCase().indexOf(term) !== -1) {
$row.show();
visible++;
} else {
$row.hide();
}
});
$counter.text('Showing ' + visible + ' of ' + total + ' entries');
}
// Disconnect observer while applySearch runs so our own
// display changes don't trigger a false SMW snapshot
var observer = new MutationObserver(function () {
observer.disconnect();
snapshotSMW();
applySearch();
observer.observe($container[0], observerConfig);
});
var observerConfig = {
subtree: true,
attributes: true,
attributeFilter: ['style']
};
observer.observe($container[0], observerConfig);
$searchInput.on('input', function () {
applySearch();
});
snapshotSMW();
applySearch();
}
$(document).ready(function () {
init();
});
}(jQuery));