fix(808-1): 줄 쌓기 수정 3차 — 수량 칸 식 글 칸 + 출처 꼬리표 · 글꼴 M01 = M02 · M02 머리 [단가 갱신][재생성] · 일위대가 줄 모달 일원화
- 수량 칸(요구 701-1) = 늘 식 글 칸(Q_특별인부) + 출처 꼬리표(표 = 표 고르기) · 눌러도 안 바뀜 · 표 값 기호에 수 = 그 값만(직접 입력) · 꼬리표 한 곳(sourceTag) - 글꼴(701-2) = 줄 쌓기 화면이 정함(14px · M02 가 부모 16px 을 받던 것) - M02 머리(701-3) = [초기화] 와 [되돌림] 뜻 다름 → [초기화] 이름 「M01 값으로」 · [단가 갱신][재생성] = 보기 고르기 옆 머리 칸(수식 보기만) - 일위대가 단가산출 줄 모달(701-5) = 페이지 머리와 같음(보기 고르기 · [단가 갱신] · [재생성] · [저장]) - 일위대가 로직 줄 모달(701-4 · 5) = 옛 [옵션] · [단가산출로도 저장] · [항목 추가] · [율 줄 추가] 걷음 · 보기 고르기 없이 상세만 + 안내(온 단가산출) · 줄 문서 키 SK-000000 이 수식 문서를 읽어 404 · 「못 읽음」 이던 것 고침 - 시험: test_804_7 낡은 소스 기대(꼬리표 조건 글) 고침 + 808-1 · test_806_1 808-1 모달 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -28,6 +28,7 @@ import {
|
||||
moveLine,
|
||||
newVar,
|
||||
ownedOf,
|
||||
setRow,
|
||||
stackOf,
|
||||
type MoneyKind,
|
||||
type StackDoc,
|
||||
@@ -45,7 +46,7 @@ import { createUnitPick, NO_UNIT } from "../M02_MasterTemplete/DataFlow/M02_DF_U
|
||||
import { reach } from "./formula_doc_render";
|
||||
import { attachDrag } from "./line_stack_drag";
|
||||
import { openStackPick, type StackTake } from "./line_stack_pick";
|
||||
import { buildBlock } from "./line_stack_rows";
|
||||
import { buildBlock, sourceTag } from "./line_stack_rows";
|
||||
import { lt, type LsKey } from "./line_stack_text";
|
||||
|
||||
export interface EditHooks {
|
||||
@@ -194,7 +195,9 @@ function moneyBody(h: EditHooks, i: number): HTMLElement[] {
|
||||
];
|
||||
}
|
||||
|
||||
/** 수량 — 기호 하나면 값 + 출처 꼬리표(「0.39 ← 표 · 잡석 수량」 · 요구 687-12 · 기호는 마우스 글) · 누르면 그 자리에서 식 고침 */
|
||||
/** 수량 = 늘 식 글 칸(기호 하나면 그 이름 · 요구 701-1) + 그 기호에 연결이 있으면 옆 출처 꼬리표(표 = 표 고르기) ·
|
||||
* 칸을 눌러도 안 바뀜 — 글을 실제로 고칠 때만: 표 값 기호 자리에 수를 치면 그 기호 값(별칭 · 「직접 입력」 · 804-9) ·
|
||||
* 그 밖 = 수량 식 */
|
||||
function qtyBox(
|
||||
h: EditHooks,
|
||||
i: number,
|
||||
@@ -204,42 +207,20 @@ function qtyBox(
|
||||
const line = (h.doc.금액 ?? [])[i];
|
||||
const text = String(line.수량 ?? "");
|
||||
const v = h.doc.변수?.find((x) => varId(x) === text);
|
||||
const at = `qty:${i}`;
|
||||
const edit = (): HTMLElement => {
|
||||
const f = field(lt("Qty"), shown(text), (t) =>
|
||||
h.change((doc) => {
|
||||
h.open.delete(at);
|
||||
const l = doc.금액![i];
|
||||
if (t.trim()) l.수량 = real(t);
|
||||
else delete l.수량;
|
||||
}),
|
||||
);
|
||||
f.classList.add("lstk-qty");
|
||||
f.dataset.qty = String(i);
|
||||
return f;
|
||||
};
|
||||
if (!v || h.open.has(at)) return edit();
|
||||
const val = (h.answer.값 ?? {})[text];
|
||||
const link = v.연결 ?? {};
|
||||
const kind = link.갈래 ?? "식";
|
||||
const from =
|
||||
v.이름 || (link.키 || link.표 ? h.name(String(link.키 ?? link.표)) : "") || shown(text);
|
||||
const b = createButton({
|
||||
label: `${isNum(val) ? eqText(val) : "—"}${v.단위 && shownUnit(v.단위) ? ` ${shownUnit(v.단위)}` : ""} ← ${kind} · ${from}`,
|
||||
variant: "ghost",
|
||||
size: 24,
|
||||
onClick: () => {
|
||||
h.open.add(at);
|
||||
h.change(() => undefined);
|
||||
requestAnimationFrame(() =>
|
||||
document.querySelector<HTMLInputElement>(`[data-qty="${i}"] input`)?.focus(),
|
||||
);
|
||||
},
|
||||
});
|
||||
b.classList.add("lstk-qty");
|
||||
b.title = `${lt("Qty")} = ${shown(text)}`;
|
||||
b.dataset.qty = String(i);
|
||||
return b;
|
||||
const f = field(lt("Qty"), shown(text), (t) =>
|
||||
h.change((doc) => {
|
||||
const want = real(t);
|
||||
if (v?.연결?.표 && /^-?[\d.,]+$/.test(want)) return setRow(doc, text, want);
|
||||
if (want) doc.금액![i].수량 = want;
|
||||
else delete doc.금액![i].수량;
|
||||
}),
|
||||
);
|
||||
f.dataset.qty = String(i);
|
||||
const val = v ? (h.answer.값 ?? {})[text] : undefined;
|
||||
const tag = v ? sourceTag(h, text, v.연결) : null;
|
||||
if (tag && isNum(val))
|
||||
tag.title = `${eqText(val)}${shownUnit(v?.단위) ? ` ${shownUnit(v?.단위)}` : ""} — ${tag.title || tag.textContent}`;
|
||||
return el("span", { className: "lstk-qty", children: tag ? [f, tag] : [f] });
|
||||
}
|
||||
|
||||
/** [+ 줄] 고르개 값 → 새 줄 */
|
||||
|
||||
Reference in New Issue
Block a user