Files
Aislo/M02_MasterTemplete/M02_MasterTemplete_Sangeun_View.ts
T
eomsangdonandClaude Opus 5.5 26bf63b726 feat(810-4): 연결 찾기 엔진 — 가져온 식 ↔ 우리 M01 기초 · 확정일 때만 우리 기초 사본으로 바꾸기 · 되돌리기
- 새 M02_Doc_Match(서버 단독) — 후보(결과단위 · 노임 키 · 재료 · 기계 · 품셈 절 번호) · 옵션 풀이(줄 수량 · 단가가 의존하는 선택 · 입력 변수만 돌려 좁힘 · 글 근거 값 유지) · 줄 대조(같음 · 단가 차이 · 단위 환산 · 기계 규격 · 비목 · 율 값 · 율 줄 · 공구손료 유무 · 줄 없음 · 끝수 · 옵션 글) · 판정 확정(다른 항 0 · 원 단위 같음) / 근접 / 없음(가까운 후보 보이기만)
- 새 M02_Doc_MatchSk — 찾기 = SK 가져온.원본.연결후보 적음 · 바꾸기 = 서버가 다시 찾아 확정만 같은 키에 M01 사본 SK(바탕 · 입력값 = 찾은 옵션) · 원래 몸 = 가져온보관 · 되돌리기 · 근접 · 없음 409
- 길 POST /api/m02/layers/{층}/sangeun/{키}/match {할일 찾기 · 바꾸기 · 되돌리기}(층 쓰기)
- M02_Sangeun_Imported clean — 가져온보관 칸 받음 · M02_Doc_Import 형제 SK 가 우리 기초 사본이면 그 수식 문서로 셈(연결 안 끊김)
- 화면 — 원문 패널 「어디서 왔나」 카드 맨 위 판정 띠(띠 알림 부품) · 확정 = [우리 기초 사본으로 바꾸기] · 근접 · 없음 = 단추 없음 + 다른 항 자세히 · 안 찾음 = [우리 기초와 연결 찾기] · 바꾼 SK = [가져온 식으로 되돌리기] · 저장 안 한 고침 있으면 막음 · 끝나면 SK 다시 엶(새 판)
- 시험 test_810_4_match(판정 셋 · 요구 704 파형강관 Φ800 = GF000179 근접 · 단위 환산 × 6 · 기계 규격 · 율 줄 · 옵션 풀이 · 줄 대조 · 바꾸기 = M01 사본 셈 · 되돌리기 · 근접 409 · 형제 사본 · 전수 S8104_ALL) · helper_810_4_sweep
- 낡은 시험 글 대조 고침 — 717_2b(View 다시 엶 mount) · 750_2(createSangeunSide(opt.match)) · 807_1(원문 패널에 SK 문서 넘김)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 21:52:41 +09:00

62 lines
2.4 KiB
TypeScript

/* =============================================================================
* M02_MasterTemplete_Sangeun_View.ts
* 단가산출(SK) 상세 자리(717-2a) — 편집 칸 종류 sangeun 이 여는 곳(UI_Main 갈래 한 줄).
* 717-2b = 상세 · 고침(`Sangeun_Detail.ts` mountSangeunDetail) · [저장]은 그 손잡이 `getDoc` · 고침 알림 `opt.onChanged`.
* 804-8 = 페이지 [저장] 한 번에 수식도(`flush` 먼저 · 새 판) · 보기 고르기는 머리 줄 `slot`.
* 810-4 = 원문 패널 판정 띠 [바꾸기] · [되돌리기] · [연결 찾기] 뒤 그 SK 를 다시 읽어 상세를 다시 엶(새 판).
* ========================================================================== */
import { readTemplate } from "./M02_MasterTemplete_Api_Fetch";
import { mountSangeunDetail } from "./M02_MasterTemplete_Sangeun_Detail";
import type { Selection } from "./M02_MasterTemplete_UI_Main";
/** 고름(층 · 주인 · SK 키 = name) + 읽기만 · 고침 알림 */
export type SangeunViewOptions = Pick<Selection, "layer" | "owner" | "name"> & {
readOnly: boolean;
onChanged: (dirty: boolean) => void;
/** 수식 탭 저장 뒤 그 SK 새 판(802-4b-2) */
onVersion?: (version: string) => void;
/** 머리 줄 빈 자리(804-8) */
slot?: HTMLElement;
};
export function mountSangeunView(
host: HTMLElement,
doc: unknown,
opt: SangeunViewOptions,
): { getDoc: () => Promise<unknown>; destroy: () => void } {
let dirty = false;
const onChanged = (d: boolean): void => ((dirty = d), opt.onChanged(d));
/** 판정 띠 단추(810-4) — 서버가 SK 를 고친 뒤 새 판 · 그 SK 를 다시 읽어 상세를 다시 엶 */
const match = {
layer: opt.layer,
owner: opt.owner ?? null,
key: opt.name,
readOnly: opt.readOnly,
dirty: () => dirty,
done: (version: string): void => {
opt.onVersion?.(version);
void readTemplate(opt.layer, "sangeun", opt.name, null, opt.owner ?? null).then((got) => {
if (!alive) return;
one.destroy();
one = mount(got.문서);
onChanged(false);
});
},
};
const mount = (d: unknown) =>
mountSangeunDetail(host, d, {
...opt,
onChanged,
owner: opt.owner ?? null,
source: true,
match,
}); // 752-1
let alive = true;
let one = mount(doc);
return {
getDoc: () => one.flush().then(() => one.getDoc()),
destroy: () => ((alive = false), one.destroy()),
};
}