@snack-uikit/table 0.30.0 → 0.31.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.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,17 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # 0.31.0 (2025-02-27)
7
+
8
+
9
+ ### Features
10
+
11
+ * **FF-6236:** infinite scroll in table ([09afb22](https://github.com/cloud-ru-tech/snack-uikit/commit/09afb2234211802c86722e36e17b9161f912b9e8))
12
+
13
+
14
+
15
+
16
+
6
17
  # 0.30.0 (2025-02-26)
7
18
 
8
19
 
package/README.md CHANGED
@@ -120,9 +120,6 @@ const columnDefinitions: ColumnDefinition<TableData>[] = [
120
120
  | search | `{ initialState?: string; state?: string; placeholder?: string; loading?: boolean; onChange?(value: string): void; }` | 'Search'<br> <strong>loading</strong>: Состояние загрузки в строке поиска <br> <strong>onChange</strong>: Колбэк на изменение данных в строке поиска | Параметры отвечают за глобальный поиск в таблице <br> <strong>initialState</strong>: Начальное состояние строки поиска <br> <strong>state</strong>: Состояние строки поиска, жестко устанавливаемое снаружи <br> <strong>placeholder</strong>: Placeholder строки поиска |
121
121
  | enableFuzzySearch | `boolean` | - | Включить нечеткий поиск |
122
122
  | pageSize | `number` | 10 | Максимальное кол-во строк на страницу |
123
- | pagination | `{ state?: PaginationState; options?: number[]; optionsLabel?: string; onChange?(state: PaginationState): void; optionsRender?(value: string \| number, idx: number): string \| number; }` | 'Rows volume: ' <br> <strong>onChange</strong>: Колбэк на изменение пагинации | Параметры отвечают за пагинацию в таблице <br> <strong>state</strong>: Состояние строки поиска, жестко устанавливаемое снаружи <br> <strong>options</strong>: Варианты в выпадающем селекторе для установки кол-ва строк на страницу <br> <strong>optionsLabel</strong>: Текст для селектора кол-ва строк на страницу |
124
- | autoResetPageIndex | `boolean` | - | Автоматический сброс пагинации к первой странице при изменении данных или состояния (e.g фильтры, сортировки, и т.д) |
125
- | pageCount | `number` | - | Кол-во страниц (используется для внешнего управления) |
126
123
  | onRowClick | `RowClickHandler<TData>` | - | Колбэк клика по строке |
127
124
  | className | `string` | - | CSS-класс |
128
125
  | loading | `boolean` | - | Состояние загрузки |
@@ -140,15 +137,19 @@ const columnDefinitions: ColumnDefinition<TableData>[] = [
140
137
  | moreActions | `Action[]` | - | Элементы выпадающего списка кнопки с действиями |
141
138
  | toolbarAfter | `ReactNode` | - | Дополнительный слот в `Toolbar` после строки поиска |
142
139
  | exportSettings | `{ fileName: string; filterData?: boolean; exportToCSV?(args: ExportProps<TData>): void; exportToXLSX?(args: ExportProps<TData>): void; }` | - | Настройки экспорта в тулбаре |
143
- | suppressPagination | `boolean` | - | Отключение пагинации |
144
140
  | manualSorting | `boolean` | - | |
145
- | manualPagination | `boolean` | - | |
146
141
  | manualFiltering | `boolean` | - | |
147
142
  | getRowId | `(originalRow: TData, index: number, parent?: Row<TData>) => string` | - | Дополнительная функция используется для получения уникального идентификатора для любой заданной строки |
148
143
  | scrollRef | `RefObject<HTMLElement>` | - | Ссылка на элемент, обозначающий самый конец прокручиваемого списка |
149
144
  | scrollContainerRef | `RefObject<HTMLElement>` | - | Ссылка на контейнер, который скроллится |
150
145
  | rowPinning | `Pick<RowPinningState, "top">` | { top: [], } | Определение какие строки должны быть закреплены в таблице |
151
146
  | savedState | `{ id: string; resize?: boolean; }` | - | Конфиг для сохранения состояния в localStorage. <br> Поле id должно быть уникальным для разных таблиц в рамках приложения. <br> Для корректной работы необходимо наличие id в конфиге columnDefinitions |
147
+ | pagination | `{ state?: PaginationState; options?: number[]; optionsLabel?: string; onChange?(state: PaginationState): void; optionsRender?(value: string \| number, idx: number): string \| number; }` | 'Rows volume: ' <br> <strong>onChange</strong>: Колбэк на изменение пагинации | Параметры отвечают за пагинацию в таблице <br> <strong>state</strong>: Состояние строки поиска, жестко устанавливаемое снаружи <br> <strong>options</strong>: Варианты в выпадающем селекторе для установки кол-ва строк на страницу <br> <strong>optionsLabel</strong>: Текст для селектора кол-ва строк на страницу |
148
+ | autoResetPageIndex | `boolean` | - | Автоматический сброс пагинации к первой странице при изменении данных или состояния (e.g фильтры, сортировки, и т.д) |
149
+ | pageCount | `number` | - | Кол-во страниц (используется для внешнего управления) |
150
+ | infiniteLoading | `boolean` | - | Режим работы "бесконечной" загрузки |
151
+ | suppressPagination | `boolean` | - | Отключение пагинации |
152
+ | manualPagination | `boolean` | - | |
152
153
  ## Table.getStatusColumnDef
153
154
  Вспомогательная функция для создания ячейки со статусом
154
155
  ### Props
@@ -176,6 +177,9 @@ const columnDefinitions: ColumnDefinition<TableData>[] = [
176
177
  |------|------|---------------|-------------|
177
178
  | onChangePage* | `(offset: number, limit: number) => void` | - | |
178
179
  | columnDefinitions* | `ColumnDefinition<TData>[]` | - | Определение внешнего вида и функционала колонок |
180
+ | onRefresh | `() => void` | - | Колбек обновления данных |
181
+ | moreActions | `Action[]` | - | Элементы выпадающего списка кнопки с действиями |
182
+ | bulkActions | `BulkAction[]` | - | Список действия для массовых операций |
179
183
  | keepPinnedRows | `boolean` | false | Параметр отвечает за отображение закрепленных строк на всех страницах таблицы |
180
184
  | copyPinnedRows | `boolean` | false | Параметр отвечает за сохранение закрепленных строк в теле таблицы |
181
185
  | enableSelectPinned | `boolean` | - | Параметр отвечает за чекбокс выбора закрепленных строк |
@@ -183,11 +187,9 @@ const columnDefinitions: ColumnDefinition<TableData>[] = [
183
187
  | expanding | `{ getSubRows: (element: TData) => TData[]; expandingColumnDefinition: TreeColumnDefinitionProps<TData>; }` | - | Параметр отвечает за общие настройки раскрывающихся строк |
184
188
  | rowSelection | `{ initialState?: RowSelectionState; state?: RowSelectionState; enable?: boolean \| ((row: Row<TData>) => boolean); multiRow?: boolean; onChange?(state: RowSelectionState): void; }` | - | Параметры отвечают за возможность выбора строк <br> <strong>initialState</strong>: Начальное состояние выбора строк <br> <strong>state</strong>: Состояние выбора строк, жестко устанавливаемое снаружи <br> <strong>enable</strong>: Колбэк определяющий можно ли выбрать строку <br> <strong>multiRow</strong>: Мульти-выбор строк (включен по-умолчанию, когда включается выбор) <br> <strong>onChange</strong>: Колбэк на выбор строк |
185
189
  | enableFuzzySearch | `boolean` | - | Включить нечеткий поиск |
186
- | autoResetPageIndex | `boolean` | - | Автоматический сброс пагинации к первой странице при изменении данных или состояния (e.g фильтры, сортировки, и т.д) |
187
190
  | onRowClick | `RowClickHandler<TData>` | - | Колбэк клика по строке |
188
191
  | className | `string` | - | CSS-класс |
189
192
  | loading | `boolean` | - | Состояние загрузки |
190
- | onRefresh | `() => void` | - | Колбек обновления данных |
191
193
  | outline | `boolean` | - | Внешний бордер для тулбара и таблицы |
192
194
  | columnFilters | `ChipChoiceRowProps<TFilters>` | - | Фильтры |
193
195
  | dataFiltered | `boolean` | - | Флаг, показывающий что данные были отфильтрованы при пустых данных |
@@ -197,19 +199,19 @@ const columnDefinitions: ColumnDefinition<TableData>[] = [
197
199
  | errorDataState | `EmptyStateProps` | - | Экран при ошибке запроса |
198
200
  | suppressToolbar | `boolean` | - | Отключение тулбара |
199
201
  | suppressSearch | `boolean` | - | Отключение поиска |
200
- | bulkActions | `BulkAction[]` | - | Список действия для массовых операций |
201
- | moreActions | `Action[]` | - | Элементы выпадающего списка кнопки с действиями |
202
202
  | toolbarAfter | `ReactNode` | - | Дополнительный слот в `Toolbar` после строки поиска |
203
203
  | exportSettings | `{ fileName: string; filterData?: boolean; exportToCSV?(args: ExportProps<TData>): void; exportToXLSX?(args: ExportProps<TData>): void; }` | - | Настройки экспорта в тулбаре |
204
- | suppressPagination | `boolean` | - | Отключение пагинации |
205
204
  | manualSorting | `boolean` | true | |
206
- | manualPagination | `boolean` | true | |
207
205
  | manualFiltering | `boolean` | true | |
208
206
  | getRowId | `(originalRow: TData, index: number, parent?: Row<TData>) => string` | - | Дополнительная функция используется для получения уникального идентификатора для любой заданной строки |
209
207
  | scrollRef | `RefObject<HTMLElement>` | - | Ссылка на элемент, обозначающий самый конец прокручиваемого списка |
210
208
  | scrollContainerRef | `RefObject<HTMLElement>` | - | Ссылка на контейнер, который скроллится |
211
209
  | rowPinning | `Pick<RowPinningState, "top">` | - | Определение какие строки должны быть закреплены в таблице |
212
210
  | savedState | `{ id: string; resize?: boolean; }` | - | Конфиг для сохранения состояния в localStorage. <br> Поле id должно быть уникальным для разных таблиц в рамках приложения. <br> Для корректной работы необходимо наличие id в конфиге columnDefinitions |
211
+ | autoResetPageIndex | `boolean` | - | Автоматический сброс пагинации к первой странице при изменении данных или состояния (e.g фильтры, сортировки, и т.д) |
212
+ | suppressPagination | `boolean` | - | Отключение пагинации |
213
+ | manualPagination | `boolean` | true | |
214
+ | infiniteLoading | `never` | - | |
213
215
  | items | `TData[]` | - | Данные для отрисовки |
214
216
  | total | `number` | 10 | Общее кол-во строк |
215
217
  | limit | `number` | 10 | Кол-во строк на страницу |
@@ -1,7 +1,7 @@
1
1
  import { FiltersState } from '@snack-uikit/chips';
2
2
  import { TableProps } from '../types';
3
3
  /** Компонент таблицы */
4
- export declare function Table<TData extends object, TFilters extends FiltersState = Record<string, unknown>>({ data, rowPinning, columnDefinitions, keepPinnedRows, copyPinnedRows, enableSelectPinned, rowSelection: rowSelectionProp, search, sorting: sortingProp, columnFilters, pagination: paginationProp, className, onRowClick, onRefresh, pageSize, pageCount, loading, outline, moreActions, exportSettings, dataFiltered, dataError, noDataState, noResultsState, errorDataState, suppressToolbar, suppressSearch, toolbarAfter, suppressPagination, manualSorting, manualPagination, manualFiltering, autoResetPageIndex, scrollRef, scrollContainerRef, getRowId, enableFuzzySearch, savedState, expanding, bulkActions: bulkActionsProp, ...rest }: TableProps<TData, TFilters>): import("react/jsx-runtime").JSX.Element;
4
+ export declare function Table<TData extends object, TFilters extends FiltersState = Record<string, unknown>>({ data, rowPinning, columnDefinitions, keepPinnedRows, copyPinnedRows, enableSelectPinned, rowSelection: rowSelectionProp, search, sorting: sortingProp, columnFilters, pagination: paginationProp, className, onRowClick, onRefresh, pageSize, pageCount, loading, infiniteLoading, outline, moreActions, exportSettings, dataFiltered, dataError, noDataState, noResultsState, errorDataState, suppressToolbar, suppressSearch, toolbarAfter, suppressPagination, manualSorting, manualPagination: manualPaginationProp, manualFiltering, autoResetPageIndex, scrollRef, scrollContainerRef, getRowId, enableFuzzySearch, savedState, expanding, bulkActions: bulkActionsProp, ...rest }: TableProps<TData, TFilters>): import("react/jsx-runtime").JSX.Element;
5
5
  export declare namespace Table {
6
6
  var getStatusColumnDef: typeof import("../../helperComponents").getStatusColumnDef;
7
7
  var statusAppearances: Record<string, string>;
@@ -58,6 +58,7 @@ function Table(_a) {
58
58
  pageSize = constants_1.DEFAULT_PAGE_SIZE,
59
59
  pageCount,
60
60
  loading = false,
61
+ infiniteLoading = false,
61
62
  outline = false,
62
63
  moreActions,
63
64
  exportSettings,
@@ -71,7 +72,7 @@ function Table(_a) {
71
72
  toolbarAfter,
72
73
  suppressPagination = false,
73
74
  manualSorting = false,
74
- manualPagination = false,
75
+ manualPagination: manualPaginationProp = false,
75
76
  manualFiltering = false,
76
77
  autoResetPageIndex = false,
77
78
  scrollRef,
@@ -82,7 +83,7 @@ function Table(_a) {
82
83
  expanding,
83
84
  bulkActions: bulkActionsProp
84
85
  } = _a,
85
- rest = __rest(_a, ["data", "rowPinning", "columnDefinitions", "keepPinnedRows", "copyPinnedRows", "enableSelectPinned", "rowSelection", "search", "sorting", "columnFilters", "pagination", "className", "onRowClick", "onRefresh", "pageSize", "pageCount", "loading", "outline", "moreActions", "exportSettings", "dataFiltered", "dataError", "noDataState", "noResultsState", "errorDataState", "suppressToolbar", "suppressSearch", "toolbarAfter", "suppressPagination", "manualSorting", "manualPagination", "manualFiltering", "autoResetPageIndex", "scrollRef", "scrollContainerRef", "getRowId", "enableFuzzySearch", "savedState", "expanding", "bulkActions"]);
86
+ rest = __rest(_a, ["data", "rowPinning", "columnDefinitions", "keepPinnedRows", "copyPinnedRows", "enableSelectPinned", "rowSelection", "search", "sorting", "columnFilters", "pagination", "className", "onRowClick", "onRefresh", "pageSize", "pageCount", "loading", "infiniteLoading", "outline", "moreActions", "exportSettings", "dataFiltered", "dataError", "noDataState", "noResultsState", "errorDataState", "suppressToolbar", "suppressSearch", "toolbarAfter", "suppressPagination", "manualSorting", "manualPagination", "manualFiltering", "autoResetPageIndex", "scrollRef", "scrollContainerRef", "getRowId", "enableFuzzySearch", "savedState", "expanding", "bulkActions"]);
86
87
  const {
87
88
  state: globalFilter,
88
89
  onStateChange: onGlobalFilterChange
@@ -104,6 +105,7 @@ function Table(_a) {
104
105
  onStateChange: onPaginationChange
105
106
  } = (0, hooks_1.useStateControl)(paginationProp, defaultPaginationState);
106
107
  const enableSelection = Boolean(rowSelectionProp === null || rowSelectionProp === void 0 ? void 0 : rowSelectionProp.enable);
108
+ const manualPagination = infiniteLoading || manualPaginationProp;
107
109
  const tableColumns = (0, react_1.useMemo)(() => {
108
110
  let cols = columnDefinitions;
109
111
  if (enableSelection && !expanding) {
@@ -389,7 +391,7 @@ function Table(_a) {
389
391
  value: {
390
392
  table
391
393
  },
392
- children: loading ? (0, jsx_runtime_1.jsxs)(skeleton_1.SkeletonContextProvider, {
394
+ children: (!infiniteLoading || !data.length) && loading ? (0, jsx_runtime_1.jsxs)(skeleton_1.SkeletonContextProvider, {
393
395
  loading: true,
394
396
  children: [(0, jsx_runtime_1.jsx)(helperComponents_1.HeaderRow, {}), loadingTableRows.map(row => (0, jsx_runtime_1.jsx)(helperComponents_1.BodyRow, {
395
397
  row: row
@@ -404,7 +406,12 @@ function Table(_a) {
404
406
  }) : null, centerRows.map(row => (0, jsx_runtime_1.jsx)(helperComponents_1.BodyRow, {
405
407
  row: row,
406
408
  onRowClick: onRowClick
407
- }, row.id)), (0, jsx_runtime_1.jsx)(helperComponents_1.TableEmptyState, {
409
+ }, row.id)), data.length > 0 && infiniteLoading && loading && (0, jsx_runtime_1.jsx)(skeleton_1.SkeletonContextProvider, {
410
+ loading: true,
411
+ children: loadingTableRows.slice(0, 3).map(row => (0, jsx_runtime_1.jsx)(helperComponents_1.BodyRow, {
412
+ row: row
413
+ }, row.id))
414
+ }), (0, jsx_runtime_1.jsx)(helperComponents_1.TableEmptyState, {
408
415
  emptyStates: emptyStates,
409
416
  dataError: dataError,
410
417
  dataFiltered: dataFiltered || Boolean(table.getState().globalFilter),
@@ -417,7 +424,7 @@ function Table(_a) {
417
424
  ref: scrollRef
418
425
  })]
419
426
  })
420
- }), !suppressPagination && (0, jsx_runtime_1.jsx)(helperComponents_1.TablePagination, {
427
+ }), !infiniteLoading && !suppressPagination && (0, jsx_runtime_1.jsx)(helperComponents_1.TablePagination, {
421
428
  table: table,
422
429
  options: paginationProp === null || paginationProp === void 0 ? void 0 : paginationProp.options,
423
430
  optionsLabel: paginationProp === null || paginationProp === void 0 ? void 0 : paginationProp.optionsLabel,
@@ -9,7 +9,7 @@ import { ColumnDefinition } from '../types';
9
9
  type BulkAction = Omit<NonNullable<ToolbarProps<Record<string, string>>['bulkActions']>[number], 'onClick'> & {
10
10
  onClick?(selectionState: RowSelectionState, resetRowSelection: (defaultState?: boolean) => void): void;
11
11
  };
12
- export type TableProps<TData extends object, TFilters extends FiltersState = Record<string, unknown>> = WithSupportProps<{
12
+ type BaseTableProps<TData extends object, TFilters extends FiltersState = Record<string, unknown>> = WithSupportProps<{
13
13
  /** Данные для отрисовки */
14
14
  data: TData[];
15
15
  /** Определение внешнего вида и функционала колонок */
@@ -68,25 +68,6 @@ export type TableProps<TData extends object, TFilters extends FiltersState = Rec
68
68
  enableFuzzySearch?: boolean;
69
69
  /** Максимальное кол-во строк на страницу @default 10 */
70
70
  pageSize?: number;
71
- /** Параметры отвечают за пагинацию в таблице <br>
72
- * <strong>state</strong>: Состояние строки поиска, жестко устанавливаемое снаружи <br>
73
- * <strong>options</strong>: Варианты в выпадающем селекторе для установки кол-ва строк на страницу <br>
74
- * <strong>optionsLabel</strong>: Текст для селектора кол-ва строк на страницу @default 'Rows volume: ' <br>
75
- * <strong>onChange</strong>: Колбэк на изменение пагинации
76
- * */
77
- pagination?: {
78
- state?: PaginationState;
79
- options?: number[];
80
- optionsLabel?: string;
81
- onChange?(state: PaginationState): void;
82
- optionsRender?(value: string | number, idx: number): string | number;
83
- };
84
- /** Автоматический сброс пагинации к первой странице при изменении данных или состояния
85
- * (e.g фильтры, сортировки, и т.д)
86
- * */
87
- autoResetPageIndex?: boolean;
88
- /** Кол-во страниц (используется для внешнего управления) */
89
- pageCount?: number;
90
71
  /** Колбэк клика по строке */
91
72
  onRowClick?: RowClickHandler<TData>;
92
73
  /** CSS-класс */
@@ -121,10 +102,7 @@ export type TableProps<TData extends object, TFilters extends FiltersState = Rec
121
102
  toolbarAfter?: ReactNode;
122
103
  /** Настройки экспорта в тулбаре */
123
104
  exportSettings?: ExportButtonProps<TData>['settings'];
124
- /** Отключение пагинации */
125
- suppressPagination?: boolean;
126
105
  manualSorting?: boolean;
127
- manualPagination?: boolean;
128
106
  manualFiltering?: boolean;
129
107
  /** Дополнительная функция используется для получения уникального идентификатора для любой заданной строки */
130
108
  getRowId?: (originalRow: TData, index: number, parent?: Row<TData>) => string;
@@ -143,7 +121,43 @@ export type TableProps<TData extends object, TFilters extends FiltersState = Rec
143
121
  resize?: boolean;
144
122
  };
145
123
  }>;
146
- export type ServerTableProps<TData extends object, TFilters extends FiltersState = Record<string, unknown>> = Omit<TableProps<TData, TFilters>, 'pageSize' | 'pageCount' | 'pagination' | 'search' | 'data'> & {
124
+ export type InfiniteTableProps<TData extends object, TFilters extends FiltersState = Record<string, unknown>> = BaseTableProps<TData, TFilters> & {
125
+ pagination?: never;
126
+ autoResetPageIndex?: never;
127
+ pageCount?: never;
128
+ /** Режим работы "бесконечной" загрузки */
129
+ infiniteLoading?: boolean;
130
+ /** Отключение пагинации */
131
+ suppressPagination?: never;
132
+ manualPagination?: never;
133
+ };
134
+ export type ClientTableProps<TData extends object, TFilters extends FiltersState = Record<string, unknown>> = BaseTableProps<TData, TFilters> & {
135
+ /** Параметры отвечают за пагинацию в таблице <br>
136
+ * <strong>state</strong>: Состояние строки поиска, жестко устанавливаемое снаружи <br>
137
+ * <strong>options</strong>: Варианты в выпадающем селекторе для установки кол-ва строк на страницу <br>
138
+ * <strong>optionsLabel</strong>: Текст для селектора кол-ва строк на страницу @default 'Rows volume: ' <br>
139
+ * <strong>onChange</strong>: Колбэк на изменение пагинации
140
+ * */
141
+ pagination?: {
142
+ state?: PaginationState;
143
+ options?: number[];
144
+ optionsLabel?: string;
145
+ onChange?(state: PaginationState): void;
146
+ optionsRender?(value: string | number, idx: number): string | number;
147
+ };
148
+ /** Автоматический сброс пагинации к первой странице при изменении данных или состояния
149
+ * (e.g фильтры, сортировки, и т.д)
150
+ * */
151
+ autoResetPageIndex?: boolean;
152
+ /** Кол-во страниц (используется для внешнего управления) */
153
+ pageCount?: number;
154
+ /** Отключение пагинации */
155
+ suppressPagination?: boolean;
156
+ manualPagination?: boolean;
157
+ infiniteLoading?: never;
158
+ };
159
+ export type TableProps<TData extends object, TFilters extends FiltersState = Record<string, unknown>> = InfiniteTableProps<TData, TFilters> | ClientTableProps<TData, TFilters>;
160
+ export type ServerTableProps<TData extends object, TFilters extends FiltersState = Record<string, unknown>> = Omit<ClientTableProps<TData, TFilters>, 'pageSize' | 'pageCount' | 'pagination' | 'search' | 'data'> & {
147
161
  /** Данные для отрисовки */
148
162
  items?: TData[];
149
163
  /**
@@ -1,7 +1,7 @@
1
1
  import { FiltersState } from '@snack-uikit/chips';
2
2
  import { TableProps } from '../types';
3
3
  /** Компонент таблицы */
4
- export declare function Table<TData extends object, TFilters extends FiltersState = Record<string, unknown>>({ data, rowPinning, columnDefinitions, keepPinnedRows, copyPinnedRows, enableSelectPinned, rowSelection: rowSelectionProp, search, sorting: sortingProp, columnFilters, pagination: paginationProp, className, onRowClick, onRefresh, pageSize, pageCount, loading, outline, moreActions, exportSettings, dataFiltered, dataError, noDataState, noResultsState, errorDataState, suppressToolbar, suppressSearch, toolbarAfter, suppressPagination, manualSorting, manualPagination, manualFiltering, autoResetPageIndex, scrollRef, scrollContainerRef, getRowId, enableFuzzySearch, savedState, expanding, bulkActions: bulkActionsProp, ...rest }: TableProps<TData, TFilters>): import("react/jsx-runtime").JSX.Element;
4
+ export declare function Table<TData extends object, TFilters extends FiltersState = Record<string, unknown>>({ data, rowPinning, columnDefinitions, keepPinnedRows, copyPinnedRows, enableSelectPinned, rowSelection: rowSelectionProp, search, sorting: sortingProp, columnFilters, pagination: paginationProp, className, onRowClick, onRefresh, pageSize, pageCount, loading, infiniteLoading, outline, moreActions, exportSettings, dataFiltered, dataError, noDataState, noResultsState, errorDataState, suppressToolbar, suppressSearch, toolbarAfter, suppressPagination, manualSorting, manualPagination: manualPaginationProp, manualFiltering, autoResetPageIndex, scrollRef, scrollContainerRef, getRowId, enableFuzzySearch, savedState, expanding, bulkActions: bulkActionsProp, ...rest }: TableProps<TData, TFilters>): import("react/jsx-runtime").JSX.Element;
5
5
  export declare namespace Table {
6
6
  var getStatusColumnDef: typeof import("../../helperComponents").getStatusColumnDef;
7
7
  var statusAppearances: Record<string, string>;
@@ -32,7 +32,7 @@ import { getColumnStyleVars, getCurrentlyConfiguredHeaderWidth, getInitColumnSiz
32
32
  export function Table(_a) {
33
33
  var { data, rowPinning = {
34
34
  top: [],
35
- }, columnDefinitions, keepPinnedRows = false, copyPinnedRows = false, enableSelectPinned = false, rowSelection: rowSelectionProp, search, sorting: sortingProp, columnFilters, pagination: paginationProp, className, onRowClick, onRefresh, pageSize = DEFAULT_PAGE_SIZE, pageCount, loading = false, outline = false, moreActions, exportSettings, dataFiltered, dataError, noDataState, noResultsState, errorDataState, suppressToolbar = false, suppressSearch = false, toolbarAfter, suppressPagination = false, manualSorting = false, manualPagination = false, manualFiltering = false, autoResetPageIndex = false, scrollRef, scrollContainerRef, getRowId, enableFuzzySearch, savedState, expanding, bulkActions: bulkActionsProp } = _a, rest = __rest(_a, ["data", "rowPinning", "columnDefinitions", "keepPinnedRows", "copyPinnedRows", "enableSelectPinned", "rowSelection", "search", "sorting", "columnFilters", "pagination", "className", "onRowClick", "onRefresh", "pageSize", "pageCount", "loading", "outline", "moreActions", "exportSettings", "dataFiltered", "dataError", "noDataState", "noResultsState", "errorDataState", "suppressToolbar", "suppressSearch", "toolbarAfter", "suppressPagination", "manualSorting", "manualPagination", "manualFiltering", "autoResetPageIndex", "scrollRef", "scrollContainerRef", "getRowId", "enableFuzzySearch", "savedState", "expanding", "bulkActions"]);
35
+ }, columnDefinitions, keepPinnedRows = false, copyPinnedRows = false, enableSelectPinned = false, rowSelection: rowSelectionProp, search, sorting: sortingProp, columnFilters, pagination: paginationProp, className, onRowClick, onRefresh, pageSize = DEFAULT_PAGE_SIZE, pageCount, loading = false, infiniteLoading = false, outline = false, moreActions, exportSettings, dataFiltered, dataError, noDataState, noResultsState, errorDataState, suppressToolbar = false, suppressSearch = false, toolbarAfter, suppressPagination = false, manualSorting = false, manualPagination: manualPaginationProp = false, manualFiltering = false, autoResetPageIndex = false, scrollRef, scrollContainerRef, getRowId, enableFuzzySearch, savedState, expanding, bulkActions: bulkActionsProp } = _a, rest = __rest(_a, ["data", "rowPinning", "columnDefinitions", "keepPinnedRows", "copyPinnedRows", "enableSelectPinned", "rowSelection", "search", "sorting", "columnFilters", "pagination", "className", "onRowClick", "onRefresh", "pageSize", "pageCount", "loading", "infiniteLoading", "outline", "moreActions", "exportSettings", "dataFiltered", "dataError", "noDataState", "noResultsState", "errorDataState", "suppressToolbar", "suppressSearch", "toolbarAfter", "suppressPagination", "manualSorting", "manualPagination", "manualFiltering", "autoResetPageIndex", "scrollRef", "scrollContainerRef", "getRowId", "enableFuzzySearch", "savedState", "expanding", "bulkActions"]);
36
36
  const { state: globalFilter, onStateChange: onGlobalFilterChange } = useStateControl(search, '');
37
37
  const { state: rowSelection, onStateChange: onRowSelectionChange } = useStateControl(rowSelectionProp, {});
38
38
  const defaultPaginationState = useMemo(() => ({
@@ -42,6 +42,7 @@ export function Table(_a) {
42
42
  const { state: sorting, onStateChange: onSortingChange } = useStateControl(sortingProp, []);
43
43
  const { state: pagination, onStateChange: onPaginationChange } = useStateControl(paginationProp, defaultPaginationState);
44
44
  const enableSelection = Boolean(rowSelectionProp === null || rowSelectionProp === void 0 ? void 0 : rowSelectionProp.enable);
45
+ const manualPagination = infiniteLoading || manualPaginationProp;
45
46
  const tableColumns = useMemo(() => {
46
47
  let cols = columnDefinitions;
47
48
  if (enableSelection && !expanding) {
@@ -249,7 +250,7 @@ export function Table(_a) {
249
250
  onChange: onGlobalFilterChange,
250
251
  loading: search === null || search === void 0 ? void 0 : search.loading,
251
252
  placeholder: (search === null || search === void 0 ? void 0 : search.placeholder) || t('searchPlaceholder'),
252
- }, className: styles.toolbar, onRefresh: onRefresh ? handleOnRefresh : undefined, bulkActions: bulkActions, selectionMode: (rowSelectionProp === null || rowSelectionProp === void 0 ? void 0 : rowSelectionProp.multiRow) ? 'multiple' : 'single', checked: table.getIsAllPageRowsSelected(), indeterminate: table.getIsSomePageRowsSelected(), onCheck: enableSelection ? handleOnToolbarCheck : undefined, outline: outline, after: toolbarAfter || exportSettings ? (_jsxs(_Fragment, { children: [toolbarAfter, exportSettings && (_jsx(ExportButton, { settings: exportSettings, columnDefinitions: columnDefinitions, data: data, topRows: filteredTopRows, centerRows: centerRows }))] })) : undefined, moreActions: moreActions, filterRow: columnFilters, "data-test-id": TEST_IDS.toolbar }) })), _jsx("div", { className: styles.scrollWrapper, "data-outline": outline || undefined, children: _jsxs(Scroll, { size: 's', className: styles.table, ref: scrollContainerRef, children: [_jsx("div", { className: styles.tableContent, style: columnSizes.vars, children: _jsx(TableContext.Provider, { value: { table }, children: loading ? (_jsxs(SkeletonContextProvider, { loading: true, children: [_jsx(HeaderRow, {}), loadingTableRows.map(row => (_jsx(BodyRow, { row: row }, row.id)))] })) : (_jsxs(_Fragment, { children: [centerRows.length || filteredTopRows.length ? _jsx(HeaderRow, {}) : null, filteredTopRows.length ? (_jsx("div", { className: styles.topRowWrapper, children: filteredTopRows.map(row => (_jsx(BodyRow, { row: row, onRowClick: onRowClick }, row.id))) })) : null, centerRows.map(row => (_jsx(BodyRow, { row: row, onRowClick: onRowClick }, row.id))), _jsx(TableEmptyState, { emptyStates: emptyStates, dataError: dataError, dataFiltered: dataFiltered || Boolean(table.getState().globalFilter), tableRowsLength: tableRows.length + filteredTopRows.length })] })) }) }), _jsx("div", { className: styles.scrollStub, ref: scrollRef })] }) }), !suppressPagination && (_jsx(TablePagination, { table: table, options: paginationProp === null || paginationProp === void 0 ? void 0 : paginationProp.options, optionsLabel: paginationProp === null || paginationProp === void 0 ? void 0 : paginationProp.optionsLabel, pageCount: pageCount, optionsRender: paginationProp === null || paginationProp === void 0 ? void 0 : paginationProp.optionsRender }))] })) }));
253
+ }, className: styles.toolbar, onRefresh: onRefresh ? handleOnRefresh : undefined, bulkActions: bulkActions, selectionMode: (rowSelectionProp === null || rowSelectionProp === void 0 ? void 0 : rowSelectionProp.multiRow) ? 'multiple' : 'single', checked: table.getIsAllPageRowsSelected(), indeterminate: table.getIsSomePageRowsSelected(), onCheck: enableSelection ? handleOnToolbarCheck : undefined, outline: outline, after: toolbarAfter || exportSettings ? (_jsxs(_Fragment, { children: [toolbarAfter, exportSettings && (_jsx(ExportButton, { settings: exportSettings, columnDefinitions: columnDefinitions, data: data, topRows: filteredTopRows, centerRows: centerRows }))] })) : undefined, moreActions: moreActions, filterRow: columnFilters, "data-test-id": TEST_IDS.toolbar }) })), _jsx("div", { className: styles.scrollWrapper, "data-outline": outline || undefined, children: _jsxs(Scroll, { size: 's', className: styles.table, ref: scrollContainerRef, children: [_jsx("div", { className: styles.tableContent, style: columnSizes.vars, children: _jsx(TableContext.Provider, { value: { table }, children: (!infiniteLoading || !data.length) && loading ? (_jsxs(SkeletonContextProvider, { loading: true, children: [_jsx(HeaderRow, {}), loadingTableRows.map(row => (_jsx(BodyRow, { row: row }, row.id)))] })) : (_jsxs(_Fragment, { children: [centerRows.length || filteredTopRows.length ? _jsx(HeaderRow, {}) : null, filteredTopRows.length ? (_jsx("div", { className: styles.topRowWrapper, children: filteredTopRows.map(row => (_jsx(BodyRow, { row: row, onRowClick: onRowClick }, row.id))) })) : null, centerRows.map(row => (_jsx(BodyRow, { row: row, onRowClick: onRowClick }, row.id))), data.length > 0 && infiniteLoading && loading && (_jsx(SkeletonContextProvider, { loading: true, children: loadingTableRows.slice(0, 3).map(row => (_jsx(BodyRow, { row: row }, row.id))) })), _jsx(TableEmptyState, { emptyStates: emptyStates, dataError: dataError, dataFiltered: dataFiltered || Boolean(table.getState().globalFilter), tableRowsLength: tableRows.length + filteredTopRows.length })] })) }) }), _jsx("div", { className: styles.scrollStub, ref: scrollRef })] }) }), !infiniteLoading && !suppressPagination && (_jsx(TablePagination, { table: table, options: paginationProp === null || paginationProp === void 0 ? void 0 : paginationProp.options, optionsLabel: paginationProp === null || paginationProp === void 0 ? void 0 : paginationProp.optionsLabel, pageCount: pageCount, optionsRender: paginationProp === null || paginationProp === void 0 ? void 0 : paginationProp.optionsRender }))] })) }));
253
254
  }
254
255
  Table.getStatusColumnDef = getStatusColumnDef;
255
256
  Table.statusAppearances = STATUS_APPEARANCE;
@@ -9,7 +9,7 @@ import { ColumnDefinition } from '../types';
9
9
  type BulkAction = Omit<NonNullable<ToolbarProps<Record<string, string>>['bulkActions']>[number], 'onClick'> & {
10
10
  onClick?(selectionState: RowSelectionState, resetRowSelection: (defaultState?: boolean) => void): void;
11
11
  };
12
- export type TableProps<TData extends object, TFilters extends FiltersState = Record<string, unknown>> = WithSupportProps<{
12
+ type BaseTableProps<TData extends object, TFilters extends FiltersState = Record<string, unknown>> = WithSupportProps<{
13
13
  /** Данные для отрисовки */
14
14
  data: TData[];
15
15
  /** Определение внешнего вида и функционала колонок */
@@ -68,25 +68,6 @@ export type TableProps<TData extends object, TFilters extends FiltersState = Rec
68
68
  enableFuzzySearch?: boolean;
69
69
  /** Максимальное кол-во строк на страницу @default 10 */
70
70
  pageSize?: number;
71
- /** Параметры отвечают за пагинацию в таблице <br>
72
- * <strong>state</strong>: Состояние строки поиска, жестко устанавливаемое снаружи <br>
73
- * <strong>options</strong>: Варианты в выпадающем селекторе для установки кол-ва строк на страницу <br>
74
- * <strong>optionsLabel</strong>: Текст для селектора кол-ва строк на страницу @default 'Rows volume: ' <br>
75
- * <strong>onChange</strong>: Колбэк на изменение пагинации
76
- * */
77
- pagination?: {
78
- state?: PaginationState;
79
- options?: number[];
80
- optionsLabel?: string;
81
- onChange?(state: PaginationState): void;
82
- optionsRender?(value: string | number, idx: number): string | number;
83
- };
84
- /** Автоматический сброс пагинации к первой странице при изменении данных или состояния
85
- * (e.g фильтры, сортировки, и т.д)
86
- * */
87
- autoResetPageIndex?: boolean;
88
- /** Кол-во страниц (используется для внешнего управления) */
89
- pageCount?: number;
90
71
  /** Колбэк клика по строке */
91
72
  onRowClick?: RowClickHandler<TData>;
92
73
  /** CSS-класс */
@@ -121,10 +102,7 @@ export type TableProps<TData extends object, TFilters extends FiltersState = Rec
121
102
  toolbarAfter?: ReactNode;
122
103
  /** Настройки экспорта в тулбаре */
123
104
  exportSettings?: ExportButtonProps<TData>['settings'];
124
- /** Отключение пагинации */
125
- suppressPagination?: boolean;
126
105
  manualSorting?: boolean;
127
- manualPagination?: boolean;
128
106
  manualFiltering?: boolean;
129
107
  /** Дополнительная функция используется для получения уникального идентификатора для любой заданной строки */
130
108
  getRowId?: (originalRow: TData, index: number, parent?: Row<TData>) => string;
@@ -143,7 +121,43 @@ export type TableProps<TData extends object, TFilters extends FiltersState = Rec
143
121
  resize?: boolean;
144
122
  };
145
123
  }>;
146
- export type ServerTableProps<TData extends object, TFilters extends FiltersState = Record<string, unknown>> = Omit<TableProps<TData, TFilters>, 'pageSize' | 'pageCount' | 'pagination' | 'search' | 'data'> & {
124
+ export type InfiniteTableProps<TData extends object, TFilters extends FiltersState = Record<string, unknown>> = BaseTableProps<TData, TFilters> & {
125
+ pagination?: never;
126
+ autoResetPageIndex?: never;
127
+ pageCount?: never;
128
+ /** Режим работы "бесконечной" загрузки */
129
+ infiniteLoading?: boolean;
130
+ /** Отключение пагинации */
131
+ suppressPagination?: never;
132
+ manualPagination?: never;
133
+ };
134
+ export type ClientTableProps<TData extends object, TFilters extends FiltersState = Record<string, unknown>> = BaseTableProps<TData, TFilters> & {
135
+ /** Параметры отвечают за пагинацию в таблице <br>
136
+ * <strong>state</strong>: Состояние строки поиска, жестко устанавливаемое снаружи <br>
137
+ * <strong>options</strong>: Варианты в выпадающем селекторе для установки кол-ва строк на страницу <br>
138
+ * <strong>optionsLabel</strong>: Текст для селектора кол-ва строк на страницу @default 'Rows volume: ' <br>
139
+ * <strong>onChange</strong>: Колбэк на изменение пагинации
140
+ * */
141
+ pagination?: {
142
+ state?: PaginationState;
143
+ options?: number[];
144
+ optionsLabel?: string;
145
+ onChange?(state: PaginationState): void;
146
+ optionsRender?(value: string | number, idx: number): string | number;
147
+ };
148
+ /** Автоматический сброс пагинации к первой странице при изменении данных или состояния
149
+ * (e.g фильтры, сортировки, и т.д)
150
+ * */
151
+ autoResetPageIndex?: boolean;
152
+ /** Кол-во страниц (используется для внешнего управления) */
153
+ pageCount?: number;
154
+ /** Отключение пагинации */
155
+ suppressPagination?: boolean;
156
+ manualPagination?: boolean;
157
+ infiniteLoading?: never;
158
+ };
159
+ export type TableProps<TData extends object, TFilters extends FiltersState = Record<string, unknown>> = InfiniteTableProps<TData, TFilters> | ClientTableProps<TData, TFilters>;
160
+ export type ServerTableProps<TData extends object, TFilters extends FiltersState = Record<string, unknown>> = Omit<ClientTableProps<TData, TFilters>, 'pageSize' | 'pageCount' | 'pagination' | 'search' | 'data'> & {
147
161
  /** Данные для отрисовки */
148
162
  items?: TData[];
149
163
  /**
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "access": "public"
5
5
  },
6
6
  "title": "Table",
7
- "version": "0.30.0",
7
+ "version": "0.31.0",
8
8
  "sideEffects": [
9
9
  "*.css",
10
10
  "*.woff",
@@ -61,5 +61,5 @@
61
61
  "peerDependencies": {
62
62
  "@snack-uikit/locale": "*"
63
63
  },
64
- "gitHead": "afb93f86dbab6039f4c267a9d0e85350b59053c5"
64
+ "gitHead": "a430ef0cef6ce5141115be672073fca746f2d7fa"
65
65
  }
@@ -74,6 +74,7 @@ export function Table<TData extends object, TFilters extends FiltersState = Reco
74
74
  pageSize = DEFAULT_PAGE_SIZE,
75
75
  pageCount,
76
76
  loading = false,
77
+ infiniteLoading = false,
77
78
  outline = false,
78
79
  moreActions,
79
80
  exportSettings,
@@ -87,7 +88,7 @@ export function Table<TData extends object, TFilters extends FiltersState = Reco
87
88
  toolbarAfter,
88
89
  suppressPagination = false,
89
90
  manualSorting = false,
90
- manualPagination = false,
91
+ manualPagination: manualPaginationProp = false,
91
92
  manualFiltering = false,
92
93
  autoResetPageIndex = false,
93
94
  scrollRef,
@@ -119,6 +120,8 @@ export function Table<TData extends object, TFilters extends FiltersState = Reco
119
120
  );
120
121
  const enableSelection = Boolean(rowSelectionProp?.enable);
121
122
 
123
+ const manualPagination = infiniteLoading || manualPaginationProp;
124
+
122
125
  const tableColumns: ColumnDefinition<TData>[] = useMemo(() => {
123
126
  let cols: ColumnDefinition<TData>[] = columnDefinitions;
124
127
  if (enableSelection && !expanding) {
@@ -418,7 +421,7 @@ export function Table<TData extends object, TFilters extends FiltersState = Reco
418
421
  <Scroll size='s' className={styles.table} ref={scrollContainerRef}>
419
422
  <div className={styles.tableContent} style={columnSizes.vars}>
420
423
  <TableContext.Provider value={{ table }}>
421
- {loading ? (
424
+ {(!infiniteLoading || !data.length) && loading ? (
422
425
  <SkeletonContextProvider loading>
423
426
  <HeaderRow />
424
427
  {loadingTableRows.map(row => (
@@ -441,6 +444,14 @@ export function Table<TData extends object, TFilters extends FiltersState = Reco
441
444
  <BodyRow key={row.id} row={row} onRowClick={onRowClick} />
442
445
  ))}
443
446
 
447
+ {data.length > 0 && infiniteLoading && loading && (
448
+ <SkeletonContextProvider loading>
449
+ {loadingTableRows.slice(0, 3).map(row => (
450
+ <BodyRow key={row.id} row={row} />
451
+ ))}
452
+ </SkeletonContextProvider>
453
+ )}
454
+
444
455
  <TableEmptyState
445
456
  emptyStates={emptyStates}
446
457
  dataError={dataError}
@@ -455,7 +466,7 @@ export function Table<TData extends object, TFilters extends FiltersState = Reco
455
466
  </Scroll>
456
467
  </div>
457
468
 
458
- {!suppressPagination && (
469
+ {!infiniteLoading && !suppressPagination && (
459
470
  <TablePagination
460
471
  table={table}
461
472
  options={paginationProp?.options}
@@ -20,10 +20,7 @@ type BulkAction = Omit<NonNullable<ToolbarProps<Record<string, string>>['bulkAct
20
20
  onClick?(selectionState: RowSelectionState, resetRowSelection: (defaultState?: boolean) => void): void;
21
21
  };
22
22
 
23
- export type TableProps<
24
- TData extends object,
25
- TFilters extends FiltersState = Record<string, unknown>,
26
- > = WithSupportProps<{
23
+ type BaseTableProps<TData extends object, TFilters extends FiltersState = Record<string, unknown>> = WithSupportProps<{
27
24
  /** Данные для отрисовки */
28
25
  data: TData[];
29
26
  /** Определение внешнего вида и функционала колонок */
@@ -86,28 +83,6 @@ export type TableProps<
86
83
  /** Максимальное кол-во строк на страницу @default 10 */
87
84
  pageSize?: number;
88
85
 
89
- /** Параметры отвечают за пагинацию в таблице <br>
90
- * <strong>state</strong>: Состояние строки поиска, жестко устанавливаемое снаружи <br>
91
- * <strong>options</strong>: Варианты в выпадающем селекторе для установки кол-ва строк на страницу <br>
92
- * <strong>optionsLabel</strong>: Текст для селектора кол-ва строк на страницу @default 'Rows volume: ' <br>
93
- * <strong>onChange</strong>: Колбэк на изменение пагинации
94
- * */
95
- pagination?: {
96
- state?: PaginationState;
97
- options?: number[];
98
- optionsLabel?: string;
99
- onChange?(state: PaginationState): void;
100
- optionsRender?(value: string | number, idx: number): string | number;
101
- };
102
-
103
- /** Автоматический сброс пагинации к первой странице при изменении данных или состояния
104
- * (e.g фильтры, сортировки, и т.д)
105
- * */
106
- autoResetPageIndex?: boolean;
107
-
108
- /** Кол-во страниц (используется для внешнего управления) */
109
- pageCount?: number;
110
-
111
86
  /** Колбэк клика по строке */
112
87
  onRowClick?: RowClickHandler<TData>;
113
88
  /** CSS-класс */
@@ -150,12 +125,8 @@ export type TableProps<
150
125
  /** Настройки экспорта в тулбаре */
151
126
  exportSettings?: ExportButtonProps<TData>['settings'];
152
127
 
153
- /** Отключение пагинации */
154
- suppressPagination?: boolean;
155
-
156
128
  // Вынести это на пропсы
157
129
  manualSorting?: boolean;
158
- manualPagination?: boolean;
159
130
  manualFiltering?: boolean;
160
131
 
161
132
  /** Дополнительная функция используется для получения уникального идентификатора для любой заданной строки */
@@ -178,8 +149,63 @@ export type TableProps<
178
149
  };
179
150
  }>;
180
151
 
152
+ export type InfiniteTableProps<
153
+ TData extends object,
154
+ TFilters extends FiltersState = Record<string, unknown>,
155
+ > = BaseTableProps<TData, TFilters> & {
156
+ pagination?: never;
157
+ autoResetPageIndex?: never;
158
+ pageCount?: never;
159
+
160
+ /** Режим работы "бесконечной" загрузки */
161
+ infiniteLoading?: boolean;
162
+
163
+ /** Отключение пагинации */
164
+ suppressPagination?: never;
165
+
166
+ manualPagination?: never;
167
+ };
168
+
169
+ export type ClientTableProps<
170
+ TData extends object,
171
+ TFilters extends FiltersState = Record<string, unknown>,
172
+ > = BaseTableProps<TData, TFilters> & {
173
+ /** Параметры отвечают за пагинацию в таблице <br>
174
+ * <strong>state</strong>: Состояние строки поиска, жестко устанавливаемое снаружи <br>
175
+ * <strong>options</strong>: Варианты в выпадающем селекторе для установки кол-ва строк на страницу <br>
176
+ * <strong>optionsLabel</strong>: Текст для селектора кол-ва строк на страницу @default 'Rows volume: ' <br>
177
+ * <strong>onChange</strong>: Колбэк на изменение пагинации
178
+ * */
179
+ pagination?: {
180
+ state?: PaginationState;
181
+ options?: number[];
182
+ optionsLabel?: string;
183
+ onChange?(state: PaginationState): void;
184
+ optionsRender?(value: string | number, idx: number): string | number;
185
+ };
186
+
187
+ /** Автоматический сброс пагинации к первой странице при изменении данных или состояния
188
+ * (e.g фильтры, сортировки, и т.д)
189
+ * */
190
+ autoResetPageIndex?: boolean;
191
+
192
+ /** Кол-во страниц (используется для внешнего управления) */
193
+ pageCount?: number;
194
+
195
+ /** Отключение пагинации */
196
+ suppressPagination?: boolean;
197
+
198
+ manualPagination?: boolean;
199
+
200
+ infiniteLoading?: never;
201
+ };
202
+
203
+ export type TableProps<TData extends object, TFilters extends FiltersState = Record<string, unknown>> =
204
+ | InfiniteTableProps<TData, TFilters>
205
+ | ClientTableProps<TData, TFilters>;
206
+
181
207
  export type ServerTableProps<TData extends object, TFilters extends FiltersState = Record<string, unknown>> = Omit<
182
- TableProps<TData, TFilters>,
208
+ ClientTableProps<TData, TFilters>,
183
209
  'pageSize' | 'pageCount' | 'pagination' | 'search' | 'data'
184
210
  > & {
185
211
  /** Данные для отрисовки */