jamesLeeeeeee commited on
Commit
33ce322
·
verified ·
1 Parent(s): e08a831

각 페이지마다 한페지씩 있어야해. 일단 작업배포관리부터하는데. 칸반스타일로 드래그도 가능하게 . 작업자 클릭하고 문서리스트 있으면 넣어주는거지

Browse files
Files changed (7) hide show
  1. admin-detail.html +4 -5
  2. admin.html +3 -3
  3. components/header.js +1 -0
  4. deployment.html +119 -0
  5. deployment.js +162 -0
  6. index.html +3 -0
  7. style.css +37 -1
admin-detail.html CHANGED
@@ -74,13 +74,12 @@
74
  </div>
75
  </div>
76
  </div>
77
- <button class="w-full bg-primary-500 hover:bg-primary-600 text-white px-4 py-3 rounded-lg font-medium transition-all duration-300">
78
- 배포 시작하기
79
- </button>
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="/admin-detail.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">
 
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
+ }