카카오톡 인앱 WebView는 서브도메인 간 쿠키를 공유하지 않아 tkds에서 로그인 후 tkfb로 리다이렉트 시 인증이 풀리는 문제. - sso-relay.js: URL hash의 _sso= 토큰을 로컬 쿠키+localStorage로 설정 - gateway dashboard: 로그인 후 redirect URL에 #_sso=<token> 추가 - 전 서비스 HTML: core JS 직전에 sso-relay.js 로드 (81개 파일) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
213 lines
11 KiB
HTML
213 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>폐기함 - 작업보고서</title>
|
|
|
|
<!-- Tailwind CSS -->
|
|
<link rel="preload" href="https://cdn.tailwindcss.com" as="script">
|
|
<script src="https://cdn.tailwindcss.com"></script>
|
|
|
|
<!-- Font Awesome -->
|
|
<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/mobile-calendar.css">
|
|
|
|
<!-- 공통 스타일 -->
|
|
<link rel="stylesheet" href="/static/css/tkqc-common.css?v=2026031401">
|
|
|
|
<!-- 페이지 전용 스타일 -->
|
|
<link rel="stylesheet" href="/static/css/issues-archive.css?v=2026031401">
|
|
</head>
|
|
<body>
|
|
<!-- 공통 헤더가 여기에 자동으로 삽입됩니다 -->
|
|
|
|
<!-- Main Content -->
|
|
<main class="container mx-auto px-4 py-8" style="padding-top: 72px;">
|
|
<!-- 페이지 헤더 -->
|
|
<div class="bg-white rounded-xl shadow-sm p-6 mb-6">
|
|
<div class="flex items-center justify-between mb-4">
|
|
<div>
|
|
<h1 class="text-2xl font-bold text-gray-900 flex items-center">
|
|
<i class="fas fa-archive text-gray-500 mr-3"></i>
|
|
폐기함
|
|
</h1>
|
|
<p class="text-gray-600 mt-1">완료되거나 폐기된 부적합 사항을 보관하고 분석하세요</p>
|
|
</div>
|
|
<div class="flex items-center space-x-3">
|
|
<button onclick="generateReport()" class="px-4 py-2 bg-blue-500 text-white rounded-lg hover:bg-blue-600 transition-colors">
|
|
<i class="fas fa-chart-bar mr-2"></i>
|
|
통계 보고서
|
|
</button>
|
|
<button onclick="cleanupArchive()" class="px-4 py-2 bg-red-500 text-white rounded-lg hover:bg-red-600 transition-colors">
|
|
<i class="fas fa-trash mr-2"></i>
|
|
정리하기
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- 아카이브 통계 -->
|
|
<div class="grid grid-cols-1 md:grid-cols-4 gap-4">
|
|
<div class="bg-green-50 p-4 rounded-lg">
|
|
<div class="flex items-center">
|
|
<i class="fas fa-check-circle text-green-500 text-xl mr-3"></i>
|
|
<div>
|
|
<p class="text-sm text-green-600">완료</p>
|
|
<p class="text-2xl font-bold text-green-700" id="completedCount">0</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="bg-gray-50 p-4 rounded-lg">
|
|
<div class="flex items-center">
|
|
<i class="fas fa-archive text-gray-500 text-xl mr-3"></i>
|
|
<div>
|
|
<p class="text-sm text-gray-600">보관</p>
|
|
<p class="text-2xl font-bold text-gray-700" id="archivedCount">0</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="bg-red-50 p-4 rounded-lg">
|
|
<div class="flex items-center">
|
|
<i class="fas fa-times-circle text-red-500 text-xl mr-3"></i>
|
|
<div>
|
|
<p class="text-sm text-red-600">취소</p>
|
|
<p class="text-2xl font-bold text-red-700" id="cancelledCount">0</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="bg-purple-50 p-4 rounded-lg">
|
|
<div class="flex items-center">
|
|
<i class="fas fa-calendar-alt text-purple-500 text-xl mr-3"></i>
|
|
<div>
|
|
<p class="text-sm text-purple-600">이번 달</p>
|
|
<p class="text-2xl font-bold text-purple-700" id="thisMonthCount">0</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- 필터 및 검색 -->
|
|
<div class="bg-white rounded-xl shadow-sm p-6 mb-6">
|
|
<div class="grid grid-cols-1 md:grid-cols-5 gap-4">
|
|
<!-- 프로젝트 필터 -->
|
|
<div>
|
|
<label class="block text-sm font-medium text-gray-700 mb-2">📁 프로젝트</label>
|
|
<select id="projectFilter" class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-gray-500 focus:border-gray-500" onchange="filterIssues()">
|
|
<option value="">전체 프로젝트</option>
|
|
</select>
|
|
</div>
|
|
|
|
<!-- 상태 필터 -->
|
|
<div>
|
|
<label class="block text-sm font-medium text-gray-700 mb-2">📋 상태</label>
|
|
<select id="statusFilter" class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-gray-500 focus:border-gray-500" onchange="filterIssues()">
|
|
<option value="">전체</option>
|
|
<option value="completed">완료</option>
|
|
<option value="archived">보관</option>
|
|
<option value="cancelled">취소</option>
|
|
</select>
|
|
</div>
|
|
|
|
<!-- 기간 필터 -->
|
|
<div>
|
|
<label class="block text-sm font-medium text-gray-700 mb-2">📅 기간</label>
|
|
<select id="periodFilter" class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-gray-500 focus:border-gray-500" onchange="filterIssues()">
|
|
<option value="">전체 기간</option>
|
|
<option value="week">이번 주</option>
|
|
<option value="month">이번 달</option>
|
|
<option value="quarter">이번 분기</option>
|
|
<option value="year">올해</option>
|
|
</select>
|
|
</div>
|
|
|
|
<!-- 카테고리 필터 -->
|
|
<div>
|
|
<label class="block text-sm font-medium text-gray-700 mb-2">🏷️ 카테고리</label>
|
|
<select id="categoryFilter" class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-gray-500 focus:border-gray-500" onchange="filterIssues()">
|
|
<option value="">전체 카테고리</option>
|
|
<option value="material_missing">자재 누락</option>
|
|
<option value="design_error">설계 오류</option>
|
|
<option value="incoming_defect">반입 불량</option>
|
|
<option value="inspection_miss">검사 누락</option>
|
|
<option value="etc">기타</option>
|
|
</select>
|
|
</div>
|
|
|
|
<!-- 검색 -->
|
|
<div>
|
|
<label class="block text-sm font-medium text-gray-700 mb-2">🔍 검색</label>
|
|
<input type="text" id="searchInput" placeholder="설명 또는 등록자 검색..."
|
|
class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-gray-500 focus:border-gray-500"
|
|
onkeyup="filterIssues()">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- 통계 차트 -->
|
|
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 mb-6">
|
|
<!-- 월별 완료 현황 -->
|
|
<div class="bg-white rounded-xl shadow-sm p-6">
|
|
<h3 class="text-lg font-semibold text-gray-800 mb-4">월별 완료 현황</h3>
|
|
<div class="chart-container">
|
|
<canvas id="monthlyChart"></canvas>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- 카테고리별 분포 -->
|
|
<div class="bg-white rounded-xl shadow-sm p-6">
|
|
<h3 class="text-lg font-semibold text-gray-800 mb-4">카테고리별 분포</h3>
|
|
<div class="chart-container">
|
|
<canvas id="categoryChart"></canvas>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- 폐기함 목록 -->
|
|
<div class="bg-white rounded-xl shadow-sm">
|
|
<div class="p-6 border-b border-gray-200">
|
|
<div class="flex items-center justify-between">
|
|
<h2 class="text-lg font-semibold text-gray-800">보관된 부적합</h2>
|
|
<div class="flex items-center space-x-2">
|
|
<span class="text-sm text-gray-500">정렬:</span>
|
|
<select id="sortOrder" class="text-sm border border-gray-300 rounded px-2 py-1" onchange="sortIssues()">
|
|
<option value="newest">최신순</option>
|
|
<option value="oldest">오래된순</option>
|
|
<option value="completed">완료일순</option>
|
|
<option value="category">카테고리순</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="issuesList" class="divide-y divide-gray-200">
|
|
<!-- 부적합 목록이 여기에 동적으로 생성됩니다 -->
|
|
</div>
|
|
|
|
<!-- 빈 상태 -->
|
|
<div id="emptyState" class="hidden p-12 text-center">
|
|
<i class="fas fa-archive text-6xl text-gray-300 mb-4"></i>
|
|
<h3 class="text-lg font-medium text-gray-900 mb-2">폐기함이 비어있습니다</h3>
|
|
<p class="text-gray-500">완료되거나 폐기된 부적합이 있으면 여기에 표시됩니다.</p>
|
|
</div>
|
|
</div>
|
|
</main>
|
|
|
|
<!-- Scripts -->
|
|
<script src="/static/js/date-utils.js?v=2026031401"></script>
|
|
<script src="/static/js/core/permissions.js?v=2026031401"></script>
|
|
<script src="/static/js/components/common-header.js?v=2026031401"></script>
|
|
<script src="/static/js/core/page-manager.js?v=2026031401"></script>
|
|
<script src="/static/js/api.js?v=2026031401"></script>
|
|
<script src="/static/js/sso-relay.js?v=20260401"></script>
|
|
<script src="/static/js/core/auth-manager.js?v=2026031401"></script>
|
|
<script src="/static/js/utils/issue-helpers.js?v=2026031401"></script>
|
|
<script src="/static/js/utils/photo-modal.js?v=2026031401"></script>
|
|
<script src="/static/js/utils/toast.js?v=2026031401"></script>
|
|
<script src="/static/js/components/mobile-bottom-nav.js?v=2026031401"></script>
|
|
<script src="/static/js/pages/issues-archive.js?v=2026031401"></script>
|
|
</body>
|
|
</html>
|