@gravity-ui/react-data-table 1.0.3

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,455 @@
1
+ import PropTypes from 'prop-types';
2
+ import * as React from 'react';
3
+ import ReactList from 'react-list';
4
+ import './DataTable.scss';
5
+ import { HeightObserver } from './height-observer';
6
+ import { Column, DataTableProps, HeadPosition, OrderType, Settings, SortedDataItem } from './types';
7
+ import { SlimColumn, getSortedData } from './util';
8
+ interface CustomIcons {
9
+ ICON_ASC: React.ReactNode;
10
+ ICON_DESC: React.ReactNode;
11
+ }
12
+ interface TableHeadProps<T> {
13
+ dataColumns: DataColumns<T>;
14
+ headColumns: HeadColumns<T>;
15
+ displayIndices?: boolean;
16
+ onSort?: TableProps<T>['onSort'];
17
+ onColumnsUpdated?: (widths: number[]) => void;
18
+ renderedDataRows?: React.ReactNode;
19
+ onDataRowsHeightChange?: StickyHeadProps<T>['onDataRowsHeightChange'];
20
+ }
21
+ declare class TableHead<T> extends React.Component<TableHeadProps<T>> {
22
+ static propTypes: {
23
+ headColumns: PropTypes.Validator<any[]>;
24
+ dataColumns: PropTypes.Validator<any[]>;
25
+ displayIndices: PropTypes.Validator<boolean>;
26
+ onSort: PropTypes.Requireable<(...args: any[]) => any>;
27
+ onColumnsUpdated: PropTypes.Requireable<(...args: any[]) => any>;
28
+ renderedDataRows: PropTypes.Requireable<PropTypes.ReactNodeLike>;
29
+ };
30
+ _dataRowsRef: HTMLTableSectionElement | null;
31
+ dataRowsHeightObserver?: HeightObserver;
32
+ renderedColumns: HTMLTableHeaderCellElement[];
33
+ componentDidMount(): void;
34
+ componentDidUpdate(): void;
35
+ componentWillUnmount(): void;
36
+ render(): JSX.Element;
37
+ _calculateColumnsWidth(): void;
38
+ onSort(column?: SlimColumn, multisort?: boolean): void;
39
+ _getOnSortClick(column: HeadCellColumn<T>): ((event: React.MouseEvent<HTMLTableHeaderCellElement>) => void) | undefined;
40
+ renderHeadCell: (headCell: HeadCellsType<T>) => JSX.Element;
41
+ renderHeadLevel: (row: HeadColumnsItem<T>, rowIndex: number) => JSX.Element;
42
+ dataRowsRef: (ref: HTMLTableSectionElement) => void;
43
+ _getColumnRef: (index: number) => (node: HTMLTableHeaderCellElement) => void;
44
+ }
45
+ interface StickyHeadProps<T> {
46
+ dataColumns: DataColumns<T>;
47
+ headColumns: HeadColumns<T>;
48
+ mode: HeadPositionInner;
49
+ displayIndices?: Settings['displayIndices'];
50
+ onSort?: TableProps<T>['onSort'];
51
+ top: number;
52
+ onDataRowsHeightChange: (height: number) => void;
53
+ }
54
+ interface StickyHeadState {
55
+ widths?: number[];
56
+ right?: number;
57
+ style?: React.CSSProperties;
58
+ }
59
+ declare class StickyHead<T> extends React.Component<StickyHeadProps<T>, StickyHeadState> {
60
+ static propTypes: {
61
+ mode: PropTypes.Requireable<string>;
62
+ top: PropTypes.Requireable<number>;
63
+ renderedDataRows: PropTypes.Requireable<PropTypes.ReactNodeLike>;
64
+ };
65
+ static defaultProps: {
66
+ top: number;
67
+ };
68
+ static getDerivedStateFromProps<T>(props: StickyHeadProps<T>, state: StickyHeadState): {
69
+ style: {
70
+ top: number;
71
+ };
72
+ } | null;
73
+ state: StickyHeadState;
74
+ heightObserver?: HeightObserver;
75
+ _node?: HTMLElement;
76
+ render(): JSX.Element;
77
+ setScrollLeft(scrollLeft: number): void;
78
+ setRightPosition(value: number): void;
79
+ renderHeader(props: Omit<StickyHeadProps<T>, 'mode' | 'top'>): JSX.Element;
80
+ onDataRowsHeightChange: (height: number) => void;
81
+ updateWidths(newWidths?: number[]): void;
82
+ _nodeRef: (node: HTMLDivElement) => void;
83
+ }
84
+ interface StickyFooterProps<T> {
85
+ dataColumns: DataColumns<T>;
86
+ renderedRows: React.ReactNode;
87
+ mode: StickyHeadProps<T>['mode'];
88
+ bottom?: number;
89
+ onMovingHeightChange: (height: number) => void;
90
+ }
91
+ declare type StickyFooterState = StickyHeadState;
92
+ declare class StickyFooter<T> extends React.PureComponent<StickyFooterProps<T>, StickyFooterState> {
93
+ static defaultProps: {
94
+ bottom: number;
95
+ };
96
+ static getDerivedStateFromProps<T>(props: StickyFooterProps<T>, state: StickyFooterState): {
97
+ style: {
98
+ bottom: number;
99
+ };
100
+ } | null;
101
+ state: StickyFooterState;
102
+ heightObserver?: HeightObserver;
103
+ _nodeFixed: HTMLElement | null;
104
+ _nodeMoving: HTMLElement | null;
105
+ componentDidMount(): void;
106
+ componentDidUpdate(): void;
107
+ componentWillUnmount(): void;
108
+ render(): JSX.Element | null;
109
+ _nodeFixedRef: (node: HTMLDivElement) => void;
110
+ _nodeMovingRef: (node: HTMLDivElement) => void;
111
+ setScrollLeft(scrollLeft: number): void;
112
+ setRightPosition(value: number): void;
113
+ renderFooter(renderedRows: React.ReactNode): JSX.Element;
114
+ updateWidths(newWidths?: number[]): void;
115
+ }
116
+ interface TableProps<T> {
117
+ className?: string;
118
+ settings: DataTableViewState<T>['settings'];
119
+ headerData: DataTableProps<T>['headerData'];
120
+ data: SortedDataItem<T>[];
121
+ footerData: DataTableProps<T>['footerData'];
122
+ columns: TableColumns<T>;
123
+ emptyDataMessage?: string;
124
+ onRowClick: DataTableProps<T>['onRowClick'];
125
+ rowClassName: DataTableProps<T>['rowClassName'];
126
+ rowKey: (row: T, index: number) => string | number;
127
+ startIndex: DataTableProps<T>['startIndex'];
128
+ onSort: DataTableView<T>['onSort'];
129
+ renderEmptyRow: unknown;
130
+ nullBeforeNumbers?: boolean;
131
+ }
132
+ interface TableState {
133
+ movingFooterStyle?: {
134
+ marginBottom: number;
135
+ };
136
+ movingHeaderStyle?: {
137
+ marginTop: number;
138
+ };
139
+ }
140
+ declare class Table<T> extends React.PureComponent<TableProps<T>, TableState> {
141
+ static propTypes: {
142
+ className: PropTypes.Requireable<string>;
143
+ settings: PropTypes.Requireable<object>;
144
+ refs: PropTypes.Requireable<object>;
145
+ headerData: PropTypes.Requireable<any[]>;
146
+ data: PropTypes.Requireable<any[]>;
147
+ footerData: PropTypes.Requireable<any[]>;
148
+ columns: PropTypes.Requireable<object>;
149
+ emptyDataMessage: PropTypes.Requireable<string>;
150
+ onRowClick: PropTypes.Requireable<(...args: any[]) => any>;
151
+ rowClassName: PropTypes.Requireable<(...args: any[]) => any>;
152
+ rowKey: PropTypes.Requireable<(...args: any[]) => any>;
153
+ startIndex: PropTypes.Requireable<number>;
154
+ onSort: PropTypes.Requireable<(...args: any[]) => any>;
155
+ renderEmptyRow: PropTypes.Requireable<(...args: any[]) => any>;
156
+ };
157
+ state: TableState;
158
+ _onWindowResize?: () => void;
159
+ _body?: HTMLDivElement;
160
+ _box?: HTMLDivElement;
161
+ _head?: TableHead<T>;
162
+ _stickyHead?: StickyHead<T>;
163
+ _stickyFooter?: StickyFooter<T>;
164
+ componentDidMount(): void;
165
+ componentDidUpdate(): void;
166
+ componentWillUnmount(): void;
167
+ render(): JSX.Element;
168
+ _refBody: (node: HTMLDivElement) => void;
169
+ _refBox: (node: HTMLDivElement) => void;
170
+ _refHead: (node: TableHead<T>) => void;
171
+ _refStickyHead: (node: StickyHead<T>) => void;
172
+ _refStickyFooter: (node: StickyFooter<T>) => void;
173
+ _onBoxScroll: () => void;
174
+ _updateBoxConstraints(): void;
175
+ _onColumnsUpdated: (widths: number[]) => void;
176
+ syncHeadWidths(): void;
177
+ _getEmptyRow(): any;
178
+ renderHead(): JSX.Element;
179
+ renderStickyHead(): JSX.Element;
180
+ renderStickyFooter(): JSX.Element;
181
+ onMovingHeaderDataRowsHeightChange: (height: number) => void;
182
+ onMovingFooterHeightChange: (height: number) => void;
183
+ renderRow: (vIndex: number) => JSX.Element;
184
+ renderFooterRow: (rowData: T, index: number) => JSX.Element;
185
+ renderHeaderRow: (rowData: T, index: number) => JSX.Element;
186
+ renderRowImpl: (row: T, index: number, { onRowClick, odd, span, footer, headerData }?: RenderRowImplOptions<T>) => JSX.Element;
187
+ renderTable: (items: React.ReactNode[], ref?: any) => JSX.Element;
188
+ renderTableDynamic(): JSX.Element;
189
+ renderTableSimple(): JSX.Element;
190
+ renderHeaderRows(): JSX.Element[] | undefined;
191
+ renderFooterRows(): JSX.Element[] | undefined;
192
+ getStickyFooterMode(): HeadPositionInner;
193
+ }
194
+ interface RenderRowImplOptions<T> {
195
+ onRowClick?: DataTableProps<T>['onRowClick'];
196
+ odd?: boolean;
197
+ span?: SortedDataItem<T>['span'];
198
+ footer?: boolean;
199
+ headerData?: boolean;
200
+ }
201
+ interface CellProps<T> {
202
+ column: Column<T>;
203
+ value?: any;
204
+ row: T;
205
+ index: number;
206
+ footer?: boolean;
207
+ headerData?: boolean;
208
+ }
209
+ declare type InternalProps<T> = DataTableProps<T> & typeof DataTableView.defaultProps;
210
+ interface DataTableViewState<T> extends SortOrderWithSortColumns {
211
+ indexColumn?: Column<T>;
212
+ settings: ReturnType<typeof DataTableView.calculateSettings>;
213
+ }
214
+ declare type HeadPositionInner = HeadPosition | false;
215
+ declare class DataTableView<T> extends React.Component<DataTableProps<T>, DataTableViewState<T>> {
216
+ static propTypes: {
217
+ columns: PropTypes.Validator<any[]>;
218
+ headerData: PropTypes.Requireable<any[]>;
219
+ data: PropTypes.Validator<any[]>;
220
+ footerData: PropTypes.Requireable<any[]>;
221
+ startIndex: PropTypes.Requireable<number>;
222
+ emptyDataMessage: PropTypes.Requireable<string>;
223
+ renderEmptyRow: PropTypes.Requireable<(...args: any[]) => any>;
224
+ rowClassName: PropTypes.Requireable<(...args: any[]) => any>;
225
+ rowKey: PropTypes.Requireable<(...args: any[]) => any>;
226
+ visibleRowIndex: PropTypes.Requireable<(...args: any[]) => any>;
227
+ initialSortOrder: PropTypes.Requireable<PropTypes.InferProps<{
228
+ columnId: PropTypes.Requireable<string>;
229
+ order: PropTypes.Requireable<number>;
230
+ }> | (PropTypes.InferProps<{
231
+ columnId: PropTypes.Requireable<string>;
232
+ order: PropTypes.Requireable<number>;
233
+ }> | null | undefined)[]>;
234
+ sortOrder: PropTypes.Requireable<PropTypes.InferProps<{
235
+ columnId: PropTypes.Requireable<string>;
236
+ order: PropTypes.Requireable<number>;
237
+ }> | (PropTypes.InferProps<{
238
+ columnId: PropTypes.Requireable<string>;
239
+ order: PropTypes.Requireable<number>;
240
+ }> | null | undefined)[]>;
241
+ settings: PropTypes.Requireable<PropTypes.InferProps<{
242
+ displayIndices: PropTypes.Requireable<boolean>;
243
+ dynamicRender: PropTypes.Requireable<boolean>;
244
+ dynamicRenderType: PropTypes.Requireable<string>;
245
+ dynamicRenderUseStaticSize: PropTypes.Requireable<boolean>;
246
+ dynamicRenderThreshold: PropTypes.Requireable<number>;
247
+ dynamicRenderMinSize: PropTypes.Requireable<number>;
248
+ dynamicRenderScrollParentGetter: PropTypes.Requireable<(...args: any[]) => any>;
249
+ dynamicRenderScrollParentViewportSizeGetter: PropTypes.Requireable<(...args: any[]) => any>;
250
+ dynamicItemSizeEstimator: PropTypes.Requireable<(...args: any[]) => any>;
251
+ dynamicItemSizeGetter: PropTypes.Requireable<(...args: any[]) => any>;
252
+ stickyHead: PropTypes.Requireable<string | boolean>;
253
+ stickyTop: PropTypes.Requireable<string | number>;
254
+ sortable: PropTypes.Requireable<boolean>;
255
+ externalSort: PropTypes.Requireable<boolean>;
256
+ highlightRows: PropTypes.Requireable<boolean>;
257
+ stripedRows: PropTypes.Requireable<boolean>;
258
+ headerMod: PropTypes.Requireable<string>;
259
+ defaultOrder: PropTypes.Requireable<number>;
260
+ syncHeadOnResize: PropTypes.Requireable<boolean>;
261
+ }>>;
262
+ theme: PropTypes.Requireable<string>;
263
+ onSort: PropTypes.Requireable<(...args: any[]) => any>;
264
+ };
265
+ static defaultProps: {
266
+ startIndex: number;
267
+ emptyDataMessage: string;
268
+ settings: {
269
+ displayIndices: boolean;
270
+ dynamicRenderMinSize: number;
271
+ stickyHead: HeadPositionInner;
272
+ stickyFooter: HeadPositionInner;
273
+ sortable: boolean;
274
+ externalSort: boolean;
275
+ defaultOrder: OrderType;
276
+ };
277
+ rowKey: (row: any, index: number) => any;
278
+ initialSortOrder: {};
279
+ initialSortColumns: never[];
280
+ theme: string;
281
+ };
282
+ static getSortedData: typeof getSortedData;
283
+ static normalizeStickyHead(stickyHead?: Settings['stickyHead'] | false): HeadPositionInner;
284
+ static calculateSettings(nextSettings: Settings): {
285
+ stickyHead: HeadPositionInner;
286
+ stickyFooter: HeadPositionInner;
287
+ displayIndices: boolean;
288
+ stickyTop?: number | "auto" | undefined;
289
+ syncHeadOnResize?: boolean | undefined;
290
+ stickyBottom?: number | "auto" | undefined;
291
+ dynamicRender?: boolean | undefined;
292
+ dynamicInnerRef?: React.Ref<ReactList> | undefined;
293
+ dynamicRenderType?: "simple" | "uniform" | "variable" | undefined;
294
+ dynamicItemSizeEstimator?: ((index: number, cache: {}) => number) | undefined;
295
+ dynamicItemSizeGetter?: ((index: number) => number) | undefined;
296
+ dynamicRenderMinSize: number;
297
+ dynamicRenderUseStaticSize?: boolean | undefined;
298
+ dynamicRenderThreshold?: number | undefined;
299
+ dynamicRenderScrollParentGetter?: (() => JSX.Element) | undefined;
300
+ dynamicRenderScrollParentViewportSizeGetter?: (() => number) | undefined;
301
+ sortable: boolean;
302
+ externalSort: boolean;
303
+ disableSortReset?: boolean | undefined;
304
+ defaultOrder: OrderType;
305
+ highlightRows?: boolean | undefined;
306
+ stripedRows?: boolean | undefined;
307
+ headerMod?: "pre" | "multiline" | undefined;
308
+ };
309
+ static getIndexColumn<T extends HasHeaderFooterIndex>({ startIndex, data, visibleRowIndex, }: InternalProps<T>): Column<T>;
310
+ static getDerivedStateFromProps<T>(nextProps: InternalProps<T>): {
311
+ sortOrder?: NameToOrderTypeMap | undefined;
312
+ sortColumns?: string[] | undefined;
313
+ settings: {
314
+ stickyHead: HeadPositionInner;
315
+ stickyFooter: HeadPositionInner;
316
+ displayIndices: boolean;
317
+ stickyTop?: number | "auto" | undefined;
318
+ syncHeadOnResize?: boolean | undefined;
319
+ stickyBottom?: number | "auto" | undefined;
320
+ dynamicRender?: boolean | undefined;
321
+ dynamicInnerRef?: React.Ref<ReactList> | undefined;
322
+ dynamicRenderType?: "simple" | "uniform" | "variable" | undefined;
323
+ dynamicItemSizeEstimator?: ((index: number, cache: {}) => number) | undefined;
324
+ dynamicItemSizeGetter?: ((index: number) => number) | undefined;
325
+ dynamicRenderMinSize: number;
326
+ dynamicRenderUseStaticSize?: boolean | undefined;
327
+ dynamicRenderThreshold?: number | undefined;
328
+ dynamicRenderScrollParentGetter?: (() => JSX.Element) | undefined;
329
+ dynamicRenderScrollParentViewportSizeGetter?: (() => number) | undefined;
330
+ sortable: boolean;
331
+ externalSort: boolean;
332
+ disableSortReset?: boolean | undefined;
333
+ defaultOrder: OrderType;
334
+ highlightRows?: boolean | undefined;
335
+ stripedRows?: boolean | undefined;
336
+ headerMod?: "pre" | "multiline" | undefined;
337
+ };
338
+ indexColumn: false | Column<T>;
339
+ };
340
+ state: DataTableViewState<T>;
341
+ table?: Table<T>;
342
+ render(): JSX.Element;
343
+ _tableRef: (node: Table<T>) => void;
344
+ renderMemoizedCell: ({ column, value, row, index, footer, headerData }: CellProps<T>) => JSX.Element;
345
+ getColumn: (column: Column<T>, columnIndex: number) => {
346
+ sortable: boolean;
347
+ _className: string;
348
+ _getValue: (row: T) => any;
349
+ _getTitle: (row: T) => any;
350
+ _getSortValue: (row: T) => any;
351
+ _renderValue: (({ value, row, index, footer, headerData }: Omit<CellProps<T>, 'column'>) => JSX.Element) | (({ value }: Partial<CellProps<T>>) => any);
352
+ _getOnClick: ((data: {
353
+ row: T;
354
+ index: number;
355
+ footer?: boolean;
356
+ headerData?: boolean;
357
+ }) => () => void) | (() => undefined);
358
+ customStyle: ((props: import("./types").CustomStyleParams<T>) => React.CSSProperties) | (() => undefined);
359
+ group: boolean | undefined;
360
+ autogroup: boolean;
361
+ sortOrder: OrderType;
362
+ sortIndex: number | undefined;
363
+ name: string;
364
+ header?: React.ReactNode;
365
+ headerTitle?: string | undefined;
366
+ className?: string | undefined;
367
+ width?: string | number | undefined;
368
+ align?: import("./types").AlignType | undefined;
369
+ accessor?: string | ((row: T) => any) | undefined;
370
+ title?: string | ((row: T) => string) | undefined;
371
+ render?: ((props: {
372
+ value?: unknown;
373
+ row: T;
374
+ index: number;
375
+ footer?: boolean | undefined;
376
+ headerData?: boolean | undefined;
377
+ }) => React.ReactNode) | undefined;
378
+ onClick?: ((data: {
379
+ row: T;
380
+ index: number;
381
+ footer?: boolean | undefined;
382
+ headerData?: boolean | undefined;
383
+ }, column: Column<T>) => void) | undefined;
384
+ defaultOrder: OrderType;
385
+ sortAccessor?: string | ((row: T) => any) | undefined;
386
+ sortAscending?: import("./types").Comparator<T> | undefined;
387
+ sub?: Column<T>[] | undefined;
388
+ index: number;
389
+ columnIndex: number;
390
+ dataColumn: boolean;
391
+ };
392
+ getComplexColumns(columns: DataTableProps<T>['columns']): {
393
+ headColumns: HeadColumns<T>;
394
+ dataColumns: DataColumns<T>;
395
+ };
396
+ isSortEnabled: () => boolean;
397
+ onSort: (column?: SlimColumn | undefined, multisort?: boolean | undefined) => void;
398
+ resize(): void;
399
+ }
400
+ export declare type ColumnExtended<T> = ReturnType<DataTableView<T>['getColumn']> & {
401
+ headerTitle?: string;
402
+ };
403
+ declare type HeadCellColumn<T> = ColumnExtended<T> | (Column<T> & {
404
+ index?: number;
405
+ columnIndex?: number;
406
+ headerTitle?: string;
407
+ dataColumn?: boolean;
408
+ });
409
+ declare type HeadCellsType<T> = {
410
+ column: HeadCellColumn<T>;
411
+ itemLevel: number;
412
+ colSpan: number;
413
+ rowSpan: number;
414
+ };
415
+ declare type HeadColumnsItem<T> = HeadCellsType<T>[];
416
+ declare type HeadColumns<T> = HeadColumnsItem<T>[];
417
+ declare type DataColumns<T> = ColumnExtended<T>[];
418
+ interface TableColumns<T> {
419
+ headColumns: HeadColumns<T>;
420
+ dataColumns: DataColumns<T>;
421
+ }
422
+ export interface SortOrderWithSortColumns {
423
+ sortOrder: NameToOrderTypeMap;
424
+ sortColumns: string[];
425
+ }
426
+ export declare type NameToOrderTypeMap = {
427
+ [colName: string]: OrderType;
428
+ };
429
+ interface State {
430
+ error?: any;
431
+ }
432
+ interface HasHeaderFooterIndex {
433
+ footerIndex?: number;
434
+ headerIndex?: number;
435
+ id?: number;
436
+ }
437
+ export default class DataTable<T> extends React.PureComponent<DataTableProps<T>, State> {
438
+ static readonly FIXED = "fixed";
439
+ static readonly MOVING = "moving";
440
+ static readonly ASCENDING = 1;
441
+ static readonly DESCENDING = -1;
442
+ static readonly LEFT = "left";
443
+ static readonly CENTER = "center";
444
+ static readonly RIGHT = "right";
445
+ static setCustomIcons(customIcons: Partial<CustomIcons>): void;
446
+ table?: DataTableView<T>;
447
+ state: State;
448
+ componentDidMount(): void;
449
+ componentDidUpdate(prevProps: Readonly<DataTableProps<T>>): void;
450
+ componentDidCatch(error: unknown): void;
451
+ render(): JSX.Element;
452
+ _tableRef: (node: DataTableView<T>) => void;
453
+ resize(): void;
454
+ }
455
+ export {};