MediaWiki:Common.js: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
Rbritt (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung Markierung: Zurückgesetzt |
Rbritt (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
||
| (5 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
| Zeile 1: | Zeile 1: | ||
/* Tabellenfilter */ | |||
$(function() { | $(function() { | ||
mw.loader.using(['jquery.tablesorter'], function() { | mw.loader.using(['jquery.tablesorter'], function() { | ||
$('table.filterable').each(function() { | $('table.filterable').each(function() { | ||
var $table = $(this); | var $table = $(this); | ||
// | |||
// Falls kein thead existiert, erstellen wir einen und schieben die erste Zeile rein | |||
var $thead = $table.find('thead'); | var $thead = $table.find('thead'); | ||
if ($thead.length === 0) { | if ($thead.length === 0) { | ||
$thead = $('<thead></thead>').prependTo($table); | $thead = $('<thead></thead>').prependTo($table); | ||
$table.find('tr:first').appendTo($thead); | $table.find('tr:first').appendTo($thead); | ||
} | } | ||
// Wir finden die echte Header-Zeile (die mit den Sortier-Links) | |||
var $headerRow = $thead.find('tr').first(); | var $headerRow = $thead.find('tr').first(); | ||
// | |||
var $filterRow = $('<tr class="filter-row | // Wir erstellen die Filter-Zeile | ||
// WICHTIG: Wir geben ihr die Klasse "sorttop", das ist ein MediaWiki-Standard, | |||
// um Zeilen im Header festzuhalten. | |||
var $filterRow = $('<tr class="filter-row sorttop"></tr>'); | |||
$headerRow.find('th').each(function(index) { | $headerRow.find('th').each(function(index) { | ||
var $filterCell = $('<th style="background:#f2f2f2; | var $filterCell = $('<th class="unsortable" style="background:#f2f2f2; padding:4px;"></th>'); | ||
var $select = $('<select style="width: 100%; font-weight:normal;"><option value="">(Alle)</option></select>'); | var $select = $('<select style="width:100%; font-weight:normal; font-size:0.85em;"><option value="">(Alle)</option></select>'); | ||
// Verhindert | // Verhindert das "Durchreichen" des Klicks an den Sortierer | ||
$select.on('click', function(e) { | $select.on('click mousedown', function(e) { | ||
e.stopPropagation(); | e.stopPropagation(); | ||
}); | }); | ||
// | // Werte sammeln aus dem tbody | ||
var values = []; | var values = []; | ||
$table.find('tbody tr td:nth-child(' + (index + 1) + ')').each(function() { | $table.find('tbody tr td:nth-child(' + (index + 1) + ')').each(function() { | ||
var | var txt = $(this).text().trim(); | ||
if ( | if (txt !== "" && $.inArray(txt, values) === -1) { | ||
values.push( | values.push(txt); | ||
} | } | ||
}); | }); | ||
values.sort().forEach(function( | values.sort().forEach(function(v) { | ||
$select.append($('<option></option>').val( | $select.append($('<option></option>').val(v).text(v)); | ||
}); | }); | ||
$select.on('change', function() { | $select.on('change', function() { | ||
runFilter($table); | |||
}); | }); | ||
| Zeile 47: | Zeile 51: | ||
}); | }); | ||
// Die Filter-Zeile | // Die Filter-Zeile in den thead hängen | ||
$thead.append($filterRow); | $thead.append($filterRow); | ||
// | // Dem Tablesorter sagen: "Hey, hier hat sich was geändert!" | ||
$table. | $table.trigger('update'); | ||
}); | }); | ||
}); | }); | ||
function | function runFilter($table) { | ||
var $rows = $table.find('tbody tr').not('.filter-row'); | var $rows = $table.find('tbody tr').not('.filter-row'); | ||
var $selects = $table.find('.filter-row select'); | var $selects = $table.find('.filter-row select'); | ||
| Zeile 63: | Zeile 67: | ||
var isVisible = true; | var isVisible = true; | ||
$selects.each(function( | $selects.each(function(i) { | ||
var | var val = $(this).val(); | ||
var | var cellText = $row.find('td').eq(i).text().trim(); | ||
if (val !== "" && cellText !== val) { | |||
if ( | |||
isVisible = false; | isVisible = false; | ||
return false; | return false; | ||
} | } | ||
}); | }); | ||
$row.toggle(isVisible); | $row.toggle(isVisible); | ||
}); | }); | ||
} | } | ||
}); | }); | ||
Aktuelle Version vom 24. Februar 2026, 08:27 Uhr
/* Tabellenfilter */
$(function() {
mw.loader.using(['jquery.tablesorter'], function() {
$('table.filterable').each(function() {
var $table = $(this);
// Falls kein thead existiert, erstellen wir einen und schieben die erste Zeile rein
var $thead = $table.find('thead');
if ($thead.length === 0) {
$thead = $('<thead></thead>').prependTo($table);
$table.find('tr:first').appendTo($thead);
}
// Wir finden die echte Header-Zeile (die mit den Sortier-Links)
var $headerRow = $thead.find('tr').first();
// Wir erstellen die Filter-Zeile
// WICHTIG: Wir geben ihr die Klasse "sorttop", das ist ein MediaWiki-Standard,
// um Zeilen im Header festzuhalten.
var $filterRow = $('<tr class="filter-row sorttop"></tr>');
$headerRow.find('th').each(function(index) {
var $filterCell = $('<th class="unsortable" style="background:#f2f2f2; padding:4px;"></th>');
var $select = $('<select style="width:100%; font-weight:normal; font-size:0.85em;"><option value="">(Alle)</option></select>');
// Verhindert das "Durchreichen" des Klicks an den Sortierer
$select.on('click mousedown', function(e) {
e.stopPropagation();
});
// Werte sammeln aus dem tbody
var values = [];
$table.find('tbody tr td:nth-child(' + (index + 1) + ')').each(function() {
var txt = $(this).text().trim();
if (txt !== "" && $.inArray(txt, values) === -1) {
values.push(txt);
}
});
values.sort().forEach(function(v) {
$select.append($('<option></option>').val(v).text(v));
});
$select.on('change', function() {
runFilter($table);
});
$filterCell.append($select);
$filterRow.append($filterCell);
});
// Die Filter-Zeile in den thead hängen
$thead.append($filterRow);
// Dem Tablesorter sagen: "Hey, hier hat sich was geändert!"
$table.trigger('update');
});
});
function runFilter($table) {
var $rows = $table.find('tbody tr').not('.filter-row');
var $selects = $table.find('.filter-row select');
$rows.each(function() {
var $row = $(this);
var isVisible = true;
$selects.each(function(i) {
var val = $(this).val();
var cellText = $row.find('td').eq(i).text().trim();
if (val !== "" && cellText !== val) {
isVisible = false;
return false;
}
});
$row.toggle(isVisible);
});
}
});