Files
Aislo/M02_MasterTemplete/M02_MasterTemplete_Combo_Api.ts
T
eomsangdonandClaude Sonnet 5.5 154d693599 feat(M02): 구조물 관리 화면 — 층 인자(개인 · 회사) · 층별 권한 · 대시보드 카드
- 주소 `?layer=personal|company`(없으면 시스템) — 라우터가 인자를 떼고 `currentQuery` 로 읽음 · 층 고정 풂
- 층 길 접두어 `/layers/{층}` — 구조물집계표 · 조합 · 복사 호출이 화면 층을 따름(시스템은 옛 길 그대로)
- 제목 셋(마스터 템플릿 · 구조물 관리(회사) · 구조물 관리(개인)) · 돌아가기 층 무관 · 도면 양식은 시스템 층만
- 편집 권한 — 시스템 SYSTEM_ADMIN · 회사 ADMIN 또는 is_master · 개인 본인 · 읽기만이면 단추 숨김 + [개인용으로 복사]
- 회사 없음 → 「회사부터 등록」 안내 · 대시보드 카드 「구조물 관리」(USER 개인용 · ADMIN · SYSTEM_ADMIN 회사용 + 개인용)
- 시험 test_m02_layer_screen.py 5 · test_m02_structure_panel.py 갱신

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019Kyw9qnkJ94pC1A4PfpDtA
2026-09-29 12:09:31 +09:00

40 lines
2.0 KiB
TypeScript

/* =============================================================================
* M02_MasterTemplete_Combo_Api.ts
* 조합 고치기 · 자재 목록 화면이 함께 쓰는 읽기 — 집계표 열이 가리키는 조합 키 · 같이 쓰는 다른 열 수 ·
* 서버 까닭 글. 갈라 내기 길(`branchCombo` · `branchMaterialCombo` · `fetchMaterialCombo`)은 `M02_MasterTemplete_Api_Fetch.ts`.
* ========================================================================== */
import { getActiveLayer, readTemplate } from "./M02_MasterTemplete_Api_Fetch";
/** 구조물집계표 이름 — `M02_MasterTemplete_Structure.STRUCTURE_TABLE` 과 같은 글 */
const STRUCTURE_TABLE = "구조물집계표";
/** 집계표 열이 가리키는 조합 키 + 같은 조합을 쓰는 다른 열 수 */
export interface ColumnBase {
일위대가: string | null;
자재조합: string | null;
다른열일위대가: number;
다른열자재조합: number;
}
/** 서버가 준 까닭 글 */
export const reasonOf = (error: unknown): string => (error instanceof Error ? error.message : "");
/** 집계표(시스템 층)에서 이 열의 일위대가 · 자재조합 키와 같이 쓰는 다른 열 수 */
export async function readColumnBase(column: string): Promise<ColumnBase> {
type Col = { id: string; 일위대가?: string | null; 자재조합?: string | null };
const table = await readTemplate(getActiveLayer(), "table", STRUCTURE_TABLE, null).catch(
() => null,
);
const cols = ((table?.문서 as { 열?: Col[] } | null)?.열 ?? []) as Col[];
const mine = cols.find((c) => c.id === column);
const same = (key: string | null | undefined, pick: (c: Col) => string | null | undefined) =>
key ? cols.filter((c) => c.id !== column && pick(c) === key).length : 0;
return {
일위대가: mine?.일위대가 || null,
자재조합: mine?.자재조합 || null,
다른열일위대가: same(mine?.일위대가, (c) => c.일위대가),
다른열자재조합: same(mine?.자재조합, (c) => c.자재조합),
};
}