mirror of
https://github.com/hwanny1128/HGZero.git
synced 2025-12-06 10:16:24 +00:00
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:
commit
419e3a7661
@ -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)
|
||||||
|
|||||||
@ -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);
|
||||||
});
|
});
|
||||||
|
|||||||
@ -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();
|
||||||
|
|||||||
@ -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');
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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
1559
design/userstory.md
1559
design/userstory.md
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user