fix: 그룹 리더 대시보드 작업 저장/삭제 오류 해결 및 작업 분석 시스템 성능 최적화

🔧 그룹 리더 대시보드 수정사항:
- API 호출 방식 수정 (modern-dashboard.js)
- 서버 API 요구사항에 맞는 데이터 구조 변경
- work_entries 배열 구조로 변경
- work_type_id → task_id 필드명 매핑
- 400 Bad Request 오류 해결

 작업 분석 시스템 성능 최적화:
- 중복 함수 제거 (isWeekend, isVacationProject 통합)
- WorkAnalysisAPI 캐싱 시스템 구현 (5분 만료)
- 네임스페이스 조직화 (utils, ui, analysis, render)
- ErrorHandler 통합 에러 처리 시스템
- 성능 모니터링 및 메모리 누수 방지
- GPU 가속 CSS 애니메이션 추가
- 디바운스/스로틀 함수 적용
- 의미 없는 통계 카드 제거

📊 작업 분석 페이지 개선:
- 프로그레스 바 애니메이션
- 토스트 알림 시스템
- 부드러운 전환 효과
- 반응형 최적화
- 메모리 사용량 모니터링
This commit is contained in:
Hyungi Ahn
2025-11-05 10:12:52 +09:00
parent 052e868599
commit ed40eec261
14 changed files with 8740 additions and 243 deletions

View File

@@ -103,6 +103,46 @@ body {
min-height: 100vh;
}
/* ========== 네비게이션 헤더 ========== */
.breadcrumb-nav {
display: flex;
align-items: center;
gap: var(--space-2);
margin-bottom: var(--space-6);
padding: var(--space-4);
background: var(--white);
border-radius: var(--radius-lg);
box-shadow: var(--shadow-sm);
border: 1px solid var(--gray-200);
}
.breadcrumb-nav .nav-link {
display: flex;
align-items: center;
gap: var(--space-2);
padding: var(--space-2) var(--space-4);
color: var(--primary);
text-decoration: none;
border-radius: var(--radius);
font-weight: 500;
transition: all var(--transition);
}
.breadcrumb-nav .nav-link:hover {
background: var(--primary-bg);
color: var(--primary-dark);
}
.breadcrumb-nav .separator {
color: var(--gray-400);
font-weight: 400;
}
.breadcrumb-nav .current-page {
color: var(--gray-700);
font-weight: 600;
}
.page-header {
background: var(--white);
border-radius: var(--radius-xl);
@@ -160,6 +200,100 @@ body {
gap: var(--space-2);
}
/* 분석 탭 네비게이션 */
.tab-navigation {
background: var(--white);
border-radius: var(--radius-xl);
padding: var(--space-4);
margin-bottom: var(--space-6);
box-shadow: var(--shadow-md);
border: 1px solid var(--gray-200);
}
.tab-buttons {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: var(--space-3);
}
/* 탭 컨텐츠 표시/숨김 */
.tab-content {
display: none;
}
.tab-content.active {
display: block;
}
/* 결과 그리드 */
.results-grid {
display: flex;
flex-direction: column;
gap: var(--space-6);
}
.stats-cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: var(--space-4);
margin-bottom: var(--space-6);
}
.tab-contents {
background: var(--white);
border-radius: var(--radius-xl);
padding: var(--space-6);
box-shadow: var(--shadow-lg);
border: 1px solid var(--gray-200);
}
/* ========== 통계 카드 ========== */
.stat-card {
background: var(--white);
border-radius: var(--radius-lg);
padding: var(--space-6);
box-shadow: var(--shadow-md);
border: 1px solid var(--gray-200);
display: flex;
align-items: center;
gap: var(--space-4);
transition: all var(--transition);
}
.stat-card:hover {
box-shadow: var(--shadow-lg);
transform: translateY(-2px);
}
.stat-icon {
font-size: 2.5rem;
width: 60px;
height: 60px;
display: flex;
align-items: center;
justify-content: center;
background: var(--gradient-primary);
border-radius: var(--radius-lg);
color: var(--white);
}
.stat-content {
flex: 1;
}
.stat-label {
font-size: 0.875rem;
color: var(--gray-600);
font-weight: 500;
margin-bottom: var(--space-1);
}
.stat-value {
font-size: 2rem;
font-weight: 700;
color: var(--gray-900);
}
.tab-button {
flex: 1;
padding: var(--space-4) var(--space-6);
@@ -411,6 +545,61 @@ body {
overflow: visible; /* 테이블이 보이도록 */
}
.chart-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: var(--space-6);
padding-bottom: var(--space-4);
border-bottom: 2px solid var(--gray-100);
}
.chart-title {
font-size: 1.5rem;
font-weight: 700;
color: var(--gray-900);
display: flex;
align-items: center;
gap: var(--space-3);
}
.chart-title .icon {
font-size: 1.25rem;
}
.chart-analyze-btn {
padding: var(--space-3) var(--space-6);
background: var(--gradient-primary);
color: var(--white);
border: none;
border-radius: var(--radius-lg);
font-weight: 600;
font-size: 0.875rem;
cursor: pointer;
transition: all var(--transition);
display: flex;
align-items: center;
gap: var(--space-2);
box-shadow: var(--shadow-sm);
}
.chart-analyze-btn:hover:not(:disabled) {
background: var(--gradient-primary);
box-shadow: var(--shadow-md);
transform: translateY(-1px);
}
.chart-analyze-btn:disabled {
background: var(--gray-300);
color: var(--gray-500);
cursor: not-allowed;
opacity: 0.6;
}
.chart-analyze-btn .icon {
font-size: 1rem;
}
/* 차트 컨테이너 타입별 스타일 */
.chart-container.chart-type {
height: 450px; /* 차트일 때만 고정 높이 */
@@ -435,7 +624,8 @@ body {
border: 1px solid var(--gray-200);
}
.work-report-table {
.work-report-table,
.work-status-table {
width: 100%;
border-collapse: collapse;
font-size: 0.9rem;