gap-fill: reload detail via reopenDetail (in-place), not a stacked screen

Found in desktop testing: showSessionDetail() from the save/revert handlers
pushed a second detail overlay whose map rendered blank. reopenDetail() collapses
the stack and re-renders in place (the pattern recalc/refine already use). Session
log updated with the desktop verification results.
This commit is contained in:
4aiman 2026-09-10 15:51:34 +03:00
commit ceee0a48eb
2 changed files with 25 additions and 9 deletions

View file

@ -33,12 +33,28 @@
Доки: README (редактор, гэп-филл), PROJECT_MAP (db/gps методы, колонки).
## Проверка
- Синтаксис gps.js/db.js/main.js — OK (node --check). const в новых функциях — нет (правило проекта).
- ДЕСКТОП-ТЕСТ на Xvfb со скринами — СЛЕДУЮЩИЙ шаг (ещё не гонял на момент записи).
- На устройстве встроенным движком — после `./build.sh install -d`.
## Проверка (десктоп, Xvfb :99 + домашний RouteServer)
- Синтаксис gps.js/db.js/main.js — OK (node --check). const в новых функциях — нет.
- Гэп-филл на сессии 1782115144011 (4 дропаута): 🧩 → предпросмотр ТОЛЬКО пропусков
(голубой с оковкой) + панель «Достроено 4 (+1.75 км)» + Сохранить/Отмена. Сохранить →
88 estimated-точек в БД, gap_filled=1, петля замкнута по дорогам, деталь перерисовалась.
«Убрать достройку» → estimated=0, gap_filled=0, исходный трек вернулся, карта отрисовалась.
- БАГ, найденный тестом: `showSessionDetail(id)` в обработчиках ЗАТАЛКИВАЛ второй экран поверх
→ у него пустая карта. Исправлено на `reopenDetail(id)` (схлопывает стек, рендер на месте) —
отдельным коммитом. Проверено: после save/revert карта рисуется.
- Планировщик: 3 точки по региону → обе ноги легли ПО ДОРОГАМ (2.26 км). Глобальная кнопка
«По дорогам» переключает все ноги на прямые (пунктир, 2.87 км) и обратно — рисование/пересчёт/
состояние кнопки ОК. По-сегментный тап по линии слепой мышью на headless не попал в 4px-линию
(каждый промах добавлял точку — у Leaflet-вектора bubblingMouseEvents=false, т.е. попадание по
линии точку бы не добавило); биндинг корректный, на тач-экране допуск больше — подтвердить на теле.
- Реальную стату десктоп-сессии, сдвинутую пересчётом при тесте, восстановил из старой копии БД.
## Замечание к разбору (на будущее)
Дистанция сессии «плавает» при `recalculateSession` (сохранённая 16.24 → достройка 15.58 →
откат 18.25) — это поведение текущего `computeStats` (та же кнопка «Пересчитать» даёт то же),
но достройка ожидаемо должна УВЕЛИЧивать дистанцию. Стоит разобрать, как computeStats считает
дистанцию через (бывшие) гэпы, и сохранять исходные статы для точного отката.
## Дальше
- Прогнать на Xvfb: гэп-филл на треке с дропаутом (сессия 1782115144011) — предпросмотр только
пропусков, Сохранить, Убрать; планировщик — 3 точки, тап по отрезку переключает дорога/прямая.
- Затем сборка и проверка на теле офлайн.
- На теле встроенным движком офлайн: `./build.sh install -d`, докачать сегмент региона.
Проверить гэп-филл (предпросмотр/сохранить/убрать) и планировщик (тап по отрезку — тач).

View file

@ -4873,7 +4873,7 @@ async function showSessionDetail(sessionId) {
await DB.revertGapFill(sessionId);
await GPS.recalculateSession(sessionId, { noDelete: true });
showToast("Достройка убрана");
clearGapPreview(); showSessionDetail(sessionId);
clearGapPreview(); reopenDetail(sessionId);
} catch (e) { showToast("Откат: " + (e.message || e)); rb.disabled = false; rb.textContent = "Убрать достройку"; }
};
return;
@ -4898,7 +4898,7 @@ async function showSessionDetail(sessionId) {
await DB.saveGapFill(sessionId, gapCache.points);
await GPS.recalculateSession(sessionId, { noDelete: true });
showToast("Пропуски достроены");
clearGapPreview(); showSessionDetail(sessionId);
clearGapPreview(); reopenDetail(sessionId);
} catch (e) { showToast("Сохранение: " + (e.message || e)); sv.disabled = false; sv.textContent = "Сохранить"; }
};
} catch (e) { showToast("Пропуски: " + (e.message || e)); clearGapPreview(); }