feat: implement night mode functionality with UI updates and journey tracking
- Added NightScreen component for displaying night mode information and alerts. - Introduced NextStops component to show upcoming stops during a journey. - Implemented logic for determining night mode activation based on schedule and user settings. - Created journey utility functions to manage onward journey data and stop information. - Updated tests to cover new night mode features and journey logic. - Added fixture for testing night mode scenarios with specific timestamps. - Removed QR code from night screen for a cleaner UI experience. - Enhanced admin settings to manage night mode configurations.
BIN
artifacts/journey-1079x591.jpg
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
artifacts/journey-390x667.jpg
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
artifacts/journey-879x593.jpg
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
artifacts/journey-kvant-1079x591.jpg
Normal file
|
After Width: | Height: | Size: 54 KiB |
BIN
artifacts/journey-kvant-390x667.jpg
Normal file
|
After Width: | Height: | Size: 33 KiB |
BIN
artifacts/journey-kvant-879x593.jpg
Normal file
|
After Width: | Height: | Size: 51 KiB |
BIN
artifacts/journey-kvant-focus-three.jpg
Normal file
|
After Width: | Height: | Size: 152 KiB |
BIN
artifacts/journey-kvant-light.jpg
Normal file
|
After Width: | Height: | Size: 105 KiB |
BIN
artifacts/journey-kvant-portrait-long.jpg
Normal file
|
After Width: | Height: | Size: 34 KiB |
BIN
artifacts/journey-kvant-repaint.jpg
Normal file
|
After Width: | Height: | Size: 128 KiB |
BIN
artifacts/journey-kvant-three-cards.jpg
Normal file
|
After Width: | Height: | Size: 149 KiB |
BIN
artifacts/journey-kvant-wide.jpg
Normal file
|
After Width: | Height: | Size: 123 KiB |
BIN
artifacts/journey-light.jpg
Normal file
|
After Width: | Height: | Size: 153 KiB |
BIN
artifacts/journey-portrait-last-page.jpg
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
artifacts/journey-three-cards.jpg
Normal file
|
After Width: | Height: | Size: 153 KiB |
BIN
artifacts/night-1280x900.jpg
Normal file
|
After Width: | Height: | Size: 74 KiB |
BIN
artifacts/night-1920x1080.jpg
Normal file
|
After Width: | Height: | Size: 108 KiB |
BIN
artifacts/night-390x667.jpg
Normal file
|
After Width: | Height: | Size: 35 KiB |
BIN
artifacts/night-879x593.jpg
Normal file
|
After Width: | Height: | Size: 47 KiB |
BIN
artifacts/night-admin-settings.jpg
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
artifacts/night-avtovokzal-reload.jpg
Normal file
|
After Width: | Height: | Size: 62 KiB |
BIN
artifacts/night-live.jpg
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
artifacts/night-no-qr.jpg
Normal file
|
After Width: | Height: | Size: 51 KiB |
BIN
artifacts/night-wake-light.jpg
Normal file
|
After Width: | Height: | Size: 44 KiB |
19
artifacts/verification-journey.md
Normal file
@@ -0,0 +1,19 @@
|
||||
# Дальше по маршруту — 11 октября 2026
|
||||
|
||||
В разделе «Информация» блок первого и последнего рейса заменён схемой следующих остановок ближайшего доступного рейса. До четырёх остановок, время в пути после посадки по расписанию, действительная конечная укороченного рейса, обратное направление. В широкой карточке схема горизонтальная, в узкой — вертикальная. Названия и числа используют существующие анимации. Неизвестное время — «—», на конечной явно показано завершение рейса.
|
||||
|
||||
Порядок и смещения остановок сохраняются один раз на маршрут в полном кеше; метаданные конечной — на рейс. Дополнительных запросов при смене ближайшего рейса нет. Старые кеши без схемы сохраняют работоспособность табло. Ключ `infoServiceEnabled` сохранён, обновлены подписи в локальных настройках и админке; изменения БД не требуются.
|
||||
|
||||
## Проверки
|
||||
|
||||
- Полный набор Board — **81 тест прошёл**, включая 8 новых проверок схемы: порядок и предел четырёх остановок, конечная и укороченный рейс, обратный рейс, после полуночи, неизвестные/неправильные смещения, старый/повреждённый/чужой/истёкший кеш, выбор после отмены, сохранение и восстановление офлайн.
|
||||
- TypeScript/Vite Board и Vite админки собраны. Импорт сервера и `git diff --check` прошли.
|
||||
- Через API прочитано полное публичное расписание Автовокзала (28): метаданные схемы присутствуют у всех 17 маршрутов.
|
||||
- Браузер использовал это расписание и **явные тестовые дневные часы** (`Тестовые часы · основная`, локальный стенд). Проверялся фильтр №4, отправление 12:15: Дом торговли / 2 мин, Поликлиника / 4 мин, Педагогический колледж / 7 мин, Школа №9 / 9 мин. Длительности — от текущей остановки, без ожидания автобуса.
|
||||
- Разрешения: 1920×1080 с тремя карточками, 1280×900, 1079×591, 879×593, 390×667. Карточка помещается; текст следующих остановок и время не пересекаются с нижним ближайшим рейсом. Исправлена первоначально выявленная обрезка длинного названия на коротком экране.
|
||||
- Автоматический переход с первых двух остановок к третьей и четвёртой проверен на 879×593. На 390×667 со стандартной настройкой информации **8 секунд** наблюдались по порядку все четыре страницы через 4 секунды: сцена автоматически получает 16 секунд и остаётся открытой до последней страницы. На уличном профиле предусмотрено 6 секунд на страницу.
|
||||
- Светлая и тёмная темы проверены. Выключение и повторное включение блока выполнены через UI; остальные карточки продолжают отображаться. Ошибок JavaScript в браузере нет.
|
||||
|
||||
Снимки: `journey-three-cards.jpg`, `journey-light.jpg`, `journey-1079x591.jpg`, `journey-879x593.jpg`, `journey-390x667.jpg`, `journey-portrait-last-page.jpg`. Часы и погода визуального стенда тестовые; рабочие устройства, база и удалённый сервер не изменялись.
|
||||
|
||||
Обновлённый основной локальный сервер на 5180 также проверен: валидный кеш «Швейной фабрики» содержит схемы всех 22 маршрутов, первый №2 в 05:44 даёт четыре следующих остановки. Основная вкладка обновлена; ночной режим и отсутствие QR сохранены. Визуальный тестовый сервер остановлен, его вкладка закрыта и viewport сброшен.
|
||||
39
artifacts/verification-night-mode.md
Normal file
@@ -0,0 +1,39 @@
|
||||
# Ночной режим — 11 октября 2026
|
||||
|
||||
Обновлены Board, настройки API устройств и форма админки. Поля `nightMode` / `nightWakeMinutes` сохраняются локально и в существующем JSONB. Новая SQL-миграция не требуется.
|
||||
|
||||
Проверки: полный набор Board — **75 passed**; API — **97 passed / 15 skipped** (PostgreSQL-интеграции не настроены). После оптимизации вычисления границ движения повторно прошли 8 целевых тестов. TypeScript/Vite Board и Vite админки собраны успешно. `git diff --check` проходит в обоих проектах.
|
||||
|
||||
Ночной экран проверялся в настоящем приложении с явно тестовыми полным расписанием, часами и отменой (`test/fixtures/night-server.mjs`). Разрешения **1920×1080**, **1280×900**, **879×593**, **390×667**: содержимое основной сцены помещается, QR и время не пересекаются с нижней панелью. На компактном вертикальном экране уведомление занимает место QR; его полный текст медленно прокручивается внутри собственного блока. Полные снимки сохранены через screenshot(fullPage), поскольку обычный снимок in-app browser может обрезать увеличенный viewport.
|
||||
|
||||
Подтверждено через UI:
|
||||
|
||||
- После последнего вечернего рейса показывается первый завтрашний; после полуночи — «Первый рейс сегодня».
|
||||
- Последний рейс в 00:15 сохраняется на обычном экране в 00:14 и в пределах запаса посадки; ночной режим возможен после его завершения.
|
||||
- Уже включённый режим сохраняется при 90 минутах ожидания и выходит за 60 минут.
|
||||
- Настройка 45 минут сохраняется после перезагрузки: режим остаётся при 60 минутах и возвращает светлую дневную тему на границе 45 минут.
|
||||
- Отмена первого рейса в 05:40 меняет первый доступный рейс на 08:00; исходное сообщение и номер маршрута видимы в ночном блоке.
|
||||
- Дневная пауза и истёкший полный кеш оставляют обычный экран.
|
||||
- В админке на отдельном тестовом стенде сохранены «Автоматически / 45 минут», устройство подтвердило применение. Повторное открытие формы сохранило 45 минут; выключение отправлено следующей версией.
|
||||
|
||||
Снимки: `night-1920x1080.jpg`, `night-1280x900.jpg`, `night-879x593.jpg`, `night-390x667.jpg`, `night-wake-light.jpg`, `night-admin-settings.jpg`. Данные стендов не относятся к действующему расписанию или рабочей БД. Docker, физический Mi Box и производственная PostgreSQL БД в этой проверке не использовались; развёртывание на сервер не выполнялось.
|
||||
|
||||
На реальном полном расписании остановки выявлен отдельный рейс 00:40 (отправление 00:15), принадлежащий новому календарному дню. Логика учитывает такой короткий хвост предыдущего движения и длинный перерыв непосредственно после него; непрерывное ночное движение и более поздние дневные паузы не считаются ночным закрытием. Для этого добавлен регрессионный тест.
|
||||
|
||||
Итоговая сборка дополнительно проверена в основном табло на реальных данных «Швейной фабрики»: ночной режим активен, первый рейс сегодня — №2 в 05:44. Снимок `night-live.jpg`; основная вкладка оставлена открытой, тестовые серверы остановлены.
|
||||
|
||||
## Исправление повторного запуска — 11 октября 2026
|
||||
|
||||
Заголовок «Движение возобновится» заменён на «Доброй ночи». Причина ошибки Автовокзала: холодный запуск сравнивал оставшееся время с двумя часами, а уже работающий ночной режим — с выбранными 45/60 минутами. Теперь границы определяются целиком по расписанию: длительность ночного перерыва должна превышать два часа; ночной экран сохраняется до порога возврата независимо от истории вкладки. Локальная защёлка состояния удалена.
|
||||
|
||||
Повторно прочитано публичное полное расписание обеих платформ Автовокзала. У основной (28) последний вечерний рейс — 23:55, продолжение нового календарного дня — 00:31, первый утренний — №4 в 05:15. У конечной (21) продолжение — 00:26, первый утренний — №8 в 05:51. Для обеих расчёт в 03:31 даёт ночной режим. Эти результаты получены из текущего ответа API, без изменения дат обслуживания.
|
||||
|
||||
В браузере на публичном снимке расписания платформы 28 и **явно тестовых часах** подтверждены: «Доброй ночи» / №4 / 05:15 в 03:31, сохранение после перезагрузки, автоматический выход в 04:15 при 60 минутах, сохранение после перезагрузки в 04:15 при 45 минутах и выход в 04:30. Снимок 1280×900 — `night-avtovokzal-reload.jpg`. TTL снимка обновлён стендом для тестовой даты; направление помечено «Тестовые часы».
|
||||
|
||||
Board: **76 тестов прошли**, включая новый регрессионный сценарий 00:31 → 03:31 → 05:15. TypeScript/Vite Board и Vite админки собраны. Первый запуск двух HTTP-тестов в sandbox был заблокирован `listen EPERM`; повторный полный запуск с доступом к loopback прошёл. В админке обновлена только подсказка к ранее добавленным настройкам, логика API устройств в этом исправлении не менялась. Развёртывание на сервер не выполнялось.
|
||||
|
||||
## Удаление QR из ночного экрана — 11 октября 2026
|
||||
|
||||
QR удалён из компонента NightScreen вместе с его параметрами и отдельными стилями. Ночной блок первого рейса теперь занимает всю доступную ширину. Настройка QR в разделе «Информация» действует как прежде.
|
||||
|
||||
Сборка TypeScript/Vite прошла. В браузере на реальном расписании проверены 1280×900, 879×593 и 390×667: внутри ночного экрана QR и ссылки отсутствуют, карточка рейса остаётся выше нижней панели. Снимок — `night-no-qr.jpg`. Подсказка локальных настроек и описания в README обоих проектов обновлены. Блок первого и последнего рейса в «Информации» пока не заменён: пользователю предложена схема следующих остановок ближайшего автобуса.
|
||||