fix(B06): 추가 기슭막이 선택 시 부모 칸의 단 수·옵션 유지
단 수·옵션 행은 조정창 사본에서 DOM째 빌려온 행이라, 다단 벽을 고르면 clearSideSlots()가 되돌린 뒤 다시 채우지 못해 유입구·유출구 칸이 비었다. 다단 벽에서도 tierChannel을 부모 채널로 열어 두 행을 살리고(revetWall에 isExtra 포함), 이식은 부모 칸으로 보낸다. 추가 기슭막이 칸에는 형태· 높이·구간값만 남긴다. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -30,13 +30,12 @@ export function setAdjustSideSlots(next: SideSlots): void {
|
||||
sideSlots = next;
|
||||
}
|
||||
|
||||
/** 다단 벽에서 옮겨 오는 행 — 폼에 자기 칸이 없어 형태·높이·구간값까지 전부 온다. */
|
||||
/** 다단 벽에서 옮겨 오는 행 — 폼에 자기 칸이 없어 형태·높이·구간값이 온다.
|
||||
* 단 수·옵션은 부모 벽의 값이라 여기 오지 않고 부모 칸에 남는다(2026-08-30 사용자). */
|
||||
const EXTRA_ROWS = [
|
||||
".b06-structure-panel__struct--form",
|
||||
".b06-structure-panel__struct--height",
|
||||
".b06-structure-panel__struct--span",
|
||||
".b06-structure-panel__struct--tier",
|
||||
".b06-structure-panel__struct--options",
|
||||
].join(", ");
|
||||
|
||||
/** 유입구·유출구는 폼이 이미 가진 항목 말고 단 수·옵션만 받는다. */
|
||||
@@ -97,6 +96,18 @@ function clearSideSlots(): void {
|
||||
}
|
||||
}
|
||||
|
||||
/** 행 DOM을 제자리 표식과 함께 옮긴다 — 숨은 행은 그대로 둔다. */
|
||||
function moveRows(panelRoot: HTMLElement, selector: string, target: HTMLElement): void {
|
||||
panelRoot.querySelectorAll<HTMLElement>(selector).forEach((row) => {
|
||||
if (row.classList.contains("is-hidden")) return;
|
||||
// 제자리에 표식을 남기고 옮긴다 — 선택이 바뀌면 이 자리로 되돌린다.
|
||||
const anchor = document.createComment("adjust-row");
|
||||
row.parentNode?.insertBefore(anchor, row);
|
||||
movedRows.push({ row, anchor });
|
||||
target.append(row);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 조정창 사본의 단 수·옵션 행을 고른 벽 쪽(유입/유출) 그룹으로 옮긴다. 행 DOM을
|
||||
* 그대로 옮기므로 배선·값 동기는 손대지 않는다. 자리가 없으면 사본에 그대로 둔다.
|
||||
@@ -111,21 +122,18 @@ function relocateSideRows(panelRoot: HTMLElement): void {
|
||||
if (side === "extra") {
|
||||
const group = target.closest<HTMLElement>("fieldset");
|
||||
if (!group) return;
|
||||
const owner = slotOf(panelRoot.dataset.extraSide === "inlet" ? "inlet" : "outlet").closest(
|
||||
"fieldset",
|
||||
);
|
||||
const ownerSlot = slotOf(panelRoot.dataset.extraSide === "inlet" ? "inlet" : "outlet");
|
||||
const owner = ownerSlot.closest("fieldset");
|
||||
if (owner && owner !== group) owner.after(group);
|
||||
group.hidden = false;
|
||||
} else if (!slotUsable(target)) return;
|
||||
const rows = panelRoot.querySelectorAll<HTMLElement>(side === "extra" ? EXTRA_ROWS : SIDE_ROWS);
|
||||
rows.forEach((row) => {
|
||||
if (row.classList.contains("is-hidden")) return;
|
||||
// 제자리에 표식을 남기고 옮긴다 — 선택이 바뀌면 이 자리로 되돌린다.
|
||||
const anchor = document.createComment("adjust-row");
|
||||
row.parentNode?.insertBefore(anchor, row);
|
||||
movedRows.push({ row, anchor });
|
||||
target.append(row);
|
||||
});
|
||||
moveRows(panelRoot, EXTRA_ROWS, target);
|
||||
// 단 수·옵션은 그 단이 딸린 부모 벽의 값이라 부모 칸에 그대로 세운다 — 다단을
|
||||
// 고를 때 그 두 행이 사라지던 것을 막는다(2026-08-30 사용자).
|
||||
if (slotUsable(ownerSlot)) moveRows(panelRoot, SIDE_ROWS, ownerSlot);
|
||||
} else {
|
||||
if (!slotUsable(target)) return;
|
||||
moveRows(panelRoot, SIDE_ROWS, target);
|
||||
}
|
||||
// 고른 구조물이 어느 쪽인지 그룹 테두리로 알린다(2026-08-29 사용자 지시 3).
|
||||
const group = target.closest<HTMLElement>("fieldset");
|
||||
if (!group) return;
|
||||
|
||||
Reference in New Issue
Block a user