CrownyDoc 협업 약점 #85 + #77 구현
개요
CrownyDoc Office Suite 협업 관련 약점 2개를 수정했다.
- #85 파일 히스토리 타임라인 없음 (HIGH / large effort) → done
- #77 오프라인 편집/동기화 없음 (HIGH / large effort) → done
무엇을 했는지
#85 — CrownyHistory (파일 히스토리 타임라인)
collab-client.js 끝에
CrownyHistory 생성자 함수 추가.
saveVersion(docId, content, author, message) — localStorage에 최대 50개 버전 저장 (용량 초과 시 10개로 자동 축소)
getVersions(docId) — 최신순 버전 목록 반환
restoreVersion(docId, version) — 특정 버전 내용 복원
diffVersions(docId, v1, v2) — 라인별 diff (add/remove/change)
showHistoryPanel(docId) — 우측 300px 패널 UI
세로선 + 원형 노드 타임라인
각 노드: 버전번호, 시간(YYYY-MM-DD HH:mm), 작성자, 메시지, 글자수
클릭: 상단 미리보기(최대 300자), 더블클릭: 확인 후 에디터에 복원#77 — CrownyOffline (오프라인 편집/동기화)
collab-client.js 끝에
CrownyOffline 생성자 함수 추가.
init() — 네트워크 이벤트 바인딩 + 이미 오프라인이면 표시줄 즉시 노출
isOnline() — navigator.onLine 기반 상태 확인
saveOffline(docId, content) — localStorage에 {docId, content, savedAt, synced:false} 저장; 문서 목록 키(crowny-offline-docs)도 관리
getOfflineChanges() — synced:false 인 레코드만 반환
syncOnReconnect() — POST /api/sync-offline 으로 각 레코드 전송; 200-299 응답 시 synced:true 갱신 후 성공 토스트
_showOfflineIndicator() — 상단 빨간 고정 바 "오프라인 — 변경 사항은 자동 저장되며 온라인 복귀 시 동기화됩니다."
_hideOfflineIndicator() — 바 제거
_bindNetworkEvents() — window offline/online 이벤트 리스너; 온라인 복귀 시 syncOnReconnect() 자동 호출
관련 파일 경로
/Users/ef/CrownyDoc/한선씨/정적/collab-client.js — JS 구현 (165줄→481줄)
/Users/ef/CrownyDoc/한선씨/협업/히스토리오프라인.한선 — 한선씨 동반 파일 (220줄, 신규)
/Users/ef/CrownyDoc/benchmark-weaknesses.json — #85, #77 status: done
잔여 이슈
- 서버 측
/api/sync-offline 엔드포인트가 아직 없음 → server-docs.js에 추가 필요
- Service Worker 기반 오프라인 캐싱은 미구현 (현재 localStorage만 사용)
showHistoryPanel 에서 에디터 셀렉터(contenteditable, textarea#editor, #editor)가 실제 에디터 DOM과 맞는지 앱 통합 시 확인 필요