@snack-uikit/table 0.14.4 → 0.14.6-preview-2484f987.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 +12 -0
- package/README.md +11 -1
- package/dist/components/ServerTable/ServerTable.d.ts +14 -44
- package/dist/components/ServerTable/ServerTable.js +12 -7
- package/dist/components/Table/Table.d.ts +2 -100
- package/dist/components/Table/Table.js +21 -74
- package/dist/components/Table/hooks/index.d.ts +2 -0
- package/dist/components/Table/hooks/index.js +2 -0
- package/dist/components/Table/hooks/useLoadingTable.d.ts +11 -0
- package/dist/components/Table/hooks/useLoadingTable.js +18 -0
- package/dist/components/Table/hooks/useStateControl.d.ts +8 -0
- package/dist/components/Table/hooks/useStateControl.js +13 -0
- package/dist/components/Table/hooks/useTable.d.ts +10 -0
- package/dist/components/Table/hooks/useTable.js +75 -0
- package/dist/components/Table/styles.module.css +7 -0
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.js +1 -0
- package/dist/components/types.d.ts +148 -0
- package/dist/components/types.js +1 -0
- package/dist/helperComponents/TableEmptyState/hooks.d.ts +10 -0
- package/dist/helperComponents/TableEmptyState/hooks.js +16 -0
- package/dist/{components → helperComponents}/TableEmptyState/index.d.ts +1 -0
- package/dist/{components → helperComponents}/TableEmptyState/index.js +1 -0
- package/dist/helperComponents/index.d.ts +2 -0
- package/dist/helperComponents/index.js +2 -0
- package/dist/types.d.ts +1 -1
- package/package.json +10 -10
- package/src/components/ServerTable/ServerTable.tsx +25 -56
- package/src/components/Table/Table.tsx +42 -249
- package/src/components/Table/hooks/index.ts +2 -0
- package/src/components/Table/hooks/useLoadingTable.tsx +38 -0
- package/src/components/Table/hooks/useStateControl.ts +21 -0
- package/src/components/Table/hooks/useTable.tsx +132 -0
- package/src/components/Table/styles.module.scss +11 -3
- package/src/components/index.ts +1 -0
- package/src/components/types.ts +176 -0
- package/src/helperComponents/TableEmptyState/hooks.ts +46 -0
- package/src/{components → helperComponents}/TableEmptyState/index.ts +1 -0
- package/src/helperComponents/index.ts +2 -0
- package/src/types.ts +1 -1
- package/dist/components/Table/hooks.d.ts +0 -28
- package/dist/components/Table/hooks.js +0 -52
- package/src/components/Table/hooks.tsx +0 -110
- /package/dist/{components → helperComponents}/TableEmptyState/TableEmptyState.d.ts +0 -0
- /package/dist/{components → helperComponents}/TableEmptyState/TableEmptyState.js +0 -0
- /package/dist/{components → helperComponents}/TableEmptyState/styles.module.css +0 -0
- /package/dist/{components → helperComponents}/TablePagination/TablePagination.d.ts +0 -0
- /package/dist/{components → helperComponents}/TablePagination/TablePagination.js +0 -0
- /package/dist/{components → helperComponents}/TablePagination/index.d.ts +0 -0
- /package/dist/{components → helperComponents}/TablePagination/index.js +0 -0
- /package/dist/{components → helperComponents}/TablePagination/styles.module.css +0 -0
- /package/src/{components → helperComponents}/TableEmptyState/TableEmptyState.tsx +0 -0
- /package/src/{components → helperComponents}/TableEmptyState/styles.module.scss +0 -0
- /package/src/{components → helperComponents}/TablePagination/TablePagination.tsx +0 -0
- /package/src/{components → helperComponents}/TablePagination/index.ts +0 -0
- /package/src/{components → helperComponents}/TablePagination/styles.module.scss +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,18 @@
|
|
|
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.14.5 (2024-02-23)
|
|
7
|
+
|
|
8
|
+
### Only dependencies have been changed
|
|
9
|
+
* [@snack-uikit/chips@0.11.9](https://github.com/cloud-ru-tech/snack-uikit/blob/master/packages/chips/CHANGELOG.md)
|
|
10
|
+
* [@snack-uikit/list@0.4.0](https://github.com/cloud-ru-tech/snack-uikit/blob/master/packages/list/CHANGELOG.md)
|
|
11
|
+
* [@snack-uikit/tag@0.8.0](https://github.com/cloud-ru-tech/snack-uikit/blob/master/packages/tag/CHANGELOG.md)
|
|
12
|
+
* [@snack-uikit/toolbar@0.7.13](https://github.com/cloud-ru-tech/snack-uikit/blob/master/packages/toolbar/CHANGELOG.md)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
6
18
|
## 0.14.4 (2024-02-22)
|
|
7
19
|
|
|
8
20
|
### Only dependencies have been changed
|
package/README.md
CHANGED
|
@@ -134,6 +134,11 @@ const columnDefinitions: ColumnDefinition<TableData>[] = [
|
|
|
134
134
|
| suppressToolbar | `boolean` | - | Отключение тулбара |
|
|
135
135
|
| toolbarBefore | `ReactNode` | - | Дополнительный слот в `Toolbar` перед строкой поиска |
|
|
136
136
|
| suppressPagination | `boolean` | - | Отключение пагинации |
|
|
137
|
+
| manualSorting | `boolean` | - | |
|
|
138
|
+
| manualPagination | `boolean` | - | |
|
|
139
|
+
| manualFiltering | `boolean` | - | |
|
|
140
|
+
| scrollRef | `RefObject<HTMLElement>` | - | Ссылка на элемент, обозначающий самый конец прокручиваемого списка |
|
|
141
|
+
| scrollContainerRef | `RefObject<HTMLElement>` | - | Ссылка на контейнер, который скроллится |
|
|
137
142
|
## Table.getStatusColumnDef
|
|
138
143
|
Вспомогательная функция для создания ячейки со статусом
|
|
139
144
|
### Props
|
|
@@ -157,7 +162,6 @@ const columnDefinitions: ColumnDefinition<TableData>[] = [
|
|
|
157
162
|
### Props
|
|
158
163
|
| name | type | default value | description |
|
|
159
164
|
|------|------|---------------|-------------|
|
|
160
|
-
| search* | `{ initialValue?: 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 строки поиска |
|
|
161
165
|
| onChangePage* | `(offset: number, limit: number) => void` | - | |
|
|
162
166
|
| columnDefinitions* | `ColumnDefinition<TData>[]` | - | Определение внешнего вида и функционала колонок |
|
|
163
167
|
| loading | `boolean` | - | Состояние загрузки |
|
|
@@ -179,10 +183,16 @@ const columnDefinitions: ColumnDefinition<TableData>[] = [
|
|
|
179
183
|
| suppressToolbar | `boolean` | - | Отключение тулбара |
|
|
180
184
|
| toolbarBefore | `ReactNode` | - | Дополнительный слот в `Toolbar` перед строкой поиска |
|
|
181
185
|
| suppressPagination | `boolean` | - | Отключение пагинации |
|
|
186
|
+
| manualSorting | `boolean` | true | |
|
|
187
|
+
| manualPagination | `boolean` | true | |
|
|
188
|
+
| manualFiltering | `boolean` | true | |
|
|
189
|
+
| scrollRef | `RefObject<HTMLElement>` | - | Ссылка на элемент, обозначающий самый конец прокручиваемого списка |
|
|
190
|
+
| scrollContainerRef | `RefObject<HTMLElement>` | - | Ссылка на контейнер, который скроллится |
|
|
182
191
|
| items | `TData[]` | - | Данные для отрисовки |
|
|
183
192
|
| total | `number` | 10 | Общее кол-во строк |
|
|
184
193
|
| limit | `number` | 10 | Кол-во строк на страницу |
|
|
185
194
|
| offset | `number` | - | Смещение |
|
|
195
|
+
| search | `{ initialValue?: 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 строки поиска |
|
|
186
196
|
| pagination | `{ options?: number[]; optionsLabel?: string; }` | 'Rows volume' <br> | Параметры отвечают за пагинацию в таблице <br> <strong>options</strong>: Варианты в выпадающем селекторе для установки кол-ва строк на страницу<br> <strong>optionsLabel</strong>: Текст для селектора кол-ва строк на страницу |
|
|
187
197
|
## ServerTable.getRowActionsColumnDef
|
|
188
198
|
Вспомогательная функция для создания ячейки с дополнительными действиями у строки
|
|
@@ -1,48 +1,18 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export
|
|
3
|
-
/** Данные для отрисовки */
|
|
4
|
-
items?: TData[];
|
|
5
|
-
/**
|
|
6
|
-
* Общее кол-во строк
|
|
7
|
-
* @default 10
|
|
8
|
-
*/
|
|
9
|
-
total?: number;
|
|
10
|
-
/**
|
|
11
|
-
* Кол-во строк на страницу
|
|
12
|
-
* @default 10
|
|
13
|
-
*/
|
|
14
|
-
limit?: number;
|
|
15
|
-
/**
|
|
16
|
-
* Смещение
|
|
17
|
-
* @default 0
|
|
18
|
-
* */
|
|
19
|
-
offset?: number;
|
|
20
|
-
onChangePage(offset: number, limit: number): void;
|
|
21
|
-
/** Параметры отвечают за глобальный поиск в таблице <br>
|
|
22
|
-
* <strong>initialState</strong>: Начальное состояние строки поиска <br>
|
|
23
|
-
* <strong>state</strong>: Состояние строки поиска, жестко устанавливаемое снаружи <br>
|
|
24
|
-
* <strong>placeholder</strong>: Placeholder строки поиска @default 'Search...'<br>
|
|
25
|
-
* <strong>loading</strong>: Состояние загрузки в строке поиска <br>
|
|
26
|
-
* <strong>onChange</strong>: Колбэк на изменение данных в строке поиска
|
|
27
|
-
* */
|
|
28
|
-
search: {
|
|
29
|
-
initialValue?: string;
|
|
30
|
-
state: string;
|
|
31
|
-
placeholder?: string;
|
|
32
|
-
loading?: boolean;
|
|
33
|
-
onChange(value: string): void;
|
|
34
|
-
};
|
|
35
|
-
/** Параметры отвечают за пагинацию в таблице <br>
|
|
36
|
-
* <strong>options</strong>: Варианты в выпадающем селекторе для установки кол-ва строк на страницу<br>
|
|
37
|
-
* <strong>optionsLabel</strong>: Текст для селектора кол-ва строк на страницу @default 'Rows volume' <br>
|
|
38
|
-
* */
|
|
39
|
-
pagination?: {
|
|
40
|
-
options?: number[];
|
|
41
|
-
optionsLabel?: string;
|
|
42
|
-
};
|
|
43
|
-
};
|
|
44
|
-
export declare function ServerTable<TData extends object>({ items, total, limit, offset, onChangePage, search, pagination, columnFilters, ...rest }: ServerTableProps<TData>): import("react/jsx-runtime").JSX.Element;
|
|
1
|
+
import { ServerTableProps } from '../types';
|
|
2
|
+
export declare function ServerTable<TData extends object>({ items, total, limit, offset, onChangePage, search: searchProp, pagination, columnFilters, manualSorting, manualPagination, manualFiltering, ...rest }: ServerTableProps<TData>): import("react/jsx-runtime").JSX.Element;
|
|
45
3
|
export declare namespace ServerTable {
|
|
46
4
|
var getRowActionsColumnDef: typeof import("../../helperComponents").getRowActionsColumnDef;
|
|
5
|
+
var statusAppearances: {
|
|
6
|
+
readonly Primary: "primary";
|
|
7
|
+
readonly Neutral: "neutral";
|
|
8
|
+
readonly Red: "red";
|
|
9
|
+
readonly Orange: "orange";
|
|
10
|
+
readonly Yellow: "yellow";
|
|
11
|
+
readonly Green: "green";
|
|
12
|
+
readonly Blue: "blue";
|
|
13
|
+
readonly Violet: "violet";
|
|
14
|
+
readonly Pink: "pink";
|
|
15
|
+
readonly Loading: "loading";
|
|
16
|
+
};
|
|
47
17
|
var getStatusColumnDef: typeof import("../../helperComponents").getStatusColumnDef;
|
|
48
18
|
}
|
|
@@ -11,28 +11,33 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
11
11
|
};
|
|
12
12
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
13
13
|
import { useCallback, useMemo, useState } from 'react';
|
|
14
|
+
import { useUncontrolledProp } from 'uncontrollable';
|
|
15
|
+
import { STATUS_APPEARANCE } from '../../helperComponents';
|
|
14
16
|
import { Table } from '../Table';
|
|
15
17
|
import { DEFAULT_PAGINATION_LIMIT } from './constants';
|
|
16
18
|
import { onSearchDebounced } from './utils';
|
|
17
19
|
export function ServerTable(_a) {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
+
// добавить uncontrolledState
|
|
21
|
+
var { items, total = DEFAULT_PAGINATION_LIMIT, limit = DEFAULT_PAGINATION_LIMIT, offset = 0, onChangePage, search: searchProp, pagination, columnFilters, manualSorting = true, manualPagination = true, manualFiltering = true } = _a, rest = __rest(_a, ["items", "total", "limit", "offset", "onChangePage", "search", "pagination", "columnFilters", "manualSorting", "manualPagination", "manualFiltering"]);
|
|
22
|
+
const [search, setSearch] = useUncontrolledProp(searchProp === null || searchProp === void 0 ? void 0 : searchProp.state, searchProp === null || searchProp === void 0 ? void 0 : searchProp.initialValue, searchProp === null || searchProp === void 0 ? void 0 : searchProp.onChange);
|
|
23
|
+
const [tempSearch, setTempSearch] = useState(search || '');
|
|
20
24
|
const handleSearch = useCallback((newValue) => {
|
|
21
25
|
setTempSearch(newValue);
|
|
22
|
-
onSearchDebounced()(newValue.trim(),
|
|
23
|
-
}, [
|
|
26
|
+
onSearchDebounced()(newValue.trim(), setSearch);
|
|
27
|
+
}, [setSearch]);
|
|
24
28
|
const handlePageChange = useCallback(({ pageSize, pageIndex }) => onChangePage(pageIndex * pageSize, pageSize), [onChangePage]);
|
|
25
29
|
const pageIndex = useMemo(() => Math.floor(offset / limit), [limit, offset]);
|
|
26
30
|
const pageCount = useMemo(() => Math.ceil(total / limit), [limit, total]);
|
|
27
31
|
return (_jsx(Table, Object.assign({}, rest, { data: items || [], search: {
|
|
28
32
|
state: tempSearch,
|
|
29
33
|
onChange: handleSearch,
|
|
30
|
-
loading:
|
|
31
|
-
placeholder:
|
|
34
|
+
loading: searchProp === null || searchProp === void 0 ? void 0 : searchProp.loading,
|
|
35
|
+
placeholder: searchProp === null || searchProp === void 0 ? void 0 : searchProp.placeholder,
|
|
32
36
|
}, columnFilters: columnFilters, pageCount: pageCount, pagination: Object.assign(Object.assign({}, pagination), { state: {
|
|
33
37
|
pageIndex,
|
|
34
38
|
pageSize: limit,
|
|
35
|
-
}, onChange: handlePageChange }), pageSize: limit })));
|
|
39
|
+
}, onChange: handlePageChange }), pageSize: limit, manualSorting: manualSorting, manualFiltering: manualFiltering, manualPagination: manualPagination })));
|
|
36
40
|
}
|
|
37
41
|
ServerTable.getRowActionsColumnDef = Table.getRowActionsColumnDef;
|
|
42
|
+
ServerTable.statusAppearances = STATUS_APPEARANCE;
|
|
38
43
|
ServerTable.getStatusColumnDef = Table.getStatusColumnDef;
|
|
@@ -1,104 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { ReactNode } from 'react';
|
|
3
|
-
import { ToolbarProps } from '@snack-uikit/toolbar';
|
|
4
|
-
import { WithSupportProps } from '@snack-uikit/utils';
|
|
5
|
-
import { RowClickHandler } from '../../helperComponents';
|
|
6
|
-
import { ColumnDefinition } from '../../types';
|
|
7
|
-
import { EmptyStateProps } from '../TableEmptyState';
|
|
8
|
-
export type TableProps<TData extends object> = WithSupportProps<{
|
|
9
|
-
/** Данные для отрисовки */
|
|
10
|
-
data: TData[];
|
|
11
|
-
/** Определение внешнего вида и функционала колонок */
|
|
12
|
-
columnDefinitions: ColumnDefinition<TData>[];
|
|
13
|
-
/** Параметры отвечают за возможность сортировки, их стоит использовать если нужно отслеживать состояние <br>
|
|
14
|
-
* <strong>initialState</strong>: Начальное состояние сортировки <br>
|
|
15
|
-
* <strong>state</strong>: Состояние сортировки, жестко устанавливаемое снаружи <br>
|
|
16
|
-
* <strong>onChange</strong>: Колбэк на изменение сортировки
|
|
17
|
-
* */
|
|
18
|
-
sorting?: {
|
|
19
|
-
initialState?: SortingState;
|
|
20
|
-
state?: SortingState;
|
|
21
|
-
onChange?(state: SortingState): void;
|
|
22
|
-
};
|
|
23
|
-
/** Параметры отвечают за возможность выбора строк <br>
|
|
24
|
-
* <strong>initialState</strong>: Начальное состояние выбора строк <br>
|
|
25
|
-
* <strong>state</strong>: Состояние выбора строк, жестко устанавливаемое снаружи <br>
|
|
26
|
-
* <strong>enable</strong>: Колбэк определяющий можно ли выбрать строку <br>
|
|
27
|
-
* <strong>multiRow</strong>: Мульти-выбор строк (включен по-умолчанию, когда включается выбор) <br>
|
|
28
|
-
* <strong>onChange</strong>: Колбэк на выбор строк
|
|
29
|
-
* */
|
|
30
|
-
rowSelection?: {
|
|
31
|
-
initialState?: RowSelectionState;
|
|
32
|
-
state?: RowSelectionState;
|
|
33
|
-
enable?: RowSelectionOptions<TData>['enableRowSelection'];
|
|
34
|
-
multiRow?: boolean;
|
|
35
|
-
onChange?(state: RowSelectionState): void;
|
|
36
|
-
};
|
|
37
|
-
/** Параметры отвечают за глобальный поиск в таблице <br>
|
|
38
|
-
* <strong>initialState</strong>: Начальное состояние строки поиска <br>
|
|
39
|
-
* <strong>state</strong>: Состояние строки поиска, жестко устанавливаемое снаружи <br>
|
|
40
|
-
* <strong>placeholder</strong>: Placeholder строки поиска @default 'Search'<br>
|
|
41
|
-
* <strong>loading</strong>: Состояние загрузки в строке поиска <br>
|
|
42
|
-
* <strong>onChange</strong>: Колбэк на изменение данных в строке поиска
|
|
43
|
-
* */
|
|
44
|
-
search?: {
|
|
45
|
-
initialValue?: string;
|
|
46
|
-
state?: string;
|
|
47
|
-
placeholder?: string;
|
|
48
|
-
loading?: boolean;
|
|
49
|
-
onChange?(value: string): void;
|
|
50
|
-
};
|
|
51
|
-
/** Максимальное кол-во строк на страницу @default 10 */
|
|
52
|
-
pageSize?: number;
|
|
53
|
-
/** Параметры отвечают за пагинацию в таблице <br>
|
|
54
|
-
* <strong>state</strong>: Состояние строки поиска, жестко устанавливаемое снаружи <br>
|
|
55
|
-
* <strong>options</strong>: Варианты в выпадающем селекторе для установки кол-ва строк на страницу <br>
|
|
56
|
-
* <strong>optionsLabel</strong>: Текст для селектора кол-ва строк на страницу @default 'Rows volume: ' <br>
|
|
57
|
-
* <strong>onChange</strong>: Колбэк на изменение пагинации
|
|
58
|
-
* */
|
|
59
|
-
pagination?: {
|
|
60
|
-
state?: PaginationState;
|
|
61
|
-
options?: number[];
|
|
62
|
-
optionsLabel?: string;
|
|
63
|
-
onChange?(state: PaginationState): void;
|
|
64
|
-
};
|
|
65
|
-
/** Кол-во страниц (используется для внешнего управления) */
|
|
66
|
-
pageCount?: number;
|
|
67
|
-
/** Колбэк клика по строке */
|
|
68
|
-
onRowClick?: RowClickHandler<TData>;
|
|
69
|
-
/** CSS-класс */
|
|
70
|
-
className?: string;
|
|
71
|
-
/** Состояние загрузки */
|
|
72
|
-
loading?: boolean;
|
|
73
|
-
/** Колбек обновления данных */
|
|
74
|
-
onRefresh?(): void;
|
|
75
|
-
/** Колбек удаления выбранных */
|
|
76
|
-
onDelete?(selectionState: RowSelectionState, resetRowSelection: (defaultState?: boolean) => void): void;
|
|
77
|
-
/** Внешний бордер для тулбара и таблицы */
|
|
78
|
-
outline?: boolean;
|
|
79
|
-
/** Фильтры */
|
|
80
|
-
columnFilters?: ReactNode;
|
|
81
|
-
dataFiltered?: boolean;
|
|
82
|
-
dataError?: boolean;
|
|
83
|
-
/** Название файла при экспорте CSV/XLSX */
|
|
84
|
-
exportFileName?: string;
|
|
85
|
-
/** Элементы выпадающего списка кнопки с действиями */
|
|
86
|
-
moreActions?: ToolbarProps['moreActions'];
|
|
87
|
-
/** Экран при отстутствии данных */
|
|
88
|
-
noDataState?: EmptyStateProps;
|
|
89
|
-
/** Экран при отстутствии результатов поиска или фильтров */
|
|
90
|
-
noResultsState?: EmptyStateProps;
|
|
91
|
-
/** Экран при ошибке запроса */
|
|
92
|
-
errorDataState?: EmptyStateProps;
|
|
93
|
-
/** Отключение тулбара */
|
|
94
|
-
suppressToolbar?: boolean;
|
|
95
|
-
/** Дополнительный слот в `Toolbar` перед строкой поиска */
|
|
96
|
-
toolbarBefore?: ReactNode;
|
|
97
|
-
/** Отключение пагинации */
|
|
98
|
-
suppressPagination?: boolean;
|
|
99
|
-
}>;
|
|
1
|
+
import { TableProps } from '../types';
|
|
100
2
|
/** Компонент таблицы */
|
|
101
|
-
export declare function Table<TData extends object>({ data, columnDefinitions, rowSelection
|
|
3
|
+
export declare function Table<TData extends object>({ data, columnDefinitions, rowSelection, search, sorting, columnFilters, pagination, className, onRowClick, onRefresh, onDelete, pageSize, pageCount, loading, outline, moreActions, exportFileName, dataFiltered, dataError, noDataState, noResultsState, errorDataState, suppressToolbar, toolbarBefore, suppressPagination, manualSorting, manualPagination, manualFiltering, scrollRef, scrollContainerRef, ...rest }: TableProps<TData>): import("react/jsx-runtime").JSX.Element;
|
|
102
4
|
export declare namespace Table {
|
|
103
5
|
var getStatusColumnDef: typeof import("../../helperComponents").getStatusColumnDef;
|
|
104
6
|
var statusAppearances: {
|
|
@@ -10,87 +10,31 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
10
10
|
return t;
|
|
11
11
|
};
|
|
12
12
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
13
|
-
import { getCoreRowModel, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, useReactTable, } from '@tanstack/react-table';
|
|
14
13
|
import cn from 'classnames';
|
|
15
|
-
import { useCallback, useMemo } from 'react';
|
|
14
|
+
import { useCallback, useEffect, useMemo } from 'react';
|
|
16
15
|
import { useLocale } from '@snack-uikit/locale';
|
|
17
16
|
import { Scroll } from '@snack-uikit/scroll';
|
|
18
17
|
import { SkeletonContextProvider } from '@snack-uikit/skeleton';
|
|
19
18
|
import { Toolbar } from '@snack-uikit/toolbar';
|
|
20
|
-
import { TruncateString } from '@snack-uikit/truncate-string';
|
|
21
19
|
import { extractSupportProps } from '@snack-uikit/utils';
|
|
22
20
|
import { DEFAULT_PAGE_SIZE } from '../../constants';
|
|
23
|
-
import { BodyRow, ExportButton, getColumnId, getRowActionsColumnDef,
|
|
24
|
-
import {
|
|
25
|
-
import { TableEmptyState } from '../TableEmptyState';
|
|
26
|
-
import { TablePagination } from '../TablePagination';
|
|
27
|
-
import { useEmptyState, useLoadingTable, useStateControl } from './hooks';
|
|
21
|
+
import { BodyRow, ExportButton, getColumnId, getRowActionsColumnDef, getStatusColumnDef, HeaderRow, STATUS_APPEARANCE, TableContext, TableEmptyState, TablePagination, useEmptyState, } from '../../helperComponents';
|
|
22
|
+
import { useLoadingTable, useTable } from './hooks';
|
|
28
23
|
import styles from './styles.module.css';
|
|
29
24
|
/** Компонент таблицы */
|
|
30
25
|
export function Table(_a) {
|
|
31
|
-
var { data, columnDefinitions, rowSelection
|
|
32
|
-
const {
|
|
33
|
-
const { state: rowSelection, onStateChange: onRowSelectionChange } = useStateControl(rowSelectionProp, {});
|
|
34
|
-
const defaultPaginationState = useMemo(() => ({
|
|
35
|
-
pageIndex: 0,
|
|
36
|
-
pageSize,
|
|
37
|
-
}), [pageSize]);
|
|
38
|
-
const { state: sorting, onStateChange: onSortingChange } = useStateControl(sortingProp, []);
|
|
39
|
-
const { state: pagination, onStateChange: onPaginationChange } = useStateControl(paginationProp, defaultPaginationState);
|
|
40
|
-
const enableSelection = Boolean(rowSelectionProp === null || rowSelectionProp === void 0 ? void 0 : rowSelectionProp.enable);
|
|
41
|
-
const tableColumns = useMemo(() => {
|
|
42
|
-
let cols = columnDefinitions;
|
|
43
|
-
if (enableSelection) {
|
|
44
|
-
cols = [getSelectionCellColumnDef(), ...cols];
|
|
45
|
-
}
|
|
46
|
-
return cols;
|
|
47
|
-
}, [columnDefinitions, enableSelection]);
|
|
48
|
-
const columnPinning = useMemo(() => {
|
|
49
|
-
var _a;
|
|
50
|
-
const pinningState = { left: [], right: [] };
|
|
51
|
-
for (const col of tableColumns) {
|
|
52
|
-
const id = getColumnId(col);
|
|
53
|
-
if (col.pinned && id) {
|
|
54
|
-
(_a = pinningState[col.pinned]) === null || _a === void 0 ? void 0 : _a.push(id);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
return pinningState;
|
|
58
|
-
}, [tableColumns]);
|
|
59
|
-
const table = useReactTable({
|
|
26
|
+
var { data, columnDefinitions, rowSelection, search, sorting, columnFilters, pagination, className, onRowClick, onRefresh, onDelete, pageSize = DEFAULT_PAGE_SIZE, pageCount, loading = false, outline = false, moreActions, exportFileName, dataFiltered, dataError, noDataState, noResultsState, errorDataState, suppressToolbar = false, toolbarBefore, suppressPagination = false, manualSorting = false, manualPagination = false, manualFiltering = false, scrollRef, scrollContainerRef } = _a, rest = __rest(_a, ["data", "columnDefinitions", "rowSelection", "search", "sorting", "columnFilters", "pagination", "className", "onRowClick", "onRefresh", "onDelete", "pageSize", "pageCount", "loading", "outline", "moreActions", "exportFileName", "dataFiltered", "dataError", "noDataState", "noResultsState", "errorDataState", "suppressToolbar", "toolbarBefore", "suppressPagination", "manualSorting", "manualPagination", "manualFiltering", "scrollRef", "scrollContainerRef"]);
|
|
27
|
+
const { table, tableColumns, columnPinning } = useTable({
|
|
60
28
|
data,
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
},
|
|
29
|
+
sorting,
|
|
30
|
+
manualFiltering,
|
|
31
|
+
manualPagination,
|
|
32
|
+
manualSorting,
|
|
33
|
+
columnDefinitions,
|
|
34
|
+
rowSelection,
|
|
35
|
+
pagination,
|
|
69
36
|
pageCount,
|
|
70
|
-
|
|
71
|
-
enableSorting: false,
|
|
72
|
-
enableResizing: false,
|
|
73
|
-
minSize: 40,
|
|
74
|
-
cell: (cell) => _jsx(TruncateString, { text: String(cell.getValue()), maxLines: 1 }),
|
|
75
|
-
},
|
|
76
|
-
manualSorting: Boolean(pageCount),
|
|
77
|
-
manualPagination: pageCount !== undefined,
|
|
78
|
-
manualFiltering: Boolean(pageCount),
|
|
79
|
-
globalFilterFn: fuzzyFilter,
|
|
80
|
-
onGlobalFilterChange,
|
|
81
|
-
onRowSelectionChange,
|
|
82
|
-
enableRowSelection: rowSelectionProp === null || rowSelectionProp === void 0 ? void 0 : rowSelectionProp.enable,
|
|
83
|
-
enableMultiRowSelection: rowSelectionProp === null || rowSelectionProp === void 0 ? void 0 : rowSelectionProp.multiRow,
|
|
84
|
-
enableFilters: true,
|
|
85
|
-
getFilteredRowModel: getFilteredRowModel(),
|
|
86
|
-
enableColumnResizing: true,
|
|
87
|
-
enableSorting: true,
|
|
88
|
-
enableMultiSort: true,
|
|
89
|
-
onSortingChange,
|
|
90
|
-
getSortedRowModel: getSortedRowModel(),
|
|
91
|
-
onPaginationChange,
|
|
92
|
-
getPaginationRowModel: getPaginationRowModel(),
|
|
93
|
-
getCoreRowModel: getCoreRowModel(),
|
|
37
|
+
pageSize,
|
|
94
38
|
});
|
|
95
39
|
const { loadingTable } = useLoadingTable({ pageSize, columnDefinitions: tableColumns, columnPinning });
|
|
96
40
|
const handleOnRefresh = useCallback(() => {
|
|
@@ -106,7 +50,7 @@ export function Table(_a) {
|
|
|
106
50
|
}
|
|
107
51
|
}, [loading, onDelete, table]);
|
|
108
52
|
const handleOnCheck = useCallback(() => {
|
|
109
|
-
if (!loading && (
|
|
53
|
+
if (!loading && (rowSelection === null || rowSelection === void 0 ? void 0 : rowSelection.multiRow)) {
|
|
110
54
|
table.toggleAllPageRowsSelected();
|
|
111
55
|
return;
|
|
112
56
|
}
|
|
@@ -114,7 +58,8 @@ export function Table(_a) {
|
|
|
114
58
|
table.resetRowSelection();
|
|
115
59
|
return;
|
|
116
60
|
}
|
|
117
|
-
}, [loading,
|
|
61
|
+
}, [loading, rowSelection === null || rowSelection === void 0 ? void 0 : rowSelection.multiRow, table]);
|
|
62
|
+
useEffect(() => { }, []);
|
|
118
63
|
const columnSizeVars = useMemo(() => {
|
|
119
64
|
const originalColumnDefs = table._getColumnDefs();
|
|
120
65
|
const headers = table.getFlatHeaders();
|
|
@@ -147,14 +92,16 @@ export function Table(_a) {
|
|
|
147
92
|
const tempPageSize = !suppressPagination ? tablePagination === null || tablePagination === void 0 ? void 0 : tablePagination.pageSize : pageSize;
|
|
148
93
|
return !tableRows.length ? Math.min(Math.max(tempPageSize, 5), DEFAULT_PAGE_SIZE) : tempPageSize;
|
|
149
94
|
}, [pageSize, suppressPagination, tablePagination === null || tablePagination === void 0 ? void 0 : tablePagination.pageSize, tableRows.length]);
|
|
95
|
+
const enableSelection = Boolean(rowSelection === null || rowSelection === void 0 ? void 0 : rowSelection.enable);
|
|
150
96
|
return (_jsx(_Fragment, { children: _jsxs("div", Object.assign({ style: {
|
|
151
97
|
'--page-size': cssPageSize,
|
|
98
|
+
width: table.getTotalSize(),
|
|
152
99
|
}, className: cn(styles.wrapper, className) }, extractSupportProps(rest), { children: [!suppressToolbar && (_jsxs("div", { className: styles.header, children: [_jsx(Toolbar, { search: {
|
|
153
|
-
value: globalFilter,
|
|
154
|
-
onChange:
|
|
100
|
+
value: table.getState().globalFilter,
|
|
101
|
+
onChange: table.setGlobalFilter,
|
|
155
102
|
loading: search === null || search === void 0 ? void 0 : search.loading,
|
|
156
103
|
placeholder: (search === null || search === void 0 ? void 0 : search.placeholder) || t('searchPlaceholder'),
|
|
157
|
-
}, checked: table.getIsAllPageRowsSelected(), indeterminate: table.getIsSomePageRowsSelected(), className: styles.toolbar, onRefresh: onRefresh ? handleOnRefresh : undefined, onDelete: enableSelection && onDelete ? handleOnDelete : undefined, onCheck: enableSelection ? handleOnCheck : undefined, outline: outline, selectionMode: (
|
|
104
|
+
}, checked: table.getIsAllPageRowsSelected(), indeterminate: table.getIsSomePageRowsSelected(), className: styles.toolbar, onRefresh: onRefresh ? handleOnRefresh : undefined, onDelete: enableSelection && onDelete ? handleOnDelete : undefined, onCheck: enableSelection ? handleOnCheck : undefined, outline: outline, selectionMode: (rowSelection === null || rowSelection === void 0 ? void 0 : rowSelection.multiRow) ? 'multiple' : 'single', before: toolbarBefore, after: exportFileName ? (_jsx(ExportButton, { fileName: exportFileName, columnDefinitions: columnDefinitions, data: data })) : undefined, moreActions: moreActions }), columnFilters && _jsxs("div", { className: styles.filtersWrapper, children: [" ", columnFilters, " "] })] })), _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: columnSizeVars, 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: [tableRows.length ? _jsx(HeaderRow, {}) : null, tableRows.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 })] })) }) }), _jsx("div", { className: styles.scrollStub, ref: scrollRef })] }) }), !suppressPagination && (_jsx(TablePagination, { table: table, options: pagination === null || pagination === void 0 ? void 0 : pagination.options, optionsLabel: pagination === null || pagination === void 0 ? void 0 : pagination.optionsLabel, pageCount: pageCount }))] })) }));
|
|
158
105
|
}
|
|
159
106
|
Table.getStatusColumnDef = getStatusColumnDef;
|
|
160
107
|
Table.statusAppearances = STATUS_APPEARANCE;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ColumnPinningState } from '@tanstack/react-table';
|
|
2
|
+
import { ColumnDefinition } from '../../../types';
|
|
3
|
+
type UseLoadingTableProps<TData> = {
|
|
4
|
+
columnDefinitions: ColumnDefinition<TData>[];
|
|
5
|
+
pageSize: number;
|
|
6
|
+
columnPinning: ColumnPinningState;
|
|
7
|
+
};
|
|
8
|
+
export declare function useLoadingTable<TData>({ pageSize, columnDefinitions, columnPinning }: UseLoadingTableProps<TData>): {
|
|
9
|
+
loadingTable: import("@tanstack/react-table").Table<TData>;
|
|
10
|
+
};
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { getCoreRowModel, useReactTable } from '@tanstack/react-table';
|
|
3
|
+
import { useMemo } from 'react';
|
|
4
|
+
import { SkeletonText } from '@snack-uikit/skeleton';
|
|
5
|
+
import styles from '../styles.module.css';
|
|
6
|
+
export function useLoadingTable({ pageSize, columnDefinitions, columnPinning }) {
|
|
7
|
+
const data = useMemo(() => (Array.from({ length: pageSize }).map(() => '') || []), [pageSize]);
|
|
8
|
+
const columns = useMemo(() => columnDefinitions.map(column => (Object.assign(Object.assign({}, column), { cell: () => _jsx(SkeletonText, { className: styles.skeleton, lines: 1, width: '100%' }) }))), [columnDefinitions]);
|
|
9
|
+
const loadingTable = useReactTable({
|
|
10
|
+
data,
|
|
11
|
+
columns,
|
|
12
|
+
state: {
|
|
13
|
+
columnPinning,
|
|
14
|
+
},
|
|
15
|
+
getCoreRowModel: getCoreRowModel(),
|
|
16
|
+
});
|
|
17
|
+
return { loadingTable };
|
|
18
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { useUncontrolledProp } from 'uncontrollable';
|
|
2
|
+
export function useStateControl(control, defaultState) {
|
|
3
|
+
var _a, _b;
|
|
4
|
+
const [state, onStateChange] = useUncontrolledProp(control === null || control === void 0 ? void 0 : control.state, (_b = (_a = control === null || control === void 0 ? void 0 : control.state) !== null && _a !== void 0 ? _a : control === null || control === void 0 ? void 0 : control.initialState) !== null && _b !== void 0 ? _b : defaultState, (controlState) => {
|
|
5
|
+
var _a;
|
|
6
|
+
const newState = typeof controlState === 'function' ? controlState(state) : controlState;
|
|
7
|
+
(_a = control === null || control === void 0 ? void 0 : control.onChange) === null || _a === void 0 ? void 0 : _a.call(control, newState);
|
|
8
|
+
});
|
|
9
|
+
return {
|
|
10
|
+
state,
|
|
11
|
+
onStateChange,
|
|
12
|
+
};
|
|
13
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ColumnPinningState } from '@tanstack/react-table';
|
|
2
|
+
import { ColumnDefinition } from '../../../types';
|
|
3
|
+
import { TableProps } from '../../types';
|
|
4
|
+
type UseTableProps<TData extends object> = Pick<TableProps<TData>, 'search' | 'rowSelection' | 'sorting' | 'pagination' | 'pageSize' | 'columnDefinitions' | 'data' | 'manualFiltering' | 'manualSorting' | 'manualPagination' | 'pageCount'>;
|
|
5
|
+
export declare function useTable<TData extends object>({ search, pageSize, pagination: paginationProp, rowSelection: rowSelectionProp, sorting: sortingProp, columnDefinitions, manualFiltering, manualPagination, manualSorting, pageCount, data, }: UseTableProps<TData>): {
|
|
6
|
+
table: import("@tanstack/react-table").Table<TData>;
|
|
7
|
+
tableColumns: ColumnDefinition<TData>[];
|
|
8
|
+
columnPinning: Required<ColumnPinningState>;
|
|
9
|
+
};
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { getCoreRowModel, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, useReactTable, } from '@tanstack/react-table';
|
|
3
|
+
import { useMemo } from 'react';
|
|
4
|
+
import { TruncateString } from '@snack-uikit/truncate-string';
|
|
5
|
+
import { DEFAULT_PAGE_SIZE } from '../../../constants';
|
|
6
|
+
import { getColumnId, getSelectionCellColumnDef } from '../../../helperComponents';
|
|
7
|
+
import { fuzzyFilter } from '../../../utils';
|
|
8
|
+
import { useStateControl } from './useStateControl';
|
|
9
|
+
export function useTable({ search, pageSize = DEFAULT_PAGE_SIZE, pagination: paginationProp, rowSelection: rowSelectionProp, sorting: sortingProp, columnDefinitions, manualFiltering, manualPagination, manualSorting, pageCount, data, }) {
|
|
10
|
+
const { state: globalFilter, onStateChange: onGlobalFilterChange } = useStateControl(search, '');
|
|
11
|
+
const { state: rowSelection, onStateChange: onRowSelectionChange } = useStateControl(rowSelectionProp, {});
|
|
12
|
+
const defaultPaginationState = useMemo(() => ({
|
|
13
|
+
pageIndex: 0,
|
|
14
|
+
pageSize,
|
|
15
|
+
}), [pageSize]);
|
|
16
|
+
const { state: sorting, onStateChange: onSortingChange } = useStateControl(sortingProp, []);
|
|
17
|
+
const { state: pagination, onStateChange: onPaginationChange } = useStateControl(paginationProp, defaultPaginationState);
|
|
18
|
+
const enableSelection = Boolean(rowSelectionProp === null || rowSelectionProp === void 0 ? void 0 : rowSelectionProp.enable);
|
|
19
|
+
const tableColumns = useMemo(() => {
|
|
20
|
+
let cols = columnDefinitions;
|
|
21
|
+
if (enableSelection) {
|
|
22
|
+
cols = [getSelectionCellColumnDef(), ...cols];
|
|
23
|
+
}
|
|
24
|
+
return cols;
|
|
25
|
+
}, [columnDefinitions, enableSelection]);
|
|
26
|
+
const columnPinning = useMemo(() => {
|
|
27
|
+
var _a;
|
|
28
|
+
const pinningState = { left: [], right: [] };
|
|
29
|
+
for (const col of tableColumns) {
|
|
30
|
+
const id = getColumnId(col);
|
|
31
|
+
if (col.pinned && id) {
|
|
32
|
+
(_a = pinningState[col.pinned]) === null || _a === void 0 ? void 0 : _a.push(id);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return pinningState;
|
|
36
|
+
}, [tableColumns]);
|
|
37
|
+
const table = useReactTable({
|
|
38
|
+
data,
|
|
39
|
+
columns: tableColumns,
|
|
40
|
+
state: {
|
|
41
|
+
columnPinning,
|
|
42
|
+
globalFilter,
|
|
43
|
+
rowSelection,
|
|
44
|
+
sorting,
|
|
45
|
+
pagination,
|
|
46
|
+
},
|
|
47
|
+
pageCount,
|
|
48
|
+
defaultColumn: {
|
|
49
|
+
enableSorting: true,
|
|
50
|
+
enableResizing: true,
|
|
51
|
+
minSize: 40,
|
|
52
|
+
cell: (cell) => _jsx(TruncateString, { text: String(cell.getValue()), maxLines: 1 }),
|
|
53
|
+
},
|
|
54
|
+
manualSorting,
|
|
55
|
+
manualPagination,
|
|
56
|
+
manualFiltering,
|
|
57
|
+
globalFilterFn: fuzzyFilter,
|
|
58
|
+
onGlobalFilterChange,
|
|
59
|
+
onRowSelectionChange,
|
|
60
|
+
enableRowSelection: rowSelectionProp === null || rowSelectionProp === void 0 ? void 0 : rowSelectionProp.enable,
|
|
61
|
+
enableMultiRowSelection: rowSelectionProp === null || rowSelectionProp === void 0 ? void 0 : rowSelectionProp.multiRow,
|
|
62
|
+
enableFilters: true,
|
|
63
|
+
getFilteredRowModel: getFilteredRowModel(),
|
|
64
|
+
enableColumnResizing: true,
|
|
65
|
+
enableSorting: true,
|
|
66
|
+
enableMultiSort: true,
|
|
67
|
+
onSortingChange,
|
|
68
|
+
getSortedRowModel: getSortedRowModel(),
|
|
69
|
+
onPaginationChange,
|
|
70
|
+
getPaginationRowModel: getPaginationRowModel(),
|
|
71
|
+
getCoreRowModel: getCoreRowModel(),
|
|
72
|
+
columnResizeMode: 'onEnd',
|
|
73
|
+
});
|
|
74
|
+
return { table, tableColumns, columnPinning };
|
|
75
|
+
}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
position:relative;
|
|
5
5
|
z-index:0;
|
|
6
6
|
overflow:hidden !important;
|
|
7
|
+
display:flex;
|
|
7
8
|
box-sizing:border-box;
|
|
8
9
|
width:100%;
|
|
9
10
|
height:auto;
|
|
@@ -47,4 +48,10 @@
|
|
|
47
48
|
|
|
48
49
|
.wrapper{
|
|
49
50
|
max-width:100%;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.scrollStub{
|
|
54
|
+
height:calc(var(--dimension-025m, 2px) / 2);
|
|
55
|
+
margin-top:calc(var(--dimension-025m, 2px) / -2);
|
|
56
|
+
background:transparent;
|
|
50
57
|
}
|
package/dist/components/index.js
CHANGED