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.

Você precisará instalar uma extensão como Tampermonkey, Greasemonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Userscripts para instalar este script.

Você precisará instalar uma extensão como o Tampermonkey para instalar este script.

Você precisará instalar um gerenciador de scripts de usuário para instalar este script.

(Eu já tenho um gerenciador de scripts de usuário, me deixe instalá-lo!)

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

(Eu já possuo um gerenciador de estilos de usuário, me deixar fazer a instalação!)

// ==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
    );

})();