// Глобальные переменные let originalSettings = null; let hasChanges = false; // Инициализация при загрузке страницы document.addEventListener('DOMContentLoaded', function () { // Сохраняем оригинальные настройки для сравнения saveOriginalSettings(); // Отслеживаем изменения в форме setupChangeListeners(); // Обновляем статус планировщика updateSchedulerStatus(); }); // Сохранение оригинальных настроек function saveOriginalSettings() { originalSettings = { selected_users: getSelectedUsers(), static_text: document.getElementById('static_text').value, full_name: document.getElementById('full_name').checked, hour: parseInt(document.getElementById('hour').value), minute: parseInt(document.getElementById('minute').value), enabled: document.getElementById('scheduler_enabled').checked }; } // Настройка отслеживания изменений function setupChangeListeners() { // Чекбоксы пользователей document.querySelectorAll('.user-checkbox').forEach(checkbox => { checkbox.addEventListener('change', function () { updateSelectAllCheckbox(); checkForChanges(); }); }); // Поля формы const formFields = ['static_text', 'hour', 'minute']; formFields.forEach(field => { const element = document.getElementById(field); if (element) { element.addEventListener('input', checkForChanges); } }); // Свитчи document.getElementById('full_name').addEventListener('change', checkForChanges); document.getElementById('scheduler_enabled').addEventListener('change', checkForChanges); document.getElementById('selectAll').addEventListener('change', checkForChanges); } // Проверка на изменения function checkForChanges() { const currentSettings = { selected_users: getSelectedUsers(), static_text: document.getElementById('static_text').value, full_name: document.getElementById('full_name').checked, hour: parseInt(document.getElementById('hour').value), minute: parseInt(document.getElementById('minute').value), enabled: document.getElementById('scheduler_enabled').checked }; hasChanges = JSON.stringify(originalSettings) !== JSON.stringify(currentSettings); // Можно добавить визуальное отображение изменений const saveButton = document.querySelector('.btn-success'); if (hasChanges && saveButton) { saveButton.innerHTML = 'Сохранить изменения'; saveButton.classList.add('btn-warning'); saveButton.classList.remove('btn-success'); } else if (saveButton) { saveButton.innerHTML = 'Сохранить все настройки'; saveButton.classList.remove('btn-warning'); saveButton.classList.add('btn-success'); } } // Получение выбранных пользователей function getSelectedUsers() { const selectedUsers = []; document.querySelectorAll('.user-checkbox:checked').forEach(checkbox => { const userId = parseInt(checkbox.id.replace('user_', '')); selectedUsers.push(userId); }); return selectedUsers; } // Обновление чекбокса "Выбрать все" function updateSelectAllCheckbox() { const allCheckboxes = document.querySelectorAll('.user-checkbox'); const checkedCheckboxes = document.querySelectorAll('.user-checkbox:checked'); const selectAllCheckbox = document.getElementById('selectAll'); if (allCheckboxes.length === checkedCheckboxes.length) { selectAllCheckbox.checked = true; selectAllCheckbox.indeterminate = false; } else if (checkedCheckboxes.length === 0) { selectAllCheckbox.checked = false; selectAllCheckbox.indeterminate = false; } else { selectAllCheckbox.checked = false; selectAllCheckbox.indeterminate = true; } } // Выбрать всех пользователей function selectAllUsers() { document.querySelectorAll('.user-checkbox').forEach(checkbox => { checkbox.checked = true; }); updateSelectAllCheckbox(); checkForChanges(); } // Снять выбор со всех пользователей function deselectAllUsers() { document.querySelectorAll('.user-checkbox').forEach(checkbox => { checkbox.checked = false; }); updateSelectAllCheckbox(); checkForChanges(); } // Переключить выбор всех пользователей function toggleAllUsers() { const selectAllCheckbox = document.getElementById('selectAll'); const isChecked = selectAllCheckbox.checked; document.querySelectorAll('.user-checkbox').forEach(checkbox => { checkbox.checked = isChecked; }); selectAllCheckbox.indeterminate = false; checkForChanges(); } // Обновление списка пользователей async function updateUsersList() { try { const response = await fetch('/api/posts?action=update_users'); const data = await response.json(); if (data.ok) { showAlert('success', 'Список пользователей обновлен!'); // Перезагружаем страницу через 1.5 секунды setTimeout(() => { window.location.reload(); }, 1500); } else { showAlert('danger', 'Ошибка обновления списка пользователей'); } } catch (error) { console.error('Ошибка:', error); showAlert('danger', 'Ошибка обновления списка пользователей'); } } // Публикация сейчас async function publishNow() { const selectedUsers = getSelectedUsers(); const staticText = document.getElementById('static_text').value.trim(); if (selectedUsers.length === 0) { showAlert('warning', 'Выберите хотя бы одного сотрудника для публикации'); return; } if (!staticText) { showAlert('warning', 'Введите текст поста'); return; } try { const response = await fetch('/api/posts?action=handle_posts'); const data = await response.json(); if (data.ok) { showAlert('success', 'Публикация запущена! Проверьте ваше сообщество VK.'); } else { showAlert('danger', 'Ошибка при запуске публикации'); } } catch (error) { console.error('Ошибка:', error); showAlert('danger', 'Ошибка при запуске публикации'); } } // Сохранение настроек async function saveSettings() { const selectedUsers = getSelectedUsers(); const staticText = document.getElementById('static_text').value.trim(); const fullName = document.getElementById('full_name').checked; const hour = parseInt(document.getElementById('hour').value); const minute = parseInt(document.getElementById('minute').value); const schedulerEnabled = document.getElementById('scheduler_enabled').checked; // Валидация if (selectedUsers.length === 0 && hasChanges) { showAlert('warning', 'Выберите хотя бы одного сотрудника для публикации'); return; } if (!staticText && hasChanges) { showAlert('warning', 'Введите текст поста'); return; } if (hour < 0 || hour > 23) { showAlert('warning', 'Час должен быть от 0 до 23 часов'); return; } if (minute < 0 || minute > 59) { showAlert('warning', 'Минута должна быть от 0 до 59 минут'); return; } // Подготовка данных для отправки const postData = { vkPostData: {}, schedulerData: {} }; // Только измененные данные для vkPostData if (JSON.stringify(selectedUsers) !== JSON.stringify(originalSettings.selected_users) || staticText !== originalSettings.static_text || fullName !== originalSettings.full_name) { postData.vkPostData = { selectedUsers: selectedUsers, static_text: staticText, full_name: fullName }; } // Только измененные данные для schedulerData if (hour !== originalSettings.hour || minute !== originalSettings.minute || schedulerEnabled !== originalSettings.enabled) { postData.schedulerData = { hour: hour, minute: minute, enabled: schedulerEnabled }; } // Если нет изменений if (Object.keys(postData.vkPostData).length === 0 && Object.keys(postData.schedulerData).length === 0) { showAlert('info', 'Нет изменений для сохранения'); return; } try { const response = await fetch('/api/posts', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(postData) }); const data = await response.json(); if (response.ok && data.status === 'ok') { showAlert('success', 'Настройки успешно сохранены!'); // Обновляем оригинальные настройки saveOriginalSettings(); checkForChanges(); // Если менялись настройки планировщика, обновляем статус if (Object.keys(postData.schedulerData).length > 0) { setTimeout(updateSchedulerStatus, 1000); } if (data.next_run_time) { document.getElementById('nextRunTime').textContent = data.next_run_time; } } else { const error = data.message || 'Ошибка сохранения'; showAlert('danger', error); } } catch (error) { console.error('Ошибка:', error); showAlert('danger', 'Ошибка сохранения настроек'); } } // Обновление статуса планировщика async function updateSchedulerStatus() { try { // Здесь можно добавить запрос для получения актуального статуса // Пока просто обновляем визуально const enabled = document.getElementById('scheduler_enabled').checked; const statusBadge = document.getElementById('schedulerStatus'); if (statusBadge) { if (enabled) { statusBadge.innerHTML = 'Активен'; } else { statusBadge.innerHTML = 'Неактивен'; } } } catch (error) { console.error('Ошибка обновления статуса:', error); } }