Merge remote-tracking branch 'origin/sub_laptop_2' into main_laptop_1

This commit is contained in:
2026-10-08 12:16:10 +09:00
20 changed files with 239 additions and 48 deletions
+3
View File
@@ -59,6 +59,8 @@ export interface SheetOptions {
drawingLabel?: (colId: string) => string;
/** 면적산출 줄 칸 글(번호) — `drawingLabel` 과 같음. */
areaLabel?: (colId: string) => string;
/** 구조물 조합 표(`combo`) 「일위대가 합계」 줄 칸 글 — 주면 읽기 전용 줄이 생김(86-3). */
laborSumLabel?: (colId: string) => string;
/** 칸을 고름 — 누르기 · 방향키 · Tab. */
onSelect?: (sel: SheetSelection) => void;
/** 조회 후 선택 — master 일위대가 · 도면 · 면적산출 칸을 두 번 누르기 · Enter · F2 로 부름.
@@ -90,6 +92,7 @@ export function createSheet(host: HTMLElement, input: SheetDoc, opts: SheetOptio
laborLabel: opts.laborLabel,
drawingLabel: opts.drawingLabel,
areaLabel: opts.areaLabel,
laborSumLabel: opts.laborSumLabel,
pick: !!opts.onPick,
headLocked: !!opts.lockHead,
combo: !!opts.combo,
+3 -1
View File
@@ -22,11 +22,13 @@ export const KEY_UNIT = "s:unit";
export const KEY_PRICE = "s:price";
export const KEY_DRAWING = "s:drawing";
export const KEY_AREA = "s:area";
/** 구조물 조합 표 읽기 전용 줄 「일위대가 합계」(86-3) — 마스터 줄 차례 · 조회 후 선택에는 안 들어감. */
export const KEY_SUM = "s:laborsum";
/** 마스터 전용 줄(첫 쪽 단위 줄 아래 차례) — 일위대가 · 도면 · 면적산출 줄은 손으로 못 침(번호 글). */
export const MASTER_ROWS = [KEY_PRICE, KEY_DRAWING, KEY_AREA] as const;
export type MasterRowKey = (typeof MASTER_ROWS)[number];
/** 번호 글 줄 — 부른 쪽이 준 글(`refLabel`)만 보임(일위대가 = SU · 열의 옛 `일위대가` 칸은 안 읽음). */
export const REF_ROWS: readonly string[] = [KEY_PRICE, KEY_DRAWING, KEY_AREA];
export const REF_ROWS: readonly string[] = [KEY_PRICE, KEY_DRAWING, KEY_AREA, KEY_SUM];
/** 조회 후 선택 줄 — `onPick` 을 주면 이 줄 칸은 치지 않고 고름. */
export const PICK_ROWS: readonly string[] = MASTER_ROWS;
+16 -7
View File
@@ -17,6 +17,7 @@ import {
isBlankPick,
isCalcColumn,
KEY_AREA,
KEY_SUM,
KEY_PRICE,
KEY_UNIT,
MASTER_ROWS,
@@ -43,6 +44,8 @@ export interface RenderState {
laborLabel?: (colId: string) => string;
drawingLabel?: (colId: string) => string;
areaLabel?: (colId: string) => string;
/** 구조물 조합 표 「일위대가 합계」 줄 칸 글 — 주면 combo 표에 읽기 전용 줄이 생김(86-3). */
laborSumLabel?: (colId: string) => string;
/** 조회 후 선택 줄(`PICK_ROWS`)을 고름으로 받나 — 칸 겉모양만. */
pick?: boolean;
/** 머리 · 층 이름을 못 고침(`lockHead`) — 칸 겉모양만. */
@@ -55,11 +58,13 @@ export interface RenderState {
/** 일위대가 · 도면 · 면적산출 줄 칸 글(번호). */
export const refText = (state: RenderState, key: string, colId: string): string =>
(key === KEY_AREA
? state.areaLabel
: key === KEY_PRICE
? state.laborLabel
: state.drawingLabel)?.(colId)?.trim() || st("Drawing_None");
key === KEY_SUM
? state.laborSumLabel?.(colId)?.trim() || "—"
: (key === KEY_AREA
? state.areaLabel
: key === KEY_PRICE
? state.laborLabel
: state.drawingLabel)?.(colId)?.trim() || st("Drawing_None");
/** 열 폭 — 저장 폭(없으면 기본) · 머리 글이 안 잘리는 최소 폭보다 좁지 않게. */
const columnWidth = (doc: SheetDoc, col: SheetColumn, mins: Map<string, number>): number =>
@@ -173,17 +178,18 @@ export function renderSheet(state: RenderState): HTMLElement {
return tr;
};
const masterRow = (key: MasterRowKey): HTMLElement => {
const masterRow = (key: MasterRowKey | typeof KEY_SUM): HTMLElement => {
const label = (
{
"s:price": "Row_Unit_Price",
"s:drawing": "Row_Drawing",
"s:area": "Row_Area",
"s:laborsum": "Row_LaborSum",
} as const
)[key];
const tr = el("tr", { className: "ui-sheet__meta", children: [gutter("th", st(label))] });
cols.forEach((col, j) => {
const blank = isBlankPick(key, col);
const blank = key === KEY_SUM ? col.꼴 === "글" : isBlankPick(key, col);
const text = blank ? "" : refText(state, key, col.id); // 마스터 줄 = 모두 번호 글
const td = bodyCell(key, col, j, text);
td.classList.remove("is-num");
@@ -264,6 +270,9 @@ ${formulaLabel(formula, names)}`
children: [
// 구조물 조합 = 일위대가 · 도면 · 면적산출 키 줄 안 보임(보기만 · 번호는 장부 · 카드에)
...(mode === "master" && p === 0 && !state.combo ? MASTER_ROWS.map(masterRow) : []),
...(mode === "master" && p === 0 && state.combo && state.laborSumLabel
? [masterRow(KEY_SUM)]
: []), // 구조물 조합 = 읽기 전용 합계 줄 하나(86-3)
...page.rows.map((row, i) => dataRow(row, page.first + i)),
...(page.totals ? totalRows() : []),
],
@@ -11,6 +11,7 @@ const TEXT = {
Col_New: ["새 열", "New column"],
Row_Unit: ["단위", "Unit"],
Row_Unit_Price: ["일위대가", "Unit price"],
Row_LaborSum: ["일위대가 합계", "Unit price total"],
Row_Drawing: ["도면", "Drawing"],
Row_Area: ["면적산출", "Area"],
Add_Suffix: [" 추가", " +"],
+4
View File
@@ -157,6 +157,10 @@ export const ui_locales_m2 = {
M02_TreeSaveGo: ["저장 후 넘어감", "Save and continue"],
M02_TreeDiscardGo: ["버리고 넘어감", "Discard and continue"],
M02_TreeDone: ["나무를 고침", "Tree updated"],
M02_TreeRenamed: [
"나무를 고침 — 같은 이름이 있어 「{value}」 로 저장",
"Tree updated — name already taken, saved as “{value}”",
],
M02_PracticeTitle: ["실무문서", "Practice documents"],
M02_PracticeRow: ["실무문서 목록", "Practice document list"],
M02_PracticeCount: [