// ==UserScript==
// @name Sort Reports
// @namespace http://tampermonkey.net/
// @version 2024-09-18
// @description Sort Reports
// @author You
// @match https://f95zone.to/reports/queue/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=f95zone.to
// @grant none
// ==/UserScript==
(function() {
'use strict';
window.onload = function() {
const reportTable = document.querySelector('.structItemContainer');
if (!reportTable) return;
const sortContainer = document.createElement('div');
sortContainer.style.textAlign = 'right';
sortContainer.innerHTML = `
`;
reportTable.parentNode.insertBefore(sortContainer, reportTable);
document.getElementById('sortType').addEventListener('change', function() {
const sortValue = this.value;
const rows = Array.from(reportTable.querySelectorAll('.structItem'));
switch (sortValue) {
case 'dateAsc':
sortRows(rows, '.structItem-latestDate', true, 'date');
break;
case 'dateDesc':
sortRows(rows, '.structItem-latestDate', false, 'date');
break;
case 'sectionAsc':
sortRows(rows, '.structItem-forum a', true);
break;
case 'sectionDesc':
sortRows(rows, '.structItem-forum a', false);
break;
case 'prefixAsc':
sortRows(rows, '.structItem-title', true, 'prefix');
break;
case 'prefixDesc':
sortRows(rows, '.structItem-title', false, 'prefix');
break;
}
});
function sortRows(rows, selector, asc = true, type = 'text') {
const sortedRows = rows.sort((a, b) => {
let valA = a.querySelector(selector);
let valB = b.querySelector(selector);
if (!valA || !valB) {
return asc ? (valA ? -1 : 1) : (valB ? -1 : 1);
}
if (type === 'date') {
valA = parseInt(valA.getAttribute('data-time')) * 1000;
valB = parseInt(valB.getAttribute('data-time')) * 1000;
return asc ? valA - valB : valB - valA;
}
if (type === 'prefix') {
valA = valA.innerText.trim().split(' - ')[0];
valB = valB.innerText.trim().split(' - ')[0];
return asc ? valA.localeCompare(valB) : valB.localeCompare(valA);
}
valA = valA.innerText.trim();
valB = valB.innerText.trim();
return asc ? valA.localeCompare(valB) : valB.localeCompare(valA);
});
sortedRows.forEach(row => reportTable.appendChild(row));
}
};
})();