feat(804-8): M02 단가산출 수식 탭 = M01 과 같은 단추 · 저장 한 번 · 머리 단추 줄바꿈 막음(요구 689)

- 공용 줄 쌓기 화면: 페이지가 저장을 맡는 꼴(`page`)을 M02 단가산출 화면에도 — 탭 위 [고침 버림] · [수식 저장] 걷음 · M02 사본 [단가 갱신] · [재생성] · 「M01 새 판」 배지는 그대로 · 「줄 쌓기에서 못 고치는 칸」 안내 줄 걷음(금액 줄 기호 = 율 줄이 앞 줄 금액을 부르는 속 이름 · 화면에서 고칠 값 아님 · 보존 그대로)
- M02 머리 단추 = [초기화] · [삭제] · [되돌림] · [저장] — 단가산출 상세는 [새로고침] 숨김 · [되돌림] · [저장] = 고침 있을 때만(기본정보 + 수식) · [저장] 한 번 = 수식 먼저 저장(새 판 · 수식 칸 받음) → 단가산출 문서 저장 · [되돌림] · 버리고 떠남 = 수식 캐시도 비움
- 보기 고르기(수식 · 단가산출 상세) = M01 처럼 머리 줄 · [항목 추가] · [율 줄 추가] 걷음(줄 더하기 = 수식 탭 [+] 단가산출 · 일위대가 복사) · 일위대가 줄 모달 안 상세는 그대로
- 머리 단추 줄 맞춤(부품 상자 `fitButtonRow`): 단추가 아래로 떨어지거나 제목이 여러 줄이면 아이콘 단추는 아이콘만(글 = 풍선 도움말) · M01 단추 다섯 · M02 단추 넷 아이콘 · 단가산출 상세 긴 이름은 제목 안에서 줄바꿈
- 사본 할일 막힘 알림 글 = [저장] 또는 [되돌림] 먼저
- 시험: test_804_7 에 M02 단추 · 저장 한 번 · 줄 맞춤 지킴 더함 · test_804_4 권한 시험에 수식 저장 판 = 페이지 저장 판 이어 씀 확인 더함

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-08 14:56:31 +09:00
co-authored by Claude Opus 5.5
parent ef5fb0632f
commit eb64bf64ac
16 changed files with 209 additions and 53 deletions
+19 -3
View File
@@ -502,15 +502,21 @@ export async function mountM01LogicLab(
}
};
const saveButton = createButton({ label: tx("Bar_Save"), onClick: () => void onSave() });
const saveButton = createButton({
label: tx("Bar_Save"),
iconStart: "check",
onClick: () => void onSave(),
});
const discardButton = createButton({
label: tx("Bar_Discard"),
variant: "ghost",
iconStart: "undo",
onClick: () => void onDiscard(),
});
const copyButton = createButton({
label: tl("Copy_Open"),
variant: "ghost",
iconStart: "copy",
onClick: () =>
opened?.origKey
? void openCopyScreen({
@@ -529,9 +535,19 @@ export async function mountM01LogicLab(
status: [pending],
buttons: [
views.root,
createButton({ label: tl("New"), variant: "filled", onClick: () => void onNew() }),
createButton({
label: tl("New"),
variant: "filled",
iconStart: "plus",
onClick: () => void onNew(),
}),
copyButton,
createButton({ label: tx("Bar_Delete"), variant: "danger", onClick: () => void onDelete() }),
createButton({
label: tx("Bar_Delete"),
variant: "danger",
iconStart: "trash",
onClick: () => void onDelete(),
}),
discardButton,
saveButton,
],