- Удалена функция получения IP-адреса клиента, так как она больше не используется. - Обновлена функция логирования действий пользователя для исключения параметра IP-адреса. - Обновлены все вызовы логирования в коде, чтобы соответствовать новым изменениям. - Удалены ссылки на IP-адрес в интерфейсе отображения логов действий.
386 lines
14 KiB
HTML
386 lines
14 KiB
HTML
<!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"
|
||
>×</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">×</span>
|
||
<img class="image-modal-content" id="modalImage" loading="lazy" />
|
||
</div>
|
||
|
||
<script src="/settings.js"></script>
|
||
<script src="/pwa.js"></script>
|
||
</body>
|
||
</html>
|