// Переменные для пагинации логов let logsOffset = 0; const logsLimit = 50; let hasMoreLogs = true; // Проверка аутентификации async function checkAuthentication() { try { const response = await fetch("/api/auth/status"); if (!response.ok) { localStorage.removeItem("isAuthenticated"); localStorage.removeItem("username"); window.location.href = "/"; return false; } const authData = await response.json(); if (!authData.authenticated) { localStorage.removeItem("isAuthenticated"); localStorage.removeItem("username"); window.location.href = "/"; return false; } return true; } catch (error) { console.error("Ошибка проверки аутентификации:", error); return false; } } // Загрузка информации о пользователе для применения accent color async function loadUserInfo() { try { const response = await fetch("/api/user"); if (response.ok) { const user = await response.json(); const accentColor = user.accent_color || "#007bff"; if ( getComputedStyle(document.documentElement) .getPropertyValue("--accent-color") .trim() !== accentColor ) { document.documentElement.style.setProperty("--accent-color", accentColor); } } } catch (error) { console.error("Ошибка загрузки информации о пользователе:", error); } } // Переключение табов function initTabs() { const tabs = document.querySelectorAll(".settings-tab"); const contents = document.querySelectorAll(".tab-content"); tabs.forEach((tab) => { tab.addEventListener("click", () => { const tabName = tab.dataset.tab; // Убираем активный класс со всех табов и контентов tabs.forEach((t) => t.classList.remove("active")); contents.forEach((c) => c.classList.remove("active")); // Добавляем активный класс к выбранному табу и контенту tab.classList.add("active"); document.getElementById(`${tabName}-tab`).classList.add("active"); // Загружаем данные для таба if (tabName === "archive") { loadArchivedNotes(); } else if (tabName === "logs") { loadLogs(true); } }); }); } // Загрузка архивных заметок async function loadArchivedNotes() { const container = document.getElementById("archived-notes-container"); container.innerHTML = '
Загрузка...
'; try { const response = await fetch("/api/notes/archived"); if (!response.ok) { throw new Error("Ошибка загрузки архивных заметок"); } const notes = await response.json(); if (notes.length === 0) { container.innerHTML = 'Архив пуст
'; return; } container.innerHTML = ""; notes.forEach((note) => { const noteDiv = document.createElement("div"); noteDiv.className = "archived-note-item"; noteDiv.dataset.noteId = note.id; // Форматируем дату const created = new Date(note.created_at.replace(" ", "T") + "Z"); const dateStr = new Intl.DateTimeFormat("ru-RU", { day: "2-digit", month: "2-digit", year: "numeric", hour: "2-digit", minute: "2-digit", }).format(created); // Преобразуем markdown в HTML для предпросмотра const htmlContent = marked.parse(note.content); const preview = htmlContent.substring(0, 200) + (htmlContent.length > 200 ? "..." : ""); // Изображения let imagesHtml = ""; if (note.images && note.images.length > 0) { imagesHtml = `Ошибка загрузки архивных заметок
'; } } // Добавление обработчиков для архивных заметок function addArchivedNotesEventListeners() { // Восстановление document.querySelectorAll(".btn-restore").forEach((btn) => { btn.addEventListener("click", async (e) => { const noteId = e.target.closest("button").dataset.id; if (confirm("Восстановить эту заметку из архива?")) { try { const response = await fetch(`/api/notes/${noteId}/unarchive`, { method: "PUT", }); if (!response.ok) { throw new Error("Ошибка восстановления заметки"); } // Удаляем элемент из списка document .querySelector(`[data-note-id="${noteId}"]`) ?.remove(); // Проверяем, остались ли заметки const container = document.getElementById("archived-notes-container"); if (container.children.length === 0) { container.innerHTML = 'Архив пуст
'; } alert("Заметка восстановлена!"); } catch (error) { console.error("Ошибка:", error); alert("Ошибка восстановления заметки"); } } }); }); // Окончательное удаление document.querySelectorAll(".btn-delete-permanent").forEach((btn) => { btn.addEventListener("click", async (e) => { const noteId = e.target.closest("button").dataset.id; if ( confirm( "Удалить эту заметку НАВСЕГДА? Это действие нельзя отменить!" ) ) { try { const response = await fetch(`/api/notes/archived/${noteId}`, { method: "DELETE", }); if (!response.ok) { throw new Error("Ошибка удаления заметки"); } // Удаляем элемент из списка document .querySelector(`[data-note-id="${noteId}"]`) ?.remove(); // Проверяем, остались ли заметки const container = document.getElementById("archived-notes-container"); if (container.children.length === 0) { container.innerHTML = 'Архив пуст
'; } alert("Заметка удалена окончательно"); } catch (error) { console.error("Ошибка:", error); alert("Ошибка удаления заметки"); } } }); }); } // Загрузка логов async function loadLogs(reset = false) { if (reset) { logsOffset = 0; hasMoreLogs = true; } const tbody = document.getElementById("logsTableBody"); const loadMoreContainer = document.getElementById("logsLoadMore"); const filterValue = document.getElementById("logTypeFilter").value; if (reset) { tbody.innerHTML = '