Files
MH-DashBoard-organization/frontend/public/index.html

232 lines
11 KiB
HTML

<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>MH 대시보드-공개용</title>
<script>
document.title = window.location.port === '8081'
? 'MH 대시보드-작업용'
: 'MH 대시보드-공개용';
</script>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Pretendard:wght@400;600;700;900&display=swap" rel="stylesheet">
<link rel="stylesheet" href="/design-tokens.css?v=20260401-01">
<link rel="stylesheet" href="/design-patterns.css?v=20260401-01">
<link rel="stylesheet" href="/legacy/static/common.css">
<!-- Keep login and common hub defaults aligned with 8080. -->
<link rel="stylesheet" href="/styles.css?v=20260330-01">
<!-- 8081-only hub overrides must not restyle the login screen. -->
<link rel="stylesheet" href="/styles-8081-design.css?v=20260401-01">
</head>
<body>
<section id="login-panel" class="login-screen">
<div class="login-backdrop">
<form id="login-form" class="login-card">
<div class="login-brand">
<p class="eyebrow">GPD/TDC</p>
<h1>MH Dash Board</h1>
</div>
<div class="login-form-wrap">
<label>
<span>사번</span>
<input name="username" type="text" placeholder="사번 입력" required>
</label>
<label>
<span>비번</span>
<input name="password" type="password" placeholder="비밀번호 입력" required>
</label>
<button type="submit">로그인</button>
<p id="login-message" class="helper-text"></p>
</div>
</form>
</div>
</section>
<section id="dashboard-panel" class="dashboard-shell hidden">
<header class="dashboard-header">
<div class="header-left">
<div class="brand-block">
<p class="eyebrow">MH Dashboard</p>
<h2 id="current-view-title">조직 현황</h2>
</div>
<div id="global-date-controls" class="header-date-controls hidden">
<span class="header-date-label">기간</span>
<label class="header-date-field">
<input id="global-start-date" type="date" aria-label="시작일">
</label>
<span class="header-date-sep">~</span>
<label class="header-date-field">
<input id="global-end-date" type="date" aria-label="종료일">
</label>
</div>
<div id="organization-history-controls" class="header-date-controls hidden">
<span class="header-date-label">조직 기준월</span>
<label class="header-date-field">
<select id="organization-month-select" aria-label="조직 기준월"></select>
</label>
<button id="organization-compare-btn" class="ghost-button ghost-button-soft hidden" type="button">조직도 변경사항 확인</button>
</div>
</div>
<div class="header-right">
<div class="header-center">
<button class="nav-pill" type="button" data-view="ledger">사업관리대장</button>
<button class="nav-pill" type="button" data-view="project">프로젝트별 분석</button>
<button class="nav-pill" type="button" data-view="team">팀/개인별 분석</button>
<button class="nav-pill active" type="button" data-view="organization">조직 현황</button>
</div>
<div class="header-actions">
<button id="user-badge" class="ghost-button ghost-button-soft user-chip" type="button"></button>
<div id="user-popover" class="user-popover hidden"></div>
<button id="logout-btn" class="ghost-button icon-button" type="button" title="로그아웃" aria-label="로그아웃">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"></path>
<polyline points="16 17 21 12 16 7"></polyline>
<line x1="21" y1="12" x2="9" y2="12"></line>
</svg>
</button>
</div>
</div>
</header>
<main class="dashboard-main">
<section id="ledger-stage" class="main-stage" hidden>
<div class="stage-frame">
<iframe id="ledger-frame" src="/integrations/ledger?v=20260401-02" data-src="/integrations/ledger?v=20260401-02" title="사업관리대장 화면"></iframe>
</div>
</section>
<section id="organization-stage" class="main-stage">
<div class="stage-frame">
<!-- Legacy organization keeps its own CSS/JS responsibility under /legacy/static. -->
<iframe id="organization-frame" src="/legacy/organization?v=20260330-02" data-src="/legacy/organization?v=20260330-02" title="조직도 메인 화면"></iframe>
</div>
</section>
<section id="project-stage" class="main-stage" hidden>
<div class="stage-frame">
<!-- Integration HTML is served from incoming-files/served/payment.html. -->
<iframe id="project-frame" src="/integrations/payment" data-src="/integrations/payment" title="프로젝트별 분석 화면"></iframe>
</div>
</section>
<section id="team-stage" class="main-stage" hidden>
<div class="stage-frame">
<!-- Integration HTML is served from incoming-files/served/mh.html. -->
<iframe id="team-frame" src="/integrations/mh" data-src="/integrations/mh" title="팀/개인별 분석 화면"></iframe>
</div>
</section>
<section id="seatmap-admin-stage" class="main-stage" hidden>
<div class="seatmap-layout">
<div class="seatmap-topbar">
<div>
<p class="eyebrow">Seat Layout</p>
<h3 id="seatmap-admin-name">자리배치도</h3>
</div>
<div id="seatmap-admin-office-tabs" class="seatmap-office-tabs"></div>
<div class="seatmap-actions" id="seatmap-admin-actions">
<button id="seatmap-admin-save-btn" class="ghost-button" type="button" hidden disabled>저장</button>
<button id="seatmap-admin-exit-btn" class="ghost-button ghost-button-soft" type="button" hidden>나가기</button>
</div>
</div>
<p id="seatmap-admin-status" class="seatmap-status" role="status"></p>
<div class="seatmap-content">
<div class="seatmap-board-panel">
<div id="seatmap-admin-empty" class="seatmap-empty hidden"></div>
<div id="seatmap-admin-board-wrap" class="seatmap-board-wrap hidden">
<div id="seatmap-admin-board" class="seatmap-board"></div>
</div>
</div>
<aside class="seatmap-sidebar">
<section id="seatmap-admin-settings-panel" class="seatmap-panel hidden">
<div class="seatmap-panel-head">
<h4>도면 설정</h4>
<p>현재는 기술개발센터 고정 도면을 사용합니다.</p>
</div>
<form id="seatmap-admin-settings-form" class="seatmap-form">
<label>
<span>도면 이름</span>
<input id="seatmap-admin-form-name" name="name" type="text" placeholder="예: 기술개발센터" required>
</label>
<div>
<span>DXF 파일</span>
<label class="seatmap-file-input" for="seatmap-admin-form-image">
<input id="seatmap-admin-form-image" name="image" type="file" accept=".dxf" required>
<span class="seatmap-file-button">DXF 선택</span>
<strong id="seatmap-admin-file-name" class="seatmap-file-name">선택된 파일 없음</strong>
</label>
</div>
<button id="seatmap-admin-settings-submit" type="submit">DXF 업로드</button>
</form>
</section>
<section class="seatmap-panel">
<div class="seatmap-panel-head">
<h4 id="seatmap-admin-sidebar-title">전체 인원</h4>
<p id="seatmap-admin-sidebar-desc">미배치 인원은 상단, 배치 완료 인원은 하단에 표시됩니다.</p>
</div>
<label class="seatmap-search">
<span class="hidden">구성원 검색</span>
<input id="seatmap-admin-search" type="search" placeholder="이름 또는 부서 검색">
</label>
<div id="seatmap-admin-unassigned" class="seatmap-member-list"></div>
</section>
</aside>
</div>
</div>
</section>
<section id="seatmap-readonly-stage" class="main-stage" hidden>
<div class="seatmap-layout">
<div class="seatmap-topbar">
<div>
<p class="eyebrow">Seat Layout</p>
<h3 id="seatmap-readonly-name">자리배치도</h3>
</div>
<div id="seatmap-readonly-office-tabs" class="seatmap-office-tabs"></div>
<div class="seatmap-actions" id="seatmap-readonly-actions">
<button id="seatmap-readonly-exit-btn" class="ghost-button ghost-button-soft" type="button" hidden>나가기</button>
</div>
</div>
<p id="seatmap-readonly-status" class="seatmap-status" role="status"></p>
<div class="seatmap-content">
<div class="seatmap-board-panel">
<div id="seatmap-readonly-empty" class="seatmap-empty hidden"></div>
<div id="seatmap-readonly-board-wrap" class="seatmap-board-wrap hidden">
<div id="seatmap-readonly-board" class="seatmap-board"></div>
</div>
</div>
<aside class="seatmap-sidebar">
<section class="seatmap-panel">
<div class="seatmap-panel-head">
<h4 id="seatmap-readonly-sidebar-title">배치 인원 검색</h4>
<p id="seatmap-readonly-sidebar-desc">이름이나 부서를 검색하고 클릭하면 해당 좌석으로 바로 확대 이동합니다.</p>
</div>
<label class="seatmap-search">
<span class="hidden">구성원 검색</span>
<input id="seatmap-readonly-search" type="search" placeholder="이름 또는 부서 검색">
</label>
<div id="seatmap-readonly-unassigned" class="seatmap-member-list"></div>
</section>
</aside>
</div>
</div>
</section>
<section id="empty-stage" class="main-stage" hidden>
<div class="stage-empty"></div>
</section>
</main>
</section>
<script src="/app.js?v=20260401-02"></script>
</body>
</html>