Загрузка данных


// Функция для создания пауз
const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));

// Умная асинхронная функция для Select (выпадающих списков)
async function setReactSelect(element, value) {
    if (!element) return;
    const nativeSelectValueSetter = Object.getOwnPropertyDescriptor(window.HTMLSelectElement.prototype, "value").set;
    nativeSelectValueSetter.call(element, value);
    
    // Отправляем сразу два события для стопроцентного срабатывания в React
    element.dispatchEvent(new Event('input', { bubbles: true }));
    element.dispatchEvent(new Event('change', { bubbles: true }));
    
    // Ждем 150мс, чтобы React успел сохранить каждый мотор в свою память
    await sleep(150); 
}

// Функция для ползунков: имитирует точный физический клик мыши
async function setReactSlider(hiddenInputName, targetValue) {
    const hiddenInput = document.querySelector(`input[name="${hiddenInputName}"][type="hidden"]`);
    if (!hiddenInput) return;

    const sliderContainer = hiddenInput.closest('.input-wrapper');
    if (!sliderContainer) return;

    const track = sliderContainer.querySelector('.input-range__track--background');
    const handle = sliderContainer.querySelector('.input-range__slider');
    if (!track || !handle) return;

    const min = parseFloat(handle.getAttribute('aria-valuemin'));
    const max = parseFloat(handle.getAttribute('aria-valuemax'));
    let val = parseFloat(targetValue);

    if (val < min) val = min;
    if (val > max) val = max;

    const percentage = (val - min) / (max - min);
    const rect = track.getBoundingClientRect();
    
    let clickX = rect.left + (rect.width * percentage);
    const clickY = rect.top + (rect.height / 2);

    if (percentage === 0) clickX += 1;
    if (percentage === 1) clickX -= 1;

    const mousedown = new MouseEvent('mousedown', { bubbles: true, cancelable: true, view: window, clientX: clickX, clientY: clickY });
    const mouseup = new MouseEvent('mouseup', { bubbles: true, cancelable: true, view: window, clientX: clickX, clientY: clickY });

    track.dispatchEvent(mousedown);
    track.dispatchEvent(mouseup);

    // Пауза 200мс на каждый ползунок
    await sleep(200); 
}

async function applyMyDefaults() {
    console.log("ESC Auto: Применяю дефолтные настройки...");

    // Блокируем кнопку на время работы скрипта
    const myBtn = document.getElementById('my-custom-default-btn');
    if (myBtn) {
        myBtn.disabled = true;
        myBtn.innerText = 'Применяю...';
    }

    // 1. НАПРАВЛЕНИЯ ВРАЩЕНИЯ (ESC 1: Normal, ESC 2: Reversed, ESC 3: Reversed, ESC 4: Normal)
    const motorDirections = document.querySelectorAll('select[name="MOTOR_DIRECTION"]');
    const targetDirections = ["1", "2", "2", "1"]; 
    
    // Заменили forEach на классический for, чтобы await работал корректно!
    for (let i = 0; i < motorDirections.length; i++) {
        if (targetDirections[i] && motorDirections[i]) {
            await setReactSelect(motorDirections[i], targetDirections[i]);
        }
    }

    // 2. ВЫПАДАЮЩИЕ СПИСКИ
    const selectsMap = {
        'COMMUTATION_TIMING': '3',     // 15° (Medium)
        'DEMAG_COMPENSATION': '2',     // Low
        'RPM_POWER_SLOPE': '9',        // 9x
        'BEACON_DELAY': '5',           // Infinite
        'POWER_RATING': '2',           // 2S+
        'TEMPERATURE_PROTECTION': '0'  // Disabled
    };

    for (const [name, val] of Object.entries(selectsMap)) {
        const el = document.querySelector(`select[name="${name}"]`);
        await setReactSelect(el, val);
    }

    // 3. ЧЕКБОКСЫ
    const checkboxMap = {
        'FORCE_EDT_ARM': false, 
        'BRAKE_ON_STOP': false  
    };

    for (const [name, targetState] of Object.entries(checkboxMap)) {
        const el = document.querySelector(`input[name="${name}"][type="checkbox"]`);
        if (el && el.checked !== targetState) {
            el.click(); 
            await sleep(100); // Пауза на клик по галочке
        }
    }

    // 4. ПОЛЗУНКИ
    const slidersMap = {
        'STARTUP_POWER_MIN': '1030',
        'STARTUP_POWER_MAX': '1056',
        'BEEP_STRENGTH': '0',
        'BEACON_STRENGTH': '0',
        'BRAKING_STRENGTH': '100'
    };

    for (const [name, val] of Object.entries(slidersMap)) {
        await setReactSlider(name, val);
    }

    // Разблокируем кнопку и показываем успех
    if (myBtn) {
        const originalColor = myBtn.style.backgroundColor;
        myBtn.style.backgroundColor = '#38a169'; 
        myBtn.innerText = 'Применено!';
        setTimeout(() => {
            myBtn.style.backgroundColor = originalColor;
            myBtn.innerText = 'Применить мой шаблон';
            myBtn.disabled = false;
        }, 1500);
    }
}

// Добавление кнопки
function injectCustomButton() {
    const buttonBar = document.querySelector('.buttons-right');
    
    if (buttonBar && !document.getElementById('my-custom-default-btn')) {
        const btnContainer = document.createElement('div');
        btnContainer.className = 'generic-button';
        
        const myBtn = document.createElement('button');
        myBtn.type = 'button';
        myBtn.id = 'my-custom-default-btn';
        myBtn.innerText = 'Применить мой шаблон';
        
        myBtn.style.backgroundColor = '#2b6cb0'; 
        myBtn.style.color = '#ffffff';
        myBtn.style.fontWeight = 'bold';
        myBtn.style.transition = 'all 0.3s ease';
        
        myBtn.addEventListener('click', applyMyDefaults);
        btnContainer.appendChild(myBtn);
        
        buttonBar.insertBefore(btnContainer, buttonBar.firstChild);
    }
}

setInterval(injectCustomButton, 1000);