숫자 편집기
▲▼ 버튼과 화살표 키로 단계를 바꾸는 숫자 편집기. Shift는 10배, 소수 단계도 오차 없이, min·max는 편집·붙여넣기·채우기에서 모두 검사합니다.
실행 예제숫자 편집기
단계, Shift 10배, 소수, min·max 안내.
이 데모의 코드
import { createGrid, type ColumnDef, type Row } from '@freegridjs/core';
import { makeRows } from '../data';
import { button, separator, text, tr, type DemoContext } from '../ui';
export default function mount(ctx: DemoContext) {
const h = (en: string, ko: string) => tr(ctx.lang, { en, ko });
const data = makeRows(150).map((r, i) => ({ ...r, qty: i % 40, rate: Math.round((i % 20) * 5) / 100, rating: (i % 11) / 2 }));
const grid = createGrid(ctx.host, {
columns: [
{ field: 'name', header: h('Name', '이름'), width: 150 },
{ field: 'qty', header: h('Qty (0–99)', '수량(0~99)'), type: 'number', width: 120, editable: true, editor: { type: 'number', min: 0, max: 99 } },
{ field: 'rate', header: h('Rate (step 0.05)', '비율(0.05씩)'), type: 'number', format: '0.00', width: 140, editable: true, editor: { type: 'number', min: 0, max: 1, step: 0.05 } },
{ field: 'rating', header: h('Rating (0–5, 0.5)', '평점(0~5, 0.5씩)'), type: 'number', format: '0.0', width: 150, editable: true, editor: { type: 'number', min: 0, max: 5, step: 0.5 } },
],
data, locale: ctx.lang,
});
grid.on('validationFailed', e => ctx.log(`refused ${String(e.value ?? '')}: ${e.message}`));
text(ctx, h('Double-click a number: ↑ ↓ or ▲▼ step, Shift ×10. Type a value outside the range to see the message.',
'숫자를 더블클릭하세요. ↑ ↓나 ▲▼로 단계, Shift는 10배. 범위 밖 값을 입력하면 안내가 나옵니다.'));
separator(ctx);
// pasting follows the same min / max rule as typing
const paste = (v: number) => {
grid.setRange({ start: { rowIndex: 0, colId: 'qty' }, end: { rowIndex: 0, colId: 'qty' } });
const r = grid.pasteText(String(v));
ctx.log(r.changed
? h(`${v} is within 0–99: pasted into row 1`, `${v}은(는) 0~99 범위 안이라 1행에 붙여넣었습니다`)
: h(`${v} is outside 0–99: not pasted (skipped ${r.skipped} cell)`, `${v}은(는) 0~99 범위를 벗어나 붙여넣지 않았습니다 (건너뜀 ${r.skipped}칸)`));
};
button(ctx, h('Paste 50 into row 1 (accepted)', '1행에 50 붙여넣기 (허용)'), () => paste(50));
button(ctx, h('Paste 150 into row 1 (refused)', '1행에 150 붙여넣기 (거부)'), () => paste(150));
return grid;
}숫자 컬럼(type: 'number')은 1,234, ₩5,000 같은 입력도 받는 입력칸으로 편집합니다. editor: { type: 'number', min, max, step }을 주면 ▲▼ 버튼, 화살표 키 단계, 범위 제한이 더해집니다.
기본 사용
const columns = [
{ field: 'qty', type: 'number', editable: true, editor: { type: 'number', min: 0, max: 999 } },
{ field: 'rate', type: 'number', format: '0.00', editable: true, editor: { type: 'number', min: 0, max: 1, step: 0.05 } },
{ field: 'rating', type: 'number', format: '0.0', editable: true, editor: { type: 'number', min: 0, max: 5, step: 0.5 } },
];키보드와 마우스
| 키 | 동작 |
|---|---|
| ↑ / ↓ | 한 단계 위 / 아래(min~max 안에서 멈춤) |
| Shift + ↑ / ↓ | 10단계 |
| ▲ / ▼ 버튼 | 한 단계(키보드 포커스는 입력칸에 그대로) |
| Enter / Tab / Esc | 저장 후 이동 / 저장 후 다음 칸 / 취소 |
옵션
| 이름 | 타입 | 설명 |
|---|---|---|
min / max | number | 범위. 입력·붙여넣기·채우기 값이 범위를 벗어나면 '{min}~{max} 사이의 값을 입력하세요'(언어별) 안내와 함께 거부되고, validate()에도 나옵니다. |
step | number | 한 단계 크기(기본 1). 소수 단계도 정확히 더합니다: 0.1 + 0.2는 0.3. |
어디서나 적용되는 범위
- 입력: 값이 맞을 때까지 편집기가 열린 채 셀 아래에 안내가 보입니다.
- 붙여넣기·채우기 핸들: 범위 밖 값은 건너뛰어 셉니다.
validate()와validateCell()이 범위 밖 셀을 알려 줍니다(유효성 검사 참고).- 한쪽만 줘도 됩니다:
{ min: 0 }은 "0~∞"로 안내합니다.