Merge remote-tracking branch 'origin/sub_desktop_1' into main_laptop_1

This commit is contained in:
2026-10-06 10:42:10 +09:00
8 changed files with 24 additions and 7 deletions
+1
View File
@@ -190,6 +190,7 @@ export function sharedStructures(shared: DesignPageShared): StructuresSection {
onPipeUpdate: (from, to, attributes) => on().onPipeUpdate?.(from, to, attributes),
onPipeRemove: (chainageM) => on().onPipeRemove?.(chainageM),
onPipeSelect: (chainageM) => on().onPipeSelect?.(chainageM),
onListRelease: () => on().onListRelease?.(),
onReveal: () => shared.revealLeft(),
},
{ includeDetail: () => shared.view() === "cross", projectId: shared.projectId },
+1
View File
@@ -179,6 +179,7 @@ export async function mountCrossView(
focusChainage: (chainageM) => {
if (!isWallSelecting()) focusStationAt(chainageM);
},
releaseCard: () => sectionView.focusStation(null),
markStructure: (structureId) => sectionView.selectMark(structureId),
applyPipeOptions: (chainageM, patch) =>
applyPipeOptionsToCache(pipeOptionsContext, chainageM, patch),
@@ -433,8 +433,10 @@ export function createStructuresSection(
selectedPipeChainage,
// 재선택 = 해제(2026-08-18 복구) — 해제는 리셋과 같은 전체 초기화다.
onSelectStructure: (structure) => {
if (structure.structure_id !== null && structure.structure_id === editingId) resetForm();
else loadForm(structure);
if (structure.structure_id !== null && structure.structure_id === editingId) {
resetForm();
callbacks.onListRelease?.();
} else loadForm(structure);
},
onSelectPipe: (pipe) => {
const isSame =
@@ -442,6 +444,7 @@ export function createStructuresSection(
Math.abs(selectedPipeChainage - pipe.chainage_m) < PIPE_MATCH_M;
if (isSame) {
resetForm();
callbacks.onListRelease?.();
} else {
loadPipeForm(pipe);
callbacks.onPipeSelect(pipe.chainage_m);
@@ -164,6 +164,8 @@ export interface StructuresCallbacks {
* 목록에서 직접 고른 경우엔 이미 펼쳐져 있어 아무 일도 안 한다.
*/
onReveal?: () => void;
/** 목록에서 고른 줄을 다시 눌러 풂 — 다른 화면의 고름(횡단 카드)도 함께 끔(54-8). */
onListRelease?: () => void;
}
type OptionEntry = { key: string; read: () => string | number; isEmpty: () => boolean };
@@ -87,6 +87,8 @@ export interface B06StructuresPanelDeps {
stationInterval: () => number;
/** 목록·폼에서 고른 시설의 측점 카드를 선택·스크롤한다. */
focusChainage: (chainageM: number) => void;
/** 목록에서 고른 줄을 다시 눌러 풂 — 횡단 카드 선택도 끔(54-8). */
releaseCard?: () => void;
/** 종단 알약 강조를 목록에서 고른 것에 맞춘다(null = 관 · 해제 — 측점선 짝을 따름). */
markStructure?: (structureId: string | null) => void;
/** 목록이 바뀔 때마다 종단 알약 레인에 같은 목록을 넘긴다(2026-09-07 표시 통일). */
@@ -298,6 +300,7 @@ export function createB06StructuresPanel(deps: B06StructuresPanelDeps): B06Struc
// 알약 = 그 관 알약(같은 측점 구조물 말고 · 측점선 없는 물넘이포장도) — 카드 뒤에(53-2)
deps.markStructure?.(chainageM === null ? null : `pipe-${chainageM.toFixed(2)}`);
},
onListRelease: () => deps.releaseCard?.(),
},
});
+2 -1
View File
@@ -445,7 +445,8 @@ export function createSectionView(
refreshCard,
refreshCards,
focusStation(stationId) {
if (selectedStationId !== stationId) selectStation(stationId, true);
if (stationId === null) clearSelection();
else if (selectedStationId !== stationId) selectStation(stationId, true);
else {
revealCard(stationId, "smooth");
// 같은 카드라도 알약 강조는 다시 맞춘다 — 목록에서 같은 측점 다른 항목을 고른 경우(52-15).
@@ -38,8 +38,8 @@ export interface SectionViewController {
/** 여러 측점을 한꺼번에 교체한다 — 상단 패널은 **마지막에 한 번만** 다시 그린다. */
refreshCards: (chainages: ReadonlyArray<number>) => void;
/** 좌측 구조물 목록에서 고른 측점 카드를 선택하고 화면에 드러낸다 — 재클릭 토글 없음
* (2026-08-29 B05/B06 일원화: 목록 클릭 → 해당 카드 스크롤·강조). */
focusStation: (stationId: string) => void;
* (2026-08-29 B05/B06 일원화: 목록 클릭 → 해당 카드 스크롤·강조). null = 카드 선택 풂(54-8). */
focusStation: (stationId: string | null) => void;
/** 종단 알약 강조를 그 구조물로(null = 풀기 — 카드 측점선 짝을 따름). */
selectMark: (structureId: string | null) => void;
/** 카드(측점) 선택이 바뀔 때 알림 — 좌측 「구조물 배치」 폼이 그 측점 구조물을
@@ -153,8 +153,14 @@
}
items()[i].click(); // 다시 누름 = 풂
await w(900);
if (selRows().length || litPills().length || (!isB06 && lit3D().length))
fail(`${r.text}: 풂 뒤 남음 ${selRows().length}/${litPills()}/${lit3D()}`);
// 풂 = 카드 선택도 풀림(54-8)
if (
selRows().length ||
litPills().length ||
(!isB06 && lit3D().length) ||
(isB06 && cardSel().length)
)
fail(`${r.text}: 풂 뒤 남음 ${selRows().length}/${litPills()}/${lit3D()}/${cardSel()}`);
}
out.checked = rows.length;
} else if (MODE === "pill") {