Spaces:
Running
Running
각 페이지마다 한페지씩 있어야해. 일단 작업배포관리부터하는데. 칸반스타일로 드래그도 가능하게 . 작업자 클릭하고 문서리스트 있으면 넣어주는거지
Browse files- admin-detail.html +4 -5
- admin.html +3 -3
- components/header.js +1 -0
- deployment.html +119 -0
- deployment.js +162 -0
- index.html +3 -0
- style.css +37 -1
admin-detail.html
CHANGED
|
@@ -74,13 +74,12 @@
|
|
| 74 |
</div>
|
| 75 |
</div>
|
| 76 |
</div>
|
| 77 |
-
<
|
| 78 |
-
배포
|
| 79 |
-
</
|
| 80 |
</div>
|
| 81 |
</div>
|
| 82 |
-
|
| 83 |
-
<!-- 모니터링 -->
|
| 84 |
<div class="bg-white/80 backdrop-blur-sm rounded-2xl p-6 shadow-lg border border-primary-200">
|
| 85 |
<div class="flex items-center mb-4">
|
| 86 |
<div class="w-10 h-10 bg-yellow-500 rounded-full flex items-center justify-center mr-3">
|
|
|
|
| 74 |
</div>
|
| 75 |
</div>
|
| 76 |
</div>
|
| 77 |
+
<a href="/deployment.html" class="w-full bg-primary-500 hover:bg-primary-600 text-white px-4 py-3 rounded-lg font-medium transition-all duration-300 block text-center">
|
| 78 |
+
배포 관리하기
|
| 79 |
+
</a>
|
| 80 |
</div>
|
| 81 |
</div>
|
| 82 |
+
<!-- 모니터링 -->
|
|
|
|
| 83 |
<div class="bg-white/80 backdrop-blur-sm rounded-2xl p-6 shadow-lg border border-primary-200">
|
| 84 |
<div class="flex items-center mb-4">
|
| 85 |
<div class="w-10 h-10 bg-yellow-500 rounded-full flex items-center justify-center mr-3">
|
admin.html
CHANGED
|
@@ -102,10 +102,10 @@
|
|
| 102 |
</div>
|
| 103 |
<h3 class="text-xl font-semibold text-primary-900 mb-2">OCR 문서 등록</h3>
|
| 104 |
<p class="text-primary-700 mb-4">새로운 OCR 문서를 업로드하고 작업을 등록합니다.</p>
|
| 105 |
-
<a href="/
|
| 106 |
-
|
| 107 |
</a>
|
| 108 |
-
|
| 109 |
<!-- 작업 배포 -->
|
| 110 |
<div class="bg-white/80 backdrop-blur-sm rounded-2xl p-6 shadow-lg border border-primary-200 hover:shadow-xl transition-all duration-300">
|
| 111 |
<div class="w-12 h-12 bg-primary-600 rounded-full flex items-center justify-center mb-4">
|
|
|
|
| 102 |
</div>
|
| 103 |
<h3 class="text-xl font-semibold text-primary-900 mb-2">OCR 문서 등록</h3>
|
| 104 |
<p class="text-primary-700 mb-4">새로운 OCR 문서를 업로드하고 작업을 등록합니다.</p>
|
| 105 |
+
<a href="/deployment.html" class="w-full bg-primary-500 hover:bg-primary-600 text-white px-4 py-2 rounded-lg font-medium transition-all duration-300 block text-center">
|
| 106 |
+
작업 배포 관리
|
| 107 |
</a>
|
| 108 |
+
</div>
|
| 109 |
<!-- 작업 배포 -->
|
| 110 |
<div class="bg-white/80 backdrop-blur-sm rounded-2xl p-6 shadow-lg border border-primary-200 hover:shadow-xl transition-all duration-300">
|
| 111 |
<div class="w-12 h-12 bg-primary-600 rounded-full flex items-center justify-center mb-4">
|
components/header.js
CHANGED
|
@@ -45,6 +45,7 @@ class CustomHeader extends HTMLElement {
|
|
| 45 |
<div class="hidden md:flex space-x-8">
|
| 46 |
<a href="/" class="nav-link font-medium">홈</a>
|
| 47 |
<a href="/admin.html" class="nav-link font-medium">관리자</a>
|
|
|
|
| 48 |
<a href="/admin-detail.html" class="nav-link font-medium">관리 상세</a>
|
| 49 |
<a href="/worker.html" class="nav-link font-medium">작업자</a>
|
| 50 |
</div>
|
|
|
|
| 45 |
<div class="hidden md:flex space-x-8">
|
| 46 |
<a href="/" class="nav-link font-medium">홈</a>
|
| 47 |
<a href="/admin.html" class="nav-link font-medium">관리자</a>
|
| 48 |
+
<a href="/deployment.html" class="nav-link font-medium">작업 배포</a>
|
| 49 |
<a href="/admin-detail.html" class="nav-link font-medium">관리 상세</a>
|
| 50 |
<a href="/worker.html" class="nav-link font-medium">작업자</a>
|
| 51 |
</div>
|
deployment.html
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="ko">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>작업 배포 관리 - OCR 정밀 교정 공방</title>
|
| 7 |
+
<link rel="icon" type="image/x-icon" href="/static/favicon.ico">
|
| 8 |
+
<link rel="stylesheet" href="style.css">
|
| 9 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
| 10 |
+
<script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
|
| 11 |
+
<script>
|
| 12 |
+
tailwind.config = {
|
| 13 |
+
theme: {
|
| 14 |
+
extend: {
|
| 15 |
+
colors: {
|
| 16 |
+
'primary': {
|
| 17 |
+
50: '#f0f9ff',
|
| 18 |
+
100: '#e0f2fe',
|
| 19 |
+
200: '#bae6fd',
|
| 20 |
+
300: '#7dd3fc',
|
| 21 |
+
400: '#38bdf8',
|
| 22 |
+
500: '#0ea5e9',
|
| 23 |
+
600: '#0284c7',
|
| 24 |
+
700: '#0369a1',
|
| 25 |
+
800: '#075985',
|
| 26 |
+
900: '#0c4a6e',
|
| 27 |
+
}
|
| 28 |
+
}
|
| 29 |
+
}
|
| 30 |
+
}
|
| 31 |
+
}
|
| 32 |
+
</script>
|
| 33 |
+
</head>
|
| 34 |
+
<body class="bg-gradient-to-br from-primary-50 to-primary-100 min-h-screen">
|
| 35 |
+
<custom-header></custom-header>
|
| 36 |
+
|
| 37 |
+
<main class="container mx-auto px-4 py-8">
|
| 38 |
+
<div class="text-center mb-8">
|
| 39 |
+
<h1 class="text-4xl font-bold text-primary-900 mb-2">작업 배포 관리 📋</h1>
|
| 40 |
+
<p class="text-lg text-primary-700 max-w-2xl mx-auto">
|
| 41 |
+
작업자 선택과 문서 배포를 칸반 스타일로 관리합니다. 드래그 앤 드롭으로 간편하게 배포하세요.
|
| 42 |
+
</p>
|
| 43 |
+
</div>
|
| 44 |
+
|
| 45 |
+
<!-- 작업자 선택 및 배포 설정 -->
|
| 46 |
+
<div class="bg-white/80 backdrop-blur-sm rounded-2xl p-6 shadow-lg border border-primary-200 mb-8">
|
| 47 |
+
<div class="flex items-center mb-4">
|
| 48 |
+
<div class="w-10 h-10 bg-primary-500 rounded-full flex items-center justify-center mr-3">
|
| 49 |
+
<i data-feather="users" class="text-white"></i>
|
| 50 |
+
</div>
|
| 51 |
+
<h2 class="text-2xl font-semibold text-primary-900">작업자 선택</h2>
|
| 52 |
+
</div>
|
| 53 |
+
<div class="grid grid-cols-1 md:grid-cols-3 gap-4 mb-6">
|
| 54 |
+
<div>
|
| 55 |
+
<label class="block text-sm text-primary-600 mb-2">작업자 유형</label>
|
| 56 |
+
<select id="workerType" class="w-full border border-primary-300 rounded-lg px-3 py-2">
|
| 57 |
+
<option value="all">전체 작업자</option>
|
| 58 |
+
<option value="group">특정 작업자 그룹</option>
|
| 59 |
+
<option value="individual">개별 작업자</option>
|
| 60 |
+
</select>
|
| 61 |
+
</div>
|
| 62 |
+
<div>
|
| 63 |
+
<label class="block text-sm text-primary-600 mb-2">우선순위</label>
|
| 64 |
+
<select id="priority" class="w-full border border-primary-300 rounded-lg px-3 py-2">
|
| 65 |
+
<option value="high">높음</option>
|
| 66 |
+
<option value="normal">보통</option>
|
| 67 |
+
<option value="low">낮음</option>
|
| 68 |
+
</select>
|
| 69 |
+
</div>
|
| 70 |
+
<div>
|
| 71 |
+
<label class="block text-sm text-primary-600 mb-2">마감일 설정</label>
|
| 72 |
+
<input type="date" id="deadline" class="w-full border border-primary-300 rounded-lg px-3 py-2">
|
| 73 |
+
</div>
|
| 74 |
+
</div>
|
| 75 |
+
<button id="deployBtn" class="w-full bg-primary-500 hover:bg-primary-600 text-white px-4 py-3 rounded-lg font-medium transition-all duration-300 transform hover:scale-105">
|
| 76 |
+
배포 시작하기
|
| 77 |
+
</button>
|
| 78 |
+
</div>
|
| 79 |
+
|
| 80 |
+
<!-- 칸반 보드 -->
|
| 81 |
+
<div class="grid grid-cols-1 md:grid-cols-4 gap-6">
|
| 82 |
+
<!-- 대기 문서 -->
|
| 83 |
+
<div class="bg-gray-50 rounded-xl p-4">
|
| 84 |
+
<h3 class="font-semibold text-gray-800 mb-4 text-center">대기 문서 📥</h3>
|
| 85 |
+
<div id="waitingColumn" class="space-y-4 min-h-96">
|
| 86 |
+
</div>
|
| 87 |
+
</div>
|
| 88 |
+
|
| 89 |
+
<!-- 배포 중 -->
|
| 90 |
+
<div class="bg-blue-50 rounded-xl p-4">
|
| 91 |
+
<h3 class="font-semibold text-blue-800 mb-4 text-center">배포 중 🚀</h3>
|
| 92 |
+
<div id="deployingColumn" class="space-y-4 min-h-96">
|
| 93 |
+
</div>
|
| 94 |
+
</div>
|
| 95 |
+
|
| 96 |
+
<!-- 진행 중 -->
|
| 97 |
+
<div class="bg-yellow-50 rounded-xl p-4">
|
| 98 |
+
<h3 class="font-semibold text-yellow-800 mb-4 text-center">진행 중 ⚡</h3>
|
| 99 |
+
<div id="progressColumn" class="space-y-4 min-h-96">
|
| 100 |
+
</div>
|
| 101 |
+
</div>
|
| 102 |
+
|
| 103 |
+
<!-- 완료 -->
|
| 104 |
+
<div class="bg-green-50 rounded-xl p-4">
|
| 105 |
+
<h3 class="font-semibold text-green-800 mb-4 text-center">완료 ✅</h3>
|
| 106 |
+
<div id="completedColumn" class="space-y-4 min-h-96">
|
| 107 |
+
</div>
|
| 108 |
+
</div>
|
| 109 |
+
</div>
|
| 110 |
+
</main>
|
| 111 |
+
|
| 112 |
+
<custom-footer></custom-footer>
|
| 113 |
+
|
| 114 |
+
<script src="components/header.js"></script>
|
| 115 |
+
<script src="components/footer.js"></script>
|
| 116 |
+
<script src="deployment.js"></script>
|
| 117 |
+
<script>feather.replace();</script>
|
| 118 |
+
</body>
|
| 119 |
+
</html>
|
deployment.js
ADDED
|
@@ -0,0 +1,162 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
// 작업 배포 관리 스크립트
|
| 2 |
+
document.addEventListener('DOMContentLoaded', function() {
|
| 3 |
+
// 샘플 문서 데이터
|
| 4 |
+
const sampleDocuments = [
|
| 5 |
+
{ id: 1, title: '건축 도면 #2456', type: '도면', priority: 'high', deadline: '2024-03-15' },
|
| 6 |
+
{ id: 2, title: '시공 계획서 #1890', type: '계획서', priority: 'normal', deadline: '2024-03-20' },
|
| 7 |
+
{ id: 3, title: '공사 명세서 #3124', type: '명세서', priority: 'low', deadline: '2024-03-25' },
|
| 8 |
+
{ id: 4, title: '안전 계획서 #4567', type: '계획서', priority: 'high', deadline: '2024-03-12' },
|
| 9 |
+
{ id: 5, title: '건축 허가서 #5231', type: '허가서', priority: 'normal', deadline: '2024-03-18' },
|
| 10 |
+
{ id: 6, title: '공사 일정표 #6789', type: '일정표', priority: 'low', deadline: '2024-03-28' }
|
| 11 |
+
];
|
| 12 |
+
|
| 13 |
+
// 샘플 작업자 데이터
|
| 14 |
+
const sampleWorkers = [
|
| 15 |
+
{ id: 1, name: '김작업', group: 'A팀', status: 'available', currentTasks: 3 },
|
| 16 |
+
{ id: 2, name: '이수정', group: 'B팀', status: 'available', currentTasks: 2 },
|
| 17 |
+
{ id: 3, name: '박라벨', group: 'A팀', status: 'busy', currentTasks: 5 },
|
| 18 |
+
{ id: 4, name: '최교정', group: 'C팀', status: 'available', currentTasks: 1 },
|
| 19 |
+
{ id: 5, name: '정정밀', group: 'B팀', status: 'available', currentTasks: 4 }
|
| 20 |
+
];
|
| 21 |
+
|
| 22 |
+
// 문서 카드 생성 함수
|
| 23 |
+
function createDocumentCard(document) {
|
| 24 |
+
const priorityColors = {
|
| 25 |
+
high: 'bg-red-100 text-red-800',
|
| 26 |
+
normal: 'bg-yellow-100 text-yellow-800',
|
| 27 |
+
low: 'bg-green-100 text-green-800'
|
| 28 |
+
};
|
| 29 |
+
|
| 30 |
+
return `
|
| 31 |
+
<div class="document-card bg-white rounded-lg p-4 shadow-md border border-gray-200 cursor-move"
|
| 32 |
+
draggable="true"
|
| 33 |
+
data-document-id="${document.id}">
|
| 34 |
+
<div class="flex justify-between items-start mb-2">
|
| 35 |
+
<span class="text-sm font-medium text-gray-700">${document.title}</span>
|
| 36 |
+
<span class="priority-badge ${priorityColors[document.priority]} px-2 py-1 rounded-full text-xs">
|
| 37 |
+
${document.priority === 'high' ? '높음' : document.priority === 'normal' ? '보통' : '낮음'}
|
| 38 |
+
</span>
|
| 39 |
+
</div>
|
| 40 |
+
<div class="text-xs text-gray-500 mb-2">${document.type}</div>
|
| 41 |
+
<div class="flex justify-between items-center">
|
| 42 |
+
<span class="text-xs text-gray-400">마감: ${document.deadline}</span>
|
| 43 |
+
<div class="flex space-x-1">
|
| 44 |
+
<button class="worker-select-btn text-xs bg-primary-500 text-white px-2 py-1 rounded">
|
| 45 |
+
작업자 선택
|
| 46 |
+
</button>
|
| 47 |
+
</div>
|
| 48 |
+
</div>
|
| 49 |
+
`;
|
| 50 |
+
}
|
| 51 |
+
|
| 52 |
+
// 작업자 목록 표시 함수
|
| 53 |
+
function showWorkerList(workers) {
|
| 54 |
+
const workerList = workers.map(worker => `
|
| 55 |
+
<div class="worker-item bg-gray-50 rounded-lg p-3 mb-2 cursor-pointer hover:bg-gray-100 transition-colors" data-worker-id="${worker.id}">
|
| 56 |
+
<div class="flex justify-between items-center">
|
| 57 |
+
<span class="text-sm font-medium">${worker.name}</span>
|
| 58 |
+
<span class="text-xs ${worker.status === 'available' ? 'text-green-600' : 'text-yellow-600'}">
|
| 59 |
+
${worker.status === 'available' ? '가능' : '바쁨'}
|
| 60 |
+
</span>
|
| 61 |
+
</div>
|
| 62 |
+
<div class="text-xs text-gray-500">${worker.group} • ${worker.currentTasks}개 작업</div>
|
| 63 |
+
</div>
|
| 64 |
+
`).join('');
|
| 65 |
+
|
| 66 |
+
// 모달이나 드롭다운에 작업자 목록 표시
|
| 67 |
+
const workerModal = document.createElement('div');
|
| 68 |
+
workerModal.className = 'fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50 hidden" id="workerModal">
|
| 69 |
+
<div class="bg-white rounded-xl p-6 max-w-md w-full mx-4">
|
| 70 |
+
<h3 class="text-lg font-semibold mb-4">작업자 선택</h3>
|
| 71 |
+
<div class="worker-list max-h-64 overflow-y-auto">
|
| 72 |
+
${workerList}
|
| 73 |
+
</div>
|
| 74 |
+
<button class="w-full bg-gray-500 hover:bg-gray-600 text-white px-4 py-2 rounded-lg font-medium transition-all duration-300 mt-4" onclick="hideWorkerModal()">
|
| 75 |
+
닫기
|
| 76 |
+
</button>
|
| 77 |
+
</div>
|
| 78 |
+
</div>
|
| 79 |
+
|
| 80 |
+
document.body.appendChild(workerModal);
|
| 81 |
+
}
|
| 82 |
+
|
| 83 |
+
// 드래그 앤 드롭 기능
|
| 84 |
+
function initializeDragAndDrop() {
|
| 85 |
+
const documentCards = document.querySelectorAll('.document-card');
|
| 86 |
+
const columns = document.querySelectorAll('#waitingColumn, #deployingColumn, #progressColumn, #completedColumn');
|
| 87 |
+
|
| 88 |
+
// 드래그 시작
|
| 89 |
+
documentCards.forEach(card => {
|
| 90 |
+
card.addEventListener('dragstart', function(e) {
|
| 91 |
+
e.dataTransfer.setData('text/plain', this.dataset.documentId);
|
| 92 |
+
this.classList.add('dragging');
|
| 93 |
+
});
|
| 94 |
+
|
| 95 |
+
// 드래그 종료
|
| 96 |
+
card.addEventListener('dragend', function() {
|
| 97 |
+
this.classList.remove('dragging');
|
| 98 |
+
});
|
| 99 |
+
});
|
| 100 |
+
|
| 101 |
+
// 드롭 영역 설정
|
| 102 |
+
columns.forEach(column => {
|
| 103 |
+
column.addEventListener('dragover', function(e) {
|
| 104 |
+
e.preventDefault();
|
| 105 |
+
this.classList.add('drag-over');
|
| 106 |
+
});
|
| 107 |
+
|
| 108 |
+
column.addEventListener('dragleave', function() {
|
| 109 |
+
this.classList.remove('drag-over');
|
| 110 |
+
});
|
| 111 |
+
|
| 112 |
+
column.addEventListener('drop', function(e) {
|
| 113 |
+
e.preventDefault();
|
| 114 |
+
this.classList.remove('drag-over');
|
| 115 |
+
|
| 116 |
+
const documentId = e.dataTransfer.getData('text/plain');
|
| 117 |
+
const documentCard = document.querySelector(`[data-document-id="${documentId}"]`);
|
| 118 |
+
|
| 119 |
+
if (documentCard) {
|
| 120 |
+
this.appendChild(documentCard);
|
| 121 |
+
updateDocumentStatus(documentId, column.id);
|
| 122 |
+
}
|
| 123 |
+
});
|
| 124 |
+
});
|
| 125 |
+
}
|
| 126 |
+
|
| 127 |
+
// 문서 상태 업데이트
|
| 128 |
+
function updateDocumentStatus(documentId, columnId) {
|
| 129 |
+
console.log(`문서 ${documentId}가 ${columnId}로 이동되었습니다.');
|
| 130 |
+
|
| 131 |
+
// 여기에 실제 상태 업데이트 로직 추가
|
| 132 |
+
// 예: API 호출로 서버에 상태 변경 알림
|
| 133 |
+
}
|
| 134 |
+
|
| 135 |
+
// 초기 문서 로드
|
| 136 |
+
function loadInitialDocuments() {
|
| 137 |
+
const waitingColumn = document.getElementById('waitingColumn');
|
| 138 |
+
|
| 139 |
+
sampleDocuments.forEach(document => {
|
| 140 |
+
waitingColumn.innerHTML += createDocumentCard(document);
|
| 141 |
+
});
|
| 142 |
+
|
| 143 |
+
// 드래그 앤 드롭 초기화
|
| 144 |
+
setTimeout(() => {
|
| 145 |
+
initializeDragAndDrop();
|
| 146 |
+
}, 100);
|
| 147 |
+
}
|
| 148 |
+
|
| 149 |
+
// 배포 버튼 이벤트
|
| 150 |
+
document.getElementById('deployBtn').addEventListener('click', function() {
|
| 151 |
+
const workerType = document.getElementById('workerType').value;
|
| 152 |
+
const priority = document.getElementById('priority').value;
|
| 153 |
+
const deadline = document.getElementById('deadline').value;
|
| 154 |
+
|
| 155 |
+
alert(`작업 배포가 시작되었습니다!\n유형: ${workerType}\n우선순위: ${priority}\n마감일: ${deadline || '미설정'}`);
|
| 156 |
+
|
| 157 |
+
// 실제 배포 로직 구현
|
| 158 |
+
// deployDocuments(workerType, priority, deadline);
|
| 159 |
+
}
|
| 160 |
+
|
| 161 |
+
// 초기 실행
|
| 162 |
+
loadInitialDocuments();
|
index.html
CHANGED
|
@@ -80,6 +80,9 @@
|
|
| 80 |
<a href="/admin.html" class="bg-undefined-500 hover:bg-undefined-600 text-white px-8 py-3 rounded-full font-semibold transition-all duration-300 transform hover:scale-105">
|
| 81 |
관리자 로그인
|
| 82 |
</a>
|
|
|
|
|
|
|
|
|
|
| 83 |
<a href="/worker.html" class="bg-green-500 hover:bg-green-600 text-white px-8 py-3 rounded-full font-semibold transition-all duration-300 transform hover:scale-105">
|
| 84 |
작업자 로그인
|
| 85 |
</a>
|
|
|
|
| 80 |
<a href="/admin.html" class="bg-undefined-500 hover:bg-undefined-600 text-white px-8 py-3 rounded-full font-semibold transition-all duration-300 transform hover:scale-105">
|
| 81 |
관리자 로그인
|
| 82 |
</a>
|
| 83 |
+
<a href="/deployment.html" class="bg-primary-500 hover:bg-primary-600 text-white px-8 py-3 rounded-full font-semibold transition-all duration-300 transform hover:scale-105">
|
| 84 |
+
작업 배포
|
| 85 |
+
</a>
|
| 86 |
<a href="/worker.html" class="bg-green-500 hover:bg-green-600 text-white px-8 py-3 rounded-full font-semibold transition-all duration-300 transform hover:scale-105">
|
| 87 |
작업자 로그인
|
| 88 |
</a>
|
style.css
CHANGED
|
@@ -32,7 +32,6 @@ body {
|
|
| 32 |
.undefined-pulse {
|
| 33 |
animation: undefined-pulse 2s infinite;
|
| 34 |
}
|
| 35 |
-
|
| 36 |
/* OCR 작업 관련 스타일 */
|
| 37 |
.ocr-container {
|
| 38 |
background: white;
|
|
@@ -81,3 +80,40 @@ body {
|
|
| 81 |
background: linear-gradient(135deg, #0ea5e9 0%, #0369a1 100%);
|
| 82 |
transition: width 0.3s ease;
|
| 83 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 32 |
.undefined-pulse {
|
| 33 |
animation: undefined-pulse 2s infinite;
|
| 34 |
}
|
|
|
|
| 35 |
/* OCR 작업 관련 스타일 */
|
| 36 |
.ocr-container {
|
| 37 |
background: white;
|
|
|
|
| 80 |
background: linear-gradient(135deg, #0ea5e9 0%, #0369a1 100%);
|
| 81 |
transition: width 0.3s ease;
|
| 82 |
}
|
| 83 |
+
|
| 84 |
+
/* 배포 관리 스타일 */
|
| 85 |
+
.document-card {
|
| 86 |
+
transition: all 0.3s ease;
|
| 87 |
+
}
|
| 88 |
+
|
| 89 |
+
.document-card:hover {
|
| 90 |
+
transform: translateY(-2px);
|
| 91 |
+
box-shadow: 0 8px 15px rgba(0, 0, 0, 0.1);
|
| 92 |
+
}
|
| 93 |
+
|
| 94 |
+
.document-card.dragging {
|
| 95 |
+
opacity: 0.5;
|
| 96 |
+
transform: rotate(5deg);
|
| 97 |
+
}
|
| 98 |
+
|
| 99 |
+
.column {
|
| 100 |
+
transition: background-color 0.3s ease;
|
| 101 |
+
}
|
| 102 |
+
|
| 103 |
+
.column.drag-over {
|
| 104 |
+
background-color: rgba(14, 165, 233, 0.1);
|
| 105 |
+
border: 2px dashed #0ea5e9;
|
| 106 |
+
}
|
| 107 |
+
|
| 108 |
+
.worker-item {
|
| 109 |
+
transition: all 0.3s ease;
|
| 110 |
+
}
|
| 111 |
+
|
| 112 |
+
.worker-item:hover {
|
| 113 |
+
background-color: #f8fafc !important;
|
| 114 |
+
}
|
| 115 |
+
|
| 116 |
+
.priority-badge {
|
| 117 |
+
font-size: 0.75rem;
|
| 118 |
+
font-weight: 600;
|
| 119 |
+
}
|