feat(b08): 거리이정표 다이어그램 선 글 더블클릭 = km · 도로 구분 바로 고침 (244-4 ⑥)

- 선 글 한 줄 = 그 구간(업체 · 공통 · 시점 → 중점) · 글 화면 자리에 도로 구분 ▾ · km 칸 · Enter · 칸 밖 = 반영 · Esc = 취소
- 값은 모달과 한 벌(legAt · setLeg) · 시점 → 중점 km = 중점 측점 · 표 셈 그대로

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01STqEqztUthVFBmEP18wBSz
This commit is contained in:
2026-10-10 21:36:56 +09:00
co-authored by Claude Opus 5.5
parent 5f2e6e18b6
commit 7be4feb1cf
4 changed files with 158 additions and 10 deletions
@@ -1,6 +1,8 @@
"""244-4 B08 거리이정표 고침(사용자 130번) — [+] 모달(항목 · 업체 이름 · 목적지 + 주소 검색 재활용) ·
방위 = 좌표 자동 · 시점 모달(등록 주소 · VWorld 주소 · 지도) · 다이어그램 팬 · 줌 공용 ·
경로 하위 탭 = 그림만(다음 지도 길찾기 새 창 · 화면 캡처) · 상자 누름 = 항목 정보 모달.
"""244-4 B08 거리이정표 고침(사용자 130번) — [+] 모달(항목 · 업체 이름 · 목적지 +
주소 검색 재활용) · 방위 = 좌표 자동 · 시점 모달(등록 주소 · VWorld 주소 · 지도) ·
다이어그램 팬 · 줌 공용 ·
경로 하위 탭 = 그림만(다음 지도 길찾기 새 창 · 화면 캡처) · 상자 누름 = 항목 정보 모달 ·
선 글 바로 고침(⑥).
"""
import json
@@ -37,8 +39,9 @@ def _node(expr):
def _route(rid, lon=None, lat=None, via=True):
row = {"item": "", "dest": "start", "note": ""}
return {"id": rid, "name": rid, "address": "", "via_base": via, "dir": None, "lon": lon,
"lat": lat, "legs": [], "rows": [{"item": "", "dest": "start", "note": ""}]} # fmt: skip
"lat": lat, "legs": [], "rows": [row]} # fmt: skip
def _center(lay, bid):
@@ -183,3 +186,34 @@ def test_화면_모달_팬줌_그림탭():
"B08_Quantity/B08_Quantity_UI_Milestone_Diagram.ts",
"B08_Quantity/B08_Quantity_Router_Milestone.py"): # fmt: skip
assert len(_read(rel).splitlines()) <= 700
def test_선_글_바로_고침_모달과_한_벌():
from B08_Quantity.B08_Quantity_Milestone_Calc import compute_milestone
data = {
"site": {"mid_station_m": None, "mid_road": "비포장"},
"base": {"enabled": True, "name": "기준", "address": "", "dir": None,
"legs": [{"road": "1차포장", "km": 0.6}]},
"routes": [{**_route("g"), "legs": [{"road": "2차포장", "km": None}]}],
} # fmt: skip
d = json.dumps(data)
got = _node(
f"[legAt({d}, 'g', 0, 0.75), legAt({d}, 'start', 0, 0.75), legAt({d}, 'x', 0, 0),"
f" setLeg(setLeg(setLeg({d}, 'g', 0, {{road: '1차포장', km: 23.8}}),"
f" 'base', 0, {{km: null}}), 'start', 0, {{road: '2차포장', km: 1.2345}})]"
)
assert got[0] == {"road": "2차포장", "km": None}
assert got[1] == {"road": "비포장", "km": 0.75} and got[2] is None
after = got[3]
assert after["routes"][0]["legs"] == [{"road": "1차포장", "km": 23.8}]
assert after["base"]["legs"] == [{"road": "1차포장", "km": None}]
assert after["site"] == {"mid_station_m": 1234.5, "mid_road": "2차포장"}
# 표 셈 그대로 — 고친 값 = 모달 값과 같은 칸
(row,) = compute_milestone(after, 1500.0)
assert (row["s2"], row["s1"], row["un"], row["total"]) == (0, 23.8, 0, 23.8)
ui = _read("B08_Quantity/B08_Quantity_UI_Milestone_Diagram.ts")
assert 'span.addEventListener("dblclick"' in ui and "e.stopPropagation();" in ui
assert "editLegAt(projectId, span, ln.from, i, mk)" in ui
assert "anchor.getBoundingClientRect()" in ui # 팬 · 줌 뒤 글 화면 자리
assert "putMilestone(projectId, setLeg(liveMilestone(projectId), from, i, patch))" in ui