fix(B06): 저장이 옛 면적을 싣던 자리 — 저장 직전 전 측점 재계산 + 「안 실림」 알림
⚠ 잡은 자리(2026-09-09 실측) — 표준단면 「측구 상폭」을 0.69 → 0.9 로 고쳐 저장했더니 정본 한 줄에 **새 측구 기하(상폭 0.9 · 측구 0.18㎡)** 와 **옛 절토 면적(3.33㎡)** 이 섞여 남았음. 브라우저는 만진 측점만 다시 계산하는데 저장은 전 측점 면적을 실어 보내므로, 안 만진 측점이 옛 값 그대로 정본이 됨. 수량이 갈리는 자리임. - [저장]·[확정]이 면적을 모으기 **전에** 전 측점을 다시 계산함(`reconcileDesigns`). - 표준단면 패널에 「고친 값이 측점에 아직 안 실렸음」 알림 — 언제 따라오는지 함께 적음. ⭐ 거울(파이썬·TS) 문제가 아님을 먼저 가름 — 같은 입력을 주면 두 쪽이 같은 값을 냄 (측점 20.0m: 0.69 기준 절토 3.328 · 0.9 기준 3.899, 저장분은 3.328 + 측구 0.180 으로 섞여 있었음). 시험 둘 추가(저장·확정이 재계산을 먼저 부르는지), 전체 1205 통과·실패 0. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -284,7 +284,29 @@ export function createStandardPanel(
|
||||
const body = document.createElement("div");
|
||||
body.className = "b06-std__body";
|
||||
|
||||
const persist = (): void => writeSession(projectId, state);
|
||||
// ⚠ **패널 값이 측점에 실렸는지**를 보인다(2026-09-09 실측). 패널을 고쳐도 측점은 그대로라
|
||||
// [전체 반영]을 눌러야 따라오는데, **카드를 하나 만지면 그 측점만** 새 값으로 다시 선다
|
||||
// (`handleDesignChange` 가 패널 값을 실어 보냄). 알려 주지 않으면 한 화면에 옛 값과 새 값이
|
||||
// 섞여 서고, 사용자는 왜 그 측점만 값이 달라졌는지 알 길이 없다.
|
||||
// ⓘ 실측 예 — 측점 20.0m 절토 계 3.33㎡(저장분) ↔ 3.90㎡(패널 초안: 암 측구 상폭 0.69→0.9).
|
||||
let applied = JSON.stringify(defaults);
|
||||
const pending = document.createElement("p");
|
||||
pending.className = "b06-std__pending";
|
||||
pending.textContent =
|
||||
"고친 값이 측점에 아직 안 실렸습니다 — [전체 측점 반영]을 누르면 바로 따라오고, " +
|
||||
"[저장]·[확정] 때도 전 측점이 이 값으로 다시 섭니다. 그전에 카드를 만지면 그 측점만 먼저 바뀝니다.";
|
||||
const showPending = (): void => {
|
||||
const now = JSON.stringify(state);
|
||||
// 값이 실렸는지 눈으로도 캘 수 있게 남긴다 — 화면 실측에서 판정 근거가 된다.
|
||||
pending.dataset.now = String(now.length);
|
||||
pending.dataset.applied = String(applied.length);
|
||||
pending.hidden = now === applied;
|
||||
};
|
||||
|
||||
const persist = (): void => {
|
||||
writeSession(projectId, state);
|
||||
showPending();
|
||||
};
|
||||
|
||||
/** 필드 한 칸. 공통은 토사 값을 보이고, 고치면 세 그룹에 함께 펼친다. */
|
||||
const buildField = (spec: NumberFieldSpec, grid: HTMLElement): void => {
|
||||
@@ -411,17 +433,23 @@ export function createStandardPanel(
|
||||
actions.append(resetButton);
|
||||
|
||||
// 횡단 반폭은 사이드의 **별도 컨테이너**로 뺐다(2026-08-23) — 여기는 표준단면 설정만.
|
||||
root.append(body, loader, actions);
|
||||
showPending();
|
||||
root.append(body, loader, pending, actions);
|
||||
|
||||
return {
|
||||
root,
|
||||
getValues: () => state,
|
||||
applyStored: (stored) => {
|
||||
// 측점에 실려 있는 값이 곧 정본이다 — 「안 실린 값」 판정 기준을 여기서 잡는다.
|
||||
applied = JSON.stringify(stored);
|
||||
showPending();
|
||||
if (hadSession) return; // 진행 중 세션 편집값이 우선.
|
||||
(Object.keys(stored) as StandardCrossKey[]).forEach((key) => {
|
||||
if (stored[key]) state[key] = JSON.parse(JSON.stringify(stored[key])) as StandardCrossGroup;
|
||||
});
|
||||
unifyCommon(state);
|
||||
applied = JSON.stringify(state);
|
||||
showPending();
|
||||
renderBody();
|
||||
},
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user