@topgrid/grid-core
TanStack Table abstraction wrapper + useGridState core hook · 무료 (MIT)
이 페이지는 소스 코드의 TSDoc 주석에서 자동 생성됩니다(내부 표식 정제). 큐레이트된 시작용 요약은 API 레퍼런스 참고.
총 109개 public export — 함수 24 · 훅 8 · 컴포넌트 15 · 타입 58 · 상수 4.
컴포넌트
BaseGrid
BaseGrid(props: BaseGridProps<TData>): Element
ColumnMenu
Per-column header menu. Returns null if the column exposes no applicable actions.
ColumnMenu(__namedParameters: ColumnMenuProps<TData>): null | Element
ColumnPinGrid
ColumnPinGrid(props: ColumnPinGridProps<TData>): Element
ColumnVisibilityMenu
컬럼 가시성 토글 드롭다운 메뉴.
ColumnVisibilityMenu(props: ColumnVisibilityMenuProps<TData>): Element
| 파라미터 | 타입 | 설명 |
|---|---|---|
props | ColumnVisibilityMenuProps<TData> | { table }. |
반환 — <details> 기반 컬럼 가시성 토글 UI.
예시
// Grid.tsx 내부 — columnPersistence 제공 시만 렌더
{props.columnPersistence !== undefined && (
<ColumnVisibilityMenu table={table} />
)}
참고 — - ColumnPersistenceOptions
DropIndicator
드래그 drop 위치에 렌더되는 파란 수직선 인디케이터.
DropIndicator(__namedParameters: { … }): null | Element
Grid
Grid(props: GridProps<TData> & { … }): ReactElement
GridPagination
Pagination UI 컨테이너 컴포넌트.
GridPagination(__namedParameters: GridPaginationProps<TData>): Element
GroupedHeaderGrid
GroupedHeaderGrid(props: GroupedHeaderGridProps<TData>): Element
PageSizeSelect
PageSizeSelect(props: PageSizeSelectProps): ReactNode
RowPinButton
RowPinButton(__namedParameters: RowPinButtonProps<TData>): Element
SortBadge
다중 정렬 우선순위 배지 — grid-core canonical source.
SortBadge(__namedParameters: SortBadgeProps): null | Element
SortClearButton
현재 정렬 상태를 전부 지우는 버튼.
onClear 콜백에 table.setSorting([]) 를 연결하여 사용.
SortClearButton(__namedParameters: SortClearButtonProps): Element
예시
<SortClearButton onClear={() => table.setSorting([])} />
참고 — SortClearButtonProps
TotalCount
TotalCount(props: TotalCountProps): ReactNode
TreeGrid
TreeGrid(props: TreeGridProps<TData>): Element
VirtualGrid
VirtualGrid(props: VirtualGridProps<TData>): Element
훅 (Hooks)
useColumnDrag
HTML5 Drag and Drop API 기반 컬럼 재정렬 hook.
useColumnDrag(props: UseColumnDragProps<TData>): UseColumnDragReturn
| 파라미터 | 타입 | 설명 |
|---|---|---|
props | UseColumnDragProps<TData> | UseColumnDragProps |
반환 — UseColumnDragReturn
useColumnOrderPersist
컬럼 순서를 localStorage에 저장/복원하는 hook.
- 반환:
{ saveOrder }— useColumnDrag 내부 handleColumnOrderChange에서 호출 - mount 시: localStorage.getItem → JSON.parse → table.setColumnOrder ( 복원)
- save 방법:
saveOrder(order)호출 → localStorage.setItem - 모든 localStorage 접근: adapter 가 try/catch
- SSR guard: adapter 가 처리
- QuotaExceededError: adapter 가 console.warn + silent skip
useColumnOrderPersist(__namedParameters: UseColumnOrderPersistProps<TData>): { … }
useColumnPersistence
컬럼 가시성 + 순서를 localStorage 에 영속화하는 훅.
useColumnPersistence(table: Table<TData>, options: ColumnPersistenceOptions): void
| 파라미터 | 타입 | 설명 |
|---|---|---|
table | Table<TData> | useReactTable 반환 Table 인스턴스. |
options | ColumnPersistenceOptions | 영속화 옵션 (ColumnPersistenceOptions). |
예시
// Grid.tsx 내부 — Rules of Hooks 준수: 항상 호출 (조건부 호출 금지)
useColumnPersistence(table, props.columnPersistence ?? { storageKey: '' });
참고 — - ColumnPersistenceOptions
useFullRowEdit
useFullRowEdit(__namedParameters: UseFullRowEditOptions<T>): FullRowEditApi<T>
useGridState
8개 TanStack 표준 state + setter를 한 번에 반환하는 통합 훅.
기존 variant(BaseGrid/VirtualGrid/...) 에서 각각 선언하던 5~7개의
useState<StateType> 호출을 1줄로 대체한다.
** 확장 (controlled/uncontrolled/initialState)**:
options미제공 시 과 동일 동작 (모든 state uncontrolled, 기본값).initialState: uncontrolled 모드에서 특정 키의 초기값 지정.state: 키 단위 controlled 모드 (state.sorting이 있으면 sorting controlled, 나머지 uncontrolled).onStateChange(next, key): state 변경 시 통보 — controlled/uncontrolled 양쪽 호출.
** (controlled + initialState 동시 제공)**: state 제공 시 해당 키의 initialState는 무시됨 (controlled 우선).
useGridState(options: UseGridStateOptions<TData>): GridState<TData>
반환 — GridState<TData> — 8 state 값 + 8 OnChangeFn<StateType> setter 객체.
예시
// G-001 호환 (파라미터 없음)
const s = useGridState<User>();
// uncontrolled + initialState (G-002)
const s = useGridState<Slip>({
initialState: { sorting: [{ id: 'date', desc: true }], pagination: { pageIndex: 0, pageSize: 20 } },
});
// controlled mode — Redux 연동 (G-002)
const s = useGridState<Attendance>({
state: { sorting: externalSorting },
onStateChange: (next, key) => {
if (key === 'sorting') dispatch(setGridSorting(next.sorting));
},
});
// TanStack useReactTable 직접 소비
const table = useReactTable<User>({
data,
columns,
state: {
sorting: s.sorting,
columnFilters: s.columnFilters,
rowSelection: s.rowSelection,
pagination: s.pagination,
},
onSortingChange: s.setSorting,
onColumnFiltersChange: s.setColumnFilters,
onRowSelectionChange: s.setRowSelection,
onPaginationChange: s.setPagination,
getCoreRowModel: getCoreRowModel(),
getSortedRowModel: getSortedRowModel(),
});
G-004 확장 (resetState / resetSection / clearSelectionKey):
resetState(): 8개 state 모두initialState(or defaultValues) 로 복원.resetSection(key): 단일 또는 배열 key 의 state 만 선택적 복원 (Set dedup 멱등).options.clearSelectionKey: 외부 트리거 (string | number) 변경 시rowSelection자동 reset. XxgridTableclearSelectionKey패턴 흡수 (R-A). mount 시 reset 미발생 (isFirstClearRender flag).
참고 — - GridState, - UseGridStateOptions
useStoragePersist
GridStateValues ↔ localStorage / sessionStorage 동기화 옵션 helper.
- state 변경 시
debounceMs(기본 300ms) 후 storage에 저장 - mount 시 storage → state 역방향 hydration (
onHydrate콜백 — ) - version mismatch / parse 실패 →
removeItem+onHydrate미호출 - SSR safe (
typeof windowguard inside useEffect body — ) - 완전 준수: option 3 (eslint-disable) 0줄 (Option A saveRef 패턴 — )
useStoragePersist(state: GridStateValues<TData>, options: UseStoragePersistOptions<TData>): void
| 파라미터 | 타입 | 설명 |
|---|---|---|
state | GridStateValues<TData> | useGridState 또는 기타 소스의 GridStateValues |
options | UseStoragePersistOptions<TData> | UseStoragePersistOptions (storageKey 필수) |
예시
const state = useGridState();
useStoragePersist(state, {
storageKey: 'my-grid-v1',
version: 1,
onHydrate: (partial) => {
if (partial.sorting) state.setSorting(partial.sorting);
if (partial.columnFilters) state.setColumnFilters(partial.columnFilters);
},
});
useUrlSync
GridStateValues의 임의 subset을 URL search params에 동기화하는 옵션 helper.
- state 변경 시
window.history.replaceState로 URL 갱신 - mount 시 URL → state 역방향 hydration (
onHydrate콜백 — ) - debounce 지원 (
debounceMs옵션 —useDebouncedCallback재사용) - router 라이브러리 의존 없음
- SSR safe (:
typeof window체크는 useEffect body 내부)
useUrlSync(state: GridStateValues<TData>, options: UseUrlSyncOptions<TData>): void
| 파라미터 | 타입 | 설명 |
|---|---|---|
state | GridStateValues<TData> | useGridState 또는 기타 소스의 GridStateValues |
options | UseUrlSyncOptions<TData> | UseUrlSyncOptions (전부 optional) |
예시
const state = useGridState();
useUrlSync(state, {
keys: ['sorting', 'columnFilters'],
onHydrate: (partial) => {
if (partial.sorting) state.setSorting(partial.sorting);
if (partial.columnFilters) state.setColumnFilters(partial.columnFilters);
},
});
useViewStatePersistence
Persist a single serializable view-state value to Web Storage (versioned envelope).
useViewStatePersistence(options: UseViewStatePersistenceOptions<T>): [T, ViewStateSetter<T>]
반환 — [value, setValue] — setValue writes through to storage.
함수
applyRowDraft
applyRowDraft — 행 편집 draft(변경 셀 모음)를 원본 행에 머지.
순수 함수 (node 검증). full-row editing 의 커밋 단위 = 행 전체 all-or-nothing 의 핵심 변환. draft 에 담긴 필드만 override 하고 새 객체를 반환한다(입력 불변, applyRowTransaction/moveRow 동형).
applyRowDraft(row: T, draft: Record<string, unknown>): T
| 파라미터 | 타입 | 설명 |
|---|---|---|
row | T | 원본 행 객체. |
draft | Record<string, unknown> | 변경 셀 { [field]: value }. 빈 객체면 원본의 동등 복사. |
반환 — 머지된 새 행({...row,...draft }). 원본 무변.
applyRowTransaction
Apply a RowTransaction to data, returning a NEW array (input never mutated).
Order = remove → update → add (XX Grid semantics). Updates/removes for ids not present are
ignored (no throw). update rows are matched by getRowId and replace the existing row in place.
applyRowTransaction(data: readonly TData[], txn: RowTransaction<TData>, getRowId: GetRowId<TData>): TData[]
blankToUndefined
Wrap an accessor so blank values (null/undefined/empty-or-whitespace string) become undefined,
letting sortUndefined place them. Real falsy values (0, false) pass through unchanged — the
classic bug is treating those as blank.
blankToUndefined(accessor: (…) => …): (…) => …
buildTreeFromPaths
data 의 각 행을 getDataPath 경로로 계층 트리로 변환(순수). 빈 경로 행은 스킵.
buildTreeFromPaths(data: readonly TData[], getDataPath: (…) => …): TreeNode<TData>[]
compareLocale
Locale-aware comparison of two cell values. Nullish coerces to '' (placement of nulls is a
separate concern — ). numeric: true gives natural number ordering within strings (a2 < a10);
sensitivity: 'variant' keeps accents significant.
compareLocale(a: unknown, b: unknown, locale: string | string[]): number
createAutoGroupColumn
Build a ready-made auto group column: indent-by-depth + expand/collapse chevron (only on expandable rows) + the node value. Sorting/filtering disabled.
createAutoGroupColumn(options: AutoGroupColumnOptions<TData>): ColumnDef<TData, unknown>
createColumns
TopgridColumnDef<TData>[] | ColumnInfo[] 를 받아 ColumnDef<TData>[] 반환.
type필드 기반 자동 renderer 분기 (rendererRegistry 조회)'checkbox'type → DisplayColumnDef (accessorKey 없음, enableSorting 강제 false)- registry 미등록 type → plain text fallback + console.warn
ColumnInfo[]입력 시 내부에서TopgridColumnDef로 narrowingwidth,enableSorting,enableResizing,meta표준 매핑
createColumns(defs: TopgridColumnDef<TData>[] | ColumnInfo[]): ColumnDef<TData>[]
| 파라미터 | 타입 | 설명 |
|---|---|---|
defs | TopgridColumnDef<TData>[] | ColumnInfo[] | column 정의 배열. TopgridColumnDef<TData>[] 또는 ColumnInfo[]. |
반환 — TanStack ColumnDef<TData>[] — useReactTable({ columns }) 에 직접 주입 가능.
예시
// TopgridColumnDef 직접 사용 (권장)
const defs: TopgridColumnDef<User>[] = [
{ id: 'name', name: '이름', type: 'text', align: 'left', width: '150' },
{ id: 'salary', name: '급여', type: 'number', align: 'right', width: '120' },
{ id: 'sel', name: '', type: 'checkbox', align: 'center', width: '50' },
];
const columns = createColumns<User>(defs);
// 기존 ColumnInfo[] 호환 (AC-005)
const legacyDefs: ColumnInfo[] = [...];
const columns = createColumns(legacyDefs);
참고 — - TopgridColumnDef, - ColumnInfo, - defaultRendererRegistry
createGroupedColumns
TopgridColumnGroup<TData>[] rest args를 받아 ColumnDef<TData>[] 반환.
createGroupedColumns(groups: TopgridColumnGroup<TData>[]): ColumnDef<TData>[]
| 파라미터 | 타입 | 설명 |
|---|---|---|
groups | TopgridColumnGroup<TData>[] | 그룹 컬럼 정의 rest args. 각 항목은 { header, columns } 형태. |
반환 — TanStack ColumnDef<TData>[] — useReactTable({ columns }) 에 직접 주입 가능.
예시
// 2-level 다단 헤더 (지급항목 그룹)
const columns = createGroupedColumns<Payroll>(
{
header: '지급항목',
columns: createColumns<Payroll>([
{ id: 'basePay', name: '기본급', type: 'number', align: 'right', width: '120' },
{ id: 'bonus', name: '상여', type: 'number', align: 'right', width: '100' },
{ id: 'totalPay', name: '합계', type: 'number', align: 'right', width: '120' },
]),
},
);
// 복수 그 룹 (기본정보 + 급여내역)
const columns = createGroupedColumns<Employee>(
{
header: '기본 정보',
columns: createColumns<Employee>([
{ id: 'empNo', name: '사번', type: 'text', align: 'center' },
{ id: 'name', name: '성명', type: 'text', align: 'left' },
]),
},
{
header: '급여 내역',
columns: createColumns<Employee>([
{ id: 'basePay', name: '기본급', type: 'number', align: 'right' },
{ id: 'bonus', name: '상여', type: 'number', align: 'right' },
{ id: 'totalPay', name: '합계', type: 'number', align: 'right' },
]),
},
);
참고 — - TopgridColumnGroup, - createColumns, - GroupedHeaderGrid
createTopgridColumnHelper
createTopgridColumnHelper(): ColumnHelper<TData>
createTransactionBatcher
: applyTransactionAsync analogue. enqueue accumulates transactions and arms a
single schedule(flush); flush applies them all to the current data in order and commits
via setData exactly once (batched). Re-arming happens on the next enqueue after a flush.
createTransactionBatcher(deps: TransactionBatcherDeps<TData>): TransactionBatcher<TData>