기능 추가 및 버그 수정 — 처리시간 지표, 대시보드 차트, UI 개선

## 처리시간 지표
- 업무시간 기준(09-18 평일) / 공휴일 제외 24h / 달력 기준 3가지 모드 선택
- 공휴일 DB 관리 (holidays 테이블, 수동 등록·삭제·일괄 추가)
- 2026년 공휴일 등록 지원
- 설정 페이지에서 라디오 버튼으로 모드 선택

## 대시보드 차트
- 월별 평균 처리시간 막대 차트 추가
- 월별 신고 접수 건수 누적 막대 차트 추가
- 월별 → 일별 드릴다운 (막대 클릭 시 해당 월의 일별 차트로 전환)
- 일별 막대 클릭 시 처리 완료/신고 접수 상세 내역 모달
- 충전기별 누적 고장 건수 Top 10 수평 막대 차트 추가

## 신고 목록
- # 컬럼을 DB PK 대신 현재 목록 순서(1, 2, 3…)로 표시
- 엑셀 export 접수번호도 순차번호로 변경

## 모바일 네비게이션 버그 수정
- 모바일에서 가로 오버플로우 시 nav가 body 넓이로 늘어나
  햄버거 버튼이 화면 밖으로 밀리는 문제 수정
- nav를 position:fixed + body padding-top:54px 로 변경 (전체 페이지 적용)
- 충전기 관리·신고 목록 페이지 지도 컨테이너에 isolation:isolate 적용

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
byun
2026-05-31 06:52:56 +09:00
parent 05b478372a
commit 2e8751ea6c
35 changed files with 5541 additions and 353 deletions

View File

@@ -17,12 +17,21 @@
body{font-family:'Noto Sans KR',sans-serif;background:var(--gray1);color:var(--text);font-size:14px;min-height:100vh;}
/* ── NAV ── */
.nav{background:var(--navy);color:white;padding:0 24px;height:54px;display:flex;align-items:center;justify-content:space-between;position:sticky;top:0;z-index:100;box-shadow:0 2px 8px rgba(0,0,0,.3);}
.nav{background:var(--navy);color:white;padding:0 24px;height:54px;display:flex;align-items:center;justify-content:space-between;position:sticky;top:0;z-index:400;box-shadow:0 2px 8px rgba(0,0,0,.3);}
.nav-brand{font-size:16px;font-weight:700;color:var(--accent);}
.nav-user{font-size:13px;color:rgba(255,255,255,.7);display:flex;align-items:center;gap:12px;}
.nav-user a{color:rgba(255,255,255,.7);text-decoration:none;cursor:pointer;}
.nav-user a:hover{color:white;}
/* ── 햄버거 버튼 (데스크톱 숨김) ── */
.nav-hamburger{display:none;background:none;border:none;color:white;font-size:22px;
cursor:pointer;padding:4px 10px;margin-right:2px;border-radius:6px;line-height:1;}
.nav-hamburger:hover{background:rgba(255,255,255,.12);}
/* ── 모바일 오버레이 ── */
.mobile-nav-overlay{display:none;position:fixed;inset:54px 0 0 0;
background:rgba(0,0,0,.45);z-index:299;}
/* ── SIDEBAR (admin/mechanic) ── */
.layout{display:flex;min-height:calc(100vh - 54px);}
.sidebar{background:var(--navy2);width:200px;flex-shrink:0;padding:16px 0;}
@@ -139,10 +148,38 @@ textarea{resize:vertical;min-height:80px;}
.spinner{display:inline-block;width:18px;height:18px;border:2px solid var(--gray3);border-top-color:var(--accent);border-radius:50%;animation:spin .7s linear infinite;}
@keyframes spin{to{transform:rotate(360deg);}}
/* ── 2컬럼 상세 그리드 ── */
.detail-grid{display:grid;grid-template-columns:1fr 1fr;gap:18px;}
/* ── RESPONSIVE ── */
@media(max-width:768px){
.form-row,.form-row-3{grid-template-columns:1fr;}
.sidebar{display:none;}
.main{padding:16px;}
.stats{grid-template-columns:repeat(2,1fr);}
.detail-grid{grid-template-columns:1fr;}
/* nav: sticky → fixed (가로 오버플로우 시 body 넓이에 끌려 햄버거 버튼이 밀려나는 문제 방지) */
.nav{position:fixed;left:0;width:100%;box-sizing:border-box;}
body{padding-top:54px;}
/* 사이드바 → 슬라이드 드로어 */
.sidebar{
position:fixed;top:54px;left:0;bottom:0;
width:220px;z-index:300;overflow-y:auto;
transform:translateX(-100%);
transition:transform .25s ease;
box-shadow:none;
}
.sidebar.mobile-open{
transform:translateX(0);
box-shadow:4px 0 28px rgba(0,0,0,.45);
}
.mobile-nav-overlay.show{display:block;}
.nav-hamburger{display:inline-flex;align-items:center;}
}
/* ── 정비사 모바일 탭 바 ── */
.mech-tab-bar{display:none;background:var(--navy2);position:sticky;top:54px;z-index:200;border-bottom:1px solid rgba(255,255,255,.15);}
.mech-tab-bar a{flex:1;display:flex;flex-direction:column;align-items:center;padding:8px 4px 7px;color:rgba(255,255,255,.6);text-decoration:none;font-size:11px;border-bottom:3px solid transparent;transition:all .15s;gap:1px;line-height:1.4;}
.mech-tab-bar a:hover,.mech-tab-bar a.active{color:white;border-bottom-color:var(--accent);background:rgba(255,255,255,.06);}
@media(max-width:768px){.mech-tab-bar{display:flex;}}