Sort by the italicized 'total' price on a Discogs release page instead of pre-shipping price
// ==UserScript==
// @name Discogs - Sort by Total Price in Marketplace
// @namespace https://greatest.deepsurf.us/en/scripts/461485
// @version 1.4
// @description Sort by the italicized 'total' price on a Discogs release page instead of pre-shipping price
// @author Jon Uleis (@MovingToTheSun)
// @match https://www.discogs.com/*sell*/*
// @icon https://www.discogs.com/favicon.ico
// @grant none
// @license MIT
// ==/UserScript==
/*jshint esversion: 11 */
(function () {
"use strict";
const priceSort = document.querySelector(".price_header .sortable_link_selected");
const ascending = priceSort?.title.includes("ascending");
function tableSort() {
// continue only if we are sorting by price
if (priceSort) {
const rows = Array.from(document.querySelectorAll("tr[data-release-id]"));
rows.sort((rowA, rowB) => {
const priceA = getRowPrice(rowA);
const priceB = getRowPrice(rowB);
return ascending ? priceA - priceB : priceB - priceA;
});
// append back to table in new order
rows.forEach((row) => row.parentNode.appendChild(row));
// change title text
document.querySelector(".price_header .link-text").innerText = "Total Price";
}
}
function getRowPrice(row) {
// if there's no total price, get the original bold one
const price = row.querySelector(".converted_price") || row.querySelector(".price");
// if the item is unavailable and we're sorting by lowest, push to bottom
const weight = row.querySelector(".item_add_to_cart .button") || !ascending ? 0 : 9999999;
// strip everything else out of the price text
return parseFloat(price.textContent.replace(/[^0-9]/g, "")) + weight;
}
const pjaxContainer = document.querySelector("#pjax_container");
const observer = new MutationObserver((mutationsList) => {
for (let mutation of mutationsList) {
// run function again if we're ajax loading in another table of items
// console.log(mutation.addedNodes);
if (
mutation.type === "childList" &&
mutation.addedNodes.length &&
(mutation.addedNodes[1]?.nodeName === "TBODY" || mutation.addedNodes[3]?.nodeName === "TABLE")
) {
tableSort();
}
}
});
observer.observe(pjaxContainer, { subtree: true, childList: true });
// first run
tableSort();
})();