- 셸 = 위 머리 48(AISLO · 회사 이름 — 시스템 관리자 회사 전환 · 찾기 자리 · [?] · 알림 자리 · 사용자 메뉴) + 왼쪽 메뉴 210 + 챗봇 단추
- 등록부 B01_Dashboard_UI_Views.ts — { key, title, group, roles, icon, mount(host, ctx) } · 주소 ?view= · 같은 주소 안 이동 = 페이지만 갈아 끼움(MountedPage)
- 역할 넷(일반 · 회사 관리자 · 산림청 · 시스템 관리자) · 권한 없는 묶음 · 항목 숨김 · 권한 없는 열쇠 = 홈
- 열쇠마다 옛 구역 부품 그대로 얹음(B01_Dashboard_UI_Legacy.ts) — 기능 빠짐 0
- 옛 ☰ 서랍 · 구역 접기 · 회사 알약 걷음 — 테마 · 언어 · 터치 · 설정 · 로그아웃은 사용자 메뉴로
- 아이콘 = Tabler(MIT) 선 아이콘 몇 개(ui_template_icons.ts · 라이센스 글 함께)
- 시험 — test_b01_settings_cards 옛 한 페이지 단정(buildPage · 접힘 · 알약) 지움 · 셸 회사 고르기 단정으로 바꿈 · test_546_b01_shell 새로
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
82 lines
4.7 KiB
TypeScript
82 lines
4.7 KiB
TypeScript
/* =============================================================================
|
|
* B01_Dashboard_UI_Views.ts
|
|
* 대시보드 세부 페이지 등록부(546) — 한 줄 = 한 페이지 · 주소 `#/b01-account?view=<열쇠>&…`.
|
|
* key = 주소 열쇠 · title = 메뉴 · 머리 글 · group = 메뉴 묶음(hidden = 메뉴에 안 보임 · 주소로만)
|
|
* roles = 보이는 역할(없는 역할은 메뉴에서 숨고 주소로 와도 홈) · icon = ui_template_icons 이름
|
|
* mount(host, ctx) = host 에 그림 · 정리 함수를 돌려주면 떠날 때 부름(비동기 가능)
|
|
* ctx = { me, role, companyId, go(view, params?) } — companyId = 시스템 관리자는 머리에서 고른 회사
|
|
* 새 페이지는 자기 줄만 갈아 끼움 · 옛 구역(`mountLegacy`)은 갈아 끼우면 지움.
|
|
* ========================================================================== */
|
|
|
|
import type { IconName } from "@ui/ui_template_icons";
|
|
import type { DashboardUser } from "./B01_Dashboard_Api_Fetch";
|
|
import { mountLegacy, type LegacyKey } from "./B01_Dashboard_UI_Legacy";
|
|
import { mountChat, mountGuide } from "./B01_Dashboard_UI_Nav";
|
|
|
|
/** 역할 넷 — 산림청 = 세션 is_forest_service 인 일반 사용자(회사 관리자 · 시스템 관리자가 앞섬) */
|
|
export type ViewRole = "USER" | "ADMIN" | "FOREST" | "SYSTEM_ADMIN";
|
|
export type ViewGroup = "work" | "company" | "system" | "help" | "hidden";
|
|
|
|
export interface ViewCtx {
|
|
me: DashboardUser;
|
|
role: ViewRole;
|
|
companyId: number | null;
|
|
go: (view: string, params?: Record<string, string>) => void;
|
|
}
|
|
|
|
type Cleanup = (() => void) | void;
|
|
|
|
export interface View {
|
|
key: string;
|
|
title: string;
|
|
group: ViewGroup;
|
|
roles: readonly ViewRole[];
|
|
icon?: IconName;
|
|
mount: (host: HTMLElement, ctx: ViewCtx) => Cleanup | Promise<Cleanup>;
|
|
}
|
|
|
|
export const DEFAULT_VIEW = "home";
|
|
|
|
const ALL: readonly ViewRole[] = ["USER", "ADMIN", "FOREST", "SYSTEM_ADMIN"];
|
|
const legacy =
|
|
(key: LegacyKey) =>
|
|
(host: HTMLElement, ctx: ViewCtx): Promise<void> =>
|
|
mountLegacy(key, host, ctx.me);
|
|
|
|
// prettier-ignore
|
|
export const VIEWS: View[] = [
|
|
// 작업
|
|
{ key: "home", title: "홈", group: "work", roles: ALL, icon: "home", mount: legacy("projects") },
|
|
{ key: "projects", title: "프로젝트", group: "work", roles: ALL, icon: "folder", mount: legacy("projects") },
|
|
{ key: "project", title: "프로젝트 상세", group: "hidden", roles: ALL, mount: legacy("projects") },
|
|
{ key: "assigned", title: "받은 예정노선", group: "work", roles: ["USER", "ADMIN", "SYSTEM_ADMIN"], icon: "route", mount: legacy("assigned") },
|
|
{ key: "temp", title: "임시 보관함", group: "work", roles: ALL, icon: "archive", mount: legacy("temp") },
|
|
// 회사 관리
|
|
{ key: "people", title: "사람", group: "company", roles: ["ADMIN", "SYSTEM_ADMIN"], icon: "users", mount: legacy("people") },
|
|
{ key: "company", title: "회사 정보", group: "company", roles: ALL, icon: "building", mount: legacy("company") },
|
|
{ key: "company-defaults", title: "회사 설계 기본값", group: "company", roles: ["USER", "ADMIN", "FOREST"], icon: "adjustments", mount: legacy("companyDefaults") },
|
|
// 시스템 관리
|
|
{ key: "sys-overview", title: "개요", group: "system", roles: ["SYSTEM_ADMIN"], icon: "gauge", mount: legacy("sysOverview") },
|
|
{ key: "sys-companies", title: "회사", group: "system", roles: ["SYSTEM_ADMIN"], icon: "building", mount: legacy("sysCompanies") },
|
|
{ key: "sys-users", title: "사용자", group: "system", roles: ["SYSTEM_ADMIN"], icon: "user", mount: legacy("sysUsers") },
|
|
{ key: "sys-defaults", title: "설계 기본값", group: "system", roles: ["SYSTEM_ADMIN"], icon: "database", mount: legacy("sysDefaults") },
|
|
{ key: "sys-logs", title: "시스템 로그", group: "system", roles: ["SYSTEM_ADMIN"], icon: "fileText", mount: legacy("sysLogs") },
|
|
// 도움
|
|
{ key: "guide", title: "사용자 가이드", group: "help", roles: ALL, icon: "book", mount: mountGuide },
|
|
{ key: "chat", title: "지식 챗봇", group: "help", roles: ALL, icon: "chatbot", mount: mountChat },
|
|
// 사용자 메뉴
|
|
{ key: "me", title: "내 정보", group: "hidden", roles: ALL, icon: "userCircle", mount: legacy("me") },
|
|
];
|
|
|
|
/** 역할 가르기 — 옛 B01 갈래(시스템 관리자 · 회사 관리자 · 그 밖) + 산림청 */
|
|
export function roleOf(me: DashboardUser, forest: boolean): ViewRole {
|
|
if (me.role === "SYSTEM_ADMIN" || me.role === "ADMIN") return me.role;
|
|
return forest ? "FOREST" : "USER";
|
|
}
|
|
|
|
/** 주소 열쇠 → 페이지 · 없거나 권한 없으면 홈 */
|
|
export function viewFor(key: string | null, role: ViewRole): View {
|
|
const found = VIEWS.find((v) => v.key === key && v.roles.includes(role));
|
|
return found ?? VIEWS.find((v) => v.key === DEFAULT_VIEW)!;
|
|
}
|