feat(datetime): timezone/time_format в настройках + единый хелпер дат
Часовой пояс и формат времени (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.
This commit is contained in:
+2
-2
@@ -41,8 +41,8 @@ function renderPage() {
|
||||
<tr>
|
||||
<td><b>${esc(b.ip)}</b></td>
|
||||
<td><span class="reason-badge ${rcls}">${esc(reason)}</span></td>
|
||||
<td>${new Date(b.created_at).toLocaleString('ru')}</td>
|
||||
<td>${new Date(b.banned_until).toLocaleString('ru')}</td>
|
||||
<td>${fmtFull(b.created_at)}</td>
|
||||
<td>${fmtFull(b.banned_until)}</td>
|
||||
<td><button class="row-btn" data-unban="${esc(b.ip)}" title="Разблокировать">✕</button></td>
|
||||
</tr>`;
|
||||
}).join('');
|
||||
|
||||
Reference in New Issue
Block a user