✨ 새로운 기능: - 작업 분석 페이지 구현 (기간별, 프로젝트별, 작업자별, 오류별) - 개별 분석 실행 버튼으로 API 부하 최적화 - 연차/휴무 집계 방식 개선 (주말 제외, 작업내용 통합) - 프로젝트 관리 시스템 (활성화/비활성화) - 작업자 관리 시스템 (CRUD 기능) - 코드 관리 시스템 (작업유형, 작업상태, 오류유형) 🎨 UI/UX 개선: - 기간별 작업 현황을 테이블 형태로 변경 - 작업자별 rowspan 그룹화로 가독성 향상 - 연차/휴무 프로젝트 하단 배치 및 시각적 구분 - 기간 확정 시스템으로 사용자 경험 개선 - 반응형 디자인 적용 🔧 기술적 개선: - Rate Limiting 제거 (내부 시스템 최적화) - 주말 연차/휴무 자동 제외 로직 - 작업공수 계산 정확도 향상 - 데이터베이스 마이그레이션 추가 - API 엔드포인트 확장 및 최적화 🐛 버그 수정: - projectSelect 요소 참조 오류 해결 - 차트 높이 무한 증가 문제 해결 - 날짜 표시 형식 단순화 - 작업보고서 저장 validation 오류 수정
171 lines
6.2 KiB
HTML
171 lines
6.2 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>
|
||
|
||
<link rel="stylesheet" href="/css/design-system.css">
|
||
<link rel="stylesheet" href="/css/daily-work-report.css">
|
||
<link rel="icon" type="image/png" href="/img/favicon.png">
|
||
|
||
<script src="/js/api-config.js"></script>
|
||
<script src="/js/auth-check.js" defer></script>
|
||
</head>
|
||
<body>
|
||
<div class="work-report-container">
|
||
<!-- 네비게이션 바 -->
|
||
<div id="navbar-container"></div>
|
||
|
||
<!-- 헤더 -->
|
||
<header class="work-report-header">
|
||
<h1 id="pageTitle">👤 개별 작업 보고서</h1>
|
||
<p class="subtitle" id="pageSubtitle">작업자의 일일 작업 내용을 입력하고 수정합니다.</p>
|
||
</header>
|
||
|
||
<!-- 메인 콘텐츠 -->
|
||
<main class="work-report-main">
|
||
<!-- 뒤로가기 버튼 -->
|
||
<a href="javascript:history.back()" class="back-button">
|
||
← 뒤로가기
|
||
</a>
|
||
|
||
<!-- 작업자 정보 카드 -->
|
||
<div class="worker-info-card" id="workerInfoCard">
|
||
<div class="worker-avatar-large">
|
||
<span id="workerInitial">작</span>
|
||
</div>
|
||
<div class="worker-info-details">
|
||
<h2 id="workerName">작업자명</h2>
|
||
<p id="workerJob">직종</p>
|
||
<p id="selectedDate">날짜</p>
|
||
</div>
|
||
<div class="worker-status-summary" id="workerStatusSummary">
|
||
<div class="status-item">
|
||
<span class="status-label">총 작업시간</span>
|
||
<span class="status-value" id="totalHours">0h</span>
|
||
</div>
|
||
<div class="status-item">
|
||
<span class="status-label">작업 건수</span>
|
||
<span class="status-value" id="workCount">0건</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 메시지 영역 -->
|
||
<div id="message-container"></div>
|
||
|
||
<!-- 기존 작업 목록 -->
|
||
<div class="existing-work-section" id="existingWorkSection">
|
||
<div class="section-header">
|
||
<h3>📋 기존 작업 목록</h3>
|
||
<button class="btn btn-primary" id="addNewWorkBtn">
|
||
➕ 새 작업 추가
|
||
</button>
|
||
</div>
|
||
<div id="existingWorkList">
|
||
<!-- 기존 작업들이 여기에 표시됩니다 -->
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 새 작업 추가 폼 -->
|
||
<div class="new-work-section" id="newWorkSection" style="display: none;">
|
||
<div class="section-header">
|
||
<h3>➕ 새 작업 추가</h3>
|
||
<button class="btn btn-secondary" id="cancelNewWorkBtn">
|
||
✖️ 취소
|
||
</button>
|
||
</div>
|
||
<div class="work-entry" id="newWorkEntry">
|
||
<div class="work-entry-grid">
|
||
<div class="form-field-group">
|
||
<label class="form-field-label">
|
||
<span class="form-field-icon">🏗️</span>
|
||
프로젝트
|
||
</label>
|
||
<select id="newProjectSelect" class="form-select" required>
|
||
<option value="">프로젝트를 선택하세요</option>
|
||
</select>
|
||
</div>
|
||
|
||
<div class="form-field-group">
|
||
<label class="form-field-label">
|
||
<span class="form-field-icon">⚙️</span>
|
||
작업 유형
|
||
</label>
|
||
<select id="newWorkTypeSelect" class="form-select" required>
|
||
<option value="">작업 유형을 선택하세요</option>
|
||
</select>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="form-field-group">
|
||
<label class="form-field-label">
|
||
<span class="form-field-icon">📊</span>
|
||
업무 상태
|
||
</label>
|
||
<select id="newWorkStatusSelect" class="form-select" required>
|
||
<option value="">업무 상태를 선택하세요</option>
|
||
</select>
|
||
</div>
|
||
|
||
<div class="error-type-section" id="newErrorTypeSection">
|
||
<label class="form-field-label">
|
||
<span class="form-field-icon">⚠️</span>
|
||
에러 유형
|
||
</label>
|
||
<select id="newErrorTypeSelect" class="form-select">
|
||
<option value="">에러 유형을 선택하세요</option>
|
||
</select>
|
||
</div>
|
||
|
||
<div class="time-input-section">
|
||
<label class="form-field-label">
|
||
<span class="form-field-icon">⏰</span>
|
||
작업 시간 (시간)
|
||
</label>
|
||
<input type="number" id="newWorkHours" class="time-input" step="0.25" min="0.25" max="24" value="1.00" required>
|
||
<div class="quick-time-buttons">
|
||
<button type="button" class="quick-time-btn" data-hours="0.5">0.5h</button>
|
||
<button type="button" class="quick-time-btn" data-hours="1">1h</button>
|
||
<button type="button" class="quick-time-btn" data-hours="2">2h</button>
|
||
<button type="button" class="quick-time-btn" data-hours="4">4h</button>
|
||
<button type="button" class="quick-time-btn" data-hours="8">8h</button>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="form-actions">
|
||
<button type="button" class="btn btn-success" id="saveNewWorkBtn">
|
||
💾 작업 저장
|
||
</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 휴가 처리 섹션 -->
|
||
<div class="vacation-section" id="vacationSection">
|
||
<div class="section-header">
|
||
<h3>🏖️ 휴가 처리</h3>
|
||
</div>
|
||
<div class="vacation-buttons">
|
||
<button class="btn btn-warning vacation-process-btn" data-type="full">
|
||
🏖️ 연차 (8시간)
|
||
</button>
|
||
<button class="btn btn-warning vacation-process-btn" data-type="half-half">
|
||
🌤️ 반반차 (6시간)
|
||
</button>
|
||
<button class="btn btn-warning vacation-process-btn" data-type="half">
|
||
🌅 반차 (4시간)
|
||
</button>
|
||
</div>
|
||
</div>
|
||
|
||
</main>
|
||
</div>
|
||
|
||
<!-- 스크립트 -->
|
||
<script src="/js/load-navbar.js"></script>
|
||
<script src="/js/worker-individual-report.js?v=2"></script>
|
||
</body>
|
||
</html>
|