feat: add passenger information and settings components
- Introduced `PassengerInfo.tsx` for displaying trip details, including upcoming trips and fare information. - Added `PassengerSettings.tsx` for managing user-defined important places and fare settings. - Implemented validation functions for passenger settings in `passenger-settings.mjs`. - Created utility functions for transliterating stop names in `transliteration.ts`. - Developed weather hint functionality in `weather-hint.ts` to provide precipitation probabilities. - Established a mock server for testing passenger-related features in `passenger-server.mjs`. - Added comprehensive tests for passenger guide logic and transliteration functionality.
BIN
artifacts/journey-translit-960x540.png
Normal file
|
After Width: | Height: | Size: 54 KiB |
BIN
artifacts/journey-translit-street-light-960x540.png
Normal file
|
After Width: | Height: | Size: 57 KiB |
BIN
artifacts/passenger-admin-fields.png
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
artifacts/passenger-fare-minibus-960x540.jpg
Normal file
|
After Width: | Height: | Size: 47 KiB |
BIN
artifacts/passenger-places-390x844.png
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
artifacts/passenger-places-960x540.png
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
artifacts/passenger-weather-960x540.png
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
artifacts/passenger-weather-street-light-960x540.png
Normal file
|
After Width: | Height: | Size: 50 KiB |
30
artifacts/verification-journey-transliteration.md
Normal file
@@ -0,0 +1,30 @@
|
||||
# Схема ближайшего рейса и транслит
|
||||
|
||||
Проверено 11 октября 2026 года.
|
||||
|
||||
## Изменения
|
||||
|
||||
- Убраны повторные номер, направление и время отправления из карточки схемы. Ближайший рейс остаётся в постоянной нижней панели.
|
||||
- Карточка и её переключатель называются «Дальше по ближайшему рейсу».
|
||||
- Убран заголовок «Информация» и занимаемый им отступ. Вкладки компактной компоновки и заголовок уведомлений сохранены.
|
||||
- Дополнительная строка латиницей появляется над основным названием при включённом `journeyTranslitEnabled`. Основное название сохраняется, уже латинские названия не дублируются. Это читаемая транслитерация, без перевода.
|
||||
- Настройка есть локально в «Экраны» и в админке устройств `polotsk-transit-api`. Старые настройки без нового поля используют `false`; миграция SQL не нужна.
|
||||
|
||||
## Проверки
|
||||
|
||||
- `ridebus-board`: TypeScript + Vite build; 84 теста пройдены, включая транслитерацию, сохранение настроек и совместимость удалённых конфигураций.
|
||||
- `polotsk-transit-api`: frontend build; 8 тестов сервиса устройств и 1 тест HTTP API пройдены. Новый флаг сохраняется при удалённом обновлении и возвращается в конфигурации устройства. Повреждённые значения отклоняются.
|
||||
- Браузер: 960×540, 879×593, 855×723, 390×844, 1280×800. На узкой и широкой карточке нет вертикального переполнения; латинская строка находится выше основного названия. На широкой компоновке нет пустого места от скрытого общего заголовка.
|
||||
- Обе темы и оба профиля проверены на 960×540. Включение и отключение флага сохраняются после перезагрузки.
|
||||
- Тестовые счётчики на переходах 1→2, 2→3, 3→4 с транслитом: в обоих профилях ноль изменений размеров блока названия и ноль записей размера шрифта за 1200 мс. Два заранее подготовленных слоя текста продолжают двигаться через transform/opacity. Это проверка работы DOM, а не измерение FPS на телевизоре.
|
||||
|
||||
## Ограничения
|
||||
|
||||
Локальный API стенда `127.0.0.1:5193` в проверочном браузере возвращал `ERR_BLOCKED_BY_CLIENT`. Сервер отдельно вернул валидный ответ и полное расписание с HTTP 200; визуальные проверки сделаны на встроенных демонстрационных данных. Xiaomi Mi Box 4 в этом запуске не проверялся.
|
||||
|
||||
## Примеры
|
||||
|
||||
- `journey-translit-960x540.png`: тёмная тема, ТВ-профиль, демонстрационные данные.
|
||||
- `journey-translit-street-light-960x540.png`: светлая тема, уличный профиль, демонстрационные данные.
|
||||
|
||||
Для удалённого переключения нужно обновить табло, backend и frontend админки.
|
||||
28
artifacts/verification-passenger-info.md
Normal file
@@ -0,0 +1,28 @@
|
||||
# Пассажирские блоки · 11 октября 2026
|
||||
|
||||
Реализованы «До важных мест», напоминание о последнем рейсе перед ночным перерывом, вероятность осадков в ближайший час и оплата ближайшего доступного маршрута. Изменены Board и backend/frontend `/Users/xtimms/Projects/polotsk-transit-api`. Места в рабочей конфигурации по умолчанию пусты. Пользователь подтвердил тарифы для Полоцка: автобус 1,05 BYN, маршрутка 2,10 BYN, QR-кодом или наличными; дата подтверждения 2026-10-11 фиксирована.
|
||||
|
||||
## Проверки кода
|
||||
|
||||
- `npm test`: 96/96, включая короткие/обратные рейсы, подтверждённые отмены, фильтр маршрута, неизвестные временные смещения, прибытие на следующий день, ночные продолжения в обоих форматах дня обслуживания, дневные перерывы, выбор тарифа и изоляцию городов.
|
||||
- `npm run build` Board: TypeScript + Vite успешно.
|
||||
- `node --test test/boardDevices.test.js test/boardDevicesApi.test.js` в backend: 11/11. Проверены ограничения полей, даты, чужой город/маршрут, нормализация старых настроек, сохранение пустых массивов и авторизация существующего протокола.
|
||||
- `npm run build` frontend админки: успешно; прежние предупреждения о Browserslist/размере bundle остаются.
|
||||
- `git diff --check` обоих проектов: без ошибок.
|
||||
|
||||
## Проверки браузера
|
||||
|
||||
Использован production build на явном локальном стенде `test/fixtures/passenger-server.mjs`, отдельный origin 5194, фиктивные остановки/расписание/погода. Настройки основного origin 5180 и рабочая БД не изменялись.
|
||||
|
||||
- Подтверждён действительный DOM viewport 960×540, 879×593, 855×723, 390×844 и 1440×900. Нет переполнения страницы и видимых новых карточек. На 1440×900 три карточки проверены одновременно; строки важных мест также не переполняются.
|
||||
- На 960×540 название места имеет размер около 43 px, тариф — около 82 px. Места разбиваются на три страницы; наблюдался автоматический переход к следующему месту. Число страниц удлиняет сцену до полного обзора. На высоком узком экране все три коротких тестовых места помещаются сразу.
|
||||
- Ближайший автобус показывает 1,05 BYN; после выбора маршрутки через видимый интерфейс стенда — 2,10 BYN. Видны способы оплаты и фиксированная дата подтверждения.
|
||||
- Погода показывает 80% в ближайший час. После локального выключения подсказка исчезает, после повторного включения появляется. Светлая тема и профиль «Уличное табло» проверены на 960×540.
|
||||
- Выключение важных мест сохраняется после перезагрузки и убирает вкладку. Данные мест и тарифов доступны в меню «Экраны». Кнопка «Ниже» прокрутила расширенное меню (DOM scrollTop 1099).
|
||||
- На стенде `test/fixtures/device-flow-server.mjs` устройство подключено кодом 0246; сохранены места, оба тарифа и переключатели. Реальный локальный HTTP-протокол передал цену устройству. Админка показала «Настройки применены» для v1, v2 (оплата выключена) и v3 (восстановлена); выключенная вкладка исчезла с устройства. Используется репозиторий в памяти, без PostgreSQL.
|
||||
- Устройство без полного расписания не показывает выбранное важное место, поскольку маршрут до него не подтверждён. Карточка оплаты продолжает работать по ближайшему доступному рейсу.
|
||||
- В консоли тестового приложения ошибок/предупреждений не обнаружено.
|
||||
|
||||
Скриншоты: `passenger-places-960x540.png`, `passenger-weather-960x540.png`, `passenger-places-390x844.png`, `passenger-fare-minibus-960x540.jpg`, `passenger-weather-street-light-960x540.png`. Данные и время на них тестовые. Захват in-app browser через fullPage иногда пропускает неизменившиеся compositor layers; снимок не заменяет DOM-проверку заполнения/границ.
|
||||
|
||||
Физический Mi Box / Hi Browser, FPS устройства, PostgreSQL integration test и развёртывание на рабочем сервере в этой проверке не выполнялись. Настройки хранятся в существующем JSON, новая миграция SQL не требуется; для удалённого управления обновляются оба проекта.
|
||||