Skip to content

Task #204: 표 편집 Undo/Redo — 스냅샷 기반 이력 등록#728

Closed
oksure wants to merge 2 commits into
edwardkim:develfrom
oksure:contrib/table-undo-redo
Closed

Task #204: 표 편집 Undo/Redo — 스냅샷 기반 이력 등록#728
oksure wants to merge 2 commits into
edwardkim:develfrom
oksure:contrib/table-undo-redo

Conversation

@oksure

@oksure oksure commented May 9, 2026

Copy link
Copy Markdown
Contributor

요약

표 관련 커맨드(생성/삭제/행열 삽입·삭제/셀 분할·병합/캡션)가 WASM을 직접 호출하여 히스토리를 우회하던 문제를 수정합니다.

기존 SnapshotCommand + executeOperation 인프라를 활용하여 모든 표 편집 작업에 스냅샷 기반 Undo/Redo를 적용했습니다.

접근 방식

이슈 #204B안 (스냅샷 + SnapshotCommand 일괄 래핑) 을 채택했습니다.

  • 각 표 편집 작업을 ih.executeOperation({ kind: 'snapshot', ... }) 로 래핑
  • 작업 전후 Document 스냅샷을 자동 저장 (saveSnapshot / restoreSnapshot)
  • Undo: before 스냅샷 복원, Redo: after 스냅샷 복원
  • 기존 텍스트 편집 Undo/Redo 스택과 자연스럽게 통합
  • document-changed 이벤트는 executeOperationafterEdit() 에서 자동 발행되므로 수동 호출 제거

대상 커맨드 (10건 + 캡션 1건)

커맨드 작업
table:create 표 생성 (대화상자 콜백)
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:delete 표 지우기
table:caption-toggle 캡션 넣기

범위 외

  • HwpCtrl(hwpctl) API 경로 (hwpctl/actions/table-edit.ts): HwpCtrl은 InputHandler의 히스토리에 접근하지 않으므로, HwpCtrl 경로의 Undo/Redo는 아키텍처 변경이 필요합니다 (별도 이슈).

검증

  • cargo test — 전체 통과
  • cargo clippy -- -D warnings — 경고 0건
  • tsc --noEmit — 기존 WASM 모듈 타입 오류 외 신규 오류 없음

감사합니다.

표 관련 커맨드(생성/행열 삽입·삭제/셀 분할·병합/표 삭제/캡션)가
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>
Copilot AI review requested due to automatic review settings May 9, 2026 02:35

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

표 편집 커맨드들이 WASM을 직접 호출하면서 히스토리를 우회해 Undo/Redo가 동작하지 않던 경로를 InputHandler.executeOperation({ kind: 'snapshot', ... }) 기반으로 통합해, 표 편집도 스냅샷 기반 Undo/Redo 스택에 기록되도록 하는 PR입니다.

Changes:

  • 표 생성/삭제, 행·열 삽입/삭제, 셀 분할/병합 등 표 편집 커맨드를 snapshot operation으로 래핑하여 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,
Comment on lines +104 to +117
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>
@oksure

oksure commented May 9, 2026

Copy link
Copy Markdown
Contributor Author

Copilot 리뷰 피드백 반영 (b8477e5):

  1. controlIndex 하드코딩 수정table:create에서 wasm.createTable() 반환값의 result.controlIdx를 커서 위치에 사용하도록 변경. 기존 controlIndex: 0 하드코딩은 동일 문단에 다른 컨트롤이 있을 경우 잘못된 커서 위치를 가리킬 수 있었습니다.

  2. 에러 핸들링 복원safeTableOp 헬퍼를 추가하여 모든 executeOperation 호출을 try/catch로 감싸고, 실패 시 console.error로 오류를 기록합니다. 기존 코드의 에러 핸들링 패턴을 유지하면서도 반복 코드를 최소화했습니다.

edwardkim added a commit that referenced this pull request May 9, 2026
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
edwardkim added a commit that referenced this pull request May 9, 2026
- 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건 처리)
@edwardkim

Copy link
Copy Markdown
Owner

@oksure 님, 검토 + 머지 완료했습니다.

처리 결과

옵션 A (2 commits cherry-pick + no-ff merge `8db18f58`) 로 처리.

자기 검증

  • cherry-pick (`25a9d1b2` + `b8477e5f`) 충돌 0건
  • `tsc --noEmit` ✅ 통과
  • `cargo test --release` ✅ ALL GREEN (Rust 변경 부재)
  • 광범위 sweep (7 fixture / 170 페이지) ✅ 170 same / 0 diff
  • WASM 빌드 ✅ 4.60 MB

작업지시자 웹 에디터 검증 ✅ 통과

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 본문 명시 영역 정합)

  • `splitTableCell` / `mergeTableCells` 영역 영역 `exitCellSelectionMode` 영역 snapshot 외부 호출 — 셀 선택 모드 영역 영역 Undo 범위 외 (UI 상태)
  • `toggleTableCaption` 영역 영역 캡션 제거 경로 미정합 — paragraph deletion 영역 별도 경로 (의도적)

후속 분리 (PR 본문 명시)

HwpCtrl(hwpctl) API 경로 (`hwpctl/actions/table-edit.ts`) 영역 영역 InputHandler 영역 영역 history 미접근 영역 영역 아키텍처 변경 필요 영역 영역 별건.

@oksure20+ 사이클 (rhwp-studio + WASM API + 디버깅 툴킷 영역 핵심) 컨트리뷰션 영역 — 5/10 사이클 영역 PR #720/#723/#725/#728 영역 4건 처리 완료 영역.

@edwardkim edwardkim closed this May 9, 2026
edwardkim added a commit that referenced this pull request May 10, 2026
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
edwardkim added a commit that referenced this pull request May 10, 2026
PR #748 (closes #158) 처리 보고서 + 검토 문서 archives 이동 + 5/10 orders 16번째 PR 행 추가.
PR #728 supersede 흡수 — 옵션 (b) cherry-pick + empty commit 으로 author 보존.

Merge commit: 5ce0bcc
Cherry-pick (empty): 312fc4c + d20a6a4
edwardkim added a commit that referenced this pull request May 10, 2026
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)
edwardkim added a commit that referenced this pull request May 10, 2026
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 + 다단 설정 + 다수 단축키
@edwardkim edwardkim mentioned this pull request May 10, 2026
4 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants