Progress on recompute/refine/roads-rebuild + remember map zoom

- .btn-progress fills a button's bg by --pct (setBtnProgress). Elevation
  refine drives it from fetchElevations network batches (0-80%) then save
  (85-100%); recompute from recalculateSession phase milestones; roads
  rebuild from a new Rust roads_progress event (rebuild_roads emits
  [current,total] every ~2000 points - first Rust->JS event in the app,
  adds use tauri::Emitter) so it no longer just hangs silently.
- recalc/refine now reopen the detail via reopenDetail (awaits the
  popstate) instead of the manual pop+history.back+render race.
- Track detail remembers its map view per session (_sdMapView, moveend) and
  restores it on reopen/return instead of re-fitting the whole track; the
  recording map persists its zoom in localStorage across screen switches.
This commit is contained in:
4aiman 2026-09-29 23:19:37 +03:00
commit 3e2a6e47f7
5 changed files with 120 additions and 21 deletions

View file

@ -0,0 +1,44 @@
# Сессия 2026-09-29 (3) - прогресс на кнопках, память масштаба карты
Продолжение дня (см. `2026-09-29_startup-slowness.md`). По списку задач пользователя.
## Что значат сообщения достройки (объяснение, без правок)
`GPS.fillGaps` (gps.js) чинит только реальные потери сигнала: разрыв > 60с И хорда > 150м.
Для такого разрыва спрашивает у BRouter дорожный путь между концами:
- "больше нужного" = `skipped-long`: дорога есть, но путь длиннее прямой более чем в 2 раза
(крюк). Значит ехал не по дороге (тропа/поле/грунт, которого нет в графе) - оставляем прямую.
- "нет данных" = `skipped-noroute`: BRouter не проложил вообще - нет дорожных данных на участке
(не скачан .rd5-сегмент региона / пусто). Мостить нечем.
Это не баг, а честный отказ достраивать заведомо кривым путём.
## Прогресс на долгих действиях (заливка фона кнопки по %)
- CSS `.btn-progress` (styles.css): фон кнопки заливается слева по `--pct` (ставится из JS через
CSS-переменную, не инлайн-стиль). Хелпер `setBtnProgress(el, pct)` (main.js).
- "Уточнить высоты" (`#sd-refine`): реальный % от сетевых батчей `fetchElevations(pts, onProgress)`
(0-80%), затем сохранение+пересчёт (85-100%). Сеть - api.gpxz.io / open-elevation /
open-meteo / opentopodata.
- "Пересчитать" (`#sd-recalc`): `GPS.recalculateSession(id, {onProgress})` шлёт честные вехи по
фазам (5 старт / 40 фильтр / 70 стата / 100 запись).
- "Перестроить" дороги (`#roads-rebuild`): Rust `rebuild_roads` эмитит `roads_progress`
[current,total] каждые ~2000 точек (в проекте раньше событий из Rust не было вообще - добавлен
`use tauri::Emitter`), JS слушает и заливает кнопку + пишет "Построение: cur / tot". Убирает
"просто подвисает".
## Гонка reopenDetail - распространил на recalc/refine
`#sd-recalc` и `#sd-refine` раньше делали тот же ручной `winStack.pop + history.back +
showSessionDetail` (гонка с пустой картой/графиками). Переведены на `reopenDetail` (ждёт
popstate) - фикс той же гонки.
## Память масштаба карты
- Деталь трека: `_sdMapView[sessionId]` хранит {центр, зум}, обновляется на moveend/zoomend; при
рендере, если вид сохранён - `setView` вместо `fitBounds`. Так после пересчёта/уточнения (reopen)
и при возврате к треку масштаб сохраняется, а не сбрасывается на весь трек. Первый показ - как
раньше, fitBounds.
- Карта записи (`renderRecordingInline`): зум хранится в localStorage `baldav_rec_zoom`
(сохраняется на zoomend, восстанавливается при создании карты вместо жёсткого 15). Так возврат
на экран трекинга держит масштаб.
## Проверка
- Синтаксис JS - ок. Сборка debug + телефон. Проверить: заливка кнопок идёт по %, дороги больше
не "висят молча"; после "Пересчитать"/"Уточнить" карта на том же масштабе; вернулся на запись -
масштаб прежний. (Задача 1 - фикс гонки reopenDetail - проверена через CDP отдельно.)