@topgrid/grid
Meta package — aggregates all @topgrid/grid-* packages (MIT + Pro facade) · 상용 (EULA)
이 페이지는 소스 코드의 TSDoc 주석에서 자동 생성됩니다(내부 표식 정제). 큐레이트된 시작용 요약은 API 레퍼런스 참고.
총 491개 public export — 함수 138 · 훅 21 · 컴포넌트 59 · 타입 264 · 상수 9.
컴포넌트
AggregationGrid
AggregationGrid — Pro component for row grouping + aggregation.
AggregationGrid(__namedParameters: AggregationGridProps<TData>): Element
예시
<AggregationGrid
data={rows}
columns={columns}
enableAggregation
grouping={['region']}
showFooter
/>
AvatarCell
Avatar cell — image with initials fallback ( handles broken src by swapping to the initials chip via onError state).
AvatarCell(__namedParameters: AvatarCellProps): Element
BaseGrid
BaseGrid — DEPRECATED alias of <Grid> ( props mapping).
AS-IS legacy BaseGrid 의
sort+filter ALWAYS wiring + pagination conditional 패턴을 유지.
BaseGrid(props: BaseGridProps<TData>): Element
ButtonCell
Button cell — small action button suitable for grid action columns.
Click handler stops propagation so it never triggers a row click (L0 pattern preserved). Variant Tailwind classes equal the L0 mapping with renamed keys ( — no visual change).
When both value and label are undefined, renders an empty <button>
(new behaviour — previously impossible since label was required; spec §5.1 fallback).
ButtonCell(__namedParameters: ButtonCellProps): Element
ChangeTrackingGrid
ChangeTrackingGrid(props: ChangeTrackingGridProps<TData> & { … }): ReactElement
ChartCard
RangeChart wrapped with an interactive type-switcher toolbar.
The toolbar buttons use inline styles (not Tailwind) so they are testable in the Tailwind-less
storybook harness (P27-1) and visibly reflect the active type via aria-pressed. Clicking a
button re-renders the chart with the new type — the chart shape genuinely changes
(data-chart-type), which is the non-vacuous claim the gate checks.
ChartCard(__namedParameters: ChartCardProps): Element
CheckCell
Checkbox cell — wraps a native <input type="checkbox"> centred inside
a flex container (L0 markup preserved). Both onClick and onChange call
stopPropagation so they never bubble to the grid row click handler.
CheckCell(__namedParameters: CheckCellProps): Element
ColumnPinGrid
ColumnPinGrid(props: ColumnPinGridProps<TData>): Element
ContextMenuGrid
ContextMenuGrid(props: ContextMenuGridProps<TData> & { … }): ReactElement
DataMapCell
DataMapCell<TData>: TanStack CellContext 수신 → column.dataMap.getDisplay(value) → 레이블 렌더.
- 정적 dataMap: column.columnDef.dataMap가 DataMap 인스턴스
- 함수형 dataMap: column.columnDef.dataMap(row.original) → DataMap 인스턴스
- getDisplay 결과 없음(undefined) → String(value ?? '') fallback (.3)
- dataMap 미설정 시 → String(value ?? '') fallback (.1)
: TanStack CellContext 표준 API 사용 : no any (DataMapColumnDef<TData> 타입 캐스팅 — DataMap 전용 확장 필드 접근용) : 가상화 호환 — resolveDataMap + getDisplay 모두 O(1)
DataMapCell(info: CellContext<TData, unknown>): Element
| 파라미터 | 타입 | 설명 |
|---|---|---|
info | CellContext<TData, unknown> | TanStack CellContext<TData, unknown> (createColumns.ts L128-130 패턴) |
반환 — span 엘리먼트 — 레이블 텍스트 또는 fallback
DataMapEditor
DataMapEditor<TItem>: 편집 셀 필터-타이핑 드롭다운 컴포넌트.
- 마운트 시 input에 자동 포커스
- 타이핑 → items 필터링 (대소문자 무관, IME 조합 중 필터 억제)
- 드롭다운: absolute z-50 bg-white border border-gray-200 rounded shadow-md max-h-48 overflow-y-auto
- 키보드: ArrowDown/Up 이동, Enter 선택, Escape 취소
- ARIA: role="combobox" + aria-expanded + role="listbox" + role="option"
- highlightedIndex: filtered.length 변경 시 -1 리셋 (spec Section 11.2 risk #4)
- isComposing: useRef<boolean> 사용 — setState 불필요 (spec Section 11.2 risk #3)
: DataMapEditorProps<TItem> 표준 API (spec Section 3.1) : no any — TItem 제네릭 상한 : Tailwind CSS only : getItems + Array.filter — O(n), 가상화 호환
DataMapEditor(props: DataMapEditorProps<TItem>): Element
| 파라미터 | 타입 | 설명 |
|---|---|---|
props | DataMapEditorProps<TItem> | DataMapEditorProps<TItem> |
반환 — 입력 필드 + 조건부 드롭다운 컨테이너
DateCell
Date/time cell renderer with locale-aware formatting.
Uses formatDateTimeFromDateTimeString (extracted from L0 inline toLocaleDateString + FORMAT_OPTIONS pattern). Returns dash for empty/invalid.
DateCell(__namedParameters: DateCellProps): Element
DateFilter
날짜 범위 필터 컴포넌트.
FilterPopover + FilterIndicator를 재사용하여 from/to DatePicker를 렌더.
column.setFilterValue 로 TanStack Table 필터링을 트리거.
DateFilter(__namedParameters: DateFilterProps<TData>): Element
예시
columnHelper.accessor('orderDate', {
filterFn: dateRangeFilterFn,
header: ({ column }) => (
<div>
주문일
<DateFilter column={column} />
</div>
),
});
DragFillHandle
DragFillHandle(__namedParameters: DragFillHandleProps<TCell>): null | ReactElement<any, string | JSXElementConstructor<any>>
DropIndicator
드래그 drop 위치에 렌더되는 파란 수직선 인디케이터.
DropIndicator(__namedParameters: { … }): null | Element
EditableCell
Inline editable cell with view ↔ edit mode transitions.
Markup contract (spec — absorbs L0 EditableGrid L82-126):
- View mode:
<div onClick={onStartEdit}>showingString(value ?? ''). - Edit mode (
isEditing === true): 'select'→<select>with options (or(옵션 없음)placeholder).'textarea'→<textarea>(Enter inserts newline; Tab/Blur commits).- default →
<input type={'text'|'number'|'date'}>.
Keyboard handling (L0 L65-72 preserved):
- Enter →
onCommit(draft)(excepttextarea— newline preserved). - Escape →
onCancel. - Tab →
e.preventDefault+onCommit(draft).
Local draft state is reset to String(value ?? '') whenever the cell
enters edit mode (via useEffect), which also schedules inputRef.focus.
When initialDraft is provided, the draft is initialised to it on the first
render (lazy useState) and the useEffect reset is skipped — the typed
character is already in the input when the <input> mounts.
EditableCell(__namedParameters: EditableCellProps): Element
FilterIndicator
활성 필터 인디케이터 — 파란 dot.
column.getIsFiltered 결과값을 isFiltered prop으로 전달.
필터 비활성 시 null 반환 (DOM 요소 없음).
FilterIndicator(__namedParameters: FilterIndicatorProps): null | Element
예시
<FilterIndicator isFiltered={column.getIsFiltered()} />
FilterPopover
텍스트 필터용 Popover 컨테이너.
trigger prop으로 트리거 요소를 받고, children으로 팝오버 내용을 렌더. open/close 상태를 내부적으로 관리 (외부 제어 불필요).
FilterPopover(__namedParameters: FilterPopoverProps): Element
FilterResetButton
필터 전체 초기화 버튼 컴포넌트.
FilterResetButton(__namedParameters: FilterResetButtonProps<TData>): Element
FiltersToolPanel
FiltersToolPanel — unified column-filter editing surface with an active-filter count.
Callback-only (no grid state). Pro watermark composited when unlicensed (root is relative).
FiltersToolPanel(__namedParameters: FiltersToolPanelProps): Element
GlobalSearchInput
전체 행 검색 입력 컴포넌트 (debounce 300ms).
GlobalSearchInput(__namedParameters: GlobalSearchInputProps<TData>): Element
Grid
Grid(props: GridProps<TData> & { … }): ReactElement
GridPagination
Pagination UI 컨테이너 컴포넌트.
GridPagination(__namedParameters: GridPaginationProps<TData>): Element
GroupedHeaderGrid
Legacy self-contained grid component with grouped multi-row headers.
Delegates header rendering to MultiRowHeader from @topgrid/grid-pro-header.
tbody and pagination are ported verbatim from AS-IS L0.
GroupedHeaderGrid(__namedParameters: GroupedHeaderGridProps<TData>): Element
GroupPanel
GroupPanel — drag-and-drop grouping bar.
Renders above the grid table. Column <th> elements in AggregationGrid
are marked draggable={true} when showGroupPanel=true, allowing users to
drag a column header here to add it to the grouping.
Chip X click removes the column from grouping ( uncontrolled support).
GroupPanel(__namedParameters: GroupPanelProps<TData>): ReactElement
IconCell
Icon cell — display an icon (with optional supporting label and click handler). The component is library-agnostic: it accepts any ReactNode for the icon prop ( — no external icon package dependency).
IconCell(__namedParameters: IconCellProps): Element
LinkCell
Link cell — renders one of three forms based on :
hrefprovided →<a href>(with onClick passthrough if any)- only
onClick→<button>(L0 behaviour preserved) - neither →
<span>(plain text or empty)
When both value and label are undefined, renders an empty <span> (new
behaviour — previously impossible since label was required; spec §5.1 fallback).
Click handlers call e.stopPropagation to prevent grid row click bubbling
(L0 ButtonCell/LinkCell pattern preserved).
LinkCell(__namedParameters: LinkCellProps): Element
MasterDetailGrid
MasterDetailGrid(props: MasterDetailGridProps<TData> & { … }): ReactElement
MergingGrid
셀 병합(rowSpan) 기능을 제공하는 Pro 그리드 컴포넌트.
enableMerging=false(기본값) 시 일반 그리드와 동일하게 동작.
enableMerging=true 시 meta.mergeRows가 설정된 컬럼에서 연속 행 병합.
enableVirtualization=true 시 @tanstack/react-virtual useVirtualizer로 대규모 데이터 렌더링.
MergingGrid(props: MergingGridProps<TData>): Element
예시
// 기본 사용 (G-001)
<MergingGrid data={rows} columns={columns} enableMerging />
MultiFilter
컬럼당 복합(AND/OR) 필터 빌더 — 2 조건 행.
MultiFilter(variant: { … }): Element
| 파라미터 | 타입 | 설명 |
|---|---|---|
variant | { … } | 'text'(contains 등) | 'number'(=,>,… ). column.filterFn 은 각각 multiTextFilterFn / multiNumberFilterFn 으로 등록되어야 한다. |
MultiRowHeader
Renders a multi-row <thead> element from a TanStack table instance.
Iterates table.getHeaderGroups to produce one <tr> per header row.
Group header cells use header.colSpan (computed by TanStack automatically).
Placeholder cells (header.isPlaceholder) are rendered as empty <th> elements.
Sorting is enabled only on leaf columns (!header.subHeaders.length).
MultiRowHeader(props: MultiRowHeaderProps<TData>): Element
| 파라미터 | 타입 | 설명 |
|---|---|---|
props | MultiRowHeaderProps<TData> | MultiRowHeaderProps<TData>. |
반환 — A <thead> JSX element with all header rows.
NumberCell
Numeric cell renderer with locale-aware formatting + optional unit + optional negative color.
Uses formatNumberString (extracted from L0 inline toLocaleString pattern).
NumberCell(__namedParameters: NumberCellProps): Element
NumberFilter
숫자 필터 UI — 7가지 연산자 select + 조건부 input + clear 버튼.
FilterPopover + FilterIndicator를 조합한 메인 컴포넌트 ( 재사용).
column.setFilterValue로 TanStack columnFilters에 연결.
디바운스 300ms (Section 4.6).
between 연산자: min/max 두 input 조건부 렌더 (, Section 5.3).
NumberFilter(__namedParameters: NumberFilterProps<TData>): Element
예시
// columnDef header에 렌더:
header: ({ column }) => (
<div className="flex items-center gap-1">
<span>가격</span>
<NumberFilter column={column} defaultOperator="=" />
</div>
),
filterFn: numberFilterFn,
NumberFloatingFilter
숫자 floating 필터 — always-visible 입력 1개. 연산자 =(정확히 일치) 고정, 300ms 디바운스 후
NumberFilterValue set(빈 값=해제). filterFn: numberFilterFn 컬럼에 사용.
NumberFloatingFilter(__namedParameters: { … }): Element
PageSizeSelect
PageSizeSelect(props: PageSizeSelectProps): ReactNode
PivotGrid
PivotGrid — declarative 2-D pivot table over grid-core <Grid>.
PivotGrid(__namedParameters: PivotGridProps<TData>): Element
예시
<PivotGrid
data={sales}
config={{
rows: ['region'],
columns: ['quarter'],
values: [{ field: 'sales', aggregationFn: 'sum' }],
}}
/>
PivotPanel
PivotPanel — drag fields between Available / Rows / Columns / Values to
configure a pivot. Pair it with a <PivotGrid> driven by the same config
state so dropping a field re-pivots the grid.
PivotPanel(__namedParameters: PivotPanelProps): ReactElement
ProgressCell
Progress cell — Tailwind track + bar (h-2 rounded) with optional percent
label. Bar width uses a dynamic style={{ width }} value (spec
deviation: Tailwind JIT arbitrary widths cannot be runtime-driven).
ProgressCell(__namedParameters: ProgressCellProps): Element
RangeChart
Built-in cartesian range chart — pure SVG, zero chart-library dependency (/AP-001).
Layout/scaling is delegated to computeChartGeometry (the node-tested core); this
component turns the computed pixel coordinates into <rect>/<polyline>/<polygon>/axis
elements, plus an in-SVG legend and hover tooltip (kept INSIDE the <svg> — no HTML overlay —
to stay consistent with the pure-SVG decision and avoid a wrapper-positioning refactor).
RangeChart(__namedParameters: RangeChartProps): Element
RangeChartPanel
Range chart panel — renders an injected chart for one or more numeric series.
This package bundles no charting library; the caller supplies renderChart
(adapter injection, / AP-001). Without a valid Pro license a watermark
is composited over the panel (the root is relative so the absolutely
positioned <Watermark> anchors to it).
RangeChartPanel(__namedParameters: RangeChartPanelProps): Element
RangeSelectGrid
RangeSelectGrid — 5-hook 완전 통합.
Rules of Hooks: 5개 hook 전부 무조건 호출. enable* = behavior gate (not hook invocation gate). onKeyDown 합성: editKeyDown → navKeyDown → clipKeyDown.
RangeSelectGrid(props: RangeSelectGridAllProps<TData, TCell>): ReactElement
예시
// v0.1.x 그대로 동작 (C-6 backward compat)
<RangeSelectGrid data={rows} columns={columns} />
// v0.2.0 — Drag-fill + Clipboard 활성화
<RangeSelectGrid<MyData, string>
data={data}
columns={columns}
enableDragFill
enableClipboard
getCellValue={(row, col) => getValue(row, col)}
onFillComplete={(cells) => apply(cells)}
onPaste={(cells) => apply(cells)}
/>
RowGroupPanel
RowGroupPanel — the drag-and-drop grouping bar.
REUSE: all grouping behaviour (HTML5 drag, chips, remove) is delegated to the
agg GroupPanel; this wrapper only composites the Pro watermark. The root is
relative so the absolutely positioned <Watermark> anchors to it.
RowGroupPanel(props: RowGroupPanelProps<TData>): Element
SelectFilter
Excel-style 다중선택 체크박스 필터 컴포넌트.
SelectFilter(__namedParameters: SelectFilterProps<TData>): Element
SheetGrid
SheetGrid(__namedParameters: SheetGridProps): Element
SideBar
SideBar — accordion container for tool panels. One section open at a time; clicking an open
section's header collapses it. Pro watermark composited when unlicensed (root is relative).
SideBar(__namedParameters: SideBarProps): Element
SortBadge
다중 정렬 우선순위 배지 — grid-core canonical source.
SortBadge(__namedParameters: SortBadgeProps): null | Element
SortClearButton
현재 정렬 상태를 전부 지우는 버튼.
onClear 콜백에 table.setSorting([]) 를 연결하여 사용.
SortClearButton(__namedParameters: SortClearButtonProps): Element
예시
<SortClearButton onClear={() => table.setSorting([])} />
참고 — SortClearButtonProps
SparklineCell
Sparkline cell — compact inline SVG chart for a numeric series.
Library-agnostic and zero-dependency: the chart is drawn with native SVG
<polyline>/<polygon>/<rect> elements, so no charting peer is required
( / AP-001 — the package imports no chart library).
SparklineCell(__namedParameters: SparklineCellProps): Element
StatusBadgeCell
Status badge cell — renders value as a Tailwind rounded-full chip coloured by colorMap (or a 7-state default).
Equivalent to the legacy BadgeCell;
the shim there re-exports this component under the legacy name ( alias).
StatusBadgeCell(__namedParameters: StatusBadgeCellProps): Element
StatusBar
StatusBar — a horizontal bar of label: value segments.
Pure prop-driven UI: the consumer passes whatever items it wants to surface
(selection counts, aggregate summaries, etc.). It composites no grid. Without
a valid Pro license a watermark is composited over the bar (the root is
relative so the absolutely positioned <Watermark> anchors to it).
StatusBar(__namedParameters: StatusBarProps): Element
TagCell
Tag cell — renders a flex-wrap row of tag chips. Used for multi-valued label columns (e.g. priority tags, category tags). Each chip's colour comes from colorMap or defaults to neutral gray.
TagCell(__namedParameters: TagCellProps): Element
TextCell
Plain text cell renderer with null/empty dash placeholder.
Distinguishes empty (null/undefined/'') from falsy zero — 0 renders as "0".
TextCell(__namedParameters: TextCellProps): Element
TextFilter
텍스트 필터 UI — 연산자 select + 값 input + clear 버튼.
FilterPopover + FilterIndicator를 조합한 메인 컴포넌트.
column.setFilterValue로 TanStack columnFilters에 연결.
디바운스 300ms (Section 4.5).
TextFilter(__namedParameters: TextFilterProps<TData>): Element
예시
// columnDef header에 렌더:
header: ({ column }) => (
<div className="flex items-center gap-1">
<span>이름</span>
<TextFilter column={column} defaultOperator="contains" />
</div>
),
filterFn: textFilterFn,
TextFloatingFilter
텍스트 floating 필터 — always-visible 입력 1개. 연산자 contains 고정(기존 값의 연산자는 보존),
300ms 디바운스 후 TextFilterValue set(빈 값=해제). filterFn: textFilterFn 컬럼에 사용.
TextFloatingFilter(__namedParameters: { … }): Element
ToolPanel
ToolPanel — a declarative column visibility / order control surface.
A checkbox per column toggles visibility (onVisibilityChange); optional
up/down buttons request a reorder (onReorder). The panel holds no column
state machine of its own — it emits callbacks the consumer applies to its
grid-core columnVisibility / columnOrder state. It composites no grid.
Without a valid Pro license a watermark is composited over the panel (the
root is relative so the absolutely positioned <Watermark> anchors to it).
ToolPanel(__namedParameters: ToolPanelProps): Element
TotalCount
TotalCount(props: TotalCountProps): ReactNode
TreeGrid
TreeGrid(props: TreeGridProps<TData>): Element
VirtualGrid
VirtualGrid(props: VirtualGridProps<TData>): Element
Watermark
Pro 라이선스가 없을 때 그리드 위에 표시되는 워터마크 컴포넌트.
required=false 이면 null 반환 (렌더링 없음).
Watermark(__namedParameters: WatermarkProps): null | ReactElement<any, string | JSXElementConstructor<any>>
훅 (Hooks)
useCellComments
셀 코멘트 + storage 영속 훅 — (AC ③).
마운트 시 storage 에서 hydrate, 변경 시 persist(버전 봉투). SSR/storage 비가용 시 in-memory
no-op(throw 없음). 순수 직렬화/키 로직은 ./commentStore([[commentStore]], node 검증).
useCellComments(options: UseCellCommentsOptions): CellCommentsAPI
useCellRange
마우스 드래그/Shift+Click 셀 범위 선택 훅.
useCellRange(onRangeChange: (…) => …): UseCellRangeReturn
| 파라미터 | 타입 | 설명 |
|---|---|---|
onRangeChange | (…) => … | 범위 변경 시 호출되는 콜백. |
반환 — 범 위 state + 이벤트 핸들러 3종.
예시
const { range, handleMouseDown, handleMouseEnter, handleMouseUp } =
useCellRange((r) => console.log('range changed:', r));
useChangeTracking
React hook for tracking row-level added/edited/deleted changes (/ —..).
rows/added/edited/deletedare stable across renders that leave the underlying state unchanged (memoized viauseMemo).addRowreturns the assigned row key synchronously so callers can immediately reference it (e.g. focus the new row, schedule a follow-upupdateRow).undoRowandcommitChangesremain stubs — implemented in / and respectively.
useChangeTracking(config: ChangeTrackingConfig<TData>): ChangeTrackingAPI<TData>
useClipboard
useClipboard(props: UseClipboardProps<TData, TCell>): UseClipboardReturn
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>): { … }
useExpandedPersistence
Pro-tier hook — persists TanStack ExpandedState to Web Storage.
useExpandedPersistence(options: UseExpandedPersistenceOptions): [ExpandedState, ExpandedStateSetter]
| 파라미터 | 타입 | 설명 |
|---|---|---|
options | UseExpandedPersistenceOptions | Persistence options (storageKey, storageType, initialExpanded). |
반환 — [expanded, setExpanded] tuple compatible with TanStack ExpandedState.
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
useKeyboardEdit
useKeyboardEdit — Delete/F2/Enter/printable key 분기 hook.
useKeyboardEdit(props: UseKeyboardEditProps<TData, TCell>): UseKeyboardEditReturn
반환 — { onKeyDown } — Grid container에 부착할 keydown 핸들러.
예시
const { onKeyDown: editKeyDown } = useKeyboardEdit({ selection, activeCell, ... });
// D7: G-005 앞에 배치 (D5 Enter 우선순위)
const onKeyDown = useCallback((e: React.KeyboardEvent) => {
editKeyDown(e);
if (e.defaultPrevented) return;
navKeyDown(e); // G-002
clipKeyDown(e); // G-004
}, [editKeyDown, navKeyDown, clipKeyDown]);
useKeyboardNav
useKeyboardNav(options: UseKeyboardNavOptions<TData>): UseKeyboardNavReturn
useLicenseStatus
React hook returning the current license check result. Re-renders when the
license state changes (e.g. async setLicenseKey resolution).
Backed by useSyncExternalStore — no tearing under React 18 concurrent mode.
useLicenseStatus(): LicenseCheckResult
예시
function MyGrid() {
const lic = useLicenseStatus();
return (
<div className="relative">
<table>{ ... }</table>
{lic.watermarkRequired && <Watermark required />}
</div>
);
}
useMultiSort
useReactTable 직접 사용자가 다중 정렬 옵션을 구성할 때 사용하는 헬퍼.
useMultiSort(opts: UseMultiSortOptions): UseMultiSortResult
예시
const { enableMultiSort, isMultiSortEvent } = useMultiSort({ enableMultiSort: true });
const table = useReactTable({
data,
columns,
getCoreRowModel: getCoreRowModel(),
getSortedRowModel: getSortedRowModel(),
enableMultiSort,
isMultiSortEvent,
});
usePivot
Compute a memoised PivotModel from flat data + a pivot config.
usePivot(data: TData[], config: PivotConfig): PivotModel
| 파라미터 | 타입 | 설명 |
|---|---|---|
data | TData[] | Flat source rows. |
config | PivotConfig | Row/column dimensions + value (measure) definitions. |
반환 — A memoised pivot model (recomputed when data or config change).
예시
const model = usePivot(rows, {
rows: ['region'],
columns: ['quarter'],
values: [{ field: 'sales', aggregationFn: 'sum' }],
});
useServerSideData
useServerSideData(datasource: ServerSideDatasource<TData>, options: UseServerSideDataOptions): UseServerSideDataResult<TData>
useServerSideTree
useServerSideTree(datasource: ServerSideDatasource<TData>, options: UseServerSideTreeOptions): UseServerSideTreeResult<TData>
useSheet
useSheet(): UseSheetResult
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);
},
});
useUndoRedo
제네릭 undo/redo 명령 스택 훅 —.
동작을 수행한 뒤 그 동작의 {undo, redo} 명령을 push 한다. tracking 연산 명령은
makeUpdateCommand/makeAddCommand 로 만든다([[bindings]]). tracking 은 연산 히스토리를
노출하지 않으므로 본 스택이 외부 히스토리 역할을 한다(Option B, advisor).
명령의 부작용은 state updater 밖(이벤트 핸들러)에서 실행한다 — ref 가 진실, bump 는
재렌더만 유발(StrictMode 이중 실행 회피).
useUndoRedo(): UndoRedoAPI
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);
},
});
useViewportRowModel
useViewportRowModel(datasource: ViewportDatasource<TData>, options: UseViewportRowModelOptions): UseViewportRowModelResult<TData>
useWatermarkEnforcement
Void registration hook for license watermark enforcement via a singleton
portal mounted at document.body.
- Each mount increments a module-level ref-count.
- First mount creates the singleton portal + React root.
- License state changes (
setLicenseKey) re-render the portal viasubscribeLicense. - Last unmount (ref-count → 0) tears down the portal.
Use case: per-cell renderers (e.g. DataMapCell) where the component
itself has no host DOM suitable for wrapper-based watermarking.
SSR-safe: portal setup is skipped when document is undefined.
useWatermarkEnforcement(): void
예시
export function DataMapCell(info) {
useWatermarkEnforcement(); // void — no return value
return <span>{...}</span>;
}
함수
acceptBlock
Accept a block response. Rejected (state unchanged) if responseEpoch !== cache.epoch —
the request was issued for a query that has since been invalidated. On accept, the block is
stored as loaded; lastRow (when provided) sets the known total row count.
acceptBlock(cache: BlockCacheState<TData>, blockIndex: number, rows: TData[], responseEpoch: number, lastRow: number): BlockCacheState<TData>
acceptTreeBlock
Accept a child block — discarded unless (a) epoch === tree.epoch AND (b) the node still
exists (the invariant). On accept, stores into that node's cache.
acceptTreeBlock(tree: TreeCacheState<TData>, pathKey: string, blockIndex: number, rows: TData[], epoch: number, lastRow: number): TreeCacheState<TData>
advancedGlobalFilterFn
: TanStack globalFilterFn 어댑터 — global filter 값을 AdvancedFilterExpr 로 보고
행 단위로 평가한다(columnId 무시 = 행-레벨). null/undefined 식 → 무제약(true).
이것이 차트 cross-filter 의 실 setFilter 배선이다: setGlobalFilter(selectionsToFilter(selections))
로 차트 선택을 그리드의 getFilteredRowModel 에 흘려보내면 그리드가 내부적으로 필터한다(필터 상태가
data prop 가 아니라 테이블에 산다 — global search ✅ 와 동일 구조의 raw-table 배선).
advancedGlobalFilterFn(row: { … }, _columnId: string, filterValue: undefined | null | AdvancedFilterExpr): boolean
예시
const table = useReactTable({ data, columns, state: { globalFilter },
onGlobalFilterChange: setGlobalFilter, globalFilterFn: advancedGlobalFilterFn,
getColumnCanGlobalFilter: () => true, getCoreRowModel: getCoreRowModel(),
getFilteredRowModel: getFilteredRowModel() });
// chart: onSelectCategory={(i) => table.setGlobalFilter(selectionsToFilter([{ field, type, value: cats[i] }]))}
applyReducer
Apply a pivot value reducer (built-in key OR custom (number[]) => number)
to a set of values.
applyReducer(reducer: AggregationFnKey | PivotValueReducer, values: number[]): null | number
| 파라미터 | 타입 | 설명 |
|---|---|---|
reducer | AggregationFnKey | PivotValueReducer | An AggregationFnKey or a custom PivotValueReducer. |
values | number[] | Raw numeric values (may contain non-finite entries). |
반환 — The aggregated number, or null for an empty finite set.
autoSizeColumn
Compute the content-fit width (px) for one column:
max(measure(header),...measure(cellValues)) + padding, clamped to
[min, max] when provided.
autoSizeColumn(options: AutoSizeColumnOptions): number
autoSizeColumns
Auto-size multiple columns at once, returning a Record<columnId, px> width
map (consistent with TanStack's ColumnSizingState).
autoSizeColumns(options: AutoSizeColumnsOptions): Record<string, number>
bandScale
Band scale over [r0,r1] for count categories. paddingRatio (0..1) is the fraction of each
slot left empty as gap. Bars/vertices sit at band centres, evenly spaced and symmetric within
the range.
bandScale(count: number, range: [number, number], paddingRatio: number): BandScale
blockBounds
Half-open absolute row range [startRow, endRow) of a block.
blockBounds(blockIndex: number, blockSize: number): { … }
blockIndexOf
Block index containing an absolute row index.
blockIndexOf(rowIndex: number, blockSize: number): number
buildCellClassName
선언적 셀 룰 배열 → grid-core CellClassNameCallback 컴파일.
술어는 ctx.value(값)와 ctx.row(행 데이터)을 받는다(grid-core 1.0 : clean ctx).
join/undefined 규칙은 buildRowClassName 과 동일. 순수 함수.
buildCellClassName(rules: CellFormatRule<TData, TValue>[]): CellClassNameCallback<TData>
예시
<Grid cellClassName={buildCellClassName<Order, number>([
{ when: (v) => v < 0, className: 'text-red-600' },
])} />
buildChangeSet
Build a server payload from a ChangeMapState<TData>.
Algorithm (spec Section 1 L1 + Section 2.4):
removed— everystate.statusMap[key] === 'deleted'row → applyMapping (no validator call — deletes need only the PK).added— every'added'row → runValidator (type:'added'). Failing rows are excluded fromadded[]and recorded inerrors[].updated— every'edited'row → runValidator (type:'updated'). Same exclusion/error policy asadded.- Return
{ added, updated, removed, errors }.
Mapping function throws ( + ):
applyMappingpropagates throws (0 try/catch internally).buildChangeSetwraps added/updated mapping in per-row try/catch. On throw: push{ index, message: '(mapping threw: <error>)', type }to errors[].- Deleted mapping throw: fallback raw row (spec silent on deleted throw → conservative).
Index numbering in errors[] is per-group 0-based (pre-exclusion sequence).
Pure — no React import, no console.warn, no IO.
buildChangeSet(state: ChangeMapState<TData>, options: BuildChangeSetOptions<TData>): ChangeSet
buildPivotColumns
Build the full <Grid> column set from a pivot model.
buildPivotColumns(model: PivotModel, sort: PivotSortOpts, collapse: PivotCollapseOpts, colCollapse: PivotColumnCollapseOpts): ColumnDef<PivotRow>[]
| 파라미터 | 타입 | 설명 |
|---|---|---|
model | PivotModel | The headless pivot model. |
sort | PivotSortOpts | |
collapse | PivotCollapseOpts | |
colCollapse | PivotColumnCollapseOpts |
반환 — Declarative ColumnDef<PivotRow>[] (leading row-dimension columns + nested value column groups + grand-total group).
buildRowClassName
선언적 행 룰 배열 → grid-core RowClassNameCallback 컴파일.
매칭되는 모든 룰의 className 을 룰 순서대로 공백 join 한다(다중 적용 허용).
매칭 0 → undefined(콜백 계약: 추가 없음). 순수 함수 — 부작용 없음.
buildRowClassName(rules: RowFormatRule<TData>[]): RowClassNameCallback<TData>
예시
<Grid rowClassName={buildRowClassName([
{ when: (_, i) => i % 2 === 1, className: 'bg-gray-50' }, // 줄무늬(alternating)
{ when: (d) => d.status === 'error', className: 'text-red-600' },
])} />
buildRowsCsv
행 배열 + ExcelColumn[] 을 RFC 4180 CSV 문자열로 직렬화한다(헤더 1행 + 데이터 N행, CRLF 구분).
순수 함수 — Blob/DOM 비의존이라 node 단위 테스트로 실제 출력 문자열을 단언할 수 있다. null/undefined 셀은 빈 문자열로 직렬화(EC: exportToCSV 동작과 일치).
buildRowsCsv(rows: TData[], columns: ExcelColumn[], delimiter: string): string
| 파라미터 | 타입 | 설명 |
|---|---|---|
rows | TData[] | 직렬화할 데이터 행 |
columns | ExcelColumn[] | 컬럼 정의(key=행 키, header=헤더 텍스트) |
delimiter | string | 구분자 — ',' (기본) 또는 '\t' |
buildRowsPdfTable
buildRowsPdfTable(rows: TData[], columns: ExcelColumn[]): PdfTableData
buildServerPivotColumns
Build a nested pivot-result column tree from the server's flat field keys.
buildServerPivotColumns(fields: string[], separator: string): ServerPivotColumn[]
| 파라미터 | 타입 | 설명 |
|---|---|---|
fields | string[] | server-generated pivot-result field keys (order = desired column order). |
separator | string | segment delimiter within a field key (default '|'). |
buildValidationCellClass
선언적 검증 룰 배열 → grid-core CellClassNameCallback<TData> 컴파일.
field 가 지정된 룰만 셀 표시에 참여한다 — 해당 컬럼(ctx.columnId === rule.field) 셀이
위반(!validate(row))이면 룰의 className(기본 topgrid-cell-invalid)을 부여한다.
buildCellClassName 과 동일 계약·동형 패턴(선언적 룰 → 기존 콜백). 순수 함수.
grid-core 1.0 : clean ctx — cell.column.id→ctx.columnId·cell.row.original→ctx.row.
buildValidationCellClass(rules: ValidationRule<TData>[]): CellClassNameCallback<TData>
예시
<Grid cellClassName={buildValidationCellClass<Row>([
{ field: 'age', validate: (r) => r.age >= 0, message: '', className: 'border-red-500' },
])} />
buildValidator
선언적 검증 룰 배열 → @topgrid/grid-pro-tracking 의 Validator<TData> 컴파일.
반환 validator 를 tracking ChangeTrackingConfig.validator 로 주입하면 tracking 이 기존 동작
으로 invalid 행을 added/updated 에서 제외하고 getChangeSet.errors 에 수집한다 — 즉
커밋 차단은 재구현 없이 tracking 계약 재사용([[]]). 순수 함수.
buildValidator(rules: ValidationRule<TData>[]): Validator<TData>
예시
const tracking = useChangeTracking({
data, rowKey: 'id',
validator: buildValidator<Row>([
{ field: 'age', validate: (r) => r.age >= 0, message: '나이는 0 이상' },
]),
});
cellError
Construct an error value.
cellError(code: ErrorCode): CellError
cellValueToClipboardText
셀 값 → 클립보드 텍스트 (순수, W1 Phase 0, grid-pro-master 에서 이관).
브라우저 navigator.clipboard 배선과 분리된 값→텍스트 매핑. framework-agnostic —
React copy(makeCopyCellItem)·Vue copy 어댑터가 공유한다.
매핑: null/undefined→''(빈문자, "null"/"undefined" 아님) · object(배열 포함)→JSON.stringify · 그 외(string/number/boolean)→String.
cellValueToClipboardText(cell: { … }): string
checkLicense
현재 라이선스 상태를 동기 검사하여 LicenseCheckResult를 반환한다.
- valid=false 이면
watermarkRequired=true. - 유효하고
expiresAt까지 60일 미만이면expiryWarning='soon-expiring'+console.warn(1회). - 유효하고 만료 여유가 충분하면
{ valid: true, watermarkRequired: false }.
checkLicense(): LicenseCheckResult
clearBlock
Drop an in-flight block so it can be re-requested — call on a failed getRows (the
datasource contract says a rejected fetch leaves the block unloaded, re-requestable). No-op if
the epoch has since changed (invalidate already cleared it) or the block is no longer loading,
so a late failure can't disturb a fresh query.
clearBlock(cache: BlockCacheState<TData>, blockIndex: number, epoch: number): BlockCacheState<TData>
clearTreeBlock
Drop a failed in-flight child block so it can be re-requested (epoch + node-existence guarded).
clearTreeBlock(tree: TreeCacheState<TData>, pathKey: string, blockIndex: number, epoch: number): TreeCacheState<TData>
coerceLiteral
Coerce raw literal text → a CellValue (number / boolean / string; "" for empty).
coerceLiteral(raw: string): CellValue
collapsePivotRows
collapse 된 subtotal(__id ∈ collapsedIds)의 후손 행을 제거한 가시 행 배열. subtotal 자신은 그룹
대표로 잔존, grandTotal 불변.
collapsePivotRows(rows: readonly PivotRow[], collapsedIds: ReadonlySet<string>): PivotRow[]
| 파라미터 | 타입 | 설명 |
|---|---|---|
rows | readonly PivotRow[] | pivot 행(원본 model.rows 또는 sortPivotRows 결과 — 합성 체인 가능). |
collapsedIds | ReadonlySet<string> | collapse 된 subtotal 의 __id 집합. |
commentKey
충돌 없는 셀 코멘트 키.
commentKey(rowKey: string, columnId: string): string
compileCell
Compile a cell's raw input: a =-prefixed formula (parsed + qualified + refs), else a literal.
compileCell(raw: string, ctx: CompileContext): CompiledCell
computeAggregateRow
: source 행 집합 → 컬럼별 집계값 한 행(grand-total footer / auto-agg floating 공유).
computeAggregateRow(data: readonly Record<string, unknown>[], spec: AggregateSpec): Record<string, null | number>
| 파라미터 | 타입 | 설명 |
|---|---|---|
data | readonly Record<string, unknown>[] | 집계할 source 행(grand-total=전체, 부분집합도 가능). |
spec | AggregateSpec | 컬럼별 집계 함수 키. |
반환 — { [columnId]: number | null } (빈 집합 avg/min/max=null).
computeChartGeometry
Compute the full pixel geometry for a cartesian (line/bar) chart from raw series.
- y domain is the niced range of ALL finite values across ALL series, so axis ticks land on round numbers and every series shares one scale (comparable).
- x is a band scale over the longest series' length.
- Non-finite values (NaN/±Infinity) keep their slot index but are omitted from
points(a gap), never silently shifting later points left.
computeChartGeometry(seriesList: ChartSeries[], opts: { … }): ChartGeometry
computeColSpans
데이터 배열과 컬럼별 colSpan 콜백을 받아 본문 셀의 가로 병합(colSpan) Map을 계산한다.
**computeMergeSpans(rowSpan)의 수평 쌍둥이 **: 행마다 컬럼을 왼쪽→오른쪽으로 순회. 어떤 셀이 colSpan=n(>1)을 선언하면 그 셀이 시작 셀이 되고 우측 n-1개 셀은 "피복(covered)"되어 skip(0)으로 표시된다. 피복된 셀 자신의 colSpan 콜백은 평가하지 않는다(skip-of-skip — 이미 가려진 셀은 스팬을 시작할 수 없음).
clamp: colSpan 이 행의 남은 컬럼 수를 초과하면 남은 수로 절단한다(행 경계 밖 스팬 방지). 비유한/1 미만 값은 1(스팬 없음)로 정규화한다.
★colSpan 은 한 행 안에서만 작동한다 — rowSpan(computeMergeSpans)의 행간 ancestorBoundary 전파나 L-01 orphan(시작 셀이 가상 윈도 밖으로 스크롤) 문제가 구조적으로 없다.
computeColSpans(rows: TData[], columns: { … }[]): ColSpanMap
| 파라미터 | 타입 | 설명 |
|---|---|---|
rows | TData[] | 렌더링 순서의 TData 배열 (getSortedRowModel / getFilteredRowModel 결과) |
columns | { … }[] | 컬럼 정보 배열 (id + 선택적 colSpan 콜백). 배열 순서 = 좌→우 = getVisibleCells 순서. |
반환 — - 키 ${rowIdx}_${colId} → colSpan 숫자의 Map. >1 = 스팬 시작 셀, 0 = 피복되어 skip(MergingGrid 에서 null 반환), 1/미존재 = 일반 셀. rows 가 빈 배열이면 빈 Map.
예시
// row 0 의 'b' 셀이 3컬럼(b,c,d) 스팬 → c,d 는 skip
const map = computeColSpans(
[{ a: 1, b: 2, c: 3, d: 4, e: 5 }],
[
{ id: 'a' },
{ id: 'b', colSpan: () => 3 },
{ id: 'c' }, { id: 'd' }, { id: 'e' },
]
);
// map.get('0_b') === 3 ; map.get('0_c') === 0 ; map.get('0_d') === 0
// 'a','e' 미존재(=일반 셀)
computeMergeSpans
데이터 배열과 병합 대상 컬럼 목록을 받아 MergeSpanMap을 계산한다.
Hierarchical ancestorBoundary 알고리즘 (ADR-):
단일 패스 O(N×C) — 행(i)을 순회하면서 컬럼(j)을 왼쪽에서 오른쪽 순서로 평가.
좌측 컬럼에서 경계(boundary)가 발생하면 우측 컬럼에도 강제 경계를 전파한다.
(ancestorBoundary 플래그 — 행 전환마다 초기화)
Regression Invariant (ADR-):
columns.length === 1 시 좌측 컬럼이 없으므로 ancestorBoundary는 항상 false.
결과적으로 자신의 compareFn만 평가하며, 출력과 비트 동일한 Map을 생성한다.
computeMergeSpans(rows: TData[], columns: { … }[]): MergeSpanMap
| 파라미터 | 타입 | 설명 |
|---|---|---|
rows | TData[] | 렌더링 순서의 TData 배열 (getSortedRowModel / getFilteredRowModel 결과) |
columns | { … }[] | 병합 컬럼 정보 배열 (id + mergeRows 설정). 배열 순서 = 좌→우 = 높→낮 우선순위 (ADR-) |
반환 — - 키 ${rowIdx}_${colId} → rowSpan 숫자의 Map skip 셀은 0으로 존재 (MergingGrid에서 null 반환 트리거) rows가 빈 배열이면 빈 Map 반환
예시
// 단일 컬럼 — G-001과 동일 출력 (Regression Invariant)
const spanMap = computeMergeSpans(
[{ dept: 'A' }, { dept: 'A' }, { dept: 'B' }],
[{ id: 'dept', mergeRows: true }]
);
// spanMap.get('0_dept') === 2
// spanMap.get('1_dept') === 0
// spanMap.get('2_dept') === 1
computePivot
The pure pivot transform — flat data → PivotModel.
Emits, in render order:
- leaf data rows (deepest row-dimension combination),
- per-row-group subtotal rows (one when each non-leaf row group closes),
- a final grand-total row (all rows aggregated).
When config.rows is empty, a single grand-total row carries the column
aggregation. When config.columns is empty, every value collapses into the
grand-total column (still one cell per value-def).
computePivot(data: TData[], config: PivotConfig): PivotModel
computeReplacements
검색 결과를 치환 패치로 변환(AC ②). ** 조합**: 반환의 {rowKey, columnId, prior, next} 는
tracking.updateRow(rowKey, {[columnId]: next}) + makeUpdateCommand(...) 로 바로 undo 가능하게 적용된다.
'whole' → next = replacement. 'substring' → String(value) 의 모든 일치를 replacement 로
치환(대소문자 구분 시 단순 split/join, 비구분 시 gi 정규식). next 는 항상 문자열.
computeReplacements(matches: readonly CellMatch[], query: string, replacement: string, options: FindOptions): Replacement[]
copyToClipboard
TanStack Table 데이터를 TSV 포맷으로 클립보드에 복사한다. TSV(탭 구분, 줄바꿈 행 구분) — Excel 붙여넣기 호환.
navigator.clipboard 미지원 환경: document.execCommand('copy') fallback 시도. fallback도 실패 시 Error('[grid-export] copyToClipboard: Clipboard API not supported') throw.
copyToClipboard(table: Table<TData>, options: ClipboardOptions): Promise<void>
| 파라미터 | 타입 | 설명 |
|---|---|---|
table | Table<TData> | TanStack v8 Table<TData> 인스턴스 (useReactTable 반환값) |
options | ClipboardOptions | 클립보드 복사 옵션 (scope, emptyBehavior) |
반환 — Promise<void> — navigator.clipboard.writeText 는 async
예시
await copyToClipboard(table);
createAsyncDataMap
createAsyncDataMap<TItem>: AsyncDataMap 팩토리.
- DataMap<TItem> 완전 구현: getDisplay, getItems, getValue
- 4-state 상태머신: idle → loading → loaded/error (Section 12)
- staleTime 기반 캐싱 + invalidate
- pendingPromise de-dupe: 동시 load 호출 시 동일 Promise 공유
- onStateChange?: 구독 콜백 등록 → 구독 해제 함수 반환 (Section 3.1)
createAsyncDataMap(options: CreateAsyncDataMapOptions<TItem>): AsyncDataMap<TItem>
| 파라미터 | 타입 | 설명 |
|---|---|---|
options | CreateAsyncDataMapOptions<TItem> | CreateAsyncDataMapOptions<TItem> |
반환 — AsyncDataMap<TItem>
createBlockCache
Create an empty cache at epoch 0.
createBlockCache(blockSize: number): BlockCacheState<TData>
createCanvasMeasureText
Create a MeasureText backed by the browser canvas 2D API.
In a browser, returns a measurer using
document.createElement('canvas').getContext('2d').measureText(text).width,
applying the optional CSS font shorthand per call. In node/SSR (no
document, or no 2D context), returns the estimateTextWidth fallback.
Never throws.
createCanvasMeasureText(): MeasureText
createColumnGroup
Creates a TanStack GroupColumnDef<TData> from a typed config object.
This is a thin wrapper — no logic beyond type narrowing. The returned
object is identical to writing { header, columns } inline, but provides
generic type-checking at the call site.
createColumnGroup(config: ColumnGroupConfig<TData>): GroupColumnDef<TData>
| 파라미터 | 타입 | 설명 |
|---|---|---|
config | ColumnGroupConfig<TData> | ColumnGroupConfig<TData> with header and columns. |
반환 — A GroupColumnDef<TData> suitable for passing to useReactTable.
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
createDataMap
createDataMap<TItem>: DataMap 팩토리 함수. items 배열과 valuePath/displayPath 설정으로 DataMap 인스턴스 생성.
createDataMap(options: CreateDataMapOptions<TItem>): DataMap<TItem>
예시
const map = createDataMap({
items: [{ code: 'A', name: '항목A' }],
valuePath: 'code',
displayPath: 'name',
});
map.getDisplay('A'); // '항목A'
map.getValue('항목A'); // 'A'
createServerSideController
createServerSideController(datasource: ServerSideDatasource<TData>, options: ServerSideControllerOptions, onChange: (…) => …): ServerSideController<TData>
| 파라미터 | 타입 | 설명 |
|---|---|---|
datasource | ServerSideDatasource<TData> | |
options | ServerSideControllerOptions | |
onChange | (…) => … | called whenever the materialized data changes (a block resolved / invalidated). The hook wires this to setState. NOT called synchronously from ensureRange for an unchanged cache — so a scroll→render→onChange loop cannot form (materialize is range-independent; placeholders exist from construction). |
createServerSideTreeController
createServerSideTreeController(datasource: ServerSideDatasource<TData>, options: ServerSideTreeControllerOptions, onChange: (…) => …): ServerSideTreeController<TData>
createSheet
createSheet(onChange: (…) => …): Sheet
createTreeCache
createTreeCache(blockSize: number, rowGroupCols: string[]): TreeCacheState<TData>
createViewportRowModel
Create a viewport row-model controller. Calls datasource.init once with push callbacks, forwards
visible ranges via setRange, and re-emits a materialized array whenever the datasource pushes a
count or rows (including live in-place updates).
createViewportRowModel(datasource: ViewportDatasource<TData>, options: ViewportRowModelOptions, onChange: (…) => …): ViewportRowModel<TData>
customizePivotTotals
model.rows 에 row-total 커스터마이즈 적용(순수, 새 배열). data 행·상대 순서 보존(grandTotal 이동 제외).
customizePivotTotals(rows: readonly PivotRow[], opts: PivotTotalsOpts): PivotRow[]
| 파라미터 | 타입 | 설명 |
|---|---|---|
rows | readonly PivotRow[] | pivot 행(원본 model.rows 또는 변환 결과 — 합성 체인 가능). |
opts | PivotTotalsOpts | PivotTotalsOpts. |
dateRangeFilterFn
dateRangeFilterFn(row: Row<unknown>, columnId: string, filterValue: any, addMeta: (…) => …): boolean
deserializeComments
버전 봉투 JSON → 코멘트 Map. null/파싱 실패/버전 불일치/형식 오류 → 빈 Map(throw 없음).
deserializeComments(raw: null | string, version: number): Map<string, string>
detectSeriesStep
detectSeriesStep(values: number[]): null | number
distributeStarWidths
Distribute totalWidth across columns. Fixed columns take their px first;
the remaining width is split among star columns proportional to their factor.
Min-clamp re-distribution is ITERATIVE: when a star column's proportional
share falls below its min, that column is clamped to min, removed from the
star pool, its px subtracted from the remaining width, and the remaining star
columns are re-distributed. The loop repeats until no remaining star column
violates its min (clamping one column shrinks the pool and can push another
below its min — a single pass is insufficient).
Returns float px (no rounding) so ratios are exact (e.g. 133.33 / 266.67).
distributeStarWidths(options: DistributeStarWidthsOptions): Record<string, number>
ensureNode
Create the node for pathKey if missing, stamped with the current global epoch.
ensureNode(tree: TreeCacheState<TData>, pathKey: string): TreeCacheState<TData>
ensureVisibleNodes
Ensure every node referenced by the current display range exists (so its blocks can be planned).
ensureVisibleNodes(tree: TreeCacheState<TData>, displayStart: number, displayEnd: number): TreeCacheState<TData>
escapeCsvValue
RFC 4180 §2: 구분자/큰따옴표/개행 포함 시 큰따옴표 래핑 + 내부 따옴표 이중화. 순수 string 조작 — 외부 라이브러리 0.
escapeCsvValue(value: string, delimiter: string): string
evaluate
Evaluate a formula AST to a scalar CellValue. Errors propagate; never throws.
evaluate(ast: Ast, getCell: CellGetter): CellValue
evaluateAdvancedFilter
: 고급 필터 식을 행에 평가(순수, 재귀). group=inert 자식 제거 후 reduce(빈/all-inert→true=무제약).
evaluateAdvancedFilter(expr: AdvancedFilterExpr, row: Record<string, unknown>): boolean
| 파라미터 | 타입 | 설명 |
|---|---|---|
expr | AdvancedFilterExpr | 식 트리. |
row | Record<string, unknown> | 평가할 행(필드 record). |
expandRange
Expand A1:B2 (inclusive, order-normalized) → cell refs [A1, A2, B1, B2] (column-major).
expandRange(from: string, to: string): string[]
exportRowsToCsv
exportRowsToCsv — 행 배열 기반 CSV export ( 평행, exportRowsToExcel 의 CSV 형)
TanStack Table 인스턴스 없이 raw row array + ExcelColumn[] 로 CSV 파일 다운로드.
직렬화 로직(buildRowsCsv)은 순수 함수로 분리되어 node 테스트 가능하고, 본 함수는
BOM + Blob + a[download] 의 브라우저 전용 다운로드 래퍼다.
exportRowsToCsv(rows: TData[], columns: ExcelColumn[], options: ExportRowsCsvOptions): void
예시
exportRowsToCsv(rows, columns, { fileName: '데이터.csv' });
exportRowsToCsv(rows, columns, { fileName: '데이터.tsv', delimiter: '\t' });
exportRowsToExcel
행 배열을 Excel 파일(.xlsx)로 다운로드한다.
TanStack Table<TData> 인스턴스 없이 사용 가능.
@topgrid/grid-export 의 exportToExcel(table, options) 와 평행 지원 ( 옵션 A).
exportRowsToExcel(rows: TData[], columns: ExcelColumn[], options: ExportRowsOptions): void
| 파라미터 | 타입 | 설명 |
|---|---|---|
rows | TData[] | 내보낼 데이터 행 배열 |
columns | ExcelColumn[] | 컬럼 정의 배열 (key / header / width? / format?) |
options | ExportRowsOptions | 파일명·시트명·emptyBehavior 옵션 |
예시
exportRowsToExcel(rows, columns, { fileName: '보고서_2026.xlsx' });
exportRowsToPdf
exportRowsToPdf — 행 배열 기반 PDF export ( 평행, exportToPdf 의 row-array 형)
TanStack Table 인스턴스 없이 raw row array + ExcelColumn[] 로 PDF 파일 다운로드.
표 데이터 구성(buildRowsPdfTable)은 순수 함수로 분리(node-testable)되고, 본 함수는
jspdf + jspdf-autotable 을 optional peer 로 dynamic import 하는 브라우저 전용 렌더 래퍼다.
exportRowsToPdf(rows: TData[], columns: ExcelColumn[], options: ExportRowsPdfOptions): Promise<void>
예시
await exportRowsToPdf(rows, columns, { fileName: '보고서.pdf', orientation: 'l' });
exportSheetCellsToXlsx
Build an .xlsx workbook from a sheet cell map and (in a browser/node) trigger a download / write.
Formula cells are written as .f (preserved by the lib). Returns nothing — side-effecting write.
exportSheetCellsToXlsx(cells: Record<string, string>, computed: Record<string, string | number>, fileName: string, sheetName: string): void
exportSheetCellsToXlsxBuffer
Build an .xlsx workbook as a Uint8Array buffer (node-testable; no file I/O).
exportSheetCellsToXlsxBuffer(cells: Record<string, string>, computed: Record<string, string | number>, sheetName: string): Uint8Array
exportSheetsToExcel
여러 TanStack Table 을 하나의 Excel 워크북(여러 시트)으로 export·다운로드한다. ( — XX Grid/DevExpress 다중 시트 export 격차 해소)
각 시트는 exportToExcel(단일 시트) 과 동일한 빌더(buildGridWorksheet)를 재사용하므로
헤더 merge·scope·네이티브 숫자서식(.z)·컬럼 폭 동작이 단일 시트와 일관된다.
exportSheetsToExcel(sheets: ExcelSheet[], options: MultiSheetOptions): void
| 파라미터 | 타입 | 설명 |
|---|---|---|
sheets | ExcelSheet[] | 시트 정의 배열 ({ name, table, scope?, columnFormats?, columnWidths? }) |
options | MultiSheetOptions | 파일명 옵션 |
반환 — void (동기 — xlsx.writeFile)
예시
exportSheetsToExcel(
[
{ name: '주문', table: ordersTable, columnFormats: { total: '#,##0' } },
{ name: '고객', table: customersTable, scope: 'selected' },
],
{ fileName: '월간보고.xlsx' },
);
exportToCSV
TanStack Table 인스턴스를 기반으로 CSV 파일을 생성·다운로드한다. UTF-8 BOM 포함 — 한국어 Excel 정상 표시.
exportToCSV(table: Table<TData>, options: CSVExportOptions): void
| 파라미터 | 타입 | 설명 |
|---|---|---|
table | Table<TData> | TanStack v8 Table<TData> 인스턴스 (useReactTable 반환값) |
options | CSVExportOptions | CSV export 옵션 (fileName, scope, delimiter, emptyBehavior) |
반환 — void (순수 string 조작 + createObjectURL — 외부 라이브러리 0)
예시
// 기본 사용 (filtered 행, 쉼표 구분자)
exportToCSV(table, { fileName: '데이터.csv' });
exportToExcel
TanStack Table 인스턴스를 기반으로 Excel(.xlsx) 파일을 생성·다운로드한다.
exportToExcel(table: Table<TData>, options: ExcelExportOptions): void
| 파라미터 | 타입 | 설명 |
|---|---|---|
table | Table<TData> | TanStack v8 Table<TData> 인스 턴스 (useReactTable 반환값) |
options | ExcelExportOptions | Excel export 옵션 (fileName, sheetName, scope, emptyBehavior, columnFormats, columnWidths) |
반환 — void (동기 실행 — xlsx.writeFile 동기 API)
예시
// 기본 사용 (filtered 행)
exportToExcel(table, { fileName: '데이터.xlsx' });
exportToPdf
TanStack Table 인스턴스를 기반으로 PDF 파일을 생성·다운로드한다. jspdf + jspdf-autotable을 optional peer로 dynamic import하여 사용.
exportToPdf(table: Table<TData>, options: PDFExportOptions): Promise<void>
| 파라미터 | 타입 | 설명 |
|---|---|---|
table | Table<TData> | TanStack v8 Table<TData> 인스턴스 (useReactTable 반환값) |
options | PDFExportOptions | PDF export 옵션 (fileName, title, scope, orientation, fontFamily, emptyBehavior) |
반환 — Promise<void> — jspdf dynamic import 후 완료
예시
// 기본 사용 (portrait, filtered, Helvetica)
await exportToPdf(table, { fileName: '보고서.pdf' });
extractRefs
Cells this formula depends on (refs + expanded ranges), de-duplicated.
extractRefs(ast: Ast): string[]
fillRange
fillRange(sourceRange: CellRange, direction: FillDirection, fillCount: number, getCellValue: (…) => …): CellUpdate<TCell>[]
filterPivotRows
data 행만 predicate 로 필터(순수, 새 배열). subtotal/grandTotal/order 보존(true-group).
filterPivotRows(rows: readonly PivotRow[], predicate: (…) => …): PivotRow[]
| 파라미터 | 타입 | 설명 |
|---|---|---|
rows | readonly PivotRow[] | pivot 행(원본 model.rows 또는 /44 변환 결과 — 합성 체인 가능). |
predicate | (…) => … | data 행 유지 조건(집계 셀 row['<colKey>__<i>'] 등 접근). |
findMatches
columnIds 컬럼에서 query 와 일치하는 셀을 찾는다(범위 한정 = columnIds 스코핑, AC ②).
빈 query → []. null/undefined 셀 skip.
findMatches(rows: readonly TData[], getRowKey: (…) => …, columnIds: readonly string[], query: string, options: FindOptions): CellMatch[]
| 파라미터 | 타입 | 설명 |
|---|---|---|
rows | readonly TData[] | 검색 대상 행(예: tracking.rows) |
getRowKey | (…) => … | 행→rowKey 추출(tracking 의 rowKey 와 동일) |
columnIds | readonly string[] | 검색할 컬럼 id 목록(범위 한정) |
query | string | |
options | FindOptions |
flattenTree
The full display list (group rows + children/placeholders), in render order. Feed to <Grid data>.
flattenTree(tree: TreeCacheState<TData>): TreeDisplayRow<TData>[]
formatDateTimeFromDateTimeString
Format a date/string/number/Date to a locale-aware date/datetime/time string.
Returns '' for null/undefined/empty-string/invalid-Date inputs.
formatDateTimeFromDateTimeString(value: undefined | null | string | number | Date, options: FormatDateTimeOptions): string
예시
formatDateTimeFromDateTimeString('2026-05-14', { format: 'date' }) // "2026. 05. 14."
formatNumberString
Format a number using locale-aware thousand separators and fixed decimals.
Returns '' for null/undefined/non-finite inputs ( — explicit guard,
improving L0 inline toLocaleString which output the string "NaN").
Negative or non-integer decimals are clamped via Math.max(0, Math.floor(...))
to avoid Intl RangeError.
formatNumberString(value: undefined | null | number, options: FormatNumberOptions): string
예시
formatNumberString(1234.5, { decimals: 2 }) // "1,234.50"
formatSheetValue
Format a displayed cell value by format. Returns display unchanged when format is undefined
or the value is non-numeric (empty / error / text).
formatSheetValue(display: string, format: SheetCellFormat): string
formatValue
Render a CellValue for display (errors → their code, booleans → TRUE/FALSE).
formatValue(v: CellValue): string
getAggregationFn
이름으로 registry에서 사용자 정의 집계 함수를 조회한다. 내장 5종은 별도 registry 조회가 필요 없으므로 이 함수는 사용자 정의 fn 전용.
getAggregationFn(name: string): undefined | AggregationFn<TData>
반환 — 등록된 AggregationFn<TData> 또는 undefined (미등록).
getRenderer
Look up a registered renderer. Returns undefined if no renderer matches
the given type — the consumer ( createColumns) decides the
fallback behaviour (spec ).
getRenderer(type: string): undefined | CellComponent
getRowStatusClassName
Returns the Tailwind className string for a given row status.
If classNames is provided, it is merged over defaultRowStatusClassNames
(consumer override). Returns '' for an unknown status (defensive).
getRowStatusClassName(status: RowStatus, classNames: RowStatusClassNames): string
| 파라미터 | 타입 | 설명 |
|---|---|---|
status | RowStatus | RowStatus value from row.__rowStatus. |
classNames | RowStatusClassNames | Optional override map (full RowStatusClassNames shape). |
반환 — Tailwind className string, or '' if status is not recognised.
importXlsxToSheetCells
Parse an .xlsx (the first worksheet) into a sheet cell map. Formula cells become "=…" raws so
the sheet engine re-evaluates them; value cells stringify. Feeds createSheet via setCell.
importXlsxToSheetCells(data: ArrayBuffer | Uint8Array<ArrayBufferLike>): Record<string, string>
invalidate
Invalidate the whole cache (AC④) — clears all blocks and bumps the epoch so any in-flight
response (old epoch) is later rejected by acceptBlock. Called on sort/filter/group
change or explicit refresh. rowCount is cleared (the new query may have a different total).
invalidate(cache: BlockCacheState<TData>): BlockCacheState<TData>
invalidateTree
Invalidate the whole tree (sort/filter/grouping change) — bump the global epoch and drop every
node's blocks; expanded is kept (re-fetched). Any in-flight response (old epoch) is rejected.
invalidateTree(tree: TreeCacheState<TData>): TreeCacheState<TData>
isBuiltInAggregationKey
Runtime guard: is key one of the built-in aggregation keys?
Derives membership from BUILT_IN_AGGREGATION_KEYS (the shared vocabulary) —
never hardcodes the set or its size.
isBuiltInAggregationKey(key: string): key
isCellError
Type guard for CellError.
isCellError(v: unknown): v
isExpanded
isExpanded(tree: TreeCacheState<TData>, groupKeys: readonly string[]): boolean
isInRange
isInRange(row: number, col: number, range: null | CellRange): boolean
isRowPlaceholder
Type guard for placeholder rows from materialize.
isRowPlaceholder(row: unknown): row
linearScale
Linear scale mapping domain → range. A flat domain (d0===d1) maps everything to the range
midpoint (so a constant series draws a centred flat line, never a divide-by-zero).
linearScale(domain: [number, number], range: [number, number]): LinearScale
makeAddCommand
addRow 의 undo/redo 명령. 포착한 key 를 redo 시 seed 의 rowKeyField 에 강제 주입한다
— 그렇지 않으면 tracking 이 redo 때 새 UUID 를 발급해 후속 스택 항목의 키 참조가 깨진다
(advisor 지적). undo = deleteRow(key)(added 행은 제거됨).
제약: 문자열 rowKey 필드 전용. 함수형 rowKey 는 커스텀 명령을 push 하라.
makeAddCommand(tracking: Pick<ChangeTrackingAPI<TData>, "addRow" | "deleteRow">, key: string, seed: Partial<TData>, rowKeyField: keyof TData & string): UndoRedoCommand
예시
const key = tracking.addRow(seed);
undoRedo.push(makeAddCommand(tracking, key, seed, 'id'));
makeAdvancedFilterFn
식 → 행 predicate(소비자가 global/table 필터로 사용).
makeAdvancedFilterFn(expr: AdvancedFilterExpr): (…) => …
makeCopyCellItem
makeCopyCellItem(opts: MakeCopyCellItemOptions): ContextMenuItem<TData>
makeDeleteCommand
deleteRow 의 undo/redo 명령. undo 경로는 행이 세션에서 추가된 행인지('added') vs
기존 행인지('existing') 에 따라 다르다:
'added': undo = 포착한 행+키로 재추가(addRow), redo =deleteRow.'existing': undo =undoRow(key)(마운트 스냅샷 복원), redo =deleteRow.
한계([[]], §5.2 P23-1): 'existing' 의 undo 는 마운트 스냅샷 복원이므로 삭제 전
세션 편집이 있었다면 그 편집은 손실된다(편집되지 않은 기존 행에서만 충실). 편집된 기존 행의
충실한 삭제-undo 는 tracking 의 새 seam 이 필요하다.
makeDeleteCommand(tracking: Pick<ChangeTrackingAPI<TData>, "addRow" | "deleteRow" | "undoRow">, key: string, deletedRow: TData, kind: "added" | "existing", rowKeyField: keyof TData & string): UndoRedoCommand
| 파라미터 | 타입 | 설명 |
|---|---|---|
tracking | Pick<ChangeTrackingAPI<TData>, "addRow" | "deleteRow" | "undoRow"> | |
key | string | |
deletedRow | TData | 'added' 재추가용 행 값(삭제 시점). 'existing' 에서는 미사용. |
kind | "added" | "existing" | 삭제 전 행 종류. |
rowKeyField | keyof TData & string | 'added' 재추가 시 키 강제 주입 필드. |
makeExportItem
makeExportItem(opts: MakeExportItemOptions<TData>): ContextMenuItem<TData>
makeMultiFilterFn
base FilterFn 을 compound(AND/OR) FilterFn 으로 승격. 비활성 조건은 base.autoRemove 로 제거 후 reduce.
makeMultiFilterFn(base: FilterFn<unknown>): FilterFn<unknown>
| 파라미터 | 타입 | 설명 |
|---|---|---|
base | FilterFn<unknown> | 조건별 매칭 FilterFn(예: textFilterFn). autoRemove 가 있으면 비활성 조건 판별에 사용. |
makeUpdateCommand
updateRow 의 undo/redo 명령. priorRow = 업데이트 직전 행 값(patch 대상 필드의 이전
값을 포착) → undo 는 그 이전 값으로 updateRow.
makeUpdateCommand(tracking: Pick<ChangeTrackingAPI<TData>, "updateRow">, key: string, priorRow: TData, patch: Partial<TData>): UndoRedoCommand
예시
const prior = tracking.rows.find((r) => r.id === key)!; // 업데이트 전 값
tracking.updateRow(key, patch);
undoRedo.push(makeUpdateCommand(tracking, key, prior, patch));
markLoading
Mark a block in-flight at the current epoch (the request's captured epoch is cache.epoch).
markLoading(cache: BlockCacheState<TData>, blockIndex: number): BlockCacheState<TData>
markTreeLoading
Mark a node's block in-flight at the current global epoch (node must exist).
markTreeLoading(tree: TreeCacheState<TData>, pathKey: string, blockIndex: number): TreeCacheState<TData>
matchCondition
단일 조건을 행 값에 매칭(순수, type 명시). null/blank cell → text 매칭 false. unknown op → false.
matchCondition(rowValue: unknown, type: FilterValueType, operator: FilterOperator, value: unknown): boolean
materialize
Materialize a totalCount-length array (AC④ memory note): loaded indices carry their real
row, not-yet-loaded indices carry a RowPlaceholder. Pure — feeds the existing
<Grid enableVirtualization data> ( shape: minimal primitive on host public surface).
materialize(cache: BlockCacheState<TData>, totalCount: number): RowPlaceholder | TData[]
materializeViewport
Pure: build a placeholder-filled array of length rowCount from a sparse index → row map.
Not-yet-pushed indices carry a RowPlaceholder (same shape as the SSRM materialize).
materializeViewport(rows: Map<number, TData>, rowCount: number): RowPlaceholder | TData[]
movePivotField
field 를 toZone 으로 이동한 새 PivotConfig 를 반환한다(원본 불변).
movePivotField(config: PivotConfig, field: string, toZone: PivotZone): PivotConfig
| 파라미터 | 타입 | 설명 |
|---|---|---|
config | PivotConfig | 현재 피벗 구성. |
field | string | 이동할 소스 필드명(config 의 어느 존에 있든 / 미배정이든 무방). |
toZone | PivotZone | 대상 존. |
multiNumberFilterFn
multiNumberFilterFn(row: Row<unknown>, columnId: string, filterValue: any, addMeta: (…) => …): boolean
multiTextFilterFn
multiTextFilterFn(row: Row<unknown>, columnId: string, filterValue: any, addMeta: (…) => …): boolean
niceTicks
"Nice" round tick values covering [min,max] with roughly count intervals. The returned array
starts ≤ min and ends ≥ max (the niced domain), with a round step (1/2/5 × 10ⁿ). A flat input
(min===max) returns a single tick; non-finite input returns [].
niceTicks(min: number, max: number, count: number): number[]
normalizeRange
normalizeRange(range: CellRange): CellRange
numberFilterFn
numberFilterFn(row: Row<unknown>, columnId: string, filterValue: any, addMeta: (…) => …): boolean
parseA1
Parse "A1" → { col, row } (0-based). Throws on malformed input.
parseA1(ref: string): { … }
parseColumnWidth
Parse a column width spec.
'*'→{ kind: 'star', factor: 1 }'2*'/'3*'→{ kind: 'star', factor: 2|3 }120/'120px'/'120'→{ kind: 'fixed', px: 120 }
parseColumnWidth(spec: string | number): ColumnWidthSpec
parseFormula
Formula tokenizer + recursive-descent parser — pure, no React.
Grammar (precedence low→high): addSub → mulDiv → unary → primary.
primary = number | string | bool | "(" expr ")" | ref [":" ref] | NAME "(" args ")".
parseFormula takes the text after the leading =. Throws on malformed input
(the caller — compileCell — turns a parse error into an #ERROR! literal).
parseFormula(src: string): Ast
parseTsv
parseTsv(tsv: string): string[][]
pathKeyOf
Stable key for a group path. Root = pathKeyOf([]) === "[]".
pathKeyOf(groupKeys: readonly string[]): string
planBlocks
Block indices a visible row range needs that are not already loaded or in-flight
(AC① — one request per block). visibleStartRow/visibleEndRow are inclusive row indices.
Returns ascending, de-duplicated, missing-only block indices.
planBlocks(cache: BlockCacheState<TData>, visibleStartRow: number, visibleEndRow: number): number[]
planTreeBlocks
Plan the missing blocks for a visible display range (one request per node-block). Maps the
display range to per-node local ranges, then reuses planBlocks per node (dedup of
loaded/in-flight). Nodes must be ensured first (ensureVisibleNodes).
planTreeBlocks(tree: TreeCacheState<TData>, displayStart: number, displayEnd: number): TreeBlockRequest[]
printGrid
TanStack Table 데이터를 새 팝업 창에 HTML 테이블로 렌더링하여 인쇄 대화상자를 연다. 순수 Web API 전용 (window.open + document.write + window.print).
팝업 차단 환경: console.warn 후 즉시 반환 ( — throw 하지 않음). printGrid 자체는 동기 반환 (void). 실제 print 발화는 popup.onload 내에서 비동기 실행.
printGrid(table: Table<TData>, options: PrintOptions): void
| 파라미터 | 타입 | 설명 |
|---|---|---|
table | Table<TData> | TanStack v8 Table<TData> 인스턴스 (useReactTable 반환값) |
options | PrintOptions | 인쇄 옵션 (title, scope, orientation, emptyBehavior) |
반환 — void
예시
printGrid(table);
registerAggregationFn
사용자 정의 집계 함수를 module-level registry에 등록한다.
- TanStack AggregationFn<TData> 표준 시그니처 그대로 사용.
- strict TypeScript, no any.
- 이미 등록된 이름: overwrite + console.warn ( — no throw).
- 한 패키지 라이선스 verifyOrWarn 1회 원칙 — 이 함수는 별도 호출 없음.
registerAggregationFn(name: string, fn: AggregationFn<TData>): void
예시
registerAggregationFn('weightedAvg', (columnId, leafRows) => {
const totalWeight = leafRows.reduce((s, r) => s + (r.getValue('weight') as number), 0);
const totalVal = leafRows.reduce(
(s, r) => s + (r.getValue(columnId) as number) * (r.getValue('weight') as number), 0
);
return totalWeight === 0 ? 0 : totalVal / totalWeight;
});
registerRenderer
Register a custom renderer under a type key. Overrides the default if the key collides (spec — intentional behaviour for external customisation).
registerRenderer(type: string, component: CellComponent): void
예시
registerRenderer('priority', MyPriorityCell);
createColumns([{ id: 'p', type: 'priority' }]);
resolveAggregationFn
Maps a user-facing AggregationFnKey to the TanStack-internal string key.
Spec : 'avg' → 'mean' (TanStack built-in name). All other keys pass through unchanged.
Returning the string key (not a function reference) allows TanStack to
perform its own registry lookup via aggregationFns[key], which is safer
than importing the registry object directly.
resolveAggregationFn(key: AggregationFnKey): TanStackAggKey
| 파라미터 | 타입 | 설명 |
|---|---|---|
key | AggregationFnKey | User-facing aggregation key. |
반환 — TanStack-internal aggregation key string.
selectFilterFn
selectFilterFn(row: Row<any>, columnId: string, filterValue: any, addMeta: (…) => …): boolean
selectionsToFilter
: 선택 목록 → 고급 필터 식. 같은 필드 OR · 다른 필드 AND. 빈 선택 → 무제약 빈 group(true).
selectionsToFilter(selections: readonly FilterSelection[]): AdvancedFilterExpr
| 파라미터 | 타입 | 설명 |
|---|---|---|
selections | readonly FilterSelection[] | 선택 descriptor 목록(차트 클릭 등이 컬럼 메타로 type 을 채워 생성). |
serializeAst
Serialize an Ast back to formula text (no leading =). Parenthesizes only where
precedence/associativity require, so serialize(parse(x)) round-trips to an equivalent formula.
Strings re-quote (the tokenizer has no escapes, so any string it produced round-trips verbatim).
serializeAst(ast: Ast): string
serializeComments
코멘트 Map → 버전 봉투 JSON 문자열.
serializeComments(comments: ReadonlyMap<string, string>, version: number): string
seriesFromMatrix
Turn a labelled 2-D matrix into chart series + x categories.
Orientation decides the pivot of the data: charting a 3-region × 2-quarter matrix 'columns'
gives one series per quarter across regions; 'rows' gives one series per region across quarters.
Same numbers, transposed grouping — the bug this guards is silently charting the wrong axis.
seriesFromMatrix(input: MatrixInput): MatrixChartData
seriesFromPivot
Reduce a pivot result into chart series — pure, node-testable.
★ This is the REAL pivot→chart adapter (not a hand-fed matrix): it keeps only __kind==='data'
rows (dropping subtotal/grandTotal), labels each by its row-dimension values, and reads each leaf
column's value cell <leafKey>__<valueIndex> into the matrix — then defers to
seriesFromMatrix. One measure at a time (valueIndex, default 0); multi-measure charting
is a caller choice (call once per index).
seriesFromPivot(model: PivotLike, opts: { … }): MatrixChartData
setLicenseKey
Pro 패키지 전역 라이선스 등록 API. 앱 entry(main.tsx / App.tsx)에서 1회 호출.
setLicenseKey(key: string): LicenseStatus
| 파라미터 | 타입 | 설명 |
|---|---|---|
key | string | Base64url(pubKey).Base64url(sig).Base64url(payload) 형식 라이선스 키 |
반환 — LicenseStatus — 즉시 반환 (동기 wrapper, 내부 비동기 검증 완료 후 상태 갱신) 주의: 반환값은 Promise 없이 즉시 사용 가능하도록 동기 API로 설계. 내부적으로 verifySignature (async) 결과를 저장. 비동기 완료 전 getLicenseState 호출 시 기본값 {valid:false, reason:'invalid'} 반환.
setLicenseState
setLicenseState(s: LicenseState): void
sheetRawToXlsxCell
Pure: a sheet raw input ("=A1+A2" | "10" | "hi") → an xlsx cell object.
A formula cell must carry a cached value (v) or the lib drops it on write (probe-verified),
so computed (the engine's displayed value, from getDisplay) is written as the cache. Without
it, a fallback v: 0 keeps the formula (Excel recalculates on open). Value cells ignore computed.
sheetRawToXlsxCell(raw: string, computed: string | number): XlsxCell
sheetStyleToCss
Map a SheetCellStyle to inline CSS (only set props emitted).
sheetStyleToCss(style: SheetCellStyle): CSSProperties
sizeToFit
Scale columns so the resulting integer px widths sum to containerWidth.
Each column is scaled by containerWidth / currentSum, then rounded to an
integer. Rounding can leave a small leftover (the rounded sum may differ from
containerWidth by a few px); that leftover is assigned to the single widest
column so the final sum equals containerWidth exactly.
Edge cases: empty columns → {}. A current sum of 0 (all widths 0) cannot
be scaled proportionally, so the containerWidth is split evenly instead,
with the leftover going to the last column.
sizeToFit(options: SizeToFitOptions): Record<string, number>
sortPivotRows
그룹(세그먼트) 내에서 data 행을 leafKey 값으로 정렬한 새 행 배열. subtotal/grandTotal 앵커 유지.
sortPivotRows(model: PivotModel, leafKey: string, dir: PivotSortDirection): PivotRow[]
| 파라미터 | 타입 | 설명 |
|---|---|---|
model | PivotModel | pivot 모델. |
leafKey | string | 정렬 기준 값 컬럼 키(<comboKey>__<valueIndex> 또는 grand-total 컬럼 키). |
dir | PivotSortDirection | 'asc' | 'desc'. |
statusBarCounts
table 에서 total/filtered/selected 카운트를 읽어 StatusBarItem[] 생성.
statusBarCounts(table: Table<TData>, labels: StatusBarCountLabels): StatusBarItem[]
| 파라미터 | 타입 | 설명 |
|---|---|---|
table | Table<TData> | TanStack Table 인스턴스. |
labels | StatusBarCountLabels | 세그먼트 라벨 override(부분). |
stringifyTsv
stringifyTsv(matrix: readonly readonly unknown[][]): string
subscribeLicense
Subscribe to license state changes. Listener is invoked synchronously
after every setLicenseState call. Returns an unsubscribe function.
Used internally by useLicenseStatus (via useSyncExternalStore) and
by useWatermarkEnforcement (singleton portal re-render trigger).
subscribeLicense(listener: LicenseListener): (…) => …
textFilterFn
textFilterFn(row: Row<unknown>, columnId: string, filterValue: any, addMeta: (…) => …): boolean
toA1
Format { col, row } (0-based) → "A1".
toA1(col: number, row: number): string
toggleGroup
Expand or collapse a group. Expand adds the path to expanded and ensures its node exists.
Collapse removes it from expanded and purges its node + all descendant nodes (so any
in-flight child response for them is later rejected by acceptTreeBlock's node-existence check).
toggleGroup(tree: TreeCacheState<TData>, groupKeys: readonly string[]): TreeCacheState<TData>
toGridCell
TanStack Cell → GridCellContext. Use inside onCellClick / onCellKeyDown / getCellTooltip
to read cell data without TanStack knowledge — e.g. const c = toGridCell(cell) then read
c.value / c.rowId / c.row.
toGridCell(cell: CellLike<TData>): GridCellContext<TData>
toGridFilterColumn
TanStack filter Column → GridFilterColumn (value + setValue, no method spelunking).
toGridFilterColumn(column: FilterColumnLike): GridFilterColumn
translateFormula
: translate a formula for a copy/fill by (dCol,dRow) cells. Relative refs shift,
absolute ($) axes stay fixed; a ref shifted out of bounds becomes #REF!. Non-formula cells
(no leading =) and unparseable formulas are returned verbatim (mirrors compileCell's
catch — downstream compile turns a bad formula into #ERROR!).
translateFormula(raw: string, dCol: number, dRow: number): string
transposePivotConfig
rows ↔ columns 를 swap 한 새 config(values 보존). 두 번 적용 = 원본(involution).
transposePivotConfig(config: PivotConfig): PivotConfig
xlsxCellToSheetRaw
Pure: an xlsx cell → a sheet raw input. Formula cells become "=…"; value cells stringify.
xlsxCellToSheetRaw(cell: XlsxCell): string
타입 · 인터페이스
AggregationColumnMeta
Extend TanStack column meta to carry aggregation configuration.
Follows the open meta pattern ([key: string]: unknown) to stay compatible
with arbitrary user meta.
| 속성 | 타입 | 설명 |
|---|---|---|
aggregationFn? | AggregationFnKey | string & object | 집계 함수 식별자. - 내장 5종: 'sum' | 'avg' | 'min' | 'max' | 'count' (자동완성 지원) - 사용자 정의: registerAggregationFn으로 등록한 임의 문자열 (string & {}) 패턴: 내장 키 자동완성 유지 + 임의 문자열 허용. |
AggregationGridProps
Props for the AggregationGrid standalone Pro component.
| 속성 | 타입 | 설명 |
|---|---|---|
columns | AggregationColumnDef<TData>[] | Column definitions (with optional meta.aggregationFn). |
data | TData[] | Row data array. |
emptyGroupPanelText? | string | Placeholder text shown in GroupPanel when no columns are grouped. |
enableAggregation? | boolean | When true, enables getGroupedRowModel and getExpandedRowModel. |
enableGroupSort? | boolean | When true, enables getSortedRowModel and makes group header <th> cells clickable for column-level sorting. |
enableRowSelection? | boolean | : enable group/hierarchy row selection — a leading checkbox column. Group rows show a tri-state checkbox (toggling selects the whole subtree via TanStack enableSubRowSelection; indeterminate when some-but-not-all children are selected). |
enableStickyGroupRows? | boolean | : sticky group headers (non-virtualized path). When true, the grid body becomes a bounded scroll container (stickyGroupMaxHeight) and each group header sticks to the top while its children scroll under it (AG groupRowsSticky). Virtualization drops off-window headers, so this is the non-virtualized model; leave enableVirtualization off. |
enableVirtualization? | boolean | Enable row virtualization via @tanstack/react-virtual. Requires @tanstack/react-virtual to be installed as a peer dependency. |
estimatedRowHeight? | number | Estimated row height in pixels (used by virtualizer). |
expanded? | false | ExpandedState | Initial expanded state passed to TanStack Table. false is normalised to {} (TanStack's ExpandedState does not include false). Pass true to expand all groups. |
footerRowClassName? | string | Additional Tailwind className for footer rows. |
groupChipClassName? | string | Additional Tailwind className for each group chip in GroupPanel. |
grouping? | string[] | Column ids to group by (order matters). Only applied when enableAggregation is true. |
groupPanelClassName? | string | Additional Tailwind className for the GroupPanel container. |
groupRowClassName? | string | Additional Tailwind className for group header rows. |
onExpandedChange? | (…) => … | Callback fired when expanded state changes. Enables externally controlled expand/collapse. |
onGroupingChange? | (…) => … | Callback fired when grouping state changes. Enables externally controlled grouping. |
onSelectionChange? | (…) => … | : callback with the selected leaf rows' originals when selection changes. |
onSortingChange? | OnChangeFn<SortingState> | Callback fired when sorting state changes. Required when sorting is provided (controlled mode). |
renderFooterRow? | (…) => … | Custom footer row renderer. |
renderGroupRow? | (…) => … | Custom group header row renderer. |
showFooter? | boolean | Whether to show a synthetic footer row after each group's leaf rows. Footer row is only rendered when the group is expanded. |
showGroupAggregates? | boolean | : render per-column aggregate values inline on each group HEADER row (source- aggregated via computeAggregateRow, avg-of-avgs safe; visible even when the group is collapsed). Aggregation per column comes from meta.aggregationFn. Independent of showFooter. |
showGroupPanel? | boolean | Whether to show the GroupPanel drag-and-drop grouping bar above the grid. |
sorting? | SortingState | Controlled sorting state (TanStack SortingState). When provided, onSortingChange must also be provided. |
stickyGroupMaxHeight? | number | : max height (px) of the bounded scroll container when enableStickyGroupRows is on. |
virtualOverscan? | number | Number of overscan rows for virtualization. |
AsyncDataMap
AsyncDataMap<TItem>: 비동기 DataMap 인터페이스. DataMap<TItem>을 확장 — DataMapEditor/DataMapCell에 동기 DataMap과 동일하게 사용 가능.
추가 멤버:
- state: 현재 로딩 상태 (readonly)
- load: 비동기 로드 트리거 — Promise<void> (이미 loading 중이면 동일 Promise 공유)
- invalidate: 캐시 무효화 → state 'idle' 리셋 → 다음 getItems 시 재로드
- onStateChange?: state 변경 콜백 등록 (DataMapEditor spinner 연동용) 반환값 = unsubscribe 함수 (DataMapEditor useEffect cleanup 호출)
: no any — TItem 상한 유지 : onStateChange? optional — 미제공 시 undefined 체크 필수
| 속성 | 타입 | 설명 |
|---|---|---|
state | AsyncDataMapState | |
getDisplay | unknown | |
getItems | unknown | |
getValue | unknown | |
invalidate | unknown | |
load | unknown | |
onStateChange? | unknown |
AutoSizeColumnInput
A single column's input to autoSizeColumns.
| 속성 | 타입 | 설명 |
|---|---|---|
cellValues | string[] | |
columnId | string | |
header | string | |
max? | number | |
min? | number |
AutoSizeColumnOptions
Options for autoSizeColumn.
| 속성 | 타입 | 설명 |
|---|---|---|
cellValues | string[] | Cell text values to measure. |
columnId | string | |
font? | string | CSS font shorthand passed to measureText (optional). |
header | string | Header text to measure. |
max? | number | Upper bound (px) for the result. |
measureText | MeasureText | Injected text-width measurer. |
min? | number | Lower bound (px) for the result. |
padding? | number | Padding (px) added to the widest measured text. Defaults to DEFAULT_AUTOSIZE_PADDING. |
AutoSizeColumnsOptions
Options for autoSizeColumns.
| 속성 | 타입 | 설명 |
|---|---|---|
columns | AutoSizeColumnInput[] | |
font? | string | CSS font shorthand passed to measureText (optional). |
measureText | MeasureText | Injected text-width measurer (shared across all columns). |
padding? | number | Padding (px) applied to every column. Defaults to DEFAULT_AUTOSIZE_PADDING. |
AvatarCellProps
Props for AvatarCell.
New component (spec ) — displays an avatar image with an initials
fallback. When src is missing or fails to load, the component renders
a rounded-full chip showing initials derived from name.
| 속성 | 타입 | 설명 |
|---|---|---|
className? | string | Additional Tailwind className appended to the root span. |
name | string | User name. Source of initials when avatar image is unavailable. |
sizeClassName? | string | Tailwind size class (default 'w-7 h-7'). |
src? | string | Avatar image URL. When undefined or load fails, initials fallback renders. |
BaseGridProps
BaseGridProps<TData> — legacy alias 5종 공통 props 시그니처.
AS-IS legacy grid 타입과 시그니처 동일 — 패키지 내
alias 호환을 위해 신규 정의 (외부 의존 0). 본 interface 는 legacy/BaseGrid.tsx +
legacy/VirtualGrid.tsx (extends) 에서 사용.
| 속성 | 타입 | 설명 |
|---|---|---|
className? | string | |
columns | ColumnDef<TData, unknown>[] | |
data | TData[] | |
emptyText? | string | |
loading? | boolean | |
onRowClick? | (…) => … | |
onRowDoubleClick? | (…) => … | |
pagination? | GridPaginationOptions | |
rowSelection? | GridRowSelectionOptions<TData> |
BlockCacheState
Pure block-cache value. Transitions are pure functions in ./internal/blockCache that
return a new state (never mutate). epoch is the query generation — bumped on
sort/filter/group change so stale in-flight responses are rejected (the SSRM invariant).
| 속성 | 타입 | 설명 |
|---|---|---|
blocks | Map<number, BlockState<TData>> | blockIndex → state. |
blockSize | number | Rows per block (fixed). |
epoch | number | Query generation. Responses tagged with a stale epoch are discarded. |
rowCount | null | number | Known total row count (from lastRow), else null. |
BlockState
Internal per-block state (rows present only when loaded).
| 속성 | 타입 | 설명 |
|---|---|---|
rows? | TData[] | |
status | BlockStatus |
BuildChangeSetOptions
| 속성 | 타입 | 설명 |
|---|---|---|
mapping? | Mapping<TData> | Screen-to-BE field mapping. When omitted, rows pass through as a shallow clone. |
validator? | Validator<TData> | Row-level validator. When omitted, every row passes. |
ButtonCellProps
Props for ButtonCell.
Absorbs legacy ButtonCell with the variant
naming change ( — L0 'primary' | 'danger' | 'ghost' → spec
'default' | 'destructive' | 'ghost'). Visual output (Tailwind classes)
unchanged: default==L0 primary, destructive==L0 danger.
grep at implement time: 0 hardcoded variant='primary'|'danger' sites
across the legacy source — direct rename safe (no codemod needed).
value added as preferred prop; label retained as deprecated alias ( amendment).
| 속성 | 타입 | 설명 |
|---|---|---|
className? | string | Additional Tailwind className. |
disabled? | boolean | Disabled state (L0 preserved). Default false. |
label? | ReactNode | |
onClick | (…) => … | Click callback (L0 required, preserved). |
size? | "sm" | "xs" | Size token (L0 preserved). Default 'xs'. |
value? | ReactNode | Button label (text or arbitrary ReactNode). Preferred prop ( amendment). |
variant? | "default" | "destructive" | "ghost" | Visual variant ( renamed from L0 primary/danger). Default 'ghost'. |
CellCommentsAPI
useCellComments 반환 표면.
| 속성 | 타입 | 설명 |
|---|---|---|
clear | (…) => … | 전체 삭제. |
comments | ReadonlyMap<string, string> | 현 코멘트 Map(commentKey → text). 렌더 간 안정 참조(미변경 시). |
deleteComment | (…) => … | 셀 코멘트 삭제. |
getComment | (…) => … | 셀 코멘트 조회(없으면 undefined). |
setComment | (…) => … | 셀 코멘트 설정(빈 문자열도 저장 — 삭제는 deleteComment). |
CellComponentProps
Display-mode cell component contract.
Compatible with TanStack ColumnDef.cell context (row + column) via optional props — the registry consumer ( createColumns) supplies row/column from the cell context when invoking the renderer via React.createElement.
| 속성 | 타입 | 설명 |
|---|---|---|
column? | Column<unknown, unknown> | TanStack column context (optional — registry consumers pass when available). |
row? | Row<unknown> | TanStack row context (optional — registry consumers pass when available). |
value | unknown | Cell value resolved from the row's accessor. |
CellCoord
셀 범위(range) 순수 유틸 — 정규화·포함판정·drag-fill·TSV (W1 Phase 0, grid-pro-range 에서 이관).
전부 framework-agnostic 순수 함수 + 순수 데이터 타입(좌표/사각형/방향/업데이트). React(grid-pro-range)·Vue 범위 어댑터가 동일 math/serialization 을 공유한다. 렌더/이벤트 무관.
| 속성 | 타입 | 설명 |
|---|---|---|
col | number | |
row | number |
CellError
An error value — propagated through arithmetic and functions.
| 속성 | 타입 | 설명 |
|---|---|---|
error | ErrorCode |
CellFormatRule
셀 단위 조건부 서식 룰.
| 속성 | 타입 | 설명 |
|---|---|---|
className | string | 술어 true 시 셀에 append 할 className |
when | (…) => … | 셀 값(cell.getValue)과 행 데이터(cell.row.original)로 평가하는 술 어 |
CellLike
Minimal structural view of a TanStack Cell (it satisfies this — we read only these).
| 속성 | 타입 | 설명 |
|---|---|---|
column | { … } | |
getValue | (…) => … | |
row | { … } |
CellMatch
검색 결과 1건. value = 원본 셀 값(타입 보존).
| 속성 | 타입 | 설명 |
|---|---|---|
columnId | string | |
rowKey | string | |
value | unknown |
CellRange
| 속성 | 타입 | 설명 |
|---|---|---|
end | CellCoord | |
start | CellCoord |
CellUpdate
| 속성 | 타입 | 설명 |
|---|---|---|
col | number | |
row | number | |
value | TCell |
ChangeSet
Server payload shape produced by getChangeSet / commitChanges.
errors carries per-row mapping/validator failures with the originating row index.
| 속성 | 타입 | 설명 |
|---|---|---|
added | MappedRow[] | |
errors | { … }[] | |
removed | MappedRow[] | |
updated | MappedRow[] |
ChangeTrackingAPI
| 속성 | 타입 | 설명 |
|---|---|---|
added | readonly TData[] | Added rows. |
deleted | readonly TData[] | Rows marked for deletion. |
edited | readonly OriginalSnapshot<TData>[] | Edited rows with __original preserved (see OriginalSnapshot). |
editedCellsMap | ReadonlyMap<string, boolean> | 편집된 셀 위치 맵. key = rowKey + '_' + columnId. editedCells config가 false면 항상 empty. ( wires) |
rows | readonly TData & { … }[] | Display rows (added/edited/deleted merged, __rowStatus attached). |
addRow | unknown | |
commitChanges | unknown | |
deleteRow | unknown | |
getChangeSet | unknown | |
hasChanges | unknown | |
resetChanges | unknown | |
undoRow | unknown | |
updateRow | unknown |
ChangeTrackingConfig
| 속성 | 타입 | 설명 |
|---|---|---|
data | TData[] | Initial dataset. Snapshot is captured at mount. ( implements snapshot.) |
editedCells? | boolean | 셀 단위 편집 추적 활성화. true로 설정 시 editedCellsMap에 편집된 셀 위치 기록. Default false. ( wires reducer) |
mapping? | Mapping<TData> | Screen-to-BE field mapping. ( implements the runtime application.) |
onSnapshotInit? | (…) => … | Callback fired after the initial snapshot is built. |
optimistic? | boolean | Optimistic update — auto-rollback on commit failure. Default false. |
rowKey | keyof TData | (…) => … | PK extractor — either a field name or a function returning a string key. |
validator? | Validator<TData> | Row-level validator. ( implements the runtime application.) |
ChangeTrackingGridProps
Props for the ChangeTrackingGrid alias.
Inherits all <Grid> props except data (the alias overrides data so
<Grid> receives tracking.rows rather than the caller's source array —
this is what binds added/edited/deleted overlays to the rendered grid).
| 속성 | 타입 | 설명 |
|---|---|---|
alwaysMultiSort? | boolean | 평범 클릭으로도 다중 정렬 누적. enableMultiSort 와 함께 사용. 기본은 Shift+클릭이 다중 정렬 키지만, true 면 Shift 없이 컬럼을 순차 클릭해 누적. (TanStack isMultiSortEvent: => true passthrough.) |
autoSelectFirstRow? | boolean | 데이터 로드 후 첫 행 자동 선택 (default false). |
cellClassName? | CellClassNameCallback<TData> | 셀별 className 생성 callback. 모든 cell 렌더 시 호출. 반환 string 은 <td> 의 기본 className 에 append. canonical: 본 callback type 은 grid-core 가 ownership. grid-renderers 는 type-only re-export. 사용 예 (publish/organizeSchedule 등가): tsx cellClassName={(cell) => { if (!cell.column.id.startsWith('d')) return ''; const isSelected = cell.row.getIsSelected; const hasValue = cell.getValue != null && cell.getValue !== ''; return [ isSelected && 'bg-indigo-100', !isSelected && hasValue && 'bg-yellow-50', ].filter(Boolean).join(' '); }} 성능 주의: 매 cell 렌더마다 호출 — 대용량 데이터 시 callback 내부 계산 비용 주의 (useMemo 또는 stable callback 권장). |
className? | string | 외곽 wrapper className (Tailwind). |
columnOrderStorageKey? | string | persistColumnOrder=true 시 사용할 localStorage 키. 빈 문자열('') 전달 시 localStorage 접근 없음. 미지정 시 persistColumnOrder=true 라도 저장 skip. |
columnPersistence? | ColumnPersistenceOptions | 컬럼 가시성 + 순서 localStorage 영속화 옵션. - 제공 시 <ColumnVisibilityMenu> UI 자동 렌더 + useColumnPersistence 활성. - 미제공(undefined) 시 영속화 비활성 + 메뉴 미표시 ( backward compat). - storageKey: '' 시 localStorage 접근 없음 (NFR-006). |
columnResizeMode? | GridColumnResizeMode | 컬럼 리사이즈 모드 (default 'onChange'). enableColumnResizing=true 일 때만 효과 발휘. |
columns | ColumnDef<TData, unknown>[] | 컬럼 정의 (TanStack ColumnDef). |
data | TData[] | Initial dataset (forwarded to useChangeTracking). |
debug? | boolean | TanStack debugTable 옵션 노출 (default false). |
defaultColumnPinning? | ColumnPinningState | 컬럼 핀 uncontrolled 초기값 ({ left: string[]; right: string[] }). ColumnPinGrid pinLeft / pinRight alias 매핑 진입점. |
defaultColumnSizing? | ColumnSizingState | 컬럼 width uncontrolled 초기값 (column id → px). mount 시 internal columnSizing state 의 초기값으로 사용 (uncontrolled 패턴). |
defaultExpanded? | false | ExpandedState | enableExpanding=true 시 expanded state 초기값 (uncontrolled). - true = 전체 펼침 - Record<string, boolean> = 특정 row id만 펼침 - 미지정 = {} (전체 접힘) — TreeGrid alias expandAll={true} 호환 진입점. AS-IS TreeGrid.tsx:35 useState<ExpandedState>(initialExpandAll ? true : {}) initial seed 패턴 보존. |
editedCells? | boolean | Toggle cell-level edit tracking. |
emptyState? | ReactNode | 빈 결과 상태 ReactNode slot. 제공 시 emptyText 보다 우선 렌더 ( — slot → text → defaultText 순). |
emptyText? | string | 빈 결과 안내 텍스트 (default '데이터가 없습니다.'). |
enableCellChangeFlash? | boolean | 셀 값 변경 시 잠깐 강조(change-flash). data 가 바뀌면 값이 실제로 변한 셀(행 정체성으로 diff — 재정렬은 미강조)에 ~0.9s 배경 하이라이트. 안정적 강조를 위해 getRowId 를 함께 지정 권장(미지정 시 인덱스 기준 diff → 재정렬도 강조됨). |
enableColumnPinning? | boolean | 컬럼 핀 state 활성 (default false). 본 은 state.columnPinning state 만 활성화. sticky CSS 외관은 범위. |
enableColumnReorder? | boolean | 컬럼 드래그 재정렬 활성 (default false). HTML5 Drag and Drop API 기반 — 외부 dnd 라이브러리 미사용. :. |
enableColumnResizing? | boolean | 컬럼 리사이즈 state 활성 (default false). resize handle UI 는 범위. |
enableColumnVirtualization? | boolean | 컬럼(가로) 가상화 활성. true 시 화면 밖 center 컬럼은 렌더하지 않고 좌/우 padding 셀로 가로 스크롤 폭만 유지한다 — 100+ 컬럼의 렌더 비용 절감. 핀 컬럼은 가상화 대상이 아니며 가로 스크롤과 무관하게 항상 렌더된다. 미지정/false → 전 컬럼 렌더(기존 동작과 byte-identical). v1 제약: flat(단일 행) 헤더 전용 — 그룹/다단 헤더(getHeaderGroups.length > 1)에서는 colSpan 회계 복잡도로 자동 비활성(전 컬럼 렌더). 그룹 헤더 가상화는 v2. 레이아웃: true 시 <table> 은 table-layout: fixed + 전체 컬럼 폭(ΣgetSize)으로 고정되어 컬럼이 명시 너비를 정확히 유지한다(pad px 와 정렬 일치). 부수효과로 셀 내용이 컬럼 너비를 넘으면 잘린다(clip) — 가상화 그리드의 정상 거동. 가로 스크롤 컨테이너는 기존 overflow-x-auto(또는 행 가상화의 overflow:auto)가 제공하므로 Tailwind 미적용 소비자는 컨테이너에 overflow-x 를 직접 지정해야 한다. ⚠️ 실험적: 본문+헤더 가상화 배선 + chromium 정렬 매트릭스 완료(Commit C). off=기존과 byte-identical, SSR/미측정 시 전 컬럼 렌더(안전 fallback). |
enableExpanding? | boolean | 행 펼침(expanding) state 활성 (default false) — TreeGrid 흡수. getSubRows 와 함께 사용. |
enableFilter? | boolean | 컬럼 필터 활성 (default false) — getFilteredRowModel wiring. |
enableMultiSort? | boolean | 다중 정렬 활성 (default false) — TanStack enableMultiSort 위임. |
enablePagination? | boolean | 페이지네이션 활성 (default false) — getPaginationRowModel wiring. |
enableRowClickSelection? | boolean | 행 본문 클릭으로 선택. rowSelection 이 'single'/'multi' 일 때만 동작. - plain 클릭 → 그 행만 선택(나머지 해제). ctrl/cmd+클릭 → 토글(다중 누적). (shift 범위 = ) - 기존 onRowClick 콜백과 독립 공존 — 선택을 하면서 onRowClick 도 그대로 호출. - 체크박스 셀(__select__) 클릭은 stopPropagation 으로 이 경로를 안 탐(기존 동작 보존). |
enableRowPinning? | boolean | 행 고정. 사용자가 데이터 행을 상/하단에 고정(row.pin('top'|'bottom')). 고정 행은 sticky 로 스크롤 중 고정되고 center 행에서 제외된다. 비-가상화 전용(가상화+핀=vN). UI 컨트롤은 RowPinButton 컴포넌트를 셀에 배치. |
enableRowReorder? | boolean | 행 드래그 재정렬 활성 (default false). 데이터 행을 draggable 로 만들어 드롭 시 onRowReorder(from, to) 호출(소비자가 moveRow(data, from, to) 로 자기 data 적용). 정렬/필터 활성 시 자동 비활성(표시순≠data순이라 재배열 모호) + 비-가상화 전용(가상화 합성 = vN). HTML5 drag. |
enableSort? | boolean | 정렬 활성 (default false) — getSortedRowModel wiring. |
enableVirtualization? | boolean | 가상화 활성 (default false) — opt-in only. true 시 useGridVirtualizer wiring + tbody padding-row 패턴 적용. false 시 ~ markup 그대로 ( sticky/pinning 보존). |
floatingBottomRows? | TData[] | 그리드 하단에 고정 표시할 소비자 공급 행 데이터. floatingTopRows 와 동일 규약(하단 sticky). |
floatingTopRows? | TData[] | 그리드 상단에 고정 표시할 소비자 공급 행 데이터. XX Grid 의 pinnedTopRowData 와 동형 — 데이터 모델 밖의 추가 행(합계/요약 등). 컬럼 셀 렌더러(columnDef.cell)를 그대로 통과해 본문 행과 동일하게 표시되며, 본문이 스크롤돼도 position: sticky 로 고정된다. 집계 계산 안 함: 소비자가 total 객체를 직접 제공(자동 집계는 @topgrid/grid-pro-agg/Pro). 상호작용 핀 아님: 기존 행을 사용자가 핀하는 기능(@topgrid/grid-pro-master/Pro)과 별개. 미제공/빈 배열 → 렌더 없음(기존 동작 불변). |
getCellTooltip? | (…) => … | 셀 툴팁. 셀마다 호출해 반환 문자열을 <td title> 로 부여(네이티브 hover 툴팁) — 잘린 내용 표시·부가 설명 등. undefined/null/'' 반환 시 해당 셀 title 미부여. grid-core 1.0 : (cell, row) → (ctx) (clean GridCellContext). |
getRowId? | (…) => … | 안정적 행 식별자. 미지정 시 행 키 = 배열 인덱스. 제공하면 rowSelection·expanded 등 모든 행-키 상태가 인덱스가 아닌 이 id 로 매겨져, 데이터 재정렬/교체를 가로질러 동일 논리 행을 추적(선택이 위치가 아닌 정체성을 따라감). cell 변경 flash 가 "같은 행"을 식별하는 토대. |
getSubRows? | (…) => … | TanStack getSubRows — enableExpanding=true 시 사용. |
icons? | Partial<GridIcons> | 정렬 표시 아이콘 glyph override(부분). 미지정은 기본(▲▼⇅)으로 fallback. |
loading? | boolean | 로딩 상태. true 시 <tbody> 영역만 skeleton row 로 치환 (thead 보존 — ). |
loadingOverlay? | boolean | 로딩 오버레이 (default false). loading(skeleton 치환)과 달리 기존 data 행을 그대로 둔 채 그 위에 반투명 오버레이를 덮는다(기존 데이터를 유지하며 갱신 중임을 표시). aria-busy + pointer-events 차단(하부 상호작용 막음). loading(skeleton)과 독립·additive — 둘 다 기존 동작 불변. |
loadingRowCount? | number | 로딩 시 표시할 skeleton 행 개수. 미지정 시 pagination.pageSize ?? 5 로 fallback ( — BaseGrid L123 hardcoded 5 와 호환). |
localeText? | Partial<GridLocale> | grid chrome 문자열 현지화 — 부분 override. 미지정 키는 한국어 기본으로 fallback(raw key/undefined 안 냄). 영문화 예: { emptyText: 'No data', rowsPerPage: 'Rows per page:', totalCount: (n) => ${n} rows }. defaultGridLocale 를 import 해 위에 spread 도 가능. |
manualFiltering? | boolean | Server 필터: true 시 클라이언트 필터 비활성(getFilteredRowModel skip + manualFiltering). default false. |
manualSorting? | boolean | Server 정렬: true 시 클라이언트 정렬 비활성(getSortedRowModel skip + manualSorting). 정렬 UI/state 는 유지(헤더 클릭 → onSortingChange)되 실제 정렬은 서버 위임. default false. |
mapping? | Mapping<TData> | Screen-to-BE mapping (optional). |
maxMultiSortColCount? | number | 동시에 정렬 가능한 최대 컬럼 수. TanStack maxMultiSortColCount 에 직접 전달. 미설정 시 무제한. enableMultiSort=false 시 무시됨. |
onAddRow? | (…) => … | 행 추가 콜백 — ref.current.addRow(seed?) 호출 시 invoke. controlled data 정책: parent 가 props.data 배열에 새 row append 책임. |
onCellClick? | (…) => … | 셀 클릭 핸들러 — column-level 분기 의도 노출. grid-core 1.0 : (cell, row, event) → (ctx, event). ctx 는 clean GridCellContext — ctx.columnId·ctx.value·ctx.rowId·ctx.row(=구 row.original). |
onCellKeyDown? | (…) => … | 셀 키보드 이벤트 핸들러 — <td onKeyDown> 으로 wire. grid-core 1.0 : (cell, row, event) → (ctx, event) (clean GridCellContext). |
onColumnFiltersChange? | OnChangeFn<ColumnFiltersState> | ColumnFilters state 변경 콜백 (server 필터 파라미터 도출용; internal state 도 갱신). |
onColumnOrderChange? | (…) => … | 컬럼 순서 변경 완료 후 호출되는 콜백. 부모가 외부 state 동기화 가능. : F-07-06 흡수. |
onColumnPinningChange? | OnChangeFn<ColumnPinningState> | ColumnPinning state 변경 콜백 (외부 영속화 또는 controlled mirror 용). |
onColumnSizingChange? | OnChangeFn<ColumnSizingState> | ColumnSizing state 변경 콜백 (외부 영속화 또는 controlled mirror 용). |
onDeleteRow? | (…) => … | 행 삭제 콜백 — ref.current.deleteRow(rowId) 호출 시 invoke. rowId = TanStack row.id (default = row index string). |
onRowClick? | (…) => … | 행 클릭 핸들러. |
onRowDoubleClick? | (…) => … | 행 더블 클릭 핸들러 — onRowClick 와 동일한 시그니처 정책. |
onRowDragStart? | (…) => … | 그리드 간 행 드래그 — 드래그 소스(default 없음=비활성). 제공 시 데이터 행이 draggable 이 되어 dragstart 시 onRowDragStart(rowId) 호출(rowId = TanStack row.id). 소비자가 드래그된 행 id 를 두 그리드 위 state 로 들어올려 보관한다(consumer-owns-payload, dataTransfer 미사용). 대상 그리드의 onRowDrop 과 짝. enableRowReorder 와 별 opt-in(같은 그리드서 혼용 금지=vN). OFF 시 byte-identical. |
onRowDrop? | (…) => … | 그리드 간 행 드래그 — 드롭 타깃(default 없음=비활성). 제공 시 그리드 본문 영역이 drop target 이 되어(드롭 시) onRowDrop 호출. 소비자가 자기 dragged id 를 읽어 순수 transferRow 로 소스→타깃 data 를 적용한다. OFF 시 byte-identical. |
onRowReorder? | (…) => … | 행 재정렬 드롭 콜백 — 표시 인덱스 from→to. 소비자가 moveRow 로 data 적용. |
onSave? | (…) => … | Convenience callback — invoked with the latest ChangeSet on user demand by the consumer (the alias does NOT auto-call commitChanges; that is the caller's responsibility to keep the alias's network policy explicit). Forwarded out via the imperative ref handle's getChangeSet. |
onSortingChange? | OnChangeFn<SortingState> | Sorting state 변경 콜백 (server 정렬 파라미터 도출용; internal state 도 갱신). |
onStartEditing? | (…) => … | 프로그래밍적 편집 시작 콜백 — ref.current.startEditing(rowId, colId) 호출 시 invoke. 의 callback-delegating 패턴과 동일 정책: Grid 가 editing state 를 소유하지 않으며 application 이 EditableCell isEditing 갱신 책임. |
onUpdateRow? | (…) => … | 행 부분 업데이트 콜백 — ref.current.updateRow(rowId, patch) 호출 시 invoke. |
optimistic? | boolean | Optimistic update — auto-rollback on commit failure. |
pagination? | GridPaginationOptions | 페이지네이션 세부 옵션 (enablePagination=true 일 때 효과). |
persistColumnOrder? | boolean | 컬럼 순서 localStorage 영속화 활성. true + columnOrderStorageKey 지정 시 drag/keyboard 완료 후 localStorage 저장. mount 시 저장된 순서 복원 (table.setColumnOrder). |
renderFloatingFilter? | (…) => … | Floating 필터 행 렌더 콜백. 지정 시 leaf 헤더행 아래 always-visible 필터 입력 행을 그린다(prop 존재=활성, cellClassName 관례 mirror). 컬럼당 1회 호출 — 보통 grid-features 의 floating 입력 컴포넌트(column.setValue 로 popover 와 동일 state 공유)를 반환. grid-core 는 구조 행 + 컬럼 윈도(가상화)·핀 sticky·ARIA 정합만 제공(grid-features 무의존=MIT). null 반환=빈 셀. grid-core 1.0 : Column<TData,unknown> → clean GridFilterColumn (id·value·setValue — TanStack 타입 없음). |
rowClassName? | RowClassNameCallback<TData> | 행별 className 생성 callback. 모든 row 렌더 시 호출. 반환 string 은 <tr> 의 기본 className 에 append. virtualization 주의: enableVirtualization=true 시 <tr ref={measureElement}> 가 row height 측정 — rowClassName 이 dynamic height 변경을 유발하면 measureElement 의 reflow 가 반복 발생 (성능 저하). static className 권장. |
rowKey | keyof TData | (…) => … | PK extractor for change tracking. |
rowSelection? | RowSelectionMode | GridRowSelectionOptions<TData> | 행 선택 옵션. 단축 표기('multi') 또는 객체 표기 모두 지원. 'single'/'multi' 시 좌측 첫 컬럼에 체크박스 컬럼(__select__) 자동 prepend. |
showSortClearButton? | boolean | 정렬 초기화 버튼 표시 여부. true 이고 enableMultiSort=true 일 때 툴바에 <SortClearButton> 렌더. 미설정(기본) 시 DOM 구조 변경 없음. |
sortDescFirst? | boolean | 정렬 첫 클릭 방향을 내림차순으로. (TanStack sortDescFirst passthrough — 미지정 시 타입별 기본: 숫자=desc-first, 문자=asc-first.) |
theme? | Partial<GridTheme> | grid chrome 색 테마(부분 override). 제공한 색만 root 에 inline --topgrid-* var 로 적용되고 각 surface 가 var(--topgrid-x, <기본 hex>) 로 읽는다. 미지정 키는 기본색 fallback. 다크 등 프리셋은 import { darkTheme } 후 spread. ⚠ CSS var 는 forced-colors(고대비)서 무력 (HC-safe 선택 표시는 별도 메커니즘). |
validator? | Validator<TData> | Row validator (optional). |
virtualizerOptions? | { … } | useVirtualizer 옵션 override. - estimateSize: 행 높이 추정 px (default 36, BaseGrid <td className="px-4 py-3"> 기준). - overscan: viewport 위/아래 버퍼 행 수 (default 10, VirtualGrid.tsx:102 동일). - onChange: virtualizer 변경 콜백(가시 범위 관찰 — SSRM 의 블록 fetch 트리거). useVirtualizer 에 그대로 전달. generic passthrough(SSRM 전용 로직 0). |
virtualScrollHeight? | number | 가상화 시 scroll container 높이 (px, default 400). enableVirtualization=true 일 때만 효과 발휘. |
ChartCardProps
| 속성 | 타입 | 설명 |
|---|---|---|
ariaLabel? | string | Accessible label for the chart. Default 'chart'. |
categories? | string[] | Optional category labels for the x-axis (one per slot). |
className? | string | className appended to the root <svg>. |
dock? | ChartDock | : where the type/settings toolbar docks relative to the chart (composition). Inline flex (P27-1 — Tailwind inert in the harness). 'top'/'bottom' stack; 'left'/'right' place the toolbar beside the chart. |
height? | number | SVG height in px. Default 200. |
initialType? | RangeChartType | Initial chart type. Default 'bar'. |
onSelectCategory? | (…) => … | (cross-filter): fired when a category slot (bar/point) is clicked, with its 0-based index. Consumers map index→category label and feed selectionsToFilter (@topgrid/grid-pro-filter) to drive a linked grid filter. When set, marks become clickable. |
selectedCategory? | null | number | (linked highlight): the currently-selected category index (or null/omitted for none). The selected slot stays full-opacity; unselected slots dim — the visual link to the grid. |
series | ChartSeries[] | Series to plot. Each values[i] shares category slot i across series. |
showLegend? | boolean | Show the series legend (swatch + name). Default true. |
showTooltip? | boolean | Show a value tooltip on hover. Default true. |
title? | string | Optional title shown at the toolbar's left. |
types? | RangeChartType[] | Chart types offered by the toolbar switcher. Default ['bar','line','area']. |
width? | number | SVG width in px. Default 360. |
ChartGeometry
Computed pixel geometry for the whole chart — everything the renderer needs.
| 속성 | 타입 | 설명 |
|---|---|---|
plot | PlotArea | |
series | { … }[] | |
xBand | BandScale | |
yScale | LinearScale | |
yTicks | number[] |
ChartPoint
A single plotted vertex: pixel position + the original value/category index.
| 속성 | 타입 | 설명 |
|---|---|---|
index | number | |
value | number | |
x | number | |
y | number |
ChartSeries
One input series for the chart.
| 속성 | 타입 | 설명 |
|---|---|---|
color? | string | |
name | string | |
values | number[] |
CheckCellProps
Props for CheckCell.
Absorbs legacy CheckCell. Markup preserved:
native <input type="checkbox"> (NOT an icon SVG — spec ).
| 속성 | 타입 | 설명 |
|---|---|---|
checked | boolean | Checked state (L0 L2 preserved). |
className? | string | Additional Tailwind className appended to the rendered input. |
onChange? | (…) => … | Change callback (L0 L3 preserved). Not invoked when readOnly is true. |
readOnly? | boolean | Read-only mode (L0 L4 preserved). Default false. |
ClipboardOptions
클립보드 복사 옵션
| 속성 | 타입 | 설명 |
|---|---|---|
emptyBehavior? | EmptyBehavior | 데이터 행 0건 시 동작 - 'skip': 복사 안 함 (기본) - 'empty': 헤더만 있는 TSV 클립보드 복사 |
includeHeader? | boolean | 헤더 행 포함 여부 - true: 첫 줄에 헤더 행 포함 (기본 — 기존 동작) - false: 데이터 행만 복사 (다른 영역에 붙여넣어 헤더 중복 방지) |
scope? | ExportScope | export 대상 행 범위 - 'all': getCoreRowModel (필터 무시, 전체) - 'filtered': getFilteredRowModel (현재 정렬/필터 반영) ← default - 'selected': table.getSelectedRowModel (선택 행만) |
ColumnGroupConfig
Config object for createColumnGroup.
| 속성 | 타입 | 설명 |
|---|---|---|
columns | ColumnDef<TData>[] | Leaf (or nested group) column definitions belonging to this group. |
header | string | The display label for the column group header. |
ColumnInfo
DataTable 호환 ColumnInfo 인터페이스.
레거시 DataTable data-table-types.ts와 동일 shape.
신규 코드에서는 TopgridColumnDef<TData> 사용 권장.
createColumns 가 ColumnInfo[] 입력 시 내부에서 TopgridColumnDef로 narrowing:
type필드가 9종TopgridColumnTypeunion 중 하나이면 그대로 사용- 그 외 string이면
'text'fallback
| 속성 | 타입 | 설명 |
|---|---|---|
align | string | 정렬 방향 (string — 'left'|'center'|'right' 권장) |
etc? | string | ColumnInfo 호환: 'primary' 포함 여부로 meta.primary 설정. 참조. |
id | string | column accessor key |
name | string | 표시 헤더명 |
type | string | column 타입 (string — union 아님). createColumns 내부에서 TopgridColumnType union으로 narrowing. 9종 외 값은 'text' fallback. |
visibility? | boolean | false이면 column 숨김. 기본 true. |
width | string | 픽셀 단위 너비 문자열 ('100', '200' 등) |
ColumnPersistenceOptions
컬럼 가시성 + 순서 localStorage 영속화 옵션.
<Grid columnPersistence={...} /> prop 에 전달.
| 속성 | 타입 | 설명 |
|---|---|---|
persist? | PersistTarget[] | 영속화할 state 대상 (default ['visibility', 'order']). - 'visibility': 컬럼 표시/숨김 (VisibilityState). - 'order': 컬럼 순서 (ColumnOrderState). |
storageKey | string | localStorage 키. 빈 문자열('') 시 localStorage 접근 없음 (no-op, NFR-006). 앱 내 고유값 권장 (예: 'hr-grid-v1'). |
version? | number | 저장 포맷 버전 (default 1). 컬럼 구조 변경 시 값을 올려 이전 저장 항목을 무효화. mismatch 시 기존 항목 삭제 + state 복원 skip. |
ColumnPinGridProps
ColumnPinGridProps<TData> — AS-IS shape 보존 (ColumnPinGrid.tsx L14-26).
| 속성 | 타입 | 설명 |
|---|---|---|
className? | string | |
columns | ColumnDef<TData>[] | |
data | TData[] | |
emptyText? | string | |
loading? | boolean | |
onRowClick? | (…) => … | |
pagination? | GridPaginationOptions | |
pinLeft? | string[] | 좌측 sticky pinned column id 배열 (default []). |
pinRight? | string[] | 우측 sticky pinned column id 배열 (default []). |
rowSelection? | GridRowSelectionOptions<TData> |
CommandStackState
순수 command 스택 상태(불변).
| 속성 | 타입 | 설명 |
|---|---|---|
redoStack | readonly UndoRedoCommand[] | |
undoStack | readonly UndoRedoCommand[] |
CommitOptions
Options for commitChanges.
| 속성 | 타입 | 설명 |
|---|---|---|
autoReset? | boolean | Auto resetChanges on success. Default true. |
fetcher? | (…) => … | Custom fetcher (axios-compatible). Default globalThis.fetch. |
method? | string | HTTP method. Default 'POST'. |
optimistic? | boolean | Override config.optimistic for this single call. When true, a failure during commit dispatches RESET (rollback of all tracked changes) before re-throwing. Default = config.optimistic. |
ContextMenuGridProps
Props for <ContextMenuGrid>.
Extends GridProps<TData> with context menu specific props.
| 속성 | 타입 | 설명 |
|---|---|---|
alwaysMultiSort? | boolean | 평범 클릭으로도 다중 정렬 누적. enableMultiSort 와 함께 사용. 기본은 Shift+클릭이 다중 정렬 키지만, true 면 Shift 없이 컬럼을 순차 클릭해 누적. (TanStack isMultiSortEvent: => true passthrough.) |
autoSelectFirstRow? | boolean | 데이터 로드 후 첫 행 자동 선택 (default false). |
cellClassName? | CellClassNameCallback<TData> | 셀별 className 생성 callback. 모든 cell 렌더 시 호출. 반환 string 은 <td> 의 기본 className 에 append. canonical: 본 callback type 은 grid-core 가 ownership. grid-renderers 는 type-only re-export. 사용 예 (publish/organizeSchedule 등가): tsx cellClassName={(cell) => { if (!cell.column.id.startsWith('d')) return ''; const isSelected = cell.row.getIsSelected; const hasValue = cell.getValue != null && cell.getValue !== ''; return [ isSelected && 'bg-indigo-100', !isSelected && hasValue && 'bg-yellow-50', ].filter(Boolean).join(' '); }} 성능 주의: 매 cell 렌더마다 호출 — 대용량 데이터 시 callback 내부 계산 비용 주의 (useMemo 또는 stable callback 권장). |
className? | string | 외곽 wrapper className (Tailwind). |
columnOrderStorageKey? | string | persistColumnOrder=true 시 사용할 localStorage 키. 빈 문자열('') 전달 시 localStorage 접근 없음. 미지정 시 persistColumnOrder=true 라도 저장 skip. |
columnPersistence? | ColumnPersistenceOptions | 컬럼 가시성 + 순서 localStorage 영속화 옵션. - 제공 시 <ColumnVisibilityMenu> UI 자동 렌더 + useColumnPersistence 활성. - 미제공(undefined) 시 영속화 비활성 + 메뉴 미표시 ( backward compat). - storageKey: '' 시 localStorage 접근 없음 (NFR-006). |
columnResizeMode? | GridColumnResizeMode | 컬럼 리사이즈 모드 (default 'onChange'). enableColumnResizing=true 일 때만 효과 발휘. |
columns | ColumnDef<TData, unknown>[] | 컬럼 정의 (TanStack ColumnDef). |
contextMenuItems? | ContextMenuItem<TData>[] | Array of context menu items displayed on right-click. When absent (or empty), right-click falls through to the browser default. When provided, preventDefault is called and the custom menu is shown. |
data | TData[] | 행 데이터 배열. |
debug? | boolean | TanStack debugTable 옵션 노출 (default false). |
defaultColumnPinning? | ColumnPinningState | 컬럼 핀 uncontrolled 초기값 ({ left: string[]; right: string[] }). ColumnPinGrid pinLeft / pinRight alias 매핑 진입점. |
defaultColumnSizing? | ColumnSizingState | 컬럼 width uncontrolled 초기값 (column id → px). mount 시 internal columnSizing state 의 초기값으로 사용 (uncontrolled 패턴). |
defaultExpanded? | false | ExpandedState | enableExpanding=true 시 expanded state 초기값 (uncontrolled). - true = 전체 펼침 - Record<string, boolean> = 특정 row id만 펼침 - 미지정 = {} (전체 접힘) — TreeGrid alias expandAll={true} 호환 진입점. AS-IS TreeGrid.tsx:35 useState<ExpandedState>(initialExpandAll ? true : {}) initial seed 패턴 보존. |
emptyState? | ReactNode | 빈 결과 상태 ReactNode slot. 제공 시 emptyText 보다 우선 렌더 ( — slot → text → defaultText 순). |
emptyText? | string | 빈 결과 안내 텍스트 (default '데이터가 없습니다.'). |
enableCellChangeFlash? | boolean | 셀 값 변경 시 잠깐 강조(change-flash). data 가 바뀌면 값이 실제로 변한 셀(행 정체성으로 diff — 재정렬은 미강조)에 ~0.9s 배경 하이라이트. 안정적 강조를 위해 getRowId 를 함께 지정 권장(미지정 시 인덱스 기준 diff → 재정렬도 강조됨). |
enableColumnPinning? | boolean | 컬럼 핀 state 활성 (default false). 본 은 state.columnPinning state 만 활성화. sticky CSS 외관은 범위. |
enableColumnReorder? | boolean | 컬럼 드래그 재정렬 활성 (default false). HTML5 Drag and Drop API 기반 — 외부 dnd 라이브러리 미사용. :. |
enableColumnResizing? | boolean | 컬럼 리사이즈 state 활성 (default false). resize handle UI 는 범위. |
enableColumnVirtualization? | boolean | 컬럼(가로) 가상화 활성. true 시 화면 밖 center 컬럼은 렌더하지 않고 좌/우 padding 셀로 가로 스크롤 폭만 유지한다 — 100+ 컬럼의 렌더 비용 절감. 핀 컬럼은 가상화 대상이 아니며 가로 스크롤과 무관하게 항상 렌더된다. 미지정/false → 전 컬럼 렌더(기존 동작과 byte-identical). v1 제약: flat(단일 행) 헤더 전용 — 그룹/다단 헤더(getHeaderGroups.length > 1)에서는 colSpan 회계 복잡도로 자동 비활성(전 컬럼 렌더). 그룹 헤더 가상화는 v2. 레이아웃: true 시 <table> 은 table-layout: fixed + 전체 컬럼 폭(ΣgetSize)으로 고정되어 컬럼이 명시 너비를 정확히 유지한다(pad px 와 정렬 일치). 부수효과로 셀 내용이 컬럼 너비를 넘으면 잘린다(clip) — 가상화 그리드의 정상 거동. 가로 스크롤 컨테이너는 기존 overflow-x-auto(또는 행 가상화의 overflow:auto)가 제공하므로 Tailwind 미적용 소비자는 컨테이너에 overflow-x 를 직접 지정해야 한다. ⚠️ 실험적: 본문+헤더 가상화 배선 + chromium 정렬 매트릭스 완료(Commit C). off=기존과 byte-identical, SSR/미측정 시 전 컬럼 렌더(안전 fallback). |
enableExpanding? | boolean | 행 펼침(expanding) state 활성 (default false) — TreeGrid 흡수. getSubRows 와 함께 사용. |
enableFilter? | boolean | 컬럼 필터 활성 (default false) — getFilteredRowModel wiring. |
enableMultiSort? | boolean | 다중 정렬 활성 (default false) — TanStack enableMultiSort 위임. |
enablePagination? | boolean | 페이지네이션 활성 (default false) — getPaginationRowModel wiring. |
enableRowClickSelection? | boolean | 행 본문 클릭으로 선택. rowSelection 이 'single'/'multi' 일 때만 동작. - plain 클릭 → 그 행만 선택(나머지 해제). ctrl/cmd+클릭 → 토글(다중 누적). (shift 범위 = ) - 기존 onRowClick 콜백과 독립 공존 — 선택을 하면서 onRowClick 도 그대로 호출. - 체크박스 셀(__select__) 클릭은 stopPropagation 으로 이 경로를 안 탐(기존 동작 보존). |
enableRowPinning? | boolean | 행 고정. 사용자가 데이터 행을 상/하단에 고정(row.pin('top'|'bottom')). 고정 행은 sticky 로 스크롤 중 고정되고 center 행에서 제외된다. 비-가상화 전용(가상화+핀=vN). UI 컨트롤은 RowPinButton 컴포넌트를 셀에 배치. |
enableRowReorder? | boolean | 행 드래그 재정렬 활성 (default false). 데이터 행을 draggable 로 만들어 드롭 시 onRowReorder(from, to) 호출(소비자가 moveRow(data, from, to) 로 자기 data 적용). 정렬/필터 활성 시 자동 비활성(표시순≠data순이라 재배열 모호) + 비-가상화 전용(가상화 합성 = vN). HTML5 drag. |
enableSort? | boolean | 정렬 활성 (default false) — getSortedRowModel wiring. |
enableVirtualization? | boolean | 가상화 활성 (default false) — opt-in only. true 시 useGridVirtualizer wiring + tbody padding-row 패턴 적용. false 시 ~ markup 그대로 ( sticky/pinning 보존). |
floatingBottomRows? | TData[] | 그리드 하단에 고정 표시할 소비자 공급 행 데이터. floatingTopRows 와 동일 규약(하단 sticky). |
floatingTopRows? | TData[] | 그리드 상단에 고정 표시할 소비자 공급 행 데이터. XX Grid 의 pinnedTopRowData 와 동형 — 데이터 모델 밖의 추가 행(합계/요약 등). 컬럼 셀 렌더러(columnDef.cell)를 그대로 통과해 본문 행과 동일하게 표시되며, 본문이 스크롤돼도 position: sticky 로 고정된다. 집계 계산 안 함: 소비 자가 total 객체를 직접 제공(자동 집계는 @topgrid/grid-pro-agg/Pro). 상호작용 핀 아님: 기존 행을 사용자가 핀하는 기능(@topgrid/grid-pro-master/Pro)과 별개. 미제공/빈 배열 → 렌더 없음(기존 동작 불변). |
getCellTooltip? | (…) => … | 셀 툴팁. 셀마다 호출해 반환 문자열을 <td title> 로 부여(네이티브 hover 툴팁) — 잘린 내용 표시·부가 설명 등. undefined/null/'' 반환 시 해당 셀 title 미부여. grid-core 1.0 : (cell, row) → (ctx) (clean GridCellContext). |
getRowId? | (…) => … | 안정적 행 식별자. 미지정 시 행 키 = 배열 인덱스. 제공하면 rowSelection·expanded 등 모든 행-키 상태가 인덱스가 아닌 이 id 로 매겨져, 데이터 재정렬/교체를 가로질러 동일 논리 행을 추적(선택이 위치가 아닌 정체성을 따라감). cell 변경 flash 가 "같은 행"을 식별하는 토대. |
getSubRows? | (…) => … | TanStack getSubRows — enableExpanding=true 시 사용. |
icons? | Partial<GridIcons> | 정렬 표시 아이콘 glyph override(부분). 미지정은 기본(▲▼⇅)으로 fallback. |
loading? | boolean | 로딩 상태. true 시 <tbody> 영역만 skeleton row 로 치환 (thead 보존 — ). |
loadingOverlay? | boolean | 로딩 오버레이 (default false). loading(skeleton 치환)과 달리 기존 data 행을 그대로 둔 채 그 위에 반투명 오버레이를 덮는다(기존 데이터를 유지하며 갱신 중임을 표시). aria-busy + pointer-events 차단(하부 상호작용 막음). loading(skeleton)과 독립·additive — 둘 다 기존 동작 불변. |
loadingRowCount? | number | 로딩 시 표시할 skeleton 행 개수. 미지정 시 pagination.pageSize ?? 5 로 fallback ( — BaseGrid L123 hardcoded 5 와 호환). |
localeText? | Partial<GridLocale> | grid chrome 문자열 현지화 — 부분 override. 미지정 키는 한국어 기본으로 fallback(raw key/undefined 안 냄). 영문화 예: { emptyText: 'No data', rowsPerPage: 'Rows per page:', totalCount: (n) => ${n} rows }. defaultGridLocale 를 import 해 위에 spread 도 가능. |
manualFiltering? | boolean | Server 필터: true 시 클라이언트 필터 비활성(getFilteredRowModel skip + manualFiltering). default false. |
manualSorting? | boolean | Server 정렬: true 시 클라이언트 정렬 비활성(getSortedRowModel skip + manualSorting). 정렬 UI/state 는 유지(헤더 클릭 → onSortingChange)되 실제 정렬은 서버 위임. default false. |
maxMultiSortColCount? | number | 동시에 정렬 가능한 최대 컬럼 수. TanStack maxMultiSortColCount 에 직접 전달. 미설정 시 무제한. enableMultiSort=false 시 무시됨. |
onAddRow? | (…) => … | 행 추가 콜백 — ref.current.addRow(seed?) 호출 시 invoke. controlled data 정책: parent 가 props.data 배열에 새 row append 책임. |
onCellClick? | (…) => … | 셀 클릭 핸들러 — column-level 분기 의도 노출. grid-core 1.0 : (cell, row, event) → (ctx, event). ctx 는 clean GridCellContext — ctx.columnId·ctx.value·ctx.rowId·ctx.row(=구 row.original). |
onCellKeyDown? | (…) => … | 셀 키보드 이벤트 핸들러 — <td onKeyDown> 으로 wire. grid-core 1.0 : (cell, row, event) → (ctx, event) (clean GridCellContext). |
onColumnFiltersChange? | OnChangeFn<ColumnFiltersState> | ColumnFilters state 변경 콜백 (server 필터 파라미터 도출용; internal state 도 갱신). |
onColumnOrderChange? | (…) => … | 컬럼 순서 변경 완료 후 호출되는 콜백. 부모가 외부 state 동기화 가능. : F-07-06 흡수. |
onColumnPinningChange? | OnChangeFn<ColumnPinningState> | ColumnPinning state 변경 콜백 (외부 영속화 또는 controlled mirror 용). |
onColumnSizingChange? | OnChangeFn<ColumnSizingState> | ColumnSizing state 변경 콜백 (외부 영속화 또는 controlled mirror 용). |
onDeleteRow? | (…) => … | 행 삭제 콜백 — ref.current.deleteRow(rowId) 호출 시 invoke. rowId = TanStack row.id (default = row index string). |
onRowClick? | (…) => … | 행 클릭 핸들러. |
onRowDoubleClick? | (…) => … | 행 더 블 클릭 핸들러 — onRowClick 와 동일한 시그니처 정책. |
onRowDragStart? | (…) => … | 그리드 간 행 드래그 — 드래그 소스(default 없음=비활성). 제공 시 데이터 행이 draggable 이 되어 dragstart 시 onRowDragStart(rowId) 호출(rowId = TanStack row.id). 소비자가 드래그된 행 id 를 두 그리드 위 state 로 들어올려 보관한다(consumer-owns-payload, dataTransfer 미사용). 대상 그리드의 onRowDrop 과 짝. enableRowReorder 와 별 opt-in(같은 그리드서 혼용 금지=vN). OFF 시 byte-identical. |
onRowDrop? | (…) => … | 그리드 간 행 드래그 — 드롭 타깃(default 없음=비활성). 제공 시 그리드 본문 영역이 drop target 이 되어(드롭 시) onRowDrop 호출. 소비자가 자기 dragged id 를 읽어 순수 transferRow 로 소스→타깃 data 를 적용한다. OFF 시 byte-identical. |
onRowReorder? | (…) => … | 행 재정렬 드롭 콜백 — 표시 인덱스 from→to. 소비자가 moveRow 로 data 적용. |
onSortingChange? | OnChangeFn<SortingState> | Sorting state 변경 콜백 (server 정렬 파라미터 도출용; internal state 도 갱신). |
onStartEditing? | (…) => … | 프로그래밍적 편집 시작 콜백 — ref.current.startEditing(rowId, colId) 호출 시 invoke. 의 callback-delegating 패턴과 동일 정책: Grid 가 editing state 를 소유하지 않으며 application 이 EditableCell isEditing 갱신 책임. |
onUpdateRow? | (…) => … | 행 부분 업데이트 콜백 — ref.current.updateRow(rowId, patch) 호출 시 invoke. |
pagination? | GridPaginationOptions | 페이지네이션 세부 옵션 (enablePagination=true 일 때 효과). |
persistColumnOrder? | boolean | 컬럼 순서 localStorage 영속화 활성. true + columnOrderStorageKey 지정 시 drag/keyboard 완료 후 localStorage 저장. mount 시 저장된 순서 복원 (table.setColumnOrder). |
renderFloatingFilter? | (…) => … | Floating 필터 행 렌더 콜백. 지정 시 leaf 헤더행 아래 always-visible 필터 입력 행을 그린다(prop 존재=활성, cellClassName 관례 mirror). 컬럼당 1회 호출 — 보통 grid-features 의 floating 입력 컴포넌트(column.setValue 로 popover 와 동일 state 공유)를 반환. grid-core 는 구조 행 + 컬럼 윈도(가상화)·핀 sticky·ARIA 정합만 제공(grid-features 무의존=MIT). null 반환=빈 셀. grid-core 1.0 : Column<TData,unknown> → clean GridFilterColumn (id·value·setValue — TanStack 타입 없음). |
rowClassName? | RowClassNameCallback<TData> | 행별 className 생성 callback. 모든 row 렌더 시 호출. 반환 string 은 <tr> 의 기본 className 에 append. virtualization 주의: enableVirtualization=true 시 <tr ref={measureElement}> 가 row height 측정 — rowClassName 이 dynamic height 변경을 유발하면 measureElement 의 reflow 가 반복 발생 (성능 저하). static className 권장. |
rowSelection? | RowSelectionMode | GridRowSelectionOptions<TData> | 행 선택 옵션. 단축 표기('multi') 또는 객체 표기 모두 지원. 'single'/'multi' 시 좌측 첫 컬럼에 체크박스 컬럼(__select__) 자동 prepend. |
showSortClearButton? | boolean | 정렬 초기화 버튼 표시 여부. true 이고 enableMultiSort=true 일 때 툴바에 <SortClearButton> 렌더. 미설정(기본) 시 DOM 구조 변경 없음. |
sortDescFirst? | boolean | 정렬 첫 클릭 방향을 내림차순으로. (TanStack sortDescFirst passthrough — 미지정 시 타입별 기본: 숫자=desc-first, 문자=asc-first.) |
theme? | Partial<GridTheme> | grid chrome 색 테마(부분 override). 제공한 색만 root 에 inline --topgrid-* var 로 적용되고 각 surface 가 var(--topgrid-x, <기본 hex>) 로 읽는다. 미지정 키는 기본색 fallback. 다크 등 프리셋은 import { darkTheme } 후 spread. ⚠ CSS var 는 forced-colors(고대비)서 무력 (HC-safe 선택 표시는 별도 메커니즘). |
virtualizerOptions? | { … } | useVirtualizer 옵션 override. - estimateSize: 행 높이 추정 px (default 36, BaseGrid <td className="px-4 py-3"> 기준). - overscan: viewport 위/아래 버퍼 행 수 (default 10, VirtualGrid.tsx:102 동일). - onChange: virtualizer 변경 콜백(가시 범위 관찰 — SSRM 의 블록 fetch 트리거). useVirtualizer 에 그대로 전달. generic passthrough(SSRM 전용 로직 0). |
virtualScrollHeight? | number | 가상화 시 scroll container 높이 (px, default 400). enableVirtualization=true 일 때만 효과 발휘. |
ContextMenuItem
A single context menu item definition.
| 속성 | 타입 | 설명 |
|---|---|---|
children? | ContextMenuItem<TData>[] | Optional submenu. When provided, this item opens a nested context menu on hover instead of (or in addition to) firing onClick. A ▶ affordance is rendered on the right and aria-haspopup="menu" is set. Submenu items are themselves ContextMenuItems, so nesting is recursive. |
disabled? | boolean | (…) => … | Whether this item is disabled. - boolean: static disabled state. - (row: TData) => boolean: evaluated at render time against the target row. Disabled items are rendered but not clickable (pointer-events: none equivalent). |
icon? | ReactNode | Optional leading icon, rendered to the left of the label. Any ReactNode (e.g. an SVG element or an emoji string). |
label | string | Display label for the menu item. For separator items, the label is ignored — pass an empty string. |
onClick? | (…) => … | Click handler for this menu item. Optional — submenu parent items (those with children) typically omit it, since clicking only toggles the submenu. Leaf items should provide it. |
separator? | boolean | When true, renders a horizontal separator line. All other properties except label are ignored for separator items. |
shortcut? | string | Optional keyboard shortcut hint displayed on the right side of the label. When the wrapper div has focus and this combination is pressed while the menu is open, the item's onClick is triggered (if not disabled). Grammar: "[Modifier+]Key" where Modifier ∈ {Ctrl, Alt, Shift} (combinable, e.g. "Ctrl+Shift+E"). The key is matched case-insensitively against event.key; modifier flags (ctrlKey/altKey/shiftKey) must match exactly. Invalid grammar (e.g. "Ctrl+") is ignored (warns in dev). |
CreateAsyncDataMapOptions
CreateAsyncDataMapOptions<TItem>: createAsyncDataMap 팩토리 옵션.
: no any
: staleTime? optional — 미제공 시 내부 DEFAULT_STALE_TIME(300_000 ms) 사용.
내부 소비: options.staleTime !== undefined ? options.staleTime : DEFAULT_STALE_TIME
| 속성 | 타입 | 설명 |
|---|---|---|
displayPath | PathOrAccessor<TItem, string> | 표시 레이블 경로 또는 accessor |
loader | (…) => … | 옵션 항목 비동기 로더 — Promise<TItem[]> 반환 |
staleTime? | number | 캐시 유효 기간 (ms). 미제공 시 5분(300_000 ms). : optional — staleTime !== undefined 체크 후 내부 사용 |
valuePath | PathOrAccessor<TItem, unknown> | 코드 값 경로 또는 accessor |
CreateDataMapOptions
| 속성 | 타입 | 설명 |
|---|---|---|
displayPath | PathOrAccessor<TItem, string> | |
items | TItem[] | |
valuePath | PathOrAccessor<TItem, unknown> |
CSVExportOptions
CSV export 옵션
| 속성 | 타입 | 설명 |
|---|---|---|
delimiter? | "," | "\t" | CSV 구분자 — ',' (기본, RFC 4180) 또는 '\t' (TSV 옵션) |
emptyBehavior? | EmptyBehavior | 데이터 행 0건 시 동작 - 'skip': 파일 생성 안 함 (기본) - 'empty': 헤더만 있는 빈 파일 생성 |
fileName? | string | 다운로드 파일명 (확장자 포함 권장, 없으면.csv 자동 추가) |
scope? | ExportScope | export 대상 행 범위 - 'all': getCoreRowModel (필터 무시, 전체) - 'filtered': getFilteredRowModel (현재 정렬/필터 반영) ← default - 'selected': table.getSelectedRowModel (선택 행만) |
CustomEditorContext
Lifecycle context handed to a consumer-supplied editor via EditableCellProps.renderEditor.
The slot's value proposition is the edit lifecycle, not the ability to render an
arbitrary component (a consumer can already render anything via a raw TanStack cell
renderer). What a raw cell does NOT get for free — and what this context provides —
is: entry autofocus (focusRef), Enter→commit / Esc→cancel / Tab→commit (wired by
EditableCell's keydown handler on the slot wrapper, so the consumer writes none of it),
and a controlled draft (value / onChange).
value is the draft string — EditableCell preserves the onCommit(string) contract,
so the consumer serializes any richer value. (Arbitrary non-string value-type parity is vN.)
| 속성 | 타입 | 설명 |
|---|---|---|
cancel | (…) => … | Cancel editing (= onCancel). |
commit | (…) => … | Commit the current draft (= onCommit(draft)). |
focusRef | (…) => … | Callback ref — attach to the focusable editor element. EditableCell focuses it automatically when the cell enters edit mode (entry autofocus). A bare element does not self-focus, so this is the autofocus seam. |
onChange | (…) => … | Update the draft (= internal setDraft). |
value | string | Current draft value (string) — owned by EditableCell. |
DataMap
DataMap<TItem>: 코드 값 ↔ 레이블 양방향 조회 인터페이스. createDataMap 팩토리 함수가 반환하는 단일 타입.
| 속성 | 타입 | 설명 |
|---|---|---|
getDisplay | unknown | |
getItems | unknown | |
getValue | unknown |
DataMapEditorProps
DataMapEditorProps<TItem>: 편집 셀 드롭다운 에디터 컴포넌트 파라미터 타입. : 필터-타이핑 드롭다운 (DataMapEditor).
: no any — : exactOptionalPropertyTypes=true 호환
| 속성 | 타입 | 설명 |
|---|---|---|
dataMap | DataMap<TItem> | 선택 목록 제공자 — getItems로 전체 항목 반환 |
getLabelFromItem? | (…) => … | Optional: TItem → 표시 레이블 변환 함수. DataMap 내부 Map이 valuePath(item) 코드 키로 저장되므로 getDisplay(item) 직접 호출 불가 (F-06 spec code defect 수정). 미제공 시 String(item) fallback (spec Section 11.3 explicit alternative). : optional — 미제공 시 undefined (spread-skip 불필요, 내부 소비용) |
onCancel | (…) => … | 편집 취소 콜백 |
onCommit | (…) => … | 선택 확정 콜백 — newValue는 DataMap의 코드 값 |
value | unknown | 현재 셀의 코드 값 (DataMap.getValue 기준) |
DateCellProps
Props for DateCell.
Preserves L0 DateCell.tsx (L1-5) prop signature in full — no drift.
| 속성 | 타입 | 설명 |
|---|---|---|
className? | string | Additional Tailwind className. |
format? | "date" | "datetime" | "time" | Display format (default 'date'). L0 DateCell.tsx:3 preserved. |
locale? | string | Locale tag (default 'ko-KR'). L0 DateCell.tsx:4. |
value | undefined | null | string | number | Date | Date value. null/undefined/'' → dash placeholder. Invalid Date → dash. |
DateFilterProps
DateFilter 컴포넌트 Props.
| 속성 | 타입 | 설명 |
|---|---|---|
column | Column<TData, unknown> | TanStack Column 인스턴스. Column<TData, unknown>. |
popoverAlign? | "left" | "right" | 팝오버 정렬 — 기본 'left'. : optional prop — FilterPopover align으로 spread-skip 전달. |
DateFilterValue
| 속성 | 타입 | 설명 |
|---|---|---|
from? | Date | |
to? | Date |
DistributeStarWidthsOptions
Options for distributeStarWidths.
| 속성 | 타입 | 설명 |
|---|---|---|
columns | StarColumnInput[] | |
totalWidth | number | Total available width (px) to distribute across all columns. |
DownloadExcelOptions
DataTable buttonInfo 호환 alias 옵션 (legacy)
| 속성 | 타입 | 설명 |
|---|---|---|
columnFormats? | Record<string, string> | 컬럼별 네이티브 Excel number-format 코드 key = 컬럼 id, value = Excel format 코드(예 '#,##0.00', 'yyyy-mm-dd', '0.0%'). 해당 컬럼 데이터 셀에 .z 로 적용되어 셀이 Excel 안에서 numeric·정렬가능하게 유지된다. |
columnWidths? | Record<string, number> | 컬럼별 폭 — key = 컬럼 id, value = xlsx wch 단위 폭. 지정된 컬럼만 !cols 에 반영(미지정은 기본 폭). |
emptyBehavior? | EmptyBehavior | 데이터 행 0건 시 동작 - 'skip': 파일 생성 안 함 (기본) - 'empty': 헤더만 있는 빈 파일 생성 |
fileName? | string | 다운로드 파일명 (확장자 포함 권장, 없으면.xlsx 자동 추가) |
scope? | ExportScope | |
sheetName? | string | Excel 시트명 |
DragFillHandleProps
DragFillHandle 컴포넌트 Props.
(exactOptionalPropertyTypes): optional 필드는 '?: T' 선언. 전달 시 spread-skip 패턴 사용 (spec Section 4.4).
| 속성 | 타입 | 설명 |
|---|---|---|
colCount | number | 그리드 전체 열 수 (경계 clamp). |
containerRef | RefObject<HTMLElement> | 핸들이 렌더링될 컨테이너 ref (좌표 계산). |
getCellRect | (…) => … | 셀 크기 getter (px) — 드래그 위치 → cell coord 변환용. |
getCellValue | (…) => … | 소스 셀 값 getter — 드래그 시 fill 계산용. |
onFillComplete? | (…) => … | 채우기 완료 콜백 ( 분리). |
onFillTargetChange? | (…) => … | 드래그 중 fill target 범위 변경 알림 (시각적 점선 outline용). |
range | null | CellRange | 현재 선택된 소스 범위 ( CellRange). null이면 핸들 미표시. |
rowCount | number | 그리드 전체 행 수 (경계 clamp). |
DragThProps
헤더 <th> DOM 요소에 전달할 drag props.
HTML5 DragEvent 핸들러 (: 외부 라이브러리 미사용).
Grid.tsx 에서 React.DragEvent<HTMLTableCellElement> 를 받아
.nativeEvent 로 DOM DragEvent 추출 후 이 핸들러에 전달.
| 속성 | 타입 | 설명 |
|---|---|---|
draggable | boolean | pinned=true → false, enabled=true → true (/). |
onDragEnd | (…) => … | |
onDragLeave | (…) => … | |
onDragOver | (…) => … | |
onDragStart | (…) => … | |
onDrop | (…) => … |
EditableCellProps
Props for EditableCell.
| 속성 | 타입 | 설명 |
|---|---|---|
align? | "left" | "center" | "right" | Text alignment inside the edit input. Default 'left'. Rendered as a Tailwind class (text-center / text-right) — compliant. |
cellClassName? | string | Additional Tailwind className — injection point for Grid-level callbacks. |
columnId? | string | Column id (optional — logging / debugging only, no effect on behaviour). |
editType | EditType | Edit input type (5 variants — ). |
initialDraft? | string | Initial draft value applied on mount when the cell enters editing state. Use case: keyboard-triggered editing — the first keystroke is captured by the focusable view-mode <div> before <EditableCell> mounts, so the character would be lost. Passing it as initialDraft restores the xxxx prepareCellForEdit + hostElement.keydown "type directly to enter" UX. Behaviour: - If undefined (default): the input mounts with the current cell value (existing behaviour, no change). - If a string: the draft state is initialised to initialDraft and the cursor is positioned at the end of the string after focus. Note: this prop is read only on the first render (mount). Subsequent changes to initialDraft while the component is mounted have no effect — the component controls its own draft state after mount. |
isEditing | boolean | Edit-mode flag — owned by the parent container (e.g. EditableGrid). |
maxLength? | number | Maximum character length for text/number/textarea inputs. Forwarded directly as the HTML maxLength attribute. Not applicable to editType === 'select'. |
onCancel | (…) => … | Invoked on Esc — edit cancelled. |
onCommit | (…) => … | Invoked on Enter (non-textarea) / Blur / Tab. New value is emitted as string. |
onStartEdit | (…) => … | Invoked when the view-mode cell is clicked to request edit mode. |
renderEditor? | (…) => … | Custom editor slot (render prop). When provided and isEditing is true, the built-in editType editors (input/select/textarea) are bypassed and the consumer's editor is rendered inside a lifecycle wrapper instead. The wrapper supplies the edit lifecycle the consumer would otherwise have to wire by hand on a raw cell renderer: - Entry autofocus — ctx.focusRef is focused when the cell enters edit mode. - Enter → commit, Esc → cancel, Tab → commit — via the wrapper's onKeyDown (keydown bubbles up from the consumer's editor; stopPropagationOnKeyDown is honored). - Controlled draft — ctx.value / ctx.onChange (string; see CustomEditorContext). editType is ignored while renderEditor is active (the consumer owns the markup). |
rowIndex? | number | Row index (optional — logging / debugging only, no effect on behaviour). |
selectOptions? | readonly { … }[] | Options when editType === 'select'. Empty/undefined → placeholder. |
stopPropagationOnKeyDown? | boolean | When true, calls e.stopPropagation at the end of every keydown event on the editor element, preventing the grid host's keyboard handler from intercepting the key (xxxx prepareCellForEdit pattern). Default false. |
value | unknown | Current value — rendered in view mode. null/undefined → empty text. |
ExcelColumn
행 배열 기반 Excel export 의 컬럼 정의
| 속성 | 타입 | 설명 |
|---|---|---|
format? | "number" | "date" | "datetime" | "currency" | 셀 값 포맷 |
header | string | 헤더 셀에 표시할 텍스트 |
key | string | 행 객체의 키 |
width? | number | 컬럼 너비 (wch 단위). 기본값 15 |
ExcelExportOptions
Excel export 옵션
(emptyBehavior) 와 동일 타입 공유 — types.ts single source-of-truth
| 속성 | 타입 | 설명 |
|---|---|---|
columnFormats? | Record<string, string> | 컬럼별 네이티브 Excel number-format 코드 key = 컬럼 id, value = Excel format 코드(예 '#,##0.00', 'yyyy-mm-dd', '0.0%'). 해당 컬럼 데이터 셀에 .z 로 적용되어 셀이 Excel 안에서 numeric·정렬가능하게 유지된다. |
columnWidths? | Record<string, number> | 컬럼별 폭 — key = 컬럼 id, value = xlsx wch 단위 폭. 지정된 컬럼만 !cols 에 반영(미지정은 기본 폭). |
emptyBehavior? | EmptyBehavior | 데이터 행 0건 시 동작 - 'skip': 파일 생성 안 함 (기본) - 'empty': 헤더만 있는 빈 파일 생성 |
fileName? | string | 다운로드 파일명 (확장자 포함 권장, 없으면.xlsx 자동 추가) |
scope? | ExportScope | export 대상 행 범위 - 'all': getCoreRowModel (필터 무시, 전체) - 'filtered': getFilteredRowModel (현재 정렬/필터 반영) ← default - 'selected': table.getSelectedRowModel (선택 행만) |
sheetName? | string | Excel 시트명 |
ExcelSheet
다중 시트 Excel export 의 시트 1개 정의
| 속성 | 타입 | 설명 |
|---|---|---|
columnFormats? | Record<string, string> | 컬럼별 네이티브 number-format (ExcelExportOptions.columnFormats 와 동일) |
columnWidths? | Record<string, number> | 컬럼별 폭 (ExcelExportOptions.columnWidths 와 동일) |
name | string | 시트명 (Excel 탭에 표시) |
scope? | ExportScope | export 대상 행 범위 |
table | Table<any> | TanStack v8 Table 인스턴스 — 시트 내용 소스. 다중 시트는 본질적으로 서로 다른 행 타입의 테이블을 한 배열에 섞으므로(Table<Person> + Table<Order>), 단일 TData 로 묶을 수 없다. Table<TData> 는 accessorFn 의 함수 인자 반공변성 때문에 Table<unknown> 에 대입 불가(Table<Person> ↛ Table<unknown>). 이질 배열을 받으려면 Table<any> 가 유일한 실용 해법(TS 는 존재 타입 미지원). export 코드는 getValue 결과를 unknown 으로만 다뤄 타입 안전을 유지한다. |
ExportRowsCsvOptions
exportRowsToCsv 옵션 ( 행 배열 export 의 CSV 평행)
scope 는 행 배열 입력에서 무의미하므로 제외.
| 속성 | 타입 | 설명 |
|---|---|---|
delimiter? | "," | "\t" | CSV 구분자 — ',' (기본, RFC 4180) 또는 '\t' (TSV) |
emptyBehavior? | EmptyBehavior | 데이터 행 0건 시 동작 |
fileName? | string | 다운로드 파일명 (확장자 없으면.csv 자동 추가) |
ExportRowsOptions
exportRowsToExcel 옵션
scope 는 행 배열 입력에서 무의미하므로 의도적으로 제외.
| 속성 | 타입 | 설명 |
|---|---|---|
emptyBehavior? | EmptyBehavior | 데이터 행 0건 시 동작 - 'skip': 파일 생성 안 함 (기본) - 'empty': 헤더만 있는 빈 파일 생성 |
fileName? | string | 다운로드 파일명 (확장자 포함 권장, 없으면.xlsx 자동 추가) |
sheetName? | string | Excel 시트명 |
ExportRowsPdfOptions
exportRowsToPdf 옵션 ( 행 배열 export 의 PDF 평행)
scope 는 행 배열 입력에서 무의미하므로 제외.
| 속성 | 타입 | 설명 |
|---|---|---|
emptyBehavior? | EmptyBehavior | 데이터 행 0건 시 동작 |
fileName? | string | 다운로드 파일명 (확장자 없으면.pdf 자동 추가) |
orientation? | "p" | "l" | 페이지 방향 — 'p' portrait (기본) / 'l' landscape |
title? | string | PDF 최상단 제목 행 (없으면 생략) |
FilterColumnLike
Minimal structural view of a TanStack Column (filter side).
| 속성 | 타입 | 설명 |
|---|---|---|
getFilterValue | (…) => … | |
id | string | |
setFilterValue | (…) => … |
FilterCondition
단일 cross-column 조건. value 는 blank/notBlank 에 불요(없으면 inert).
| 속성 | 타입 | 설명 |
|---|---|---|
field | string | |
kind | "condition" | |
operator | FilterOperator | |
type | FilterValueType | |
value? | unknown |
FilterGroup
AND/OR 그룹(중첩 가능).
| 속성 | 타입 | 설명 |
|---|---|---|
children | AdvancedFilterExpr[] | |
kind | "group" | |
logic | "and" | "or" |
FilterIndicatorProps
FilterIndicator 컴포넌트 Props.
column.getIsFiltered 결과값을 그대로 전달.
| 속성 | 타입 | 설명 |
|---|---|---|
isFiltered | boolean | column.getIsFiltered 결과값 |
FilterPopoverProps
FilterPopover 컴포넌트 Props.
네이티브 div position:absolute 기반 팝오버 (: @radix-ui 없음). 외부클릭(mousedown) / Escape 해제 / 포커스 관리 포함.
| 속성 | 타입 | 설명 |
|---|---|---|
align? | "left" | "right" | 정렬 방향 — 기본 'left'. : optional prop — 하위 전달 시 spread-skip 패턴 사용 (Section 4.6). |
children | ReactNode | 팝오버 내용 |
trigger | ReactNode | 팝오버 트리거 요소 렌더 함수 |
FilterResetButtonProps
FilterResetButton 컴포넌트 Props.
| 속성 | 타입 | 설명 |
|---|---|---|
children? | ReactNode | 버튼 레이블 — 기본 'Reset Filters'. : optional prop. |
table | Table<TData> | TanStack Table 인스턴스. |
FilterSelection
한 선택 항목(차트-무관 generic): 필드 + 타입(컬럼 메타) + 선택 값.
| 속성 | 타입 | 설명 |
|---|---|---|
field | string | |
type | FilterValueType | |
value | unknown |
FiltersToolPanelColumn
One column's filter row in FiltersToolPanel.
| 속성 | 타입 | 설명 |
|---|---|---|
id | string | Column id. |
label | string | Human-readable label. |
value | string | Current filter value (empty string = inactive). |
FiltersToolPanelProps
Props for FiltersToolPanel.
| 속성 | 타입 | 설명 |
|---|---|---|
className? | string | Additional className appended to the root container. |
columns | FiltersToolPanelColumn[] | Columns with their current filter values, in display order. |
emptyText? | string | Text shown when there are no columns. |
onClearAll? | (…) => … | Optional — when provided, a "Clear all" button clears every filter. |
onFilterChange | (…) => … | Fired when a column's filter input changes. |
FindOptions
검색 옵션.
| 속성 | 타입 | 설명 |
|---|---|---|
caseSensitive? | boolean | 대소문자 구분. |
matchMode? | "substring" | "whole" | 'substring'=부분일치(기본) · 'whole'=셀 전체 일치. |
FooterRowProps
Props for the internal FooterRow component.
Renders a synthetic footer row after each group's leaf rows.
| 속성 | 타입 | 설명 |
|---|---|---|
cells | Cell<TData, unknown>[] | Visible cells list (pass row.getVisibleCells). |
className? | string | Additional Tailwind className for the footer row tr. |
renderFooterRow? | (…) => … | Custom footer cell renderer. |
row | Row<TData> | Group row Row object (aggregated cells accessed via cells prop). |
FormatDateTimeOptions
| 속성 | 타입 | 설명 |
|---|---|---|
format? | "date" | "datetime" | "time" | Display format (default 'date'). |
locale? | string | Locale tag (default 'ko-KR'). |
FormatNumberOptions
Pure formatting helpers for cell renderers.
Extracted from L0 patterns:
- NumberCell.tsx L17-20 (inline value.toLocaleString)
- DateCell.tsx L13-21 (inline date.toLocaleDateString + FORMAT_OPTIONS)
No external store/state dependency. Typed (no any).
| 속성 | 타입 | 설명 |
|---|---|---|
decimals? | number | Decimal places (default 0). Clamped to [0, 20]. |
locale? | string | Locale tag (default 'ko-KR'). |
GetRowsRequest
A block request: half-open row range [startRow, endRow) + current sort/filter.
For lazy grouping the request also carries the group path being expanded. groupKeys/
rowGroupCols are optional — absent/empty = flat mode (/ behavior unchanged), so
existing flat datasources keep working. The level is groupKeys.length; the returned block
holds group rows when level < rowGroupCols.length, otherwise leaf rows (AG convention).
| 속성 | 타입 | 설명 |
|---|---|---|
endRow | number | One past the last row index (exclusive). |
filterModel | FilterModel | Active filter model (server applies). |
groupKeys? | string[] | Path of group key values to the node whose children are requested ([]/absent = top level). |
pivotCols? | string[] | Pivot dimension columns (outermost first) — the values become column groups. |
pivotMode? | boolean | Server-side pivot — optional, absent = no pivot (flat/group behavior unchanged). When pivotMode is true the server pivots valueCols across pivotCols and returns rows keyed by the generated pivot-result fields, plus the field list in GetRowsResult.pivotResultFields. |
rowGroupCols? | string[] | Columns being grouped, outermost first (absent/empty = no grouping). |
sortModel | SortModelItem[] | Active sort directives (server applies). |
startRow | number | First row index (inclusive) — within the addressed group's children. |
valueCols? | string[] | Value/measure columns aggregated within each pivot column combination. |
GetRowsResult
A block response. lastRow carries the total/last-row signal the virtualizer needs to
size the scroll area: set it to the absolute total row count once the server knows the end
has been reached (e.g. a partial final block), otherwise leave undefined (more rows exist).
| 속성 | 타입 | 설명 |
|---|---|---|
lastRow? | number | Absolute total row count when known (end reached), else undefined. |
pivotResultFields? | string[] | Server-side pivot — the generated pivot-result field keys (e.g. "East|sales"), in column order. The grid feeds these to buildServerPivotColumns to derive the dynamic column tree. Absent for non-pivot responses. (Typically identical across blocks of one query.) |
rows | TData[] | The rows for the requested range (length ≤ endRow − startRow). |
GlobalSearchInputProps
GlobalSearchInput 컴포넌트 Props.
| 속성 | 타입 | 설명 |
|---|---|---|
debounceMs? | number | 디바운스 ms — 기본 300. : optional prop. |
placeholder? | string | 입력 placeholder — 기본 'Search all columns…'. : optional prop. |
table | Table<TData> | TanStack Table 인스턴스. |
GridCellContext
Clean cell context — what a consumer actually needs in onCellClick/onCellKeyDown/getCellTooltip.
| 속성 | 타입 | 설명 |
|---|---|---|
columnId | string | Column id. |
row | TData | The original row object. |
rowId | string | Stable row id (from getRowId, or the array index fallback). |
value | unknown | The cell's value. |
GridFilterColumn
Clean filter column — normalises TanStack getFilterValue/setFilterValue to value/setValue.
| 속성 | 타입 | 설명 |
|---|---|---|
id | string | |
setValue | (…) => … | |
value | unknown |
GridHandle
<Grid> ref 노출 imperative handle.
| 속성 | 타입 | 설명 |
|---|---|---|
addRow | (…) => … | 행 추가 — props.onAddRow(seed?) 콜백 위임. 콜백 미제공 시 dev mode console.warn 1회 + no-op. |
clearSelection | (…) => … | 모든 선택 해제 — table.setRowSelection({}) 위임. AG api.deselectAll 등가. |
deleteRow | (…) => … | 행 삭제 — props.onDeleteRow(rowId) 콜백 위임. rowId = TanStack row.id (default = row index string). |
getSelection | (…) => … | 현재 선택된 행 데이터 배열 반환 — table.getSelectedRowModel.rows.map(r => r.original) 위임. 빈 배열 = 선택 없음. |
refresh | (…) => … | 내부 상태 재산정 — table.resetRowSelection 위임. |
scrollTo | (…) => … | 인덱스 행으로 스크롤. - enableVirtualization=true 시 virtualizer.scrollToIndex(index, options) 위임 (@tanstack/react-virtual API). - enableVirtualization=false 시 native DOM tbody tr[data-index="N"].scrollIntoView({...}) fallback. - 음수 / data.length 초과 index → [0, data.length-1] 로 clamp + dev console.warn. |
updateRow | (…) => … | 행 부분 업데이트 — props.onUpdateRow(rowId, patch) 콜백 위임. |
collapseAll? | unknown | |
expandAll? | unknown | |
startEditing? | unknown |
GridPaginationOptions
페이지네이션 옵션.
enablePagination=true 일 때만 효과 발휘. manual=true 시 server-side 페이지네이션 (외부 totalCount + pageIndex 제어 의무).
| 속성 | 타입 | 설명 |
|---|---|---|
autoPageSize? | boolean | 뷰포트(그리드 본문) 높이에 맞춰 pageSize 를 자동 산정. 기본 false. 활성 시 pageSize/pageSizeOptions 셀렉트는 무시·숨김(상충 회피). |
enableGoToPage? | boolean | 특정 페이지로 점프하는 numeric 입력 UI 표시. 기본 false. 슬라이딩 버튼만으로 닿지 않는 먼 페이지로 직접 이동. |
enableKeyboardNav? | boolean | Alt+← / Alt+→ 키보드 페이지 이동 활성화. GridPagination 컴포넌트의 enableKeyboardNav prop에 연결. 기본 false. |
manual? | boolean | Server-side 페이지네이션 모드. true 시 TanStack manualPagination: true + 외부 totalCount 필수. |
mode? | PaginationMode | Pagination 동작 모드 (convenience shorthand). - 'client' → manual: false + enablePagination 자동 활성 - 'server' → manual: true + enablePagination 자동 활성 - 'none' → pagination 비활성화 (enablePagination 무시) mode와 manual 동시 지정 시 mode가 우선. |
onPaginationChange? | OnChangeFn<PaginationState> | Controlled pageIndex 변경 핸들러. |
pageCount? | number | Server 모드(mode: 'server' 또는 manual: true)에서 전체 페이지 수. totalCount와 pageSize로부터 자동 계산되나, 직접 지정 시 override. |
pageIndex? | number | Controlled pageIndex (controlled 모드). |
pageNumberFormat? | (…) => … | 페이지 번호 버튼 라벨 포매터 (예: 천단위 구분 n => n.toLocaleString). 미지정 시 raw 정수. aria-label(접근성)은 원본 정수를 유지한다. 전체 건수 포맷은 localeText.totalCount 참조. |
pageSize? | number | 기본 pageSize (default 20). |
pageSizeOptions? | number[] | 페이지당 행 수 셀렉트 옵션 (default [10, 20, 50, 100]). |
showTotalCount? | boolean | 전체 건수 표시 여부. 기본 true. false 설정 시 "전체 N건" UI를 숨긴다. |
totalCount? | number | Server 모드에서 전체 row count (manual=true 일 때 필수). |
GridPaginationProps
GridPagination<TData> props.
| 속성 | 타입 | 설명 |
|---|---|---|
enableGoToPage? | boolean | 특정 페이지로 점프하는 numeric 입력 UI 표시. 기본 false. |
enableKeyboardNav? | boolean | Alt+← / Alt+→ 키보드 페이지 이동 활성화. container ref scope 에 이벤트 리스너 등록. 기본 false. |
mode? | PaginationMode | Pagination 동작 모드 ('client' | 'server' | 'none'). |
navLabels? | { … } | 네비게이션 버튼 aria-label (i18n — ). 미지정 시 한국어 기본. |
onPaginationChange? | OnChangeFn<PaginationState> | 페이지 변경 콜백. |
pageCount? | number | Server 모드에서 전체 페이지 수. |
pageNumberFormat? | (…) => … | 페이지 번호 라벨 포매터. PageNumbers 로 전달. |
pageSizeOptions? | number[] | 페이지당 행 수 옵션 목록 (기본 [10, 20, 50, 100]). |
rowsPerPageLabel? | string | "페이지당 행 수:" 라벨 (i18n — ). |
showTotalCount? | boolean | 전체 건수 표시 여부. 기본 true. false 설정 시 "전체 N건" UI를 숨긴다. |
table | Table<TData> | TanStack Table 인스턴스 — pagination state + API 접근. |
totalCount? | number | Server 모드에서 전체 row 수. |
totalCountFormat? | (…) => … | 전체 건수 텍스트 포매터 (i18n — ). |
GridProps
<Grid> 컴포넌트 props.
| 속성 | 타입 | 설명 |
|---|---|---|
alwaysMultiSort? | boolean | 평범 클릭으로도 다중 정렬 누적. enableMultiSort 와 함께 사용. 기본은 Shift+클릭이 다중 정렬 키지만, true 면 Shift 없이 컬럼을 순차 클릭해 누적. (TanStack isMultiSortEvent: => true passthrough.) |
autoSelectFirstRow? | boolean | 데이터 로드 후 첫 행 자동 선택 (default false). |
cellClassName? | CellClassNameCallback<TData> | 셀별 className 생성 callback. 모든 cell 렌더 시 호출. 반환 string 은 <td> 의 기본 className 에 append. canonical: 본 callback type 은 grid-core 가 ownership. grid-renderers 는 type-only re-export. 사용 예 (publish/organizeSchedule 등가): tsx cellClassName={(cell) => { if (!cell.column.id.startsWith('d')) return ''; const isSelected = cell.row.getIsSelected; const hasValue = cell.getValue != null && cell.getValue !== ''; return [ isSelected && 'bg-indigo-100', !isSelected && hasValue && 'bg-yellow-50', ].filter(Boolean).join(' '); }} 성능 주의: 매 cell 렌더마다 호출 — 대용량 데이터 시 callback 내부 계산 비용 주의 (useMemo 또는 stable callback 권장). |
className? | string | 외곽 wrapper className (Tailwind). |
columnOrderStorageKey? | string | persistColumnOrder=true 시 사용할 localStorage 키. 빈 문자열('') 전달 시 localStorage 접근 없음. 미지정 시 persistColumnOrder=true 라도 저장 skip. |
columnPersistence? | ColumnPersistenceOptions | 컬럼 가시성 + 순서 localStorage 영속화 옵션. - 제공 시 <ColumnVisibilityMenu> UI 자동 렌더 + useColumnPersistence 활성. - 미제공(undefined) 시 영속화 비활성 + 메뉴 미표시 ( backward compat). - storageKey: '' 시 localStorage 접근 없음 (NFR-006). |
columnResizeMode? | GridColumnResizeMode | 컬럼 리사이즈 모드 (default 'onChange'). enableColumnResizing=true 일 때만 효과 발휘. |
columns | ColumnDef<TData, unknown>[] | 컬럼 정의 (TanStack ColumnDef). |
data | TData[] | 행 데이터 배열. |
debug? | boolean | TanStack debugTable 옵션 노출 (default false). |
defaultColumnPinning? | ColumnPinningState | 컬럼 핀 uncontrolled 초기값 ({ left: string[]; right: string[] }). ColumnPinGrid pinLeft / pinRight alias 매핑 진입점. |
defaultColumnSizing? | ColumnSizingState | 컬럼 width uncontrolled 초기값 (column id → px). mount 시 internal columnSizing state 의 초기값으로 사용 (uncontrolled 패턴). |
defaultExpanded? | false | ExpandedState | enableExpanding=true 시 expanded state 초기값 (uncontrolled). - true = 전체 펼침 - Record<string, boolean> = 특정 row id만 펼침 - 미지정 = {} (전체 접힘) — TreeGrid alias expandAll={true} 호환 진입점. AS-IS TreeGrid.tsx:35 useState<ExpandedState>(initialExpandAll ? true : {}) initial seed 패턴 보존. |
emptyState? | ReactNode | 빈 결과 상태 ReactNode slot. 제공 시 emptyText 보다 우선 렌더 ( — slot → text → defaultText 순). |
emptyText? | string | 빈 결과 안내 텍스트 (default '데이터가 없습니다.'). |
enableCellChangeFlash? | boolean | 셀 값 변경 시 잠깐 강조(change-flash). data 가 바뀌면 값이 실제로 변한 셀(행 정체성으로 diff — 재정렬은 미강조)에 ~0.9s 배경 하이라이트. 안정적 강조를 위해 getRowId 를 함께 지정 권장(미지정 시 인덱스 기준 diff → 재정렬도 강조됨). |
enableColumnPinning? | boolean | 컬럼 핀 state 활성 (default false). 본 은 state.columnPinning state 만 활성화. sticky CSS 외관은 범위. |
enableColumnReorder? | boolean | 컬럼 드래그 재정렬 활성 (default false). HTML5 Drag and Drop API 기반 — 외부 dnd 라이브러리 미사용. :. |
enableColumnResizing? | boolean | 컬럼 리사이즈 state 활성 (default false). resize handle UI 는 범위. |
enableColumnVirtualization? | boolean | 컬럼(가로) 가상화 활성. true 시 화면 밖 center 컬럼은 렌더하지 않고 좌/우 padding 셀로 가로 스크롤 폭만 유지한다 — 100+ 컬럼의 렌더 비용 절감. 핀 컬럼은 가상화 대상이 아니며 가로 스크롤과 무관하게 항상 렌더된다. 미지정/false → 전 컬럼 렌더(기존 동작과 byte-identical). v1 제약: flat(단일 행) 헤더 전용 — 그룹/다단 헤더(getHeaderGroups.length > 1)에서는 colSpan 회계 복잡도로 자동 비활성(전 컬럼 렌더). 그룹 헤더 가상화는 v2. 레이아웃: true 시 <table> 은 table-layout: fixed + 전체 컬럼 폭(ΣgetSize)으로 고정되어 컬럼이 명시 너비를 정확히 유지한다(pad px 와 정렬 일치). 부수효과로 셀 내용이 컬럼 너비를 넘으면 잘린다(clip) — 가상화 그리드의 정상 거동. 가로 스크롤 컨테이너는 기존 overflow-x-auto(또는 행 가상화의 overflow:auto)가 제공하므로 Tailwind 미적용 소비자는 컨테이너에 overflow-x 를 직접 지정해야 한다. ⚠️ 실험적: 본문+헤더 가상화 배선 + chromium 정렬 매트릭스 완료(Commit C). off=기존과 byte-identical, SSR/미측정 시 전 컬럼 렌더(안전 fallback). |
enableExpanding? | boolean | 행 펼침(expanding) state 활성 (default false) — TreeGrid 흡수. getSubRows 와 함께 사용. |
enableFilter? | boolean | 컬럼 필터 활성 (default false) — getFilteredRowModel wiring. |
enableMultiSort? | boolean | 다중 정렬 활성 (default false) — TanStack enableMultiSort 위임. |
enablePagination? | boolean | 페이지네이션 활성 (default false) — getPaginationRowModel wiring. |
enableRowClickSelection? | boolean | 행 본문 클릭으로 선택. rowSelection 이 'single'/'multi' 일 때만 동작. - plain 클릭 → 그 행만 선택(나머지 해제). ctrl/cmd+클릭 → 토글(다중 누적). (shift 범위 = ) - 기존 onRowClick 콜백과 독립 공존 — 선택을 하면서 onRowClick 도 그대로 호출. - 체크박스 셀(__select__) 클릭은 stopPropagation 으로 이 경로를 안 탐(기존 동작 보존). |
enableRowPinning? | boolean | 행 고정. 사용자가 데이터 행을 상/하단에 고정(row.pin('top'|'bottom')). 고정 행은 sticky 로 스크롤 중 고정되고 center 행에서 제외된다. 비-가상화 전용(가상화+핀=vN). UI 컨트롤은 RowPinButton 컴포넌트를 셀에 배치. |
enableRowReorder? | boolean | 행 드래그 재정렬 활성 (default false). 데이터 행을 draggable 로 만들어 드롭 시 onRowReorder(from, to) 호출(소비자가 moveRow(data, from, to) 로 자기 data 적용). 정렬/필터 활성 시 자동 비활성(표시순≠data순이라 재배열 모호) + 비-가상화 전용(가상화 합성 = vN). HTML5 drag. |
enableSort? | boolean | 정렬 활성 (default false) — getSortedRowModel wiring. |
enableVirtualization? | boolean | 가상화 활성 (default false) — opt-in only. true 시 useGridVirtualizer wiring + tbody padding-row 패턴 적용. false 시 ~ markup 그대로 ( sticky/pinning 보존). |
floatingBottomRows? | TData[] | 그리드 하단에 고정 표시할 소비자 공급 행 데이터. floatingTopRows 와 동일 규약(하단 sticky). |
floatingTopRows? | TData[] | 그리드 상단에 고정 표시할 소비자 공급 행 데이터. XX Grid 의 pinnedTopRowData 와 동형 — 데이터 모델 밖의 추가 행(합계/요약 등). 컬럼 셀 렌더러(columnDef.cell)를 그대로 통과해 본문 행과 동일하게 표시되며, 본문이 스크롤돼도 position: sticky 로 고정된다. 집계 계산 안 함: 소비자가 total 객체를 직접 제공(자동 집계는 @topgrid/grid-pro-agg/Pro). 상호작용 핀 아님: 기존 행을 사용자가 핀하는 기능(@topgrid/grid-pro-master/Pro)과 별개. 미제공/빈 배열 → 렌더 없음(기존 동작 불변). |
getCellTooltip? | (…) => … | 셀 툴팁. 셀마다 호출해 반환 문자열을 <td title> 로 부여(네이티브 hover 툴팁) — 잘린 내용 표시·부가 설명 등. undefined/null/'' 반환 시 해당 셀 title 미부여. grid-core 1.0 : (cell, row) → (ctx) (clean GridCellContext). |
getRowId? | (…) => … | 안정적 행 식별자. 미 지정 시 행 키 = 배열 인덱스. 제공하면 rowSelection·expanded 등 모든 행-키 상태가 인덱스가 아닌 이 id 로 매겨져, 데이터 재정렬/교체를 가로질러 동일 논리 행을 추적(선택이 위치가 아닌 정체성을 따라감). cell 변경 flash 가 "같은 행"을 식별하는 토대. |
getSubRows? | (…) => … | TanStack getSubRows — enableExpanding=true 시 사용. |
icons? | Partial<GridIcons> | 정렬 표시 아이콘 glyph override(부분). 미지정은 기본(▲▼⇅)으로 fallback. |
loading? | boolean | 로딩 상태. true 시 <tbody> 영역만 skeleton row 로 치환 (thead 보존 — ). |
loadingOverlay? | boolean | 로딩 오버레이 (default false). loading(skeleton 치환)과 달리 기존 data 행을 그대로 둔 채 그 위에 반투명 오버레이를 덮는다(기존 데이터를 유지하며 갱신 중임을 표시). aria-busy + pointer-events 차단(하부 상호작용 막음). loading(skeleton)과 독립·additive — 둘 다 기존 동작 불변. |
loadingRowCount? | number | 로딩 시 표시할 skeleton 행 개수. 미지정 시 pagination.pageSize ?? 5 로 fallback ( — BaseGrid L123 hardcoded 5 와 호환). |
localeText? | Partial<GridLocale> | grid chrome 문자열 현지화 — 부분 override. 미지정 키는 한국어 기본으로 fallback(raw key/undefined 안 냄). 영문화 예: { emptyText: 'No data', rowsPerPage: 'Rows per page:', totalCount: (n) => ${n} rows }. defaultGridLocale 를 import 해 위에 spread 도 가능. |
manualFiltering? | boolean | Server 필터: true 시 클라이언트 필터 비활성(getFilteredRowModel skip + manualFiltering). default false. |
manualSorting? | boolean | Server 정렬: true 시 클라이언트 정렬 비활성(getSortedRowModel skip + manualSorting). 정렬 UI/state 는 유지(헤더 클릭 → onSortingChange)되 실제 정렬은 서버 위임. default false. |
maxMultiSortColCount? | number | 동시에 정렬 가능한 최대 컬럼 수. TanStack maxMultiSortColCount 에 직접 전달. 미설정 시 무제한. enableMultiSort=false 시 무시됨. |
onAddRow? | (…) => … | 행 추가 콜백 — ref.current.addRow(seed?) 호출 시 invoke. controlled data 정책: parent 가 props.data 배열에 새 row append 책임. |
onCellClick? | (…) => … | 셀 클릭 핸들러 — column-level 분기 의도 노출. grid-core 1.0 : (cell, row, event) → (ctx, event). ctx 는 clean GridCellContext — ctx.columnId·ctx.value·ctx.rowId·ctx.row(=구 row.original). |
onCellKeyDown? | (…) => … | 셀 키보드 이벤트 핸들러 — <td onKeyDown> 으로 wire. grid-core 1.0 : (cell, row, event) → (ctx, event) (clean GridCellContext). |
onColumnFiltersChange? | OnChangeFn<ColumnFiltersState> | ColumnFilters state 변경 콜백 (server 필터 파라미터 도출용; internal state 도 갱신). |
onColumnOrderChange? | (…) => … | 컬럼 순서 변경 완료 후 호출되는 콜백. 부모가 외부 state 동기화 가능. : F-07-06 흡수. |
onColumnPinningChange? | OnChangeFn<ColumnPinningState> | ColumnPinning state 변경 콜백 (외부 영속화 또는 controlled mirror 용). |
onColumnSizingChange? | OnChangeFn<ColumnSizingState> | ColumnSizing state 변경 콜백 (외부 영속화 또는 controlled mirror 용). |
onDeleteRow? | (…) => … | 행 삭제 콜백 — ref.current.deleteRow(rowId) 호출 시 invoke. rowId = TanStack row.id (default = row index string). |
onRowClick? | (…) => … | 행 클릭 핸들러. |
onRowDoubleClick? | (…) => … | 행 더블 클릭 핸들러 — onRowClick 와 동일한 시그니처 정책. |
onRowDragStart? | (…) => … | 그리드 간 행 드래그 — 드래그 소스(default 없음=비활성). 제공 시 데이터 행이 draggable 이 되어 dragstart 시 onRowDragStart(rowId) 호출(rowId = TanStack row.id). 소비자가 드래그된 행 id 를 두 그리드 위 state 로 들어올려 보관한다(consumer-owns-payload, dataTransfer 미사용). 대상 그리드의 onRowDrop 과 짝. enableRowReorder 와 별 opt-in(같은 그리드서 혼용 금지=vN). OFF 시 byte-identical. |
onRowDrop? | (…) => … | 그리드 간 행 드래그 — 드롭 타깃(default 없음=비활성). 제공 시 그리드 본문 영역이 drop target 이 되어(드롭 시) onRowDrop 호출. 소비자가 자기 dragged id 를 읽어 순수 transferRow 로 소스→타깃 data 를 적용한다. OFF 시 byte-identical. |
onRowReorder? | (…) => … | 행 재정렬 드롭 콜백 — 표시 인덱스 from→to. 소비자가 moveRow 로 data 적용. |
onSortingChange? | OnChangeFn<SortingState> | Sorting state 변경 콜백 (server 정렬 파라미터 도출용; internal state 도 갱신). |
onStartEditing? | (…) => … | 프로그래밍적 편집 시작 콜백 — ref.current.startEditing(rowId, colId) 호출 시 invoke. 의 callback-delegating 패턴과 동일 정책: Grid 가 editing state 를 소유하지 않으며 application 이 EditableCell isEditing 갱신 책임. |
onUpdateRow? | (…) => … | 행 부분 업데이트 콜백 — ref.current.updateRow(rowId, patch) 호출 시 invoke. |
pagination? | GridPaginationOptions | 페이지네이션 세부 옵션 (enablePagination=true 일 때 효과). |
persistColumnOrder? | boolean | 컬럼 순서 localStorage 영속화 활성. true + columnOrderStorageKey 지정 시 drag/keyboard 완료 후 localStorage 저장. mount 시 저장된 순서 복원 (table.setColumnOrder). |
renderFloatingFilter? | (…) => … | Floating 필터 행 렌더 콜백. 지정 시 leaf 헤더행 아래 always-visible 필터 입력 행을 그린다(prop 존재=활성, cellClassName 관례 mirror). 컬럼 당 1회 호출 — 보통 grid-features 의 floating 입력 컴포넌트(column.setValue 로 popover 와 동일 state 공유)를 반환. grid-core 는 구조 행 + 컬럼 윈도(가상화)·핀 sticky·ARIA 정합만 제공(grid-features 무의존=MIT). null 반환=빈 셀. grid-core 1.0 : Column<TData,unknown> → clean GridFilterColumn (id·value·setValue — TanStack 타입 없음). |
rowClassName? | RowClassNameCallback<TData> | 행별 className 생성 callback. 모든 row 렌더 시 호출. 반환 string 은 <tr> 의 기본 className 에 append. virtualization 주의: enableVirtualization=true 시 <tr ref={measureElement}> 가 row height 측정 — rowClassName 이 dynamic height 변경을 유발하면 measureElement 의 reflow 가 반복 발생 (성능 저하). static className 권장. |
rowSelection? | RowSelectionMode | GridRowSelectionOptions<TData> | 행 선택 옵션. 단축 표기('multi') 또는 객체 표기 모두 지원. 'single'/'multi' 시 좌측 첫 컬럼에 체크박스 컬럼(__select__) 자동 prepend. |
showSortClearButton? | boolean | 정렬 초기화 버튼 표시 여부. true 이고 enableMultiSort=true 일 때 툴바에 <SortClearButton> 렌더. 미설정(기본) 시 DOM 구조 변경 없음. |
sortDescFirst? | boolean | 정렬 첫 클릭 방향을 내림차순으로. (TanStack sortDescFirst passthrough — 미지정 시 타입별 기본: 숫자=desc-first, 문자=asc-first.) |
theme? | Partial<GridTheme> | grid chrome 색 테마(부분 override). 제공한 색만 root 에 inline --topgrid-* var 로 적용되고 각 surface 가 var(--topgrid-x, <기본 hex>) 로 읽는다. 미지정 키는 기본색 fallback. 다크 등 프리셋은 import { darkTheme } 후 spread. ⚠ CSS var 는 forced-colors(고대비)서 무력 (HC-safe 선택 표시는 별도 메커니즘). |
virtualizerOptions? | { … } | useVirtualizer 옵션 override. - estimateSize: 행 높이 추정 px (default 36, BaseGrid <td className="px-4 py-3"> 기준). - overscan: viewport 위/아래 버퍼 행 수 (default 10, VirtualGrid.tsx:102 동일). - onChange: virtualizer 변경 콜백(가시 범위 관찰 — SSRM 의 블록 fetch 트리거). useVirtualizer 에 그대로 전달. generic passthrough(SSRM 전용 로직 0). |
virtualScrollHeight? | number | 가상화 시 scroll container 높이 (px, default 400). enableVirtualization=true 일 때만 효과 발휘. |
GridRowSelectionOptions
행 선택 옵션 (객체 형태).
<Grid rowSelection="multi" /> 단축 표기 또는 <Grid rowSelection={{ mode, onSelectionChange }} /> 객체 표기 모두 지원.
| 속성 | 타입 | 설명 |
|---|---|---|
mode? | RowSelectionMode | 선택 모드 (default 'none'). |
onSelectionChange? | (…) => … |