// Глобальные переменные 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, start_hour: parseInt(document.getElementById('start_hour').value), end_hour: parseInt(document.getElementById('end_hour').value), interval_minutes: parseInt(document.getElementById('interval_minutes').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', 'start_hour', 'end_hour', 'interval_minutes']; 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, start_hour: parseInt(document.getElementById('start_hour').value), end_hour: parseInt(document.getElementById('end_hour').value), interval_minutes: parseInt(document.getElementById('interval_minutes').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 startHour = parseInt(document.getElementById('start_hour').value); const endHour = parseInt(document.getElementById('end_hour').value); const intervalMinutes = parseInt(document.getElementById('interval_minutes').value); const schedulerEnabled = document.getElementById('scheduler_enabled').checked; // Валидация if (selectedUsers.length === 0 && hasChanges) { showAlert('warning', 'Выберите хотя бы одного сотрудника для публикации'); return; } if (!staticText && hasChanges) { showAlert('warning', 'Введите текст поста'); return; } if (startHour < 0 || startHour > 23) { showAlert('warning', 'Время начала должно быть от 0 до 23 часов'); return; } if (endHour < 0 || endHour > 23) { showAlert('warning', 'Время окончания должно быть от 0 до 23 часов'); return; } if (startHour >= endHour) { showAlert('warning', 'Время начала должно быть раньше времени окончания'); return; } if (intervalMinutes < 1 || intervalMinutes > 1440) { showAlert('warning', 'Интервал должен быть от 1 до 1440 минут'); 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 (startHour !== originalSettings.start_hour || endHour !== originalSettings.end_hour || intervalMinutes !== originalSettings.interval_minutes || schedulerEnabled !== originalSettings.enabled) { postData.schedulerData = { startTime: startHour.toString(), endTime: endHour.toString(), interval_minutes: intervalMinutes.toString(), 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); } } 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); } } // Вспомогательные функции для уведомлений function showAlert(type, message) { const alertContainer = document.getElementById('alertContainer'); // Очищаем старые алерты alertContainer.innerHTML = ''; // Создаем новый алерт const alert = document.createElement('div'); alert.className = `alert alert-${type} alert-dismissible fade show shadow`; // Иконка для типа алерта const icon = getAlertIcon(type); alert.innerHTML = `