您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Allows you to drag-and-drop items in your Neopets Gallery to rank them instead of having to input rank numbers
// ==UserScript== // @name Neopets Gallery - Drag to Rank // @namespace http://tampermonkey.net/ // @version 0.1 // @description Allows you to drag-and-drop items in your Neopets Gallery to rank them instead of having to input rank numbers // @author Morde // @match https://www.neopets.com/gallery/index.phtml?msg=*&dowhat=rank&* // @match https://www.neopets.com/gallery/index.phtml?dowhat=rank&* // @match https://www.neopets.com/gallery/index.phtml?user_cat_g=*&dowhat=rank&* // @icon https://www.google.com/s2/favicons?sz=64&domain=neopets.com // @license MIT // @grant none // ==/UserScript== (function() { // Card group styling const css = ` .card-group-qty { position: absolute; top: 66px; right: 26px; background: green; color: white; padding: 4px; border-radius: 4px; } .card-group-rank { display: none; } .card-group { position: relative; padding: 8px; margin: 2px; background: #eee; border: 1px solid #aaa; border-radius: 4px; cursor: grab; } .card-group * { pointer-events: none; } .card-group.dragging, .card-group:active { cursor: grabbing; } .card-groups { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); text-align: center; } `; const style = document.createElement("style"); document.head.appendChild(style); style.appendChild(document.createTextNode(css)); // Remove dividers $("#gallery_form tr:nth-child(4n)").remove(); // Group items/qtys/ranks let group = []; const groups = []; [1, 2, 3, 4].forEach((col, colIndex) => { $(`#gallery_form td:not([colspan]):nth-child(4n+${col})`).each((i, x) => { const $x = $(x); const inner = $x.html(); const piece = i % 3; if (piece === 1) group.push( `<div class="card-group-qty">${inner.replace("Qty:", "x")}</div>` ); else if (piece === 2) group.push(`<div class="card-group-rank">${inner}</div>`); else group.push(`<div class="card-group-main">${inner}</div>`); if (group.length === 3) { const rowIndex = Math.floor(i / 3); // Save from column order to row order for the card divs groups[ colIndex + rowIndex * 4 ] = `<div class="card-group" draggable=true>${group.join("")}</div>`; group = []; } }); }); // Remove old janky rows $(`#gallery_form tr:not(:last-of-type)`).remove(); // Create grouped divs that will be draggable const $groups = $('<div class="card-groups" />'); $("#gallery_form table").before($groups); $groups.html(groups.join("")); // Drag and drop handlers document.addEventListener("dragover", function (e) { e.preventDefault(); }); $(".card-group").each((i, x) => { x.ondrag = handleDrag; x.ondragend = handleDrop; }); function handleDrag(event) { const selectedItem = event.target, list = selectedItem.parentNode, x = event.clientX, y = event.clientY; selectedItem.classList.add("dragging"); let swapItem = document.elementFromPoint(x, y) === null ? selectedItem : document.elementFromPoint(x, y); if (list === swapItem.parentNode) { swapItem = swapItem !== selectedItem.nextSibling ? swapItem : swapItem.nextSibling; list.insertBefore(selectedItem, swapItem); } } function handleDrop(event) { event.target.classList.remove("dragging"); $('input.glry_rank').each((i, x) => x.value = i + 1); // Re-rank } })();