Merge remote-tracking branch 'origin/dev' into sub_laptop_4

This commit is contained in:
2026-11-01 21:29:40 +09:00
6 changed files with 47 additions and 22 deletions
@@ -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,
);
}
@@ -244,8 +244,11 @@ export async function renderM02MasterTemplate(root: HTMLElement): Promise<Mounte
user,
active: { root: pre.root, owner: pre.owner },
company,
go: (next) => 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<Mounte
user,
active: { root: sk.root, owner: sk.owner },
company,
go: (next) => ((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({
@@ -133,3 +133,10 @@ M01/M02에 대한 화면 검증은 잠시 미루고 라이다 데이터와 관
## 요구 559 (11-01 · 사용자 · 요구서 558 물음에 답)
분류 없는 라이다용 내장 CSF 개선 → 처음부터 점진 TIN 내장
## 요구 560 (11-01 · 사용자 · 밤 맡김 · 라이다 · 내역서 공통)
오늘은 나는 쉬러갈 생각임. 너가 브레인으로서 업무 수행할 내용
1. 구현 완료시 내요구사항이 제대로 반영되었는지 직접다시 읽고 확인할것. 최근 누락이 늘어나고 있음.
2. 1번 내용 완료시 너가 사용자가 된것처럼 브라우져를 컨트롤하여 검증 수행
3. 최종완료시 내일 아침에 내가 볼수 있게 아티팩트로 결과보고서 공유
@@ -139,3 +139,7 @@ M02 단가산출/일위대가에서 선택에 대한 검색기능에서 여러
1. 일위대가 수량 → 일위대가의 하나의 단가산출행의 수기입력적보는 기준단위 당 수량이 맞음. 하지만 이값은 구조물 조합의 엑셀에서 알약으로 연결하거나 프로젝트 내부에서 계산된 값과 연결되어져야한다고 내가 말했잖아. 만약 일위대가의 만드는 당시에 계산값을 확인하기 위해 임시 입력을 휘발성으로 입력받으라고도 말했고 이해를 못하는것같네....
2. M01 창 고침 → M01단가산출의 노임은 변경되지 않는게 맞음. 단, 만약 M02의 단가산출과 일위대가의 상세화면이라면 사용자가 변경할수 있어야하며 이값은 M01의 값을 변경하는게 아니라 M02 변경항목에 별도로 보관되어야하는 값임. 필요한 경우 데이터 일원화를 위해 변경시 M02에 단가산출에서 자동생성도 필요할 수도 있음.
## 내역 18 (11-01 · 사용자 · 밤 맡김 · 원문 = 사용자요구_1101.md 요구 560 과 같음)
구현 완료 시 요구사항 반영을 원문으로 다시 읽어 확인 · 그 뒤 브레인이 사용자처럼 브라우저로 검증 · 최종 완료 시 아침에 볼 아티팩트 결과보고서.
+5 -1
View File
@@ -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
+2 -2
View File
@@ -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"],