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:
+4
-5
@@ -18,6 +18,7 @@ async function checkAuth() {
|
||||
const res = await fetch(`${API}/api/auth/me`, { headers: hdr() });
|
||||
if (!res.ok) { cleanupSession(); return false; }
|
||||
currentUser = await res.json();
|
||||
await initDateTime();
|
||||
return true;
|
||||
} catch { cleanupSession(); return false; }
|
||||
}
|
||||
@@ -199,7 +200,7 @@ function notifyTime(ts) {
|
||||
if (diff < 60000) return 'только что';
|
||||
if (diff < 3600000) return `${Math.floor(diff / 60000)} мин назад`;
|
||||
if (diff < 86400000) return `${Math.floor(diff / 3600000)} ч назад`;
|
||||
return d.toLocaleString('ru-RU', { day: '2-digit', month: '2-digit', hour: '2-digit', minute: '2-digit' });
|
||||
return fmtDateTime(d);
|
||||
}
|
||||
|
||||
function setNotifyUnread(n) {
|
||||
@@ -490,13 +491,11 @@ let lessonModalGroups = null;
|
||||
let lessonModalGroupsPromise = null;
|
||||
|
||||
function lessonTodayIso() {
|
||||
const d = new Date();
|
||||
return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`;
|
||||
return todayIso();
|
||||
}
|
||||
|
||||
function lessonNowTime() {
|
||||
const d = new Date();
|
||||
return `${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}`;
|
||||
return nowHm();
|
||||
}
|
||||
|
||||
async function loadLessonGroups() {
|
||||
|
||||
Reference in New Issue
Block a user