Часовой пояс и формат времени (24h/12h) перенесены из браузера в настройки приложения: валидация IANA-зоны, сид в db/init.sql + db/migration.sql, отдача в GET /api/public-settings, раздел #sec-datetime в настройках с живым превью. Границы суток в SQL переведены на tzDayStart/tzDayEnd + bindTz ($TZ$) — раньше $n::date по TIMESTAMPTZ считал дни в UTC (у контейнера TimeZone=UTC) и молча сдвигал выборку на день; хардкод Europe/Moscow вычищен, now() заменён на tzWall(). Новый public/js/datetime.js: три семейства хелперов (instant / чистая DATE-строка без Date() / чистая TIME-строка), подключён на всех страницах включая публичные share/report/index, initDateTime() встроен в checkAuth(). Прямые toLocale*/getFullYear/toISOString().slice(0,10) в public/ выпилены. Попутно: bindTz добавляет параметр только при наличии $TZ$ в SQL (иначе запрос виснет вечно без global error handler) — регрессия закрыта в api.smoketest.js; починены off-by-one месяца в report.js и группировка по дате в share.js.
53 lines
2.8 KiB
HTML
53 lines
2.8 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="ru">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
<title>Корзина — Админ-панель</title>
|
|
<link rel="stylesheet" href="admin.css">
|
|
</head>
|
|
<body data-page="trash">
|
|
<div class="layout">
|
|
<div class="sidebar" id="sidebar"></div>
|
|
<div class="main">
|
|
<h2>Корзина</h2>
|
|
<div class="trash-head">
|
|
<span class="trash-muted" id="trashInfo"></span>
|
|
<button class="danger-btn" id="emptyBtn" type="button">Очистить корзину</button>
|
|
</div>
|
|
<label class="toggle pending-toggle" id="pendingToggleRow">
|
|
<input type="checkbox" id="pendingToggle">
|
|
<span class="toggle-track"><span class="toggle-thumb"></span></span>
|
|
<span class="toggle-text"><b>Показать помеченные на удаление</b><small id="pendingToggleHint">Данные не удаляются сразу: они помечаются и исчезают из корзины. Здесь их можно вернуть в корзину и восстановить</small></span>
|
|
</label>
|
|
<div class="trash-section" id="pendingSection" hidden>
|
|
<h3>Помечены на удаление <span class="trash-muted" id="pendingInfo"></span></h3>
|
|
<p class="trash-muted">Эти данные будут удалены автоматически и безвозвратно вместе с файлами. Чтобы отменить удаление, нажмите «В корзину» — данные вернутся в корзину, откуда их можно восстановить.</p>
|
|
<h4>Группы <span class="trash-muted" id="pendingGroupsInfo"></span></h4>
|
|
<div class="grid" id="pendingGroupsGrid"><div class="empty">Загрузка...</div></div>
|
|
<h4>Записи журнала <span class="trash-muted" id="pendingEntriesInfo"></span></h4>
|
|
<div class="grid" id="pendingGrid"><div class="empty">Загрузка...</div></div>
|
|
</div>
|
|
<div class="trash-section" id="groupsSection">
|
|
<h3>Группы <span class="trash-muted" id="groupsInfo"></span></h3>
|
|
<div class="grid" id="groupsGrid"><div class="empty">Загрузка...</div></div>
|
|
</div>
|
|
<div class="trash-section">
|
|
<h3>Записи журнала <span class="trash-muted" id="entriesInfo"></span></h3>
|
|
<div class="grid" id="grid"><div class="empty">Загрузка...</div></div>
|
|
<div class="pager" id="pager"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="modal-overlay" id="imgModal">
|
|
<img id="imgModalSrc">
|
|
</div>
|
|
|
|
<div class="toast" id="toast"></div>
|
|
<script src="vendor/lucide.min.js"></script>
|
|
<script src="js/datetime.js"></script>
|
|
<script src="admin.js"></script>
|
|
<script src="js/trash.js"></script>
|
|
</body>
|
|
</html> |