MediaWiki:Common.js

Aus Primatenwiki
Zur Navigation springen Zur Suche springen

Hinweis: Leere nach dem Veröffentlichen den Browser-Cache, um die Änderungen sehen zu können.

  • Firefox/Safari: Umschalttaste drücken und gleichzeitig Aktualisieren anklicken oder entweder Ctrl+F5 oder Ctrl+R (⌘+R auf dem Mac) drücken
  • Google Chrome: Umschalttaste+Ctrl+R (⌘+Umschalttaste+R auf dem Mac) drücken
  • Internet Explorer/Edge: Ctrl+F5 drücken oder Ctrl drücken und gleichzeitig Aktualisieren anklicken
  • Opera: Ctrl+F5
$(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);
        });
    }
});