Auto Checkbox ID

Auto Checkbox, скрипт для создания кнопки с выбором ID в панели управления, внизу правый угол

// ==UserScript==
// @name         Auto Checkbox ID
// @namespace    http://tampermonkey.net/
// @version      1.2
// @description  Auto Checkbox, скрипт для создания кнопки с выбором ID в панели управления, внизу правый угол
// @author       Retsu and ChatGPT
// @match        *://manager.univer.goldapple.ru/*
// @grant        none
// @license      MIT
// ==/UserScript==

(function () {
    'use strict';

    // Хранение сохраненных отборов
    let savedFilters = JSON.parse(localStorage.getItem('savedFilters')) || [];

    // Функция для создания всплывающего окна
    function createModal() {
        const modal = document.createElement('div');
        modal.style.position = 'fixed';
        modal.style.top = '50%';
        modal.style.left = '50%';
        modal.style.transform = 'translate(-50%, -50%)';
        modal.style.backgroundColor = '#fff';
        modal.style.boxShadow = '0 4px 8px rgba(0, 0, 0, 0.2)';
        modal.style.padding = '20px';
        modal.style.zIndex = '10000';
        modal.style.borderRadius = '8px';
        modal.style.fontFamily = 'inherit';
        modal.style.textAlign = 'center';

        const title = document.createElement('h3');
        title.textContent = 'Введите ID через запятую';
        title.style.marginBottom = '20px';
        modal.appendChild(title);

        const input = document.createElement('input');
        input.type = 'text';
        input.placeholder = 'Например: 33934, 33935, 34233';
        input.style.width = '90%';
        input.style.marginBottom = '20px';
        input.style.padding = '8px';
        input.style.border = '1px solid #ccc';
        input.style.borderRadius = '4px';
        input.style.fontSize = '14px';
        modal.appendChild(input);

        const button = document.createElement('button');
        button.textContent = 'Выбрать чекбоксы';
        button.style.padding = '10px 20px';
        button.style.backgroundColor = '#007bff';
        button.style.color = '#fff';
        button.style.border = 'none';
        button.style.borderRadius = '4px';
        button.style.cursor = 'pointer';
        button.style.marginRight = '15px';
        button.style.fontSize = '14px';
        button.style.fontFamily = 'inherit';
        button.addEventListener('mouseover', () => button.style.backgroundColor = '#0056b3');
        button.addEventListener('mouseout', () => button.style.backgroundColor = '#007bff');
        modal.appendChild(button);

        const closeButton = document.createElement('button');
        closeButton.textContent = 'Закрыть';
        closeButton.style.padding = '10px 20px';
        closeButton.style.backgroundColor = '#00a8a5';
        closeButton.style.color = '#fff';
        closeButton.style.border = 'none';
        closeButton.style.borderRadius = '4px';
        closeButton.style.cursor = 'pointer';
        closeButton.style.fontSize = '14px';
        closeButton.style.fontFamily = 'inherit';
        closeButton.addEventListener('click', () => document.body.removeChild(modal));
        closeButton.addEventListener('mouseover', () => closeButton.style.backgroundColor = '#0a918c');
        closeButton.addEventListener('mouseout', () => closeButton.style.backgroundColor = '#00a8a5');
        modal.appendChild(closeButton);

        button.addEventListener('click', () => {
            const ids = input.value.split(',').map(id => parseInt(id.trim(), 10));
            const rows = document.querySelectorAll('tr.ek-table-row');

            rows.forEach(row => {
                const idColumn = row.querySelector('td:nth-child(2) .ek-truncate__text');
                const checkbox = row.querySelector('input[type="checkbox"]');

                if (idColumn && checkbox && ids.includes(parseInt(idColumn.textContent.trim(), 10))) {
                    checkbox.click();
                    console.log(`Выбран чекбокс для ID: "${idColumn.textContent.trim()}"`);
                }
            });

            document.body.removeChild(modal);
        });

        document.body.appendChild(modal);
    }

    // Функция для создания окна с сохраненными отбороми
    function createSavedFiltersModal() {
        const modal = document.createElement('div');
        modal.style.position = 'fixed';
        modal.style.width = '320px';
        modal.style.top = '50%';
        modal.style.left = '50%';
        modal.style.transform = 'translate(-50%, -50%)';
        modal.style.backgroundColor = '#fff';
        modal.style.boxShadow = '0 4px 8px rgba(0, 0, 0, 0.2)';
        modal.style.padding = '20px';
        modal.style.zIndex = '10000';
        modal.style.borderRadius = '8px';
        modal.style.fontFamily = 'inherit';
        modal.style.textAlign = 'center';

        const title = document.createElement('h3');
        title.textContent = 'Сохраненные отборы';
        modal.appendChild(title);

        const list = document.createElement('div');
        list.style.maxHeight = '300px';
        list.style.overflowY = 'scroll';
        modal.appendChild(list);

        savedFilters.forEach((filter, index) => {
            const filterDiv = document.createElement('div');
            filterDiv.style.marginBottom = '10px';
            filterDiv.style.textAllign = 'left';
            filterDiv.style.paddingpLeft = '20px';
            filterDiv.textContent = `${index + 1}. ${filter.name}`;

            const selectButton = document.createElement('button');
            selectButton.innerHTML = '✅';
            selectButton.style.marginLeft = '10px';
            selectButton.addEventListener('click', () => {
                // Применение фильтра
                const rows = document.querySelectorAll('tr.ek-table-row');
                rows.forEach(row => {
                    const idColumn = row.querySelector('td:nth-child(2) .ek-truncate__text');
                    const checkbox = row.querySelector('input[type="checkbox"]');
                    if (idColumn && checkbox && filter.ids.includes(parseInt(idColumn.textContent.trim(), 10))) {
                        checkbox.click();
                    }
                });
                document.body.removeChild(modal);
            });

            const deleteButton = document.createElement('button');
            deleteButton.innerHTML = '🗑';
            deleteButton.style.marginLeft = '10px';
            deleteButton.addEventListener('click', () => {
                savedFilters.splice(index, 1);
                localStorage.setItem('savedFilters', JSON.stringify(savedFilters));
                list.removeChild(filterDiv);
            });

            filterDiv.appendChild(selectButton);
            filterDiv.appendChild(deleteButton);
            list.appendChild(filterDiv);
        });

        const addButton = document.createElement('button');
        addButton.textContent = 'Добавить отбор';
        addButton.style.padding = '10px 20px';
        addButton.style.backgroundColor = '#007bff';
        addButton.style.color = '#fff';
        addButton.style.border = 'none';
        addButton.style.borderRadius = '4px';
        addButton.style.cursor = 'pointer';
        addButton.style.marginRight = '15px';
        addButton.style.fontSize = '14px';
        addButton.style.fontFamily = 'inherit';
        addButton.addEventListener('click', () => {
            // Открытие окна для добавления нового отбора
            const addFilterModal = document.createElement('div');
            addFilterModal.style.position = 'fixed';
            addFilterModal.style.top = '50%';
            addFilterModal.style.left = '50%';
            addFilterModal.style.transform = 'translate(-50%, -50%)';
            addFilterModal.style.backgroundColor = '#fff';
            addFilterModal.style.boxShadow = '0 4px 8px rgba(0, 0, 0, 0.2)';
            addFilterModal.style.padding = '20px';
            addFilterModal.style.zIndex = '10000';
            addFilterModal.style.borderRadius = '8px';
            addFilterModal.style.fontFamily = 'inherit';
            addFilterModal.style.textAlign = 'center';

            const addTitle = document.createElement('h3');
            addTitle.textContent = 'Добавить новый отбор';
            addFilterModal.appendChild(addTitle);

            const idInput = document.createElement('input');
            idInput.type = 'text';
            idInput.placeholder = 'Введите ID через запятую';
            addFilterModal.appendChild(idInput);

            const nameInput = document.createElement('input');
            nameInput.type = 'text';
            nameInput.placeholder = 'Введите название отбора';
            addFilterModal.appendChild(nameInput);

            const saveButton = document.createElement('button');
            saveButton.textContent = 'Сохранить';
            saveButton.style.marginTop = '10px';
            saveButton.addEventListener('click', () => {
                const ids = idInput.value.split(',').map(id => parseInt(id.trim(), 10));
                const name = nameInput.value.trim();
                if (ids.length > 0 && name) {
                    savedFilters.push({ name, ids });
                    localStorage.setItem('savedFilters', JSON.stringify(savedFilters));
                    document.body.removeChild(addFilterModal);
                    document.body.removeChild(modal);
                    createSavedFiltersModal(); // обновление списка отборов
                }
            });

            const cancelButton = document.createElement('button');
            cancelButton.textContent = 'Отмена';
            cancelButton.style.marginLeft = '10px';
            cancelButton.addEventListener('click', () => document.body.removeChild(addFilterModal));

            addFilterModal.appendChild(saveButton);
            addFilterModal.appendChild(cancelButton);

            document.body.appendChild(addFilterModal);
        });

        const closeButton = document.createElement('button');
        closeButton.style.marginTop = '10px';
        closeButton.textContent = 'Закрыть';
        closeButton.style.padding = '10px 20px';
        closeButton.style.backgroundColor = '#00a8a5';
        closeButton.style.color = '#fff';
        closeButton.style.border = 'none';
        closeButton.style.borderRadius = '4px';
        closeButton.style.cursor = 'pointer';
        closeButton.style.fontSize = '14px';
        closeButton.style.fontFamily = 'inherit';
        closeButton.addEventListener('click', () => document.body.removeChild(modal));
        closeButton.addEventListener('mouseover', () => closeButton.style.backgroundColor = '#0a918c');
        closeButton.addEventListener('mouseout', () => closeButton.style.backgroundColor = '#00a8a5');
        closeButton.addEventListener('click', () => document.body.removeChild(modal));

        modal.appendChild(addButton);
        modal.appendChild(closeButton);
        document.body.appendChild(modal);
    }

    // Добавление кнопок на страницу
    const triggerButton = document.createElement('button');
    triggerButton.textContent = 'Открыть меню выбора чекбоксов';
    triggerButton.style.position = 'fixed';
    triggerButton.style.bottom = '20px';
    triggerButton.style.right = '150px';
    triggerButton.style.padding = '10px 20px';
    triggerButton.style.backgroundColor = '#28a745';
    triggerButton.style.color = '#fff';
    triggerButton.style.border = 'none';
    triggerButton.style.borderRadius = '4px';
    triggerButton.style.cursor = 'pointer';
    triggerButton.style.zIndex = '10000';
    triggerButton.style.fontFamily = 'inherit';
    triggerButton.addEventListener('mouseover', () => triggerButton.style.backgroundColor = '#218838');
    triggerButton.addEventListener('mouseout', () => triggerButton.style.backgroundColor = '#28a745');
    triggerButton.addEventListener('click', createModal);

    const settingsButton = document.createElement('button');
    settingsButton.style.position = 'fixed';
    settingsButton.style.bottom = '20px';
    settingsButton.style.right = '100px';
    settingsButton.style.padding = '8px 13px';
    settingsButton.style.backgroundColor = '#00a8a5';
    settingsButton.style.fontSize = '15px';
    settingsButton.style.color = '#fff';
    settingsButton.style.border = 'none';
    settingsButton.style.borderRadius = '4px';
    settingsButton.style.cursor = 'pointer';
    settingsButton.style.zIndex = '10000';
    settingsButton.innerHTML = '⚙'; // Иконка гаечного ключа
    settingsButton.addEventListener('click', createSavedFiltersModal);

    document.body.appendChild(triggerButton);
    document.body.appendChild(settingsButton);
})();