diff --git a/frontend/index.html b/frontend/index.html index 18e9e42..cdd5e8a 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -403,15 +403,17 @@ - +
- + -
+
@@ -1403,11 +1405,20 @@ }); } - // 검토 상태 필터 적용 + // 워크플로우 상태 필터 적용 if (reviewStatusFilter) { filteredIssues = filteredIssues.filter(issue => { - const isCompleted = isReviewCompleted(issue); - return reviewStatusFilter === 'completed' ? isCompleted : !isCompleted; + // 새로운 워크플로우 시스템 사용 + if (issue.review_status) { + return issue.review_status === reviewStatusFilter; + } + // 기존 데이터 호환성을 위한 폴백 + else { + const isCompleted = isReviewCompleted(issue); + if (reviewStatusFilter === 'pending_review') return !isCompleted; + if (reviewStatusFilter === 'completed') return isCompleted; + return false; + } }); } @@ -1421,9 +1432,20 @@ return; } - // 검토 상태별로 분류 및 정렬 - const pendingIssues = filteredIssues.filter(issue => !isReviewCompleted(issue)); - const completedIssues = filteredIssues.filter(issue => isReviewCompleted(issue)); + // 워크플로우 상태별로 분류 및 정렬 + const groupedIssues = { + pending_review: filteredIssues.filter(issue => + issue.review_status === 'pending_review' || (!issue.review_status && !isReviewCompleted(issue)) + ), + in_progress: filteredIssues.filter(issue => issue.review_status === 'in_progress'), + completed: filteredIssues.filter(issue => + issue.review_status === 'completed' || (!issue.review_status && isReviewCompleted(issue)) + ), + disposed: filteredIssues.filter(issue => issue.review_status === 'disposed') + }; + + const pendingIssues = groupedIssues.pending_review; + const completedIssues = [...groupedIssues.in_progress, ...groupedIssues.completed, ...groupedIssues.disposed]; // 검토 필요 항목을 먼저 표시 if (pendingIssues.length > 0) { diff --git a/frontend/issue-view.html b/frontend/issue-view.html index 38557a0..6b5a7ea 100644 --- a/frontend/issue-view.html +++ b/frontend/issue-view.html @@ -135,13 +135,15 @@
- +
- +
@@ -513,11 +515,20 @@ }); } - // 검토 상태 필터 적용 + // 워크플로우 상태 필터 적용 if (reviewStatusFilter) { filteredIssues = filteredIssues.filter(issue => { - const isCompleted = isReviewCompleted(issue); - return reviewStatusFilter === 'completed' ? isCompleted : !isCompleted; + // 새로운 워크플로우 시스템 사용 + if (issue.review_status) { + return issue.review_status === reviewStatusFilter; + } + // 기존 데이터 호환성을 위한 폴백 + else { + const isCompleted = isReviewCompleted(issue); + if (reviewStatusFilter === 'pending_review') return !isCompleted; + if (reviewStatusFilter === 'completed') return isCompleted; + return false; + } }); } @@ -668,45 +679,64 @@ return; } - // 검토 상태별로 분류 및 정렬 - const pendingIssues = filteredIssues.filter(issue => !isReviewCompleted(issue)); - const completedIssues = filteredIssues.filter(issue => isReviewCompleted(issue)); + // 워크플로우 상태별로 분류 및 정렬 + const groupedIssues = { + pending_review: filteredIssues.filter(issue => + issue.review_status === 'pending_review' || (!issue.review_status && !isReviewCompleted(issue)) + ), + in_progress: filteredIssues.filter(issue => issue.review_status === 'in_progress'), + completed: filteredIssues.filter(issue => + issue.review_status === 'completed' || (!issue.review_status && isReviewCompleted(issue)) + ), + disposed: filteredIssues.filter(issue => issue.review_status === 'disposed') + }; container.innerHTML = ''; - // 검토 필요 항목을 먼저 표시 - if (pendingIssues.length > 0) { - const pendingHeader = document.createElement('div'); - pendingHeader.className = 'mb-4'; - pendingHeader.innerHTML = ` -

- 검토 필요 (${pendingIssues.length}건) -

- `; - container.appendChild(pendingHeader); - - pendingIssues.forEach(issue => { - container.appendChild(createIssueCard(issue, false)); - }); - } + // 각 상태별로 표시 + const statusConfig = [ + { key: 'pending_review', title: '수신함 (검토 대기)', icon: 'fas fa-inbox', color: 'text-orange-700' }, + { key: 'in_progress', title: '관리함 (진행 중)', icon: 'fas fa-cog', color: 'text-blue-700' }, + { key: 'completed', title: '관리함 (완료됨)', icon: 'fas fa-check-circle', color: 'text-green-700' }, + { key: 'disposed', title: '폐기함 (폐기됨)', icon: 'fas fa-trash', color: 'text-gray-700' } + ]; - // 검토 완료 항목을 아래에 표시 - if (completedIssues.length > 0) { - const completedHeader = document.createElement('div'); - completedHeader.className = 'mb-4 mt-8'; - completedHeader.innerHTML = ` -

- 검토 완료 (${completedIssues.length}건) -

- `; - container.appendChild(completedHeader); - - completedIssues.forEach(issue => { - container.appendChild(createIssueCard(issue, true)); - }); - } + statusConfig.forEach((config, index) => { + const issues = groupedIssues[config.key]; + if (issues.length > 0) { + const header = document.createElement('div'); + header.className = index > 0 ? 'mb-4 mt-8' : 'mb-4'; + header.innerHTML = ` +

+ ${config.title} (${issues.length}건) +

+ `; + container.appendChild(header); + + issues.forEach(issue => { + container.appendChild(createIssueCard(issue, config.key === 'completed')); + }); + } + }); } + // 워크플로우 상태 표시 함수 + function getWorkflowStatusBadge(issue) { + const status = issue.review_status || (isReviewCompleted(issue) ? 'completed' : 'pending_review'); + + const statusConfig = { + 'pending_review': { text: '검토 대기', class: 'bg-orange-100 text-orange-700', icon: 'fas fa-inbox' }, + 'in_progress': { text: '진행 중', class: 'bg-blue-100 text-blue-700', icon: 'fas fa-cog' }, + 'completed': { text: '완료됨', class: 'bg-green-100 text-green-700', icon: 'fas fa-check-circle' }, + 'disposed': { text: '폐기됨', class: 'bg-gray-100 text-gray-700', icon: 'fas fa-trash' } + }; + + const config = statusConfig[status] || statusConfig['pending_review']; + return ` + ${config.text} + `; + } + // 부적합 사항 카드 생성 함수 (조회용) function createIssueCard(issue, isCompleted) { const categoryNames = { @@ -740,10 +770,7 @@
- ${isCompleted ? - '
검토완료
' : - '
검토필요
' - } + ${getWorkflowStatusBadge(issue)}
${projectInfo}