@snack-uikit/table 0.11.7 → 0.11.8-preview-4c16b47e.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/README.md +55 -2
- package/dist/components/ServerTable/ServerTable.d.ts +48 -0
- package/dist/components/ServerTable/ServerTable.js +44 -0
- package/dist/components/ServerTable/constants.d.ts +2 -0
- package/dist/components/ServerTable/constants.js +2 -0
- package/dist/components/ServerTable/index.d.ts +1 -0
- package/dist/components/ServerTable/index.js +1 -0
- package/dist/components/Table/Table.d.ts +1 -0
- package/dist/components/Table/Table.js +8 -6
- package/dist/components/Table/constants.d.ts +1 -0
- package/dist/components/Table/constants.js +1 -0
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.js +1 -0
- package/dist/helperComponents/Cells/CopyCell/CopyCell.d.ts +4 -0
- package/dist/helperComponents/Cells/CopyCell/CopyCell.js +7 -0
- package/dist/helperComponents/Cells/CopyCell/components/CopyButton/CopyButton.d.ts +5 -0
- package/dist/helperComponents/Cells/CopyCell/components/CopyButton/CopyButton.js +23 -0
- package/dist/helperComponents/Cells/CopyCell/components/CopyButton/index.d.ts +1 -0
- package/dist/helperComponents/Cells/CopyCell/components/CopyButton/index.js +1 -0
- package/dist/helperComponents/Cells/CopyCell/components/index.d.ts +1 -0
- package/dist/helperComponents/Cells/CopyCell/components/index.js +1 -0
- package/dist/helperComponents/Cells/CopyCell/index.d.ts +1 -0
- package/dist/helperComponents/Cells/CopyCell/index.js +1 -0
- package/dist/helperComponents/Cells/CopyCell/styles.module.css +14 -0
- package/dist/helperComponents/Cells/StatusCell/StatusCell.d.ts +2 -1
- package/dist/helperComponents/Cells/index.d.ts +1 -0
- package/dist/helperComponents/Cells/index.js +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- package/dist/types.d.ts +1 -1
- package/package.json +6 -4
- package/src/components/ServerTable/ServerTable.tsx +122 -0
- package/src/components/ServerTable/constants.ts +2 -0
- package/src/components/ServerTable/index.ts +1 -0
- package/src/components/Table/Table.tsx +14 -6
- package/src/components/Table/constants.ts +2 -0
- package/src/components/index.ts +1 -0
- package/src/helperComponents/Cells/CopyCell/CopyCell.tsx +17 -0
- package/src/helperComponents/Cells/CopyCell/components/CopyButton/CopyButton.tsx +44 -0
- package/src/helperComponents/Cells/CopyCell/components/CopyButton/index.ts +1 -0
- package/src/helperComponents/Cells/CopyCell/components/index.ts +1 -0
- package/src/helperComponents/Cells/CopyCell/index.ts +1 -0
- package/src/helperComponents/Cells/CopyCell/styles.module.scss +21 -0
- package/src/helperComponents/Cells/StatusCell/StatusCell.tsx +3 -1
- package/src/helperComponents/Cells/index.ts +1 -0
- package/src/index.ts +3 -0
- package/src/types.ts +2 -0
package/README.md
CHANGED
|
@@ -98,6 +98,11 @@ const columnDefinitions: ColumnDefinition<TableData>[] = [
|
|
|
98
98
|
|
|
99
99
|
[//]: DOCUMENTATION_SECTION_START
|
|
100
100
|
[//]: THIS_SECTION_IS_AUTOGENERATED_PLEASE_DONT_EDIT_IT
|
|
101
|
+
## CopyCell
|
|
102
|
+
### Props
|
|
103
|
+
| name | type | default value | description |
|
|
104
|
+
|------|------|---------------|-------------|
|
|
105
|
+
| value | `string \| number` | - | |
|
|
101
106
|
## Table
|
|
102
107
|
Компонент таблицы
|
|
103
108
|
### Props
|
|
@@ -107,7 +112,7 @@ const columnDefinitions: ColumnDefinition<TableData>[] = [
|
|
|
107
112
|
| data* | `TData[]` | - | Данные для отрисовки |
|
|
108
113
|
| sorting | `{ initialState?: SortingState; state?: SortingState; onChange?(state: SortingState): void; }` | - | Параметры отвечают за возможность сортировки, их стоит использовать если нужно отслеживать состояние <br> <strong>initialState</strong>: Начальное состояние сортировки <br> <strong>state</strong>: Состояние сортировки, жестко устанавливаемое снаружи <br> <strong>onChange</strong>: Колбэк на изменение сортировки |
|
|
109
114
|
| rowSelection | `{ initialState?: RowSelectionState; state?: RowSelectionState; enable?: boolean \| ((row: Row<TData>) => boolean); multiRow?: boolean; onChange?(state: RowSelectionState): void; }` | - | Параметры отвечают за возможность выбора строк <br> <strong>initialState</strong>: Начальное состояние выбора строк <br> <strong>state</strong>: Состояние выбора строк, жестко устанавливаемое снаружи <br> <strong>enable</strong>: Колбэк определяющий можно ли выбрать строку <br> <strong>multiRow</strong>: Мульти-выбор строк (включен по-умолчанию, когда включается выбор) <br> <strong>onChange</strong>: Колбэк на выбор строк |
|
|
110
|
-
| search | `{ initialValue?: string; state?: string; placeholder?: string; loading?: boolean; onChange?(value: string): void; }` | 'Search'<br> <strong>loading</strong>: Состояние загрузки в строке поиска <br> <strong>onChange</strong>: Колбэк на изменение данных в строке поиска | Параметры отвечают за глобальный поиск в таблице <br> <strong>initialState</strong>: Начальное состояние строки поиска <br> <strong>state</strong>: Состояние строки поиска, жестко устанавливаемое снаружи <br> <strong>placeholder</strong>: Placeholder строки поиска |
|
|
115
|
+
| search | `{ initialValue?: string; state?: string; placeholder?: string; loading?: boolean; onChange?(value: string): void; disableDefaultSearch?: boolean; }` | 'Search'<br> <strong>loading</strong>: Состояние загрузки в строке поиска <br> <strong>onChange</strong>: Колбэк на изменение данных в строке поиска | Параметры отвечают за глобальный поиск в таблице <br> <strong>initialState</strong>: Начальное состояние строки поиска <br> <strong>state</strong>: Состояние строки поиска, жестко устанавливаемое снаружи <br> <strong>placeholder</strong>: Placeholder строки поиска |
|
|
111
116
|
| pageSize | `number` | 10 | Максимальное кол-во строк на страницу |
|
|
112
117
|
| pagination | `{ state?: PaginationState; options?: number[]; optionsLabel?: string; onChange?(state: PaginationState): void; }` | 'Rows volume: ' <br> <strong>onChange</strong>: Колбэк на изменение пагинации | Параметры отвечают за пагинацию в таблице <br> <strong>state</strong>: Состояние строки поиска, жестко устанавливаемое снаружи <br> <strong>options</strong>: Варианты в выпадающем селекторе для установки кол-ва строк на страницу <br> <strong>optionsLabel</strong>: Текст для селектора кол-ва строк на страницу |
|
|
113
118
|
| pageCount | `number` | - | Кол-во страниц (используется для внешнего управления) |
|
|
@@ -130,7 +135,7 @@ const columnDefinitions: ColumnDefinition<TableData>[] = [
|
|
|
130
135
|
### Props
|
|
131
136
|
| name | type | default value | description |
|
|
132
137
|
|------|------|---------------|-------------|
|
|
133
|
-
| mapStatusToAppearance* | `
|
|
138
|
+
| mapStatusToAppearance* | `MapStatusToAppearanceFnType` | - | Маппинг значений статуса на цвета |
|
|
134
139
|
| accessorKey* | `string` | - | Имя ключа соответствующее полю в data |
|
|
135
140
|
| enableSorting | `boolean` | - | Включение/выключение сортировки |
|
|
136
141
|
| renderDescription | `(cellValue: string) => string` | - | Функция для отрисовки текста, если не передана, то будет отрисован только индикатор статуса |
|
|
@@ -144,6 +149,54 @@ const columnDefinitions: ColumnDefinition<TableData>[] = [
|
|
|
144
149
|
|------|------|---------------|-------------|
|
|
145
150
|
| actionsGenerator* | `ActionsGenerator<TData>` | - | Действия для строки |
|
|
146
151
|
| pinned | `boolean` | - | Закрепление колонки справа в таблице |
|
|
152
|
+
## ServerTable
|
|
153
|
+
### Props
|
|
154
|
+
| name | type | default value | description |
|
|
155
|
+
|------|------|---------------|-------------|
|
|
156
|
+
| search* | `{ initialValue?: string; state: string; placeholder?: string; loading?: boolean; onChange(value: string): void; }` | 'Search...'<br> <strong>loading</strong>: Состояние загрузки в строке поиска <br> <strong>onChange</strong>: Колбэк на изменение данных в строке поиска | Параметры отвечают за глобальный поиск в таблице <br> <strong>initialState</strong>: Начальное состояние строки поиска <br> <strong>state</strong>: Состояние строки поиска, жестко устанавливаемое снаружи <br> <strong>placeholder</strong>: Placeholder строки поиска |
|
|
157
|
+
| onChangePage* | `(offset: number, limit: number) => void` | - | |
|
|
158
|
+
| columnDefinitions* | `ColumnDefinition<TData>[]` | - | Определение внешнего вида и функционала колонок |
|
|
159
|
+
| data* | `TData[]` | - | Данные для отрисовки |
|
|
160
|
+
| loading | `boolean` | - | Состояние загрузки |
|
|
161
|
+
| sorting | `{ initialState?: SortingState; state?: SortingState; onChange?(state: SortingState): void; }` | - | Параметры отвечают за возможность сортировки, их стоит использовать если нужно отслеживать состояние <br> <strong>initialState</strong>: Начальное состояние сортировки <br> <strong>state</strong>: Состояние сортировки, жестко устанавливаемое снаружи <br> <strong>onChange</strong>: Колбэк на изменение сортировки |
|
|
162
|
+
| rowSelection | `{ initialState?: RowSelectionState; state?: RowSelectionState; enable?: boolean \| ((row: Row<TData>) => boolean); multiRow?: boolean; onChange?(state: RowSelectionState): void; }` | - | Параметры отвечают за возможность выбора строк <br> <strong>initialState</strong>: Начальное состояние выбора строк <br> <strong>state</strong>: Состояние выбора строк, жестко устанавливаемое снаружи <br> <strong>enable</strong>: Колбэк определяющий можно ли выбрать строку <br> <strong>multiRow</strong>: Мульти-выбор строк (включен по-умолчанию, когда включается выбор) <br> <strong>onChange</strong>: Колбэк на выбор строк |
|
|
163
|
+
| onRowClick | `RowClickHandler<TData>` | - | Колбэк клика по строке |
|
|
164
|
+
| className | `string` | - | CSS-класс |
|
|
165
|
+
| onRefresh | `() => void` | - | Колбек обновления данных |
|
|
166
|
+
| onDelete | `(selectionState: RowSelectionState, resetRowSelection: (defaultState?: boolean) => void) => void` | - | Колбек удаления выбранных |
|
|
167
|
+
| outline | `boolean` | - | Внешний бордер для тулбара и таблицы |
|
|
168
|
+
| columnFilters | `ReactNode` | - | Фильтры |
|
|
169
|
+
| exportFileName | `string` | - | Название файла при экспорте CSV/XLSX |
|
|
170
|
+
| moreActions | `Action[]` | - | Элементы выпадающего списка кнопки с действиями |
|
|
171
|
+
| noDataState | `TableEmptyStateProps` | - | Экран при отстутствии данных |
|
|
172
|
+
| noResultsState | `TableEmptyStateProps` | - | Экран при отстутствии результатов поиска |
|
|
173
|
+
| suppressToolbar | `boolean` | - | Отключение тулбара |
|
|
174
|
+
| toolbarBefore | `ReactNode` | - | Дополнительный слот в `Toolbar` перед строкой поиска |
|
|
175
|
+
| suppressPagination | `boolean` | - | Отключение пагинации |
|
|
176
|
+
| items | `TData[]` | - | Данные для отрисовки |
|
|
177
|
+
| total | `number` | 10 | Общее кол-во строк |
|
|
178
|
+
| limit | `number` | 10 | Кол-во строк на страницу |
|
|
179
|
+
| offset | `number` | - | Смещение |
|
|
180
|
+
| pagination | `{ options?: number[]; optionsLabel?: string; }` | 'Rows volume' <br> | Параметры отвечают за пагинацию в таблице <br> <strong>options</strong>: Варианты в выпадающем селекторе для установки кол-ва строк на страницу<br> <strong>optionsLabel</strong>: Текст для селектора кол-ва строк на страницу |
|
|
181
|
+
## ServerTable.getRowActionsColumnDef
|
|
182
|
+
Вспомогательная функция для создания ячейки с дополнительными действиями у строки
|
|
183
|
+
### Props
|
|
184
|
+
| name | type | default value | description |
|
|
185
|
+
|------|------|---------------|-------------|
|
|
186
|
+
| actionsGenerator* | `ActionsGenerator<TData>` | - | Действия для строки |
|
|
187
|
+
| pinned | `boolean` | - | Закрепление колонки справа в таблице |
|
|
188
|
+
## ServerTable.getStatusColumnDef
|
|
189
|
+
Вспомогательная функция для создания ячейки со статусом
|
|
190
|
+
### Props
|
|
191
|
+
| name | type | default value | description |
|
|
192
|
+
|------|------|---------------|-------------|
|
|
193
|
+
| mapStatusToAppearance* | `MapStatusToAppearanceFnType` | - | Маппинг значений статуса на цвета |
|
|
194
|
+
| accessorKey* | `string` | - | Имя ключа соответствующее полю в data |
|
|
195
|
+
| enableSorting | `boolean` | - | Включение/выключение сортировки |
|
|
196
|
+
| renderDescription | `(cellValue: string) => string` | - | Функция для отрисовки текста, если не передана, то будет отрисован только индикатор статуса |
|
|
197
|
+
| size | `number` | - | Размер ячейки |
|
|
198
|
+
| header | `ColumnDefTemplate<HeaderContext<TData, unknown>> & (string \| ((ctx: HeaderContext<TData, unknown>) => string))` | - | Заголовок колонки |
|
|
199
|
+
| enableResizing | `boolean` | - | Включение/выключение ресайза колонки |
|
|
147
200
|
## exportToCSV
|
|
148
201
|
### Props
|
|
149
202
|
| name | type | default value | description |
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { TableProps } from '../Table';
|
|
2
|
+
export type ServerTableProps<TData extends object> = Omit<TableProps<TData>, 'pageSize' | 'pageCount' | 'pagination' | 'search'> & {
|
|
3
|
+
/** Данные для отрисовки */
|
|
4
|
+
items?: TData[];
|
|
5
|
+
/**
|
|
6
|
+
* Общее кол-во строк
|
|
7
|
+
* @default 10
|
|
8
|
+
*/
|
|
9
|
+
total?: number;
|
|
10
|
+
/**
|
|
11
|
+
* Кол-во строк на страницу
|
|
12
|
+
* @default 10
|
|
13
|
+
*/
|
|
14
|
+
limit?: number;
|
|
15
|
+
/**
|
|
16
|
+
* Смещение
|
|
17
|
+
* @default 0
|
|
18
|
+
* */
|
|
19
|
+
offset?: number;
|
|
20
|
+
onChangePage(offset: number, limit: number): void;
|
|
21
|
+
/** Параметры отвечают за глобальный поиск в таблице <br>
|
|
22
|
+
* <strong>initialState</strong>: Начальное состояние строки поиска <br>
|
|
23
|
+
* <strong>state</strong>: Состояние строки поиска, жестко устанавливаемое снаружи <br>
|
|
24
|
+
* <strong>placeholder</strong>: Placeholder строки поиска @default 'Search...'<br>
|
|
25
|
+
* <strong>loading</strong>: Состояние загрузки в строке поиска <br>
|
|
26
|
+
* <strong>onChange</strong>: Колбэк на изменение данных в строке поиска
|
|
27
|
+
* */
|
|
28
|
+
search: {
|
|
29
|
+
initialValue?: string;
|
|
30
|
+
state: string;
|
|
31
|
+
placeholder?: string;
|
|
32
|
+
loading?: boolean;
|
|
33
|
+
onChange(value: string): void;
|
|
34
|
+
};
|
|
35
|
+
/** Параметры отвечают за пагинацию в таблице <br>
|
|
36
|
+
* <strong>options</strong>: Варианты в выпадающем селекторе для установки кол-ва строк на страницу<br>
|
|
37
|
+
* <strong>optionsLabel</strong>: Текст для селектора кол-ва строк на страницу @default 'Rows volume' <br>
|
|
38
|
+
* */
|
|
39
|
+
pagination?: {
|
|
40
|
+
options?: number[];
|
|
41
|
+
optionsLabel?: string;
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
export declare function ServerTable<TData extends object>({ items, total, limit, offset, onChangePage, search, pagination, columnFilters, ...rest }: ServerTableProps<TData>): import("react/jsx-runtime").JSX.Element;
|
|
45
|
+
export declare namespace ServerTable {
|
|
46
|
+
var getRowActionsColumnDef: typeof import("../../helperComponents").getRowActionsColumnDef;
|
|
47
|
+
var getStatusColumnDef: typeof import("../../helperComponents").getStatusColumnDef;
|
|
48
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
2
|
+
var t = {};
|
|
3
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
4
|
+
t[p] = s[p];
|
|
5
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
6
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
7
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
8
|
+
t[p[i]] = s[p[i]];
|
|
9
|
+
}
|
|
10
|
+
return t;
|
|
11
|
+
};
|
|
12
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
13
|
+
import debounce from 'lodash.debounce';
|
|
14
|
+
import { useCallback, useMemo, useState } from 'react';
|
|
15
|
+
import { Table } from '../Table';
|
|
16
|
+
import { DEFAULT_PAGINATION_LIMIT, SEARCH_DELAY } from './constants';
|
|
17
|
+
export function ServerTable(_a) {
|
|
18
|
+
var { items, total = DEFAULT_PAGINATION_LIMIT, limit = DEFAULT_PAGINATION_LIMIT, offset = 0, onChangePage, search, pagination, columnFilters } = _a, rest = __rest(_a, ["items", "total", "limit", "offset", "onChangePage", "search", "pagination", "columnFilters"]);
|
|
19
|
+
const [tempSearch, setTempSearch] = useState(search.initialValue || '');
|
|
20
|
+
const onSearchDebounced = useMemo(() => debounce((newValue, onChange) => {
|
|
21
|
+
onChange(newValue);
|
|
22
|
+
}, SEARCH_DELAY), []);
|
|
23
|
+
const handleSearch = useCallback((newValue) => {
|
|
24
|
+
setTempSearch(newValue);
|
|
25
|
+
onSearchDebounced(newValue.trim(), search.onChange);
|
|
26
|
+
},
|
|
27
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
28
|
+
[limit, onSearchDebounced]);
|
|
29
|
+
const handlePageChange = useCallback(({ pageSize, pageIndex }) => onChangePage(pageIndex * pageSize, pageSize), [onChangePage]);
|
|
30
|
+
const pageIndex = useMemo(() => Math.floor(offset / limit), [limit, offset]);
|
|
31
|
+
const pageCount = useMemo(() => Math.ceil(total / limit), [limit, total]);
|
|
32
|
+
return (_jsx(Table, Object.assign({}, rest, { data: items || [], search: {
|
|
33
|
+
state: tempSearch,
|
|
34
|
+
onChange: handleSearch,
|
|
35
|
+
loading: search.loading,
|
|
36
|
+
placeholder: search.placeholder,
|
|
37
|
+
disableDefaultSearch: true,
|
|
38
|
+
}, columnFilters: columnFilters, pageCount: pageCount, pagination: Object.assign(Object.assign({}, pagination), { state: {
|
|
39
|
+
pageIndex,
|
|
40
|
+
pageSize: limit,
|
|
41
|
+
}, onChange: handlePageChange }), pageSize: limit })));
|
|
42
|
+
}
|
|
43
|
+
ServerTable.getRowActionsColumnDef = Table.getRowActionsColumnDef;
|
|
44
|
+
ServerTable.getStatusColumnDef = Table.getStatusColumnDef;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './ServerTable';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './ServerTable';
|
|
@@ -47,6 +47,7 @@ export type TableProps<TData extends object> = WithSupportProps<{
|
|
|
47
47
|
placeholder?: string;
|
|
48
48
|
loading?: boolean;
|
|
49
49
|
onChange?(value: string): void;
|
|
50
|
+
disableDefaultSearch?: boolean;
|
|
50
51
|
};
|
|
51
52
|
/** Максимальное кол-во строк на страницу @default 10 */
|
|
52
53
|
pageSize?: number;
|
|
@@ -22,12 +22,12 @@ import { BodyRow, ExportButton, getColumnId, getRowActionsColumnDef, getSelectio
|
|
|
22
22
|
import { fuzzyFilter } from '../../utils';
|
|
23
23
|
import { TableEmptyState } from '../TableEmptyState';
|
|
24
24
|
import { TablePagination } from '../TablePagination';
|
|
25
|
-
import { DEFAULT_NO_DATA_TABLE_STATE, DEFAULT_NO_RESULTS_TABLE_STATE } from './constants';
|
|
25
|
+
import { DEFAULT_NO_DATA_TABLE_STATE, DEFAULT_NO_RESULTS_TABLE_STATE, DEFAULT_PAGE_SIZE } from './constants';
|
|
26
26
|
import { useLoadingTable, useStateControl } from './hooks';
|
|
27
27
|
import styles from './styles.module.css';
|
|
28
28
|
/** Компонент таблицы */
|
|
29
29
|
export function Table(_a) {
|
|
30
|
-
var { data, columnDefinitions, rowSelection: rowSelectionProp, search, sorting: sortingProp, columnFilters: columnFiltersProp, pagination: paginationProp, className, onRowClick, onRefresh, onDelete, pageSize =
|
|
30
|
+
var { data, columnDefinitions, rowSelection: rowSelectionProp, search, sorting: sortingProp, columnFilters: columnFiltersProp, pagination: paginationProp, className, onRowClick, onRefresh, onDelete, pageSize = DEFAULT_PAGE_SIZE, pageCount, loading = false, outline = false, moreActions, exportFileName, noDataState = DEFAULT_NO_DATA_TABLE_STATE, noResultsState = DEFAULT_NO_RESULTS_TABLE_STATE, suppressToolbar = false, toolbarBefore, suppressPagination = false } = _a, rest = __rest(_a, ["data", "columnDefinitions", "rowSelection", "search", "sorting", "columnFilters", "pagination", "className", "onRowClick", "onRefresh", "onDelete", "pageSize", "pageCount", "loading", "outline", "moreActions", "exportFileName", "noDataState", "noResultsState", "suppressToolbar", "toolbarBefore", "suppressPagination"]);
|
|
31
31
|
const { state: globalFilter, onStateChange: onGlobalFilterChange } = useStateControl(search, '');
|
|
32
32
|
const { state: rowSelection, onStateChange: onRowSelectionChange } = useStateControl(rowSelectionProp, {});
|
|
33
33
|
const defaultPaginationState = useMemo(() => ({
|
|
@@ -73,6 +73,9 @@ export function Table(_a) {
|
|
|
73
73
|
enableResizing: false,
|
|
74
74
|
minSize: 40,
|
|
75
75
|
},
|
|
76
|
+
manualSorting: Boolean(pageCount),
|
|
77
|
+
manualPagination: pageCount !== undefined,
|
|
78
|
+
manualFiltering: Boolean(pageCount),
|
|
76
79
|
globalFilterFn: fuzzyFilter,
|
|
77
80
|
onGlobalFilterChange,
|
|
78
81
|
onRowSelectionChange,
|
|
@@ -82,9 +85,7 @@ export function Table(_a) {
|
|
|
82
85
|
getFilteredRowModel: getFilteredRowModel(),
|
|
83
86
|
enableColumnResizing: true,
|
|
84
87
|
enableSorting: true,
|
|
85
|
-
|
|
86
|
-
enableMultiSort: false,
|
|
87
|
-
manualPagination: pageCount !== undefined,
|
|
88
|
+
enableMultiSort: true,
|
|
88
89
|
onSortingChange,
|
|
89
90
|
getSortedRowModel: getSortedRowModel(),
|
|
90
91
|
onPaginationChange,
|
|
@@ -140,7 +141,8 @@ export function Table(_a) {
|
|
|
140
141
|
const tableRows = table.getRowModel().rows;
|
|
141
142
|
const loadingTableRows = loadingTable.getRowModel().rows;
|
|
142
143
|
const tablePagination = table.getState().pagination;
|
|
143
|
-
|
|
144
|
+
const prePageSize = !suppressPagination ? tablePagination === null || tablePagination === void 0 ? void 0 : tablePagination.pageSize : pageSize;
|
|
145
|
+
return (_jsx(_Fragment, { children: _jsxs("div", Object.assign({ style: { '--page-size': !tableRows.length ? Math.min(prePageSize, DEFAULT_PAGE_SIZE) : prePageSize }, className: cn(styles.wrapper, className) }, extractSupportProps(rest), { children: [!suppressToolbar && (_jsxs("div", { className: styles.header, children: [_jsx(Toolbar, { search: {
|
|
144
146
|
value: globalFilter,
|
|
145
147
|
onChange: onGlobalFilterChange,
|
|
146
148
|
loading: search === null || search === void 0 ? void 0 : search.loading,
|
package/dist/components/index.js
CHANGED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { TruncateString } from '@snack-uikit/truncate-string';
|
|
3
|
+
import { CopyButton } from './components';
|
|
4
|
+
import styles from './styles.module.css';
|
|
5
|
+
export function CopyCell({ value }) {
|
|
6
|
+
return (_jsxs("div", { className: styles.copyCell, children: [_jsx(TruncateString, { text: String(value), maxLines: 1 }), _jsx(CopyButton, { valueToCopy: value, className: styles.copyButton })] }));
|
|
7
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import copyToClipboard from 'copy-to-clipboard';
|
|
3
|
+
import { useEffect, useRef, useState } from 'react';
|
|
4
|
+
import { ButtonFunction } from '@snack-uikit/button';
|
|
5
|
+
import { CheckSVG, CopySVG } from '@snack-uikit/icons';
|
|
6
|
+
export function CopyButton({ valueToCopy, className }) {
|
|
7
|
+
const [isChecked, setIsCheckedOpen] = useState(false);
|
|
8
|
+
const timerId = useRef();
|
|
9
|
+
const openChecked = () => setIsCheckedOpen(true);
|
|
10
|
+
const closeChecked = () => setIsCheckedOpen(false);
|
|
11
|
+
const handleClick = event => {
|
|
12
|
+
event.stopPropagation();
|
|
13
|
+
valueToCopy && copyToClipboard(String(valueToCopy), { format: 'text/plain' });
|
|
14
|
+
openChecked();
|
|
15
|
+
clearTimeout(timerId.current);
|
|
16
|
+
timerId.current = setTimeout(closeChecked, 1000);
|
|
17
|
+
};
|
|
18
|
+
useEffect(() => () => {
|
|
19
|
+
closeChecked();
|
|
20
|
+
clearTimeout(timerId.current);
|
|
21
|
+
}, []);
|
|
22
|
+
return (_jsx(ButtonFunction, { onClick: handleClick, "data-test-id": 'button-copy-value', type: 'button', icon: isChecked ? _jsx(CheckSVG, {}) : _jsx(CopySVG, {}), size: 's', className: className }));
|
|
23
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './CopyButton';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './CopyButton';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './CopyButton';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './CopyButton';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './CopyCell';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './CopyCell';
|
|
@@ -3,11 +3,12 @@ import { STATUS_APPEARANCE } from './constants';
|
|
|
3
3
|
import { StatusAppearance } from './types';
|
|
4
4
|
export type { StatusAppearance };
|
|
5
5
|
export { STATUS_APPEARANCE };
|
|
6
|
+
export type MapStatusToAppearanceFnType = (value: string | number) => StatusAppearance;
|
|
6
7
|
type BaseStatusColumnDef = {
|
|
7
8
|
/** Имя ключа соответствующее полю в data */
|
|
8
9
|
accessorKey: string;
|
|
9
10
|
/** Маппинг значений статуса на цвета */
|
|
10
|
-
mapStatusToAppearance
|
|
11
|
+
mapStatusToAppearance: MapStatusToAppearanceFnType;
|
|
11
12
|
/** Включение/выключение сортировки */
|
|
12
13
|
enableSorting?: boolean;
|
|
13
14
|
};
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
package/dist/types.d.ts
CHANGED
|
@@ -37,5 +37,5 @@ type PinnedColumnDefinition<TData> = BaseColumnDefinition<TData> & {
|
|
|
37
37
|
size: number;
|
|
38
38
|
};
|
|
39
39
|
export type ColumnDefinition<TData> = NormalColumnDefinition<TData> | PinnedColumnDefinition<TData>;
|
|
40
|
-
export type { RowActionInfo, RowActionProps, RowActionsColumnDefProps, StatusColumnDefinitionProps, RowInfo, RowClickHandler, ActionsGenerator, } from './helperComponents';
|
|
40
|
+
export type { RowActionInfo, RowActionProps, RowActionsColumnDefProps, StatusColumnDefinitionProps, RowInfo, RowClickHandler, ActionsGenerator, CopyCellProps, MapStatusToAppearanceFnType, } from './helperComponents';
|
|
41
41
|
export type { PaginationState, SortingState, RowSelectionState, RowSelectionOptions, TableEmptyStateProps, ToolbarProps, HeaderContext, CellContext, };
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
6
|
"title": "Table",
|
|
7
|
-
"version": "0.11.
|
|
7
|
+
"version": "0.11.8-preview-4c16b47e.0",
|
|
8
8
|
"sideEffects": [
|
|
9
9
|
"*.css",
|
|
10
10
|
"*.woff",
|
|
@@ -36,21 +36,23 @@
|
|
|
36
36
|
"@snack-uikit/chips": "0.10.11",
|
|
37
37
|
"@snack-uikit/icon-predefined": "0.4.1",
|
|
38
38
|
"@snack-uikit/icons": "0.20.1",
|
|
39
|
-
"@snack-uikit/list": "0.2.
|
|
39
|
+
"@snack-uikit/list": "0.2.2-preview-4c16b47e.0",
|
|
40
40
|
"@snack-uikit/pagination": "0.6.3",
|
|
41
41
|
"@snack-uikit/scroll": "0.5.0",
|
|
42
42
|
"@snack-uikit/skeleton": "0.3.2",
|
|
43
43
|
"@snack-uikit/tag": "0.7.2",
|
|
44
44
|
"@snack-uikit/toggles": "0.9.5",
|
|
45
|
-
"@snack-uikit/toolbar": "0.7.
|
|
45
|
+
"@snack-uikit/toolbar": "0.7.7-preview-4c16b47e.0",
|
|
46
46
|
"@snack-uikit/truncate-string": "0.4.7",
|
|
47
47
|
"@snack-uikit/typography": "0.6.1",
|
|
48
48
|
"@snack-uikit/utils": "3.2.0",
|
|
49
49
|
"@tanstack/match-sorter-utils": "8.8.4",
|
|
50
50
|
"@tanstack/react-table": "8.11.6",
|
|
51
51
|
"classnames": "2.3.2",
|
|
52
|
+
"copy-to-clipboard": "3.3.3",
|
|
53
|
+
"lodash.debounce": "4.0.8",
|
|
52
54
|
"uncontrollable": "8.0.0",
|
|
53
55
|
"xlsx": "https://cdn.sheetjs.com/xlsx-0.20.1/xlsx-0.20.1.tgz"
|
|
54
56
|
},
|
|
55
|
-
"gitHead": "
|
|
57
|
+
"gitHead": "b34b83d8b1a72a411232cb0cfedc133b705ea00c"
|
|
56
58
|
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import debounce from 'lodash.debounce';
|
|
2
|
+
import { useCallback, useMemo, useState } from 'react';
|
|
3
|
+
|
|
4
|
+
import { PaginationState } from '../../types';
|
|
5
|
+
import { Table, TableProps } from '../Table';
|
|
6
|
+
import { DEFAULT_PAGINATION_LIMIT, SEARCH_DELAY } from './constants';
|
|
7
|
+
|
|
8
|
+
export type ServerTableProps<TData extends object> = Omit<
|
|
9
|
+
TableProps<TData>,
|
|
10
|
+
'pageSize' | 'pageCount' | 'pagination' | 'search'
|
|
11
|
+
> & {
|
|
12
|
+
/** Данные для отрисовки */
|
|
13
|
+
items?: TData[];
|
|
14
|
+
/**
|
|
15
|
+
* Общее кол-во строк
|
|
16
|
+
* @default 10
|
|
17
|
+
*/
|
|
18
|
+
total?: number;
|
|
19
|
+
/**
|
|
20
|
+
* Кол-во строк на страницу
|
|
21
|
+
* @default 10
|
|
22
|
+
*/
|
|
23
|
+
limit?: number;
|
|
24
|
+
/**
|
|
25
|
+
* Смещение
|
|
26
|
+
* @default 0
|
|
27
|
+
* */
|
|
28
|
+
offset?: number;
|
|
29
|
+
|
|
30
|
+
onChangePage(offset: number, limit: number): void;
|
|
31
|
+
|
|
32
|
+
/** Параметры отвечают за глобальный поиск в таблице <br>
|
|
33
|
+
* <strong>initialState</strong>: Начальное состояние строки поиска <br>
|
|
34
|
+
* <strong>state</strong>: Состояние строки поиска, жестко устанавливаемое снаружи <br>
|
|
35
|
+
* <strong>placeholder</strong>: Placeholder строки поиска @default 'Search...'<br>
|
|
36
|
+
* <strong>loading</strong>: Состояние загрузки в строке поиска <br>
|
|
37
|
+
* <strong>onChange</strong>: Колбэк на изменение данных в строке поиска
|
|
38
|
+
* */
|
|
39
|
+
search: {
|
|
40
|
+
initialValue?: string;
|
|
41
|
+
state: string;
|
|
42
|
+
placeholder?: string;
|
|
43
|
+
loading?: boolean;
|
|
44
|
+
onChange(value: string): void;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
/** Параметры отвечают за пагинацию в таблице <br>
|
|
48
|
+
* <strong>options</strong>: Варианты в выпадающем селекторе для установки кол-ва строк на страницу<br>
|
|
49
|
+
* <strong>optionsLabel</strong>: Текст для селектора кол-ва строк на страницу @default 'Rows volume' <br>
|
|
50
|
+
* */
|
|
51
|
+
pagination?: {
|
|
52
|
+
options?: number[];
|
|
53
|
+
optionsLabel?: string;
|
|
54
|
+
};
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
export function ServerTable<TData extends object>({
|
|
58
|
+
items,
|
|
59
|
+
total = DEFAULT_PAGINATION_LIMIT,
|
|
60
|
+
limit = DEFAULT_PAGINATION_LIMIT,
|
|
61
|
+
offset = 0,
|
|
62
|
+
onChangePage,
|
|
63
|
+
search,
|
|
64
|
+
pagination,
|
|
65
|
+
columnFilters,
|
|
66
|
+
...rest
|
|
67
|
+
}: ServerTableProps<TData>) {
|
|
68
|
+
const [tempSearch, setTempSearch] = useState(search.initialValue || '');
|
|
69
|
+
|
|
70
|
+
const onSearchDebounced = useMemo(
|
|
71
|
+
() =>
|
|
72
|
+
debounce((newValue: string, onChange: (newValue: string) => void) => {
|
|
73
|
+
onChange(newValue);
|
|
74
|
+
}, SEARCH_DELAY),
|
|
75
|
+
[],
|
|
76
|
+
);
|
|
77
|
+
|
|
78
|
+
const handleSearch = useCallback(
|
|
79
|
+
(newValue: string) => {
|
|
80
|
+
setTempSearch(newValue);
|
|
81
|
+
onSearchDebounced(newValue.trim(), search.onChange);
|
|
82
|
+
},
|
|
83
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
84
|
+
[limit, onSearchDebounced],
|
|
85
|
+
);
|
|
86
|
+
|
|
87
|
+
const handlePageChange = useCallback(
|
|
88
|
+
({ pageSize, pageIndex }: PaginationState) => onChangePage(pageIndex * pageSize, pageSize),
|
|
89
|
+
[onChangePage],
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
const pageIndex = useMemo(() => Math.floor(offset / limit), [limit, offset]);
|
|
93
|
+
const pageCount = useMemo(() => Math.ceil(total / limit), [limit, total]);
|
|
94
|
+
|
|
95
|
+
return (
|
|
96
|
+
<Table
|
|
97
|
+
{...rest}
|
|
98
|
+
data={items || []}
|
|
99
|
+
search={{
|
|
100
|
+
state: tempSearch,
|
|
101
|
+
onChange: handleSearch,
|
|
102
|
+
loading: search.loading,
|
|
103
|
+
placeholder: search.placeholder,
|
|
104
|
+
disableDefaultSearch: true,
|
|
105
|
+
}}
|
|
106
|
+
columnFilters={columnFilters}
|
|
107
|
+
pageCount={pageCount}
|
|
108
|
+
pagination={{
|
|
109
|
+
...pagination,
|
|
110
|
+
state: {
|
|
111
|
+
pageIndex,
|
|
112
|
+
pageSize: limit,
|
|
113
|
+
},
|
|
114
|
+
onChange: handlePageChange,
|
|
115
|
+
}}
|
|
116
|
+
pageSize={limit}
|
|
117
|
+
/>
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
ServerTable.getRowActionsColumnDef = Table.getRowActionsColumnDef;
|
|
122
|
+
ServerTable.getStatusColumnDef = Table.getStatusColumnDef;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './ServerTable';
|
|
@@ -36,7 +36,7 @@ import { ColumnDefinition } from '../../types';
|
|
|
36
36
|
import { fuzzyFilter } from '../../utils';
|
|
37
37
|
import { TableEmptyState, TableEmptyStateProps } from '../TableEmptyState';
|
|
38
38
|
import { TablePagination } from '../TablePagination';
|
|
39
|
-
import { DEFAULT_NO_DATA_TABLE_STATE, DEFAULT_NO_RESULTS_TABLE_STATE } from './constants';
|
|
39
|
+
import { DEFAULT_NO_DATA_TABLE_STATE, DEFAULT_NO_RESULTS_TABLE_STATE, DEFAULT_PAGE_SIZE } from './constants';
|
|
40
40
|
import { useLoadingTable, useStateControl } from './hooks';
|
|
41
41
|
import styles from './styles.module.scss';
|
|
42
42
|
|
|
@@ -82,6 +82,7 @@ export type TableProps<TData extends object> = WithSupportProps<{
|
|
|
82
82
|
placeholder?: string;
|
|
83
83
|
loading?: boolean;
|
|
84
84
|
onChange?(value: string): void;
|
|
85
|
+
disableDefaultSearch?: boolean;
|
|
85
86
|
};
|
|
86
87
|
|
|
87
88
|
/** Максимальное кол-во строк на страницу @default 10 */
|
|
@@ -161,7 +162,7 @@ export function Table<TData extends object>({
|
|
|
161
162
|
onRefresh,
|
|
162
163
|
onDelete,
|
|
163
164
|
|
|
164
|
-
pageSize =
|
|
165
|
+
pageSize = DEFAULT_PAGE_SIZE,
|
|
165
166
|
pageCount,
|
|
166
167
|
loading = false,
|
|
167
168
|
outline = false,
|
|
@@ -252,6 +253,10 @@ export function Table<TData extends object>({
|
|
|
252
253
|
minSize: 40,
|
|
253
254
|
},
|
|
254
255
|
|
|
256
|
+
manualSorting: Boolean(pageCount),
|
|
257
|
+
manualPagination: pageCount !== undefined,
|
|
258
|
+
manualFiltering: Boolean(pageCount),
|
|
259
|
+
|
|
255
260
|
globalFilterFn: fuzzyFilter,
|
|
256
261
|
onGlobalFilterChange,
|
|
257
262
|
|
|
@@ -265,11 +270,12 @@ export function Table<TData extends object>({
|
|
|
265
270
|
enableColumnResizing: true,
|
|
266
271
|
|
|
267
272
|
enableSorting: true,
|
|
268
|
-
|
|
269
|
-
enableMultiSort:
|
|
270
|
-
|
|
273
|
+
|
|
274
|
+
enableMultiSort: true,
|
|
275
|
+
|
|
271
276
|
onSortingChange,
|
|
272
277
|
getSortedRowModel: getSortedRowModel(),
|
|
278
|
+
|
|
273
279
|
onPaginationChange,
|
|
274
280
|
getPaginationRowModel: getPaginationRowModel(),
|
|
275
281
|
|
|
@@ -339,10 +345,12 @@ export function Table<TData extends object>({
|
|
|
339
345
|
const loadingTableRows = loadingTable.getRowModel().rows;
|
|
340
346
|
const tablePagination = table.getState().pagination;
|
|
341
347
|
|
|
348
|
+
const prePageSize = !suppressPagination ? tablePagination?.pageSize : pageSize;
|
|
349
|
+
|
|
342
350
|
return (
|
|
343
351
|
<>
|
|
344
352
|
<div
|
|
345
|
-
style={{ '--page-size': !
|
|
353
|
+
style={{ '--page-size': !tableRows.length ? Math.min(prePageSize, DEFAULT_PAGE_SIZE) : prePageSize }}
|
|
346
354
|
className={cn(styles.wrapper, className)}
|
|
347
355
|
{...extractSupportProps(rest)}
|
|
348
356
|
>
|
package/src/components/index.ts
CHANGED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { TruncateString } from '@snack-uikit/truncate-string';
|
|
2
|
+
|
|
3
|
+
import { CopyButton } from './components';
|
|
4
|
+
import styles from './styles.module.scss';
|
|
5
|
+
|
|
6
|
+
export type CopyCellProps = {
|
|
7
|
+
value?: string | number;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export function CopyCell({ value }: CopyCellProps) {
|
|
11
|
+
return (
|
|
12
|
+
<div className={styles.copyCell}>
|
|
13
|
+
<TruncateString text={String(value)} maxLines={1} />
|
|
14
|
+
<CopyButton valueToCopy={value} className={styles.copyButton} />
|
|
15
|
+
</div>
|
|
16
|
+
);
|
|
17
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import copyToClipboard from 'copy-to-clipboard';
|
|
2
|
+
import { MouseEventHandler, useEffect, useRef, useState } from 'react';
|
|
3
|
+
|
|
4
|
+
import { ButtonFunction } from '@snack-uikit/button';
|
|
5
|
+
import { CheckSVG, CopySVG } from '@snack-uikit/icons';
|
|
6
|
+
|
|
7
|
+
export type CopyButtonProps = {
|
|
8
|
+
valueToCopy?: string | number;
|
|
9
|
+
className?: string;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export function CopyButton({ valueToCopy, className }: CopyButtonProps) {
|
|
13
|
+
const [isChecked, setIsCheckedOpen] = useState(false);
|
|
14
|
+
const timerId = useRef<ReturnType<typeof setTimeout>>();
|
|
15
|
+
const openChecked = () => setIsCheckedOpen(true);
|
|
16
|
+
const closeChecked = () => setIsCheckedOpen(false);
|
|
17
|
+
|
|
18
|
+
const handleClick: MouseEventHandler<HTMLButtonElement> = event => {
|
|
19
|
+
event.stopPropagation();
|
|
20
|
+
valueToCopy && copyToClipboard(String(valueToCopy), { format: 'text/plain' });
|
|
21
|
+
openChecked();
|
|
22
|
+
clearTimeout(timerId.current);
|
|
23
|
+
timerId.current = setTimeout(closeChecked, 1000);
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
useEffect(
|
|
27
|
+
() => () => {
|
|
28
|
+
closeChecked();
|
|
29
|
+
clearTimeout(timerId.current);
|
|
30
|
+
},
|
|
31
|
+
[],
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
return (
|
|
35
|
+
<ButtonFunction
|
|
36
|
+
onClick={handleClick}
|
|
37
|
+
data-test-id='button-copy-value'
|
|
38
|
+
type='button'
|
|
39
|
+
icon={isChecked ? <CheckSVG /> : <CopySVG />}
|
|
40
|
+
size='s'
|
|
41
|
+
className={className}
|
|
42
|
+
/>
|
|
43
|
+
);
|
|
44
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './CopyButton';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './CopyButton';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './CopyCell';
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
@import '@snack-uikit/figma-tokens/build/scss/styles-theme-variables';
|
|
2
|
+
|
|
3
|
+
.copyCell {
|
|
4
|
+
cursor: pointer;
|
|
5
|
+
|
|
6
|
+
display: flex;
|
|
7
|
+
gap: $dimension-050m;
|
|
8
|
+
align-items: center;
|
|
9
|
+
|
|
10
|
+
min-width: 0;
|
|
11
|
+
max-width: 100%;
|
|
12
|
+
.copyButton {
|
|
13
|
+
display: none;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
&:hover {
|
|
17
|
+
.copyButton {
|
|
18
|
+
display: inline-flex;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -16,11 +16,13 @@ type StatusCellProps = {
|
|
|
16
16
|
appearance: StatusAppearance;
|
|
17
17
|
};
|
|
18
18
|
|
|
19
|
+
export type MapStatusToAppearanceFnType = (value: string | number) => StatusAppearance;
|
|
20
|
+
|
|
19
21
|
type BaseStatusColumnDef = {
|
|
20
22
|
/** Имя ключа соответствующее полю в data */
|
|
21
23
|
accessorKey: string;
|
|
22
24
|
/** Маппинг значений статуса на цвета */
|
|
23
|
-
mapStatusToAppearance
|
|
25
|
+
mapStatusToAppearance: MapStatusToAppearanceFnType;
|
|
24
26
|
/** Включение/выключение сортировки */
|
|
25
27
|
enableSorting?: boolean;
|
|
26
28
|
};
|
package/src/index.ts
CHANGED