MediaWiki:Common.js: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
Rbritt (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
Rbritt (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung Markierung: Zurückgesetzt |
||
| Zeile 1: | Zeile 1: | ||
$(function() { | $(function() { | ||
// | // Sicherstellen, dass das Tablesorter-Modul geladen ist | ||
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); | ||
// | // Header finden | ||
var $ | var $thead = $table.find('thead'); | ||
if ($thead.length === 0) { | |||
} | // Falls kein thead existiert (Standard-Wikitext), erstellen wir eine logische Trennung | ||
$thead = $('<thead></thead>').prependTo($table); | |||
var $headerRow = $ | $table.find('tr:first').appendTo($thead); | ||
var $filterRow = $('<tr class="filter-row"></tr>'); | } | ||
var $headerRow = $thead.find('tr').first(); | |||
// Die Filter-Zeile bekommt die Klasse "unsortable", damit MediaWiki sie ignoriert | |||
var $filterRow = $('<tr class="filter-row unsortable"></tr>'); | |||
$headerRow.find('th').each(function(index) { | $headerRow.find('th').each(function(index) { | ||
var $filterCell = $('<th style="background:#f2f2f2;"></th>'); | var $filterCell = $('<th style="background:#f2f2f2; cursor:default;"></th>'); | ||
var $select = $('<select style="width: 100%; | var $select = $('<select style="width: 100%; font-weight:normal;"><option value="">(Alle)</option></select>'); | ||
// Klick | // Verhindert, dass ein Klick auf das Dropdown die Sortierung der Spalte auslöst | ||
$select.on('click | $select.on('click', function(e) { | ||
e.stopPropagation(); | e.stopPropagation(); | ||
}); | }); | ||
// Werte sammeln | // Alle Werte aus den Datenzellen (td) dieser Spalte sammeln | ||
var values = []; | var values = []; | ||
$ | $table.find('tbody tr td:nth-child(' + (index + 1) + ')').each(function() { | ||
var text = $(this | var text = $(this).text().trim(); | ||
if (text !== "" && $.inArray(text, values) === -1) { | if (text !== "" && $.inArray(text, values) === -1) { | ||
values.push(text); | values.push(text); | ||
| Zeile 31: | Zeile 35: | ||
}); | }); | ||
values.sort().forEach(function(val) { | values.sort().forEach(function(val) { | ||
$select.append($('<option></option>').val(val).text(val)); | $select.append($('<option></option>').val(val).text(val)); | ||
| Zeile 37: | Zeile 40: | ||
$select.on('change', function() { | $select.on('change', function() { | ||
applyFilters($table); | |||
}); | }); | ||
| Zeile 44: | Zeile 47: | ||
}); | }); | ||
// | // Die Filter-Zeile wird fest in den Header unter die Titelzeile gehängt | ||
$ | $thead.append($filterRow); | ||
// MediaWiki sagen, dass es die Tabelle neu einlesen soll (wegen der neuen Zeile) | |||
$table.tablesorter(); | |||
}); | }); | ||
}); | }); | ||
function | function applyFilters($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'); | ||
$rows.each(function() { | $rows.each(function() { | ||
var $row = $(this); | var $row = $(this); | ||
var | var isVisible = true; | ||
$selects.each(function(index) { | $selects.each(function(index) { | ||
| Zeile 64: | Zeile 68: | ||
if (filterValue !== "" && cellValue !== filterValue) { | if (filterValue !== "" && cellValue !== filterValue) { | ||
isVisible = false; | |||
return false; | return false; // Loop abbrechen | ||
} | } | ||
}); | }); | ||
$row.toggle( | |||
$row.toggle(isVisible); | |||
}); | }); | ||
} | } | ||
}); | }); | ||
Version vom 24. Februar 2026, 08:14 Uhr
$(function() {
// Sicherstellen, dass das Tablesorter-Modul geladen ist
mw.loader.using(['jquery.tablesorter'], function() {
$('table.filterable').each(function() {
var $table = $(this);
// Header finden
var $thead = $table.find('thead');
if ($thead.length === 0) {
// Falls kein thead existiert (Standard-Wikitext), erstellen wir eine logische Trennung
$thead = $('<thead></thead>').prependTo($table);
$table.find('tr:first').appendTo($thead);
}
var $headerRow = $thead.find('tr').first();
// Die Filter-Zeile bekommt die Klasse "unsortable", damit MediaWiki sie ignoriert
var $filterRow = $('<tr class="filter-row unsortable"></tr>');
$headerRow.find('th').each(function(index) {
var $filterCell = $('<th style="background:#f2f2f2; cursor:default;"></th>');
var $select = $('<select style="width: 100%; font-weight:normal;"><option value="">(Alle)</option></select>');
// Verhindert, dass ein Klick auf das Dropdown die Sortierung der Spalte auslöst
$select.on('click', function(e) {
e.stopPropagation();
});
// Alle Werte aus den Datenzellen (td) dieser Spalte sammeln
var values = [];
$table.find('tbody tr td:nth-child(' + (index + 1) + ')').each(function() {
var text = $(this).text().trim();
if (text !== "" && $.inArray(text, values) === -1) {
values.push(text);
}
});
values.sort().forEach(function(val) {
$select.append($('<option></option>').val(val).text(val));
});
$select.on('change', function() {
applyFilters($table);
});
$filterCell.append($select);
$filterRow.append($filterCell);
});
// Die Filter-Zeile wird fest in den Header unter die Titelzeile gehängt
$thead.append($filterRow);
// MediaWiki sagen, dass es die Tabelle neu einlesen soll (wegen der neuen Zeile)
$table.tablesorter();
});
});
function applyFilters($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(index) {
var filterValue = $(this).val();
var cellValue = $row.find('td').eq(index).text().trim();
if (filterValue !== "" && cellValue !== filterValue) {
isVisible = false;
return false; // Loop abbrechen
}
});
$row.toggle(isVisible);
});
}
});