- SK 셈 답 → 공용 상세 줄(logic/M02_Sangeun_Cover_Model.hoView · 정체 차례 · 바탕 줄 그대로 · 더한줄) · 고침 고리 HoEdit → setLineCover(덮개 · 더한줄 · 열린입력 = 배율) - HoEdit 덧칸 more(줄 빼기 · 별도계상) · M02 = 덧줄 율 고침 · 꼬리표 「변경 항목」 · 뺀 줄 띠 = Sangeun_Cover.removedStrip - 시험 계산 · 텍스트 수식 = 바탕 로직 + 덮개 품 · 단가 사본(applyCovers) · 뺀 바탕 줄 글 거름(dropText — 같은 이름 더한줄이 안 받음) - 717-3 openRowSangeun = 줄 모드 상세(mountRowSk) 얇은 모달(Labor_Detail 부름 그대로) · skCoverTable · coverTable · 뿌리 M02_Sangeun_Cover_Model.ts 지움(Labor_Api import 한 줄) - 낡은 시험: test_717_2b(setQty · setPrice → setLineCover · hoView · dropText) · test_717_3(모델 경로 · setCover · priceKey · sheetGroups 걷힘 → cleanPatch · 화면 이음 새 꼴) - 안내 글(M02_SangeunBaseViews) = 덮개 사본 반영 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
85 lines
3.1 KiB
TypeScript
85 lines
3.1 KiB
TypeScript
/* =============================================================================
|
|
* 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 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<T = SkAnswer>(
|
|
scope: SkScope,
|
|
doc: Record<string, unknown>,
|
|
given: Record<string, string> = {},
|
|
): Promise<T> {
|
|
const 입력값 = Object.fromEntries(Object.entries(given).filter(([, v]) => String(v).trim()));
|
|
return call<T>(`/layers/${scope.layer}/sangeun/calc${q(scope)}`, {
|
|
method: "POST",
|
|
body: JSON.stringify({ 문서: doc, 입력값 }),
|
|
});
|
|
}
|
|
|
|
/** [단가산출로 저장] — 그 층 새 SK · 답 = 새 키 + 그 SK 참조 줄 */
|
|
export const sangeunFromLine = (
|
|
scope: SkScope,
|
|
line: PatchRow & Record<string, unknown>,
|
|
이름: string,
|
|
단위: string,
|
|
): Promise<{ 이름: string; 줄: Record<string, unknown> }> =>
|
|
call(`/layers/${scope.layer}/sangeun/from-line${q(scope)}`, {
|
|
method: "POST",
|
|
body: JSON.stringify({ 줄: line, 이름, 단위 }),
|
|
});
|
|
|
|
/** 뺀 줄(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),
|
|
}),
|
|
]
|
|
: []),
|
|
],
|
|
}),
|
|
),
|
|
],
|
|
}),
|
|
];
|
|
}
|