diff --git a/report-organizer.js b/report-organizer.js new file mode 100644 index 0000000..b77ff3a --- /dev/null +++ b/report-organizer.js @@ -0,0 +1,91 @@ +// ==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)); + } + }; +})(); \ No newline at end of file