From c94e77734ecda6e7d6effb0125d6258b40720fce Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sat, 12 Sep 2026 16:00:19 +0900 Subject: [PATCH] =?UTF-8?q?fix(=EA=B3=B5=EC=9A=A9):=20=EA=B7=BC=EA=B1=B0?= =?UTF-8?q?=20=ED=98=B8=EB=B2=84=20=EB=B0=B0=EC=A7=80=EB=A5=BC=20=EC=B9=B8?= =?UTF-8?q?=20=EB=93=B1=EA=B8=89=EC=9C=BC=EB=A1=9C=20=EA=B7=B8=EB=A6=AC?= =?UTF-8?q?=EA=B3=A0=20=EB=B9=A0=EC=A7=84=20=EB=93=B1=EA=B8=89=EC=9D=80=20?= =?UTF-8?q?=EC=97=B4=EC=97=90=EC=84=9C=20=EC=B1=84=EC=9B=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 같은 열이라도 줄마다 성격이 갈리는 자리가 있음 — 원가계산서 「금액」은 중간줄 (간접노무비 따위)이 계산인데 마지막줄(총원가·도급금액·총계)은 최종임(데스크탑 보조 B09 배선에서 나옴). `markProvenanceCell` 은 이미 칸마다 등급을 받고 있었으나 카드 배지가 열 등급으로만 그려져 **띠는 최종인데 배지는 「계산」**으로 어긋났음. - `fill()` 이 칸을 받아 배지를 `cell.dataset.provTier || column.tier` 로 그림 - 등급을 안 심은 칸은 `attachProvenance` 가 열 등급으로 채움 — 안 그러면 배지는 뜨는데 띠가 안 붙는 「색 없는 칸」이 생김. 부르는 쪽이 등급을 빼먹기 쉬운 자리라 여기서 맞춤. 줄마다 다른 칸에만 세 번째 인자를 주면 됨. 자체검증(ORCA 5173) — 같은 열 `amount_krw` 에서 등급 안 심은 칸은 배지 「계산」·띠 초록 rgb(31,138,76), `final` 심은 칸은 배지 「최종」·띠 금색 rgb(184,134,11) 3px inset. 배지와 띠가 같은 말을 함. `tsc --noEmit` 통과 · 병합 뒤 `pytest -q` 1313 passed. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_017RANEBHns1S4tkmsYwewtk --- ui_template/ui_template_provenance.ts | 33 +++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/ui_template/ui_template_provenance.ts b/ui_template/ui_template_provenance.ts index be53625e..396023ee 100644 --- a/ui_template/ui_template_provenance.ts +++ b/ui_template/ui_template_provenance.ts @@ -52,7 +52,14 @@ const TINT_KEY = "aislo.provenance.tint"; const STYLE_ID = "ui-provenance-style"; const CARD_ID = "ui-provenance-card"; -/** 칸에 심는 표시 — 열 키와 등급. 표를 그리는 쪽이 칸마다 한 번 부른다. */ +/** + * 칸에 심는 표시 — 열 키와 등급. 표를 그리는 쪽이 칸마다 한 번 부른다. + * + * `tier` 를 주면 **그 칸만 열 등급을 이긴다.** 같은 열이라도 줄마다 성격이 갈리는 + * 자리가 있기 때문이다 — 원가계산서 「금액」은 중간줄(간접노무비 따위)이 `calc` 인데 + * 마지막줄(총원가·도급금액·총계)은 `final` 이다(2026-09-12 데스크탑 보조 B09 배선). + * 칸 등급을 심지 않으면 열 등급이 그대로 선다. + */ export function markProvenanceCell(cell: HTMLElement, columnKey: string, tier?: string): void { cell.dataset.provCol = columnKey; if (tier) cell.dataset.provTier = tier; @@ -137,7 +144,15 @@ function place(element: HTMLElement, x: number, y: number): void { } /** 카드 한 장을 채운다. 값은 **화면에 적힌 글자 그대로** 보인다 — 자리수까지 같은 것이 요점. */ -function fill(target: HTMLElement, column: ProvenanceColumn, value: string, extra: string[]): void { +/** 카드 한 장을 채운다. 배지는 **칸 등급**을 먼저 본다 — 띄는 띄었는데 배지가 다른 말을 + * 하면 읽는 사람이 둘 중 어느 것을 믿을지 모른다. */ +function fill( + target: HTMLElement, + cell: HTMLElement, + column: ProvenanceColumn, + value: string, + extra: string[], +): void { target.replaceChildren(); const head = document.createElement("div"); head.className = "ui-prov-card__head"; @@ -145,8 +160,9 @@ function fill(target: HTMLElement, column: ProvenanceColumn, value: string, extr title.textContent = column.label; const badge = document.createElement("span"); badge.className = "ui-prov-card__badge"; - badge.dataset.provTier = column.tier; - badge.textContent = TIER_LABELS[column.tier] ?? column.tier; + const tier = cell.dataset.provTier || column.tier; + badge.dataset.provTier = tier; + badge.textContent = TIER_LABELS[tier] ?? tier; head.append(title, badge); target.append(head); @@ -171,6 +187,14 @@ export function attachProvenance( ): void { if (!sheet) return; injectProvenanceStyles(); + // 등급을 안 심은 칸은 **여기서 열 등급으로 채운다.** + // 색칠은 CSS 가 `data-prov-tier` 를 보고 하므로, 그 칸은 배지만 띄고 띄는 안 붙어 + // 「색이 안 붙는 칸」이 생긴다. 부르는 쪽이 등급을 빼먹는 것은 흔한 일이라 여기서 맞춘다. + for (const cell of root.querySelectorAll("[data-prov-col]")) { + if (cell.dataset.provTier) continue; + const tier = sheet.columns[cell.dataset.provCol ?? ""]?.tier; + if (tier) cell.dataset.provTier = tier; + } const hide = (): void => { const element = document.getElementById(CARD_ID); if (element) element.style.display = "none"; @@ -183,6 +207,7 @@ export function attachProvenance( const target = card(); fill( target, + cell, column, cell.textContent?.trim() ?? "", resolveExtra?.(cell, cell.dataset.provCol ?? "") ?? [],