MediaWiki:CustomFiltered.js: Difference between revisions

From The Seven Sages of Rome
Created page with "(function ($) { function init() { var $container = $('.filtered-views-container'); if (!$container.length) return; // --- Build UI bar --- var $bar = $('<div>', { id: 'smw-filter-bar', css: { marginBottom: '10px', display: 'flex', gap: '16px', alignItems: 'center', flexWrap: 'wrap' } }); var $searchInput = $('<input>', { type: 'text', id: 'smw-search-input', placeholder: 'Search all columns…', css: { paddi..."
 
No edit summary
Line 4: Line 4:
     if (!$container.length) return;
     if (!$container.length) return;


    // --- Build UI bar ---
     var $bar = $('<div>', {
     var $bar = $('<div>', {
       id: 'smw-filter-bar',
       id: 'smw-filter-bar',
Line 25: Line 24:
     $container.before($bar);
     $container.before($bar);


    // --- Snapshot SMW's own visibility on each row ---
     function snapshotSMW() {
     function snapshotSMW() {
       $container.find('tr.filtered-table-item').each(function () {
       $container.find('tr.filtered-table-item').each(function () {
Line 32: Line 30:
     }
     }


    // --- Apply text search on top of SMW filtering ---
     function applySearch() {
     function applySearch() {
       var term = $.trim($searchInput.val()).toLowerCase();
       var term = $.trim($searchInput.val()).toLowerCase();
Line 58: Line 55:
     }
     }


     // --- Watch for SMW filter changes ---
     // Disconnect observer while applySearch runs so our own
    // display changes don't trigger a false SMW snapshot
     var observer = new MutationObserver(function () {
     var observer = new MutationObserver(function () {
      observer.disconnect();
       snapshotSMW();
       snapshotSMW();
       applySearch();
       applySearch();
      observer.observe($container[0], observerConfig);
     });
     });


     observer.observe($container[0], {
     var observerConfig = {
       subtree: true,
       subtree: true,
       attributes: true,
       attributes: true,
       attributeFilter: ['style']
       attributeFilter: ['style']
     });
     };
 
    observer.observe($container[0], observerConfig);


    // --- Search input handler ---
     $searchInput.on('input', function () {
     $searchInput.on('input', function () {
       applySearch();
       applySearch();
     });
     });


    // --- Init ---
     snapshotSMW();
     snapshotSMW();
     applySearch();
     applySearch();

Revision as of 15:13, 27 February 2026

(function ($) {
  function init() {
    var $container = $('.filtered-views-container');
    if (!$container.length) return;

    var $bar = $('<div>', {
      id: 'smw-filter-bar',
      css: { marginBottom: '10px', display: 'flex', gap: '16px', alignItems: 'center', flexWrap: 'wrap' }
    });

    var $searchInput = $('<input>', {
      type: 'text',
      id: 'smw-search-input',
      placeholder: 'Search all columns…',
      css: { padding: '5px 10px', fontSize: '14px', border: '1px solid #ccc', borderRadius: '4px', minWidth: '250px' }
    });

    var $counter = $('<span>', {
      id: 'smw-filter-counter',
      css: { fontSize: '14px', color: '#555' }
    });

    $bar.append($searchInput, $counter);
    $container.before($bar);

    function snapshotSMW() {
      $container.find('tr.filtered-table-item').each(function () {
        $(this).data('smw-hidden', $(this).css('display') === 'none');
      });
    }

    function applySearch() {
      var term = $.trim($searchInput.val()).toLowerCase();
      var total = 0;
      var visible = 0;

      $container.find('tr.filtered-table-item').each(function () {
        var $row = $(this);
        total++;

        if ($row.data('smw-hidden')) {
          $row.hide();
          return;
        }

        if (!term || $row.text().toLowerCase().indexOf(term) !== -1) {
          $row.show();
          visible++;
        } else {
          $row.hide();
        }
      });

      $counter.text('Showing ' + visible + ' of ' + total + ' entries');
    }

    // Disconnect observer while applySearch runs so our own
    // display changes don't trigger a false SMW snapshot
    var observer = new MutationObserver(function () {
      observer.disconnect();
      snapshotSMW();
      applySearch();
      observer.observe($container[0], observerConfig);
    });

    var observerConfig = {
      subtree: true,
      attributes: true,
      attributeFilter: ['style']
    };

    observer.observe($container[0], observerConfig);

    $searchInput.on('input', function () {
      applySearch();
    });

    snapshotSMW();
    applySearch();
  }

  $(document).ready(function () {
    init();
  });

}(jQuery));