232 lines
11 KiB
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>
|