From 7caf36c8569bbd0b717441f076e9e49f3c71c5e1 Mon Sep 17 00:00:00 2001 From: Hyungi Ahn Date: Sun, 26 Oct 2025 12:36:35 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EA=B4=80=EB=A6=AC=ED=95=A8=20=EC=A7=84?= =?UTF-8?q?=ED=96=89=EC=A4=91=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=20=EB=82=B4=EC=9A=A9=20=ED=8E=B8=EC=A7=91=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit πŸ“ 상세 λ‚΄μš© 인라인 νŽΈμ§‘ μ‹œμŠ€ν…œ: 🎨 ν”„λ‘ νŠΈμ—”λ“œ UI κ°œμ„ : - 상세 λ‚΄μš© μ„Ήμ…˜μ— 'μˆ˜μ •' λ²„νŠΌ μΆ”κ°€ - 읽기 λͺ¨λ“œ ↔ νŽΈμ§‘ λͺ¨λ“œ ν† κΈ€ κΈ°λŠ₯ - νŽΈμ§‘ μ‹œ ν…μŠ€νŠΈ μ˜μ—­μœΌλ‘œ μ „ν™˜ - μ·¨μ†Œ/μ €μž₯ λ²„νŠΌμœΌλ‘œ νŽΈμ§‘ μ œμ–΄ - μ‹€μ‹œκ°„ UI μ—…λ°μ΄νŠΈ πŸ”§ λ°±μ—”λ“œ API ν™•μž₯: - PUT /api/management/{issue_id} μ—”λ“œν¬μΈνŠΈ μΆ”κ°€ - ManagementUpdateRequest에 final_description ν•„λ“œ μΆ”κ°€ - 진행쀑 μƒνƒœ 이슈만 μˆ˜μ • κ°€λŠ₯ν•˜λ„λ‘ μ œν•œ - κΆŒν•œ 검증 및 였λ₯˜ 처리 πŸ’‘ 핡심 κΈ°λŠ₯: - 뢀적합λͺ…은 μœ μ§€ν•˜κ³  상세 λ‚΄μš©λ§Œ μˆ˜μ • - μˆ˜μ‹ ν•¨μ—μ„œ μž…λ ₯ν•œ 상세 뢀뢄을 κ΄€λ¦¬ν•¨μ—μ„œ 보완 κ°€λŠ₯ - 원본 데이터와 μˆ˜μ • 데이터 μžλ™ κ²°ν•© - μ‹€μ‹œκ°„ μ €μž₯ 및 ν™”λ©΄ 반영 πŸ” λ³΄μ•ˆ 및 μ œν•œμ‚¬ν•­: - 관리함 νŽ˜μ΄μ§€ κΆŒν•œ ν•„μš” - 진행쀑 μƒνƒœ 이슈만 νŽΈμ§‘ κ°€λŠ₯ - μ™„λ£Œλœ μ΄μŠˆλŠ” νŽΈμ§‘ λΆˆκ°€ - μ‚¬μš©μž 인증 및 κΆŒν•œ 검증 🎯 μ‚¬μš© μ‹œλ‚˜λ¦¬μ˜€: 1. 관리함 진행쀑 νƒ­μ—μ„œ 'μˆ˜μ •' λ²„νŠΌ 클릭 2. ν…μŠ€νŠΈ μ˜μ—­μ—μ„œ 상세 λ‚΄μš© νŽΈμ§‘ 3. μ €μž₯ μ‹œ 뢀적합λͺ…κ³Ό μžλ™ κ²°ν•© 4. μ‹€μ‹œκ°„μœΌλ‘œ 화면에 반영 Expected Result: βœ… μˆ˜μ‹ ν•¨ κ²€ν†  ν›„ κ΄€λ¦¬ν•¨μ—μ„œ 상세 λ‚΄μš© 보완 κ°€λŠ₯ βœ… 직관적인 인라인 νŽΈμ§‘ μΈν„°νŽ˜μ΄μŠ€ βœ… 데이터 일관성 μœ μ§€ (뢀적합λͺ… + 상세 λ‚΄μš©) βœ… μ•ˆμ „ν•œ κΆŒν•œ 기반 νŽΈμ§‘ μ œμ–΄ --- .../__pycache__/schemas.cpython-311.pyc | Bin 19110 -> 19167 bytes backend/database/schemas.py | 1 + .../__pycache__/management.cpython-311.pyc | Bin 5395 -> 7090 bytes backend/routers/management.py | 41 ++++++ frontend/issues-management.html | 119 +++++++++++++++++- 5 files changed, 157 insertions(+), 4 deletions(-) diff --git a/backend/database/__pycache__/schemas.cpython-311.pyc b/backend/database/__pycache__/schemas.cpython-311.pyc index 7010336391b5e9acab6519d1c61db09ea3827c63..0470dc23e06881e8259fb1e1843e65e4486f6a85 100644 GIT binary patch delta 359 zcmZ2BmGS;mM&9MTyj%=GpgsL>#*K}4>n_Q+*D;Fh@%9_e136chbRQ41u z8z3u%DVRZ%d-8XUGWMcYAYW5(a=vCDW9wu_YvIY~HTf71O}?kOO8SPn_5~Kv2^9;N zr_^3x0kX9(f=M7_bDvfKBjc{k_qFAj7|%}ruUpG_U~{eBM@GgAlQ$ZRZf-FMWMsTK z`I_M=#=Dyr8u2qSKG?j`IE|6<&14DFX!a*SON&bwCNGqi*gVN}4kP1-$@=D}7{6`) zWiHRi_!Gzx-K=jpiIIt&ak8YT-sF!~I*k7|%UN49GIDQ@vSDLnW-gCHZL_T(3iVT`Jq f?VYBwYH=`Xe_+5QW@LT@iGD#yiERGo{*Va(&i7+u diff --git a/backend/database/schemas.py b/backend/database/schemas.py index 5ed5f6d..711143f 100644 --- a/backend/database/schemas.py +++ b/backend/database/schemas.py @@ -181,6 +181,7 @@ class ManagementUpdateRequest(BaseModel): cause_department: Optional[DepartmentType] = None # μ›μΈλΆ€μ„œ management_comment: Optional[str] = None # ISSUE에 λŒ€ν•œ 의견 completion_photo: Optional[str] = None # μ™„λ£Œ 사진 (Base64) + final_description: Optional[str] = None # μ΅œμ’… λ‚΄μš© (뢀적합λͺ… + 상세 λ‚΄μš©) class AdditionalInfoUpdateRequest(BaseModel): """μΆ”κ°€ 정보 μ—…λ°μ΄νŠΈ μš”μ²­ (관리함 μ§„ν–‰μ€‘μ—μ„œ μ‚¬μš©)""" diff --git a/backend/routers/__pycache__/management.cpython-311.pyc b/backend/routers/__pycache__/management.cpython-311.pyc index 18b93b2c16f78258ab2e7f8ec8239fc1c28353be..783d4e60090ab17611c6ec98ffac9b3c9cf6af9b 100644 GIT binary patch delta 1133 zcmZXT-ESL35Ww$pzK{6M7soaB#UZIpVpqnrQK4!H#DTU!`EU!7T2)nrWJS3RNr~;S zcc&sqAe10X3c}GQN*)R_QkAv>L5hRa$Nm94*pa0~R~7PDup^8RFMJ4gY)X;XyZ!C# z%A@e`7+E%58~+~;t(J}z`1e_nfdV6d(2e=ePR;0zOOFZ4HYd|d8%bILF*l$_G% zZ0Uh$tJaJ@W}+lUuUW`2#~lw6&{d%GT{?exqwukKoAr0R+{7?*!kjoO=<=&nW*E$V zsF2a-F0ONyBX=C#0?W*Dd6m{hesA`+E3=M^Ecn4N_cvDHMK=kx`1*9$RgRXZT1TkP z8KmRK&H2ju7keu=s;jx`!qs5)lg;X4HdxKCR0^BH>gs!yk2a`oZ}B$CIfuj_ax}aZ zC*M0G!`U_JwYQQFRZjT2;y0Bm*~*n`htA$)Z5MideA?1c(n=f1wB6&G)XX$8 zr!wi}%w)#QSVw6Ijcnwse7J+N#S}7(u~!g2L@lC7c^UP*K*|FpK=Ydk=0U340QwBq~pnP-0Wk)O_$TUxZF#mZW&#yI$J9UmxJK5OmB z?xHucB}a;KWLNRtlUj0o&RRnyskAC|m(w-Tp$Ig39lU@KlDHTuOp3=j7d}kC1V0IQiXnHM=XeY^NKVKD zE%+Fyp=bDM(Bt??d;mY-dBAbN3BXATl2c-Qf(oY!ca$6_4}oErBI=?S*m<;3)oIXzJAM)H z65yeyqmk@CdB|7p1N8b{Y%Z>+|HlKvX}H4!9@P0pU5Y{D6~<%j*(Gt@-jw6Mv2LR93qob810q$Q+ZPa zQd!g3Qp8$VmjN}b2I&HWDA^S8Un>% zUSe+QWGNo+$)|-RSY3fSlsCT+n!wCv17sH2POcMEkv9i1-9dy4i0}Xro*)9M=Af7; zqvPc3V(P43KvBQR%;MJ>
-
- - +
+
+ + +
+
-
+
${getIssueDetail(issue)}
+
@@ -1524,6 +1543,98 @@ alert('μ €μž₯ 쀑 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.'); } }); + + // 상세 λ‚΄μš© νŽΈμ§‘ κ΄€λ ¨ ν•¨μˆ˜λ“€ + function toggleDetailEdit(issueId) { + const displayDiv = document.getElementById(`detail-display-${issueId}`); + const editDiv = document.getElementById(`detail-edit-${issueId}`); + + if (displayDiv && editDiv) { + displayDiv.classList.add('hidden'); + editDiv.classList.remove('hidden'); + + // ν…μŠ€νŠΈ μ˜μ—­μ— 포컀슀 + const textarea = document.getElementById(`detail-textarea-${issueId}`); + if (textarea) { + textarea.focus(); + } + } + } + + function cancelDetailEdit(issueId) { + const displayDiv = document.getElementById(`detail-display-${issueId}`); + const editDiv = document.getElementById(`detail-edit-${issueId}`); + + if (displayDiv && editDiv) { + displayDiv.classList.remove('hidden'); + editDiv.classList.add('hidden'); + + // μ›λž˜ κ°’μœΌλ‘œ 볡원 + const issue = allIssues.find(i => i.id === issueId); + if (issue) { + const textarea = document.getElementById(`detail-textarea-${issueId}`); + if (textarea) { + textarea.value = getIssueDetail(issue); + } + } + } + } + + async function saveDetailEdit(issueId) { + const textarea = document.getElementById(`detail-textarea-${issueId}`); + if (!textarea) return; + + const newDetailContent = textarea.value.trim(); + + try { + // ν˜„μž¬ 이슈 정보 κ°€μ Έμ˜€κΈ° + const issue = allIssues.find(i => i.id === issueId); + if (!issue) { + alert('이슈 정보λ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€.'); + return; + } + + // 뢀적합λͺ…κ³Ό μƒˆλ‘œμš΄ 상세 λ‚΄μš©μ„ κ²°ν•© + const issueTitle = getIssueTitle(issue); + const combinedDescription = issueTitle + (newDetailContent ? '\n' + newDetailContent : ''); + + const response = await fetch(`/api/management/${issueId}`, { + method: 'PUT', + headers: { + 'Authorization': `Bearer ${localStorage.getItem('access_token')}`, + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + final_description: combinedDescription + }) + }); + + if (response.ok) { + // 성곡 μ‹œ 이슈 데이터 μ—…λ°μ΄νŠΈ + issue.final_description = combinedDescription; + + // ν‘œμ‹œ μ˜μ—­ μ—…λ°μ΄νŠΈ + const displayDiv = document.getElementById(`detail-display-${issueId}`); + if (displayDiv) { + const contentDiv = displayDiv.querySelector('div'); + if (contentDiv) { + contentDiv.textContent = newDetailContent || '상세 λ‚΄μš© μ—†μŒ'; + } + } + + // νŽΈμ§‘ λͺ¨λ“œ μ’…λ£Œ + cancelDetailEdit(issueId); + + alert('상세 λ‚΄μš©μ΄ μ„±κ³΅μ μœΌλ‘œ μ €μž₯λ˜μ—ˆμŠ΅λ‹ˆλ‹€.'); + } else { + const error = await response.json(); + alert(`μ €μž₯ μ‹€νŒ¨: ${error.detail || 'μ•Œ 수 μ—†λŠ” 였λ₯˜'}`); + } + } catch (error) { + console.error('상세 λ‚΄μš© μ €μž₯ μ‹€νŒ¨:', error); + alert('μ €μž₯ 쀑 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.'); + } + }