fix(B06): 옮긴 조정 행이 사라지던 문제와 단 수 표시 범위를 고친다
원인: 단 수·옵션 행 DOM을 유입구·유출구로 옮긴 뒤, 다음 선택에서 clearSideSlots가 replaceChildren으로 그 행을 없앴다. 창은 카드당 하나라 같은 카드에서 다른 벽을 고르면 행이 영영 돌아오지 않았다. - 옮길 때 제자리에 주석 표식을 남기고, 선택이 바뀌면 그 자리로 되돌린다. - 단 수 행은 **기준(소유) 측점**에서만 다룬다 — 연동으로 넘어온 링크 카드에서는 숨긴다(2026-08-29 사용자). 검증: 유출→유입→유출로 옮겨 다녀도 단 수·옵션이 매번 제자리에 복귀. 링크 카드(4+0.0)에서는 옵션만 뜨고 단 수는 숨김.
This commit is contained in:
@@ -28,8 +28,17 @@ function slotUsable(target: HTMLElement | undefined): target is HTMLElement {
|
||||
return !!group && !group.hidden;
|
||||
}
|
||||
|
||||
/** 옮겨 놨던 행을 비운다 — 사본이 갈릴 때마다 옛 행을 남기지 않는다. 그룹 강조도 끈다. */
|
||||
/** 옮겨 온 행과 그 **제자리 표식** — 되돌릴 때 원래 순서로 꽂기 위해 짝으로 둔다.
|
||||
* 표식 없이 지우면 행 DOM이 사라져, 같은 창에서 다른 벽을 고를 때 그 행이 다시는
|
||||
* 나오지 않는다(2026-08-29 사용자 보고: 단 수·옵션이 사라짐). */
|
||||
const movedRows: Array<{ row: HTMLElement; anchor: Comment }> = [];
|
||||
|
||||
/** 옮겨 온 행을 **원래 자리로 되돌리고** 슬롯을 비운다. 그룹 강조도 끈다. */
|
||||
function clearSideSlots(): void {
|
||||
while (movedRows.length) {
|
||||
const { row, anchor } = movedRows.pop()!;
|
||||
anchor.parentNode?.replaceChild(row, anchor);
|
||||
}
|
||||
for (const target of [sideSlots?.inlet, sideSlots?.outlet]) {
|
||||
target?.replaceChildren();
|
||||
target?.closest("fieldset")?.classList.remove("is-active");
|
||||
@@ -51,6 +60,10 @@ function relocateSideRows(panelRoot: HTMLElement): void {
|
||||
);
|
||||
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);
|
||||
});
|
||||
// 고른 구조물이 어느 쪽인지 그룹 테두리로 알린다(2026-08-29 사용자 지시 3).
|
||||
|
||||
@@ -62,6 +62,9 @@ export interface StructurePanelDeps {
|
||||
optionsFor: () => { revetAllowed: boolean; basinLUAllowed: boolean };
|
||||
/** 다단 기슭막이 상태 — 유출 벽 선택 시 단 수 행 표시 판단에 쓴다. */
|
||||
extraState: () => { canAdd: boolean; count: number };
|
||||
/** 이 카드가 연동으로 넘어온 링크 카드인가 — 단 수는 **기준(소유) 측점**에서만
|
||||
* 다룬다(2026-08-29 사용자). 링크 카드에서는 단 수 행을 숨긴다. */
|
||||
isLinkedCard: () => boolean;
|
||||
/** 다단 기슭막이 단 수 지정 — 지형 허용보다 크면 기하가 자르고 토스트로 알린다. */
|
||||
setExtraCount: (count: number) => void;
|
||||
/** 다단 등간격 배치(2026-08-22 ①) — 사면 구간이 같아지게 단들을 재배치. */
|
||||
@@ -580,10 +583,12 @@ export function buildStructurePanel(
|
||||
: { canAdd: false, count: 0 };
|
||||
extraRow.classList.toggle(
|
||||
"is-hidden",
|
||||
!(
|
||||
tierChannel === "outlet" ||
|
||||
(tierChannel === "basin" && (ownTiers || (isBasin && (tiers.canAdd || tiers.count > 0))))
|
||||
),
|
||||
deps.isLinkedCard() ||
|
||||
!(
|
||||
tierChannel === "outlet" ||
|
||||
(tierChannel === "basin" &&
|
||||
(ownTiers || (isBasin && (tiers.canAdd || tiers.count > 0))))
|
||||
),
|
||||
);
|
||||
currentCount = tiers.count;
|
||||
countValue.textContent = `${tiers.count}단`;
|
||||
|
||||
@@ -143,6 +143,7 @@ export function structurePanelDeps(ctx: StructurePanelContext): StructurePanelDe
|
||||
fineMove: (key) => (key !== "inlet" && key !== "outlet") || ctx.hiddenPipe(),
|
||||
optionsFor: () => ctx.inletOptions(),
|
||||
extraState: () => ctx.extraState(),
|
||||
isLinkedCard: () => ctx.isLinked,
|
||||
basinExtraState: () => ctx.basinExtraState(),
|
||||
hiddenPipe: () => ctx.hiddenPipe(),
|
||||
setExtraCount: (count) => {
|
||||
|
||||
Reference in New Issue
Block a user