Add non-MFC figure

Track preordered non-MFC items on collection screen

当前为 2023-04-06 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Add non-MFC figure
// @namespace    https://tharglet.me.uk
// @version      1.9
// @description  Track preordered non-MFC items on collection screen
// @author       Tharglet
// @match        https://myfigurecollection.net/users.v4.php?*mode=view&*tab=collection&*
// @grant        GM_addStyle
// @grant GM_setValue
// @grant GM_getValue
// ==/UserScript==

//Polyfill for GM_addStyle for Greasemonkey...
if(typeof GM_addStyle == 'undefined') {
    GM_addStyle = (aCss) => {
        'use strict';
        let head = document.getElementsByTagName('head')[0];
        if (head) {
            let style = document.createElement('style');
            style.setAttribute('type', 'text/css');
            style.textContent = aCss;
            head.appendChild(style);
            return style;
        }
        return null;
    };
}

GM_addStyle(`
.non-mfc-item__tray-icon {
border: green 1px solid;
display: block;
margin: 8px;
padding: 1px;
}
.non-mfc-item__icon-container {
float: left;
margin-bottom: 20px;
}
.non-mfc-item__tray-icon img {
width: 60px;
height: 60px;
border-radius: 2px;
}
.non-mfc-item__edit, .non-mfc-item__delete {
display: inline-block;
}

.non-mfc-item__edit span, .non-mfc-item__delete span {
font-size: 16px;
margin: 0 4px;
}
`);

(function() {
    'use strict';
    let BASE_COUNT = 0;
    var isUsersPreorderPage = () => {
        const urlParams = new URLSearchParams(window.location.search);
        const status = urlParams.get("status");
        if(status == 1) {
            let loggedInUser = $(".user-menu .handle");
            if(loggedInUser) {
                let userLink = loggedInUser.attr("href");
                if(userLink === "/session/signup") {
                    return false;
                } else {
                    let userParam;
                    const windowLocation = window.location.href;
                    if(windowLocation.startsWith("https://myfigurecollection.net/profile/")) {
                        userParam = windowLocation.match(/https:\/\/myfigurecollection\.net\/profile\/([^\/]*)/)[1];
                    } else {
                        const urlParams = new URLSearchParams(window.location.search);
                        userParam = urlParams.get("username");
                    }
                    return userParam === userLink.substring("9");
                }
            } else {
                return false;
            }
        } else {
            return false;
        }
    };

    var additionalFigures = JSON.parse(GM_getValue("additionalFigures", "[]"));
    var resetNonMfcItemForm = () => {
        $("#non-mfc-item__form-title").text('Add non-MFC figure');
        $("#addNonMfcItem").text("Add");
        $("#nonMfcItemEditId").val("");
        $("#nonMfcItemName").val("");
        $("#nonMfcItemImage").val("");
        $("#nonMfcItemLink").val("");
        $("#nonMfcItemReleaseDate").val("");
    }

    var drawAdditionalFigures = () => {
        const urlParams = new URLSearchParams(window.location.search);
        const groupBy = urlParams.get("groupBy");
        const output = urlParams.get("output");
        //Clear all additions before redo
        $("#nonMfcAdditions").remove();
        $(".non-mfc-item__icon").remove();
        $(".non-mfc-item__edit").remove();
        $(".non-mfc-item__delete").remove();
        $(".non-mfc-item__year-header").remove();
        if(additionalFigures.length > 0) {
            //update item count
            let totalFigureCount = BASE_COUNT + additionalFigures.length;
            $('.result-link-toggle.on .count').text(totalFigureCount);
            $('.results-count-value').get(0).lastChild.nodeValue = `${totalFigureCount} items`;
            //Pre-add setup
            const addList = $("#nonMfcFigureList");
            let dateHeadings;
            if(groupBy == "releaseDates") {
                if(output === "0") {
                    dateHeadings = $("li.listing-title");
                } else {
                    dateHeadings = $(".listing-item h3");

                }
            } else if(!!groupBy) {
                if(output === "0") {
                    $(".listing-toggles:last").after('<li id="nonMfcAdditions" class="listing-title">Non-MFC</li>');
                } else {
                    $(".listing-item .item-icons").prepend('<div class="item-group-by" id="nonMfcAdditions"><h3>Non-MFC</h3></div>');
                }

            }
            //Add icons to page and delete box
            additionalFigures.forEach((fig, idx) => {
                let linkLine;
                const figYear = fig.date.substring(0, 4);
                const figMonth = fig.date.substring(5);
                const figureThumb = `<span class="non-mfc-item__icon item-icon">
<a href="${fig.link}" class="tbx-tooltip item-root-0 item-category-1">
<img src="${fig.image}">
</a>
</span>`;
                if(output === "0") {
                    linkLine = `<div class='listing-item non-mfc-item__icon'><div class="stamp item-stamp">
<a href="/item/872779" class="tbx-tooltip">
<img class="stamp-icon" src="${fig.image}"</a><div class="stamp-anchor"><a class="tbx-tooltip item-category-1" href="${fig.link}">${fig.name}</a>
</div></div></div>`
                }
                addList.append(`<span class='non-mfc-item__icon-container'>
                ${figureThumb.replace('item-icon', 'non-mfc-item__tray-icon')}
                <a href="#" class='non-mfc-item__edit' title="Edit" data-index="${idx}"><span class="tiny-icon-only icon-pencil-square-o" data-index="${idx}"></span></a>
                <a href="#" class='non-mfc-item__delete' title="Delete" data-index="${idx}"><span class="tiny-icon-only icon-trash-o" data-index="${idx}"></span></a>
                </span>`);
                let toAppend = true;
                if(groupBy == "releaseDates") {
                    dateHeadings.each((idx, heading) => {
                        if(toAppend) {
                            const headingYear = $(heading).text().substring(0,4);
                            const headingMonth = $(heading).text().substring(5);
                            if(figYear == headingYear && figMonth == headingMonth) {
                                if(output === "0") {
                                    $(heading).after(linkLine);
                                } else {
                                    $(heading).after(figureThumb);
                                }
                                toAppend = false;
                            } else if(new Date(figYear, figMonth, 1) > new Date(headingYear, headingMonth, 1)) {
                                if(output === "0") {
                                    const newHeading = `<li class="listing-title non-mfc-item__year-header" id='nhi_${idx}'>${figYear}-${figMonth}</li></h3>`
                                    $(heading).before(newHeading + linkLine);
                                } else {
                                    const newHeading = `<h3 class="non-mfc-item__year-header" id='nhi_${idx}'>${figYear}-${figMonth}</h3>`
                                    $(heading).before(newHeading + figureThumb);
                                }
                                dateHeadings.splice(idx, 0, $(`#nhi_${idx}`));
                                toAppend = false;
                            }
                        }
                    });
                    //Append if trailing
                    if(toAppend) {
                        const newHeading = `<h3 class="non-mfc-item__year-header" id='nhi_${idx}'>${figYear}-${figMonth}</h3>`
                        $('.item-group-by:last').after('<div class="item-group-by">' + newHeading + figureThumb + '</div>');
                        dateHeadings.push($(`#nhi_${idx}`));
                    }
                } else if(!!groupBy) {
                    if(output === "0") {
                        $("#nonMfcAdditions").after(linkLine)
                    } else {
                        $("#nonMfcAdditions h3").after(figureThumb);
                    }
                } else {
                    if(output === "0") {
                        $(".listing-toggles:last").after(linkLine);
                    } else {
                        $(".listing-item .item-icons").prepend(figureThumb);
                    }
                }
            });
            $('.non-mfc-item__delete').click((evt) => {
                evt.preventDefault();
                if(confirm("Delete this figure?")) {
                    additionalFigures.splice($(evt.target).attr("data-index"), 1);
                    additionalFigures.sort((a, b) => (a.date < b.date) ? 1 : -1);
                    GM_setValue("additionalFigures", JSON.stringify(additionalFigures));
                    drawAdditionalFigures();
                    resetNonMfcItemForm();
                }
            });
            $('.non-mfc-item__edit').click((evt) => {
                evt.preventDefault();
                var figToEdit = additionalFigures[$(evt.target).attr("data-index")];
                $("#non-mfc-item__form-title").text(`Editing ${figToEdit.name}`);
                $("#addNonMfcItem").text("Edit");
                $("#nonMfcItemEditId").val($(evt.target).attr("data-index"));
                $("#nonMfcItemName").val(figToEdit.name);
                $("#nonMfcItemImage").val(figToEdit.image);
                $("#nonMfcItemLink").val(figToEdit.link);
                $("#nonMfcItemReleaseDate").val(figToEdit.date);
                $([document.documentElement, document.body]).animate({
                    scrollTop: $("#non-mfc-item__section").offset().top - 100
                }, 200);
            });
            $("#cancelNonMfcItem").click((evt) => {
                evt.preventDefault();
                if(confirm("Are you sure you want to cancel?")) {
                    resetNonMfcItemForm();
                }
            });
        }
    }

    $().ready(() => {
        BASE_COUNT = parseInt($('.result-link-toggle.on .count').text());
        if(isUsersPreorderPage()) {
            const addSection = `<section id='non-mfc-item__section'>
<h2 id='non-mfc-item__form-title'>Add non-MFC figure</h2>
<div class='form'>
<input type='hidden' id='nonMfcItemEditId' value=''/>
<div class='bigchar form-field'>
<div class='form-label'>Figure name</div>
<div class='form-input'><input type='text' id='nonMfcItemName'/></div>
</div>
<div class='bigchar form-field'>
<div class='form-label'>Image URL *</div>
<div class='form-input'><input type='text' id='nonMfcItemImage'/></div>
</div>
<div class='bigchar form-field'>
<div class='form-label'>Item link *</div>
<div class='form-input'><input type='text' id='nonMfcItemLink'/></div>
</div>
<div class='bigchar form-field'>
<div class='form-label'>Release date (YYYY-MM) *</div>
<div class='form-input'><input type='text' id='nonMfcItemReleaseDate'/></div>
</div>
<div class='form-field'>
<div class='form-input'>
<button id='addNonMfcItem'>Add</button>
<button id='cancelNonMfcItem'>Cancel</button>
</div>
</div>
</div>
</section>
<section>
<h2>Added non-MFC figures</h2>
<div class='form'>
<div id='nonMfcFigureList' class='item-icons'>
</div>
</div>
</section>`
            $("#side section:last").after(addSection);
            drawAdditionalFigures();
            $("#addNonMfcItem").click((e) => {
                e.preventDefault();
                const name = $("#nonMfcItemName").val() || "Non-MFC figure";
                const image = $("#nonMfcItemImage").val();
                const link = $("#nonMfcItemLink").val();
                const date = $("#nonMfcItemReleaseDate").val();
                const editId = $("#nonMfcItemEditId").val();
                if(image && link && date && name) {
                    if(date.match(/^\d{4}-0[1-9]|1[0-2]$/)) {
                        if(editId) {
                            additionalFigures[editId] = {
                                name: name,
                                image: image,
                                link: link,
                                date: date
                            }
                        } else {
                            additionalFigures.push({
                                name: name,
                                image: image,
                                link: link,
                                date: date
                            });
                        }
                        additionalFigures.sort((a, b) => (a.date < b.date) ? 1 : -1);
                        GM_setValue("additionalFigures", JSON.stringify(additionalFigures));
                        drawAdditionalFigures();
                        resetNonMfcItemForm();
                    } else {
                        alert("Please enter a valid date in YYYY-MM format");
                    }
                } else {
                    alert("Please fill in all mandatory fields");
                }
            });
        }
    });

})();