MediaWiki:Common.js: Unterschied zwischen den Versionen

Aus Primatenwiki
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
(7 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
/* Tabellenfilter */
$(function() {
$(function() {
     $('table.filterable').each(function() {
     mw.loader.using(['jquery.tablesorter'], function() {
        var $table = $(this);
       
        var $headerRow = $table.find('tr').first();
        $('table.filterable').each(function() {
        var $filterRow = $('<tr class="filter-row"></tr>');
            var $table = $(this);
        var $rows = $table.find('tbody > tr').not(':first');
           
            // 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);
            }


        $headerRow.find('th').each(function(index) {
            // Wir finden die echte Header-Zeile (die mit den Sortier-Links)
             var $filterCell = $('<th></th>');
             var $headerRow = $thead.find('tr').first();
            var $select = $('<select style="width: 100%;"><option value="">Alle</option></select>');
              
              
             // Eindeutige Werte aus der Spalte sammeln
             // Wir erstellen die Filter-Zeile
             var values = [];
            // WICHTIG: Wir geben ihr die Klasse "sorttop", das ist ein MediaWiki-Standard,
             $rows.each(function() {
            // um Zeilen im Header festzuhalten.
                 var val = $(this).find('td').eq(index).text().trim();
             var $filterRow = $('<tr class="filter-row sorttop"></tr>');
                if (val && $.inArray(val, values) === -1) {
 
                    values.push(val);
             $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));
                });


            // Werte sortieren und als Optionen hinzufügen
                 $select.on('change', function() {
            values.sort().forEach(function(val) {
                    runFilter($table);
                 $select.append($('<option></option>').val(val).html(val));
                });
            });


            $select.on('change', function() {
                $filterCell.append($select);
                 filterTable($table);
                 $filterRow.append($filterCell);
             });
             });


             $filterCell.append($select);
            // Die Filter-Zeile in den thead hängen
             $filterRow.append($filterCell);
             $thead.append($filterRow);
           
            // Dem Tablesorter sagen: "Hey, hier hat sich was geändert!"
             $table.trigger('update');
         });
         });
        $headerRow.after($filterRow);
     });
     });


     function filterTable($table) {
     function runFilter($table) {
         var $rows = $table.find('tbody > tr').not(':first').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 showRow = true;
             var isVisible = true;


             $selects.each(function(index) {
             $selects.each(function(i) {
                 var filterValue = $(this).val();
                 var val = $(this).val();
                 var cellValue = $row.find('td').eq(index).text().trim();
                 var cellText = $row.find('td').eq(i).text().trim();
 
                 if (val !== "" && cellText !== val) {
                 if (filterValue !== "" && cellValue !== filterValue) {
                     isVisible = false;
                     showRow = false;
                     return false;
                     return false;
                 }
                 }
             });
             });
 
             $row.toggle(isVisible);
             $row.toggle(showRow);
         });
         });
     }
     }
});
});

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);
        });
    }
});