rastray 0.15.0

Blazing-fast static analysis CLI for security, dependency, and performance audits.
(function () {
  var filter = document.getElementById('filter');
  var table = document.getElementById('findings-table');
  if (!table) { return; }
  var tbody = table.tBodies[0];
  var rows = Array.from(tbody.rows);
  var chips = document.querySelectorAll('.chip');
  var headers = table.querySelectorAll('th.sortable');
  var activeSeverity = 'all';
  var sortKey = null;
  var sortAsc = true;

  function applyFilter() {
    var needle = (filter.value || '').toLowerCase();
    rows.forEach(function (row) {
      var sev = row.getAttribute('data-severity');
      var matchesSev = activeSeverity === 'all' || sev === activeSeverity;
      var matchesText = !needle || row.textContent.toLowerCase().indexOf(needle) !== -1;
      row.classList.toggle('hidden', !(matchesSev && matchesText));
    });
  }

  filter.addEventListener('input', applyFilter);

  chips.forEach(function (chip) {
    chip.addEventListener('click', function () {
      chips.forEach(function (c) { c.classList.remove('active'); });
      chip.classList.add('active');
      activeSeverity = chip.getAttribute('data-severity');
      applyFilter();
    });
  });

  var severityOrder = { critical: 0, high: 1, medium: 2, low: 3, info: 4 };

  function valueFor(row, key) {
    if (key === 'severity') {
      var s = row.getAttribute('data-severity');
      return severityOrder[s] != null ? severityOrder[s] : 99;
    }
    return row.getAttribute('data-' + key) || '';
  }

  headers.forEach(function (th) {
    th.addEventListener('click', function () {
      var key = th.getAttribute('data-key');
      sortAsc = sortKey === key ? !sortAsc : true;
      sortKey = key;
      headers.forEach(function (h) { h.classList.remove('sort-asc', 'sort-desc'); });
      th.classList.add(sortAsc ? 'sort-asc' : 'sort-desc');
      var sorted = rows.slice().sort(function (a, b) {
        var av = valueFor(a, key);
        var bv = valueFor(b, key);
        if (av < bv) { return sortAsc ? -1 : 1; }
        if (av > bv) { return sortAsc ? 1 : -1; }
        return 0;
      });
      sorted.forEach(function (row) { tbody.appendChild(row); });
    });
  });
})();