Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016VBGFXB9AbJBwXP19z75Qq
57 lines
2.4 KiB
TypeScript
57 lines
2.4 KiB
TypeScript
/* =============================================================================
|
|
* 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<void> {
|
|
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;
|
|
}
|