NoteJS/public/settings.html
Fovway 5306122a7d Упрощено логирование действий пользователя и удалены функции получения IP-адреса
- Удалена функция получения IP-адреса клиента, так как она больше не используется.
- Обновлена функция логирования действий пользователя для исключения параметра IP-адреса.
- Обновлены все вызовы логирования в коде, чтобы соответствовать новым изменениям.
- Удалены ссылки на IP-адрес в интерфейсе отображения логов действий.
2025-10-29 23:15:46 +07:00

386 lines
14 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"
/>
<title>Настройки - NoteJS</title>
<!-- Предотвращение мерцания темы -->
<script>
(function () {
try {
const savedTheme = localStorage.getItem("theme");
const systemPrefersDark = window.matchMedia(
"(prefers-color-scheme: dark)"
).matches;
const theme = savedTheme || (systemPrefersDark ? "dark" : "light");
if (theme === "dark") {
document.documentElement.setAttribute("data-theme", "dark");
}
} catch (e) {}
})();
</script>
<!-- PWA Meta Tags -->
<meta
name="description"
content="NoteJS - современная система заметок с поддержкой Markdown, изображений, тегов и календаря"
/>
<meta name="theme-color" content="#007bff" />
<meta name="mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="default" />
<meta name="apple-mobile-web-app-title" content="NoteJS" />
<meta name="msapplication-TileColor" content="#007bff" />
<!-- Icons -->
<link rel="icon" type="image/svg+xml" href="/icon.svg" />
<link
rel="icon"
type="image/png"
sizes="32x32"
href="/icons/icon-32x32.png"
/>
<link
rel="icon"
type="image/png"
sizes="16x16"
href="/icons/icon-16x16.png"
/>
<link
rel="apple-touch-icon"
sizes="180x180"
href="/icons/icon-192x192.png"
/>
<link rel="mask-icon" href="/icon.svg" color="#007bff" />
<!-- Manifest -->
<link rel="manifest" href="/manifest.json" />
<!-- Styles -->
<link rel="stylesheet" href="/style.css?v=5" />
<!-- Scripts -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/iconify/2.0.0/iconify.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/marked/11.1.0/marked.min.js"></script>
</head>
<body>
<div class="container">
<header class="notes-header">
<span><span class="iconify" data-icon="mdi:cog"></span> Настройки</span>
<div class="user-info">
<button
id="theme-toggle-btn"
class="theme-toggle-btn"
title="Переключить тему"
>
<span class="iconify" data-icon="mdi:theme-light-dark"></span>
</button>
<a href="/notes" class="back-btn">
<span class="iconify" data-icon="mdi:note-text"></span> К заметкам
</a>
<a href="/profile" class="back-btn">
<span class="iconify" data-icon="mdi:account"></span> Профиль
</a>
</div>
</header>
<!-- Табы навигации -->
<div class="settings-tabs">
<button class="settings-tab active" data-tab="appearance">
<span class="iconify" data-icon="mdi:palette"></span> Внешний вид
</button>
<button class="settings-tab" data-tab="ai">
<span class="iconify" data-icon="mdi:robot"></span> AI настройки
</button>
<button class="settings-tab" data-tab="archive">
<span class="iconify" data-icon="mdi:archive"></span> Архив заметок
</button>
<button class="settings-tab" data-tab="logs">
<span class="iconify" data-icon="mdi:history"></span> История действий
</button>
</div>
<!-- Контент табов -->
<div class="settings-content">
<!-- Внешний вид -->
<div class="tab-content active" id="appearance-tab">
<h3>Внешний вид</h3>
<div class="form-group">
<label for="settings-accentColor">Цветовой акцент</label>
<div class="accent-color-picker">
<div
class="color-option"
data-color="#007bff"
style="background-color: #007bff"
title="Синий"
></div>
<div
class="color-option"
data-color="#28a745"
style="background-color: #28a745"
title="Зеленый"
></div>
<div
class="color-option"
data-color="#dc3545"
style="background-color: #dc3545"
title="Красный"
></div>
<div
class="color-option"
data-color="#fd7e14"
style="background-color: #fd7e14"
title="Оранжевый"
></div>
<div
class="color-option"
data-color="#6f42c1"
style="background-color: #6f42c1"
title="Фиолетовый"
></div>
<div
class="color-option"
data-color="#e83e8c"
style="background-color: #e83e8c"
title="Розовый"
></div>
</div>
<input
type="color"
id="settings-accentColor"
value="#007bff"
style="margin-top: 10px"
/>
</div>
<button id="updateAppearanceBtn" class="btnSave">
Сохранить изменения
</button>
</div>
<!-- AI настройки -->
<div class="tab-content" id="ai-tab">
<h3>Настройки AI</h3>
<div class="form-group ai-toggle-group">
<label class="ai-toggle-label">
<div class="toggle-label-content">
<span class="toggle-text-main">Включить помощь ИИ</span>
<span class="toggle-text-desc"
>Показывать кнопку "Помощь ИИ" в редакторах заметок</span
>
</div>
<div class="toggle-switch-wrapper">
<input
type="checkbox"
id="ai-enabled-toggle"
class="toggle-checkbox"
/>
<span class="toggle-slider"></span>
</div>
</label>
</div>
<div class="form-group">
<label for="openai-api-key">OpenAI API Key</label>
<input
type="password"
id="openai-api-key"
placeholder="sk-..."
class="form-input"
/>
<p style="color: #666; font-size: 12px; margin-top: 5px">
Введите ваш OpenAI API ключ
</p>
</div>
<div class="form-group">
<label for="openai-base-url">OpenAI Base URL</label>
<input
type="text"
id="openai-base-url"
placeholder="https://api.openai.com/v1"
class="form-input"
/>
<p style="color: #666; font-size: 12px; margin-top: 5px">
URL для API запросов (например, https://api.openai.com/v1)
</p>
</div>
<div class="form-group">
<label for="openai-model">Модель</label>
<input
type="text"
id="openai-model"
placeholder="gpt-3.5-turbo"
class="form-input"
/>
<p style="color: #666; font-size: 12px; margin-top: 5px">
Название модели (например, gpt-4, deepseek/deepseek-chat).
<a
href="https://openrouter.ai/models"
target="_blank"
style="color: var(--accent-color)"
>
Список доступных моделей
</a>
</p>
</div>
<button id="updateAiSettingsBtn" class="btnSave">
Сохранить AI настройки
</button>
</div>
<!-- Архив заметок -->
<div class="tab-content" id="archive-tab">
<div
style="
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 10px;
"
>
<h3>Архивные заметки</h3>
<button
id="delete-all-archived"
class="btn-danger"
style="font-size: 14px; padding: 8px 16px"
>
<span class="iconify" data-icon="mdi:delete-sweep"></span> Удалить
все
</button>
</div>
<p style="color: #666; font-size: 14px; margin-bottom: 20px">
Архивированные заметки можно восстановить или удалить окончательно
</p>
<div id="archived-notes-container" class="archived-notes-list">
<!-- Заметки будут загружены динамически -->
</div>
</div>
<!-- История действий -->
<div class="tab-content" id="logs-tab">
<h3>История действий</h3>
<!-- Фильтры -->
<div class="logs-filters">
<select id="logTypeFilter" class="log-filter-select">
<option value="">Все действия</option>
<option value="login">Вход</option>
<option value="logout">Выход</option>
<option value="register">Регистрация</option>
<option value="note_create">Создание заметки</option>
<option value="note_update">Редактирование заметки</option>
<option value="note_delete">Удаление заметки</option>
<option value="note_pin">Закрепление</option>
<option value="note_archive">Архивирование</option>
<option value="note_unarchive">Восстановление</option>
<option value="note_delete_permanent">
Окончательное удаление
</option>
<option value="profile_update">Обновление профиля</option>
<option value="ai_improve">Улучшение через AI</option>
</select>
<button id="refreshLogs" class="btnSave">
<span class="iconify" data-icon="mdi:refresh"></span> Обновить
</button>
</div>
<!-- Таблица логов -->
<div class="logs-table-container">
<table class="logs-table">
<thead>
<tr>
<th>Дата и время</th>
<th>Действие</th>
<th>Детали</th>
</tr>
</thead>
<tbody id="logsTableBody">
<!-- Логи будут загружены динамически -->
</tbody>
</table>
</div>
<div
id="logsLoadMore"
class="load-more-container"
style="display: none"
>
<button id="loadMoreLogsBtn" class="btnSave">Загрузить еще</button>
</div>
</div>
</div>
</div>
<div class="footer">
<p>Создатель: <span>Fovway</span></p>
</div>
<!-- Модальное окно подтверждения удаления всех архивных заметок -->
<div id="deleteAllArchivedModal" class="modal">
<div class="modal-content">
<div class="modal-header">
<h3>Подтверждение удаления</h3>
<span class="modal-close" id="deleteAllArchivedModalClose"
>&times;</span
>
</div>
<div class="modal-body">
<p style="color: #dc3545; font-weight: bold; margin-bottom: 15px">
⚠️ ВНИМАНИЕ: Это действие нельзя отменить!
</p>
<p style="margin-bottom: 20px">
Вы действительно хотите удалить ВСЕ архивные заметки? Все заметки и
их изображения будут удалены навсегда.
</p>
<div style="margin-bottom: 15px">
<label
for="deleteAllPassword"
style="display: block; margin-bottom: 5px; font-weight: bold"
>
Введите пароль для подтверждения:
</label>
<input
type="password"
id="deleteAllPassword"
placeholder="Пароль от аккаунта"
class="modal-password-input"
/>
</div>
</div>
<div class="modal-footer">
<button
id="confirmDeleteAllArchived"
class="btn-danger"
style="margin-right: 10px"
>
<span class="iconify" data-icon="mdi:delete-forever"></span> Удалить
все
</button>
<button id="cancelDeleteAllArchived" class="btn-secondary">
Отмена
</button>
</div>
</div>
</div>
<!-- Модальное окно для просмотра изображений -->
<div id="imageModal" class="image-modal">
<span class="image-modal-close">&times;</span>
<img class="image-modal-content" id="modalImage" loading="lazy" />
</div>
<script src="/settings.js"></script>
<script src="/pwa.js"></script>
</body>
</html>