From f7a6d3153e5f44c49f9d79bba768604216ee7eda Mon Sep 17 00:00:00 2001 From: kkw610 Date: Sun, 21 Jun 2026 15:45:33 +0900 Subject: [PATCH 1/3] =?UTF-8?q?fix:=20=EB=AA=85=EC=98=88=EC=9D=98=20?= =?UTF-8?q?=EC=A0=84=EB=8B=B9=20=ED=86=A0=EA=B8=80=20UI=20=EB=B0=8F=20?= =?UTF-8?q?=EC=88=98=EC=A0=95/=EC=A0=80=EC=9E=A5/=EC=B7=A8=EC=86=8C=20?= =?UTF-8?q?=ED=9D=90=EB=A6=84=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/pages/curriculum/CurriculumPage.js | 91 +++++++++++++------ .../curriculum/CurriculumPage.module.css | 70 ++++++++++++-- 2 files changed, 126 insertions(+), 35 deletions(-) diff --git a/frontend/src/pages/curriculum/CurriculumPage.js b/frontend/src/pages/curriculum/CurriculumPage.js index 2d68bf6..aa0595a 100644 --- a/frontend/src/pages/curriculum/CurriculumPage.js +++ b/frontend/src/pages/curriculum/CurriculumPage.js @@ -331,6 +331,8 @@ function CrownIcon() { function HonorOfFame({ isAdmin }) { const [mvp, setMvp] = useState(null); const [form, setForm] = useState(null); + const [isOpen, setIsOpen] = useState(false); + const [isEditing, setIsEditing] = useState(false); const [saving, setSaving] = useState(false); const fetchMvp = async () => { @@ -352,6 +354,16 @@ function HonorOfFame({ isAdmin }) { ]; const filledEntries = entries.filter(e => mvp[e.key] && mvp[e.key].trim()); + const handleEditStart = () => { + setForm(mvp); + setIsEditing(true); + }; + + const handleCancel = () => { + setForm(mvp); + setIsEditing(false); + }; + const handleSave = async () => { setSaving(true); try { @@ -360,6 +372,7 @@ function HonorOfFame({ isAdmin }) { body: JSON.stringify(form), }); await fetchMvp(); + setIsEditing(false); } catch (e) { } finally { setSaving(false); @@ -368,38 +381,60 @@ function HonorOfFame({ isAdmin }) { return (
-
- - 과제 MVP 명예의 전당 - +
setIsOpen(p => !p)}> +
+ + 과제 MVP 명예의 전당 + +
+ toggle
+
- {!isAdmin && filledEntries.length > 0 && ( -
- {filledEntries.map(e => ( -
- {e.label}: {mvp[e.key]} -
- ))} -
- )} + {isOpen && ( +
+ {!isEditing && ( + <> + {filledEntries.length > 0 ? ( +
+ {filledEntries.map(e => ( +
+ {e.label}: {mvp[e.key]} +
+ ))} +
+ ) : ( +
아직 등록된 MVP가 없어요.
+ )} + {isAdmin && ( + + )} + + )} - {isAdmin && ( -
- {entries.map(e => ( -
- - setForm({ ...form, [e.key]: ev.target.value })} - /> + {isAdmin && isEditing && ( +
+ {entries.map(e => ( +
+ + setForm({ ...form, [e.key]: ev.target.value })} + /> +
+ ))} +
+ + +
- ))} - + )}
)}
diff --git a/frontend/src/pages/curriculum/CurriculumPage.module.css b/frontend/src/pages/curriculum/CurriculumPage.module.css index 666dc18..8bb2ab5 100644 --- a/frontend/src/pages/curriculum/CurriculumPage.module.css +++ b/frontend/src/pages/curriculum/CurriculumPage.module.css @@ -65,20 +65,30 @@ border: 1px solid #eee; border-radius: 20px; box-shadow: 0 1px 4px rgba(0,0,0,0.06); - display: flex; - flex-direction: column; - align-items: center; - text-align: center; box-sizing: border-box; } +.honorHeader { + display: grid; + grid-template-columns: 14px 1fr 14px; + align-items: center; + gap: 10px; + cursor: pointer; +} + .honorTitleRow { + grid-column: 2; display: flex; align-items: center; justify-content: center; gap: 10px; } +.honorHeader .toggleIcon { + grid-column: 3; + justify-self: end; +} + .crownIcon { width: 22px; height: 22px; @@ -93,12 +103,18 @@ color: var(--black); } +.honorBody { + display: flex; + flex-direction: column; + align-items: center; + text-align: center; +} + .honorList { display: flex; flex-direction: column; align-items: center; gap: 6px; - margin-top: 16px; } .honorItem { @@ -113,12 +129,32 @@ color: var(--dark); } +.honorEmpty { + font-family: var(--font-main); + font-size: 0.9rem; + color: #aaa; +} + +.honorEditBtn { + margin-top: 14px; + padding: 6px 24px; + background: transparent; + border: 1.5px solid var(--dark); + border-radius: 10px; + color: var(--dark); + font-family: var(--font-main); + font-size: 0.85rem; + cursor: pointer; + transition: all 0.2s; +} + +.honorEditBtn:hover { background: var(--dark); color: var(--white); } + .honorEditList { display: flex; flex-direction: column; align-items: stretch; gap: 10px; - margin-top: 20px; width: 100%; max-width: 360px; } @@ -151,8 +187,15 @@ .honorEditInput:focus { border-color: var(--dark); } +.honorEditBtns { + display: flex; + align-items: center; + justify-content: center; + gap: 10px; + margin-top: 10px; +} + .honorSaveBtn { - margin: 10px auto 0; padding: 8px 30px; background: transparent; border: 1.5px solid var(--dark); @@ -168,6 +211,19 @@ .honorSaveBtn:hover { background: var(--dark); color: var(--white); } .honorSaveBtn:disabled { opacity: 0.6; cursor: default; } +.honorCancelBtn { + padding: 8px 24px; + background: transparent; + border: none; + color: #aaa; + font-family: var(--font-main); + font-size: 0.9rem; + cursor: pointer; +} + +.honorCancelBtn:hover { color: #777; } +.honorCancelBtn:disabled { opacity: 0.6; cursor: default; } + /* 카드 행 */ .cardsRow { margin: 0 auto; From 0ca0de5562a37cd3e655f311d257822e3feac806 Mon Sep 17 00:00:00 2001 From: kkw610 Date: Sun, 21 Jun 2026 15:58:54 +0900 Subject: [PATCH 2/3] =?UTF-8?q?style:=20=EB=AC=B8=EA=B5=AC=20=EB=B0=8F=20?= =?UTF-8?q?=EB=B2=84=ED=8A=BC=20=ED=81=AC=EA=B8=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/pages/curriculum/CurriculumPage.js | 2 +- .../curriculum/CurriculumPage.module.css | 36 ++++++++++++------- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/frontend/src/pages/curriculum/CurriculumPage.js b/frontend/src/pages/curriculum/CurriculumPage.js index aa0595a..3454589 100644 --- a/frontend/src/pages/curriculum/CurriculumPage.js +++ b/frontend/src/pages/curriculum/CurriculumPage.js @@ -404,7 +404,7 @@ function HonorOfFame({ isAdmin }) { ))}
) : ( -
아직 등록된 MVP가 없어요.
+
아직 등록된 MVP가 없어요
)} {isAdmin && ( diff --git a/frontend/src/pages/curriculum/CurriculumPage.module.css b/frontend/src/pages/curriculum/CurriculumPage.module.css index 8bb2ab5..86cd44f 100644 --- a/frontend/src/pages/curriculum/CurriculumPage.module.css +++ b/frontend/src/pages/curriculum/CurriculumPage.module.css @@ -137,7 +137,7 @@ .honorEditBtn { margin-top: 14px; - padding: 6px 24px; + padding: 6px 20px; background: transparent; border: 1.5px solid var(--dark); border-radius: 10px; @@ -145,10 +145,13 @@ font-family: var(--font-main); font-size: 0.85rem; cursor: pointer; - transition: all 0.2s; } -.honorEditBtn:hover { background: var(--dark); color: var(--white); } +.honorEditBtn:hover { + background: var(--dark); + color: var(--white); + transition: all ease-in-out 0.2s; +} .honorEditList { display: flex; @@ -196,32 +199,39 @@ } .honorSaveBtn { - padding: 8px 30px; + padding: 6px 20px; background: transparent; border: 1.5px solid var(--dark); border-radius: 10px; color: var(--dark); font-family: var(--font-main); - font-size: 0.9rem; - font-weight: 600; + font-size: 0.85rem; cursor: pointer; - transition: all 0.2s; } -.honorSaveBtn:hover { background: var(--dark); color: var(--white); } +.honorSaveBtn:hover { + background: var(--dark); + color: var(--white); + transition: all ease-in-out 0.2s; +} .honorSaveBtn:disabled { opacity: 0.6; cursor: default; } .honorCancelBtn { - padding: 8px 24px; + padding: 6px 20px; background: transparent; - border: none; - color: #aaa; + border: 1.5px solid var(--dark); + border-radius: 10px; + color: var(--dark); font-family: var(--font-main); - font-size: 0.9rem; + font-size: 0.85rem; cursor: pointer; } -.honorCancelBtn:hover { color: #777; } +.honorCancelBtn:hover { + background: var(--dark); + color: var(--white); + transition: all ease-in-out 0.2s; +} .honorCancelBtn:disabled { opacity: 0.6; cursor: default; } /* 카드 행 */ From a9dfd4e1b9c9edac075695b6a53fb19e354853f3 Mon Sep 17 00:00:00 2001 From: kkw610 Date: Sun, 21 Jun 2026 16:03:19 +0900 Subject: [PATCH 3/3] =?UTF-8?q?style:=20=EC=B7=A8=EC=86=8C=20=EB=B2=84?= =?UTF-8?q?=ED=8A=BC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/pages/curriculum/CurriculumPage.module.css | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/frontend/src/pages/curriculum/CurriculumPage.module.css b/frontend/src/pages/curriculum/CurriculumPage.module.css index 86cd44f..430e1e1 100644 --- a/frontend/src/pages/curriculum/CurriculumPage.module.css +++ b/frontend/src/pages/curriculum/CurriculumPage.module.css @@ -219,19 +219,14 @@ .honorCancelBtn { padding: 6px 20px; background: transparent; - border: 1.5px solid var(--dark); - border-radius: 10px; - color: var(--dark); + border: none; + color: #aaa; font-family: var(--font-main); font-size: 0.85rem; cursor: pointer; } -.honorCancelBtn:hover { - background: var(--dark); - color: var(--white); - transition: all ease-in-out 0.2s; -} +.honorCancelBtn:hover { color: #777; } .honorCancelBtn:disabled { opacity: 0.6; cursor: default; } /* 카드 행 */