- .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.
4.2 KiB
4.2 KiB
Сессия 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): Rustrebuild_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): зум хранится в localStoragebaldav_rec_zoom(сохраняется на zoomend, восстанавливается при создании карты вместо жёсткого 15). Так возврат на экран трекинга держит масштаб.
Проверка
- Синтаксис JS - ок. Сборка debug + телефон. Проверить: заливка кнопок идёт по %, дороги больше не "висят молча"; после "Пересчитать"/"Уточнить" карта на том же масштабе; вернулся на запись - масштаб прежний. (Задача 1 - фикс гонки reopenDetail - проверена через CDP отдельно.)