/* ============================================================================= * M02_MasterTemplete_Sangeun_Cover.ts * 단가산출(SK) 셈 길 부름 · 뺀 줄 띠(PLAN 717-2b · 717-3 · 724-1) * · 셈 = `calcSangeun`(`POST /layers/{층}/sangeun/calc` · 저장 안 함 · 부르는 쪽이 최신 응답만 받음) · * [단가산출로 저장] = `sangeunFromLine`(`/sangeun/from-line`) * · 고침 표는 공용 상세(`M01_MasterData_UI_LogicLab_Ho` · 724-1) — 여기는 뺀 줄 되살림 띠만 * ========================================================================== */ import { createBadge } from "@ui/ui_template_badge"; import { createButton } from "@ui/ui_template_button"; import { el } from "@ui/ui_template_elements"; import { t as L } from "@ui/ui_template_locale"; import { createText } from "@ui/ui_template_text"; import { call, type Layer } from "./M02_MasterTemplete_Api_Fetch"; import { withSameAsk } from "./M02_MasterTemplete_Library_SameAsk"; import type { PatchRow, SkAnswer } from "./logic/M02_Sangeun_Cover_Model"; import "./M02_MasterTemplete_Sangeun.css"; export interface SkScope { layer: Layer; owner: string | null; } const q = (scope: SkScope): string => scope.owner && scope.layer !== "system" ? `?owner=${encodeURIComponent(scope.owner)}` : ""; /** 셈(저장 안 함) — 문서 = 화면 문서 · `given` = 시험 입력(빈 칸 뺌) · 서버가 M01 엔진 한 벌로 셈 */ export function calcSangeun( scope: SkScope, doc: Record, given: Record = {}, seen = true, ): Promise { const 입력값 = Object.fromEntries(Object.entries(given).filter(([, v]) => String(v).trim())); return call(`/layers/${scope.layer}/sangeun/calc${q(scope)}`, { method: "POST", body: JSON.stringify({ 문서: doc, 입력값, 보기: seen }), // 보기 false = 글 · 중간 덧칸 안 지음(바탕 원값 셈) }); } /** [단가산출로 저장] — 그 층 새 SK · 답 = 새 키 + 그 SK 참조 줄 · 같은 내용이 있으면 물음(733-3 · * 그것을 씀 = 그 키 · 그래도 새로) · 취소 = null */ export const sangeunFromLine = ( scope: SkScope, line: PatchRow & Record, 이름: string, 단위: string, ): Promise<{ 이름: string; 줄: Record } | null> => withSameAsk((extra) => call(`/layers/${scope.layer}/sangeun/from-line${q(scope)}`, { method: "POST", body: JSON.stringify({ 줄: line, 이름, 단위, ...extra }), }), ); /** 뺀 줄(cid · 이름) 띠 — 고칠 수 있으면 [되살림] */ export function removedStrip( removed: { cid: string; 이름: string }[], edit: boolean, onRestore: (cid: string) => void, ): HTMLElement[] { if (!removed.length) return []; return [ el("div", { className: "m02-sk__removed", attrs: { "data-removed": "" }, children: [ createText(L("M02_SangeunRemoved")), ...removed.map((x) => el("span", { className: "m02-sk__removed-item", children: [ createBadge(x.이름, "neutral"), ...(edit ? [ createButton({ label: L("M02_SangeunRestore"), variant: "ghost", size: 22, onClick: () => onRestore(x.cid), }), ] : []), ], }), ), ], }), ]; }