Skip to content

Commit dd392d2

Browse files
authored
[FE] 314 기능개선전체 전반적 fe uiux 개선 (#315)
* [FE] 출석 관리 페이지 디자인 수정 * [FE] 출석 조회 가로 스크롤 추가 * [FE] 모달이 사이드바에 가려지는 문제 해결, 비밀번호 입력 시 확인 기능 추가 등 * [FE] 사이드바 출석 관리 페이지 권한 조정 * [FE] 회원가입 시 비밀번호 확인 일치 여부 확인 * [FE] PR 요구사항 - 모바일 화면 css 개선 * [FE] 세션 유저 추가 시 팀 필터링 및 리스트 페이징 * [FE] 세션별 유저 관리에서 유저 권한 조정 및 삭제 시 취소 버튼 안되는 오류 수정
1 parent 9d755ea commit dd392d2

28 files changed

+722
-147
lines changed

frontend/src/components/AdminMemberApproval/AdminMemberApproval.module.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@
230230
display: flex;
231231
align-items: center;
232232
justify-content: center;
233-
z-index: 100;
233+
z-index: 3000;
234234
}
235235

236236
.modalCard {

frontend/src/components/AdminMemberManage/AdminMemberManage.module.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@
232232
display: flex;
233233
align-items: center;
234234
justify-content: center;
235-
z-index: 1000;
235+
z-index: 3000;
236236
}
237237

238238
.modalCard {

frontend/src/components/Board/CreateSubBoardModal.module.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
display: flex;
99
justify-content: center;
1010
align-items: center;
11-
z-index: 1000;
11+
z-index: 3000;
1212
padding: 20px;
1313
}
1414

frontend/src/components/Board/Modal.module.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
display: flex;
99
align-items: center;
1010
justify-content: center;
11-
z-index: 1200;
11+
z-index: 3000;
1212
}
1313

1414
.modal {

frontend/src/components/Board/PostDetail/CommentSection.jsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,9 @@ const CommentItem = ({
5858
<div className={styles.menuContainer}>
5959
<button
6060
className={styles.menuButton}
61-
onClick={() => setShowCommentMenu(commentId)}
61+
onClick={() =>
62+
setShowCommentMenu((prev) => (prev === commentId ? null : commentId))
63+
}
6264
aria-label="댓글 메뉴"
6365
>
6466

frontend/src/components/LoginAndSignUpForm.module.css

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,39 @@
7676
box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25);
7777
}
7878

79+
.inputWithToggle {
80+
position: relative;
81+
}
82+
83+
.inputWithToggle input {
84+
padding-right: 46px;
85+
}
86+
87+
.passwordToggleButton {
88+
position: absolute;
89+
top: 50%;
90+
right: 10px;
91+
transform: translateY(-50%);
92+
border: none;
93+
background: transparent;
94+
color: #4b5563;
95+
cursor: pointer;
96+
padding: 4px;
97+
width: 28px;
98+
height: 28px;
99+
display: inline-flex;
100+
align-items: center;
101+
justify-content: center;
102+
}
103+
104+
.passwordToggleButton:hover {
105+
color: #111827;
106+
}
107+
108+
.passwordToggleButton svg {
109+
pointer-events: none;
110+
}
111+
79112
.loginButton {
80113
width: 100%;
81114
padding: 12px;
@@ -174,6 +207,20 @@
174207
color: #28a745;
175208
}
176209

210+
.passwordMatchMessage {
211+
margin: 8px 0 0 8px;
212+
font-size: 13px;
213+
line-height: 1.4;
214+
}
215+
216+
.passwordMatchMessageSuccess {
217+
color: #28a745;
218+
}
219+
220+
.passwordMatchMessageError {
221+
color: #e03131;
222+
}
223+
177224
.radioGroup {
178225
margin-bottom: 12px;
179226
text-align: left;

frontend/src/components/Sidebar.jsx

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@ import { isAllBoardName, normalizeBoardPath, toBoardPath } from '../utils/boardR
1010
import DropdownArrowIcon from '../assets/boardSelectArrow.svg';
1111

1212
const ADMIN_VISIBLE_ROLES = ['SYSTEM_ADMIN', 'PRESIDENT'];
13+
const ATTENDANCE_MANAGE_VISIBLE_ROLES = [
14+
'SYSTEM_ADMIN',
15+
'PRESIDENT',
16+
'VICE_PRESIDENT',
17+
'TEAM_LEADER',
18+
];
1319

1420
const Sidebar = ({ isOpen, isRoot, onClose }) => {
1521
const nav = useNavigate();
@@ -19,6 +25,7 @@ const Sidebar = ({ isOpen, isRoot, onClose }) => {
1925
const [isBoardMenuOpen, setIsBoardMenuOpen] = useState(false);
2026
const { isLoggedIn, logout } = useAuth();
2127
const [canSeeAdminMenu, setCanSeeAdminMenu] = useState(false);
28+
const [canSeeAttendanceManageMenu, setCanSeeAttendanceManageMenu] = useState(false);
2229

2330
useEffect(() => {
2431
const loadParentBoards = async () => {
@@ -64,15 +71,20 @@ const Sidebar = ({ isOpen, isRoot, onClose }) => {
6471
const checkAdminRole = async () => {
6572
if (!isLoggedIn) {
6673
setCanSeeAdminMenu(false);
74+
setCanSeeAttendanceManageMenu(false);
6775
return;
6876
}
6977

7078
try {
7179
const { data } = await api.get('/api/user/details');
7280
const normalizedRole = String(data?.role || '').trim().toUpperCase();
7381
setCanSeeAdminMenu(ADMIN_VISIBLE_ROLES.includes(normalizedRole));
82+
setCanSeeAttendanceManageMenu(
83+
ATTENDANCE_MANAGE_VISIBLE_ROLES.includes(normalizedRole)
84+
);
7485
} catch {
7586
setCanSeeAdminMenu(false);
87+
setCanSeeAttendanceManageMenu(false);
7688
}
7789
};
7890

@@ -188,17 +200,19 @@ const Sidebar = ({ isOpen, isRoot, onClose }) => {
188200
출석조회
189201
</NavLink>
190202
</li>
191-
<li>
192-
<NavLink
193-
to="/attendance-manage"
194-
className={({ isActive }) =>
195-
isActive ? styles['active-link'] : styles['inactive-link']
196-
}
197-
onClick={handleNavLinkClick}
198-
>
199-
출석관리(담당자)
200-
</NavLink>
201-
</li>
203+
{isLoggedIn && canSeeAttendanceManageMenu && (
204+
<li>
205+
<NavLink
206+
to="/attendance-manage"
207+
className={({ isActive }) =>
208+
isActive ? styles['active-link'] : styles['inactive-link']
209+
}
210+
onClick={handleNavLinkClick}
211+
>
212+
출석관리(담당자)
213+
</NavLink>
214+
</li>
215+
)}
202216
</ul>
203217
</div>
204218

frontend/src/components/VerificationModal.module.css

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
display: flex;
99
justify-content: center;
1010
align-items: center;
11-
z-index: 1000;
11+
padding: 20px 12px;
12+
overflow-y: auto;
13+
z-index: 3000;
1214
}
1315

1416
.modal {
@@ -188,6 +190,29 @@ h1 {
188190
padding: 10px 10px 30px;
189191
}
190192

193+
.teamHeaderWithFilter {
194+
display: inline-flex;
195+
align-items: center;
196+
gap: 6px;
197+
}
198+
199+
.teamFilterInlineSelect {
200+
min-width: 90px;
201+
height: 28px;
202+
border: 1px solid #d1d5db;
203+
border-radius: 6px;
204+
background: #fff;
205+
color: #111827;
206+
font-size: 12px;
207+
padding: 0 8px;
208+
}
209+
210+
.teamFilterInlineSelect:focus {
211+
outline: none;
212+
border-color: #1d80f4;
213+
box-shadow: 0 0 0 2px rgba(29, 128, 244, 0.15);
214+
}
215+
191216
.inputGroup {
192217
display: flex;
193218
flex-direction: column;
@@ -331,6 +356,11 @@ h1 {
331356
padding: 18px 16px;
332357
}
333358

359+
.teamFilterInlineSelect {
360+
min-width: 84px;
361+
font-size: 11px;
362+
}
363+
334364
.titleDiv {
335365
gap: 8px;
336366
flex-wrap: wrap;
@@ -458,6 +488,8 @@ h1 {
458488
.roundAddModal {
459489
width: 620px;
460490
max-width: calc(100vw - 24px);
491+
max-height: calc(100dvh - 40px - env(safe-area-inset-bottom));
492+
overflow-y: auto;
461493
border-radius: 16px;
462494
padding: 28px 28px 22px;
463495
font-family: Pretendard, Inter, sans-serif;
@@ -597,8 +629,15 @@ h1 {
597629
}
598630

599631
@media (max-width: 768px) {
632+
.overlay {
633+
align-items: flex-start;
634+
padding-top: max(12px, env(safe-area-inset-top));
635+
padding-bottom: max(12px, env(safe-area-inset-bottom));
636+
}
637+
600638
.roundAddModal {
601639
width: calc(100vw - 16px);
640+
max-height: calc(100dvh - 24px - env(safe-area-inset-bottom));
602641
padding: 18px 16px;
603642
}
604643

frontend/src/components/attendance/SessionManage.jsx

Lines changed: 30 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -115,35 +115,37 @@ const SessionManage = ({ sessions = [], selectedSession = '', loading, error })
115115
출석 목록
116116
</div>
117117

118-
<table className={styles.table} role="grid">
119-
<thead>
120-
<tr>
121-
<th>일자</th>
122-
<th>출석시작시간</th>
123-
<th>회차</th>
124-
<th>이름</th>
125-
<th>출석 상태</th>
126-
</tr>
127-
</thead>
128-
129-
<tbody>
130-
{rows.map((s) => {
131-
const sessionTitle = normalizeSessionTitle(s.sessionTitle);
132-
const roundKey = getRoundKey(s);
133-
const roundIndex = roundIndexMapBySession.get(sessionTitle)?.get(roundKey) ?? '-';
134-
135-
return (
136-
<tr key={s.attendanceId}>
137-
<td>{formatDate(s.roundDate)}</td>
138-
<td>{formatTime(s.roundStartAt)}</td>
139-
<td>{roundIndex}</td>
140-
<td>{s.userName}</td>
141-
<td>{formatAttendanceStatus(s.attendanceStatus)}</td>
118+
<div className={styles.tableWrap}>
119+
<table className={styles.table} role="grid">
120+
<thead>
121+
<tr>
122+
<th>일자</th>
123+
<th>출석시작시간</th>
124+
<th>회차</th>
125+
<th>이름</th>
126+
<th>출석 상태</th>
142127
</tr>
143-
);
144-
})}
145-
</tbody>
146-
</table>
128+
</thead>
129+
130+
<tbody>
131+
{rows.map((s) => {
132+
const sessionTitle = normalizeSessionTitle(s.sessionTitle);
133+
const roundKey = getRoundKey(s);
134+
const roundIndex = roundIndexMapBySession.get(sessionTitle)?.get(roundKey) ?? '-';
135+
136+
return (
137+
<tr key={s.attendanceId}>
138+
<td>{formatDate(s.roundDate)}</td>
139+
<td>{formatTime(s.roundStartAt)}</td>
140+
<td>{roundIndex}</td>
141+
<td>{s.userName}</td>
142+
<td>{formatAttendanceStatus(s.attendanceStatus)}</td>
143+
</tr>
144+
);
145+
})}
146+
</tbody>
147+
</table>
148+
</div>
147149
</div>
148150
);
149151
};

frontend/src/components/attendance/SessionManage.module.css

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
.card {
22
width: 100%;
33
max-width: 955px;
4+
min-width: 0;
45
min-height: 280px;
56
box-sizing: border-box;
67
border: 1px solid #d9d9d9;
@@ -22,18 +23,36 @@
2223
color: #000000;
2324
}
2425

25-
.table {
26+
.tableWrap {
2627
width: 100%;
27-
border-collapse: collapse;
28-
table-layout: fixed;
28+
max-width: 100%;
2929
overflow-x: auto;
30-
display: block;
30+
overflow-y: hidden;
31+
}
32+
33+
.tableWrap::-webkit-scrollbar {
34+
height: 10px;
35+
}
36+
37+
.tableWrap::-webkit-scrollbar-track {
38+
background: #f1f5f9;
39+
border-radius: 5px;
3140
}
3241

33-
.table thead,
34-
.table tbody {
35-
display: table;
42+
.tableWrap::-webkit-scrollbar-thumb {
43+
background: #cbd5e1;
44+
border-radius: 5px;
45+
border: 2px solid #f1f5f9;
46+
}
47+
48+
.tableWrap::-webkit-scrollbar-thumb:hover {
49+
background: #94a3b8;
50+
}
51+
52+
.table {
3653
width: 100%;
54+
min-width: 640px;
55+
border-collapse: collapse;
3756
table-layout: fixed;
3857
}
3958

@@ -62,11 +81,6 @@
6281
font-size: 20px;
6382
}
6483

65-
.table {
66-
display: table;
67-
overflow-x: visible;
68-
}
69-
7084
.table thead th,
7185
.table tbody td {
7286
font-size: 16px;

0 commit comments

Comments
 (0)