- 옮김: B04 2 · B05 23 · B06 11 · A00_Common/design 13 (9,299 줄) · 이미 logic/ 에 있던 16 파일 그대로 - 안 옮김: 묶음 입구(package.json build:*) · 파이썬 · 순수지만 계산 아닌 8 (보기 결선 · 콜백 · API 타입 · 갈아끼움 알림판) - import 266 줄(142 파일) · 시험 · 주석 · 짝 표시 문자열 경로 고침 · B05 · B06 CLAUDE.md 짝 줄 logic/ - 시험 도우미 새 경로: 가짜 require 열쇠 · B05()/B06() 부름 · 형제 import 자리 · tsc 묶어 돌리는 시험 · 정규식 · rglob - design_view_cross 줄 한도 시험 685 → 688 (긴 import 경로 줄바꿈 3줄) - 확인: typecheck 0 · 서버 묶음 넷(corridor · server-calc · b07-extent · b07-note) 다시 지어 코드 같음(//#region 경로 주석만 다름) · 관련 시험 270 파일 — 남은 실패 19 는 옮기기 전과 같음 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014utrjfoW831Vc5wJUd13kL
64 lines
3.0 KiB
TypeScript
64 lines
3.0 KiB
TypeScript
/* =============================================================================
|
|
* B05_Profile_UI_Drainage_Facility_Hidden.ts
|
|
* 계곡 통과 시설 폼의 **끈 옵션 가리기** — M02 「구조물 옵션 보이기」에서 끈 옵션
|
|
* (`GET /api/projects/structure-types` 의 `visible: false`)의 칸을 시설 폼에서도 안 그린다
|
|
* (PLAN 21-10 흠 8).
|
|
*
|
|
* · 칸은 `labeled(..., 옵션키)` 가 붙인 `data-option-keys` 표식으로 찾는다 — 키가 여럿인 칸(본체 규격 ·
|
|
* 유입구 구조)은 **키가 다 꺼졌을 때** 가린다(하나만 꺼지면 남은 키를 적는 칸이라 둠).
|
|
* · 숨긴 칸의 값은 칸이 아니라 **폼이 받은 옛 값**(`remember`)을 저장에 그대로 싣는다 —
|
|
* 칸에 제안값을 채워도 숨긴 값이 몰래 바뀌지 않는다.
|
|
* · 필수 검사는 이 폼에 없다(레지스트리 옵션 칸은 `renderOptionFields` 가 숨긴 칸을 뺌).
|
|
* ========================================================================== */
|
|
|
|
import { hiddenFormKeys } from "./logic/B05_Profile_UI_Drainage_Facility_Merge";
|
|
|
|
export interface HiddenOptions {
|
|
/** 폼이 받은 옵션 — 숨긴 칸의 옛 값 보존용. `setFacility` 가 부른다. */
|
|
remember: (options: Record<string, string | number>) => void;
|
|
/** 끈 레지스트리 키를 받아 칸을 가린다. */
|
|
set: (facility: string | null, registryKeys: Iterable<string>) => void;
|
|
/** 읽은 옵션에서 숨긴 칸을 칸 값이 아닌 옛 값으로 바꾼다. */
|
|
restore: (options: Record<string, string | number>) => void;
|
|
}
|
|
|
|
export function createHiddenOptions(root: HTMLElement): HiddenOptions {
|
|
let hidden: ReadonlySet<string> = new Set();
|
|
let stored: Record<string, string | number> = {};
|
|
const apply = (): void => {
|
|
root.querySelectorAll<HTMLElement>("[data-option-keys]").forEach((node) => {
|
|
const keys = (node.dataset.optionKeys ?? "").split(" ");
|
|
node.classList.toggle(
|
|
"is-option-hidden",
|
|
keys.every((key) => hidden.has(key)),
|
|
);
|
|
});
|
|
// 칸이 다 가려진 줄은 줄째(빈 줄 간격이 안 남게)
|
|
root.querySelectorAll<HTMLElement>(".b05-structure__grid").forEach((row) => {
|
|
const kids = [...row.children];
|
|
const all =
|
|
kids.length > 0 && kids.every((kid) => kid.classList.contains("is-option-hidden"));
|
|
row.classList.toggle("is-option-hidden", all);
|
|
});
|
|
};
|
|
// 횡단 보기가 칸에 옮겨 붙이는 줄(단 수 등 · 계획서 24-4a)도 같은 규칙 — 줄이 붙을 때마다 다시 건다.
|
|
// (브라우저 밖 거울 시험 DOM 에는 관찰자가 없다.)
|
|
if (typeof MutationObserver !== "undefined")
|
|
new MutationObserver(apply).observe(root, { childList: true, subtree: true });
|
|
return {
|
|
remember(options) {
|
|
stored = { ...options };
|
|
},
|
|
set(facility, registryKeys) {
|
|
hidden = hiddenFormKeys(facility, registryKeys);
|
|
apply();
|
|
},
|
|
restore(options) {
|
|
for (const key of hidden) {
|
|
delete options[key];
|
|
if (stored[key] !== undefined) options[key] = stored[key];
|
|
}
|
|
},
|
|
};
|
|
}
|