From a01a43a7ae5a0480fdf585bfc2131ce6bf8c89e9 Mon Sep 17 00:00:00 2001 From: sangkyu39 Date: Sun, 22 Mar 2026 14:27:22 +0900 Subject: [PATCH 1/4] =?UTF-8?q?[FE]=20=EC=84=B8=EC=85=98=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20=EB=B0=8F=20=EC=88=98=EC=A0=95=20=EC=BC=80=EB=B0=A5?= =?UTF-8?q?=20=EC=95=88=20=EC=97=B4=EB=A6=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SessionManagementCard.jsx | 16 +++++++ .../SessionManagementCard.module.css | 46 +++++++++++++++---- 2 files changed, 52 insertions(+), 10 deletions(-) diff --git a/frontend/src/components/attendancemanage/SessionManagementCard.jsx b/frontend/src/components/attendancemanage/SessionManagementCard.jsx index 8dd35ffa..91e7f1f9 100644 --- a/frontend/src/components/attendancemanage/SessionManagementCard.jsx +++ b/frontend/src/components/attendancemanage/SessionManagementCard.jsx @@ -20,6 +20,18 @@ const formatDate = (dateStr) => { return `${month}/${day}`; }; +const isSessionOwnerPermissionError = (error) => { + const status = error?.status ?? error?.response?.status; + const errorCode = error?.data?.errorCode ?? error?.response?.data?.errorCode; + const message = + error?.message ?? error?.data?.message ?? error?.response?.data?.message ?? ''; + return ( + status === 403 && + (errorCode === 'NOT_SESSION_OWNER' || + String(message).includes('세션 소유자 권한이 없습니다')) + ); +}; + const SessionManagementCard = ({ styles: commonStyles }) => { const { sessions, @@ -97,6 +109,10 @@ const SessionManagementCard = ({ styles: commonStyles }) => { toast.success('세션이 삭제되었습니다.'); } } catch (error) { + if (isSessionOwnerPermissionError(error)) { + alert('세션 소유자 권한이 없어 삭제할 수 없습니다.'); + return; + } toast.error('세션 삭제에 실패했습니다.'); } }} diff --git a/frontend/src/components/attendancemanage/SessionManagementCard.module.css b/frontend/src/components/attendancemanage/SessionManagementCard.module.css index 3cde0d5f..a15ba3ce 100644 --- a/frontend/src/components/attendancemanage/SessionManagementCard.module.css +++ b/frontend/src/components/attendancemanage/SessionManagementCard.module.css @@ -598,21 +598,28 @@ } .qrButton { - width: 86px; + background: linear-gradient(99.86deg, #b3ebff -15.44%, #91c3ff 39.86%, #d3edff 94.81%); + width: 89px; height: 40px; - border-radius: 10px; - padding: 0; + border-radius: 8px; + padding: 12px 26px; + gap: 10px; + display: flex; + justify-content: center; + align-items: center; border: none; - background: linear-gradient(180deg, #b8ddff 0%, #9dc9f9 100%); - color: #2a3340; - font-size: 15px; - font-weight: 700; - box-shadow: none; + cursor: pointer; + box-sizing: border-box; + font-family: Inter, Pretendard, sans-serif; + font-weight: 600; + font-size: 14px; + color: #111827; + transition: opacity 0.2s, transform 0.2s; } .qrButton:hover { - opacity: 0.95; - transform: none; + opacity: 0.9; + transform: translateY(-1px); } .menuButton { @@ -690,3 +697,22 @@ justify-content: flex-end; } } + +/* Keep dropdown menu visible above table and card clipping */ +.sessionManagementCardContainer { + overflow: visible; +} + +.headerControls { + overflow: visible; +} + +.menuWrapper { + position: relative; + z-index: 30; + flex-shrink: 0; +} + +.dropdownMenu { + z-index: 1000; +} From 4c3228d2f450ad355d4ed96a1d6aadbc7d349288 Mon Sep 17 00:00:00 2001 From: sangkyu39 Date: Sun, 22 Mar 2026 14:34:39 +0900 Subject: [PATCH 2/4] =?UTF-8?q?[FE]=20=EC=84=B8=EC=85=98=20=EB=9D=BC?= =?UTF-8?q?=EC=9A=B4=EB=93=9C=20=EA=B4=80=EB=A6=AC=20=EC=8B=9C=20=EC=8B=9C?= =?UTF-8?q?=EC=9E=91=EC=8B=9C=EA=B0=84=EA=B3=BC=20=EC=A2=85=EB=A3=8C?= =?UTF-8?q?=EC=8B=9C=EA=B0=84=EC=9D=B4=20=EB=B3=B4=EC=9D=B4=EA=B2=8C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../attendancemanage/SessionManagementCard.jsx | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/frontend/src/components/attendancemanage/SessionManagementCard.jsx b/frontend/src/components/attendancemanage/SessionManagementCard.jsx index 91e7f1f9..0a3a4463 100644 --- a/frontend/src/components/attendancemanage/SessionManagementCard.jsx +++ b/frontend/src/components/attendancemanage/SessionManagementCard.jsx @@ -206,8 +206,8 @@ const SessionManagementCard = ({ styles: commonStyles }) => { 일자 - 시간 - 가능(분) + 시작시간 + 종료시간 회차 QR 코드 @@ -218,7 +218,6 @@ const SessionManagementCard = ({ styles: commonStyles }) => { currentDisplayedRounds.map((round, index) => { const startTime = new Date(round.startAt); const closeTime = new Date(round.closeAt); - const minutes = Math.floor((closeTime - startTime) / 60000); return ( @@ -229,7 +228,12 @@ const SessionManagementCard = ({ styles: commonStyles }) => { minute: '2-digit', })} - {minutes} + + {closeTime.toLocaleTimeString([], { + hour: '2-digit', + minute: '2-digit', + })} + {index + 1} - + + + {isFeedbackModalOpen && ( +