// noinspection DuplicatedCode let currentPage = 1; let totalPages = 1; let allUsers = []; // Добавляем массив для хранения всех пользователей const perPage = 10; // Инициализация Toastr toastr.options = { "closeButton": true, "debug": false, "newestOnTop": false, "progressBar": false, "positionClass": "toast-bottom-right", "preventDuplicates": false, "onclick": null, "showDuration": "300", "hideDuration": "1000", "timeOut": "5000", "extendedTimeOut": "1000", "showEasing": "swing", "hideEasing": "linear", "showMethod": "fadeIn", "hideMethod": "fadeOut" }; // Функция загрузки пользователей function loadUsers(page) { if (page < 1 || page > totalPages) return; currentPage = page; fetch(`/telezab/rest/api/users?page=${currentPage}&per_page=${perPage}`) .then(response => response.json()) .then(data => { totalPages = data.total_pages; allUsers = data.users; // Сохраняем всех пользователей updateUsersTable(data.users); updatePagination(data.current_page, data.total_pages); }) .catch(error => { console.error('Error fetching users:', error); toastr.error('Ошибка загрузки пользователей. Пожалуйста, попробуйте позже.'); }); } // Функция обновления таблицы пользователей function updateUsersTable(users) { const tableBody = document.getElementById('users-table').querySelector('tbody'); tableBody.innerHTML = ''; users.forEach(user => { const row = document.createElement('tr'); row.innerHTML = ` ${user.chat_id} ${user.telegram_id} ${user.email} ${user.subscriptions.join(', ') || 'Нет подписок'} ${user.disaster_only} ${user.status} `; tableBody.appendChild(row); }); setupEditButtons(); } // Функция для обработки кнопок "Редактировать" function setupEditButtons() { document.querySelectorAll(".editUserBtn").forEach(button => { button.addEventListener("click", function () { const userId = this.dataset.id; openUserModal(userId); }); }); } function openUserModal(userId) { fetch(`/telezab/rest/api/users/${userId}`) .then(response => response.json()) .then(data => { document.getElementById("userId").innerText = data.chat_id; document.getElementById("telegram_id").innerText = data.telegram_id; document.getElementById("userEmail").innerText = data.email; const blockBtn = document.getElementById("toggleBlockUser"); blockBtn.innerText = data.blocked ? "Разблокировать" : "Заблокировать"; // Устанавливаем обработчик событий один раз blockBtn.onclick = function () { toggleUserBlock(userId, data.blocked); // Передаём текущий статус }; document.getElementById("deleteUser").onclick = function () { deleteUser(userId); }; // Загрузка событий пользователя loadUserEvents(data.chat_id); // Использование Bootstrap для показа модального окна var myModal = new bootstrap.Modal(document.getElementById('userModal'), { keyboard: false }); myModal.show(); // Открытие модального окна }) .catch(error => { console.error('Error fetching user data:', error); toastr.error('Ошибка загрузки данных пользователя. Пожалуйста, попробуйте позже.'); }); } // Функция форматирования времени function formatDate(isoString) { const date = new Date(isoString); const year = date.getFullYear(); const month = String(date.getMonth() + 1).padStart(2, '0'); // Месяцы с 0, поэтому +1 const day = String(date.getDate()).padStart(2, '0'); const hours = String(date.getHours()).padStart(2, '0'); const minutes = String(date.getMinutes()).padStart(2, '0'); const seconds = String(date.getSeconds()).padStart(2, '0'); return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; } // Функция загрузки событий пользователя function loadUserEvents(chatId) { fetch(`/telezab/rest/api/users/${chatId}/user_events`) .then(response => response.json()) .then(data => { const tableBody = document.getElementById('userEventsTable').querySelector('tbody'); tableBody.innerHTML = ''; if (data && data.length > 0) { // Проверка массива данных data.forEach(event => { const row = document.createElement('tr'); row.innerHTML = ` ${event.event_type} ${formatDate(event.timestamp)} `; tableBody.appendChild(row); }); } else { tableBody.innerHTML = 'События не найдены'; } }) .catch(error => { console.error('Error fetching user events:', error); toastr.error('Ошибка загрузки событий пользователя. Пожалуйста, попробуйте позже.'); }); } // Обработчик закрытия модального окна document.querySelector(".btn-close").addEventListener("click", function () { var myModal = new bootstrap.Modal(document.getElementById('userModal')); myModal.hide(); // Закрытие модального окна }); // Функция для блокировки/разблокировки пользователя function toggleUserBlock(userId, isBlocked) { fetch(`/telezab/rest/api/users/${userId}/block`, { method: "POST" }) .then(() => { // Скрыть модальное окно с помощью Bootstrap var myModal = bootstrap.Modal.getInstance(document.getElementById('userModal')); if (myModal) { myModal.hide(); // Закрытие модального окна } loadUsers(currentPage); // Перезагрузите список пользователей // Отображение toast-уведомления об успешном действии if (isBlocked) { toastr.success('Пользователь разблокирован.'); } else { toastr.success('Пользователь заблокирован.'); } }) .catch(error => { console.error("Ошибка при изменении статуса пользователя:", error); toastr.error('Ошибка при изменении статуса пользователя. Пожалуйста, попробуйте позже.'); }); } // Функция просмотра действий пользователя function viewUserEvents(userId) { window.location.href = `/telezab/rest/api/users/${userId}/events`; } // Функция для удаления пользователя function deleteUser(userId) { // Показываем модальное окно $('#deleteConfirmationModal').modal('show'); // Обработчик кнопки подтверждения удаления document.getElementById('confirmDeleteButton').onclick = function () { const confirmationText = document.getElementById('confirmationText').value; if (confirmationText === 'УДАЛИТЬ') { fetch(`/telezab/rest/api/users/${userId}`, { method: "DELETE" }) .then(() => { var myModal = bootstrap.Modal.getInstance(document.getElementById('userModal')); if (myModal) { myModal.hide(); } loadUsers(currentPage); toastr.success('Пользователь успешно удален.'); $('#deleteConfirmationModal').modal('hide'); // Скрываем модальное окно }) .catch(error => { console.error("Ошибка при удалении пользователя:", error); toastr.error('Ошибка при удалении пользователя. Пожалуйста, попробуйте позже.'); $('#deleteConfirmationModal').modal('hide'); // Скрываем модальное окно }); } else { toastr.error('Неверное слово для подтверждения.'); } }; } function addNewUser() { const newUserId = document.getElementById("newUserId"); const newUsername = document.getElementById("newUsername"); const newUserEmail = document.getElementById("newUserEmail"); if (!newUserId.checkValidity() || !newUsername.checkValidity() || !newUserEmail.checkValidity()) { alert("Пожалуйста, заполните все поля корректно."); return; } fetch(`/telezab/rest/api/users`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ chat_id: newUserId.value, telegram_id: newUsername.value, user_email: newUserEmail.value }) }) .then(response => { if (!response.ok) { return response.json().then(data => { throw new Error(data.error || 'Ошибка при добавлении пользователя.'); }); } return response.json(); }) .then(() => { var myModal = bootstrap.Modal.getInstance(document.getElementById('addUserModal')); if (myModal) { myModal.hide(); } loadUsers(currentPage); toastr.success('Пользователь успешно добавлен.'); }) .catch(error => { console.error("Ошибка при добавлении пользователя:", error); toastr.error(error.message || 'Ошибка при добавлении пользователя. Пожалуйста, попробуйте позже.'); }); } // Добавляем обработчик событий для кнопки "Добавить" document.getElementById("addNewUser").addEventListener("click", addNewUser); window.onclick = function (event) { if (event.target === document.getElementById("userModal")) { $('#userModal').modal('hide'); // Закрываем модальное окно с помощью Bootstrap } }; // Функция обновления пагинации function updatePagination(currentPage, totalPages) { const paginationContainer = document.getElementById('pagination'); paginationContainer.innerHTML = ''; const prevButton = document.createElement('li'); prevButton.classList.add('page-item'); prevButton.classList.toggle('disabled', currentPage === 1); prevButton.innerHTML = `«`; paginationContainer.appendChild(prevButton); for (let page = 1; page <= totalPages; page++) { const pageItem = document.createElement('li'); pageItem.classList.add('page-item'); pageItem.classList.toggle('active', page === currentPage); const pageLink = document.createElement('a'); pageLink.classList.add('page-link'); pageLink.href = "#"; pageLink.textContent = page; pageLink.onclick = () => loadUsers(page); pageItem.appendChild(pageLink); paginationContainer.appendChild(pageItem); } const nextButton = document.createElement('li'); nextButton.classList.add('page-item'); nextButton.classList.toggle('disabled', currentPage === totalPages); nextButton.innerHTML = `»`; paginationContainer.appendChild(nextButton); } $(document).ready(function() { // Обработчик событий для кнопки "Действия пользователя" $(document).on('click', '.user-events-button', function() { var chatId = $(this).data('chat-id'); console.log("Chat ID:", chatId); // Логирование chatId if (!chatId) return; // Отправка AJAX-запроса к API $.ajax({ url: '/telezab/rest/api/' + chatId + '/user_events', type: 'GET', success: function(data) { // Обработка успешного ответа var eventsHtml = ''; if (data.events && data.events.length > 0) { data.events.forEach(function(event) { // Замените event.event_description и event.event_date на реальные поля из вашего ответа API eventsHtml += '

' + event.action + ' - ' + event.timestamp + '

'; }); } else { eventsHtml = '

Действия пользователя не найдены.

'; } $('#userEventsModalBody').html(eventsHtml); $('#userEventsModal').modal('show'); // Открытие модального окна }, error: function() { // Обработка ошибки $('#userEventsModalBody').html('

Ошибка загрузки действий пользователя.

'); $('#userEventsModal').modal('show'); // Открытие модального окна } }); }); $(document).on('click', '.view-user', function() { var userId = $(this).data('id'); $('#searchUsersModal').modal('hide'); // Скрываем модальное окно поиска openUserModal(userId); // Открываем модальное окно карточки пользователя }); }); $('#searchUsersButton').click(function() { var telegramId = $('#searchTelegramId').val(); var email = $('#searchEmail').val(); $.ajax({ url: '/telezab/rest/api/users/search', type: 'GET', data: { telegram_id: telegramId, email: email }, success: function(users) { var tableBody = $('#searchResultsTableModal tbody'); tableBody.empty(); if (users.length > 0) { users.forEach(function(user) { tableBody.append( '' + '' + user.chat_id + '' + '' + user.telegram_id + '' + '' + user.email + '' + '' + '' ); }); $('#searchResults').show(); // Показываем блок с результатами поиска } else { $('#searchResults').hide(); // Скрываем блок, если нет результатов toastr.info('Пользователи не найдены.'); } }, error: function() { toastr.error('Ошибка при выполнении поиска.'); } }); }); const addUserModalEl = document.getElementById('addUserModal'); addUserModalEl.addEventListener('hidden.bs.modal', () => { document.getElementById("newUserId").value = ''; document.getElementById("newUsername").value = ''; document.getElementById("newUserEmail").value = ''; }); // Очистка поля подтверждения удаления при закрытии модального окна удаления пользователя const deleteModalEl = document.getElementById('deleteConfirmationModal'); deleteModalEl.addEventListener('hidden.bs.modal', () => { document.getElementById('confirmationText').value = ''; }); // Запуск загрузки данных document.addEventListener("DOMContentLoaded", () => { loadUsers(currentPage); });