본문으로 건너뛰기

인라인 편집

보이는 글자를 그 자리에서 고치는 칸입니다. 저장은 한 번만 일어나고, 실패해도 친 글을 잃지 않습니다.

보기는 평범한 글자이고 손을 올리거나 포커스가 오면 면과 연필이 나타납니다. 편집은 같은 자리 · 같은 크기의 입력칸이라 줄이 흔들리지 않습니다. 저장 · 취소 단추는 편집 중에만 보입니다. Enter 직후의 blur 가 다시 저장하지 않고, Esc 로 물린 입력칸이 사라지며 나는 blur 가 저장으로 바뀌지 않습니다. 의존성이 없습니다.

import
import { InlineEdit } from "@uyoolabs/ui/ui";
쓰는 곳
한 칸 · 자주 고치는 값(채널 주제 · 프로젝트 이름 · 키 · 대화 이름 · 문서 제목 · 표 셀). 권한이 없으면 readOnly 로 같은 자리에 글자만 둡니다.
쓰지 않는 경우
둘 이상을 같이 고치면 폼 + 저장 바(C-Form)를 씁니다. 보기를 링크처럼 밑줄로 꾸미지 않습니다(이동과 편집이 헷갈립니다). blur 로 조용히 버리지 않습니다. 편집칸 크기를 보기와 다르게 하지 않습니다. 상태 · 담당처럼 ‘고르는 값’은 Select · Combobox 를 셀 자리에 엽니다.

InlineEdit

키동작
Enter·Space·F2보기에서 편집으로. 포커스는 입력칸, 글자는 모두 골라 둔다
Enter저장. 한 · 일 조합 중이면 확정만 한다(isComposing 가드)
⌘/Ctrl+Enter여러 줄의 저장. Enter 는 줄바꿈
Esc원래 값으로 보기. 조합 중 Esc 는 조합만 물린다. 바깥 대화상자 · 드로어는 닫히지 않는다
Tab칸을 떠나면 저장하고 다음 칸으로(submitOnBlur). 빈 값으로 떠나면 원래 값
저장 · 취소 뒤포커스는 보기 버튼으로. 실패 · 검증 오류면 입력칸에 남는다

props

소스의 타입과 JSDoc 에서 생성한 표입니다. 컴포넌트를 고치면 pnpm gen 으로 다시 만듭니다.

InlineEdit

prop타입기본값설명
valuestring—원본값(제어)
defaultValuestring""처음 값(비제어)
displayValueReactNode—보기 상태에 보일 글자. 없으면 value. 편집은 늘 value(원본)를 연다 — 표시용 글이 원본을 덮지 않는다
onSave필수(next: string) => void | Promise<void>—바뀐 값을 받는다. Promise 면 끝날 때까지 저장 중이다. throw · reject 하면 편집을 남기고 친 글을 지킨다
onCancel() => void—
validate(next: string) => string | undefined—오류 문장을 돌려주면 저장하지 않는다. 기본 검사(빈 값 · maxLength) 뒤에 부른다
label필수string—접근성 이름(‘프로젝트 이름’). 보이지 않아도 필수다
placeholderstring—빈 값 보기(‘설명 추가’ + 더하기 아이콘)
size"sm" | "md" | "lg""md"sm 28 표 셀 · md 본문 · lg 20/600 제목
multilinebooleanfalse여러 줄. Enter 는 줄바꿈, ⌘/Ctrl+Enter 가 저장이다
maxLengthnumber—
requiredbooleantrue빈 값이면 저장하지 않는다
trimbooleantrue앞뒤 공백을 지워 견주고 보낸다
submitOnBlurbooleantrue칸을 떠나면 저장한다(빈 값으로 떠나면 원래 값으로 돌아간다)
optimisticbooleanfalsetrue 면 저장을 기다리지 않고 바로 보기로 돌아가 새 값을 보인다. 실패하면 되돌리고 오류 문장(목록 행 이름 바꾸기)
readOnlybooleanfalse권한 없음. 글자만 보인다(버튼 · 면 · 연필 · 포커스 없음)
selectOnEditbooleantrue편집에 들어갈 때 글자를 모두 고른다(결정 #53). false 면 커서를 끝에 둔다
showActionsbooleantrue편집 중에 저장 · 취소 단추를 보인다(결정 #53: 편집 중에만)
editingboolean—편집 상태(제어)
onEditingChange(editing: boolean) => void—
lang"ko" | "en" | "ja""ko"
labelsPartial<InlineEditLabels>—
classNamestring—