mirror of
https://github.com/hwanny1128/HGZero.git
synced 2025-12-06 11:26:25 +00:00
프로토타입 Todo-회의록 연동 및 AI 제안 개선
- Todo관리 화면에 출처 회의록 정보 추가 (양방향 링크) - 회의록 공유 화면에 생성된 Todo 목록 및 진행상황 표시 - 회의 진행 중 관련 자료 탭 추가 (관련 회의록 3건, 관련 업무이력 2건) - AI 제안 샘플 내용 현실감 있게 대폭 개선 - AI 제안에 참고자료 링크 기능 추가 - 유저스토리 차별화 포인트 명확하게 구현 (UFR-TODO-010, UFR-RAG-020, UFR-AI-040) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
7826acb285
commit
301eed5a38
File diff suppressed because it is too large
Load Diff
316
design/uiux/prototype/09-회의록공유.html
Normal file
316
design/uiux/prototype/09-회의록공유.html
Normal file
@ -0,0 +1,316 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ko">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>회의록 공유 - 회의록 서비스</title>
|
||||
<link rel="stylesheet" href="common.css">
|
||||
<style>
|
||||
body { background-color: var(--color-gray-50); }
|
||||
.page-container {
|
||||
max-width: 800px;
|
||||
margin: 0 auto;
|
||||
padding: var(--spacing-8) var(--spacing-4);
|
||||
}
|
||||
.success-icon {
|
||||
text-align: center;
|
||||
font-size: 80px;
|
||||
margin-bottom: var(--spacing-6);
|
||||
}
|
||||
.page-title {
|
||||
font-size: var(--font-size-h1);
|
||||
color: var(--color-gray-900);
|
||||
margin-bottom: var(--spacing-3);
|
||||
text-align: center;
|
||||
}
|
||||
.page-subtitle {
|
||||
font-size: var(--font-size-body);
|
||||
color: var(--color-gray-500);
|
||||
text-align: center;
|
||||
margin-bottom: var(--spacing-8);
|
||||
}
|
||||
.share-card {
|
||||
background: var(--color-white);
|
||||
border: 1px solid var(--color-gray-200);
|
||||
border-radius: var(--radius-lg);
|
||||
padding: var(--spacing-6);
|
||||
margin-bottom: var(--spacing-6);
|
||||
}
|
||||
.share-title {
|
||||
font-size: var(--font-size-h4);
|
||||
font-weight: var(--font-weight-semibold);
|
||||
color: var(--color-gray-900);
|
||||
margin-bottom: var(--spacing-4);
|
||||
}
|
||||
.share-option {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: var(--spacing-4);
|
||||
padding: var(--spacing-4);
|
||||
margin-bottom: var(--spacing-3);
|
||||
background: var(--color-gray-50);
|
||||
border-radius: var(--radius-md);
|
||||
cursor: pointer;
|
||||
transition: background-color var(--transition-fast);
|
||||
}
|
||||
.share-option:hover {
|
||||
background: var(--color-gray-100);
|
||||
}
|
||||
.share-icon {
|
||||
font-size: 32px;
|
||||
}
|
||||
.share-info {
|
||||
flex: 1;
|
||||
}
|
||||
.share-label {
|
||||
font-weight: var(--font-weight-medium);
|
||||
color: var(--color-gray-900);
|
||||
margin-bottom: var(--spacing-1);
|
||||
}
|
||||
.share-desc {
|
||||
font-size: var(--font-size-body-small);
|
||||
color: var(--color-gray-600);
|
||||
}
|
||||
.link-box {
|
||||
display: flex;
|
||||
gap: var(--spacing-2);
|
||||
align-items: center;
|
||||
}
|
||||
.link-input {
|
||||
flex: 1;
|
||||
padding: var(--spacing-3) var(--spacing-4);
|
||||
border: 1px solid var(--color-gray-300);
|
||||
border-radius: var(--radius-md);
|
||||
font-size: var(--font-size-body-small);
|
||||
background-color: var(--color-gray-50);
|
||||
font-family: monospace;
|
||||
}
|
||||
.attendee-list {
|
||||
margin-top: var(--spacing-4);
|
||||
}
|
||||
.attendee-item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: var(--spacing-3);
|
||||
padding: var(--spacing-3);
|
||||
margin-bottom: var(--spacing-2);
|
||||
background: var(--color-gray-50);
|
||||
border-radius: var(--radius-md);
|
||||
}
|
||||
.attendee-avatar {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
border-radius: var(--radius-full);
|
||||
background-color: var(--color-primary-main);
|
||||
color: var(--color-white);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-weight: var(--font-weight-semibold);
|
||||
}
|
||||
.attendee-info {
|
||||
flex: 1;
|
||||
}
|
||||
.attendee-name {
|
||||
font-weight: var(--font-weight-medium);
|
||||
color: var(--color-gray-900);
|
||||
}
|
||||
.attendee-email {
|
||||
font-size: var(--font-size-body-small);
|
||||
color: var(--color-gray-600);
|
||||
}
|
||||
.sent-badge {
|
||||
padding: var(--spacing-1) var(--spacing-3);
|
||||
background-color: var(--color-success-light);
|
||||
color: var(--color-success-dark);
|
||||
border-radius: var(--radius-md);
|
||||
font-size: var(--font-size-caption);
|
||||
font-weight: var(--font-weight-medium);
|
||||
}
|
||||
.action-buttons {
|
||||
display: flex;
|
||||
gap: var(--spacing-3);
|
||||
justify-content: center;
|
||||
}
|
||||
@media (max-width: 767px) {
|
||||
.success-icon { font-size: 60px; }
|
||||
.page-title { font-size: var(--font-size-h2); }
|
||||
.action-buttons { flex-direction: column; }
|
||||
.action-buttons .btn { width: 100%; }
|
||||
.link-box { flex-direction: column; }
|
||||
.link-input { width: 100%; }
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="page-container">
|
||||
<div class="success-icon">🎉</div>
|
||||
<h1 class="page-title">회의록이 확정되었습니다</h1>
|
||||
<p class="page-subtitle">이제 참석자들과 회의록을 공유하세요</p>
|
||||
|
||||
<!-- 공유 링크 -->
|
||||
<div class="share-card">
|
||||
<h2 class="share-title">공유 링크</h2>
|
||||
<div class="link-box">
|
||||
<input type="text" class="link-input" id="shareLink" value="https://meeting.example.com/share/m-001-abc123" readonly>
|
||||
<button class="btn btn-primary" onclick="copyLink()">복사</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 공유 방식 -->
|
||||
<div class="share-card">
|
||||
<h2 class="share-title">공유 방식 선택</h2>
|
||||
|
||||
<div class="share-option" onclick="shareViaEmail()">
|
||||
<div class="share-icon">📧</div>
|
||||
<div class="share-info">
|
||||
<div class="share-label">이메일로 공유</div>
|
||||
<div class="share-desc">참석자들에게 이메일을 발송합니다</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="share-option" onclick="shareViaSlack()">
|
||||
<div class="share-icon">💬</div>
|
||||
<div class="share-info">
|
||||
<div class="share-label">슬랙으로 공유</div>
|
||||
<div class="share-desc">슬랙 채널에 회의록을 공유합니다</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="share-option" onclick="downloadPDF()">
|
||||
<div class="share-icon">📄</div>
|
||||
<div class="share-info">
|
||||
<div class="share-label">PDF로 다운로드</div>
|
||||
<div class="share-desc">회의록을 PDF 파일로 저장합니다</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 생성된 Todo -->
|
||||
<div class="share-card">
|
||||
<h2 class="share-title">생성된 Todo (3개)</h2>
|
||||
<div class="attendee-list">
|
||||
<div class="attendee-item">
|
||||
<div style="display: flex; align-items: center; gap: var(--spacing-3); flex: 1;">
|
||||
<div class="attendee-avatar" style="background-color: var(--color-primary-main);">이</div>
|
||||
<div class="attendee-info">
|
||||
<div class="attendee-name">API 명세서 작성</div>
|
||||
<div class="attendee-email" style="display: flex; align-items: center; gap: var(--spacing-2);">
|
||||
<span>담당: 이준호</span> | <span>📅 3월 25일</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div style="display: flex; flex-direction: column; align-items: flex-end; gap: var(--spacing-1);">
|
||||
<span class="sent-badge" style="background-color: var(--color-warning-light); color: var(--color-warning-dark);">진행중 60%</span>
|
||||
<a href="10-Todo관리.html" style="font-size: var(--font-size-caption); color: var(--color-primary-main); text-decoration: none;">Todo 보기 →</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="attendee-item">
|
||||
<div style="display: flex; align-items: center; gap: var(--spacing-3); flex: 1;">
|
||||
<div class="attendee-avatar" style="background-color: var(--color-info-main);">최</div>
|
||||
<div class="attendee-info">
|
||||
<div class="attendee-name">UI 프로토타입 완성</div>
|
||||
<div class="attendee-email" style="display: flex; align-items: center; gap: var(--spacing-2);">
|
||||
<span>담당: 최유진</span> | <span>📅 3월 15일</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div style="display: flex; flex-direction: column; align-items: flex-end; gap: var(--spacing-1);">
|
||||
<span class="sent-badge">완료 100%</span>
|
||||
<a href="10-Todo관리.html" style="font-size: var(--font-size-caption); color: var(--color-primary-main); text-decoration: none;">Todo 보기 →</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="attendee-item">
|
||||
<div style="display: flex; align-items: center; gap: var(--spacing-3); flex: 1;">
|
||||
<div class="attendee-avatar" style="background-color: var(--color-secondary-main);">박</div>
|
||||
<div class="attendee-info">
|
||||
<div class="attendee-name">예산 편성안 검토</div>
|
||||
<div class="attendee-email" style="display: flex; align-items: center; gap: var(--spacing-2);">
|
||||
<span>담당: 박서연</span> | <span>📅 3월 20일</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div style="display: flex; flex-direction: column; align-items: flex-end; gap: var(--spacing-1);">
|
||||
<span class="sent-badge" style="background-color: var(--color-error-light); color: var(--color-error-dark);">지연 30%</span>
|
||||
<a href="10-Todo관리.html" style="font-size: var(--font-size-caption); color: var(--color-primary-main); text-decoration: none;">Todo 보기 →</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 참석자 목록 -->
|
||||
<div class="share-card">
|
||||
<h2 class="share-title">참석자 (3명)</h2>
|
||||
<div class="attendee-list">
|
||||
<div class="attendee-item">
|
||||
<div class="attendee-avatar">김</div>
|
||||
<div class="attendee-info">
|
||||
<div class="attendee-name">김민준</div>
|
||||
<div class="attendee-email">minjun.kim@example.com</div>
|
||||
</div>
|
||||
<span class="sent-badge">발송 완료</span>
|
||||
</div>
|
||||
<div class="attendee-item">
|
||||
<div class="attendee-avatar" style="background-color: var(--color-secondary-main);">박</div>
|
||||
<div class="attendee-info">
|
||||
<div class="attendee-name">박서연</div>
|
||||
<div class="attendee-email">seoyeon.park@example.com</div>
|
||||
</div>
|
||||
<span class="sent-badge">발송 완료</span>
|
||||
</div>
|
||||
<div class="attendee-item">
|
||||
<div class="attendee-avatar" style="background-color: var(--color-info-main);">이</div>
|
||||
<div class="attendee-info">
|
||||
<div class="attendee-name">이준호</div>
|
||||
<div class="attendee-email">junho.lee@example.com</div>
|
||||
</div>
|
||||
<span class="sent-badge">발송 완료</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 액션 버튼 -->
|
||||
<div class="action-buttons">
|
||||
<button class="btn btn-secondary" onclick="window.location.href='02-대시보드.html'">
|
||||
대시보드로 이동
|
||||
</button>
|
||||
<button class="btn btn-primary" onclick="window.location.href='10-Todo관리.html'">
|
||||
Todo 관리하기
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="common.js"></script>
|
||||
<script>
|
||||
function copyLink() {
|
||||
const linkInput = document.getElementById('shareLink');
|
||||
linkInput.select();
|
||||
document.execCommand('copy');
|
||||
MeetingApp.Toast.success('링크가 복사되었습니다');
|
||||
}
|
||||
|
||||
function shareViaEmail() {
|
||||
MeetingApp.Loading.show();
|
||||
setTimeout(() => {
|
||||
MeetingApp.Loading.hide();
|
||||
MeetingApp.Toast.success('이메일이 발송되었습니다');
|
||||
}, 1500);
|
||||
}
|
||||
|
||||
function shareViaSlack() {
|
||||
MeetingApp.Loading.show();
|
||||
setTimeout(() => {
|
||||
MeetingApp.Loading.hide();
|
||||
MeetingApp.Toast.success('슬랙에 공유되었습니다');
|
||||
}, 1500);
|
||||
}
|
||||
|
||||
function downloadPDF() {
|
||||
MeetingApp.Toast.info('PDF 파일을 준비 중입니다...');
|
||||
setTimeout(() => {
|
||||
MeetingApp.Toast.success('PDF 다운로드가 시작되었습니다');
|
||||
}, 1000);
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
466
design/uiux/prototype/10-Todo관리.html
Normal file
466
design/uiux/prototype/10-Todo관리.html
Normal file
@ -0,0 +1,466 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ko">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Todo 관리 - 회의록 서비스</title>
|
||||
<link rel="stylesheet" href="common.css">
|
||||
<style>
|
||||
body { background-color: var(--color-gray-50); }
|
||||
.page-container {
|
||||
max-width: 1400px;
|
||||
margin: 0 auto;
|
||||
padding: var(--spacing-8) var(--spacing-4);
|
||||
}
|
||||
.page-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: var(--spacing-8);
|
||||
}
|
||||
.page-title {
|
||||
font-size: var(--font-size-h1);
|
||||
color: var(--color-gray-900);
|
||||
}
|
||||
.view-toggle {
|
||||
display: flex;
|
||||
gap: var(--spacing-2);
|
||||
}
|
||||
.view-btn {
|
||||
padding: var(--spacing-2) var(--spacing-4);
|
||||
background: var(--color-white);
|
||||
border: 1px solid var(--color-gray-300);
|
||||
border-radius: var(--radius-md);
|
||||
font-size: var(--font-size-body-small);
|
||||
cursor: pointer;
|
||||
transition: all var(--transition-fast);
|
||||
}
|
||||
.view-btn.active {
|
||||
background-color: var(--color-primary-main);
|
||||
color: var(--color-white);
|
||||
border-color: var(--color-primary-main);
|
||||
}
|
||||
.kanban-board {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
gap: var(--spacing-6);
|
||||
}
|
||||
.kanban-column {
|
||||
background: var(--color-white);
|
||||
border: 1px solid var(--color-gray-200);
|
||||
border-radius: var(--radius-lg);
|
||||
padding: var(--spacing-4);
|
||||
min-height: 500px;
|
||||
}
|
||||
.column-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: var(--spacing-4);
|
||||
padding-bottom: var(--spacing-3);
|
||||
border-bottom: 2px solid var(--color-gray-200);
|
||||
}
|
||||
.column-title {
|
||||
font-size: var(--font-size-h4);
|
||||
font-weight: var(--font-weight-semibold);
|
||||
color: var(--color-gray-900);
|
||||
}
|
||||
.column-count {
|
||||
padding: var(--spacing-1) var(--spacing-2);
|
||||
background-color: var(--color-gray-200);
|
||||
color: var(--color-gray-700);
|
||||
border-radius: var(--radius-md);
|
||||
font-size: var(--font-size-caption);
|
||||
font-weight: var(--font-weight-medium);
|
||||
}
|
||||
.todo-card {
|
||||
background: var(--color-white);
|
||||
border: 1px solid var(--color-gray-200);
|
||||
border-radius: var(--radius-md);
|
||||
padding: var(--spacing-4);
|
||||
margin-bottom: var(--spacing-3);
|
||||
cursor: grab;
|
||||
transition: all var(--transition-fast);
|
||||
}
|
||||
.todo-card:hover {
|
||||
box-shadow: var(--shadow-md);
|
||||
transform: translateY(-2px);
|
||||
}
|
||||
.todo-card.priority-high {
|
||||
border-left: 4px solid var(--color-error-main);
|
||||
}
|
||||
.todo-card.priority-medium {
|
||||
border-left: 4px solid var(--color-warning-main);
|
||||
}
|
||||
.todo-title {
|
||||
font-weight: var(--font-weight-semibold);
|
||||
color: var(--color-gray-900);
|
||||
margin-bottom: var(--spacing-2);
|
||||
}
|
||||
.todo-meta {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: var(--spacing-3);
|
||||
margin-bottom: var(--spacing-3);
|
||||
font-size: var(--font-size-body-small);
|
||||
color: var(--color-gray-600);
|
||||
}
|
||||
.todo-assignee {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: var(--spacing-2);
|
||||
}
|
||||
.avatar-sm {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
border-radius: var(--radius-full);
|
||||
background-color: var(--color-primary-main);
|
||||
color: var(--color-white);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: var(--font-size-caption);
|
||||
font-weight: var(--font-weight-semibold);
|
||||
}
|
||||
.todo-duedate {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: var(--spacing-1);
|
||||
}
|
||||
.todo-duedate.overdue {
|
||||
color: var(--color-error-main);
|
||||
font-weight: var(--font-weight-medium);
|
||||
}
|
||||
.todo-progress {
|
||||
height: 4px;
|
||||
background-color: var(--color-gray-200);
|
||||
border-radius: 2px;
|
||||
overflow: hidden;
|
||||
}
|
||||
.todo-progress-bar {
|
||||
height: 100%;
|
||||
background-color: var(--color-primary-main);
|
||||
transition: width var(--transition-slow);
|
||||
}
|
||||
.todo-source {
|
||||
margin-top: var(--spacing-3);
|
||||
padding-top: var(--spacing-3);
|
||||
border-top: 1px dashed var(--color-gray-200);
|
||||
font-size: var(--font-size-caption);
|
||||
color: var(--color-gray-500);
|
||||
}
|
||||
.todo-source-link {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: var(--spacing-2);
|
||||
color: var(--color-primary-main);
|
||||
text-decoration: none;
|
||||
transition: color var(--transition-fast);
|
||||
cursor: pointer;
|
||||
}
|
||||
.todo-source-link:hover {
|
||||
color: var(--color-primary-dark);
|
||||
text-decoration: underline;
|
||||
}
|
||||
.list-view {
|
||||
display: none;
|
||||
}
|
||||
.list-view.active {
|
||||
display: block;
|
||||
}
|
||||
.todo-list-item {
|
||||
background: var(--color-white);
|
||||
border: 1px solid var(--color-gray-200);
|
||||
border-radius: var(--radius-md);
|
||||
padding: var(--spacing-4);
|
||||
margin-bottom: var(--spacing-3);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: var(--spacing-4);
|
||||
}
|
||||
.todo-checkbox {
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
border: 2px solid var(--color-gray-300);
|
||||
border-radius: var(--radius-sm);
|
||||
cursor: pointer;
|
||||
}
|
||||
.todo-list-content {
|
||||
flex: 1;
|
||||
}
|
||||
@media (max-width: 1023px) {
|
||||
.kanban-board {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
}
|
||||
@media (max-width: 767px) {
|
||||
.page-header {
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
gap: var(--spacing-4);
|
||||
}
|
||||
.page-title { font-size: var(--font-size-h2); }
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="page-container">
|
||||
<div class="page-header">
|
||||
<h1 class="page-title">Todo 관리</h1>
|
||||
<div style="display: flex; gap: var(--spacing-3); align-items: center;">
|
||||
<div class="view-toggle">
|
||||
<button class="view-btn active" data-view="kanban">칸반</button>
|
||||
<button class="view-btn" data-view="list">리스트</button>
|
||||
</div>
|
||||
<button class="btn btn-primary" onclick="addTodo()">+ 새 Todo</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 칸반 보드 뷰 -->
|
||||
<div class="kanban-board" id="kanbanView">
|
||||
<!-- 시작 전 -->
|
||||
<div class="kanban-column">
|
||||
<div class="column-header">
|
||||
<h2 class="column-title">시작 전</h2>
|
||||
<span class="column-count">2</span>
|
||||
</div>
|
||||
|
||||
<div class="todo-card priority-high">
|
||||
<div class="todo-title">데이터베이스 스키마 설계</div>
|
||||
<div class="todo-meta">
|
||||
<div class="todo-assignee">
|
||||
<div class="avatar-sm">이</div>
|
||||
<span>이준호</span>
|
||||
</div>
|
||||
<div class="todo-duedate">
|
||||
📅 D-3
|
||||
</div>
|
||||
</div>
|
||||
<div class="todo-progress">
|
||||
<div class="todo-progress-bar" style="width: 0%;"></div>
|
||||
</div>
|
||||
<div class="todo-source">
|
||||
<a href="08-최종확정.html#todo-section" class="todo-source-link" onclick="MeetingApp.Toast.info('회의록으로 이동합니다'); return true;">
|
||||
📄 2025년 1분기 제품 기획 회의 (2025-10-25)
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="todo-card">
|
||||
<div class="todo-title">사용자 피드백 분석</div>
|
||||
<div class="todo-meta">
|
||||
<div class="todo-assignee">
|
||||
<div class="avatar-sm" style="background-color: var(--color-secondary-main);">박</div>
|
||||
<span>박서연</span>
|
||||
</div>
|
||||
<div class="todo-duedate">
|
||||
📅 D-5
|
||||
</div>
|
||||
</div>
|
||||
<div class="todo-progress">
|
||||
<div class="todo-progress-bar" style="width: 0%;"></div>
|
||||
</div>
|
||||
<div class="todo-source">
|
||||
<a href="08-최종확정.html#todo-section" class="todo-source-link" onclick="MeetingApp.Toast.info('회의록으로 이동합니다'); return true;">
|
||||
📄 고객 만족도 개선 회의 (2025-10-18)
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 진행 중 -->
|
||||
<div class="kanban-column">
|
||||
<div class="column-header">
|
||||
<h2 class="column-title">진행 중</h2>
|
||||
<span class="column-count">2</span>
|
||||
</div>
|
||||
|
||||
<div class="todo-card priority-high">
|
||||
<div class="todo-title">API 명세서 작성</div>
|
||||
<div class="todo-meta">
|
||||
<div class="todo-assignee">
|
||||
<div class="avatar-sm">이</div>
|
||||
<span>이준호</span>
|
||||
</div>
|
||||
<div class="todo-duedate">
|
||||
📅 오늘
|
||||
</div>
|
||||
</div>
|
||||
<div class="todo-progress">
|
||||
<div class="todo-progress-bar" style="width: 60%;"></div>
|
||||
</div>
|
||||
<div class="todo-source">
|
||||
<a href="08-최종확정.html#todo-section" class="todo-source-link" onclick="MeetingApp.Toast.info('회의록으로 이동합니다'); return true;">
|
||||
📄 2025년 1분기 제품 기획 회의 (2025-10-25)
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="todo-card priority-medium">
|
||||
<div class="todo-title">예산 편성안 검토</div>
|
||||
<div class="todo-meta">
|
||||
<div class="todo-assignee">
|
||||
<div class="avatar-sm" style="background-color: var(--color-secondary-main);">박</div>
|
||||
<span>박서연</span>
|
||||
</div>
|
||||
<div class="todo-duedate overdue">
|
||||
📅 D+2 (지남)
|
||||
</div>
|
||||
</div>
|
||||
<div class="todo-progress">
|
||||
<div class="todo-progress-bar" style="width: 30%;"></div>
|
||||
</div>
|
||||
<div class="todo-source">
|
||||
<a href="08-최종확정.html#todo-section" class="todo-source-link" onclick="MeetingApp.Toast.info('회의록으로 이동합니다'); return true;">
|
||||
📄 2025년 1분기 제품 기획 회의 (2025-10-25)
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 완료 -->
|
||||
<div class="kanban-column">
|
||||
<div class="column-header">
|
||||
<h2 class="column-title">완료</h2>
|
||||
<span class="column-count">1</span>
|
||||
</div>
|
||||
|
||||
<div class="todo-card">
|
||||
<div class="todo-title">UI 프로토타입 디자인</div>
|
||||
<div class="todo-meta">
|
||||
<div class="todo-assignee">
|
||||
<div class="avatar-sm" style="background-color: var(--color-info-main);">최</div>
|
||||
<span>최유진</span>
|
||||
</div>
|
||||
<div class="todo-duedate">
|
||||
✅ 완료
|
||||
</div>
|
||||
</div>
|
||||
<div class="todo-progress">
|
||||
<div class="todo-progress-bar" style="width: 100%; background-color: var(--color-success-main);"></div>
|
||||
</div>
|
||||
<div class="todo-source">
|
||||
<a href="08-최종확정.html#todo-section" class="todo-source-link" onclick="MeetingApp.Toast.info('회의록으로 이동합니다'); return true;">
|
||||
📄 2025년 1분기 제품 기획 회의 (2025-10-25)
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 리스트 뷰 -->
|
||||
<div class="list-view" id="listView">
|
||||
<div class="todo-list-item">
|
||||
<input type="checkbox" class="todo-checkbox">
|
||||
<div class="todo-list-content">
|
||||
<div class="todo-title">API 명세서 작성</div>
|
||||
<div class="todo-meta">
|
||||
<div class="todo-assignee">
|
||||
<div class="avatar-sm">이</div>
|
||||
<span>이준호</span>
|
||||
</div>
|
||||
<div class="todo-duedate">📅 오늘</div>
|
||||
<span class="badge badge-warning">진행 중</span>
|
||||
</div>
|
||||
<div class="todo-source" style="margin-top: var(--spacing-2);">
|
||||
<a href="08-최종확정.html#todo-section" class="todo-source-link" onclick="MeetingApp.Toast.info('회의록으로 이동합니다'); return true;">
|
||||
📄 2025년 1분기 제품 기획 회의 (2025-10-25)
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="todo-list-item">
|
||||
<input type="checkbox" class="todo-checkbox">
|
||||
<div class="todo-list-content">
|
||||
<div class="todo-title">예산 편성안 검토</div>
|
||||
<div class="todo-meta">
|
||||
<div class="todo-assignee">
|
||||
<div class="avatar-sm" style="background-color: var(--color-secondary-main);">박</div>
|
||||
<span>박서연</span>
|
||||
</div>
|
||||
<div class="todo-duedate overdue">📅 D+2 (지남)</div>
|
||||
<span class="badge badge-warning">진행 중</span>
|
||||
</div>
|
||||
<div class="todo-source" style="margin-top: var(--spacing-2);">
|
||||
<a href="08-최종확정.html#todo-section" class="todo-source-link" onclick="MeetingApp.Toast.info('회의록으로 이동합니다'); return true;">
|
||||
📄 2025년 1분기 제품 기획 회의 (2025-10-25)
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="todo-list-item">
|
||||
<input type="checkbox" class="todo-checkbox" checked>
|
||||
<div class="todo-list-content">
|
||||
<div class="todo-title" style="text-decoration: line-through; color: var(--color-gray-500);">UI 프로토타입 디자인</div>
|
||||
<div class="todo-meta">
|
||||
<div class="todo-assignee">
|
||||
<div class="avatar-sm" style="background-color: var(--color-info-main);">최</div>
|
||||
<span>최유진</span>
|
||||
</div>
|
||||
<span class="badge badge-success">완료</span>
|
||||
</div>
|
||||
<div class="todo-source" style="margin-top: var(--spacing-2);">
|
||||
<a href="08-최종확정.html#todo-section" class="todo-source-link" onclick="MeetingApp.Toast.info('회의록으로 이동합니다'); return true;">
|
||||
📄 2025년 1분기 제품 기획 회의 (2025-10-25)
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="common.js"></script>
|
||||
<script>
|
||||
// 뷰 전환
|
||||
const viewBtns = document.querySelectorAll('.view-btn');
|
||||
const kanbanView = document.getElementById('kanbanView');
|
||||
const listView = document.getElementById('listView');
|
||||
|
||||
viewBtns.forEach(btn => {
|
||||
btn.addEventListener('click', () => {
|
||||
const view = btn.getAttribute('data-view');
|
||||
|
||||
viewBtns.forEach(b => b.classList.remove('active'));
|
||||
btn.classList.add('active');
|
||||
|
||||
if (view === 'kanban') {
|
||||
kanbanView.style.display = 'grid';
|
||||
listView.classList.remove('active');
|
||||
} else {
|
||||
kanbanView.style.display = 'none';
|
||||
listView.classList.add('active');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// Todo 추가
|
||||
function addTodo() {
|
||||
MeetingApp.Toast.info('Todo 추가 기능은 준비 중입니다');
|
||||
}
|
||||
|
||||
// Todo 카드 클릭
|
||||
const todoCards = document.querySelectorAll('.todo-card');
|
||||
todoCards.forEach(card => {
|
||||
card.addEventListener('click', () => {
|
||||
MeetingApp.Toast.info('Todo 상세 정보를 표시합니다');
|
||||
});
|
||||
});
|
||||
|
||||
// 드래그 앤 드롭 (간단한 시뮬레이션)
|
||||
todoCards.forEach(card => {
|
||||
card.addEventListener('dragstart', (e) => {
|
||||
e.dataTransfer.effectAllowed = 'move';
|
||||
e.target.style.opacity = '0.5';
|
||||
});
|
||||
|
||||
card.addEventListener('dragend', (e) => {
|
||||
e.target.style.opacity = '1';
|
||||
});
|
||||
|
||||
card.setAttribute('draggable', 'true');
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
212
design/uiux/prototype/test-report.md
Normal file
212
design/uiux/prototype/test-report.md
Normal file
@ -0,0 +1,212 @@
|
||||
# 프로토타입 테스트 결과 보고서
|
||||
|
||||
## 테스트 일시
|
||||
2025-10-20
|
||||
|
||||
## 테스트 범위
|
||||
전체 화면 플로우 테스트 (01-로그인 ~ 10-Todo관리)
|
||||
|
||||
## 테스트 결과 요약
|
||||
- 총 10개 화면 테스트
|
||||
- 정상 작동: 7개 화면
|
||||
- 버그 발견: 3개
|
||||
|
||||
---
|
||||
|
||||
## 발견된 버그
|
||||
|
||||
### 1. [HIGH] 대시보드 FAB 버튼 클릭 이벤트 미작동
|
||||
- **파일**: `02-대시보드.html`
|
||||
- **위치**: 라인 682 (JavaScript)
|
||||
- **증상**: FAB 버튼 클릭 시 회의 예약 페이지로 이동하지 않음
|
||||
- **원인**: JavaScript 이벤트 리스너가 제대로 바인딩되지 않음
|
||||
- **영향도**: 높음 (주요 네비게이션 기능)
|
||||
- **상태**: 미수정
|
||||
|
||||
### 2. [HIGH] 회의 예약 폼 제출 버그
|
||||
- **파일**: `03-회의예약.html`
|
||||
- **위치**: 라인 99 (form submit handler)
|
||||
- **증상**: 필수 필드를 모두 입력해도 폼 제출 시 페이지 이동하지 않음
|
||||
- **원인**: 폼 검증 로직 또는 이벤트 핸들러 문제
|
||||
- **영향도**: 높음 (핵심 기능)
|
||||
- **상태**: 미수정
|
||||
|
||||
### 3. [CRITICAL] 최종확정 페이지 링크 오류
|
||||
- **파일**: `08-최종확정.html`
|
||||
- **위치**: 라인 294
|
||||
- **증상**: 회의록 확정 후 "08-회의록공유.html"로 이동 시도하여 404 오류 발생
|
||||
- **원인**: 파일명 재정렬 후 링크 업데이트 누락
|
||||
- **수정 내용**: `'08-회의록공유.html'` → `'09-회의록공유.html'`
|
||||
- **영향도**: 매우 높음 (페이지 이동 불가)
|
||||
- **상태**: ✅ 수정 완료
|
||||
|
||||
### 4. [LOW] common.js 중복 로드 경고
|
||||
- **파일**: 모든 HTML 파일
|
||||
- **증상**: 콘솔에 "AppState가 이미 선언되었다"는 경고 메시지
|
||||
- **원인**: 페이지 전환 시 common.js가 중복으로 로드됨
|
||||
- **영향도**: 낮음 (기능에는 영향 없음)
|
||||
- **상태**: 미수정
|
||||
|
||||
---
|
||||
|
||||
## 정상 작동 화면
|
||||
|
||||
### ✅ 01-로그인.html
|
||||
- 로그인 폼 정상 작동
|
||||
- 인증 성공 시 대시보드로 정상 이동
|
||||
- Toast 메시지 정상 표시
|
||||
|
||||
### ✅ 04-템플릿선택.html
|
||||
- 템플릿 카드 선택 기능 정상
|
||||
- 선택 시 체크마크 표시 정상
|
||||
- "회의 시작하기" 버튼 활성화/비활성화 정상
|
||||
|
||||
### ✅ 05-회의진행.html
|
||||
- 회의 에디터 정상 표시
|
||||
- 녹음 타이머 정상 작동
|
||||
- 참석자/AI 제안 탭 전환 정상
|
||||
|
||||
### ✅ 06-검증완료.html
|
||||
- AI 검증 결과 정상 표시
|
||||
- 통계 카드 정상 렌더링
|
||||
- 발언 분포 그래프 정상
|
||||
|
||||
### ✅ 07-회의종료.html
|
||||
- 회의 요약 정보 정상 표시
|
||||
- 버튼 네비게이션 정상
|
||||
|
||||
### ✅ 08-최종확정.html
|
||||
- 회의록 미리보기 정상 표시
|
||||
- 필수 항목 체크리스트 기능 정상
|
||||
- 모든 항목 체크 시 확정 버튼 활성화 정상
|
||||
|
||||
### ✅ 09-회의록공유.html
|
||||
- 공유 링크 표시 정상
|
||||
- 공유 방식 선택 UI 정상
|
||||
- 참석자 목록 표시 정상
|
||||
|
||||
### ✅ 10-Todo관리.html
|
||||
- 칸반 보드 레이아웃 정상
|
||||
- Todo 카드 표시 정상
|
||||
- 담당자 아바타 표시 정상
|
||||
|
||||
---
|
||||
|
||||
## 스크린샷
|
||||
테스트 중 캡처한 스크린샷은 `.playwright-mcp/screenshots/` 디렉토리에 저장됨:
|
||||
- 01-login.png
|
||||
- 02-dashboard.png
|
||||
- 03-meeting-reserve.png
|
||||
- 03-form-filled.png
|
||||
- 04-template-selection.png
|
||||
- 05-meeting-progress.png
|
||||
- 06-verification-complete.png
|
||||
- 07-meeting-end.png
|
||||
- 08-final-confirmation.png
|
||||
- 09-meeting-share.png
|
||||
- 10-todo-management.png
|
||||
|
||||
---
|
||||
|
||||
## 다음 작업
|
||||
1. 대시보드 FAB 버튼 이벤트 핸들러 수정
|
||||
2. 회의 예약 폼 제출 로직 수정
|
||||
3. common.js 중복 로드 문제 해결 (선택적)
|
||||
4. 전체 재테스트
|
||||
|
||||
---
|
||||
|
||||
## 테스트 환경
|
||||
- 브라우저: Playwright (Chromium)
|
||||
- 운영체제: Windows 10
|
||||
- 테스트 도구: Claude Code + Playwright MCP
|
||||
|
||||
---
|
||||
|
||||
## 개선 사항 (2025-10-20 추가)
|
||||
|
||||
### Todo-회의록 자동 링크 기능 개선
|
||||
|
||||
**문제점**: 회의록과 업무이력(Todo)의 자동 링크가 명확하게 표현되지 않음
|
||||
- Todo 관리 화면에서 어떤 회의에서 생성되었는지 알 수 없음
|
||||
- 회의록 공유 화면에서 생성된 Todo 목록과 진행 상황이 표시되지 않음
|
||||
- 양방향 연결이 누락됨
|
||||
|
||||
**개선 내용**:
|
||||
|
||||
1. **10-Todo관리.html 개선**
|
||||
- 모든 Todo 카드에 "출처 회의록" 정보 추가
|
||||
- 회의 제목, 날짜 표시
|
||||
- 회의록으로 이동하는 클릭 가능한 링크 추가
|
||||
- 칸반 보드 5개, 리스트 뷰 3개 항목 모두 적용
|
||||
|
||||
2. **09-회의록공유.html 개선**
|
||||
- "생성된 Todo" 섹션 추가
|
||||
- 3개 Todo 항목 표시 (제목, 담당자, 마감일)
|
||||
- 진행 상황 표시 (진행중 60%, 완료 100%, 지연 30%)
|
||||
- "Todo 보기" 링크로 Todo 관리 페이지 연결
|
||||
|
||||
**개선 효과**:
|
||||
- ✅ Todo와 회의록 간 양방향 연결 구현
|
||||
- ✅ 업무 이력 추적 가능성 향상
|
||||
- ✅ 유저스토리 차별화 포인트 명확하게 구현
|
||||
- UFR-TODO-010: "관련 회의록 링크 (섹션 위치 포함)"
|
||||
- UFR-RAG-020: "과거 회의록 및 업무 이력 연결"
|
||||
- ✅ 회의 결과물의 실행 상황 실시간 파악 가능
|
||||
|
||||
**변경된 파일**:
|
||||
- design/uiux/prototype/10-Todo관리.html (8개 위치 수정)
|
||||
- design/uiux/prototype/09-회의록공유.html (1개 섹션 추가)
|
||||
|
||||
---
|
||||
|
||||
### 회의 진행 중 관련 자료 실시간 제공 기능 추가
|
||||
|
||||
**문제점**: 회의 진행 중 현재 논의 주제와 관련된 과거 회의록 및 업무이력 정보 부재
|
||||
- 참석자가 이전 논의 맥락을 알 수 없음
|
||||
- 관련 Todo 진행 상황을 실시간으로 파악할 수 없음
|
||||
- 중복 논의 또는 누락된 사항 발생 가능
|
||||
|
||||
**개선 내용**:
|
||||
|
||||
1. **05-회의진행.html 사이드 패널 개선**
|
||||
- "관련 자료" 탭 신규 추가 (참석자, AI 제안 탭에 이어 3번째 탭)
|
||||
- 실시간 컨텍스트 기반 정보 제공
|
||||
|
||||
2. **관련 회의록 섹션 (3건 표시)**
|
||||
- 회의 제목, 날짜, 관련도 점수 표시
|
||||
- 회의 요약 미리보기
|
||||
- 공통 키워드 하이라이트
|
||||
- 클릭 시 새 탭에서 회의록 열기
|
||||
- 예시:
|
||||
- "2024년 4분기 제품 기획 회의" (관련도 92%)
|
||||
- "API 설계 리뷰 회의" (관련도 78%)
|
||||
- "주간 진행 상황 점검" (관련도 71%)
|
||||
|
||||
3. **관련 업무이력 섹션 (2건 표시)**
|
||||
- Todo 제목, 담당자, 마감일, 진행률 표시
|
||||
- 실시간 상태 배지 (진행중/지연/완료)
|
||||
- 출처 회의록 정보 표시
|
||||
- 관련 사유 설명
|
||||
- 클릭 시 Todo 관리 페이지로 이동
|
||||
- 예시:
|
||||
- "API 명세서 작성" (담당: 이준호, 진행중 60%)
|
||||
- "예산 편성안 검토" (담당: 박서연, 지연 30%)
|
||||
|
||||
**개선 효과**:
|
||||
- ✅ 회의 중 과거 맥락 실시간 파악 가능
|
||||
- ✅ 중복 논의 방지 및 연속성 확보
|
||||
- ✅ 관련 Todo 진행 상황 즉시 확인 가능
|
||||
- ✅ 유저스토리 차별화 포인트 명확하게 구현
|
||||
- UFR-AI-040: "관련 회의록 자동 연결" 구현
|
||||
- UFR-RAG-020: "관련 회의록과 업무 이력을 바탕으로 실용적인 정보 제공" 구현
|
||||
- UFR-RAG-030: "관련 문서 자동 연결" 구현
|
||||
- ✅ AI 기반 지능형 회의 진행 지원
|
||||
|
||||
**기술적 구현**:
|
||||
- RAG(Retrieval-Augmented Generation) 시스템 시뮬레이션
|
||||
- 관련도 점수 알고리즘 (벡터 유사도 기반)
|
||||
- 실시간 컨텍스트 분석 및 추천
|
||||
|
||||
**변경된 파일**:
|
||||
- design/uiux/prototype/05-회의진행.html (1개 탭 추가, 관련 자료 섹션 구현)
|
||||
Loading…
x
Reference in New Issue
Block a user