knowledge(마스터): 소요량·계수·로직에 구분·상세구분 — 표·줄마다 칸 · 갈래 목록은 서버가 줌
- 장 파일 137 개의 표 3,028 · 로직 1,351 줄에 구분(원문 + 부문 · 「건설품셈 공통」) · 상세구분(「03장 토공사」) 칸을 직접 둠 · 파일 머리의 부문·차례는 목록 차례로 남김 - 열 차례 — 표는 키 · 원문번호 · 구분 · 상세구분 · 이름 · 기준 · 출처 · 비고 · 조건 · 범위규칙 · 값칸 · 줄 · 주 · 그룹(맨 뒤) · 로직은 소유 다음에 비고 - 서버 — GET /subs?group= 이 구분·상세구분 목록(장 차례대로) · GET /tables 가 파일을 가로질러 구분·상세구분·찾기로 거르고 쪽 나눔 · GET /logics 도 구분·상세구분으로 거름 · 새 줄은 서버가 갈래를 채움 · 죽은 book 칸 걷어냄 - check_master 가 구분·상세구분이 파일 머리·이름과 맞는지 봄 · adopt 가 빌더 줄에 갈래를 찍어 되돌리기 시험 글자까지 같음 · _틀.md · 화면 계약 · 화면 트리 · 시험 같이 고침 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JgUhN55Z3BCYhUJTjwTNfj
This commit is contained in:
@@ -1,11 +1,13 @@
|
||||
/* =============================================================================
|
||||
* M01_MasterData_UI_Tables.ts
|
||||
* 표형 파일(소요량·계수) — 표 목록 → 표 하나(조건 칸 + 값 칸의 긴 줄) · 눌러 고침(노랑) · 줄 더하기·지우기
|
||||
* 표형 그룹(소요량·계수) — 구분·상세구분·찾기로 거른 표 목록(파일을 가로지름 · 쪽 나눔)
|
||||
* → 표 하나(조건 칸 + 값 칸의 긴 줄) · 눌러 고침(노랑) · 줄 더하기·지우기
|
||||
* ========================================================================== */
|
||||
|
||||
import { createButton, el, showToast } from "@ui/ui_template_elements";
|
||||
import { t as L } from "@ui/ui_template_locale";
|
||||
import { fetchTable, fetchTables, type Row, type TableHead } from "./M01_MasterData_Api_Fetch";
|
||||
import type { Pick } from "./M01_MasterData_UI_Side";
|
||||
import {
|
||||
onDraftChange,
|
||||
peek,
|
||||
@@ -26,25 +28,17 @@ import {
|
||||
const LIST_SIZE = 30;
|
||||
|
||||
/** 돌려받은 함수 = 이 화면을 걷을 때 부를 해제. */
|
||||
export function renderTables(
|
||||
host: HTMLElement,
|
||||
file: string,
|
||||
q: string,
|
||||
_sub = "",
|
||||
_detail = "",
|
||||
): () => void {
|
||||
export function renderTables(host: HTMLElement, pick: Pick, q: string): () => void {
|
||||
let stop = (): void => {};
|
||||
const list = (page = 1): void => {
|
||||
stop();
|
||||
stop = (): void => {};
|
||||
void showList(host, file, q, page, (key) => {
|
||||
void showList(host, pick, q, page, (file, key) => {
|
||||
stop = openTable(host, file, key, () => list(page));
|
||||
});
|
||||
};
|
||||
list();
|
||||
const off = onDraftChange(
|
||||
() => host.querySelector(".m01-master__tables") && markChanged(host, file),
|
||||
);
|
||||
const off = onDraftChange(() => host.querySelector(".m01-master__tables") && markChanged(host));
|
||||
return () => {
|
||||
stop();
|
||||
off();
|
||||
@@ -52,36 +46,36 @@ export function renderTables(
|
||||
}
|
||||
|
||||
/** 목록 위 「고침」 표시만 다시 — 목록을 다시 받지 않음. */
|
||||
function markChanged(host: HTMLElement, file: string): void {
|
||||
const changed = peek(file)?.tables ?? {};
|
||||
function markChanged(host: HTMLElement): void {
|
||||
host.querySelectorAll<HTMLElement>(".m01-master__table-card").forEach((card) => {
|
||||
const changed = peek(card.dataset.file!)?.tables ?? {};
|
||||
card.classList.toggle("is-changed", card.dataset.key! in changed);
|
||||
});
|
||||
}
|
||||
|
||||
async function showList(
|
||||
host: HTMLElement,
|
||||
file: string,
|
||||
pick: Pick,
|
||||
q: string,
|
||||
page: number,
|
||||
open: (key: string) => void,
|
||||
open: (file: string, key: string) => void,
|
||||
): Promise<void> {
|
||||
let tables: TableHead[];
|
||||
let got: { total: number; tables: TableHead[] };
|
||||
try {
|
||||
tables = (await fetchTables(file, q)).tables;
|
||||
got = await fetchTables(pick.group, pick.sub, pick.detail, q, page, LIST_SIZE);
|
||||
} catch (error) {
|
||||
showToast(error instanceof Error ? error.message : L("M01_LoadFailed"), "error");
|
||||
return;
|
||||
}
|
||||
const cards = tables.slice((page - 1) * LIST_SIZE, page * LIST_SIZE).map((t) => {
|
||||
const cards = got.tables.map((t) => {
|
||||
const card = el("button", {
|
||||
className: "m01-master__table-card",
|
||||
attrs: { type: "button", "data-key": t.키 },
|
||||
attrs: { type: "button", "data-key": t.키, "data-file": t.file },
|
||||
children: [
|
||||
el("strong", { text: t.이름 || t.원문번호 }),
|
||||
el("span", {
|
||||
className: "m01-master__muted",
|
||||
text: `${t.키} ${t.원문번호} · ${t.기준 || "—"}`,
|
||||
text: `${t.상세구분} · ${t.키} ${t.원문번호} · ${t.기준 || "—"}`,
|
||||
}),
|
||||
el("span", {
|
||||
className: "m01-master__muted",
|
||||
@@ -89,12 +83,12 @@ async function showList(
|
||||
}),
|
||||
],
|
||||
});
|
||||
card.classList.toggle("is-changed", t.키 in (peek(file)?.tables ?? {}));
|
||||
card.addEventListener("click", () => open(t.키));
|
||||
card.classList.toggle("is-changed", t.키 in (peek(t.file)?.tables ?? {}));
|
||||
card.addEventListener("click", () => open(t.file, t.키));
|
||||
return card;
|
||||
});
|
||||
host.replaceChildren(
|
||||
buildPager(tables.length, LIST_SIZE, page, (p) => void showList(host, file, q, p, open)),
|
||||
buildPager(got.total, LIST_SIZE, page, (p) => void showList(host, pick, q, p, open)),
|
||||
el("div", { className: "m01-master__tables", children: cards }),
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user