Merge remote-tracking branch 'origin/sub_laptop_2' into main_laptop_1
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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: [" 추가", " +"],
|
||||
|
||||
@@ -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: [
|
||||
|
||||
Reference in New Issue
Block a user