Add List Items to Cart

Adds a button to saved lists to add all items to cart. Also adds a button in the cart to remove all items from cart.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey, Greasemonkey или Violentmonkey.

Для установки этого скрипта вам необходимо установить расширение, такое как Tampermonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Violentmonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Userscripts.

Чтобы установить этот скрипт, сначала вы должны установить расширение браузера, например Tampermonkey.

Чтобы установить этот скрипт, вы должны установить расширение — менеджер скриптов.

(у меня уже есть менеджер скриптов, дайте мне установить скрипт!)

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

(у меня уже есть менеджер стилей, дайте мне установить скрипт!)

// ==UserScript==
// @name         Add List Items to Cart
// @namespace    http://tampermonkey.net/
// @license      MIT
// @version      0.4
// @description  Adds a button to saved lists to add all items to cart. Also adds a button in the cart to remove all items from cart.
// @author       James Oltmans
// @match        https://www.walmart.com/*
// @grant        none
// @require http://code.jquery.com/jquery-3.4.1.min.js
// @run-at       document-end
// ==/UserScript==

(function() {
    'use strict';
    console.log('Running Add to cart.');

    const SELECTORS = [
        {
            site: 'Walmart',
            urls: ['https://www.walmart.com/lists'],
            selector: 'div.main-content button',
            buttonsText: ['Add to cart', 'Add'],
            loadWait: 2,
            cooldown: 0, // Set to 0 to disable the refresh.
            active: true,
            linkLocationSelector:'h1',
            cartSelector:'h2:contains("Cart")',
            removeSelector:'button:contains("Remove")',
        }
    ];

    /**
     * Inserts a add all to cart button with the count of items it will add.
     * @param {string} buttonId - The Id of the button that will trigger all the other buttons.
     * @param {Object} sel - The selector object.
     */
    function insertAddAllButton(buttonId, sel) {
        let buttons = getFilteredButtonsSelection(buttonId, sel);
        let count = buttons.length;
        let addAllText = `Add all (${count}) to cart`;
        if (count > 0) {
            if ($(`#${buttonId}`).length == 0) {
                $(sel.linkLocationSelector).first().append(` <button id="${buttonId}">${addAllText}</button>`);
            } else {
                $(`#${buttonId}`).text(addAllText);
            }
            $(`#${buttonId}`).off();
            $(`#${buttonId}`).on("click", function() { triggerClicks(buttons); });
            $(`#${buttonId}`).on("mouseover", function() { highlightButtons(buttons); });
        } else {
            $(`#${buttonId}`).remove();
        }
    }

    /**
     * Inserts a remove all from cart button with the count of items it will remove.
     * @param {string} buttonId - The Id of the button that will trigger all the other buttons.
     * @param {Object} sel - The selector object.
     */
    function insertRemoveAllFromCartButton(buttonId, sel) {
        let buttons = getRemoveButtons(buttonId, sel);
        let count = buttons.length;
        let removeText = `Remove all (${count}) from cart`;
        if (count > 0) {
            if ($(`#${buttonId}`).length == 0) {
                $(sel.cartSelector).first().append(` <button id="${buttonId}">${removeText}</button>`);
            } else {
                $(`#${buttonId}`).text(removeText);
            }
            $(`#${buttonId}`).off();
            $(`#${buttonId}`).on("click", function() { triggerClicks(buttons); });
            $(`#${buttonId}`).on("mouseover", function() { highlightButtons(buttons); });
        } else {
            $(`#${buttonId}`).remove();
        }
    }

    /**
     * Get the list of add to cart buttons that match the selector.
     * @param {string} buttonId - The Id of the button that will trigger all the other buttons.
     *                            We have to remove this button from the list to prevent self clicking which will crash or lock up the browser.
     * @param {Object} sel - The selector object. This stores the buttonsText array that we will use to check our list of buttons against.
     *                       Only buttons with children with text that match any of our buttonsText entries will be selected.
     */
    function getFilteredButtonsSelection(buttonId, sel) {
        let buttons = $(sel.selector).filter(function() {
            return sel.buttonsText.indexOf($(this).children().text()) != -1;
        });
        buttons.not(`#${buttonId}`);
        return buttons;
    }

    /**
     * Highlight a list of elements.
     * @param {Object[]} buttons - List of elements to highlight.
     */
    function highlightButtons(buttons) {
        buttons.css("outline", "5px red dotted");
    }

    /**
     * Get the list of remove buttons that match the removeSelector.
     * @param {string} buttonId - The Id of the button that will trigger all the other buttons.
     *                            We have to remove this button from the list to prevent self clicking which will crash or lock up the browser.
     * @param {Object} sel - The selector object. This stores the removeSelector that we will check to grab all the elements we need.
     */
    function getRemoveButtons(buttonId, sel) {
        const buttons = $(sel.removeSelector).not(`#${buttonId}`);
        return buttons;
    }

    /**
     * Trigger a click event on all the elements passed in.
     * @param {Object[]} buttons - List of elements to click.
     */
    function triggerClicks(buttons) {
        let count=buttons.length;
        console.log(`Activating ${count} buttons...`);
        var anyClicked = false;

        // No available buttons.
        if (!count) {
            console.log(`No buttons to click.`);
            return anyClicked;
        }

        buttons.each(function() {
            $(this).trigger("click");
            console.log(`Clicked button.`);
            anyClicked = true;
        });

        return anyClicked;
    }

    /**
     * Finds all Add to Cart buttons for each configured site.
     */
    function findAddButtons() {
        // function main()
        SELECTORS.forEach((sel) => {
            if (sel.active) {
                if ($(sel.linkLocationSelector).length > 0)
                {
                    let buttonId = "AddAllListItemsToCartButton__";
                    insertAddAllButton(buttonId, sel);
                }
            }
        });
    }

    /**
     * Finds all the cart removal buttons for each configured site.
     */
    function findCartRemoveButtons() {
        SELECTORS.forEach((sel) => {
            if (sel.active) {
                if ($(sel.cartSelector).length > 0)
                {
                    let buttonId = "RemoveAllItemsFromCartButton__"
                    insertRemoveAllFromCartButton(buttonId, sel);
                }
            }
        });
    }

    // This function runs periodically to update the add and remove buttons. They are inserted and removed as necessary automatically.
    var pageCheckTimer = setInterval (
    function () {
        findAddButtons();
        findCartRemoveButtons();
    }
        , 222
    );

})();