feat(gpx): загрузка и визуализация GPX-треков (ET-006) #7

Merged
admin merged 14 commits from feature/ET-006-gpx-upload into main 2026-05-22 13:35:21 +03:00

14 Commits

Author SHA1 Message Date
23cc89d416 tester(ET): auto-commit from tester run_id=19
All checks were successful
CI / lint (push) Successful in 4s
CI / test (push) Successful in 6s
CI / lint (pull_request) Successful in 3s
CI / build (push) Successful in 1s
CI / test (pull_request) Successful in 5s
CI / build (pull_request) Successful in 1s
2026-05-22 06:45:35 +00:00
e1dd7039a7 reviewer(ET): auto-commit from reviewer run_id=18
All checks were successful
CI / lint (push) Successful in 3s
CI / test (push) Successful in 4s
CI / lint (pull_request) Successful in 3s
CI / test (pull_request) Successful in 5s
CI / build (push) Successful in 3s
CI / build (pull_request) Successful in 2s
2026-05-22 06:04:55 +00:00
25e4476cf7 fix(gpx): устранить падение статистики на больших треках, учесть все треки файла
All checks were successful
CI / lint (push) Successful in 4s
CI / test (push) Successful in 5s
CI / lint (pull_request) Successful in 3s
CI / test (pull_request) Successful in 5s
CI / build (push) Successful in 3s
CI / build (pull_request) Successful in 2s
Правки по код-ревью ET-006 (docs/work-items/ET-006/12-review.md):

- P1-1: trackStats считал min/max высот через Math.min/max.apply — на
  треках в сотни тысяч точек это бросало RangeError и валило загрузку
  файла (нарушение REQ-NF-01). Расчёт переписан на однопроходный
  аккумулятор (makeStatsAccumulator/accumulatePoint/finalizeStats)
  без apply.
- P2-1: статистика и профиль высот учитывали только tracks[0].
  Добавлены aggregateStats() и buildFileProfileSamples() — сводка и
  профиль теперь охватывают все треки файла (REQ-F-09, AC-02).
- P2-2: расчёт статистики на async-пути парсинга вынесен в чанковый
  trackStatsChunked() — соответствие букве ADR-003 §2.
- P3-1: ось и tooltip профиля высот форматируют расстояние через
  formatKm() — согласование с выбором км/мили из ET-005.
- P3-2: childText() переименована в firstTagText() — имя соответствует
  фактическому поведению (поиск по всем потомкам).
- P3-4: убран дублирующийся 'use strict'.

Добавлены регрессионные unit-тесты: большой трек без падения,
эквивалентность trackStatsChunked синхронному trackStats (в т.ч. на
треке длиннее размера чанка), агрегация статистики и профиля по
многотрековому файлу.

Refs: ET-006

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 06:01:51 +00:00
19354ed905 reviewer(ET): auto-commit from reviewer run_id=16
All checks were successful
CI / lint (push) Successful in 4s
CI / test (push) Successful in 5s
CI / lint (pull_request) Successful in 3s
CI / build (push) Successful in 2s
CI / test (pull_request) Successful in 5s
CI / build (pull_request) Successful in 2s
2026-05-22 01:06:44 +00:00
8dc150ae14 Merge stale remote ET-006 branch after rebase onto main
All checks were successful
CI / lint (push) Successful in 4s
CI / test (push) Successful in 5s
CI / build (push) Successful in 1s
CI / lint (pull_request) Successful in 3s
CI / test (pull_request) Successful in 4s
CI / build (pull_request) Successful in 1s
Локальная ветка была перебазирована на актуальный origin/main (стадия
development, алгоритм п.2). Удалённая ветка содержала те же 4 doc-коммита
ET-006 до ребейза. Стратегия `ours`: дерево уже корректно (перебазировано
на main + реализация), удалённый тип становится предком для fast-forward
push без force-push.
2026-05-22 01:01:45 +00:00
55c9c389cd feat(gpx): загрузка и визуализация GPX-треков (ET-006)
Клиентская загрузка GPX 1.1: парсинг через DOMParser с чанковой
конвертацией (ADR-003), отрисовка треков и waypoints на карте,
панель #sheet-gpx со списком треков, статистикой и canvas-профилем
высот. GPX-слои встают ниже маршрута OSRM и восстанавливаются после
смены стиля карты (REQ-F-13).

- src/web/gpx.js — новый модуль фичи (ADR-002): парсинг, модель
  window.gpxTracks, слои/маркеры карты, sheet-gpx, профиль высот
- index.html / app.css — кнопка загрузки, кнопка тулбара, панель
  #sheet-gpx, toast-уведомления, индикатор парсинга
- app.js — один хук rebuildGpxOverlays() в rebuildMapOverlays()
- тесты: gpx.test.js (node --test, U-01..U-21) +
  test_gpx_upload.py (pytest: статические проверки + JS-раннер)

Refs: ET-006

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 01:00:27 +00:00
62c2ee85dc architect(ET-006): ADR-002/003, infra-requirements, data-requirements, tech-risks 2026-05-22 00:42:00 +00:00
2104f12d86 docs(ET-006): TRZ v2 — persist GPX layers across map style switch 2026-05-22 00:42:00 +00:00
73b29aeba8 docs(ET-006): status → approved 2026-05-22 00:42:00 +00:00
dcf3d244f7 docs(ET-006): BRD, ТЗ, AC, Test Plan — загрузка GPX-треков 2026-05-22 00:42:00 +00:00
fda40f20fe architect(ET-006): ADR-002/003, infra-requirements, data-requirements, tech-risks
All checks were successful
CI / lint (push) Successful in 3s
CI / test (push) Successful in 4s
CI / build (push) Successful in 3s
2026-05-22 03:38:47 +03:00
a0546abdd1 docs(ET-006): TRZ v2 — persist GPX layers across map style switch
All checks were successful
CI / lint (push) Successful in 3s
CI / test (push) Successful in 5s
CI / build (push) Successful in 1s
2026-05-22 03:33:15 +03:00
9fc1ef485a docs(ET-006): status → approved
All checks were successful
CI / lint (push) Successful in 3s
CI / test (push) Successful in 4s
CI / build (push) Successful in 3s
2026-05-22 03:21:27 +03:00
9b930c5c83 docs(ET-006): BRD, ТЗ, AC, Test Plan — загрузка GPX-треков
All checks were successful
CI / lint (push) Successful in 4s
CI / test (push) Successful in 4s
CI / build (push) Successful in 3s
2026-05-22 03:16:20 +03:00