대시보드 최근 회의 UI/UX 개선

주요 변경사항:
1. 최근 회의 그리드 레이아웃 3열로 제한 (가로 폭 완전히 채우도록 개선)
2. 최근 회의에 작성중/확정완료 상태 회의 표시 추가
3. 버튼 표시 규칙 개선:
   - 진행중: 참여하기 버튼
   - 예정: 버튼 없음 (카드 클릭으로 수정 화면 이동)
   - 작성중/확정완료: 버튼 없음 (카드 클릭으로 상세조회 이동)
4. 샘플 데이터에 작성중 회의 추가

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
yabo0812 2025-10-27 17:23:06 +09:00
parent 840037a690
commit ccbee2a47f
2 changed files with 27 additions and 21 deletions

View File

@ -150,6 +150,7 @@
} }
/* 회의 카드 */ /* 회의 카드 */
/* 최근 회의는 최대 3개만 표시하므로 3열로 제한 */
.meeting-grid { .meeting-grid {
display: grid; display: grid;
gap: var(--space-md); gap: var(--space-md);
@ -168,12 +169,6 @@
} }
} }
@media (min-width: 1440px) {
.meeting-grid {
grid-template-columns: repeat(4, 1fr);
}
}
.meeting-card { .meeting-card {
background: var(--white); background: var(--white);
border-radius: var(--radius-lg); border-radius: var(--radius-lg);
@ -689,8 +684,17 @@
const statusInfo = getMeetingStatusInfo(meeting); const statusInfo = getMeetingStatusInfo(meeting);
const isCreator = meeting.participants.some(p => p.id === currentUser.id && p.role === 'creator'); const isCreator = meeting.participants.some(p => p.id === currentUser.id && p.role === 'creator');
// 버튼 표시 규칙
// - ongoing: 참여하기 버튼 표시
// - scheduled: 버튼 없음 (카드 클릭으로 수정 화면 이동)
// - draft/complete: 버튼 없음 (카드 클릭으로 상세조회 이동)
let actionButton = '';
if (meeting.status === 'ongoing') {
actionButton = `<button class="btn btn-primary btn-sm" onclick="navigateTo('05-회의진행.html'); event.stopPropagation();">참여하기</button>`;
}
return ` return `
<div class="meeting-card ${meeting.status === 'ongoing' ? 'ongoing' : ''}" data-id="${meeting.id}"> <div class="meeting-card ${meeting.status === 'ongoing' ? 'ongoing' : ''}" data-id="${meeting.id}" data-status="${meeting.status}">
<div class="meeting-card-header"> <div class="meeting-card-header">
${createBadge(statusInfo.badgeText, statusInfo.badgeType)} ${createBadge(statusInfo.badgeText, statusInfo.badgeType)}
<h3 class="meeting-card-title">${meeting.title}${isCreator ? ' <span style="font-size: 16px;" title="생성자">👑</span>' : ''}</h3> <h3 class="meeting-card-title">${meeting.title}${isCreator ? ' <span style="font-size: 16px;" title="생성자">👑</span>' : ''}</h3>
@ -699,14 +703,7 @@
<div class="meeting-card-meta-item">📅 ${formatDate(meeting.date)} ${formatTime(meeting.time)} 👥 ${meeting.participants.length}명</div> <div class="meeting-card-meta-item">📅 ${formatDate(meeting.date)} ${formatTime(meeting.time)} 👥 ${meeting.participants.length}명</div>
<div class="meeting-card-meta-item">📍 ${meeting.location}</div> <div class="meeting-card-meta-item">📍 ${meeting.location}</div>
</div> </div>
<div class="meeting-card-actions"> ${actionButton ? `<div class="meeting-card-actions">${actionButton}</div>` : ''}
${meeting.status === 'ongoing'
? `<button class="btn btn-primary btn-sm" onclick="navigateTo('05-회의진행.html'); event.stopPropagation();">참여하기</button>`
: meeting.status === 'scheduled' && isCreator
? `<button class="btn btn-secondary btn-sm" onclick="navigateTo('03-회의예약.html'); event.stopPropagation();">수정</button>`
: `<button class="btn btn-ghost btn-sm" onclick="navigateTo('10-회의록상세조회.html'); event.stopPropagation();">보기</button>`
}
</div>
</div> </div>
`; `;
}).join(''); }).join('');
@ -716,12 +713,14 @@
card.addEventListener('click', (e) => { card.addEventListener('click', (e) => {
if (e.target.tagName !== 'BUTTON') { if (e.target.tagName !== 'BUTTON') {
const meetingId = card.dataset.id; const meetingId = card.dataset.id;
const meeting = SAMPLE_MEETINGS.find(m => m.id === meetingId); const meetingStatus = card.dataset.status;
if (meeting.status === 'ongoing') {
// 상태에 따른 이동 처리
if (meetingStatus === 'ongoing') {
navigateTo('05-회의진행.html'); navigateTo('05-회의진행.html');
} else if (meeting.status === 'completed') { } else if (meetingStatus === 'draft' || meetingStatus === 'complete' || meetingStatus === 'completed') {
navigateTo('10-회의록상세조회.html'); navigateTo('10-회의록상세조회.html');
} else { } else if (meetingStatus === 'scheduled') {
navigateTo('03-회의예약.html'); navigateTo('03-회의예약.html');
} }
} }

View File

@ -31,7 +31,7 @@ const SAMPLE_MEETINGS = [
time: '14:00', time: '14:00',
duration: 90, duration: 90,
location: '본사 2층 대회의실', location: '본사 2층 대회의실',
status: 'scheduled', // ongoing, scheduled, completed status: 'draft', // ongoing, scheduled, completed, draft(작성중), complete(확정완료)
participants: [ participants: [
{ id: 'user-001', name: '김민준', avatar: '김', avatarColor: 'green' }, { id: 'user-001', name: '김민준', avatar: '김', avatarColor: 'green' },
{ id: 'user-002', name: '박서연', avatar: '박', avatarColor: 'blue' }, { id: 'user-002', name: '박서연', avatar: '박', avatarColor: 'blue' },
@ -39,7 +39,8 @@ const SAMPLE_MEETINGS = [
{ id: 'user-004', name: '최유진', avatar: '최', avatarColor: 'pink' } { id: 'user-004', name: '최유진', avatar: '최', avatarColor: 'pink' }
], ],
sections: 3, sections: 3,
todos: 5 todos: 5,
minutesId: 'minutes-001' // 회의록 ID 연결
}, },
{ {
id: 'meeting-002', id: 'meeting-002',
@ -1083,6 +1084,12 @@ function getMeetingStatusInfo(meeting) {
if (meeting.status === 'ongoing') { if (meeting.status === 'ongoing') {
return { badgeType: 'ongoing', badgeText: '진행중' }; return { badgeType: 'ongoing', badgeText: '진행중' };
} }
if (meeting.status === 'draft') {
return { badgeType: 'draft', badgeText: '작성중' };
}
if (meeting.status === 'complete') {
return { badgeType: 'complete', badgeText: '확정완료' };
}
if (meeting.status === 'completed') { if (meeting.status === 'completed') {
return { badgeType: 'complete', badgeText: '확정완료' }; return { badgeType: 'complete', badgeText: '확정완료' };
} }