@snack-uikit/table 0.27.3 → 0.28.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 +11 -0
- package/README.md +8 -6
- package/dist/cjs/components/ServerTable/ServerTable.d.ts +2 -1
- package/dist/cjs/components/ServerTable/ServerTable.js +0 -1
- package/dist/cjs/components/Table/Table.d.ts +2 -1
- package/dist/cjs/components/Table/Table.js +11 -11
- package/dist/cjs/components/Table/styles.module.css +1 -1
- package/dist/cjs/components/types.d.ts +10 -5
- package/dist/cjs/constants.d.ts +1 -0
- package/dist/cjs/constants.js +2 -1
- package/dist/cjs/helperComponents/TablePagination/TablePagination.js +0 -1
- package/dist/esm/components/ServerTable/ServerTable.d.ts +2 -1
- package/dist/esm/components/ServerTable/ServerTable.js +0 -1
- package/dist/esm/components/Table/Table.d.ts +2 -1
- package/dist/esm/components/Table/Table.js +8 -6
- package/dist/esm/components/Table/styles.module.css +1 -1
- package/dist/esm/components/types.d.ts +10 -5
- package/dist/esm/constants.d.ts +1 -0
- package/dist/esm/constants.js +1 -0
- package/dist/esm/helperComponents/TablePagination/TablePagination.js +1 -1
- package/package.json +8 -8
- package/src/components/ServerTable/ServerTable.tsx +4 -4
- package/src/components/Table/Table.tsx +24 -16
- package/src/components/Table/styles.module.scss +14 -14
- package/src/components/types.ts +11 -6
- package/src/constants.tsx +1 -0
- package/src/helperComponents/TablePagination/TablePagination.tsx +0 -1
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.28.0 (2025-02-05)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### BREAKING CHANGES
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
* **PDS-1081:** change columnFilters type to ChipChoiceRowProps, add suppressSearch prop ([5fb3278](https://github.com/cloud-ru-tech/snack-uikit/commit/5fb327801a846d837346773ed7d4747e78832b19))
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
6
17
|
## 0.27.3 (2025-02-04)
|
|
7
18
|
|
|
8
19
|
### Only dependencies have been changed
|
package/README.md
CHANGED
|
@@ -128,13 +128,14 @@ const columnDefinitions: ColumnDefinition<TableData>[] = [
|
|
|
128
128
|
| loading | `boolean` | - | Состояние загрузки |
|
|
129
129
|
| onRefresh | `() => void` | - | Колбек обновления данных |
|
|
130
130
|
| outline | `boolean` | - | Внешний бордер для тулбара и таблицы |
|
|
131
|
-
| columnFilters | `
|
|
132
|
-
| dataFiltered | `boolean` | - |
|
|
133
|
-
| dataError | `boolean` | - |
|
|
131
|
+
| columnFilters | `ChipChoiceRowProps<TFilters>` | - | Фильтры |
|
|
132
|
+
| dataFiltered | `boolean` | - | Флаг, показывающий что данные были отфильтрованы при пустых данных |
|
|
133
|
+
| dataError | `boolean` | - | Флаг, показывающий что произошла ошибка запроса при пустых данных |
|
|
134
134
|
| noDataState | `EmptyStateProps` | - | Экран при отстутствии данных |
|
|
135
135
|
| noResultsState | `EmptyStateProps` | - | Экран при отстутствии результатов поиска или фильтров |
|
|
136
136
|
| errorDataState | `EmptyStateProps` | - | Экран при ошибке запроса |
|
|
137
137
|
| suppressToolbar | `boolean` | - | Отключение тулбара |
|
|
138
|
+
| suppressSearch | `boolean` | - | Отключение поиска |
|
|
138
139
|
| bulkActions | `BulkAction[]` | - | Список действия для массовых операций |
|
|
139
140
|
| moreActions | `Action[]` | - | Элементы выпадающего списка кнопки с действиями |
|
|
140
141
|
| toolbarAfter | `ReactNode` | - | Дополнительный слот в `Toolbar` после строки поиска |
|
|
@@ -188,13 +189,14 @@ const columnDefinitions: ColumnDefinition<TableData>[] = [
|
|
|
188
189
|
| loading | `boolean` | - | Состояние загрузки |
|
|
189
190
|
| onRefresh | `() => void` | - | Колбек обновления данных |
|
|
190
191
|
| outline | `boolean` | - | Внешний бордер для тулбара и таблицы |
|
|
191
|
-
| columnFilters | `
|
|
192
|
-
| dataFiltered | `boolean` | - |
|
|
193
|
-
| dataError | `boolean` | - |
|
|
192
|
+
| columnFilters | `ChipChoiceRowProps<TFilters>` | - | Фильтры |
|
|
193
|
+
| dataFiltered | `boolean` | - | Флаг, показывающий что данные были отфильтрованы при пустых данных |
|
|
194
|
+
| dataError | `boolean` | - | Флаг, показывающий что произошла ошибка запроса при пустых данных |
|
|
194
195
|
| noDataState | `EmptyStateProps` | - | Экран при отстутствии данных |
|
|
195
196
|
| noResultsState | `EmptyStateProps` | - | Экран при отстутствии результатов поиска или фильтров |
|
|
196
197
|
| errorDataState | `EmptyStateProps` | - | Экран при ошибке запроса |
|
|
197
198
|
| suppressToolbar | `boolean` | - | Отключение тулбара |
|
|
199
|
+
| suppressSearch | `boolean` | - | Отключение поиска |
|
|
198
200
|
| bulkActions | `BulkAction[]` | - | Список действия для массовых операций |
|
|
199
201
|
| moreActions | `Action[]` | - | Элементы выпадающего списка кнопки с действиями |
|
|
200
202
|
| toolbarAfter | `ReactNode` | - | Дополнительный слот в `Toolbar` после строки поиска |
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { FiltersState } from '@snack-uikit/chips';
|
|
1
2
|
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;
|
|
3
|
+
export declare function ServerTable<TData extends object, TFilters extends FiltersState>({ items, total, limit, offset, onChangePage, search: searchProp, pagination, columnFilters, manualSorting, manualPagination, manualFiltering, ...rest }: ServerTableProps<TData, TFilters>): import("react/jsx-runtime").JSX.Element;
|
|
3
4
|
export declare namespace ServerTable {
|
|
4
5
|
var getRowActionsColumnDef: typeof import("../../helperComponents").getRowActionsColumnDef;
|
|
5
6
|
var statusAppearances: Record<string, string>;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { FiltersState } from '@snack-uikit/chips';
|
|
1
2
|
import { TableProps } from '../types';
|
|
2
3
|
/** Компонент таблицы */
|
|
3
|
-
export declare function Table<TData extends object>({ 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, toolbarAfter, suppressPagination, manualSorting, manualPagination, manualFiltering, autoResetPageIndex, scrollRef, scrollContainerRef, getRowId, enableFuzzySearch, savedState, expanding, bulkActions: bulkActionsProp, ...rest }: TableProps<TData>): import("react/jsx-runtime").JSX.Element;
|
|
4
|
+
export declare function Table<TData extends object, TFilters extends FiltersState>({ 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
5
|
export declare namespace Table {
|
|
5
6
|
var getStatusColumnDef: typeof import("../../helperComponents").getStatusColumnDef;
|
|
6
7
|
var statusAppearances: Record<string, string>;
|
|
@@ -67,6 +67,7 @@ function Table(_a) {
|
|
|
67
67
|
noResultsState,
|
|
68
68
|
errorDataState,
|
|
69
69
|
suppressToolbar = false,
|
|
70
|
+
suppressSearch = false,
|
|
70
71
|
toolbarAfter,
|
|
71
72
|
suppressPagination = false,
|
|
72
73
|
manualSorting = false,
|
|
@@ -81,7 +82,7 @@ function Table(_a) {
|
|
|
81
82
|
expanding,
|
|
82
83
|
bulkActions: bulkActionsProp
|
|
83
84
|
} = _a,
|
|
84
|
-
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", "toolbarAfter", "suppressPagination", "manualSorting", "manualPagination", "manualFiltering", "autoResetPageIndex", "scrollRef", "scrollContainerRef", "getRowId", "enableFuzzySearch", "savedState", "expanding", "bulkActions"]);
|
|
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"]);
|
|
85
86
|
const {
|
|
86
87
|
state: globalFilter,
|
|
87
88
|
onStateChange: onGlobalFilterChange
|
|
@@ -239,8 +240,7 @@ function Table(_a) {
|
|
|
239
240
|
} = (0, utils_3.getColumnStyleVars)(header.id);
|
|
240
241
|
const originalColDef = originalColumnDefs.find(col => (0, helperComponents_1.getColumnId)(header) === col.id);
|
|
241
242
|
if (header.id === 'snack_predefined_statusColumn' && !(originalColDef === null || originalColDef === void 0 ? void 0 : originalColDef.header) && !(originalColDef === null || originalColDef === void 0 ? void 0 : originalColDef.enableSorting)) {
|
|
242
|
-
|
|
243
|
-
colSizes[sizeKey] = indicatorSize;
|
|
243
|
+
colSizes[sizeKey] = 'var(--size-table-cell-status-indicator-horizontal)';
|
|
244
244
|
colSizes[flexKey] = '100%';
|
|
245
245
|
} else {
|
|
246
246
|
const originalColumnDefSize = originalColDef === null || originalColDef === void 0 ? void 0 : originalColDef.size;
|
|
@@ -323,6 +323,7 @@ function Table(_a) {
|
|
|
323
323
|
const {
|
|
324
324
|
updateCellMap
|
|
325
325
|
} = (0, contexts_1.useCellAutoResizeController)(table);
|
|
326
|
+
const showToolbar = !suppressToolbar;
|
|
326
327
|
return (0, jsx_runtime_1.jsx)(contexts_1.CellAutoResizeContext.Provider, {
|
|
327
328
|
value: {
|
|
328
329
|
updateCellMap
|
|
@@ -333,10 +334,10 @@ function Table(_a) {
|
|
|
333
334
|
},
|
|
334
335
|
className: (0, classnames_1.default)(styles_module_scss_1.default.wrapper, className)
|
|
335
336
|
}, (0, utils_1.extractSupportProps)(rest), {
|
|
336
|
-
children: [
|
|
337
|
+
children: [showToolbar && (0, jsx_runtime_1.jsx)("div", {
|
|
337
338
|
className: styles_module_scss_1.default.header,
|
|
338
|
-
children:
|
|
339
|
-
search: {
|
|
339
|
+
children: (0, jsx_runtime_1.jsx)(toolbar_1.Toolbar, {
|
|
340
|
+
search: suppressSearch ? undefined : {
|
|
340
341
|
value: globalFilter,
|
|
341
342
|
onChange: onGlobalFilterChange,
|
|
342
343
|
loading: search === null || search === void 0 ? void 0 : search.loading,
|
|
@@ -359,11 +360,10 @@ function Table(_a) {
|
|
|
359
360
|
centerRows: centerRows
|
|
360
361
|
})]
|
|
361
362
|
}) : undefined,
|
|
362
|
-
moreActions: moreActions
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
})]
|
|
363
|
+
moreActions: moreActions,
|
|
364
|
+
filterRow: columnFilters,
|
|
365
|
+
"data-test-id": constants_1.TEST_IDS.toolbar
|
|
366
|
+
})
|
|
367
367
|
}), (0, jsx_runtime_1.jsx)("div", {
|
|
368
368
|
className: styles_module_scss_1.default.scrollWrapper,
|
|
369
369
|
"data-outline": outline || undefined,
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
.topRowWrapper{
|
|
60
60
|
position:sticky;
|
|
61
61
|
z-index:3;
|
|
62
|
-
top:
|
|
62
|
+
top:var(--size-table-line-height, 40px);
|
|
63
63
|
margin-bottom:calc(-1 * var(--border-width-table, 1px));
|
|
64
64
|
border-bottom:var(--border-width-table, 1px) solid var(--sys-neutral-decor-default, #dde0ea);
|
|
65
65
|
}
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { PaginationState, Row, RowPinningState, RowSelectionOptions, RowSelectionState, SortingState } from '@tanstack/react-table';
|
|
2
2
|
import { ReactNode, RefObject } from 'react';
|
|
3
|
+
import { ChipChoiceRowProps, FiltersState } from '@snack-uikit/chips';
|
|
3
4
|
import { ToolbarProps } from '@snack-uikit/toolbar';
|
|
4
5
|
import { WithSupportProps } from '@snack-uikit/utils';
|
|
5
6
|
import { EmptyStateProps, ExportButtonProps, RowClickHandler } from '../helperComponents';
|
|
6
7
|
import { TreeColumnDefinitionProps } from '../helperComponents/Cells/TreeCell';
|
|
7
8
|
import { ColumnDefinition } from '../types';
|
|
8
|
-
type BulkAction = Omit<NonNullable<ToolbarProps['bulkActions']>[number], 'onClick'> & {
|
|
9
|
+
type BulkAction = Omit<NonNullable<ToolbarProps<Record<string, string>>['bulkActions']>[number], 'onClick'> & {
|
|
9
10
|
onClick?(selectionState: RowSelectionState, resetRowSelection: (defaultState?: boolean) => void): void;
|
|
10
11
|
};
|
|
11
|
-
export type TableProps<TData extends object> = WithSupportProps<{
|
|
12
|
+
export type TableProps<TData extends object, TFilters extends FiltersState> = WithSupportProps<{
|
|
12
13
|
/** Данные для отрисовки */
|
|
13
14
|
data: TData[];
|
|
14
15
|
/** Определение внешнего вида и функционала колонок */
|
|
@@ -97,8 +98,10 @@ export type TableProps<TData extends object> = WithSupportProps<{
|
|
|
97
98
|
/** Внешний бордер для тулбара и таблицы */
|
|
98
99
|
outline?: boolean;
|
|
99
100
|
/** Фильтры */
|
|
100
|
-
columnFilters?:
|
|
101
|
+
columnFilters?: ChipChoiceRowProps<TFilters>;
|
|
102
|
+
/** Флаг, показывающий что данные были отфильтрованы при пустых данных */
|
|
101
103
|
dataFiltered?: boolean;
|
|
104
|
+
/** Флаг, показывающий что произошла ошибка запроса при пустых данных */
|
|
102
105
|
dataError?: boolean;
|
|
103
106
|
/** Экран при отстутствии данных */
|
|
104
107
|
noDataState?: EmptyStateProps;
|
|
@@ -108,10 +111,12 @@ export type TableProps<TData extends object> = WithSupportProps<{
|
|
|
108
111
|
errorDataState?: EmptyStateProps;
|
|
109
112
|
/** Отключение тулбара */
|
|
110
113
|
suppressToolbar?: boolean;
|
|
114
|
+
/** Отключение поиска */
|
|
115
|
+
suppressSearch?: boolean;
|
|
111
116
|
/** Список действия для массовых операций */
|
|
112
117
|
bulkActions?: BulkAction[];
|
|
113
118
|
/** Элементы выпадающего списка кнопки с действиями */
|
|
114
|
-
moreActions?: ToolbarProps['moreActions'];
|
|
119
|
+
moreActions?: ToolbarProps<TFilters>['moreActions'];
|
|
115
120
|
/** Дополнительный слот в `Toolbar` после строки поиска */
|
|
116
121
|
toolbarAfter?: ReactNode;
|
|
117
122
|
/** Настройки экспорта в тулбаре */
|
|
@@ -138,7 +143,7 @@ export type TableProps<TData extends object> = WithSupportProps<{
|
|
|
138
143
|
resize?: boolean;
|
|
139
144
|
};
|
|
140
145
|
}>;
|
|
141
|
-
export type ServerTableProps<TData extends object> = Omit<TableProps<TData>, 'pageSize' | 'pageCount' | 'pagination' | 'search' | 'data'> & {
|
|
146
|
+
export type ServerTableProps<TData extends object, TFilters extends FiltersState> = Omit<TableProps<TData, TFilters>, 'pageSize' | 'pageCount' | 'pagination' | 'search' | 'data'> & {
|
|
142
147
|
/** Данные для отрисовки */
|
|
143
148
|
items?: TData[];
|
|
144
149
|
/**
|
package/dist/cjs/constants.d.ts
CHANGED
package/dist/cjs/constants.js
CHANGED
|
@@ -33,7 +33,8 @@ exports.TEST_IDS = {
|
|
|
33
33
|
option: 'list__base-item-option'
|
|
34
34
|
},
|
|
35
35
|
statusIndicator: 'table__status-indicator',
|
|
36
|
-
statusLabel: 'table__status-label'
|
|
36
|
+
statusLabel: 'table__status-label',
|
|
37
|
+
toolbar: 'table__toolbar'
|
|
37
38
|
};
|
|
38
39
|
exports.SORT_FN = {
|
|
39
40
|
DateTime: 'datetime',
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { FiltersState } from '@snack-uikit/chips';
|
|
1
2
|
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;
|
|
3
|
+
export declare function ServerTable<TData extends object, TFilters extends FiltersState>({ items, total, limit, offset, onChangePage, search: searchProp, pagination, columnFilters, manualSorting, manualPagination, manualFiltering, ...rest }: ServerTableProps<TData, TFilters>): import("react/jsx-runtime").JSX.Element;
|
|
3
4
|
export declare namespace ServerTable {
|
|
4
5
|
var getRowActionsColumnDef: typeof import("../../helperComponents").getRowActionsColumnDef;
|
|
5
6
|
var statusAppearances: Record<string, string>;
|
|
@@ -17,7 +17,6 @@ import { useStateControl } from '../Table/hooks';
|
|
|
17
17
|
import { DEFAULT_PAGINATION_LIMIT } from './constants';
|
|
18
18
|
import { onSearchDebounced } from './utils';
|
|
19
19
|
export function ServerTable(_a) {
|
|
20
|
-
// добавить uncontrolledState
|
|
21
20
|
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
21
|
const { state: search, onStateChange: setSearch } = useStateControl(searchProp, '');
|
|
23
22
|
const [tempSearch, setTempSearch] = useState(search || '');
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { FiltersState } from '@snack-uikit/chips';
|
|
1
2
|
import { TableProps } from '../types';
|
|
2
3
|
/** Компонент таблицы */
|
|
3
|
-
export declare function Table<TData extends object>({ 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, toolbarAfter, suppressPagination, manualSorting, manualPagination, manualFiltering, autoResetPageIndex, scrollRef, scrollContainerRef, getRowId, enableFuzzySearch, savedState, expanding, bulkActions: bulkActionsProp, ...rest }: TableProps<TData>): import("react/jsx-runtime").JSX.Element;
|
|
4
|
+
export declare function Table<TData extends object, TFilters extends FiltersState>({ 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
5
|
export declare namespace Table {
|
|
5
6
|
var getStatusColumnDef: typeof import("../../helperComponents").getStatusColumnDef;
|
|
6
7
|
var statusAppearances: Record<string, string>;
|
|
@@ -19,7 +19,7 @@ import { SkeletonContextProvider } from '@snack-uikit/skeleton';
|
|
|
19
19
|
import { Toolbar } from '@snack-uikit/toolbar';
|
|
20
20
|
import { TruncateString } from '@snack-uikit/truncate-string';
|
|
21
21
|
import { extractSupportProps } from '@snack-uikit/utils';
|
|
22
|
-
import { DEFAULT_PAGE_SIZE } from '../../constants';
|
|
22
|
+
import { DEFAULT_PAGE_SIZE, TEST_IDS } from '../../constants';
|
|
23
23
|
import { CellAutoResizeContext, useCellAutoResizeController } from '../../contexts';
|
|
24
24
|
import { BodyRow, ExportButton, getColumnId, getRowActionsColumnDef, getSelectionCellColumnDef, getStatusColumnDef, HeaderRow, STATUS_APPEARANCE, TableContext, TableEmptyState, TablePagination, useEmptyState, } from '../../helperComponents';
|
|
25
25
|
import { getTreeColumnDef } from '../../helperComponents/Cells/TreeCell';
|
|
@@ -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, 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", "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, 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"]);
|
|
36
36
|
const { state: globalFilter, onStateChange: onGlobalFilterChange } = useStateControl(search, '');
|
|
37
37
|
const { state: rowSelection, onStateChange: onRowSelectionChange } = useStateControl(rowSelectionProp, {});
|
|
38
38
|
const defaultPaginationState = useMemo(() => ({
|
|
@@ -163,8 +163,7 @@ export function Table(_a) {
|
|
|
163
163
|
const { sizeKey, flexKey } = getColumnStyleVars(header.id);
|
|
164
164
|
const originalColDef = originalColumnDefs.find(col => getColumnId(header) === col.id);
|
|
165
165
|
if (header.id === 'snack_predefined_statusColumn' && !(originalColDef === null || originalColDef === void 0 ? void 0 : originalColDef.header) && !(originalColDef === null || originalColDef === void 0 ? void 0 : originalColDef.enableSorting)) {
|
|
166
|
-
|
|
167
|
-
colSizes[sizeKey] = indicatorSize;
|
|
166
|
+
colSizes[sizeKey] = 'var(--size-table-cell-status-indicator-horizontal)';
|
|
168
167
|
colSizes[flexKey] = '100%';
|
|
169
168
|
}
|
|
170
169
|
else {
|
|
@@ -235,14 +234,17 @@ export function Table(_a) {
|
|
|
235
234
|
autoResetPageIndex,
|
|
236
235
|
});
|
|
237
236
|
const { updateCellMap } = useCellAutoResizeController(table);
|
|
237
|
+
const showToolbar = !suppressToolbar;
|
|
238
238
|
return (_jsx(CellAutoResizeContext.Provider, { value: { updateCellMap }, children: _jsxs("div", Object.assign({ style: {
|
|
239
239
|
'--page-size': cssPageSize,
|
|
240
|
-
}, className: cn(styles.wrapper, className) }, extractSupportProps(rest), { children: [
|
|
240
|
+
}, className: cn(styles.wrapper, className) }, extractSupportProps(rest), { children: [showToolbar && (_jsx("div", { className: styles.header, children: _jsx(Toolbar, { search: suppressSearch
|
|
241
|
+
? undefined
|
|
242
|
+
: {
|
|
241
243
|
value: globalFilter,
|
|
242
244
|
onChange: onGlobalFilterChange,
|
|
243
245
|
loading: search === null || search === void 0 ? void 0 : search.loading,
|
|
244
246
|
placeholder: (search === null || search === void 0 ? void 0 : search.placeholder) || t('searchPlaceholder'),
|
|
245
|
-
}, 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 ? handleOnCheck : 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
|
|
247
|
+
}, 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 ? handleOnCheck : 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: 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: [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 }))] })) }));
|
|
246
248
|
}
|
|
247
249
|
Table.getStatusColumnDef = getStatusColumnDef;
|
|
248
250
|
Table.statusAppearances = STATUS_APPEARANCE;
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
.topRowWrapper{
|
|
60
60
|
position:sticky;
|
|
61
61
|
z-index:3;
|
|
62
|
-
top:
|
|
62
|
+
top:var(--size-table-line-height, 40px);
|
|
63
63
|
margin-bottom:calc(-1 * var(--border-width-table, 1px));
|
|
64
64
|
border-bottom:var(--border-width-table, 1px) solid var(--sys-neutral-decor-default, #dde0ea);
|
|
65
65
|
}
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { PaginationState, Row, RowPinningState, RowSelectionOptions, RowSelectionState, SortingState } from '@tanstack/react-table';
|
|
2
2
|
import { ReactNode, RefObject } from 'react';
|
|
3
|
+
import { ChipChoiceRowProps, FiltersState } from '@snack-uikit/chips';
|
|
3
4
|
import { ToolbarProps } from '@snack-uikit/toolbar';
|
|
4
5
|
import { WithSupportProps } from '@snack-uikit/utils';
|
|
5
6
|
import { EmptyStateProps, ExportButtonProps, RowClickHandler } from '../helperComponents';
|
|
6
7
|
import { TreeColumnDefinitionProps } from '../helperComponents/Cells/TreeCell';
|
|
7
8
|
import { ColumnDefinition } from '../types';
|
|
8
|
-
type BulkAction = Omit<NonNullable<ToolbarProps['bulkActions']>[number], 'onClick'> & {
|
|
9
|
+
type BulkAction = Omit<NonNullable<ToolbarProps<Record<string, string>>['bulkActions']>[number], 'onClick'> & {
|
|
9
10
|
onClick?(selectionState: RowSelectionState, resetRowSelection: (defaultState?: boolean) => void): void;
|
|
10
11
|
};
|
|
11
|
-
export type TableProps<TData extends object> = WithSupportProps<{
|
|
12
|
+
export type TableProps<TData extends object, TFilters extends FiltersState> = WithSupportProps<{
|
|
12
13
|
/** Данные для отрисовки */
|
|
13
14
|
data: TData[];
|
|
14
15
|
/** Определение внешнего вида и функционала колонок */
|
|
@@ -97,8 +98,10 @@ export type TableProps<TData extends object> = WithSupportProps<{
|
|
|
97
98
|
/** Внешний бордер для тулбара и таблицы */
|
|
98
99
|
outline?: boolean;
|
|
99
100
|
/** Фильтры */
|
|
100
|
-
columnFilters?:
|
|
101
|
+
columnFilters?: ChipChoiceRowProps<TFilters>;
|
|
102
|
+
/** Флаг, показывающий что данные были отфильтрованы при пустых данных */
|
|
101
103
|
dataFiltered?: boolean;
|
|
104
|
+
/** Флаг, показывающий что произошла ошибка запроса при пустых данных */
|
|
102
105
|
dataError?: boolean;
|
|
103
106
|
/** Экран при отстутствии данных */
|
|
104
107
|
noDataState?: EmptyStateProps;
|
|
@@ -108,10 +111,12 @@ export type TableProps<TData extends object> = WithSupportProps<{
|
|
|
108
111
|
errorDataState?: EmptyStateProps;
|
|
109
112
|
/** Отключение тулбара */
|
|
110
113
|
suppressToolbar?: boolean;
|
|
114
|
+
/** Отключение поиска */
|
|
115
|
+
suppressSearch?: boolean;
|
|
111
116
|
/** Список действия для массовых операций */
|
|
112
117
|
bulkActions?: BulkAction[];
|
|
113
118
|
/** Элементы выпадающего списка кнопки с действиями */
|
|
114
|
-
moreActions?: ToolbarProps['moreActions'];
|
|
119
|
+
moreActions?: ToolbarProps<TFilters>['moreActions'];
|
|
115
120
|
/** Дополнительный слот в `Toolbar` после строки поиска */
|
|
116
121
|
toolbarAfter?: ReactNode;
|
|
117
122
|
/** Настройки экспорта в тулбаре */
|
|
@@ -138,7 +143,7 @@ export type TableProps<TData extends object> = WithSupportProps<{
|
|
|
138
143
|
resize?: boolean;
|
|
139
144
|
};
|
|
140
145
|
}>;
|
|
141
|
-
export type ServerTableProps<TData extends object> = Omit<TableProps<TData>, 'pageSize' | 'pageCount' | 'pagination' | 'search' | 'data'> & {
|
|
146
|
+
export type ServerTableProps<TData extends object, TFilters extends FiltersState> = Omit<TableProps<TData, TFilters>, 'pageSize' | 'pageCount' | 'pagination' | 'search' | 'data'> & {
|
|
142
147
|
/** Данные для отрисовки */
|
|
143
148
|
items?: TData[];
|
|
144
149
|
/**
|
package/dist/esm/constants.d.ts
CHANGED
package/dist/esm/constants.js
CHANGED
|
@@ -21,5 +21,5 @@ export function TablePagination({ table, options: optionsProp, optionsLabel: opt
|
|
|
21
21
|
if (table.getPageCount() <= 1 && !options) {
|
|
22
22
|
return null;
|
|
23
23
|
}
|
|
24
|
-
return (_jsxs("div", { className: styles.footer, children: [table.getPageCount() > 1 && (_jsx(Pagination, { total: table.getPageCount(), page: tablePaginationState.pageIndex + 1, onChange: handlePaginationOnChange, size: 'xs', className: styles.pagination })), options && table.getRowModel().rows.length >= Number(options[0].value) && (_jsx(ChipChoice.Single, { value: String(tablePaginationState.pageSize), onChange: handleRowsVolumeOnChange, placement: 'top-end', options: options, label: optionsLabel, widthStrategy: 'auto',
|
|
24
|
+
return (_jsxs("div", { className: styles.footer, children: [table.getPageCount() > 1 && (_jsx(Pagination, { total: table.getPageCount(), page: tablePaginationState.pageIndex + 1, onChange: handlePaginationOnChange, size: 'xs', className: styles.pagination })), options && table.getRowModel().rows.length >= Number(options[0].value) && (_jsx(ChipChoice.Single, { value: String(tablePaginationState.pageSize), onChange: handleRowsVolumeOnChange, placement: 'top-end', options: options, label: optionsLabel, widthStrategy: 'auto', size: 'xs' }))] }));
|
|
25
25
|
}
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
6
|
"title": "Table",
|
|
7
|
-
"version": "0.
|
|
7
|
+
"version": "0.28.0",
|
|
8
8
|
"sideEffects": [
|
|
9
9
|
"*.css",
|
|
10
10
|
"*.woff",
|
|
@@ -36,17 +36,17 @@
|
|
|
36
36
|
"license": "Apache-2.0",
|
|
37
37
|
"scripts": {},
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@snack-uikit/button": "0.19.
|
|
40
|
-
"@snack-uikit/chips": "0.
|
|
39
|
+
"@snack-uikit/button": "0.19.7",
|
|
40
|
+
"@snack-uikit/chips": "0.25.0",
|
|
41
41
|
"@snack-uikit/icon-predefined": "0.7.3",
|
|
42
42
|
"@snack-uikit/icons": "0.24.2",
|
|
43
|
-
"@snack-uikit/info-block": "0.6.
|
|
44
|
-
"@snack-uikit/list": "0.24.
|
|
45
|
-
"@snack-uikit/pagination": "0.10.
|
|
43
|
+
"@snack-uikit/info-block": "0.6.11",
|
|
44
|
+
"@snack-uikit/list": "0.24.2",
|
|
45
|
+
"@snack-uikit/pagination": "0.10.2",
|
|
46
46
|
"@snack-uikit/scroll": "0.9.3",
|
|
47
47
|
"@snack-uikit/skeleton": "0.6.2",
|
|
48
48
|
"@snack-uikit/toggles": "0.13.5",
|
|
49
|
-
"@snack-uikit/toolbar": "0.
|
|
49
|
+
"@snack-uikit/toolbar": "0.11.0",
|
|
50
50
|
"@snack-uikit/truncate-string": "0.6.7",
|
|
51
51
|
"@snack-uikit/typography": "0.8.4",
|
|
52
52
|
"@snack-uikit/utils": "3.7.0",
|
|
@@ -61,5 +61,5 @@
|
|
|
61
61
|
"peerDependencies": {
|
|
62
62
|
"@snack-uikit/locale": "*"
|
|
63
63
|
},
|
|
64
|
-
"gitHead": "
|
|
64
|
+
"gitHead": "70bed6c518009afe4292cb9d12baf08a16700781"
|
|
65
65
|
}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { useCallback, useEffect, useMemo, useState } from 'react';
|
|
2
2
|
|
|
3
|
+
import { FiltersState } from '@snack-uikit/chips';
|
|
4
|
+
|
|
3
5
|
import { STATUS_APPEARANCE } from '../../helperComponents';
|
|
4
6
|
import { PaginationState } from '../../types';
|
|
5
7
|
import { Table } from '../Table';
|
|
@@ -8,7 +10,7 @@ import { ServerTableProps } from '../types';
|
|
|
8
10
|
import { DEFAULT_PAGINATION_LIMIT } from './constants';
|
|
9
11
|
import { onSearchDebounced } from './utils';
|
|
10
12
|
|
|
11
|
-
export function ServerTable<TData extends object>({
|
|
13
|
+
export function ServerTable<TData extends object, TFilters extends FiltersState>({
|
|
12
14
|
items,
|
|
13
15
|
total = DEFAULT_PAGINATION_LIMIT,
|
|
14
16
|
limit = DEFAULT_PAGINATION_LIMIT,
|
|
@@ -21,9 +23,7 @@ export function ServerTable<TData extends object>({
|
|
|
21
23
|
manualPagination = true,
|
|
22
24
|
manualFiltering = true,
|
|
23
25
|
...rest
|
|
24
|
-
}: ServerTableProps<TData>) {
|
|
25
|
-
// добавить uncontrolledState
|
|
26
|
-
|
|
26
|
+
}: ServerTableProps<TData, TFilters>) {
|
|
27
27
|
const { state: search, onStateChange: setSearch } = useStateControl<string>(searchProp, '');
|
|
28
28
|
|
|
29
29
|
const [tempSearch, setTempSearch] = useState(search || '');
|
|
@@ -15,6 +15,7 @@ import {
|
|
|
15
15
|
import cn from 'classnames';
|
|
16
16
|
import { RefObject, useCallback, useEffect, useMemo, useRef } from 'react';
|
|
17
17
|
|
|
18
|
+
import { FiltersState } from '@snack-uikit/chips';
|
|
18
19
|
import { useLocale } from '@snack-uikit/locale';
|
|
19
20
|
import { Scroll } from '@snack-uikit/scroll';
|
|
20
21
|
import { SkeletonContextProvider } from '@snack-uikit/skeleton';
|
|
@@ -22,7 +23,7 @@ import { Toolbar, ToolbarProps } from '@snack-uikit/toolbar';
|
|
|
22
23
|
import { TruncateString } from '@snack-uikit/truncate-string';
|
|
23
24
|
import { extractSupportProps } from '@snack-uikit/utils';
|
|
24
25
|
|
|
25
|
-
import { DEFAULT_PAGE_SIZE } from '../../constants';
|
|
26
|
+
import { DEFAULT_PAGE_SIZE, TEST_IDS } from '../../constants';
|
|
26
27
|
import { CellAutoResizeContext, useCellAutoResizeController } from '../../contexts';
|
|
27
28
|
import {
|
|
28
29
|
BodyRow,
|
|
@@ -53,7 +54,7 @@ import {
|
|
|
53
54
|
} from './utils';
|
|
54
55
|
|
|
55
56
|
/** Компонент таблицы */
|
|
56
|
-
export function Table<TData extends object>({
|
|
57
|
+
export function Table<TData extends object, TFilters extends FiltersState>({
|
|
57
58
|
data,
|
|
58
59
|
rowPinning = {
|
|
59
60
|
top: [],
|
|
@@ -82,6 +83,7 @@ export function Table<TData extends object>({
|
|
|
82
83
|
noResultsState,
|
|
83
84
|
errorDataState,
|
|
84
85
|
suppressToolbar = false,
|
|
86
|
+
suppressSearch = false,
|
|
85
87
|
toolbarAfter,
|
|
86
88
|
suppressPagination = false,
|
|
87
89
|
manualSorting = false,
|
|
@@ -96,7 +98,7 @@ export function Table<TData extends object>({
|
|
|
96
98
|
expanding,
|
|
97
99
|
bulkActions: bulkActionsProp,
|
|
98
100
|
...rest
|
|
99
|
-
}: TableProps<TData>) {
|
|
101
|
+
}: TableProps<TData, TFilters>) {
|
|
100
102
|
const { state: globalFilter, onStateChange: onGlobalFilterChange } = useStateControl<string>(search, '');
|
|
101
103
|
const { state: rowSelection, onStateChange: onRowSelectionChange } = useStateControl<RowSelectionState>(
|
|
102
104
|
rowSelectionProp,
|
|
@@ -218,7 +220,7 @@ export function Table<TData extends object>({
|
|
|
218
220
|
onRefresh?.();
|
|
219
221
|
}, [onRefresh, table]);
|
|
220
222
|
|
|
221
|
-
const bulkActions: ToolbarProps['bulkActions'] = useMemo(
|
|
223
|
+
const bulkActions: ToolbarProps<TFilters>['bulkActions'] = useMemo(
|
|
222
224
|
() =>
|
|
223
225
|
enableSelection
|
|
224
226
|
? bulkActionsProp?.map(action => ({
|
|
@@ -264,9 +266,7 @@ export function Table<TData extends object>({
|
|
|
264
266
|
const originalColDef = originalColumnDefs.find(col => getColumnId(header) === col.id);
|
|
265
267
|
|
|
266
268
|
if (header.id === 'snack_predefined_statusColumn' && !originalColDef?.header && !originalColDef?.enableSorting) {
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
colSizes[sizeKey] = indicatorSize;
|
|
269
|
+
colSizes[sizeKey] = 'var(--size-table-cell-status-indicator-horizontal)';
|
|
270
270
|
colSizes[flexKey] = '100%';
|
|
271
271
|
} else {
|
|
272
272
|
const originalColumnDefSize = originalColDef?.size;
|
|
@@ -352,7 +352,11 @@ export function Table<TData extends object>({
|
|
|
352
352
|
onPaginationChange,
|
|
353
353
|
autoResetPageIndex,
|
|
354
354
|
});
|
|
355
|
+
|
|
355
356
|
const { updateCellMap } = useCellAutoResizeController(table);
|
|
357
|
+
|
|
358
|
+
const showToolbar = !suppressToolbar;
|
|
359
|
+
|
|
356
360
|
return (
|
|
357
361
|
<CellAutoResizeContext.Provider value={{ updateCellMap }}>
|
|
358
362
|
<div
|
|
@@ -362,15 +366,19 @@ export function Table<TData extends object>({
|
|
|
362
366
|
className={cn(styles.wrapper, className)}
|
|
363
367
|
{...extractSupportProps(rest)}
|
|
364
368
|
>
|
|
365
|
-
{
|
|
369
|
+
{showToolbar && (
|
|
366
370
|
<div className={styles.header}>
|
|
367
371
|
<Toolbar
|
|
368
|
-
search={
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
372
|
+
search={
|
|
373
|
+
suppressSearch
|
|
374
|
+
? undefined
|
|
375
|
+
: {
|
|
376
|
+
value: globalFilter,
|
|
377
|
+
onChange: onGlobalFilterChange,
|
|
378
|
+
loading: search?.loading,
|
|
379
|
+
placeholder: search?.placeholder || t('searchPlaceholder'),
|
|
380
|
+
}
|
|
381
|
+
}
|
|
374
382
|
className={styles.toolbar}
|
|
375
383
|
onRefresh={onRefresh ? handleOnRefresh : undefined}
|
|
376
384
|
bulkActions={bulkActions}
|
|
@@ -396,9 +404,9 @@ export function Table<TData extends object>({
|
|
|
396
404
|
) : undefined
|
|
397
405
|
}
|
|
398
406
|
moreActions={moreActions}
|
|
407
|
+
filterRow={columnFilters}
|
|
408
|
+
data-test-id={TEST_IDS.toolbar}
|
|
399
409
|
/>
|
|
400
|
-
|
|
401
|
-
{columnFilters && <div className={styles.filtersWrapper}> {columnFilters} </div>}
|
|
402
410
|
</div>
|
|
403
411
|
)}
|
|
404
412
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
@use '@snack-uikit/figma-tokens/build/scss/components/styles-tokens-table';
|
|
1
|
+
@use '@snack-uikit/figma-tokens/build/scss/components/styles-tokens-table' as table;
|
|
2
2
|
|
|
3
3
|
.table {
|
|
4
|
-
@include
|
|
4
|
+
@include table.composite-var(table.$table-table-container);
|
|
5
5
|
|
|
6
6
|
position: relative;
|
|
7
7
|
/* stylelint-disable-next-line declaration-property-value-allowed-list */
|
|
@@ -15,24 +15,24 @@
|
|
|
15
15
|
width: 100%;
|
|
16
16
|
height: auto;
|
|
17
17
|
max-height: calc(
|
|
18
|
-
(var(--page-size, 10) *
|
|
18
|
+
(var(--page-size, 10) * #{table.$size-table-line-height}) + #{table.$size-table-line-height} + #{table.$border-width-table} * 2
|
|
19
19
|
);
|
|
20
20
|
|
|
21
|
-
background-color:
|
|
22
|
-
border-color:
|
|
21
|
+
background-color: table.$sys-neutral-background1-level;
|
|
22
|
+
border-color: table.$sys-neutral-background1-level;
|
|
23
23
|
border-style: solid;
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
.scrollWrapper {
|
|
27
27
|
&[data-outline] {
|
|
28
28
|
.table {
|
|
29
|
-
border-color:
|
|
29
|
+
border-color: table.$sys-neutral-decor-default;
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
.header {
|
|
35
|
-
@include
|
|
35
|
+
@include table.composite-var(table.$table-header);
|
|
36
36
|
|
|
37
37
|
display: flex;
|
|
38
38
|
flex-direction: column;
|
|
@@ -49,13 +49,13 @@
|
|
|
49
49
|
.filtersWrapper {
|
|
50
50
|
display: flex;
|
|
51
51
|
flex-wrap: wrap;
|
|
52
|
-
gap:
|
|
52
|
+
gap: table.$dimension-1m;
|
|
53
53
|
align-items: center;
|
|
54
54
|
justify-content: flex-start;
|
|
55
55
|
}
|
|
56
56
|
|
|
57
57
|
.skeleton {
|
|
58
|
-
padding: 0
|
|
58
|
+
padding: 0 table.$dimension-1m;
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
.wrapper {
|
|
@@ -63,8 +63,8 @@
|
|
|
63
63
|
}
|
|
64
64
|
|
|
65
65
|
.scrollStub {
|
|
66
|
-
height: calc(
|
|
67
|
-
margin-top: calc(
|
|
66
|
+
height: calc(#{table.$dimension-025m} / 2);
|
|
67
|
+
margin-top: calc(#{table.$dimension-025m} / -2);
|
|
68
68
|
background: transparent;
|
|
69
69
|
}
|
|
70
70
|
|
|
@@ -72,9 +72,9 @@
|
|
|
72
72
|
position: sticky;
|
|
73
73
|
/* stylelint-disable-next-line declaration-property-value-allowed-list */
|
|
74
74
|
z-index: 3;
|
|
75
|
-
top:
|
|
75
|
+
top: table.$size-table-line-height;
|
|
76
76
|
|
|
77
|
-
margin-bottom: calc(-1 *
|
|
77
|
+
margin-bottom: calc(-1 * #{table.$border-width-table});
|
|
78
78
|
|
|
79
|
-
border-bottom:
|
|
79
|
+
border-bottom: table.$border-width-table solid table.$sys-neutral-decor-default;
|
|
80
80
|
}
|
package/src/components/types.ts
CHANGED
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
} from '@tanstack/react-table';
|
|
9
9
|
import { ReactNode, RefObject } from 'react';
|
|
10
10
|
|
|
11
|
+
import { ChipChoiceRowProps, FiltersState } from '@snack-uikit/chips';
|
|
11
12
|
import { ToolbarProps } from '@snack-uikit/toolbar';
|
|
12
13
|
import { WithSupportProps } from '@snack-uikit/utils';
|
|
13
14
|
|
|
@@ -15,11 +16,11 @@ import { EmptyStateProps, ExportButtonProps, RowClickHandler } from '../helperCo
|
|
|
15
16
|
import { TreeColumnDefinitionProps } from '../helperComponents/Cells/TreeCell';
|
|
16
17
|
import { ColumnDefinition } from '../types';
|
|
17
18
|
|
|
18
|
-
type BulkAction = Omit<NonNullable<ToolbarProps['bulkActions']>[number], 'onClick'> & {
|
|
19
|
+
type BulkAction = Omit<NonNullable<ToolbarProps<Record<string, string>>['bulkActions']>[number], 'onClick'> & {
|
|
19
20
|
onClick?(selectionState: RowSelectionState, resetRowSelection: (defaultState?: boolean) => void): void;
|
|
20
21
|
};
|
|
21
22
|
|
|
22
|
-
export type TableProps<TData extends object> = WithSupportProps<{
|
|
23
|
+
export type TableProps<TData extends object, TFilters extends FiltersState> = WithSupportProps<{
|
|
23
24
|
/** Данные для отрисовки */
|
|
24
25
|
data: TData[];
|
|
25
26
|
/** Определение внешнего вида и функционала колонок */
|
|
@@ -119,9 +120,11 @@ export type TableProps<TData extends object> = WithSupportProps<{
|
|
|
119
120
|
outline?: boolean;
|
|
120
121
|
|
|
121
122
|
/** Фильтры */
|
|
122
|
-
columnFilters?:
|
|
123
|
+
columnFilters?: ChipChoiceRowProps<TFilters>;
|
|
123
124
|
|
|
125
|
+
/** Флаг, показывающий что данные были отфильтрованы при пустых данных */
|
|
124
126
|
dataFiltered?: boolean;
|
|
127
|
+
/** Флаг, показывающий что произошла ошибка запроса при пустых данных */
|
|
125
128
|
dataError?: boolean;
|
|
126
129
|
|
|
127
130
|
/** Экран при отстутствии данных */
|
|
@@ -133,10 +136,12 @@ export type TableProps<TData extends object> = WithSupportProps<{
|
|
|
133
136
|
|
|
134
137
|
/** Отключение тулбара */
|
|
135
138
|
suppressToolbar?: boolean;
|
|
139
|
+
/** Отключение поиска */
|
|
140
|
+
suppressSearch?: boolean;
|
|
136
141
|
/** Список действия для массовых операций */
|
|
137
142
|
bulkActions?: BulkAction[];
|
|
138
143
|
/** Элементы выпадающего списка кнопки с действиями */
|
|
139
|
-
moreActions?: ToolbarProps['moreActions'];
|
|
144
|
+
moreActions?: ToolbarProps<TFilters>['moreActions'];
|
|
140
145
|
/** Дополнительный слот в `Toolbar` после строки поиска */
|
|
141
146
|
toolbarAfter?: ReactNode;
|
|
142
147
|
/** Настройки экспорта в тулбаре */
|
|
@@ -170,8 +175,8 @@ export type TableProps<TData extends object> = WithSupportProps<{
|
|
|
170
175
|
};
|
|
171
176
|
}>;
|
|
172
177
|
|
|
173
|
-
export type ServerTableProps<TData extends object> = Omit<
|
|
174
|
-
TableProps<TData>,
|
|
178
|
+
export type ServerTableProps<TData extends object, TFilters extends FiltersState> = Omit<
|
|
179
|
+
TableProps<TData, TFilters>,
|
|
175
180
|
'pageSize' | 'pageCount' | 'pagination' | 'search' | 'data'
|
|
176
181
|
> & {
|
|
177
182
|
/** Данные для отрисовки */
|
package/src/constants.tsx
CHANGED