/* ============================================================================= * Z01_MasterData_UI_Page.ts * 마스터 데이터 — B03~B09 와 같은 틀: 좌측 도킹 사이드바(기초단가 · 마스터 트리) / 우측 표 * * 시스템 관리자만(서버도 require_system_admin 으로 다시 막음) · 워크플로 밖 화면이라 진행단계 * 패널·프로젝트 이름은 안 세움 (2026-09-15 브레인 Z01 — 좌측 패널 양식 갈음 · 기초단가 칸). * ========================================================================== */ import "@ui/ui_template_workflow_layout.css"; import { ROUTES } from "@config/config_frontend"; import { el, hideLoadingOverlay, showLoadingOverlay, showToast } from "@ui/ui_template_elements"; import { t as L } from "@ui/ui_template_locale"; import { createWorkflowOverlays } from "@ui/ui_template_overlay"; import { navigateTo } from "../A00_Common/router"; import { fetchSessionUser } from "../A06_Login/A06_Login_Api_Fetch"; import { fetchMasterTree, type MasterGroup } from "./Z01_MasterData_Api_Fetch"; import { buildRowsView } from "./Z01_MasterData_UI_Rows"; import { buildSidePanel } from "./Z01_MasterData_UI_Side"; import "./Z01_MasterData_UI_Style.css"; export async function renderZ01MasterData(root: HTMLElement): Promise { const user = await fetchSessionUser().catch(() => null); if (user?.role !== "SYSTEM_ADMIN") { showToast(L("Z01_MasterData_AdminOnly"), "error"); navigateTo(ROUTES.B01_ACCOUNT); return; } showLoadingOverlay(); let groups: MasterGroup[] = []; try { groups = await fetchMasterTree(); } catch (error) { showToast(error instanceof Error ? error.message : L("Z01_MasterData_LoadFailed"), "error"); } finally { hideLoadingOverlay(); } root.innerHTML = ""; root.append(buildPage(groups)); } function buildPage(groups: MasterGroup[]): HTMLElement { const view = buildRowsView(); const layout = el("div", { className: "ui-workflow-layout z01-master" }); const main = el("main", { className: "ui-workflow-layout__main", children: [view.root] }); const overlays = createWorkflowOverlays({ title: L("Z01_MasterData_Title"), optionsContent: buildSidePanel(groups, view), showProjectName: false, onOptionsOpenChange: (isOpen) => layout.classList.toggle("is-options-open", isOpen), }); layout.append( el("div", { className: "ui-workflow-layout__body", children: [main] }), overlays.root, ); return layout; }