Files
2025-12-23 01:12:10 +03:00

308 lines
11 KiB
JavaScript

// Глобальные переменные
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 = '<i class="bi bi-save me-2"></i>Сохранить изменения';
saveButton.classList.add('btn-warning');
saveButton.classList.remove('btn-success');
} else if (saveButton) {
saveButton.innerHTML = '<i class="bi bi-save me-2"></i>Сохранить все настройки';
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 = '<span class="badge bg-success"><i class="bi bi-play-circle me-1"></i>Активен</span>';
} else {
statusBadge.innerHTML = '<span class="badge bg-secondary"><i class="bi bi-stop-circle me-1"></i>Неактивен</span>';
}
}
} catch (error) {
console.error('Ошибка обновления статуса:', error);
}
}