feat: 안전 코드 tksafety 이관 + 사용자 관리 정리 + UI Tailwind 전환

Phase 1: tksafety에 출입신청/체크리스트 API·웹 추가, tkfb 안전 코드 삭제
Phase 2: 사용자 관리 페이지 삭제, API 축소, 알림 수신자 tkuser 이관
Phase 3: tkuser 권한 페이지 정의 업데이트
Phase 4: 전체 34개 페이지 Tailwind CSS + tkfb-core.js 전환,
         미사용 CSS 20개·인프라 JS 10개·템플릿·컴포넌트 삭제

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Hyungi Ahn
2026-03-13 10:46:22 +09:00
parent 8373fe9e75
commit 9fda89a374
133 changed files with 5255 additions and 26181 deletions

View File

@@ -3,27 +3,18 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>TBM 시작 | (주)테크니컬코리아</title>
<link rel="icon" type="image/png" href="/img/favicon.png">
<script src="/js/api-base.js?v=3"></script>
<script src="/js/app-init.js?v=9" defer></script>
<title>TBM 등록 - TK 공장관리</title>
<script src="https://cdn.tailwindcss.com"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<link rel="stylesheet" href="/static/css/tkfb.css">
<style>
* { box-sizing: border-box; }
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Noto Sans KR', sans-serif;
background: #f3f4f6;
margin: 0;
padding: 0;
padding-bottom: env(safe-area-inset-bottom);
-webkit-font-smoothing: antialiased;
touch-action: manipulation;
}
button, .worker-card, .list-item, .list-item-skip, .pill-btn, .pill-btn-add,
.nav-btn, .select-all-btn, [onclick] {
touch-action: manipulation;
}
@media (min-width: 480px) {
body { max-width: 480px; margin: 0 auto; min-height: 100vh; }
.tbm-create-wrap { max-width: 480px; margin: 0 auto; min-height: 100vh; }
}
/* Fixed header */
@@ -781,52 +772,86 @@
</style>
</head>
<body>
<!-- Fixed Header -->
<div class="wizard-header">
<button type="button" class="back-btn" onclick="goBack()">&#8592;</button>
<h1>TBM 시작</h1>
<body class="bg-gray-50">
<header class="bg-orange-700 text-white sticky top-0 z-50">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="flex justify-between items-center h-14">
<div class="flex items-center gap-3">
<button id="mobileMenuBtn" class="lg:hidden text-orange-200 hover:text-white">
<i class="fas fa-bars text-xl"></i>
</button>
<i class="fas fa-industry text-xl text-orange-200"></i>
<h1 class="text-lg font-semibold">TK 공장관리</h1>
</div>
<div class="flex items-center gap-4">
<span id="headerUserName" class="text-sm hidden sm:block">-</span>
<div id="headerUserAvatar" class="w-8 h-8 bg-orange-600 rounded-full flex items-center justify-center text-sm font-bold">-</div>
<button onclick="doLogout()" class="text-orange-200 hover:text-white" title="로그아웃">
<i class="fas fa-sign-out-alt"></i>
</button>
</div>
</div>
</div>
</header>
<div id="mobileOverlay" class="hidden fixed inset-0 bg-black/50 z-30 lg:hidden"></div>
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-4 fade-in">
<div class="flex gap-6">
<nav id="sideNav" class="hidden lg:flex flex-col gap-1 w-52 flex-shrink-0 pt-2 fixed lg:static z-40 bg-white lg:bg-transparent p-4 lg:p-0 rounded-lg lg:rounded-none shadow-lg lg:shadow-none top-14 left-0 bottom-0 overflow-y-auto"></nav>
<div class="flex-1 min-w-0">
<div class="tbm-create-wrap">
<!-- Fixed Header -->
<div class="wizard-header">
<button type="button" class="back-btn" onclick="goBack()">&#8592;</button>
<h1>TBM 시작</h1>
</div>
<!-- Step Indicator -->
<div class="step-indicator" id="stepIndicator">
<div class="step active"><span class="step-dot">1</span><span>작업자</span></div>
<div class="step-line"></div>
<div class="step"><span class="step-dot">2</span><span>프로젝트+공정</span></div>
<div class="step-line"></div>
<div class="step"><span class="step-dot">3</span><span>확인</span></div>
</div>
<!-- Step Content -->
<div class="step-content" id="stepContainer">
<!-- Dynamically rendered by tbm-create.js -->
</div>
<!-- Fixed Bottom Nav -->
<div class="wizard-nav" id="wizardNav">
<button type="button" class="nav-btn nav-btn-prev" id="prevBtn" style="visibility:hidden;">&#8592; 이전</button>
<button type="button" class="nav-btn nav-btn-next" id="nextBtn">다음 &#8594;</button>
</div>
<!-- Landscape Map Overlay removed - workplace selection moved to detail edit stage -->
<!-- Loading Overlay -->
<div id="loadingOverlay" class="loading-overlay">
<div class="loading-spinner"></div>
<div class="loading-text" id="loadingText">데이터를 불러오는 중...</div>
</div>
<!-- Toast Container -->
<div id="toastContainer" class="toast-container"></div>
</div>
</div>
</div>
</div>
<!-- Step Indicator -->
<div class="step-indicator" id="stepIndicator">
<div class="step active"><span class="step-dot">1</span><span>작업자</span></div>
<div class="step-line"></div>
<div class="step"><span class="step-dot">2</span><span>프로젝트+공정</span></div>
<div class="step-line"></div>
<div class="step"><span class="step-dot">3</span><span>확인</span></div>
</div>
<!-- Step Content -->
<div class="step-content" id="stepContainer">
<!-- Dynamically rendered by tbm-create.js -->
</div>
<!-- Fixed Bottom Nav -->
<div class="wizard-nav" id="wizardNav">
<button type="button" class="nav-btn nav-btn-prev" id="prevBtn" style="visibility:hidden;">&#8592; 이전</button>
<button type="button" class="nav-btn nav-btn-next" id="nextBtn">다음 &#8594;</button>
</div>
<!-- Landscape Map Overlay removed - workplace selection moved to detail edit stage -->
<!-- Loading Overlay -->
<div id="loadingOverlay" class="loading-overlay">
<div class="loading-spinner"></div>
<div class="loading-text" id="loadingText">데이터를 불러오는 중...</div>
</div>
<!-- Toast Container -->
<div id="toastContainer" class="toast-container"></div>
<!-- Scripts -->
<script src="/static/js/tkfb-core.js"></script>
<script src="/js/api-base.js?v=3"></script>
<!-- 공통 모듈 -->
<script src="/js/common/utils.js?v=2"></script>
<script src="/js/common/base-state.js?v=2"></script>
<script src="/js/tbm/state.js?v=3"></script>
<script src="/js/tbm/utils.js?v=3"></script>
<script src="/js/tbm/api.js?v=4"></script>
<script src="/js/tbm-create.js?v=14"></script>
<script>initAuth();</script>
</body>
</html>