Deku Deals - Additional Filter

Add sale type filters to all pages

Tendrás que instalar una extensión para tu navegador como Tampermonkey, Greasemonkey o Violentmonkey si quieres utilizar este script.

You will need to install an extension such as Tampermonkey to install this script.

Tendrás que instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Userscripts para instalar este script.

Tendrás que instalar una extensión como Tampermonkey antes de poder instalar este script.

Necesitarás instalar una extensión para administrar scripts de usuario si quieres instalar este script.

(Ya tengo un administrador de scripts de usuario, déjame instalarlo)

Tendrás que instalar una extensión como Stylus antes de poder instalar este script.

Tendrás que instalar una extensión como Stylus antes de poder instalar este script.

Tendrás que instalar una extensión como Stylus antes de poder instalar este script.

Para poder instalar esto tendrás que instalar primero una extensión de estilos de usuario.

Para poder instalar esto tendrás que instalar primero una extensión de estilos de usuario.

Para poder instalar esto tendrás que instalar primero una extensión de estilos de usuario.

(Ya tengo un administrador de estilos de usuario, déjame instalarlo)

// ==UserScript==
// @name        Deku Deals - Additional Filter
// @namespace   MKScripts
// @match       https://www.dekudeals.com/*
// @grant       none
// @version     2.8
// @author      MKScripts
// @description Add sale type filters to all pages
// ==/UserScript==

(function () {
    'use strict';

    // Common badge selector
    const spanBadgeWarningSelector = '.badge-warning';

    // Find the new injection element
    const injectionElement = document.querySelector('body > main > div.d-flex.flex-md-nowrap.flex-wrap > div.search-left');

    if (injectionElement) {
        // Create a container div for the radio buttons
        const radioContainer = document.createElement('div');
        radioContainer.style.display = 'block'; // Set to block for vertical layout
        radioContainer.style.marginBottom = '20px'; // Make room below the div

        // Create radio buttons
        const radioButtons = [
            createRadioButton('Show All', 'showAll', showAll),
            createRadioButton('Regular Sale', 'regularSale', regularSale),
            createRadioButton('Matches Previous Low', 'matchesPreviousLow', matchesPreviousLow),
            createRadioButton('Lowest Price Ever', 'lowestPriceEver', lowestPriceEver)
        ];

        // Set "Show All" as checked by default
        radioButtons[0].input.checked = true;

        // Append radio buttons to the container
        radioButtons.forEach(({ container }) => radioContainer.appendChild(container));

        // Insert the container into the new injection point
        injectionElement.insertAdjacentElement('afterbegin', radioContainer);

        // See if we are on a subsequent page where we need to filter:
        const urlParams = new URLSearchParams(window.location.search);
        const filterValue = urlParams.get('MKScriptsFilter') || 'showAll'; // Default to 'showAll'
        if (filterValue !== 'showAll') setURLfilter ( filterValue );
    }

    function setURLfilter ( filterValue ) {
        // Get all radio buttons with the name "dealType"
        const radioButtons = document.querySelectorAll('input[name="dealType"]');

        //Find the radio button with the matching value, set it, and call the sub
        //set up values and functions to call
        const filterFunctions = {
          regularSale: regularSale,
          matchesPreviousLow: matchesPreviousLow,
          lowestPriceEver: lowestPriceEver,
          showAll: showAll
        };
        radioButtons.forEach(radioButton => {
            if (radioButton.value === filterValue) {
              // Click the button
              radioButton.checked = true;
              if (filterFunctions[filterValue]) {
                filterFunctions[filterValue]();
              }
            }
        });
    }


    // Function to create a radio button
    function createRadioButton(label, value, handler) {
        const radioButton = document.createElement('input');
        radioButton.type = 'radio';
        radioButton.name = 'dealType';
        radioButton.value = value;
        radioButton.style.cursor = 'pointer';

        const labelElement = document.createElement('label');
        labelElement.textContent = label;
        labelElement.style.marginLeft = '7px'; // Add margin-left to the labels
        labelElement.style.cursor = 'pointer';

        // Append the radio button and label to a div
        const container = document.createElement('div');
        container.style.marginBottom = '0px'; // Spacing between radio buttons
        container.style.cursor = 'pointer';
        container.appendChild(radioButton);
        container.appendChild(labelElement);

        // Attach event listener to the container
        container.addEventListener('click', function () {
            radioButton.checked = true;
            handler(value); // Pass the filter value to the handler
        });

        return { input: radioButton, container };
    }

    // Function to get the appropriate item selector and default display style
    function getViewModeConfig() {
        const listViewItems = document.querySelectorAll('.list-view');
        if (listViewItems.length > 0) {
            return { selector: '.list-view', display: 'flex' };
        }
        return { selector: '.d-block', display: 'block' };
    }

    // Function to update pagination URLs
    function updatePaginationUrls(filterValue) {
        const paginationLinks = document.querySelectorAll('.pagination .page-link');
        paginationLinks.forEach(link => {
            const url = new URL(link.href, window.location.origin); // Parse the current URL
            url.searchParams.set('MKScriptsFilter', filterValue); // Add or update the parameter
            link.href = url.toString(); // Update the link
        });
    }

    // Event listener for "Show All"
    function showAll() {
        const { selector, display } = getViewModeConfig();
        const divs = document.querySelectorAll(selector);
        divs.forEach(div => (div.style.display = display));
        updatePaginationUrls('showAll');
    }

    // Event listener for "Regular Sale"
    function regularSale() {
        const { selector, display } = getViewModeConfig();
        const divs = document.querySelectorAll(selector);
        divs.forEach(div => {
            const badge = div.querySelector(spanBadgeWarningSelector);
            if (badge && (badge.textContent.includes('Lowest price ever') || badge.textContent.includes('Matches previous low'))) {
                div.style.setProperty('display', 'none', 'important');
            } else {
                div.style.display = display;
            }
        });
        updatePaginationUrls('regularSale');
    }

    // Event listener for "Matches Previous Low"
    function matchesPreviousLow() {
        const { selector, display } = getViewModeConfig();
        const divs = document.querySelectorAll(selector);
        divs.forEach(div => {
            const badge = div.querySelector(spanBadgeWarningSelector);
            if (badge && badge.textContent.includes('Matches previous low')) {
                div.style.display = display;
            } else {
                div.style.setProperty('display', 'none', 'important');
            }
        });
        updatePaginationUrls('matchesPreviousLow');
    }

    // Event listener for "Lowest Price Ever"
    function lowestPriceEver() {
        const { selector, display } = getViewModeConfig();
        const divs = document.querySelectorAll(selector);
        divs.forEach(div => {
            const badge = div.querySelector(spanBadgeWarningSelector);
            if (badge && badge.textContent.includes('Lowest price ever')) {
                div.style.display = display;
            } else {
                div.style.setProperty('display', 'none', 'important');
            }
        });
        updatePaginationUrls('lowestPriceEver');
    }

})();