Task #204: 표 편집 Undo/Redo — 스냅샷 기반 이력 등록#728
Conversation
표 관련 커맨드(생성/행열 삽입·삭제/셀 분할·병합/표 삭제/캡션)가 WASM을 직접 호출하여 히스토리를 우회하던 문제를 수정. 기존 SnapshotCommand + executeOperation 인프라를 활용하여 모든 표 편집 작업에 스냅샷 기반 Undo/Redo를 적용. 대상 커맨드 (10건): - table:create, table:delete - table:insert-row-above, table:insert-row-below - table:insert-col-left, table:insert-col-right - table:delete-row, table:delete-col - table:cell-split, table:cell-merge - table:caption-toggle 접근 방식: 이슈 B안 (스냅샷 + SnapshotCommand 일괄 래핑) - 각 작업 전후 Document 스냅샷 자동 저장 - Undo: before 스냅샷 복원, Redo: after 스냅샷 복원 - 기존 텍스트 편집 Undo/Redo 스택과 통합 범위 외: HwpCtrl(hwpctl) API 경로 — 별도 이력 관리 필요 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
표 편집 커맨드들이 WASM을 직접 호출하면서 히스토리를 우회해 Undo/Redo가 동작하지 않던 경로를 InputHandler.executeOperation({ kind: 'snapshot', ... }) 기반으로 통합해, 표 편집도 스냅샷 기반 Undo/Redo 스택에 기록되도록 하는 PR입니다.
Changes:
- 표 생성/삭제, 행·열 삽입/삭제, 셀 분할/병합 등 표 편집 커맨드를
snapshotoperation으로 래핑하여 Undo/Redo 이력 등록 document-changed이벤트의 수동 발행을 제거하고executeOperation → afterEdit()흐름에 위임- 일부 작업 후 커서 이동/셀 선택 모드 종료 등의 후처리를
executeOperation흐름과 결합
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| paragraphIndex: 0, | ||
| charOffset: 0, | ||
| parentParaIndex: result.paraIdx, | ||
| controlIndex: 0, |
| wasm.insertTableRow(pos.sectionIndex, pos.parentParaIndex!, pos.controlIndex!, cellInfo.row, false); | ||
| return pos; | ||
| }, | ||
| }); |
1. table:create 커서 위치에 result.controlIdx 반영 (기존 하드코딩 controlIndex: 0 → WASM 반환값 사용) 2. safeTableOp 헬퍼 추가하여 모든 executeOperation 호출에 try/catch + console.error 에러 핸들링 복원 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
Copilot 리뷰 피드백 반영 (b8477e5):
|
PR #728 (@oksure) 옵션 A 처리 — 2 commits cherry-pick + no-ff merge. 본질 정정 (rhwp-studio/src/command/commands/table.ts +123/-101): - Issue #204 의 B안 (스냅샷 + SnapshotCommand 일괄 래핑) 채택 - 11 표 커맨드 영역 executeOperation({ kind: 'snapshot' }) 패턴 일관 적용 · table:create (createTable) · table:insert-row-above/-below (insertTableRow ×2) · table:insert-col-left/-right (insertTableColumn ×2) · table:delete-row (deleteTableRow) · table:delete-col (deleteTableColumn) · table:cell-split (splitTableCell — 단일/다중 셀 분기) · table:cell-merge (mergeTableCells) · table:delete (deleteTable — 선택 모드 + 셀 내부 분기) · table:caption-toggle (toggleTableCaption) - safeTableOp 헬퍼 영역 try/catch 보존 - Copilot 리뷰 반영 (commit b8477e5): controlIdx 사용 + 에러 핸들링 복원 인프라 재사용 (B안): - input-handler.ts:1485 case 'snapshot' 영역 SnapshotCommand 생성 + history.execute() + cursor.moveTo() + afterEdit() - WasmBridge.saveSnapshot/restoreSnapshot 광범위 사용 (input-handler-table/keyboard/text 영역 11+ 사용 사례) 자기 검증: - cherry-pick 충돌 0건 - TypeScript (tsc --noEmit) ✅ 통과 - cargo test --release ✅ ALL GREEN (Rust 변경 부재) - 광범위 sweep 7 fixture / 170 페이지 / 회귀 0 ✅ - WASM 빌드 4.60 MB - 작업지시자 웹 에디터 인터랙션 검증 ✅ 통과 — Ctrl+Z 표 편집 11 커맨드 정합 후속 분리 (PR 본문 명시): - HwpCtrl(hwpctl) API 경로 (hwpctl/actions/table-edit.ts) 영역 InputHandler 의 history 미접근 영역 아키텍처 변경 필요 영역 별건 후속 이슈 Issue #204 본질 정정 영역 closes #204
- mydocs/pr/archives/pr_728_review.md: 검토 문서 archives 이동 - mydocs/pr/archives/pr_728_report.md: 처리 보고서 작성 · rhwp-studio 영역 표 편집 11 커맨드 영역 영역 SnapshotCommand 래핑 · 인프라 재사용 (B안) — 위험 좁힘 영역 권위 사례 · 작업지시자 웹 에디터 인터랙션 검증 ✅ 통과 - mydocs/orders/20260510.md: PR #728 항목 추가 (5/10 사이클 영역 영역 4건 처리)
|
@oksure 님, 검토 + 머지 완료했습니다. 처리 결과옵션 A (2 commits cherry-pick + no-ff merge `8db18f58`) 로 처리. 자기 검증
작업지시자 웹 에디터 검증 ✅ 통과dev server 영역 영역 11 표 커맨드 영역 영역 Ctrl+Z 영역 정합 입증. `feedback_visual_judgment_authority` 권위 가드 영역 영역 인터랙션 본질 검증 정합. 본질Issue #204 의 B안 (스냅샷 + SnapshotCommand 일괄 래핑) 정합. 11 표 커맨드 영역 영역 `executeOperation({ kind: 'snapshot' })` 패턴 영역 일관 적용. 인프라 재사용 영역 영역 권위 사례 — `input-handler.ts:1485` `case 'snapshot'` + `WasmBridge.saveSnapshot/restoreSnapshot` 광범위 사용 (input-handler-table/keyboard/text 영역 11+ 사용 사례) 영역 영역 신규 도입 부재 영역 영역 위험 좁힘. 처리 보고서: `mydocs/pr/archives/pr_728_report.md`. 의도적 미정합 (PR 본문 명시 영역 정합)
후속 분리 (PR 본문 명시)HwpCtrl(hwpctl) API 경로 (`hwpctl/actions/table-edit.ts`) 영역 영역 InputHandler 영역 영역 history 미접근 영역 영역 아키텍처 변경 필요 영역 영역 별건. @oksure 님 20+ 사이클 (rhwp-studio + WASM API + 디버깅 툴킷 영역 핵심) 컨트리뷰션 영역 — 5/10 사이클 영역 PR #720/#723/#725/#728 영역 4건 처리 완료 영역. |
PR #728 (closes #204) 의 표 편집 11 커맨드 + 표 크기 조절 3 함수 SnapshotCommand 일괄 적용 머지로 본질적 정정이 이미 devel 에 반영되어 있어 cherry-pick 결과 empty commit (allow-empty). 컨트리뷰터 (@oksure) 의 commit 이력 보존 + author 정보 보존. 검증: - tsc --noEmit ✅ - cargo test --release ALL GREEN - 광범위 sweep 170/170 same - WASM 4.66 MB - 웹 에디터 인터랙션 검증 ✅ 통과 (3가지 크기 조절 경로 + Ctrl+Z) closes #158
performCut 패턴 정합 — 클립보드 복사만 제외한 동일 구조. 인프라 재사용: executeOperation snapshot (PR #728) + deleteSelection + deleteObjectControl + EditorContext 가드. 자기 정정 commit 2aafebc 포함 — devel HEAD 영역 영역 deleteObjectControl 래퍼 시그니처 영역 영역 'line' 타입 누락 (PR #752 와 무관, 신규 performDelete 호출 영역 영역 노출). 검증: - tsc --noEmit ✅ (자기 정정 후) - cargo test --release ALL GREEN - 광범위 sweep 170/170 same - WASM 4.66 MB - 웹 에디터 인터랙션 검증 ✅ 통과 (텍스트 / 그림 / 표 / 중첩 표 + Undo)
5/10 + 5/11 사이클 누적 — 외부 기여자 다수 PR 30+ 머지. Cargo.toml + rhwp-vscode/package.json + npm/editor/package.json + rhwp-studio/package.json: 0.7.10 → 0.7.11 rhwp-vscode/CHANGELOG.md: [0.7.11] 항목 추가 핵심 변경: - Skia native raster P8 (#761) + P9 (#769) — Layer IR contract hardening + text replay parity - HWP3 native 렌더링 (#753) — hwp3-sample10 8 단계 정정 + Git LFS pdf-large/ 신규 - 페이지네이션 정정 (#778) — Task #703 다단 컬럼 분배 회귀 정정 - rhwp-studio 인터랙션 (PR #781/#786/#787/#788) — scrollbar/수식/표 셀/도구 모음 결함 정정 - rhwp-studio editor 신규 기능 (PR #728/#748/#750/#760 등) — 표 편집 Undo/Redo + 다단 설정 + 다수 단축키
요약
표 관련 커맨드(생성/삭제/행열 삽입·삭제/셀 분할·병합/캡션)가 WASM을 직접 호출하여 히스토리를 우회하던 문제를 수정합니다.
기존
SnapshotCommand+executeOperation인프라를 활용하여 모든 표 편집 작업에 스냅샷 기반 Undo/Redo를 적용했습니다.접근 방식
이슈 #204 의 B안 (스냅샷 + SnapshotCommand 일괄 래핑) 을 채택했습니다.
ih.executeOperation({ kind: 'snapshot', ... })로 래핑saveSnapshot/restoreSnapshot)document-changed이벤트는executeOperation→afterEdit()에서 자동 발행되므로 수동 호출 제거대상 커맨드 (10건 + 캡션 1건)
table:createtable:insert-row-abovetable:insert-row-belowtable:insert-col-lefttable:insert-col-righttable:delete-rowtable:delete-coltable:cell-splittable:cell-mergetable:deletetable:caption-toggle범위 외
hwpctl/actions/table-edit.ts): HwpCtrl은 InputHandler의 히스토리에 접근하지 않으므로, HwpCtrl 경로의 Undo/Redo는 아키텍처 변경이 필요합니다 (별도 이슈).검증
cargo test— 전체 통과cargo clippy -- -D warnings— 경고 0건tsc --noEmit— 기존 WASM 모듈 타입 오류 외 신규 오류 없음감사합니다.