From f7ebf1831fdd727dd5598b721afda6c5134985dd Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sun, 1 Nov 2026 21:08:07 +0900 Subject: [PATCH 1/3] =?UTF-8?q?feat(721-1):=20M02=20=EB=8B=A8=EA=B0=80?= =?UTF-8?q?=EC=82=B0=EC=B6=9C=20=EC=83=81=EC=84=B8=20=EB=8B=A8=EC=B6=94=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=C2=B7=20=EC=9E=90=EB=A6=AC=20=E2=80=94=20?= =?UTF-8?q?=E3=80=8C=EA=B8=B0=EB=B3=B8=20=EB=A1=9C=EC=A7=81=20=EC=84=A0?= =?UTF-8?q?=ED=83=9D=E3=80=8D=EC=9D=84=20=E3=80=8C=ED=95=AD=EB=AA=A9=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=E3=80=8D=20=EC=99=BC=EC=AA=BD=20=C2=B7=20?= =?UTF-8?q?=E3=80=8C=EC=A4=84=20=EB=8D=94=ED=95=98=EA=B8=B0=E3=80=8D=20?= =?UTF-8?q?=E2=86=92=20=E3=80=8C=ED=95=AD=EB=AA=A9=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=E3=80=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../M02_MasterTemplete_Sangeun_Detail.ts | 32 +++++++++---------- ui_template/ui_template_locale_m2.ts | 4 +-- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/M02_MasterTemplete/M02_MasterTemplete_Sangeun_Detail.ts b/M02_MasterTemplete/M02_MasterTemplete_Sangeun_Detail.ts index 274ab9d44..3bbbde1dc 100644 --- a/M02_MasterTemplete/M02_MasterTemplete_Sangeun_Detail.ts +++ b/M02_MasterTemplete/M02_MasterTemplete_Sangeun_Detail.ts @@ -5,7 +5,7 @@ * 시험 계산(`Logic_Calc` · 바탕 M01 로직) · 텍스트 수식(바탕 M01 로직 식) · 기본정보 = 바탕 로직(맨 위 접힘) * 고침 = SK 덮개 · 더한줄(`Sangeun_Pick`) · 뺀줄(꼴 = 서버 `M02_Sangeun_Doc`) · 값 = 서버 셈 길 최신 응답만 * 시험 입력 = SK 셈 `입력값`(저장 안 함) · [저장] = 화면 문서 → 서버가 다시 셈(원값 · 바탕판) - * 바탕 없는 SK = [M01 로직 고름] → 바탕 · 단위 · 바탕 없이 줄만도 됨 + * 바탕 없는 SK = [기본 로직 선택] → 바탕 · 단위 · 바탕 없이 줄만도 됨 * ========================================================================== */ import { createBadge } from "@ui/ui_template_badge"; @@ -96,6 +96,20 @@ export function mountSangeunDetail( }), }); addButton.hidden = !edit; + const pick = createButton({ + label: L("M02_SangeunPickBase"), + variant: "filled", + size: 28, + onClick: () => + openLogicPicker((x) => { + doc.바탕 = { 로직: x.키 }; + delete doc.바탕판; // 새 바탕 — 개정 견줄 판 없음 + if (!doc.단위 || doc.단위 === "식") doc.단위 = unitOf(x.결과단위) || doc.단위; + touch(false); + void loadBase(); + }), + }); + pick.hidden = true; // 보임은 drawHead 가 정함 const baseHint = createText(L("M02_SangeunBaseViews")); host.replaceChildren( el("div", { @@ -104,7 +118,7 @@ export function mountSangeunDetail( children: [ head, notes, - el("div", { className: "m02-sk__head", children: [views.root, addButton, baseHint] }), + el("div", { className: "m02-sk__head", children: [views.root, pick, addButton, baseHint] }), editor, ], }), @@ -164,19 +178,6 @@ export function mountSangeunDetail( const baseName = base ? `${base.logic.키} ${base.logic.이름}` : null; const baseText = baseName ?? doc.바탕?.참조?.키 ?? L("M02_SangeunNoBase"); const revised = !!(doc.바탕판 && ans?.바탕판 && doc.바탕판 !== ans.바탕판); - const pick = createButton({ - label: L("M02_SangeunPickBase"), - variant: "filled", - size: 28, - onClick: () => - openLogicPicker((x) => { - doc.바탕 = { 로직: x.키 }; - delete doc.바탕판; // 새 바탕 — 개정 견줄 판 없음 - if (!doc.단위 || doc.단위 === "식") doc.단위 = unitOf(x.결과단위) || doc.단위; - touch(false); - void loadBase(); - }), - }); pick.hidden = !edit || !!doc.바탕 || !!doc.뺀줄?.length || !!Object.keys(doc.덮개 ?? {}).length; head.replaceChildren( field(L("M02_Name"), "이름"), @@ -191,7 +192,6 @@ export function mountSangeunDetail( ...(opened() ? [createBadge(L("M02_SangeunScaleOnly"), "warning")] : []), ], }), - pick, ); } diff --git a/ui_template/ui_template_locale_m2.ts b/ui_template/ui_template_locale_m2.ts index cd9687885..d7edfbbd0 100644 --- a/ui_template/ui_template_locale_m2.ts +++ b/ui_template/ui_template_locale_m2.ts @@ -202,8 +202,8 @@ export const ui_locales_m2 = { M02_SangeunRemoved: ["뺀 줄", "Removed rows"], M02_SangeunUnit: ["단위(1 단위 값)", "Unit (value per 1)"], M02_SangeunNeed: ["비우면 저장 안 됨", "Required"], - M02_SangeunPickBase: ["M01 로직 고름", "Pick M01 logic"], - M02_SangeunAddLine: ["줄 더하기", "Add row"], + M02_SangeunPickBase: ["기본 로직 선택", "Select base logic"], + M02_SangeunAddLine: ["항목 추가", "Add item"], M02_SangeunDrop: ["빼기", "Remove"], M02_SangeunRestore: ["되살리기", "Restore"], M02_SangeunWas: ["바탕", "Base"], From 931793d0319608f322ee42b6ad06729754b0e8b9 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sun, 1 Nov 2026 21:11:12 +0900 Subject: [PATCH 2/3] =?UTF-8?q?knowledge(=EC=9A=94=EA=B5=AC):=20=EC=9A=94?= =?UTF-8?q?=EA=B5=AC=20560=20=C2=B7=20=EB=82=B4=EC=97=AD=2018=20=EC=9B=90?= =?UTF-8?q?=EB=AC=B8=20=EA=B8=B0=EB=A1=9D=20=E2=80=94=20=EB=B0=A4=20?= =?UTF-8?q?=EB=A7=A1=EA=B9=80(=EC=9A=94=EA=B5=AC=20=EB=B0=98=EC=98=81=20?= =?UTF-8?q?=EC=9B=90=EB=AC=B8=20=EB=8C=80=EC=A1=B0=20=C2=B7=20=EB=B8=8C?= =?UTF-8?q?=EB=A0=88=EC=9D=B8=20=EB=B8=8C=EB=9D=BC=EC=9A=B0=EC=A0=80=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=20=C2=B7=20=EC=95=84=EC=B9=A8=20=EC=95=84?= =?UTF-8?q?=ED=8B=B0=ED=8C=A9=ED=8A=B8=20=EB=B3=B4=EA=B3=A0=EC=84=9C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- docs/raw/요구_1101/사용자요구_1101.md | 7 +++++++ docs/raw/요구_내역서/사용자요구_내역서.md | 4 ++++ 2 files changed, 11 insertions(+) diff --git a/docs/raw/요구_1101/사용자요구_1101.md b/docs/raw/요구_1101/사용자요구_1101.md index dedd7a3d8..7f151f3f2 100644 --- a/docs/raw/요구_1101/사용자요구_1101.md +++ b/docs/raw/요구_1101/사용자요구_1101.md @@ -133,3 +133,10 @@ M01/M02에 대한 화면 검증은 잠시 미루고 라이다 데이터와 관 ## 요구 559 (11-01 · 사용자 · 요구서 558 물음에 답) 분류 없는 라이다용 내장 CSF 개선 → 처음부터 점진 TIN 내장 + +## 요구 560 (11-01 · 사용자 · 밤 맡김 · 라이다 · 내역서 공통) + +오늘은 나는 쉬러갈 생각임. 너가 브레인으로서 업무 수행할 내용 +1. 구현 완료시 내요구사항이 제대로 반영되었는지 직접다시 읽고 확인할것. 최근 누락이 늘어나고 있음. +2. 1번 내용 완료시 너가 사용자가 된것처럼 브라우져를 컨트롤하여 검증 수행 +3. 최종완료시 내일 아침에 내가 볼수 있게 아티팩트로 결과보고서 공유 diff --git a/docs/raw/요구_내역서/사용자요구_내역서.md b/docs/raw/요구_내역서/사용자요구_내역서.md index 2cce3f98e..ea4adb73a 100644 --- a/docs/raw/요구_내역서/사용자요구_내역서.md +++ b/docs/raw/요구_내역서/사용자요구_내역서.md @@ -139,3 +139,7 @@ M02 단가산출/일위대가에서 선택에 대한 검색기능에서 여러 1. 일위대가 수량 → 일위대가의 하나의 단가산출행의 수기입력적보는 기준단위 당 수량이 맞음. 하지만 이값은 구조물 조합의 엑셀에서 알약으로 연결하거나 프로젝트 내부에서 계산된 값과 연결되어져야한다고 내가 말했잖아. 만약 일위대가의 만드는 당시에 계산값을 확인하기 위해 임시 입력을 휘발성으로 입력받으라고도 말했고 이해를 못하는것같네.... 2. M01 창 고침 → M01단가산출의 노임은 변경되지 않는게 맞음. 단, 만약 M02의 단가산출과 일위대가의 상세화면이라면 사용자가 변경할수 있어야하며 이값은 M01의 값을 변경하는게 아니라 M02 변경항목에 별도로 보관되어야하는 값임. 필요한 경우 데이터 일원화를 위해 변경시 M02에 단가산출에서 자동생성도 필요할 수도 있음. + +## 내역 18 (11-01 · 사용자 · 밤 맡김 · 원문 = 사용자요구_1101.md 요구 560 과 같음) + +구현 완료 시 요구사항 반영을 원문으로 다시 읽어 확인 · 그 뒤 브레인이 사용자처럼 브라우저로 검증 · 최종 완료 시 아침에 볼 아티팩트 결과보고서. From 7621fff233bee2ab0a48cde47cf862f4190076b3 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sun, 1 Nov 2026 21:11:43 +0900 Subject: [PATCH 3/3] =?UTF-8?q?feat(720-1):=20=EB=8B=A8=EA=B0=80=EC=82=B0?= =?UTF-8?q?=EC=B6=9C=20=C2=B7=20=EC=9D=BC=EC=9C=84=EB=8C=80=EA=B0=80=20?= =?UTF-8?q?=EC=B8=B5=20=EB=8B=A8=EC=B6=94=20=3D=20=EC=A0=80=EC=9E=A5=20?= =?UTF-8?q?=EC=95=88=20=ED=95=9C=20=EA=B3=A0=EC=B9=A8=20=EB=AC=BC=EC=9D=8C?= =?UTF-8?q?=20=EB=92=A4=20=EA=B7=B8=20=EC=B8=B5=20=EB=82=98=EB=AC=B4=20+?= =?UTF-8?q?=20=EC=83=81=EC=84=B8=20=EB=AA=A9=EB=A1=9D=ED=91=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 낡은 시험 test_m02_precombo_scope 층 단추 줄 글 대조를 새 꼴로(옛 go = 나무만) Co-Authored-By: Claude Opus 5.5 --- M02_MasterTemplete/M02_MasterTemplete_UI_Page.ts | 16 +++++++++++++--- resources/tester/test_m02_precombo_scope.py | 6 +++++- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/M02_MasterTemplete/M02_MasterTemplete_UI_Page.ts b/M02_MasterTemplete/M02_MasterTemplete_UI_Page.ts index 4ff1e2265..395bb2e8d 100644 --- a/M02_MasterTemplete/M02_MasterTemplete_UI_Page.ts +++ b/M02_MasterTemplete/M02_MasterTemplete_UI_Page.ts @@ -244,8 +244,11 @@ export async function renderM02MasterTemplate(root: HTMLElement): Promise setPre(next), - // 켜진 단추 다시 누름 = 그 층 목록표(생성 · 복사 · 삭제) + // 다른 층 = 저장 안 한 고침 물음 → 그 층 나무 + 목록표(720-1) · 켜진 단추 다시 누름 = 목록표 + go: (next) => + void main + .confirmLeave() + .then((ok) => ok && (setPre(next), void main.open(precomboList(pre)))), reselect: () => void main.confirmLeave().then((ok) => ok && void main.open(precomboList(pre))), }); @@ -256,7 +259,14 @@ export async function renderM02MasterTemplate(root: HTMLElement): Promise ((sk = preScope(next)), void side.refreshSangeun()), + go: (next) => + void main + .confirmLeave() + .then( + (ok) => + ok && + ((sk = preScope(next)), void side.refreshSangeun(), void main.open(sangeunList(sk))), + ), reselect: () => void main.confirmLeave().then((ok) => ok && void main.open(sangeunList(sk))), }); const side = buildSide({ diff --git a/resources/tester/test_m02_precombo_scope.py b/resources/tester/test_m02_precombo_scope.py index 921f89074..1ae74c681 100644 --- a/resources/tester/test_m02_precombo_scope.py +++ b/resources/tester/test_m02_precombo_scope.py @@ -73,7 +73,11 @@ def test_사전조합_층_단추는_페이지를_다시_안_세움(): assert "navigateTo" not in pre and "setActiveLayer" not in pre # 페이지 층 · 해시 이동 없음 assert "entry.pre = pre.root;" in pre # 구조물 조합 층 이동(go) 때도 주소에 남음 bar = page.split("const preBar = (): HTMLElement =>")[1].split("const side = buildSide(")[0] - assert "go: (next) => setPre(next)," in bar and "main.open(precomboList(pre))" in bar + # 720-1 — 다른 층 = 저장 안 한 고침 물음 → 그 층 나무 + 목록표 + go = bar.split("go: (next) =>")[1].split("reselect:")[0] + assert "main.confirmLeave()" in go and "setPre(next), void main.open(precomboList(pre))" in go + sk = page.split("const skBar = (")[1].split("const side = buildSide(")[0] + assert "main.confirmLeave()" in sk and "void main.open(sangeunList(sk))" in sk.split("reselect:")[0] # 구조물 조합 층 단추는 그대로 해시 이동 한 벌 assert page.count('layerBar("') == 1 assert 'layerBar("구조물조합", tree.add, () => void main.openTable(layer)),' in page