Skip to content

기본 편집 Profile의 전체 선택·확정·Undo 연결을 구현한다 #727

Description

@developer-1px

Goal Anchor

  • Outcome: 기본 편집 Profile에서 전체 선택을 반복해도 유지하고, 명시적 draft의 확정이 거절되면 수정 후 재시도할 수 있으며, Undo 입력이 기존 정본 해석과 편집 전후 선택 복원으로 연결되게 한다.
  • Done: 아래 네 구현을 기존 owner의 공개 API·reference·site Usage·source 등록에 연결하고, 기존 호출 호환성과 성공·거절·반복·빈 대상의 동작을 테스트한다. 앞서 확인한 Rich Text의 선택 → 교체 → Undo → Redo 사례를 영구 회귀 테스트에 넣고 실제 변경된 입력 경로를 검증한다. 학습 댓글과 구현 PR로 제공한다.
  • Don't: Core six-member 계약·Stable profile·package 배치를 변경하지 않는다. 새 editor·command bus·profile registry를 만들지 않는다. 기존 토글 입력과 void rename callback의 의미를 몰래 바꾸지 않는다. 비동기 확정, 새로운 IME·native Cut·여러 view History 정책이나 모든 Hands의 완성·독립 상호운용 인증으로 범위를 넓히지 않는다.

승인 근거와 설계 의존

사용자는 #725 / #726에서 정리한 기본 동작 12개 계약표와 최소 변경안을 전달받은 뒤 “진행해”라고 요청했다. 직전 전달의 네 범위는 전체 선택의 반복 입력 정책, 구조 editor의 한 번에 전체 선택하기, 확정 거절 시 draft를 유지하는 경로, 공통 Undo 입력 해석이다.

설계 정본은 #726의 97405f78에 있는 standards/editing-grammar.md의 “기본 동작별 계약”과 “하이라키 검토와 최소 코드 변경안”이다. #725는 설계 작업의 기록을 유지하고 이 이슈가 runtime 구현을 소유한다. 설계 문서 PR의 머지는 이번 요청의 전제가 아니다.

구체적인 구현 계약

  1. 반복 전체 선택 — Affordance
    • selectAllAffordance(stroke, state, { repeat: "preserve" }) 경로는 전체 선택 상태에서 다시 입력해도 select-all을 유지한다.
    • 옵션 생략과 명시적 토글은 기존 allSelected에 따른 select-all / clear 동작을 보존한다.
    • 기본 동작을 보여 주는 Usage는 preserve 경로를 소비한다. Host에서 입력 해석이나 토글 판정을 재구현하지 않는다.
  2. 구조 editor의 전체 선택 — Editing의 기존 domain owner
    • Document·Order·Tree·Sheet의 기존 Intent에 전체 선택 작업을 추가하고 기존 Selection family를 사용한다.
    • Document·Order는 해당 문서의 순서, Tree는 visible topology, Sheet는 선언된 행·열 topology를 전체 집합으로 삼는다.
    • 0·1·여러 대상에서 한 작업으로 최종 선택을 발행하며 첫·끝 선택을 연속 dispatch하는 중간 상태를 노출하지 않는다. 같은 집합의 반복 선택은 내용과 문서 Undo/Redo 기록을 보존한다.
    • 기존 point 선택 호출·Copy/Cut/Paste 대상과 Object의 기존 한 번에 ID 집합 선택하기는 유지한다.
  3. 거절 후 draft 유지 — Affordance rename session
    • 기존 onCommit: (...) => void와 새 동기 tryCommit: (...) => boolean 중 하나를 받는 경로를 제공한다. 둘을 함께 허용하지 않는다.
    • tryCommitfalse이면 draft와 편집 맥락을 유지하고 onFinish를 호출하지 않는다. 수정 후 성공하면 한 번 확정·종료·복귀한다. 취소는 확정 없이 종료한다.
    • 편집 검증과 문서 변경은 domain이 소유하고 Affordance는 성공 여부만 받는다. 기존 commits.push(...) 형태의 callback 호환성도 유지한다.
    • Order Usage는 정본 session과 item.rename 결과를 연결한다. Host에 별도 draft 복구 구현을 추가하지 않는다.
  4. 공통 Undo 해석과 복원 증거 — Web·Rich Text Web·기존 테스트 owner
    • Rich Text Web의 공통 Undo/Redo 키 해석은 createWebKeyboardAdapter를 소비한다. Text 삭제·IME·root 소유권은 기존 Rich Text Web에 둔다.
    • 기존 Rich Text 입력의 추가 modifier 수용 범위도 명시적으로 보존해 공통 resolver 연결이 기존 입력 의미를 바꾸지 않게 한다.
    • AlphaphX로 교체하는 정방향·역방향 선택에서 Undo/Redo가 내용·선택·기록을 복원하고, Undo 후 선택 이동이 Redo를 지우지 않는 영구 회귀 증거를 남긴다. 직접 호출·기본 metaKey·ctrlKey 해석과 실제 binding의 관찰 범위를 구별한다.

검증과 전달

  • 관련 owner의 동작·타입 호환성 테스트, typecheck·build, 문서 및 source/Usage 등록 검사.
  • 실제 변경되는 선택·rename·Undo 입력 경로의 browser 검증. 사용자 Chrome의 기존 연결을 우선 사용한다.
  • API reference와 Usage는 기존 owner 경로에서 갱신한다. 구현 중 관찰한 근거와 판단은 이슈 댓글에 남긴다.
  • 현재 사용자의 원래 checkout은 dirty이므로 보존한다. 소유한 별도 checkout의 최신 origin/main에서 구현 브랜치를 만든다.
  • 구현 PR은 이 이슈만 닫으며, 머지는 별도 승인 전까지 수행하지 않는다.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions