feat: 문의사항(Q&A) 게시판 구현 및 대시보드 활성도 분석 로직 개선

- [server.py] 문의사항 API(목록, 상세, 답변 저장/삭제) 및 라우트 추가
- [templates/inquiries.html] 문의사항 게시판 HTML 구조 구현 (Sticky 헤더, 아코디언 상세)
- [js/inquiries.js] 비동기 데이터 로드, 아코디언 토글, 답변 편집 로직 구현
- [style/inquiries.css] 와이드 레이아웃, Sticky 헤더, 아코디언 및 상태 배지 스타일 적용
- [server.py, js/dashboard.js] '폴더 자동 삭제' 로그 발생 시 14일 경과 여부와 관계없이 '방치'로 분류하도록 로직 수정
- [templates/dashboard.html] 대시보드 내 문의사항 탭 활성화 및 링크 연동
This commit is contained in:
2026-03-12 18:01:51 +09:00
parent 600c54c1f0
commit 5ddaad6a2e
6 changed files with 766 additions and 12 deletions

View File

@@ -70,7 +70,7 @@ async function loadActivityAnalysis(date = "") {
<div class="label">주의 (14일 이내)</div><div class="count">${summary.warning}</div>
</div>
<div class="activity-card stale" onclick="showActivityDetails('stale')">
<div class="label">방치 (14일 초과)</div><div class="count">${summary.stale}</div>
<div class="label">방치 (14일 초과 / 폴더자동삭제)</div><div class="count">${summary.stale}</div>
</div>
<div class="activity-card unknown" onclick="showActivityDetails('unknown')">
<div class="label">데이터 없음 (파일 0개)</div><div class="count">${summary.unknown}</div>
@@ -114,12 +114,20 @@ function createProjectHtml(p) {
const recentLog = (!logRaw || logRaw === "X" || logRaw === "데이터 없음") ? "기록 없음" : logRaw;
const logTime = recentLog !== "기록 없음" ? recentLog.split(',')[0] : "기록 없음";
// 파일이 0개 또는 NULL인 경우에만 에러(붉은색) 표시
const statusClass = (files === 0 || files === null) ? "status-error" : "";
// '폴더 자동 삭제' 여부 확인
const isStaleLog = recentLog.replace(/\s/g, "").includes("폴더자동삭제");
// 파일이 0개 또는 NULL인 경우에만 행 전체 에러(붉은색) 표시
const isNoFiles = (files === 0 || files === null);
const statusClass = isNoFiles ? "status-error" : "";
// 로그 텍스트 스타일 결정 (기록 없음 이거나 폴더자동삭제인 경우)
const logStyleClass = (recentLog === '기록 없음' || isStaleLog) ? 'warning-text' : '';
const logBoldStyle = isStaleLog ? 'font-weight: 800;' : '';
return `
<div class="accordion-item ${statusClass}">
<div class="accordion-header" onclick="toggleAccordion(this)">
<div class="repo-title" title="${name}">${name}</div><div class="repo-dept">${dept}</div><div class="repo-admin">${admin}</div><div class="repo-files ${statusClass === 'status-error' ? 'warning-text' : ''}">${files || 0}</div><div class="repo-log ${recentLog === '기록 없음' ? 'warning-text' : ''}" title="${recentLog}">${recentLog}</div>
<div class="repo-title" title="${name}">${name}</div><div class="repo-dept">${dept}</div><div class="repo-admin">${admin}</div><div class="repo-files ${isNoFiles ? 'warning-text' : ''}">${files || 0}</div><div class="repo-log ${logStyleClass}" style="${logBoldStyle}" title="${recentLog}">${recentLog}</div>
</div>
<div class="accordion-body">
<div class="detail-grid">