diff --git a/resources/tester/test_sheet_f2_caret.py b/resources/tester/test_sheet_f2_caret.py new file mode 100644 index 00000000..ade04c09 --- /dev/null +++ b/resources/tester/test_sheet_f2_caret.py @@ -0,0 +1,24 @@ +"""표 부품(`ui_template_sheet.ts`) 칸 고치기 — 엑셀처럼 F2 는 커서를 글 끝에(이어 씀). + +화면 조작은 ORCA 로 봄 — 여기서는 키마다 고치기 방식이 안 섞이는지만 봄. +""" + +from __future__ import annotations + +import re +from pathlib import Path + +SHEET = Path(__file__).resolve().parents[2] / "ui_template" / "sheet" / "ui_template_sheet.ts" + + +def test_F2_는_글_끝_바로_치기는_바꿈_두_번_누르기는_그대로(): + body = SHEET.read_text(encoding="utf-8") + # Enter · F2 = 글 끝 커서 + assert re.search( + r'event\.key === "F2"\) \{\s*event\.preventDefault\(\);\s*edit\(undefined, true\);', body + ) + # 바로 치기 = 누른 글자로 바꿈 + assert "edit(event.key);" in body + # 두 번 누르기 = 예전대로(글 전부 고름) + assert 'else if (target.closest("td[data-r]")) edit();' in body + assert "box.setSelectionRange(box.value.length, box.value.length)" in body diff --git a/ui_template/sheet/ui_template_sheet.ts b/ui_template/sheet/ui_template_sheet.ts index 086840de..5728c0e5 100644 --- a/ui_template/sheet/ui_template_sheet.ts +++ b/ui_template/sheet/ui_template_sheet.ts @@ -244,7 +244,8 @@ export function createSheet(host: HTMLElement, input: SheetDoc, opts: SheetOptio if (key === KEY_PRICE && typeof got === "string" && col) write(key, col, got); root.focus({ preventScroll: true }); }; - const edit = (initial?: string): void => { + /** 칸 고치기 — 두 번 누르기 = 글 전부 고름 · 바로 치기(initial) = 그 글자로 바꿈 · Enter · F2(atEnd) = 커서를 글 끝에 */ + const edit = (initial?: string, atEnd = false): void => { const sel = state.sel; const col = sel && colOf(sel.c); if (!sel || !col) return; @@ -258,7 +259,9 @@ export function createSheet(host: HTMLElement, input: SheetDoc, opts: SheetOptio if (!td) return; startEdit(td, rawText(sel.r, col), (value) => write(sel.r, col, value)); const box = td.querySelector("input"); - if (box && initial !== undefined) box.value = initial; + if (!box) return; + if (initial !== undefined) box.value = initial; + if (initial !== undefined || atEnd) box.setSelectionRange(box.value.length, box.value.length); }; /** 층 이름(머리 층 줄 머리 칸) 고치기 — master */ const editLayer = (th: HTMLElement): void => { @@ -337,7 +340,7 @@ export function createSheet(host: HTMLElement, input: SheetDoc, opts: SheetOptio move(0, event.shiftKey ? -1 : 1); } else if (event.key === "Enter" || event.key === "F2") { event.preventDefault(); - edit(); + edit(undefined, true); } else if (event.key === "Delete" || event.key === "Backspace") { const col = state.sel && colOf(state.sel.c); if (state.sel && col && keyEditable(state, state.sel.r, col)) {