요구 651 · 653 — 계산 공식 참고용 흐름도(① M01 로직 상세 오른쪽 접는 패널)를 걷음. ② M02 일위대가 다이어그램은 그대로.
지움(64 파일 · 18,666 줄 · 되돌릴 길 = git 이력)
- M01 6 파일 1,064 줄 — Store_Flow.py · UI_LogicLab_Flow.ts/.css · FlowRows.ts · FlowView.ts/.css
- M02_MasterTemplete/DataFlow 43 파일 12,799 줄 — 흐름도 화면 · 셈(Compute · Convert · Lookup · Model · Eval …)
- 시험 15 파일 4,803 줄 — test_m01_logic_flow{view,_engine,_project,_save} · test_m02_df_*(값 찾기 values_old 뺌) — 지운 흐름 코드만 지키던 것
남김(바닥) — DataFlow M02_DF_UnitPick(일위대가 셋) · M02_DF_Values(M02_Item_Prices) · M02_DF_Round · _standard 표 ·
M02_DF_Router = GET /api/m02/df/standards 하나 · M02_DF_Api = cfStandards 하나 · CfRound 꼴은 Round 안으로
고침
- M01 Router — /save = Store_Make.save(개정 확인 · 자체 파일 새 줄 GX · added 그대로) · /calc /text /logic/auto = 옛 셈만 · /logic/flow 둘 지움
- master_formula — 흐름 훅 지움 · 줄에 「흐름」 이 남으면 「흐름도 로직은 걷음」 까닭 오류(저장된 흐름 로직 0 — 마스터 · storage 다시 확인)
- Sangeun_Calc._defaults = 옛 자동값 · M02_Logic_Lib_Read /logic/flow 지움 · main.py 주석
- 화면 — LogicLab(startFlow · scheduleFlow · 예시값 잇기 지움 · [신규 로직] 줄 = 입력 · 중간 · 호표 빈 목록 + 끝수 null) ·
Side(원문 패널 하나) · Source(머리 칸 이름 m01lab-src__top/__title · DF_Panel.css 안 씀) · Detail · View(nowInputs 지움) · Sheet(흐름 갈래 지움) · 글
- 시험 — 지운 파일을 가리키던 목록 넷(spreadsheet_size · 208_1 · 588 · input_prefs) · 717_1 흐름 길 두 줄 · values_old 흐름 셈 부분 지움
- test_713_3_list 기대 — 로직 1,461 → 1,515 · 묶음 307 → 335 · 작업량 21 → 65 · 부르는 506 → 512(782-1 · 2 · 3 건설 기초 로직 54 더함 ·
옛 키만 세면 307 · 21 · 506 그대로)
- 새 지킴 test_794_1b_flow_gone — 흐름 길 404 · 표준 표 남음 · 신규 로직 자체 GX · 흐름 남은 줄 까닭 오류
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
106 lines
3.7 KiB
TypeScript
106 lines
3.7 KiB
TypeScript
/* =============================================================================
|
|
* M01_MasterData_UI_LogicLab_Basic.ts
|
|
* 「신규 로직」 기본정보 칸 — 이름 · 원문번호 · 결과 단위 · 출처(구분 = 자체). 확인하면 값을 돌려줌 · 취소면 null
|
|
* 저장은 하지 않음 — 부른 쪽이 빈 시트 줄로 캐시(drafts)에 넣고 [저장] 때 서버가 GX 새 키를 줌.
|
|
* ========================================================================== */
|
|
|
|
import { currentLanguageIndex } from "@ui/ui_template_locale";
|
|
import { createButton, createInputField, createSelectField, el } from "@ui/ui_template_elements";
|
|
import { openModal } from "@ui/ui_template_modal";
|
|
|
|
const TEXT = {
|
|
Title: ["신규 로직", "New logic"],
|
|
Name: ["이름", "Name"],
|
|
NamePh: ["예: 돌쌓기 메쌓기(인력)", "e.g. dry stone wall (labour)"],
|
|
Number: ["원문번호", "Source number"],
|
|
NumberPh: ["예: 13-4-1 · 없으면 비움", "e.g. 13-4-1 · may be empty"],
|
|
Unit: ["결과 단위", "Result unit"],
|
|
Source: ["출처", "Source"],
|
|
Ok: ["만들기", "Create"],
|
|
Cancel: ["취소", "Cancel"],
|
|
Close: ["닫기", "Close"],
|
|
NeedName: ["이름을 넣어 주세요", "Enter a name"],
|
|
} as const;
|
|
|
|
const tb = (key: keyof typeof TEXT): string => TEXT[key][currentLanguageIndex === 1 ? 1 : 0];
|
|
|
|
export interface BasicInfo {
|
|
이름: string;
|
|
원문번호: string;
|
|
결과단위: string;
|
|
출처: string;
|
|
}
|
|
|
|
/** 기본정보 묻기 — units = 결과 단위 후보(마스터 로직의 결과단위) */
|
|
export function askBasicInfo(units: string[]): Promise<BasicInfo | null> {
|
|
return new Promise((resolve) => {
|
|
let done = false;
|
|
const finish = (v: BasicInfo | null): void => {
|
|
if (done) return;
|
|
done = true;
|
|
resolve(v);
|
|
};
|
|
const name = createInputField({ label: tb("Name"), placeholder: tb("NamePh"), compact: true });
|
|
const number = createInputField({
|
|
label: tb("Number"),
|
|
placeholder: tb("NumberPh"),
|
|
compact: true,
|
|
});
|
|
const unit = createSelectField({
|
|
label: tb("Unit"),
|
|
options: units.map((u) => ({ value: u, text: u })),
|
|
value: units[0] ?? "원",
|
|
compact: true,
|
|
});
|
|
const source = createInputField({ label: tb("Source"), value: "자체", compact: true });
|
|
const why = el("p", { className: "ui-text ui-text--muted", attrs: { role: "alert" } });
|
|
const modal = openModal({
|
|
title: tb("Title"),
|
|
closeLabel: tb("Close"),
|
|
beforeClose: () => {
|
|
finish(null);
|
|
return true;
|
|
},
|
|
mount: (body, close) => {
|
|
const ok = (): void => {
|
|
const 이름 = name.input.value.trim();
|
|
if (!이름) {
|
|
why.textContent = tb("NeedName");
|
|
return void name.input.focus();
|
|
}
|
|
finish({
|
|
이름,
|
|
원문번호: number.input.value.trim(),
|
|
결과단위: unit.select.value,
|
|
출처: source.input.value.trim() || "자체",
|
|
});
|
|
close();
|
|
};
|
|
name.input.addEventListener("keydown", (ev) => ev.key === "Enter" && ok());
|
|
body.append(
|
|
name.root,
|
|
number.root,
|
|
unit.root,
|
|
source.root,
|
|
why,
|
|
el("div", {
|
|
className: "ui-toolbar m01-logic__bar",
|
|
children: [
|
|
createButton({ label: tb("Ok"), size: "sm", onClick: ok }),
|
|
createButton({
|
|
label: tb("Cancel"),
|
|
variant: "ghost",
|
|
size: "sm",
|
|
onClick: () => {
|
|
finish(null);
|
|
modal.close();
|
|
},
|
|
}),
|
|
],
|
|
}),
|
|
);
|
|
},
|
|
});
|
|
});
|
|
}
|