Сортировка промокодов в Тильде

Скрипт сортирует колонки по алфавиту, числам или дате.

// ==UserScript==
// @name         Сортировка промокодов в Тильде
// @namespace    https://bocmanbarada.ru/codes
// @version      0.3
// @description  Скрипт сортирует колонки по алфавиту, числам или дате. 
// @author       bocmanbarada
// @match        https://tilda.ru/projects/payments/promocodes/*
// @icon         data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAACXBIWXMAAAsTAAALEwEAmpwYAAACiklEQVR4nO2ZP2gUQRSHR4KCivEuKWwStYlCQBsRxUIQSWWhoFYBSSGWamMaC62CkFZQES0EUUglFqIiGCv/xByIihAhwUKsRAtRFP1k9B33MuTOndnZOKv7wZBjb2fm9zGZvbs3xvwvAMPAEWmbTRkBNgI/aHHblBFgnPl8B9aZMgEsBd6JwJySOWXKBLBPhR8BXsrrN0CXKQvADQn+GVgNnFZiQ6YMAGuArxJ6Qm38JtdNGQBOqND71fVpufYF6F2EHJPAkzwDNPfDR2C5uj6qBI/GCtwhxy9CO++gxSXnvX71ufIsVuCiRC4qkQNA3WmP1ftbo6ePIQKslH+nrJzznmSRREbw4wOwIkWRSRXyILClTdP3HUpKBBhQG3nGY+Xu5w0cW2Qs6/cpYBXwSe618gN5Q0cRAbrkO1STDRn6XFP3j+UNHUtkE3BX2uWMfXapPlfyBI6+2VODSiQxqFYkMahWJDGoViQxqFYkMcjxe2Q3cMGzDacochx/gn7u2sKGlJf6QkWAPuAFcC+GyHigyE3pP9NOhg4iImH7Wu74Tr4EuKokXgG1QBFbhn0o48wC67OKOBJPbXXHd/KTSsJWWwZDJLLKsIDIAhI9vpPulfMR5O+ePBJZZHBEYkgMOvWu0RgSjswjV0aLOBLTIRK9wGslMWH3SkyRdjK0yC2xzKlhTemidgEydZmj+TTDeT3lvbFl4PNqMHsM11+Iwfw5a059uUkj6CjDHhuoQeyhz85CkmeTaYRKDAHf1ECHC0ncOUOPPJn8n06qdPpeSZwtJGn2lamFdOwGniuJB3bDmzLB77LpLSXxVlan/ofWbVIC2EYYDZMSwPZ/RWQtcCagHfvb2StMgvwEXznT7KY/VwsAAAAASUVORK5CYII=
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    function addSortPromocode() {
        setTimeout(function() {
            const getCellValue = (tr, idx) => tr.children[idx].innerText.replace('%', '') || tr.children[idx].textContent.replace('%', '');

            const comparer = (idx, asc) => (a, b) => ((v1, v2) => v1 !== '' && v2 !== '' && !isNaN(v1) && !isNaN(v2) ? v1 - v2 : v1.toString().localeCompare(v2))(getCellValue(asc ? a : b, idx), getCellValue(asc ? b : a, idx));

            document.querySelectorAll('th').forEach(th => th.addEventListener('click', (() => {
                const table = th.closest('table');
                Array.from(table.querySelectorAll('tbody tr'))
                    .sort(comparer(Array.from(th.parentNode.children).indexOf(th), this.asc = !this.asc))
                    .forEach(tr => table.querySelector('tbody').appendChild(tr));
            })));
        }, 1000);
    }

    // Настройка MutationObserver
    const observerPromocodeTable = new MutationObserver((mutationsList) => {
        for (let mutation of mutationsList) {
            if (mutation.type === 'childList') {
                // Проверяем каждый добавленный узел
                for (let node of mutation.addedNodes) {
                    if (node instanceof HTMLElement) {
                        // Проверяем, является ли добавленный узел элементом, которого вы ищете
                        if (node.classList.contains('promocode-inner')) {
                        // Вызываем функцию при появлении элемента
                            addSortPromocode();
                            console.log('Функция addSortPromocode() запущена');
                        }
                    }
                }
            }
        }
    });

    const targetPromocodeTable = document.body;
    const config = { childList: true, subtree: true };
    observerPromocodeTable.observe(targetPromocodeTable, config);

    $('head').append(`'
    <style>
    .promocode-list thead th {
        cursor: pointer;
    }
    </style>'`);
})();