работа с публикацией
This commit is contained in:
@@ -0,0 +1,362 @@
|
||||
// Глобальные переменные
|
||||
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 = '<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 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 = '<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);
|
||||
}
|
||||
}
|
||||
|
||||
// Вспомогательные функции для уведомлений
|
||||
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 = `
|
||||
<div class="d-flex align-items-center">
|
||||
<i class="bi ${icon} me-2 fs-5"></i>
|
||||
<div class="flex-grow-1">${message}</div>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
|
||||
</div>
|
||||
`;
|
||||
|
||||
alertContainer.appendChild(alert);
|
||||
|
||||
// Автоматическое удаление через 5 секунд
|
||||
setTimeout(() => {
|
||||
if (alert.parentNode) {
|
||||
alert.classList.remove('show');
|
||||
setTimeout(() => alert.remove(), 150);
|
||||
}
|
||||
}, 5000);
|
||||
}
|
||||
|
||||
function getAlertIcon(type) {
|
||||
const icons = {
|
||||
'success': 'bi-check-circle-fill',
|
||||
'warning': 'bi-exclamation-triangle-fill',
|
||||
'danger': 'bi-x-circle-fill',
|
||||
'info': 'bi-info-circle-fill'
|
||||
};
|
||||
return icons[type] || 'bi-info-circle-fill';
|
||||
}
|
||||
Reference in New Issue
Block a user