@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 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 | `ReactNode` | - | Фильтры |
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 | `ReactNode` | - | Фильтры |
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>;
@@ -20,7 +20,6 @@ const hooks_1 = require("../Table/hooks");
20
20
  const constants_1 = require("./constants");
21
21
  const utils_1 = require("./utils");
22
22
  function ServerTable(_a) {
23
- // добавить uncontrolledState
24
23
  var {
25
24
  items,
26
25
  total = constants_1.DEFAULT_PAGINATION_LIMIT,
@@ -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
- const indicatorSize = 'var(--size-table-cell-status-indicator-horizontal)';
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: [!suppressToolbar && (0, jsx_runtime_1.jsxs)("div", {
337
+ children: [showToolbar && (0, jsx_runtime_1.jsx)("div", {
337
338
  className: styles_module_scss_1.default.header,
338
- children: [(0, jsx_runtime_1.jsx)(toolbar_1.Toolbar, {
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
- }), columnFilters && (0, jsx_runtime_1.jsxs)("div", {
364
- className: styles_module_scss_1.default.filtersWrapper,
365
- children: [" ", columnFilters, " "]
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:calc(var(--size-table-line-height, 40px));
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?: ReactNode;
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
  /**
@@ -28,6 +28,7 @@ export declare const TEST_IDS: {
28
28
  };
29
29
  statusIndicator: string;
30
30
  statusLabel: string;
31
+ toolbar: string;
31
32
  };
32
33
  export declare const SORT_FN: {
33
34
  readonly DateTime: "datetime";
@@ -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',
@@ -55,7 +55,6 @@ function TablePagination(_ref) {
55
55
  options: options,
56
56
  label: optionsLabel,
57
57
  widthStrategy: 'auto',
58
- showClearButton: false,
59
58
  size: 'xs'
60
59
  })]
61
60
  });
@@ -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
- const indicatorSize = 'var(--size-table-cell-status-indicator-horizontal)';
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: [!suppressToolbar && (_jsxs("div", { className: styles.header, children: [_jsx(Toolbar, { search: {
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 }), 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: [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 }))] })) }));
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:calc(var(--size-table-line-height, 40px));
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?: ReactNode;
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
  /**
@@ -28,6 +28,7 @@ export declare const TEST_IDS: {
28
28
  };
29
29
  statusIndicator: string;
30
30
  statusLabel: string;
31
+ toolbar: string;
31
32
  };
32
33
  export declare const SORT_FN: {
33
34
  readonly DateTime: "datetime";
@@ -28,6 +28,7 @@ export const TEST_IDS = {
28
28
  },
29
29
  statusIndicator: 'table__status-indicator',
30
30
  statusLabel: 'table__status-label',
31
+ toolbar: 'table__toolbar',
31
32
  };
32
33
  export const SORT_FN = {
33
34
  DateTime: 'datetime',
@@ -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', showClearButton: false, size: 'xs' }))] }));
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.27.3",
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.6",
40
- "@snack-uikit/chips": "0.24.3",
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.10",
44
- "@snack-uikit/list": "0.24.1",
45
- "@snack-uikit/pagination": "0.10.1",
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.10.3",
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": "4beda461fbd94378a1534458d7942270226a39ef"
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
- const indicatorSize = 'var(--size-table-cell-status-indicator-horizontal)';
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
- {!suppressToolbar && (
369
+ {showToolbar && (
366
370
  <div className={styles.header}>
367
371
  <Toolbar
368
- search={{
369
- value: globalFilter,
370
- onChange: onGlobalFilterChange,
371
- loading: search?.loading,
372
- placeholder: search?.placeholder || t('searchPlaceholder'),
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 styles-tokens-table.composite-var(styles-tokens-table.$table-table-container);
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) * styles-tokens-table.$size-table-line-height) + styles-tokens-table.$size-table-line-height + styles-tokens-table.$border-width-table * 2
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: styles-tokens-table.$sys-neutral-background1-level;
22
- border-color: styles-tokens-table.$sys-neutral-background1-level;
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: styles-tokens-table.$sys-neutral-decor-default;
29
+ border-color: table.$sys-neutral-decor-default;
30
30
  }
31
31
  }
32
32
  }
33
33
 
34
34
  .header {
35
- @include styles-tokens-table.composite-var(styles-tokens-table.$table-header);
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: styles-tokens-table.$dimension-1m;
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 styles-tokens-table.$dimension-1m;
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(styles-tokens-table.$dimension-025m / 2);
67
- margin-top: calc(styles-tokens-table.$dimension-025m / -2);
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: calc(styles-tokens-table.$size-table-line-height);
75
+ top: table.$size-table-line-height;
76
76
 
77
- margin-bottom: calc(-1 * styles-tokens-table.$border-width-table);
77
+ margin-bottom: calc(-1 * #{table.$border-width-table});
78
78
 
79
- border-bottom: styles-tokens-table.$border-width-table solid styles-tokens-table.$sys-neutral-decor-default;
79
+ border-bottom: table.$border-width-table solid table.$sys-neutral-decor-default;
80
80
  }
@@ -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?: ReactNode;
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
@@ -30,6 +30,7 @@ export const TEST_IDS = {
30
30
  },
31
31
  statusIndicator: 'table__status-indicator',
32
32
  statusLabel: 'table__status-label',
33
+ toolbar: 'table__toolbar',
33
34
  };
34
35
 
35
36
  export const SORT_FN = {
@@ -75,7 +75,6 @@ export function TablePagination<TData>({
75
75
  options={options}
76
76
  label={optionsLabel}
77
77
  widthStrategy='auto'
78
- showClearButton={false}
79
78
  size='xs'
80
79
  />
81
80
  )}