- 페이지 폴더 재구성: safety/, attendance/ 폴더 신규 생성 - work/ → safety/: 이슈 신고, 출입 신청 관련 페이지 이동 - common/ → attendance/: 근태/휴가 관련 페이지 이동 - admin/ 정리: safety-* 파일들을 safety/로 이동 - 사이드바 네비게이션 메뉴 구현 - 카테고리별 메뉴: 작업관리, 안전관리, 근태관리, 시스템관리 - 접기/펼치기 기능 및 상태 저장 - 관리자 전용 메뉴 자동 표시/숨김 - 날씨 API 연동 (기상청 단기예보) - TBM 및 navbar에 현재 날씨 표시 - weatherService.js 추가 - 안전 체크리스트 확장 - 기본/날씨별/작업별 체크 유형 추가 - checklist-manage.html 페이지 추가 - 이슈 신고 시스템 구현 - workIssueController, workIssueModel, workIssueRoutes 추가 - DB 마이그레이션 파일 추가 (실행 대기) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
294 lines
14 KiB
HTML
294 lines
14 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="ko">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<title>작업 현황 확인 - TK 건설</title>
|
||
<link rel="stylesheet" href="/css/design-system.css">
|
||
<link rel="stylesheet" href="/css/common.css?v=13">
|
||
<link rel="stylesheet" href="/css/modern-dashboard.css?v=14">
|
||
<link rel="stylesheet" href="/css/work-report-calendar.css?v=29">
|
||
</head>
|
||
<body>
|
||
<!-- 네비게이션 헤더 -->
|
||
<div id="navbar-container"></div>
|
||
|
||
<!-- 메인 콘텐츠 -->
|
||
<main class="dashboard-main">
|
||
<div class="calendar-page-container">
|
||
<!-- 페이지 제목 -->
|
||
<div class="page-title-section">
|
||
<h2 class="page-title">📅 작업 현황 확인</h2>
|
||
<p class="page-subtitle">월별 작업자 현황을 한눈에 확인하세요</p>
|
||
</div>
|
||
|
||
<!-- 캘린더 카드 -->
|
||
<div class="calendar-card">
|
||
<!-- 월 네비게이션 -->
|
||
<div class="calendar-nav">
|
||
<button id="prevMonthBtn" class="nav-btn prev-btn">
|
||
<span class="nav-icon">‹</span>
|
||
<span class="nav-text">이전</span>
|
||
</button>
|
||
|
||
<div class="calendar-title">
|
||
<h3 id="monthYearTitle">2025년 11월</h3>
|
||
<button id="todayBtn" class="today-btn">오늘</button>
|
||
</div>
|
||
|
||
<button id="nextMonthBtn" class="nav-btn next-btn">
|
||
<span class="nav-text">다음</span>
|
||
<span class="nav-icon">›</span>
|
||
</button>
|
||
</div>
|
||
|
||
<!-- 범례 -->
|
||
<div class="calendar-legend">
|
||
<div class="legend-item">
|
||
<div class="legend-dot has-overtime-warning"></div>
|
||
<span>확인필요</span>
|
||
</div>
|
||
<div class="legend-item">
|
||
<div class="legend-dot has-errors"></div>
|
||
<span>미입력</span>
|
||
</div>
|
||
<div class="legend-item">
|
||
<div class="legend-dot has-issues"></div>
|
||
<span>부분입력</span>
|
||
</div>
|
||
<div class="legend-item">
|
||
<div class="legend-dot has-normal"></div>
|
||
<span>이상 없음</span>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 캘린더 -->
|
||
<div class="calendar-grid">
|
||
<div class="calendar-header">
|
||
<div class="day-header sunday">일</div>
|
||
<div class="day-header">월</div>
|
||
<div class="day-header">화</div>
|
||
<div class="day-header">수</div>
|
||
<div class="day-header">목</div>
|
||
<div class="day-header">금</div>
|
||
<div class="day-header saturday">토</div>
|
||
</div>
|
||
<div class="calendar-days" id="calendarDays">
|
||
<!-- 캘린더 날짜들이 여기에 동적으로 생성됩니다 -->
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</main>
|
||
|
||
<!-- 로딩 스피너 -->
|
||
<div id="loadingSpinner" class="loading-overlay" style="display: none;">
|
||
<div class="loading-content">
|
||
<div class="spinner"></div>
|
||
<p>데이터를 불러오는 중...</p>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 일일 작업 현황 모달 -->
|
||
<div id="dailyWorkModal" class="modal-overlay" style="display: none;">
|
||
<div class="modal-container large-modal">
|
||
<div class="modal-header">
|
||
<h2 id="modalTitle">2025년 11월 3일 작업 현황</h2>
|
||
<button class="modal-close-btn" onclick="closeDailyWorkModal()">×</button>
|
||
</div>
|
||
|
||
<div class="modal-body">
|
||
<!-- 요약 정보 -->
|
||
<div class="daily-summary">
|
||
<div class="summary-card">
|
||
<div class="summary-icon success">👥</div>
|
||
<div class="summary-content">
|
||
<div class="summary-label">총 작업자</div>
|
||
<div class="summary-value" id="modalTotalWorkers">0명</div>
|
||
</div>
|
||
</div>
|
||
<div class="summary-card">
|
||
<div class="summary-icon primary">⏰</div>
|
||
<div class="summary-content">
|
||
<div class="summary-label">총 작업시간</div>
|
||
<div class="summary-value" id="modalTotalHours">0.0h</div>
|
||
</div>
|
||
</div>
|
||
<div class="summary-card">
|
||
<div class="summary-icon warning">📝</div>
|
||
<div class="summary-content">
|
||
<div class="summary-label">작업 건수</div>
|
||
<div class="summary-value" id="modalTotalTasks">0건</div>
|
||
</div>
|
||
</div>
|
||
<div class="summary-card">
|
||
<div class="summary-icon error">⚠️</div>
|
||
<div class="summary-content">
|
||
<div class="summary-label">오류 건수</div>
|
||
<div class="summary-value" id="modalErrorCount">0건</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 작업자 현황 리스트 -->
|
||
<div class="modal-work-status">
|
||
<div class="work-status-header">
|
||
<h3>작업자별 현황</h3>
|
||
<div class="status-filter">
|
||
<select id="statusFilter">
|
||
<option value="all">전체</option>
|
||
<option value="incomplete">미입력</option>
|
||
<option value="partial">부분입력</option>
|
||
<option value="complete">완료</option>
|
||
<option value="overtime">연장근로</option>
|
||
<option value="error">오류</option>
|
||
</select>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="modalWorkersList" class="worker-status-list">
|
||
<!-- 작업자 리스트가 여기에 동적으로 생성됩니다 -->
|
||
</div>
|
||
|
||
<div id="modalNoData" class="empty-state" style="display: none;">
|
||
<div class="empty-icon">📭</div>
|
||
<h3>해당 날짜의 작업 보고서가 없습니다</h3>
|
||
<p>다른 날짜를 선택해 주세요.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 작업 입력/수정 모달 -->
|
||
<div id="workEntryModal" class="modal-overlay" style="display: none;">
|
||
<div class="modal-container large-modal">
|
||
<div class="modal-header">
|
||
<h2 id="workEntryModalTitle">작업 관리</h2>
|
||
<button class="modal-close-btn" onclick="closeWorkEntryModal()">×</button>
|
||
</div>
|
||
|
||
<div class="modal-body">
|
||
<!-- 탭 네비게이션 -->
|
||
<div class="modal-tabs">
|
||
<button class="tab-btn active" data-tab="existing" onclick="switchTab('existing')">
|
||
📋 기존 작업 (0건)
|
||
</button>
|
||
<button class="tab-btn" data-tab="new" onclick="switchTab('new')">
|
||
➕ 새 작업 추가
|
||
</button>
|
||
</div>
|
||
|
||
<!-- 기존 작업 목록 탭 -->
|
||
<div id="existingWorkTab" class="tab-content active">
|
||
<div class="existing-work-header">
|
||
<h3>등록된 작업 목록</h3>
|
||
<div class="work-summary" id="workSummary">
|
||
총 <span id="totalWorkCount">0</span>건 | 총 <span id="totalWorkHours">0</span>시간
|
||
</div>
|
||
</div>
|
||
|
||
<div id="existingWorkList" class="existing-work-list">
|
||
<!-- 기존 작업들이 여기에 동적으로 생성됩니다 -->
|
||
</div>
|
||
|
||
<div id="noExistingWork" class="empty-state" style="display: none;">
|
||
<div class="empty-icon">📝</div>
|
||
<h3>등록된 작업이 없습니다</h3>
|
||
<p>"새 작업 추가" 탭에서 작업을 등록해보세요.</p>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 새 작업 추가 탭 -->
|
||
<div id="newWorkTab" class="tab-content">
|
||
<form id="workEntryForm">
|
||
<!-- 작업자 정보 -->
|
||
<div class="form-section">
|
||
<h3>작업자 정보</h3>
|
||
<div class="form-group">
|
||
<label class="form-label">작업자</label>
|
||
<input type="text" id="workerNameDisplay" class="form-control" readonly>
|
||
<input type="hidden" id="workerId">
|
||
<input type="hidden" id="editingWorkId">
|
||
</div>
|
||
<div class="form-group">
|
||
<label class="form-label">작업 날짜</label>
|
||
<input type="date" id="workDate" class="form-control" readonly>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 작업 내용 -->
|
||
<div class="form-section">
|
||
<h3 id="workContentTitle">작업 내용</h3>
|
||
<div class="form-group">
|
||
<label class="form-label">프로젝트 *</label>
|
||
<select id="projectSelect" class="form-control" required>
|
||
<option value="">프로젝트를 선택하세요</option>
|
||
</select>
|
||
</div>
|
||
<div class="form-group">
|
||
<label class="form-label">작업 유형 *</label>
|
||
<select id="workTypeSelect" class="form-control" required>
|
||
<option value="">작업 유형을 선택하세요</option>
|
||
</select>
|
||
</div>
|
||
<div class="form-group">
|
||
<label class="form-label">작업 시간 (시간) *</label>
|
||
<input type="number" id="workHours" class="form-control" min="0" max="24" step="0.5" required>
|
||
</div>
|
||
<div class="form-group">
|
||
<label class="form-label">작업 상태 *</label>
|
||
<select id="workStatusSelect" class="form-control" required>
|
||
<option value="">상태를 선택하세요</option>
|
||
</select>
|
||
</div>
|
||
<div class="form-group">
|
||
<label class="form-label">오류 유형</label>
|
||
<select id="errorTypeSelect" class="form-control">
|
||
<option value="">오류 유형 (선택사항)</option>
|
||
</select>
|
||
</div>
|
||
<div class="form-group">
|
||
<label class="form-label">작업 설명</label>
|
||
<textarea id="workDescription" class="form-control" rows="3" placeholder="작업 내용을 상세히 입력하세요"></textarea>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 휴가 처리 -->
|
||
<div class="form-section" id="vacationSection">
|
||
<h3>휴가 처리</h3>
|
||
<div class="vacation-buttons">
|
||
<button type="button" class="btn-vacation" onclick="handleVacation('full')">연차 (8시간)</button>
|
||
<button type="button" class="btn-vacation" onclick="handleVacation('half')">반차 (4시간)</button>
|
||
<button type="button" class="btn-vacation" onclick="handleVacation('quarter')">반반차 (2시간)</button>
|
||
<button type="button" class="btn-vacation" onclick="handleVacation('early')">조퇴 (6시간)</button>
|
||
</div>
|
||
</div>
|
||
</form>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="modal-footer">
|
||
<button type="button" class="btn btn-secondary" onclick="closeWorkEntryModal()">취소</button>
|
||
<div class="footer-actions">
|
||
<button type="button" class="btn btn-danger" id="deleteWorkBtn" onclick="deleteWork()" style="display: none;">
|
||
🗑️ 삭제
|
||
</button>
|
||
<button type="button" class="btn btn-primary" id="saveWorkBtn" onclick="saveWorkEntry()">
|
||
💾 저장
|
||
</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- JavaScript -->
|
||
<script type="module" src="/js/api-config.js?v=13"></script>
|
||
<script type="module" src="/js/auth-check.js?v=13"></script>
|
||
<script type="module" src="/js/load-navbar.js"></script>
|
||
<script src="/js/modules/calendar/CalendarState.js?v=1"></script>
|
||
<script src="/js/modules/calendar/CalendarAPI.js?v=1"></script>
|
||
<script src="/js/modules/calendar/CalendarView.js?v=1"></script>
|
||
<script src="/js/work-report-calendar.js?v=41"></script>
|
||
</body>
|
||
</html> |