MediaWiki:Common.js: Difference between revisions

no edit summary
No edit summary
Tag: Reverted
No edit summary
Tag: Manual revert
Line 779: Line 779:
         }
         }
     });
     });
});
/* All JavaScript here will be loaded for users of the mobile site */
// Simple custom table sorting that doesn't rely on MediaWiki modules
function initMobileSorting() {
    console.log('Initializing simple mobile sorting...');
   
    // Apply custom table sorting on both mobile and desktop
    console.log('Applying custom table sorting for all devices');
   
    var tables = document.querySelectorAll('.wikitable, table.sortable');
    console.log('Found tables:', tables.length);
   
    $(tables).each(function(index, table) {
        setupTableSorting($(table), index);
    });
}
// Separate function to setup sorting for a single table
function setupTableSorting($table, tableIndex) {
    var $headers = $table.find('th');
   
    if ($headers.length === 0) return;
   
    console.log('Setting up table', tableIndex, 'with', $headers.length, 'headers');
   
    // Remove any existing event handlers to avoid duplicates
    $table.off('click.tablesort');
   
    // Style headers and add sort indicators
    $headers.each(function() {
        var $header = $(this);
       
        // Style header
        $header.css({
            'cursor': 'pointer',
            'user-select': 'none',
            'background-color': '#f8f9fa',
            'border-bottom': '2px solid #a2a9b1',
            'position': 'relative'
        });
       
        // Remove existing arrows and add new ones
        $header.find('.sort-arrow').remove();
        $header.append('<span class="sort-arrow" style="margin-left: 5px; color: #666; font-size: 12px;">⇅</span>');
    });
   
    // Use event delegation on the table
    $table.on('click.tablesort', 'th', function(e) {
        e.preventDefault();
        e.stopPropagation();
       
        var $clickedHeader = $(this);
        var columnIndex = $clickedHeader.index();
       
        console.log('Header clicked - Column:', columnIndex);
       
        // Get fresh references
        var $allHeaders = $table.find('th');
        var $dataRows = $table.find('tbody tr');
       
        // If no tbody, get all rows except header
        if ($dataRows.length === 0) {
            $dataRows = $table.find('tr').not($table.find('tr').first());
        }
       
        if ($dataRows.length === 0) {
            console.log('No data rows found');
            return;
        }
       
        console.log('Found', $dataRows.length, 'data rows to sort');
       
        // Determine sort direction based on current state
        var currentSortClass = $clickedHeader.hasClass('sort-asc') ? 'asc' :
                              $clickedHeader.hasClass('sort-desc') ? 'desc' : 'none';
        var newSortDirection = currentSortClass === 'asc' ? 'desc' : 'asc';
       
        console.log('Current sort:', currentSortClass, '-> New sort:', newSortDirection);
       
        // Reset all headers
        $allHeaders.removeClass('sort-asc sort-desc');
        $allHeaders.find('.sort-arrow').text('⇅').css('color', '#666');
       
        // Set new sort state
        $clickedHeader.addClass('sort-' + newSortDirection);
        var arrow = newSortDirection === 'asc' ? '⇑' : '⇓';
        $clickedHeader.find('.sort-arrow').text(arrow).css('color', '#000');
       
        // Convert to array and sort
        var rowsArray = $dataRows.toArray();
       
        rowsArray.sort(function(rowA, rowB) {
            var $cellA = $(rowA).find('td').eq(columnIndex);
            var $cellB = $(rowB).find('td').eq(columnIndex);
           
            if ($cellA.length === 0 || $cellB.length === 0) return 0;
           
            var textA = $cellA.text().trim();
            var textB = $cellB.text().trim();
           
            // Try numeric comparison
            var numA = parseFloat(textA.replace(/[,$%\s]/g, ''));
            var numB = parseFloat(textB.replace(/[,$%\s]/g, ''));
           
            var result;
            if (!isNaN(numA) && !isNaN(numB)) {
                result = numA - numB;
            } else {
                result = textA.localeCompare(textB);
            }
           
            return newSortDirection === 'desc' ? -result : result;
        });
       
        // Reinsert sorted rows
        var $tbody = $table.find('tbody');
        if ($tbody.length > 0) {
            $tbody.empty().append(rowsArray);
        } else {
            // Remove existing data rows and append sorted ones
            $table.find('tr').not($table.find('tr').first()).remove();
            $table.append(rowsArray);
        }
       
        console.log('Sorting completed successfully');
       
        // Re-setup the table to ensure it stays sortable
        setTimeout(function() {
            setupTableSorting($table, tableIndex);
        }, 10);
    });
   
    console.log('Table', tableIndex, 'sorting setup completed');
}
// Main initialization function
$( function(){
   
    // Mobile/Desktop view switching logic
    if (window.matchMedia("(max-width: 768px)").matches) {
        if( mw.config.get("skin") !== "minerva" ){
            const currWikiUrl = new URL(window.location.href);
            currWikiUrl.searchParams.set('mobileaction', 'toggle_view_mobile');
           
            window.location.replace(currWikiUrl);
        }
        $("#footer-places-desktop-toggle").remove();
    } else {
        if(  mw.config.get("skin") !== "vector" ){
            const currWikiUrl = new URL(window.location.href);
            currWikiUrl.searchParams.set('mobileaction', 'toggle_view_desktop');
            window.location.replace(currWikiUrl);
        }
    }
   
    // Poem formatting code
    var countPoem2 = $(".Poem2-Ekatra");
   
    if( countPoem2.length > 0 ){
        var Poem2lenghtArray = [];
        for (var k = 0; k <= countPoem2.length; k++) {
          Poem2lenghtArray.push(k);
        }
       
        Poem2lenghtArray.forEach(function(j) {
            var poemElement = $(".Poem2-Ekatra").eq(j);
                       
            if( poemElement.length ){
                var poemText = poemElement.html();
                var poemArray = poemText.split("\n");
               
                poemElement.text("");
           
                // First measure
                poemArray.forEach( function(i) {
                    poemElement.append( '<p style="text-indent: 2em;">' + i + '</p>' );
                });
               
                // Second measure
                poemElement.children('p').each(function () {
                    $(this).css('text-indent', '2em');
                });
            }
        });
    }
   
    // Initialize table sorting
    initMobileSorting();
   
    // Also reinitialize when new content loads (like after editing)
    mw.hook('wikipage.content').add(function() {
        initMobileSorting();
    });
   
});
});