@helix-x/datagrid-ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,502 @@
1
+ import * as react from 'react';
2
+ import { ReactNode, Ref } from 'react';
3
+
4
+ /**
5
+ * The wire shapes below intentionally mirror what ag-grid's server-side row
6
+ * model posts, because most existing backends that speak "grid" already parse
7
+ * them. Keeping them identical is what lets a screen swap grids without a
8
+ * backend change.
9
+ */
10
+ type TextFilterType = 'contains' | 'notContains' | 'equals' | 'notEqual' | 'startsWith' | 'endsWith' | 'blank' | 'notBlank';
11
+ type NumberFilterType = 'equals' | 'notEqual' | 'lessThan' | 'lessThanOrEqual' | 'greaterThan' | 'greaterThanOrEqual' | 'inRange' | 'blank' | 'notBlank';
12
+ type DateFilterType = 'equals' | 'notEqual' | 'before' | 'after' | 'inRange' | 'blank' | 'notBlank';
13
+ interface TextFilterModel {
14
+ filterType: 'text';
15
+ type: TextFilterType;
16
+ filter?: string;
17
+ }
18
+ interface NumberFilterModel {
19
+ filterType: 'number';
20
+ type: NumberFilterType;
21
+ filter?: number;
22
+ filterTo?: number;
23
+ }
24
+ interface DateFilterModel {
25
+ filterType: 'date';
26
+ type: DateFilterType;
27
+ /** `YYYY-MM-DD` */
28
+ dateFrom?: string;
29
+ dateTo?: string;
30
+ }
31
+ interface SetFilterModel {
32
+ filterType: 'set';
33
+ values: string[];
34
+ }
35
+ type HxFilterModel = TextFilterModel | NumberFilterModel | DateFilterModel | SetFilterModel;
36
+ type FilterModelMap = Record<string, HxFilterModel>;
37
+ type FilterKind = 'text' | 'number' | 'date' | 'set';
38
+ type SortDirection = 'asc' | 'desc';
39
+ interface SortModelItem {
40
+ colId: string;
41
+ sort: SortDirection;
42
+ }
43
+ /**
44
+ * Structurally compatible with ag-grid's `IServerSideGetRowsRequest`, so an
45
+ * endpoint written for that model accepts this verbatim. The grouping/pivot
46
+ * fields are always sent empty — this grid does not implement them — but they
47
+ * are present so servers that destructure them do not fall over.
48
+ */
49
+ interface HxRowsRequest {
50
+ startRow: number;
51
+ endRow: number;
52
+ sortModel: SortModelItem[];
53
+ filterModel: FilterModelMap;
54
+ rowGroupCols: never[];
55
+ valueCols: never[];
56
+ pivotCols: never[];
57
+ pivotMode: false;
58
+ groupKeys: never[];
59
+ }
60
+ interface HxRowsResponse<T> {
61
+ rows: T[];
62
+ /** Total row count across all pages, or -1 when unknown. */
63
+ lastRow: number;
64
+ }
65
+ interface HxDataSource<T> {
66
+ getRows(request: HxRowsRequest, signal: AbortSignal): Promise<HxRowsResponse<T>>;
67
+ }
68
+ type Pinned = 'left' | 'right';
69
+ interface CellRendererParams<T, C = unknown> {
70
+ row: T;
71
+ rowIndex: number;
72
+ value: unknown;
73
+ formatted: string;
74
+ column: ColumnDef<T, C>;
75
+ /**
76
+ * Arbitrary app state handed to every renderer. Put volatile things here
77
+ * (in-flight ids, permission checks, handlers) so column definitions can stay
78
+ * memoised on `[]` and never rebuild.
79
+ */
80
+ context: C;
81
+ api: GridApi<T>;
82
+ }
83
+ interface EditorParams<T, C = unknown> {
84
+ value: unknown;
85
+ row: T;
86
+ column: ColumnDef<T, C>;
87
+ context: C;
88
+ /** Writes into the row draft. Never hits the network. */
89
+ onChange: (value: unknown) => void;
90
+ /** Commit the whole row. */
91
+ onCommit: () => void;
92
+ onCancel: () => void;
93
+ error?: string;
94
+ autoFocus?: boolean;
95
+ }
96
+ type EditorComponent<T, C = unknown> = (params: EditorParams<T, C>) => ReactNode;
97
+ type BuiltinEditor = 'text' | 'number' | 'select' | 'date' | 'checkbox';
98
+ interface SelectOption {
99
+ label: string;
100
+ value: unknown;
101
+ }
102
+ interface ColumnDef<T, C = unknown> {
103
+ /** Stable identity. Falls back to `field` when omitted. */
104
+ colId?: string;
105
+ /** Dotted path into the row. Also used as the server-side filter/sort key. */
106
+ field?: string;
107
+ header: ReactNode;
108
+ /** Plain-text header, used for exports when `header` is a node. */
109
+ headerName?: string;
110
+ width?: number;
111
+ minWidth?: number;
112
+ maxWidth?: number;
113
+ /** Share of the leftover horizontal space. */
114
+ flex?: number;
115
+ pinned?: Pinned;
116
+ hide?: boolean;
117
+ sortable?: boolean;
118
+ resizable?: boolean;
119
+ /** Prevent the user dragging this column out of position. */
120
+ lockPosition?: boolean;
121
+ filter?: FilterKind | false;
122
+ filterParams?: {
123
+ /** Static values, or a loader for a set filter whose options come from an API. */
124
+ values?: string[] | (() => Promise<string[]>);
125
+ /** Hide the always-visible filter input under the header for this column. */
126
+ suppressFloatingFilter?: boolean;
127
+ };
128
+ /** Alternative flat keys to try when the server flattens nested fields. */
129
+ fieldAliases?: string[];
130
+ valueGetter?: (row: T) => unknown;
131
+ valueFormatter?: (value: unknown, row: T) => string;
132
+ cellRenderer?: (params: CellRendererParams<T, C>) => ReactNode;
133
+ editable?: boolean | ((row: T) => boolean);
134
+ editor?: BuiltinEditor | EditorComponent<T, C>;
135
+ editorParams?: {
136
+ options?: SelectOption[];
137
+ placeholder?: string;
138
+ };
139
+ exportValue?: (row: T) => string;
140
+ suppressExport?: boolean;
141
+ cellClassName?: string | ((row: T) => string);
142
+ headerClassName?: string;
143
+ /** Horizontal alignment of the cell content. */
144
+ align?: 'left' | 'center' | 'right';
145
+ }
146
+ /** A column with every default resolved. Internal, but exported for renderers. */
147
+ interface ResolvedColumn<T, C = unknown> extends ColumnDef<T, C> {
148
+ colId: string;
149
+ width: number;
150
+ minWidth: number;
151
+ sortable: boolean;
152
+ resizable: boolean;
153
+ }
154
+ /** Geometry for one visible column, computed once per layout change. */
155
+ interface ColumnLayoutItem<T, C = unknown> {
156
+ column: ResolvedColumn<T, C>;
157
+ colId: string;
158
+ width: number;
159
+ /** Offset from the left edge of the full (unscrolled) column strip. */
160
+ left: number;
161
+ pinned?: Pinned;
162
+ /** `left`/`right` offset to use for `position: sticky` on pinned columns. */
163
+ stickyOffset: number;
164
+ }
165
+ interface ColumnLayout<T, C = unknown> {
166
+ items: ColumnLayoutItem<T, C>[];
167
+ totalWidth: number;
168
+ leftPinnedWidth: number;
169
+ rightPinnedWidth: number;
170
+ }
171
+ type RowCommitResult = {
172
+ ok: true;
173
+ row?: unknown;
174
+ } | {
175
+ ok: false;
176
+ errors: Record<string, string>;
177
+ message?: string;
178
+ };
179
+ declare const GRID_STATE_VERSION = 1;
180
+ interface PersistedGridState {
181
+ v: number;
182
+ columns: {
183
+ order: string[];
184
+ hidden: string[];
185
+ widths: Record<string, number>;
186
+ pinned: Record<string, Pinned>;
187
+ };
188
+ sort: SortModelItem[];
189
+ filters: FilterModelMap;
190
+ pagination: {
191
+ pageSize: number;
192
+ };
193
+ }
194
+ interface ExportCsvOptions {
195
+ onlySelected?: boolean;
196
+ fileName?: string;
197
+ /** Field separator. Defaults to `,`. */
198
+ separator?: string;
199
+ }
200
+ interface GridApi<T> {
201
+ /** Re-fetch. `purge` drops every cached block first. */
202
+ refresh(options?: {
203
+ purge?: boolean;
204
+ }): void;
205
+ getDisplayedRows(): T[];
206
+ getSelectedRows(): T[];
207
+ getSelectedIds(): Array<string | number>;
208
+ clearSelection(): void;
209
+ selectAll(): void;
210
+ exportCsv(options?: ExportCsvOptions): void;
211
+ copySelectionToClipboard(): Promise<void>;
212
+ getFilterModel(): FilterModelMap;
213
+ setFilterModel(model: FilterModelMap): void;
214
+ getSortModel(): SortModelItem[];
215
+ setSortModel(model: SortModelItem[]): void;
216
+ resetColumns(): void;
217
+ /** Patch rows already on screen without a round trip. */
218
+ updateRows(rows: T[]): void;
219
+ startEditing(rowId: string | number): void;
220
+ stopEditing(): void;
221
+ }
222
+
223
+ type RowId = string | number;
224
+ interface UseSelectionModelResult<T> {
225
+ selectedIds: Set<RowId>;
226
+ isSelected: (id: RowId) => boolean;
227
+ /** True when every row currently on screen is selected. */
228
+ allVisibleSelected: boolean;
229
+ someVisibleSelected: boolean;
230
+ toggleRow: (id: RowId, index: number, shiftKey: boolean) => void;
231
+ toggleAllVisible: () => void;
232
+ clear: () => void;
233
+ selectAllVisible: () => void;
234
+ getSelectedRows: () => T[];
235
+ }
236
+ /**
237
+ * Selection lives here as a real React model rather than being read back out of
238
+ * persisted grid state -- that indirection is what made the previous
239
+ * implementation's "is anything selected?" check unreliable.
240
+ */
241
+ declare function useSelectionModel<T>(rows: T[], getRowId: (row: T) => RowId, onSelectionChanged?: (ids: RowId[]) => void): UseSelectionModelResult<T>;
242
+
243
+ interface DataGridProps<T, C = unknown> {
244
+ columns: ColumnDef<T, C>[];
245
+ dataSource: HxDataSource<T>;
246
+ getRowId: (row: T) => RowId;
247
+ /** Volatile app state handed to every cell renderer. */
248
+ context?: C;
249
+ /** localStorage key for column/sort/filter/page-size preferences. */
250
+ storageKey?: string;
251
+ rowHeight?: number;
252
+ headerHeight?: number;
253
+ /** Show the always-visible filter inputs under the header. */
254
+ floatingFilter?: boolean;
255
+ selectable?: boolean;
256
+ defaultPageSize?: number;
257
+ pageSizeOptions?: number[];
258
+ /** Enables row editing. Return `{ ok:false, errors }` to keep the row open. */
259
+ onRowCommit?: (draft: T, original: T) => Promise<RowCommitResult> | RowCommitResult;
260
+ onSelectionChanged?: (ids: RowId[]) => void;
261
+ /** Enables dropping files onto a row (e.g. to attach documents to it). */
262
+ onRowFilesDropped?: (row: T, files: File[]) => void;
263
+ onError?: (error: unknown) => void;
264
+ /** Rendered above the header; receives the live api. */
265
+ toolbar?: (api: GridApi<T>) => ReactNode;
266
+ emptyMessage?: ReactNode;
267
+ exportFileName?: string;
268
+ className?: string;
269
+ /** Height of the scrolling area. Defaults to `70vh`. */
270
+ height?: number | string;
271
+ apiRef?: Ref<GridApi<T>>;
272
+ }
273
+ declare function DataGrid<T, C = unknown>({ columns, dataSource, getRowId, context, storageKey, rowHeight, headerHeight, floatingFilter, selectable, defaultPageSize, pageSizeOptions, onRowCommit, onSelectionChanged, onRowFilesDropped, onError, toolbar, emptyMessage, exportFileName, className, height, apiRef, }: DataGridProps<T, C>): react.JSX.Element;
274
+
275
+ interface GridPaginationProps {
276
+ page: number;
277
+ pageSize: number;
278
+ totalRows: number;
279
+ pageSizeOptions: number[];
280
+ isLoading: boolean;
281
+ onPageChange: (page: number) => void;
282
+ onPageSizeChange: (pageSize: number) => void;
283
+ }
284
+ declare function GridPagination({ page, pageSize, totalRows, pageSizeOptions, isLoading, onPageChange, onPageSizeChange, }: GridPaginationProps): react.JSX.Element;
285
+
286
+ interface GridOverlayProps {
287
+ kind: 'loading' | 'empty' | 'error';
288
+ message?: ReactNode;
289
+ }
290
+ /**
291
+ * Sits over the row area rather than replacing it, so the header and column
292
+ * widths stay put while a refetch is in flight.
293
+ */
294
+ declare function GridOverlay({ kind, message }: GridOverlayProps): react.JSX.Element;
295
+
296
+ interface ColumnsPanelProps<T, C> {
297
+ columns: ResolvedColumn<T, C>[];
298
+ isHidden: (colId: string) => boolean;
299
+ onToggle: (colId: string, hidden: boolean) => void;
300
+ onMove: (colId: string, toIndex: number) => void;
301
+ onPin: (colId: string, pinned: Pinned | undefined) => void;
302
+ onReset: () => void;
303
+ onClose: () => void;
304
+ }
305
+ /** Show/hide, reorder and pin, plus the "reset my preferences" escape hatch. */
306
+ declare function ColumnsPanel<T, C>({ columns, isHidden, onToggle, onMove, onPin, onReset, onClose, }: ColumnsPanelProps<T, C>): react.JSX.Element;
307
+
308
+ interface FilterPopoverProps {
309
+ kind: FilterKind;
310
+ value: HxFilterModel | undefined;
311
+ setValues?: string[] | (() => Promise<string[]>);
312
+ onApply: (filter: HxFilterModel | null) => void;
313
+ onClose: () => void;
314
+ }
315
+ /** Header filter menu. Emits the wire-format model directly. */
316
+ declare function FilterPopover({ kind, value, setValues, onApply, onClose, }: FilterPopoverProps): react.JSX.Element;
317
+
318
+ declare function TextEditor<T, C>({ value, onChange, onCommit, onCancel, error, autoFocus, column, }: EditorParams<T, C>): react.JSX.Element;
319
+ declare function NumberEditor<T, C>({ value, onChange, onCommit, onCancel, error, autoFocus, }: EditorParams<T, C>): react.JSX.Element;
320
+ declare function DateEditor<T, C>({ value, onChange, onCommit, onCancel, error, autoFocus, }: EditorParams<T, C>): react.JSX.Element;
321
+ declare function SelectEditor<T, C>({ value, onChange, onCommit, onCancel, error, autoFocus, column, }: EditorParams<T, C>): react.JSX.Element;
322
+ declare function CheckboxEditor<T, C>({ value, onChange, onCommit, onCancel, autoFocus, }: EditorParams<T, C>): react.JSX.Element;
323
+
324
+ /** Maps a `ColumnDef.editor` string to its component. */
325
+ declare const BUILTIN_EDITORS: {
326
+ readonly text: typeof TextEditor;
327
+ readonly number: typeof NumberEditor;
328
+ readonly date: typeof DateEditor;
329
+ readonly select: typeof SelectEditor;
330
+ readonly checkbox: typeof CheckboxEditor;
331
+ };
332
+
333
+ interface UseGridStateResult {
334
+ /** Read once on mount; never re-read, so it is safe as an initial value. */
335
+ initial: PersistedGridState | undefined;
336
+ saveColumns: (columns: PersistedGridState['columns']) => void;
337
+ saveSort: (sort: SortModelItem[]) => void;
338
+ saveFilters: (filters: FilterModelMap) => void;
339
+ savePageSize: (pageSize: number) => void;
340
+ clear: () => void;
341
+ hasSavedState: boolean;
342
+ }
343
+ /** Versioned, lean localStorage persistence for one grid. */
344
+ declare function useGridState(storageKey: string | undefined): UseGridStateResult;
345
+
346
+ interface UseServerDataSourceOptions<T> {
347
+ dataSource: HxDataSource<T>;
348
+ pageSize: number;
349
+ page: number;
350
+ sortModel: SortModelItem[];
351
+ filterModel: FilterModelMap;
352
+ /** Blocks to keep around so paging back and forth does not refetch. */
353
+ maxCachedBlocks?: number;
354
+ onError?: (error: unknown) => void;
355
+ }
356
+ interface UseServerDataSourceResult<T> {
357
+ rows: T[];
358
+ totalRows: number;
359
+ isLoading: boolean;
360
+ error: unknown;
361
+ refresh: (options?: {
362
+ purge?: boolean;
363
+ }) => void;
364
+ /** Patch loaded rows in place, keyed by the grid's row id. */
365
+ patchRows: (rows: T[], getRowId: (row: T) => string | number) => void;
366
+ }
367
+ /**
368
+ * Server-side paging with a small block cache.
369
+ *
370
+ * Two things here that the ag-grid screen this replaces did not do: every
371
+ * request carries an AbortController and a sequence number, so a slow response
372
+ * for an old sort/filter can never overwrite a newer one; and the cache is
373
+ * dropped wholesale when the query changes, so stale blocks are never mixed
374
+ * with fresh ones.
375
+ */
376
+ declare function useServerDataSource<T>({ dataSource, pageSize, page, sortModel, filterModel, maxCachedBlocks, onError, }: UseServerDataSourceOptions<T>): UseServerDataSourceResult<T>;
377
+
378
+ interface VirtualWindow {
379
+ startIndex: number;
380
+ endIndex: number;
381
+ }
382
+ interface UseVirtualRowsOptions {
383
+ rowCount: number;
384
+ rowHeight: number;
385
+ overscan?: number;
386
+ }
387
+ interface UseVirtualRowsResult {
388
+ window: VirtualWindow;
389
+ totalHeight: number;
390
+ /** Attach to the scrolling element. */
391
+ onScroll: (event: {
392
+ currentTarget: HTMLElement;
393
+ }) => void;
394
+ /** Call when the viewport is measured or resized. */
395
+ setViewportHeight: (height: number) => void;
396
+ scrollTopRef: React.RefObject<number>;
397
+ }
398
+ /**
399
+ * Fixed-height row windowing.
400
+ *
401
+ * Fixed heights are a deliberate constraint: they make the visible range O(1)
402
+ * to compute and remove the measure-then-reflow pass that variable heights
403
+ * force. Scroll position is tracked in a ref and only promoted to state when
404
+ * the computed window actually changes, so scrolling within a row does not
405
+ * re-render anything.
406
+ */
407
+ declare function useVirtualRows({ rowCount, rowHeight, overscan, }: UseVirtualRowsOptions): UseVirtualRowsResult;
408
+
409
+ interface ColumnStateValue {
410
+ order: string[];
411
+ hidden: string[];
412
+ widths: Record<string, number>;
413
+ pinned: Record<string, Pinned>;
414
+ }
415
+ interface UseColumnStateResult<T, C> {
416
+ /** Every column, in user order, including hidden ones (for the columns panel). */
417
+ allColumns: ResolvedColumn<T, C>[];
418
+ visibleColumns: ResolvedColumn<T, C>[];
419
+ layout: ColumnLayout<T, C>;
420
+ state: ColumnStateValue;
421
+ isHidden: (colId: string) => boolean;
422
+ setHidden: (colId: string, hidden: boolean) => void;
423
+ setWidth: (colId: string, width: number) => void;
424
+ setPinned: (colId: string, pinned: Pinned | undefined) => void;
425
+ moveColumn: (colId: string, toIndex: number) => void;
426
+ reset: () => void;
427
+ }
428
+ declare function useColumnState<T, C>(columns: ColumnDef<T, C>[], persisted: PersistedGridState['columns'] | undefined, onChange: (state: ColumnStateValue) => void, availableWidth: number): UseColumnStateResult<T, C>;
429
+
430
+ interface EditState<T> {
431
+ rowId: RowId;
432
+ draft: T;
433
+ original: T;
434
+ errors: Record<string, string>;
435
+ isSaving: boolean;
436
+ }
437
+ interface UseEditModelResult<T> {
438
+ edit: EditState<T> | null;
439
+ isEditing: (rowId: RowId) => boolean;
440
+ start: (rowId: RowId, row: T) => void;
441
+ setField: (field: string, value: unknown) => void;
442
+ cancel: () => void;
443
+ commit: () => Promise<void>;
444
+ }
445
+ /**
446
+ * Row-level editing against a draft copy.
447
+ *
448
+ * The draft never touches the data source, and the editors never call an API --
449
+ * the single `onCommit` callback owns validation and persistence, so the app can
450
+ * plug in whatever schema library it uses without the grid knowing about it.
451
+ */
452
+ declare function useEditModel<T>(onCommit: (draft: T, original: T) => Promise<RowCommitResult> | RowCommitResult): UseEditModelResult<T>;
453
+
454
+ /**
455
+ * Resolves a cell value.
456
+ *
457
+ * Servers that flatten joined relations hand back `{"customer.businessName": x}`
458
+ * rather than a nested object -- and some flatten with a different prefix when
459
+ * grouping is on. So: explicit getter, then the dotted path, then the literal
460
+ * flat key, then any declared aliases.
461
+ */
462
+ declare function resolveValue<T>(row: T, column: ColumnDef<T, never>): unknown;
463
+ /** The display string for a cell, independent of any custom renderer. */
464
+ declare function formatValue<T>(value: unknown, row: T, column: ColumnDef<T, never>): string;
465
+ /** The string written to CSV / clipboard for a cell. */
466
+ declare function exportValue<T>(row: T, column: ColumnDef<T, never>): string;
467
+ /** Plain-text header, for exports and aria labels. */
468
+ declare function headerText<T>(column: ColumnDef<T, never>): string;
469
+ declare function columnId<T, C>(column: ColumnDef<T, C>): string;
470
+ /** Fills in the defaults every other module assumes are present. */
471
+ declare function resolveColumn<T, C>(column: ColumnDef<T, C>): ResolvedColumn<T, C>;
472
+ declare function isEditable<T, C>(column: ColumnDef<T, C>, row: T): boolean;
473
+
474
+ /**
475
+ * Every wire-format filter shape is built here, so the contract with the server
476
+ * is defined in exactly one place.
477
+ */
478
+ declare const TEXT_FILTER_TYPES: TextFilterType[];
479
+ declare const NUMBER_FILTER_TYPES: NumberFilterType[];
480
+ declare const DATE_FILTER_TYPES: DateFilterType[];
481
+ declare const FILTER_TYPE_LABELS: Record<string, string>;
482
+ /** Filter types that need no operand. */
483
+ declare function isUnaryFilter(type: string): boolean;
484
+ declare function isRangeFilter(type: string): boolean;
485
+ declare function defaultFilterType(kind: FilterKind): string;
486
+ declare function buildTextFilter(type: TextFilterType, filter: string): HxFilterModel | null;
487
+ declare function buildNumberFilter(type: NumberFilterType, filter: string, filterTo?: string): HxFilterModel | null;
488
+ declare function buildDateFilter(type: DateFilterType, dateFrom: string, dateTo?: string): HxFilterModel | null;
489
+ declare function buildSetFilter(values: string[]): HxFilterModel | null;
490
+ /** Sets or clears one column's entry, returning a new map. */
491
+ declare function withFilter(model: FilterModelMap, colId: string, filter: HxFilterModel | null): FilterModelMap;
492
+ /** A short label for the floating filter / header indicator. */
493
+ declare function describeFilter(filter: HxFilterModel): string;
494
+
495
+ declare function toDelimited<T>(rows: T[], columns: Array<ResolvedColumn<T, never> | ColumnDef<T, never>>, separator: string): string;
496
+ declare function toCsv<T>(rows: T[], columns: Array<ResolvedColumn<T, never> | ColumnDef<T, never>>, separator?: string): string;
497
+ /** Tab-separated, which is what spreadsheets expect from the clipboard. */
498
+ declare function toTsv<T>(rows: T[], columns: Array<ResolvedColumn<T, never> | ColumnDef<T, never>>): string;
499
+ declare function downloadCsv(content: string, fileName: string): void;
500
+ declare function copyToClipboard(text: string): Promise<void>;
501
+
502
+ export { BUILTIN_EDITORS, type BuiltinEditor, type CellRendererParams, CheckboxEditor, type ColumnDef, type ColumnLayout, type ColumnLayoutItem, ColumnsPanel, DATE_FILTER_TYPES, DataGrid, type DataGridProps, DateEditor, type DateFilterModel, type DateFilterType, type EditorComponent, type EditorParams, type ExportCsvOptions, FILTER_TYPE_LABELS, type FilterKind, type FilterModelMap, FilterPopover, GRID_STATE_VERSION, type GridApi, GridOverlay, GridPagination, type HxDataSource, type HxFilterModel, type HxRowsRequest, type HxRowsResponse, NUMBER_FILTER_TYPES, NumberEditor, type NumberFilterModel, type NumberFilterType, type PersistedGridState, type Pinned, type ResolvedColumn, type RowCommitResult, type RowId, SelectEditor, type SelectOption, type SetFilterModel, type SortDirection, type SortModelItem, TEXT_FILTER_TYPES, TextEditor, type TextFilterModel, type TextFilterType, buildDateFilter, buildNumberFilter, buildSetFilter, buildTextFilter, columnId, copyToClipboard, defaultFilterType, describeFilter, downloadCsv, exportValue, formatValue, headerText, isEditable, isRangeFilter, isUnaryFilter, resolveColumn, resolveValue, toCsv, toDelimited, toTsv, useColumnState, useEditModel, useGridState, useSelectionModel, useServerDataSource, useVirtualRows, withFilter };