308 lines
11 KiB
JavaScript
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);
|
|
}
|
|
}
|