Merge branch 'wip/design-yabo': 용어 통일 (참석자/참석 → 참여자/참여)

UI/UX 설계서 및 유저스토리 용어 일관성 개선 (v1.5.9)

주요 변경사항:
- 화면설계서: 100개 인스턴스 변경
- 유저스토리: 132개 인스턴스 변경
- 프로토타입: 34개 인스턴스 변경
- 총 266개 인스턴스 용어 통일

사용자 역할 용어 체계 완전 통일 (생성자/참여자)

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

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
yabo0812 2025-10-28 20:04:31 +09:00
commit 419e3a7661
9 changed files with 874 additions and 1302 deletions

View File

@ -715,13 +715,22 @@
const meetingId = card.dataset.id; const meetingId = card.dataset.id;
const meetingStatus = card.dataset.status; const meetingStatus = card.dataset.status;
// 회의 정보 조회
const meeting = SAMPLE_MEETINGS.find(m => m.id == meetingId);
const isCreator = meeting.participants.some(p => p.id === currentUser.id && p.role === 'creator');
// 상태에 따른 이동 처리 // 상태에 따른 이동 처리
if (meetingStatus === 'ongoing') { if (meetingStatus === 'ongoing') {
navigateTo('05-회의진행.html'); navigateTo('05-회의진행.html');
} else if (meetingStatus === 'draft' || meetingStatus === 'complete' || meetingStatus === 'completed') { } else if (meetingStatus === 'draft' || meetingStatus === 'complete' || meetingStatus === 'completed') {
navigateTo('10-회의록상세조회.html'); navigateTo('10-회의록상세조회.html');
} else if (meetingStatus === 'scheduled') { } else if (meetingStatus === 'scheduled') {
navigateTo('03-회의예약.html'); // 생성자: 회의예약 화면(수정), 참여자: 시스템 알럿
if (isCreator) {
navigateTo('03-회의예약.html');
} else {
alert('아직 회의 시간이 되지 않아 참여하실 수 없습니다');
}
} }
} }
}); });
@ -782,7 +791,7 @@
// 예정된 회의 개수 (예정 + 진행중) // 예정된 회의 개수 (예정 + 진행중)
const scheduled = SAMPLE_MEETINGS.filter(m => m.status === 'scheduled' || m.status === 'ongoing').length; const scheduled = SAMPLE_MEETINGS.filter(m => m.status === 'scheduled' || m.status === 'ongoing').length;
// 작성중 회의록 개수 (내가 참한 회의 중 '작성중' 상태) // 작성중 회의록 개수 (내가 참한 회의 중 '작성중' 상태)
const drafts = SAMPLE_MINUTES.filter(m => const drafts = SAMPLE_MINUTES.filter(m =>
m.status === 'draft' && m.status === 'draft' &&
m.participants.some(p => p.id === currentUser.id) m.participants.some(p => p.id === currentUser.id)

View File

@ -226,7 +226,7 @@
transform: translateX(22px); transform: translateX(22px);
} }
/* 참자 */ /* 참자 */
.participants-chips { .participants-chips {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
@ -420,18 +420,18 @@
</div> </div>
</section> </section>
<!----> <!---->
<section class="form-section"> <section class="form-section">
<h2 class="section-title">자 *</h2> <h2 class="section-title">자 *</h2>
<!--자 칩 --> <!--자 칩 -->
<div class="participants-chips" id="participants-chips"> <div class="participants-chips" id="participants-chips">
<!-- 동적으로 생성 --> <!-- 동적으로 생성 -->
</div> </div>
<!--자 추가 버튼 --> <!--자 추가 버튼 -->
<button type="button" class="add-participant-btn" id="add-participant-btn"> <button type="button" class="add-participant-btn" id="add-participant-btn">
자 추가 자 추가
</button> </button>
</section> </section>
@ -459,11 +459,11 @@
<button type="submit" form="meeting-form" class="btn btn-primary">예약 완료</button> <button type="submit" form="meeting-form" class="btn btn-primary">예약 완료</button>
</div> </div>
<!--자 추가 모달 --> <!--자 추가 모달 -->
<div class="modal-overlay" id="add-participant-modal"> <div class="modal-overlay" id="add-participant-modal">
<div class="modal"> <div class="modal">
<div class="modal-header"> <div class="modal-header">
<h3 class="modal-title">자 추가</h3> <h3 class="modal-title">자 추가</h3>
<button class="modal-close"></button> <button class="modal-close"></button>
</div> </div>
<div class="modal-body"> <div class="modal-body">
@ -504,7 +504,7 @@
avatarColor: storedUser.avatarColor || CURRENT_USER.avatarColor avatarColor: storedUser.avatarColor || CURRENT_USER.avatarColor
} : CURRENT_USER; } : CURRENT_USER;
// 참자 목록 (현재 사용자는 기본 포함) // 참자 목록 (현재 사용자는 기본 포함)
let participants = [currentUser]; let participants = [currentUser];
// 폼 요소 // 폼 요소
@ -670,7 +670,7 @@
} }
/** /**
* 참자 칩 렌더링 * 참자 칩 렌더링
*/ */
function renderParticipantChips() { function renderParticipantChips() {
participantsChipsContainer.innerHTML = participants.map(p => ` participantsChipsContainer.innerHTML = participants.map(p => `
@ -693,10 +693,10 @@
} }
/** /**
* 참자 검색 결과 렌더링 * 참자 검색 결과 렌더링
*/ */
function renderSearchResults(query) { function renderSearchResults(query) {
// 샘플 사용자 목록에서 이미 추가된 참자 제외 // 샘플 사용자 목록에서 이미 추가된 참자 제외
const availableUsers = SAMPLE_USERS.filter(u => const availableUsers = SAMPLE_USERS.filter(u =>
!participants.some(participant => participant.id === u.id) !participants.some(participant => participant.id === u.id)
); );
@ -761,7 +761,7 @@
} }
if (participants.length === 0) { if (participants.length === 0) {
showToast('최소 1명의 참자를 추가해주세요', 'error'); showToast('최소 1명의 참자를 추가해주세요', 'error');
return false; return false;
} }
@ -855,13 +855,13 @@
showToast('회의 링크가 생성되었습니다', 'success'); showToast('회의 링크가 생성되었습니다', 'success');
}); });
// 참자 추가 // 참자 추가
addParticipantBtn.addEventListener('click', () => { addParticipantBtn.addEventListener('click', () => {
openModal('add-participant-modal'); openModal('add-participant-modal');
renderSearchResults(''); renderSearchResults('');
}); });
// 참자 검색 // 참자 검색
participantSearch.addEventListener('input', () => { participantSearch.addEventListener('input', () => {
renderSearchResults(participantSearch.value); renderSearchResults(participantSearch.value);
}); });

View File

@ -294,7 +294,7 @@
overflow-wrap: break-word; overflow-wrap: break-word;
} }
/* 참자 탭 */ /* 참자 탭 */
.participant-section-header { .participant-section-header {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
@ -679,7 +679,7 @@
<div class="tabs-container"> <div class="tabs-container">
<div class="tabs-header"> <div class="tabs-header">
<button class="tab-button active" onclick="switchTab('participants')"> <button class="tab-button active" onclick="switchTab('participants')">
</button> </button>
<button class="tab-button" onclick="switchTab('ai-suggestions')"> <button class="tab-button" onclick="switchTab('ai-suggestions')">
AI 메모 AI 메모
@ -692,10 +692,10 @@
</button> </button>
</div> </div>
<!--자 탭 --> <!--자 탭 -->
<div class="tab-content active" id="tab-participants"> <div class="tab-content active" id="tab-participants">
<div class="participant-section-header"> <div class="participant-section-header">
<h3 class="participant-section-title">자 관리</h3> <h3 class="participant-section-title">자 관리</h3>
<span class="participant-count">총 4명</span> <span class="participant-count">총 4명</span>
</div> </div>
@ -1043,7 +1043,7 @@
document.getElementById(`tab-${tabName}`).classList.add('active'); document.getElementById(`tab-${tabName}`).classList.add('active');
} }
// 참자 초대 // 참자 초대
function inviteParticipant() { function inviteParticipant() {
const emailInput = document.getElementById('inviteEmail'); const emailInput = document.getElementById('inviteEmail');
const email = emailInput.value.trim(); const email = emailInput.value.trim();

View File

@ -272,7 +272,7 @@
<div class="stats-grid"> <div class="stats-grid">
<div class="stat-item"> <div class="stat-item">
<div class="stat-value" id="participantsValue">4명</div> <div class="stat-value" id="participantsValue">4명</div>
<div class="stat-label"></div> <div class="stat-label"></div>
</div> </div>
<div class="stat-item"> <div class="stat-item">
<div class="stat-value" id="durationValue">90분</div> <div class="stat-value" id="durationValue">90분</div>
@ -571,7 +571,7 @@
// 바로 최종 확정 // 바로 최종 확정
function confirmMeetingDirectly() { function confirmMeetingDirectly() {
if (confirm('AI가 정리한 내용 그대로 최종 확정하시겠습니까?\n\n모든 안건이 자동으로 검증 완료 처리되며, 참자에게 확정 알림이 발송됩니다.')) { if (confirm('AI가 정리한 내용 그대로 최종 확정하시겠습니까?\n\n모든 안건이 자동으로 검증 완료 처리되며, 참자에게 확정 알림이 발송됩니다.')) {
showToast('회의록이 최종 확정되었습니다', 'success'); showToast('회의록이 최종 확정되었습니다', 'success');
setTimeout(() => { setTimeout(() => {
navigateTo('02-대시보드.html'); navigateTo('02-대시보드.html');

View File

@ -1083,7 +1083,7 @@
<div class="stats-grid"> <div class="stats-grid">
<div class="stat-item"> <div class="stat-item">
<div class="stat-value">4명</div> <div class="stat-value">4명</div>
<div class="stat-label"></div> <div class="stat-label"></div>
</div> </div>
<div class="stat-item"> <div class="stat-item">
<div class="stat-value">90분</div> <div class="stat-value">90분</div>

View File

@ -246,7 +246,7 @@
} }
.agenda-verification:not([data-is-creator="true"]) .creator-only { .agenda-verification:not([data-is-creator="true"]) .creator-only {
display: none; /* 참자 환경에서는 숨김 */ display: none; /* 참자 환경에서는 숨김 */
} }
.agenda-verification:not(.verified) .creator-only { .agenda-verification:not(.verified) .creator-only {
@ -339,11 +339,11 @@
10-회의록상세조회.html → 하단 액션 바 "수정" 버튼 클릭 10-회의록상세조회.html → 하단 액션 바 "수정" 버튼 클릭
[권한 제어] [권한 제어]
- 검증완료 전 (작성중/초안 상태): 모든 참자가 수정 가능 - 검증완료 전 (작성중/초안 상태): 모든 참자가 수정 가능
- 검증완료 후: 회의 생성자만 수정 가능 (참자는 "수정" 버튼 비활성화) - 검증완료 후: 회의 생성자만 수정 가능 (참자는 "수정" 버튼 비활성화)
- 참자 관리: 회의 생성자만 추가/삭제 가능 - 참자 관리: 회의 생성자만 추가/삭제 가능
- 회의 일시/장소: 읽기 전용 (회의 예약 화면에서만 변경 가능) - 회의 일시/장소: 읽기 전용 (회의 예약 화면에서만 변경 가능)
- 안건별 검증: 회의 생성자는 잠금 해제 후 수정 가능, 참자는 읽기 전용 - 안건별 검증: 회의 생성자는 잠금 해제 후 수정 가능, 참자는 읽기 전용
- AI 한줄 요약: 모든 사용자에게 읽기 전용 (UFR-AI-036) - AI 한줄 요약: 모든 사용자에게 읽기 전용 (UFR-AI-036)
--> -->
@ -469,7 +469,7 @@
</div> </div>
<!-- 안건별 검증 (UFR-COLLAB-030) --> <!-- 안건별 검증 (UFR-COLLAB-030) -->
<!--자: 체크박스만 표시 (검증완료 시 읽기 전용) --> <!--자: 체크박스만 표시 (검증완료 시 읽기 전용) -->
<!-- 생성자: 검증완료 시 "잠금 해제" 버튼 표시 --> <!-- 생성자: 검증완료 시 "잠금 해제" 버튼 표시 -->
<div class="agenda-verification verified" id="verify-agenda-1" data-is-creator="true"> <div class="agenda-verification verified" id="verify-agenda-1" data-is-creator="true">
<input type="checkbox" class="checkbox" id="verify-1" checked disabled> <input type="checkbox" class="checkbox" id="verify-1" checked disabled>
@ -546,7 +546,7 @@
</div> </div>
<!-- 안건별 검증 (UFR-COLLAB-030) --> <!-- 안건별 검증 (UFR-COLLAB-030) -->
<!--자: 체크박스만 표시 (검증완료 시 읽기 전용) --> <!--자: 체크박스만 표시 (검증완료 시 읽기 전용) -->
<!-- 생성자: 검증완료 시 "잠금 해제" 버튼 표시 --> <!-- 생성자: 검증완료 시 "잠금 해제" 버튼 표시 -->
<div class="agenda-verification verified" id="verify-agenda-2" data-is-creator="true"> <div class="agenda-verification verified" id="verify-agenda-2" data-is-creator="true">
<input type="checkbox" class="checkbox" id="verify-2" checked disabled> <input type="checkbox" class="checkbox" id="verify-2" checked disabled>

View File

@ -513,7 +513,7 @@
<!-- 참여 유형 탭 (다중 선택 가능) --> <!-- 참여 유형 탭 (다중 선택 가능) -->
<div class="participation-tabs"> <div class="participation-tabs">
<button class="participation-tab" data-type="attended" onclick="toggleParticipationType('attended')"> <button class="participation-tab" data-type="attended" onclick="toggleParticipationType('attended')">
한 회의 한 회의
</button> </button>
<button class="participation-tab" data-type="created" onclick="toggleParticipationType('created')"> <button class="participation-tab" data-type="created" onclick="toggleParticipationType('created')">
생성한 회의 생성한 회의
@ -527,7 +527,7 @@
<input <input
type="text" type="text"
class="search-input" class="search-input"
placeholder="회의 제목, 참자, 키워드 검색" placeholder="회의 제목, 참자, 키워드 검색"
id="searchInput" id="searchInput"
oninput="applyFilters()" oninput="applyFilters()"
onkeypress="if(event.key==='Enter') handleSearch()" onkeypress="if(event.key==='Enter') handleSearch()"

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff