@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