From 11692b4a91f8a559edf1f7705ada80d11e993a47 Mon Sep 17 00:00:00 2001 From: Hyungi Ahn Date: Sat, 25 Oct 2025 13:36:56 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EB=B6=80=EC=A0=81=ED=95=A9=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=ED=8E=98=EC=9D=B4=EC=A7=80=EB=A5=BC=20=EC=83=88?= =?UTF-8?q?=EB=A1=9C=EC=9A=B4=20=EC=9B=8C=ED=81=AC=ED=94=8C=EB=A1=9C?= =?UTF-8?q?=EC=9A=B0=20=EC=8B=9C=EC=8A=A4=ED=85=9C=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit πŸ”„ Workflow Status System Integration: - κΈ°μ‘΄ 'κ²€ν†  μƒνƒœ' β†’ 'μ›Œν¬ν”Œλ‘œμš° μƒνƒœ'둜 λ³€κ²½ - 4단계 μ›Œν¬ν”Œλ‘œμš° 지원: μˆ˜μ‹ ν•¨, 관리함(진행쀑), 관리함(μ™„λ£Œ), 폐기함 - κΈ°μ‘΄ λ°μ΄ν„°μ™€μ˜ ν˜Έν™˜μ„± μœ μ§€ (폴백 둜직) πŸ“‹ Filter Updates: - issue-view.html: μ›Œν¬ν”Œλ‘œμš° μƒνƒœ ν•„ν„° μΆ”κ°€ - index.html: λͺ©λ‘ μ„Ήμ…˜ μ›Œν¬ν”Œλ‘œμš° μƒνƒœ ν•„ν„° μΆ”κ°€ - 4개 μƒνƒœλ³„ 필터링: pending_review, in_progress, completed, disposed 🎨 Visual Enhancements: - μ›Œν¬ν”Œλ‘œμš° μƒνƒœλ³„ λ°°μ§€ μ‹œμŠ€ν…œ κ΅¬ν˜„ - μ•„μ΄μ½˜ 및 색상 μ½”λ”©: μˆ˜μ‹ ν•¨(μ£Όν™©), 진행쀑(νŒŒλž‘), μ™„λ£Œ(녹색), 폐기(νšŒμƒ‰) - μƒνƒœλ³„ κ·Έλ£Ήν™” ν‘œμ‹œ κ°œμ„  πŸ”§ Technical Implementation: - getWorkflowStatusBadge() ν•¨μˆ˜ μΆ”κ°€ - review_status ν•„λ“œ 기반 필터링 - κΈ°μ‘΄ isReviewCompleted() ν•¨μˆ˜μ™€ ν˜Έν™˜μ„± μœ μ§€ - μƒνƒœλ³„ λΆ„λ₯˜ 둜직 κ°œμ„  πŸ“Š Status Configuration: - pending_review: μˆ˜μ‹ ν•¨ (κ²€ν†  λŒ€κΈ°) - fas fa-inbox - in_progress: 관리함 (μ§„ν–‰ 쀑) - fas fa-cog - completed: 관리함 (μ™„λ£Œλ¨) - fas fa-check-circle - disposed: 폐기함 (폐기됨) - fas fa-trash πŸ”„ Backward Compatibility: - κΈ°μ‘΄ 데이터 μžλ™ λ§€ν•‘ - 점진적 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 지원 - 였λ₯˜ μ—†λŠ” μƒνƒœ μ „ν™˜ Expected Result: βœ… 뢀적합 μ‘°νšŒμ—μ„œ 4단계 μ›Œν¬ν”Œλ‘œμš° μƒνƒœ 확인 κ°€λŠ₯ βœ… μˆ˜μ‹ ν•¨/관리함/폐기함별 필터링 지원 βœ… μ‹œκ°μ μœΌλ‘œ κ΅¬λΆ„λ˜λŠ” μƒνƒœ λ°°μ§€ ν‘œμ‹œ βœ… κΈ°μ‘΄ 데이터와 μƒˆ μ‹œμŠ€ν…œ λͺ¨λ‘ ν˜Έν™˜ --- frontend/index.html | 44 +++++++++++---- frontend/issue-view.html | 115 ++++++++++++++++++++++++--------------- 2 files changed, 104 insertions(+), 55 deletions(-) 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}