MediaWiki:Common.js: Unterschied zwischen den Versionen

Aus Primatenwiki
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Zeile 1: Zeile 1:
$(function() {
$(function() {
     console.log("Filter-Skript: Start...");
     console.log("Filter-Skript: Starte robusten Modus...");


     mw.loader.using(['jquery.tablesorter'], function() {
     mw.loader.using(['jquery.tablesorter'], function() {
         console.log("Filter-Skript: Tablesorter geladen.");
          
 
         $('table.filterable').each(function(tIndex) {
         $('table.filterable').each(function(tIndex) {
             var $table = $(this);
             var $table = $(this);
             console.log("Tabelle " + tIndex + " gefunden.");
              
 
             // Wir suchen die erste Zeile im Body oder die erste Datenzeile
             // 1. Datenzeilen finden
             var $firstDataRow = $table.find('tbody tr').first();
             var $dataRows = $table.find('tbody tr').filter(function() {
             if ($firstDataRow.length === 0) {
                return $(this).find('td').length > 0;
                 $firstDataRow = $table.find('tr').has('td').first();
            });
            console.log("Tabelle " + tIndex + ": " + $dataRows.length + " Datenzeilen erkannt.");
 
            // 2. Header finden
            var $headerRow = $table.find('thead tr').first();
             if ($headerRow.length === 0) {
                 $headerRow = $table.find('tr').has('th').first();
             }
             }


             if ($headerRow.length === 0) {
             // Filter-Zeile erstellen, aber als normale Datenzeile tarnen
                console.error("Tabelle " + tIndex + ": Kein Header (th) gefunden!");
            // Wir nutzen td statt th, damit der Tablesorter sie nicht als Header ansieht
                return;
            var $filterRow = $('<tr class="filter-row" style="background:#f2f2f2 !important; border-bottom: 2px solid #ccc;"></tr>');
            }


             // 3. Filter-Zeile erstellen
             // Wir zählen die Spalten basierend auf der ersten Datenzeile
             var $filterRow = $('<tr class="filter-row unsortable" style="background:#f9f9f9;"></tr>');
             var columnCount = $firstDataRow.find('td').length;


             $headerRow.find('th').each(function(i) {
             for (var i = 0; i < columnCount; i++) {
                 var $filterCell = $('<th class="unsortable" style="padding:2px;"></th>');
                 var $filterCell = $('<td style="padding:4px;"></td>');
                 var $select = $('<select style="width:100%; font-weight:normal; font-size:0.85em;"><option value="">(Alle)</option></select>');
                 var $select = $('<select style="width:100%; font-weight:normal; font-size:0.85em;"><option value="">(Alle)</option></select>');
                  
                  
                 // Klick-Stop für Sortierung
                 // Klick-Stop: Verhindert, dass das Klicken im Dropdown die Sortierung triggert
                 $select.on('click mousedown', function(e) { e.stopPropagation(); });
                 $select.on('click mousedown', function(e) {
                    e.stopPropagation();
                });


                 // Werte sammeln
                 // Werte sammeln aus allen Spalten (i-ter Index)
                 var values = [];
                 var values = [];
                 $dataRows.each(function() {
                 $table.find('tr').has('td').not('.filter-row').each(function() {
                     var txt = $(this).find('td').eq(i).text().trim();
                     var txt = $(this).find('td').eq(i).text().trim();
                     if (txt !== "" && $.inArray(txt, values) === -1) {
                     if (txt !== "" && $.inArray(txt, values) === -1) {
Zeile 50: Zeile 43:


                 $select.on('change', function() {
                 $select.on('change', function() {
                    console.log("Filter geändert in Spalte " + i);
                     runFilter($table);
                     runFilter($table);
                 });
                 });
Zeile 56: Zeile 48:
                 $filterCell.append($select);
                 $filterCell.append($select);
                 $filterRow.append($filterCell);
                 $filterRow.append($filterCell);
             });
             }


             // 4. Einfügen
             // Trick: Wir fügen die Filter-Zeile in den tbody ein, VOR die erste Datenzeile
             $headerRow.after($filterRow);
             $firstDataRow.before($filterRow);
             console.log("Tabelle " + tIndex + ": Filter-Zeile eingefügt.");
           
            // MediaWiki mitteilen, dass sich die Tabelle geändert hat,
            // aber wir markieren die Zeile für den Sorter als "keine Daten"
            $table.trigger('update');
           
             console.log("Tabelle " + tIndex + ": Filter erfolgreich vor Datenzeilen platziert.");
         });
         });
     });
     });


     function runFilter($table) {
     function runFilter($table) {
         var $rows = $table.find('tbody tr').not('.filter-row');
         var $rows = $table.find('tr').has('td').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 show = true;
             var isVisible = true;


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

Version vom 24. Februar 2026, 08:22 Uhr

$(function() {
    console.log("Filter-Skript: Starte robusten Modus...");

    mw.loader.using(['jquery.tablesorter'], function() {
        
        $('table.filterable').each(function(tIndex) {
            var $table = $(this);
            
            // Wir suchen die erste Zeile im Body oder die erste Datenzeile
            var $firstDataRow = $table.find('tbody tr').first();
            if ($firstDataRow.length === 0) {
                $firstDataRow = $table.find('tr').has('td').first();
            }

            // Filter-Zeile erstellen, aber als normale Datenzeile tarnen
            // Wir nutzen td statt th, damit der Tablesorter sie nicht als Header ansieht
            var $filterRow = $('<tr class="filter-row" style="background:#f2f2f2 !important; border-bottom: 2px solid #ccc;"></tr>');

            // Wir zählen die Spalten basierend auf der ersten Datenzeile
            var columnCount = $firstDataRow.find('td').length;

            for (var i = 0; i < columnCount; i++) {
                var $filterCell = $('<td style="padding:4px;"></td>');
                var $select = $('<select style="width:100%; font-weight:normal; font-size:0.85em;"><option value="">(Alle)</option></select>');
                
                // Klick-Stop: Verhindert, dass das Klicken im Dropdown die Sortierung triggert
                $select.on('click mousedown', function(e) {
                    e.stopPropagation();
                });

                // Werte sammeln aus allen Spalten (i-ter Index)
                var values = [];
                $table.find('tr').has('td').not('.filter-row').each(function() {
                    var txt = $(this).find('td').eq(i).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);
            }

            // Trick: Wir fügen die Filter-Zeile in den tbody ein, VOR die erste Datenzeile
            $firstDataRow.before($filterRow);
            
            // MediaWiki mitteilen, dass sich die Tabelle geändert hat, 
            // aber wir markieren die Zeile für den Sorter als "keine Daten"
            $table.trigger('update'); 
            
            console.log("Tabelle " + tIndex + ": Filter erfolgreich vor Datenzeilen platziert.");
        });
    });

    function runFilter($table) {
        var $rows = $table.find('tr').has('td').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);
        });
    }
});