/**
* Управление настройками уведомлений
*/
class NotificationSettingsManager {
constructor() {
this.settings = {};
this.init();
}
init() {
this.loadSettings();
this.setupSoundToggle();
}
async loadSettings() {
const container = document.getElementById('settingsContainer');
if (!container) return;
try {
const response = await fetch('/api/notifications/settings/', {
credentials: 'same-origin',
headers: {
'Accept': 'application/json',
}
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
this.settings = data.settings || {};
this.renderSettings();
} catch (error) {
console.error('[Settings] Error loading:', error);
container.innerHTML = `
Ошибка загрузки настроек: ${error.message}
`;
}
}
renderSettings() {
const container = document.getElementById('settingsContainer');
if (!container) return;
const categories = [
{ code: 'communications', name: 'Коммуникации', icon: 'bi-chat-dots', description: 'Сообщения, упоминания, ответы в чатах' },
{ code: 'documents', name: 'Документы', icon: 'bi-file-earmark-text', description: 'Новые документы, ознакомления' },
{ code: 'requests', name: 'Заявления', icon: 'bi-clipboard-check', description: 'Заявки, согласования, комментарии' },
{ code: 'calendar', name: 'Календарь', icon: 'bi-calendar-event', description: 'События, напоминания, изменения' },
{ code: 'department', name: 'Отдел', icon: 'bi-people', description: 'Изменения в структуре отдела' },
{ code: 'profile', name: 'Профиль', icon: 'bi-person', description: 'Изменения профиля и безопасности' },
{ code: 'feed', name: 'Новости', icon: 'bi-newspaper', description: 'Публикации, комментарии, реакции' },
{ code: 'system', name: 'Система', icon: 'bi-gear', description: 'Системные уведомления и обновления' }
];
let html = '';
categories.forEach(cat => {
const setting = this.settings[cat.code] || {
is_enabled: true,
web_enabled: true,
email_enabled: false,
email_frequency: 'instant',
telegram_enabled: false
};
html += `
`;
});
html += '
';
container.innerHTML = html;
// Добавить обработчики
this.attachEventHandlers();
}
attachEventHandlers() {
// Обработчики для главных переключателей
document.querySelectorAll('.setting-toggle').forEach(toggle => {
toggle.addEventListener('change', async (e) => {
const category = toggle.dataset.category;
const field = toggle.dataset.field;
const value = toggle.checked;
// Показать/скрыть каналы
const channels = document.getElementById(`channels_${category}`);
if (channels) {
if (value) {
channels.classList.remove('d-none');
} else {
channels.classList.add('d-none');
}
}
await this.updateSetting(category, field, value);
});
});
// Обработчики для каналов
document.querySelectorAll('.channel-toggle').forEach(toggle => {
toggle.addEventListener('change', async (e) => {
const category = toggle.dataset.category;
const field = toggle.dataset.field;
const value = toggle.checked;
// Если включили email, перерисовать карточку для показа частоты
if (field === 'email_enabled') {
await this.updateSetting(category, field, value);
this.renderSettings(); // Перерисовать для показа select
} else {
await this.updateSetting(category, field, value);
}
});
});
// Обработчики для частоты email
document.querySelectorAll('.email-frequency-select').forEach(select => {
select.addEventListener('change', async (e) => {
const category = select.dataset.category;
const value = select.value;
await this.updateSetting(category, 'email_frequency', value);
});
});
}
async updateSetting(category, field, value) {
try {
const response = await fetch('/api/notifications/settings/category/update/', {
method: 'PUT',
credentials: 'same-origin',
headers: {
'Content-Type': 'application/json',
'X-CSRFToken': this.getCsrfToken()
},
body: JSON.stringify({
category: category,
[field]: value
})
});
if (!response.ok) {
throw new Error('Failed to update setting');
}
// Обновить локальные настройки
if (!this.settings[category]) {
this.settings[category] = {};
}
this.settings[category][field] = value;
// Показать уведомление об успехе
this.showToast('Настройки сохранены', 'success');
} catch (error) {
console.error('[Settings] Error updating:', error);
this.showToast('Ошибка сохранения настроек', 'danger');
}
}
setupSoundToggle() {
const soundToggle = document.getElementById('soundToggle');
if (soundToggle && window.notificationManager) {
soundToggle.checked = window.notificationManager.soundEnabled;
soundToggle.addEventListener('change', (e) => {
window.notificationManager.saveSoundPreference(e.target.checked);
this.showToast(
e.target.checked ? 'Звук включен' : 'Звук выключен',
'info'
);
});
}
}
getCsrfToken() {
return document.querySelector('[name=csrfmiddlewaretoken]')?.value || '';
}
showToast(message, type = 'info') {
// Создать toast уведомление
const toastContainer = document.getElementById('toastContainer') || this.createToastContainer();
const toast = document.createElement('div');
toast.className = `toast align-items-center text-white bg-${type} border-0`;
toast.setAttribute('role', 'alert');
toast.innerHTML = `
`;
toastContainer.appendChild(toast);
const bsToast = new bootstrap.Toast(toast, { delay: 3000 });
bsToast.show();
toast.addEventListener('hidden.bs.toast', () => {
toast.remove();
});
}
createToastContainer() {
const container = document.createElement('div');
container.id = 'toastContainer';
container.className = 'toast-container position-fixed bottom-0 end-0 p-3';
document.body.appendChild(container);
return container;
}
}
/**
* Управление привязкой Telegram (упрощенная версия)
*/
class TelegramLinkManager {
constructor() {
this.container = document.getElementById('telegramLinkContainer');
if (!this.container) return;
this.init();
}
async init() {
this.renderInstructions();
}
renderInstructions() {
const botUsername = window.TELEGRAM_BOT_USERNAME || 'eusrr_bot';
this.container.innerHTML = `
Настройка Telegram уведомлений
📱 Как получать уведомления в Telegram:
-
Откройте бота @userinfobot в Telegram
Это официальный бот для получения информации о вашем аккаунте
-
Отправьте любое сообщение боту
Бот ответит вам информацией, включая ваш Chat ID (число)
-
Скопируйте ваш Chat ID
Например: 123456789
-
Добавьте Chat ID в ваш профиль
Откройте профиль → Редактировать → вставьте Chat ID в поле "Telegram"
-
Включите галочки "Telegram" для нужных категорий ниже
Выберите категории уведомлений, которые хотите получать в Telegram
-
⚠️ ВАЖНО: Отправьте
/start нашему боту @${botUsername}
Иначе бот не сможет отправлять вам сообщения из-за ограничений Telegram API
`;
}
}
// Инициализация
document.addEventListener('DOMContentLoaded', () => {
if (document.getElementById('settingsContainer')) {
window.notificationSettingsManager = new NotificationSettingsManager();
}
if (document.getElementById('telegramLinkContainer')) {
window.telegramLinkManager = new TelegramLinkManager();
}
});