@snack-uikit/table 0.37.16-preview-964a845f.0 → 0.37.16
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 +9 -0
- package/README.md +2 -2
- package/dist/cjs/components/ServerTable/utils.d.ts +6 -1
- package/dist/cjs/components/Table/Table.js +10 -12
- package/dist/cjs/components/Table/hooks/useColumnSettings/useColumnSettings.js +2 -3
- package/dist/cjs/components/Table/hooks/useLoadingTable.d.ts +6 -2
- package/dist/cjs/components/Table/hooks/useLoadingTable.js +37 -9
- package/dist/cjs/components/Table/utils/getTableColumnsDefinitions.d.ts +2 -3
- package/dist/cjs/components/Table/utils/getTableColumnsDefinitions.js +2 -5
- package/dist/cjs/components/types.d.ts +0 -6
- package/dist/cjs/components/types.js +1 -7
- package/dist/cjs/helperComponents/Cells/TreeCell/TreeCell.d.ts +1 -3
- package/dist/cjs/helperComponents/Cells/TreeCell/TreeCell.js +2 -5
- package/dist/cjs/helperComponents/Rows/BodyRow.d.ts +1 -3
- package/dist/cjs/helperComponents/Rows/BodyRow.js +1 -4
- package/dist/cjs/helperComponents/Rows/styles.module.css +1 -3
- package/dist/cjs/helperComponents/TableEmptyState/TableEmptyState.d.ts +2 -9
- package/dist/esm/components/ServerTable/utils.d.ts +6 -1
- package/dist/esm/components/Table/Table.js +5 -3
- package/dist/esm/components/Table/hooks/useColumnSettings/useColumnSettings.js +1 -2
- package/dist/esm/components/Table/hooks/useLoadingTable.d.ts +6 -2
- package/dist/esm/components/Table/hooks/useLoadingTable.js +22 -3
- package/dist/esm/components/Table/utils/getTableColumnsDefinitions.d.ts +2 -3
- package/dist/esm/components/Table/utils/getTableColumnsDefinitions.js +2 -6
- package/dist/esm/components/types.d.ts +0 -6
- package/dist/esm/components/types.js +1 -5
- package/dist/esm/helperComponents/Cells/TreeCell/TreeCell.d.ts +1 -3
- package/dist/esm/helperComponents/Cells/TreeCell/TreeCell.js +2 -4
- package/dist/esm/helperComponents/Rows/BodyRow.d.ts +1 -3
- package/dist/esm/helperComponents/Rows/BodyRow.js +2 -3
- package/dist/esm/helperComponents/Rows/styles.module.css +1 -3
- package/dist/esm/helperComponents/TableEmptyState/TableEmptyState.d.ts +2 -9
- package/package.json +2 -3
- package/src/components/ServerTable/utils.ts +6 -1
- package/src/components/Table/Table.tsx +5 -12
- package/src/components/Table/hooks/useColumnSettings/useColumnSettings.ts +1 -2
- package/src/components/Table/hooks/useLoadingTable.tsx +49 -11
- package/src/components/Table/utils/getTableColumnsDefinitions.ts +2 -7
- package/src/components/types.ts +0 -7
- package/src/helperComponents/Cells/TreeCell/TreeCell.tsx +1 -6
- package/src/helperComponents/Rows/BodyRow.tsx +0 -4
- package/src/helperComponents/Rows/styles.module.scss +1 -3
- package/src/helperComponents/TableEmptyState/TableEmptyState.tsx +2 -11
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,15 @@
|
|
|
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
|
+
## <small>0.37.16 (2025-11-21)</small>
|
|
7
|
+
|
|
8
|
+
* fix(IAM-5889): fix table loading state ([27646e0](https://github.com/cloud-ru-tech/snack-uikit/commit/27646e0))
|
|
9
|
+
* feat(IAM-5889): extend table empty state props ([03463ff](https://github.com/cloud-ru-tech/snack-uikit/commit/03463ff))
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
6
15
|
## <small>0.37.15 (2025-11-14)</small>
|
|
7
16
|
|
|
8
17
|
### Only dependencies have been changed
|
package/README.md
CHANGED
|
@@ -126,7 +126,7 @@ const columnDefinitions: ColumnDefinition<TableData>[] = [
|
|
|
126
126
|
| sorting | `{ initialState?: SortingState; state?: SortingState; onChange?(state: SortingState): void; }` | - | Параметры отвечают за возможность сортировки, их стоит использовать если нужно отслеживать состояние <br> <strong>initialState</strong>: Начальное состояние сортировки <br> <strong>state</strong>: Состояние сортировки, жестко устанавливаемое снаружи <br> <strong>onChange</strong>: Колбэк на изменение сортировки |
|
|
127
127
|
| columnsSettings | `{ enableDrag?: boolean; enableSettingsMenu?: boolean; }` | - | Параметры отвечают за настройки колонок <br> <strong>enableDrag</strong>: Включение сортировки порядка столбцов вручную перетаскиванием <br> <strong>enableSettingsMenu</strong>: Включение настроек показа колонок <br> |
|
|
128
128
|
| expanding | `{ getSubRows: (element: TData) => TData[]; expandingColumnDefinition: TreeColumnDefinitionProps<TData>; state?: ExpandedState; onChange?(state: ExpandedState): void; }` | - | Параметр отвечает за общие настройки раскрывающихся строк <br> <strong>getSubRows</strong>: Метод отвечает за получение дочерних строк <br> <strong>expandingColumnDefinition</strong>: Описание колонок для дочерних строк <br> <strong>state</strong>: Состояние открытых строк <br> <strong>onExpandedChange</strong>: Колбэк на раскрытие строк <br> |
|
|
129
|
-
| rowSelection | `{ initialState?: RowSelectionState; state?: RowSelectionState; enable?: boolean \| ((row: Row<TData>) => boolean); multiRow?: boolean; onChange?(state: RowSelectionState): void;
|
|
129
|
+
| 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>: Колбэк на выбор строк |
|
|
130
130
|
| search | `{ initialState?: string; state?: string; placeholder?: string; loading?: boolean; onChange?(value: string): void; }` | 'Search'<br> <strong>loading</strong>: Состояние загрузки в строке поиска <br> <strong>onChange</strong>: Колбэк на изменение данных в строке поиска | Параметры отвечают за глобальный поиск в таблице <br> <strong>initialState</strong>: Начальное состояние строки поиска <br> <strong>state</strong>: Состояние строки поиска, жестко устанавливаемое снаружи <br> <strong>placeholder</strong>: Placeholder строки поиска |
|
|
131
131
|
| enableFuzzySearch | `boolean` | - | Включить нечеткий поиск |
|
|
132
132
|
| rowAutoHeight | `boolean` | - | |
|
|
@@ -200,7 +200,7 @@ const columnDefinitions: ColumnDefinition<TableData>[] = [
|
|
|
200
200
|
| enableSelectPinned | `boolean` | - | Параметр отвечает за чекбокс выбора закрепленных строк |
|
|
201
201
|
| columnsSettings | `{ enableDrag?: boolean; enableSettingsMenu?: boolean; }` | - | Параметры отвечают за настройки колонок <br> <strong>enableDrag</strong>: Включение сортировки порядка столбцов вручную перетаскиванием <br> <strong>enableSettingsMenu</strong>: Включение настроек показа колонок <br> |
|
|
202
202
|
| expanding | `{ getSubRows: (element: TData) => TData[]; expandingColumnDefinition: TreeColumnDefinitionProps<TData>; state?: ExpandedState; onChange?(state: ExpandedState): void; }` | - | Параметр отвечает за общие настройки раскрывающихся строк <br> <strong>getSubRows</strong>: Метод отвечает за получение дочерних строк <br> <strong>expandingColumnDefinition</strong>: Описание колонок для дочерних строк <br> <strong>state</strong>: Состояние открытых строк <br> <strong>onExpandedChange</strong>: Колбэк на раскрытие строк <br> |
|
|
203
|
-
| rowSelection | `{ initialState?: RowSelectionState; state?: RowSelectionState; enable?: boolean \| ((row: Row<TData>) => boolean); multiRow?: boolean; onChange?(state: RowSelectionState): void;
|
|
203
|
+
| 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>: Колбэк на выбор строк |
|
|
204
204
|
| enableFuzzySearch | `boolean` | - | Включить нечеткий поиск |
|
|
205
205
|
| rowAutoHeight | `boolean` | - | |
|
|
206
206
|
| onRowClick | `RowClickHandler<TData>` | - | Колбэк клика по строке |
|
|
@@ -1 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
import debounce from 'lodash.debounce';
|
|
2
|
+
type ChangeHandler = (newValue: string) => void;
|
|
3
|
+
type SearchHandler = (newValue: string, onChange: ChangeHandler) => void;
|
|
4
|
+
type OnSearchDebouncedType = ReturnType<typeof debounce<SearchHandler>>;
|
|
5
|
+
export declare const onSearchDebounced: OnSearchDebouncedType;
|
|
6
|
+
export {};
|
|
@@ -118,9 +118,8 @@ function Table(_a) {
|
|
|
118
118
|
columnDefinitions,
|
|
119
119
|
enableSelection,
|
|
120
120
|
enableSelectPinned,
|
|
121
|
-
expanding
|
|
122
|
-
|
|
123
|
-
}), [columnDefinitions, enableSelection, enableSelectPinned, expanding, rowSelectionProp === null || rowSelectionProp === void 0 ? void 0 : rowSelectionProp.appearance]);
|
|
121
|
+
expanding
|
|
122
|
+
}), [columnDefinitions, enableSelection, enableSelectPinned, expanding]);
|
|
124
123
|
const pinnedGroups = (0, react_1.useMemo)(() => (0, utils_3.getPinnedGroups)(allTableColumns), [allTableColumns]);
|
|
125
124
|
const {
|
|
126
125
|
enabledColumns,
|
|
@@ -246,7 +245,10 @@ function Table(_a) {
|
|
|
246
245
|
} = (0, hooks_1.useLoadingTable)({
|
|
247
246
|
pageSize: Math.min(Math.max(pageSize, 5), constants_1.DEFAULT_PAGE_SIZE),
|
|
248
247
|
columnDefinitions: enabledColumnsDefinitions,
|
|
249
|
-
columnPinning
|
|
248
|
+
columnPinning,
|
|
249
|
+
enableSelection,
|
|
250
|
+
enableSelectPinned,
|
|
251
|
+
expanding
|
|
250
252
|
});
|
|
251
253
|
const handleOnRefresh = (0, react_1.useCallback)(() => {
|
|
252
254
|
table.resetRowSelection();
|
|
@@ -458,8 +460,7 @@ function Table(_a) {
|
|
|
458
460
|
}), loadingTableRows.map(row => (0, jsx_runtime_1.jsx)(helperComponents_1.BodyRow, {
|
|
459
461
|
row: row,
|
|
460
462
|
rowAutoHeight: rowAutoHeight,
|
|
461
|
-
columnOrder: columnOrder
|
|
462
|
-
disabledRowAppearance: rowSelectionProp === null || rowSelectionProp === void 0 ? void 0 : rowSelectionProp.appearance
|
|
463
|
+
columnOrder: columnOrder
|
|
463
464
|
}, row.id))]
|
|
464
465
|
}) : (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, {
|
|
465
466
|
children: [centerRows.length || filteredTopRows.length ? (0, jsx_runtime_1.jsx)(helperComponents_1.HeaderRow, {
|
|
@@ -473,23 +474,20 @@ function Table(_a) {
|
|
|
473
474
|
onRowClick: onRowClick,
|
|
474
475
|
rowAutoHeight: rowAutoHeight,
|
|
475
476
|
columnOrder: columnOrder,
|
|
476
|
-
enableColumnsOrderSortByDrag: enableColumnsOrderSortByDrag
|
|
477
|
-
disabledRowAppearance: rowSelectionProp === null || rowSelectionProp === void 0 ? void 0 : rowSelectionProp.appearance
|
|
477
|
+
enableColumnsOrderSortByDrag: enableColumnsOrderSortByDrag
|
|
478
478
|
}, row.id))
|
|
479
479
|
}) : null, centerRows.map(row => (0, jsx_runtime_1.jsx)(helperComponents_1.BodyRow, {
|
|
480
480
|
row: row,
|
|
481
481
|
onRowClick: onRowClick,
|
|
482
482
|
rowAutoHeight: rowAutoHeight,
|
|
483
483
|
columnOrder: columnOrder,
|
|
484
|
-
enableColumnsOrderSortByDrag: enableColumnsOrderSortByDrag
|
|
485
|
-
disabledRowAppearance: rowSelectionProp === null || rowSelectionProp === void 0 ? void 0 : rowSelectionProp.appearance
|
|
484
|
+
enableColumnsOrderSortByDrag: enableColumnsOrderSortByDrag
|
|
486
485
|
}, row.id)), data.length > 0 && infiniteLoading && loading && !dataError && (0, jsx_runtime_1.jsx)(skeleton_1.SkeletonContextProvider, {
|
|
487
486
|
loading: true,
|
|
488
487
|
children: loadingTableRows.slice(0, 3).map(row => (0, jsx_runtime_1.jsx)(helperComponents_1.BodyRow, {
|
|
489
488
|
row: row,
|
|
490
489
|
columnOrder: columnOrder,
|
|
491
|
-
enableColumnsOrderSortByDrag: enableColumnsOrderSortByDrag
|
|
492
|
-
disabledRowAppearance: rowSelectionProp === null || rowSelectionProp === void 0 ? void 0 : rowSelectionProp.appearance
|
|
490
|
+
enableColumnsOrderSortByDrag: enableColumnsOrderSortByDrag
|
|
493
491
|
}, row.id))
|
|
494
492
|
}), (0, jsx_runtime_1.jsx)(helperComponents_1.TableEmptyState, {
|
|
495
493
|
emptyStates: emptyStates,
|
|
@@ -48,9 +48,8 @@ function useColumnSettings(_ref) {
|
|
|
48
48
|
columnDefinitions: enabledColumnsDefinitions,
|
|
49
49
|
enableSelection,
|
|
50
50
|
enableSelectPinned,
|
|
51
|
-
expanding
|
|
52
|
-
|
|
53
|
-
}), [enableSelectPinned, enableSelection, enabledColumnsDefinitions, expanding, rowSelection === null || rowSelection === void 0 ? void 0 : rowSelection.appearance]);
|
|
51
|
+
expanding
|
|
52
|
+
}), [enableSelectPinned, enableSelection, enabledColumnsDefinitions, expanding]);
|
|
54
53
|
const areAllColumnsEnabled = enabledColumns.length === configurableColumns.length;
|
|
55
54
|
const getColumnsSettings = (0, react_1.useCallback)(columnOrder => (0, utils_3.prepareColumnsSettings)({
|
|
56
55
|
pinnedGroups,
|
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
import { ColumnPinningState } from '@tanstack/react-table';
|
|
2
2
|
import { ColumnDefinition } from '../../../types';
|
|
3
|
-
|
|
3
|
+
import { TableProps } from '../../types';
|
|
4
|
+
type UseLoadingTableProps<TData extends object> = {
|
|
4
5
|
columnDefinitions: ColumnDefinition<TData>[];
|
|
5
6
|
pageSize: number;
|
|
6
7
|
columnPinning: ColumnPinningState;
|
|
8
|
+
enableSelection?: boolean;
|
|
9
|
+
enableSelectPinned?: boolean;
|
|
10
|
+
expanding?: TableProps<TData>['expanding'];
|
|
7
11
|
};
|
|
8
|
-
export declare function useLoadingTable<TData>({ pageSize, columnDefinitions, columnPinning }: UseLoadingTableProps<TData>): {
|
|
12
|
+
export declare function useLoadingTable<TData extends object>({ pageSize, columnDefinitions, columnPinning, enableSelection, enableSelectPinned, expanding, }: UseLoadingTableProps<TData>): {
|
|
9
13
|
loadingTable: import("@tanstack/react-table").Table<TData>;
|
|
10
14
|
};
|
|
11
15
|
export {};
|
|
@@ -13,23 +13,51 @@ const jsx_runtime_1 = require("react/jsx-runtime");
|
|
|
13
13
|
const react_table_1 = require("@tanstack/react-table");
|
|
14
14
|
const react_1 = require("react");
|
|
15
15
|
const skeleton_1 = require("@snack-uikit/skeleton");
|
|
16
|
+
const helperComponents_1 = require("../../../helperComponents");
|
|
16
17
|
const styles_module_scss_1 = __importDefault(require('../styles.module.css'));
|
|
18
|
+
function CellSkeleton() {
|
|
19
|
+
return (0, jsx_runtime_1.jsx)(skeleton_1.SkeletonText, {
|
|
20
|
+
className: styles_module_scss_1.default.skeleton,
|
|
21
|
+
lines: 1,
|
|
22
|
+
width: '100%'
|
|
23
|
+
});
|
|
24
|
+
}
|
|
17
25
|
function useLoadingTable(_ref) {
|
|
18
26
|
let {
|
|
19
27
|
pageSize,
|
|
20
28
|
columnDefinitions,
|
|
21
|
-
columnPinning
|
|
29
|
+
columnPinning,
|
|
30
|
+
enableSelection,
|
|
31
|
+
enableSelectPinned,
|
|
32
|
+
expanding
|
|
22
33
|
} = _ref;
|
|
23
34
|
const data = (0, react_1.useMemo)(() => Array.from({
|
|
24
35
|
length: pageSize
|
|
25
|
-
}).map(() =>
|
|
26
|
-
const columns = (0, react_1.useMemo)(() =>
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
36
|
+
}).map(() => ({})), [pageSize]);
|
|
37
|
+
const columns = (0, react_1.useMemo)(() => {
|
|
38
|
+
let cols = columnDefinitions.map(column => Object.assign(Object.assign({}, column), {
|
|
39
|
+
cell: () => (0, jsx_runtime_1.jsx)(CellSkeleton, {})
|
|
40
|
+
}));
|
|
41
|
+
// for selection column
|
|
42
|
+
if (enableSelection && !expanding) {
|
|
43
|
+
const selectionColumnDef = (0, helperComponents_1.getSelectionCellColumnDef)(enableSelectPinned !== null && enableSelectPinned !== void 0 ? enableSelectPinned : false);
|
|
44
|
+
const loadingSelectionColumn = Object.assign(Object.assign({}, selectionColumnDef), {
|
|
45
|
+
cell: () => (0, jsx_runtime_1.jsx)(CellSkeleton, {})
|
|
46
|
+
});
|
|
47
|
+
cols = [loadingSelectionColumn, ...cols];
|
|
48
|
+
}
|
|
49
|
+
// for tree column
|
|
50
|
+
if (expanding) {
|
|
51
|
+
const treeColumnDef = (0, helperComponents_1.getTreeColumnDef)(Object.assign(Object.assign({}, expanding.expandingColumnDefinition), {
|
|
52
|
+
enableSelection
|
|
53
|
+
}));
|
|
54
|
+
const loadingTreeColumn = Object.assign(Object.assign({}, treeColumnDef), {
|
|
55
|
+
cell: () => (0, jsx_runtime_1.jsx)(CellSkeleton, {})
|
|
56
|
+
});
|
|
57
|
+
cols = [loadingTreeColumn, ...cols];
|
|
58
|
+
}
|
|
59
|
+
return cols;
|
|
60
|
+
}, [columnDefinitions, enableSelection, enableSelectPinned, expanding]);
|
|
33
61
|
const loadingTable = (0, react_table_1.useReactTable)({
|
|
34
62
|
data,
|
|
35
63
|
columns,
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { ColumnDefinition } from '../../../types';
|
|
2
|
-
import {
|
|
2
|
+
import { TableProps } from '../../types';
|
|
3
3
|
type GetTableColumnsDefinitionsProps<TData extends object> = {
|
|
4
4
|
columnDefinitions: ColumnDefinition<TData>[];
|
|
5
5
|
enableSelection: boolean;
|
|
6
6
|
enableSelectPinned: boolean;
|
|
7
7
|
expanding: TableProps<TData>['expanding'];
|
|
8
|
-
rowSelectionAppearance?: RowAppearance;
|
|
9
8
|
};
|
|
10
|
-
export declare function getTableColumnsDefinitions<TData extends object>({ columnDefinitions, enableSelection, enableSelectPinned, expanding,
|
|
9
|
+
export declare function getTableColumnsDefinitions<TData extends object>({ columnDefinitions, enableSelection, enableSelectPinned, expanding, }: GetTableColumnsDefinitionsProps<TData>): ColumnDefinition<TData>[];
|
|
11
10
|
export {};
|
|
@@ -5,14 +5,12 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.getTableColumnsDefinitions = getTableColumnsDefinitions;
|
|
7
7
|
const helperComponents_1 = require("../../../helperComponents");
|
|
8
|
-
const types_1 = require("../../types");
|
|
9
8
|
function getTableColumnsDefinitions(_ref) {
|
|
10
9
|
let {
|
|
11
10
|
columnDefinitions,
|
|
12
11
|
enableSelection,
|
|
13
12
|
enableSelectPinned,
|
|
14
|
-
expanding
|
|
15
|
-
rowSelectionAppearance = types_1.RowAppearance.Disabled
|
|
13
|
+
expanding
|
|
16
14
|
} = _ref;
|
|
17
15
|
let cols = columnDefinitions;
|
|
18
16
|
if (enableSelection && !expanding) {
|
|
@@ -20,8 +18,7 @@ function getTableColumnsDefinitions(_ref) {
|
|
|
20
18
|
}
|
|
21
19
|
if (expanding) {
|
|
22
20
|
cols = [(0, helperComponents_1.getTreeColumnDef)(Object.assign(Object.assign({}, expanding.expandingColumnDefinition), {
|
|
23
|
-
enableSelection
|
|
24
|
-
rowSelectionAppearance
|
|
21
|
+
enableSelection
|
|
25
22
|
})), ...cols];
|
|
26
23
|
}
|
|
27
24
|
return cols;
|
|
@@ -10,10 +10,6 @@ export type TableRowColor = ValueOf<typeof TABLE_ROW_COLOR>;
|
|
|
10
10
|
type BulkAction = Omit<NonNullable<ToolbarProps<Record<string, string>>['bulkActions']>[number], 'onClick'> & {
|
|
11
11
|
onClick?(selectionState: RowSelectionState, resetRowSelection: (defaultState?: boolean) => void): void;
|
|
12
12
|
};
|
|
13
|
-
export declare enum RowAppearance {
|
|
14
|
-
Disabled = "disabled",
|
|
15
|
-
HideToggler = "hide-toggler"
|
|
16
|
-
}
|
|
17
13
|
type BaseTableProps<TData extends object, TFilters extends FiltersState = Record<string, unknown>> = WithSupportProps<{
|
|
18
14
|
/** Данные для отрисовки */
|
|
19
15
|
data: TData[];
|
|
@@ -59,7 +55,6 @@ type BaseTableProps<TData extends object, TFilters extends FiltersState = Record
|
|
|
59
55
|
* <strong>initialState</strong>: Начальное состояние выбора строк <br>
|
|
60
56
|
* <strong>state</strong>: Состояние выбора строк, жестко устанавливаемое снаружи <br>
|
|
61
57
|
* <strong>enable</strong>: Колбэк определяющий можно ли выбрать строку <br>
|
|
62
|
-
* <strong>appearance</strong>: Режим отображения недоступной для выбора строки. Опции: RowAppearance.Disabled (по дефолту) - серый фон, чекбокс/радиобаттон скрыт, RowAppearance.HideToggler - обычный фон, чекбокс/радиобаттон скрыт <br>
|
|
63
58
|
* <strong>multiRow</strong>: Мульти-выбор строк (включен по-умолчанию, когда включается выбор) <br>
|
|
64
59
|
* <strong>onChange</strong>: Колбэк на выбор строк
|
|
65
60
|
* */
|
|
@@ -69,7 +64,6 @@ type BaseTableProps<TData extends object, TFilters extends FiltersState = Record
|
|
|
69
64
|
enable?: RowSelectionOptions<TData>['enableRowSelection'];
|
|
70
65
|
multiRow?: boolean;
|
|
71
66
|
onChange?(state: RowSelectionState): void;
|
|
72
|
-
appearance?: RowAppearance;
|
|
73
67
|
};
|
|
74
68
|
/** Параметры отвечают за глобальный поиск в таблице <br>
|
|
75
69
|
* <strong>initialState</strong>: Начальное состояние строки поиска <br>
|
|
@@ -2,10 +2,4 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.RowAppearance = void 0;
|
|
7
|
-
var RowAppearance;
|
|
8
|
-
(function (RowAppearance) {
|
|
9
|
-
RowAppearance["Disabled"] = "disabled";
|
|
10
|
-
RowAppearance["HideToggler"] = "hide-toggler";
|
|
11
|
-
})(RowAppearance || (exports.RowAppearance = RowAppearance = {}));
|
|
5
|
+
});
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { CellContext } from '@tanstack/react-table';
|
|
2
2
|
import { ReactNode } from 'react';
|
|
3
|
-
import { RowAppearance } from '../../../components';
|
|
4
3
|
import { ColumnDefinition } from '../../../types';
|
|
5
4
|
type BaseTreeColumnDef = {
|
|
6
5
|
/** Имя ключа соответствующее полю в data */
|
|
@@ -27,8 +26,7 @@ type TreeColumnDefWithDescription<TData> = BaseTreeColumnDef & {
|
|
|
27
26
|
export type TreeColumnDefinitionProps<TData> = TreeColumnDef | TreeColumnDefWithDescription<TData>;
|
|
28
27
|
type TreeColDefProps<TData> = TreeColumnDefinitionProps<TData> & {
|
|
29
28
|
enableSelection?: boolean;
|
|
30
|
-
rowSelectionAppearance: RowAppearance;
|
|
31
29
|
};
|
|
32
30
|
/** Вспомогательная функция для создания ячейки со статусом */
|
|
33
|
-
export declare function getTreeColumnDef<TData>({ showToggle, icon, expandedIcon, collapsedIcon, header, accessorKey, cell: renderCell, enableSelection,
|
|
31
|
+
export declare function getTreeColumnDef<TData>({ showToggle, icon, expandedIcon, collapsedIcon, header, accessorKey, cell: renderCell, enableSelection, }: TreeColDefProps<TData>): ColumnDefinition<TData>;
|
|
34
32
|
export {};
|
|
@@ -15,7 +15,6 @@ const button_1 = require("@snack-uikit/button");
|
|
|
15
15
|
const icons_1 = require("@snack-uikit/icons");
|
|
16
16
|
const toggles_1 = require("@snack-uikit/toggles");
|
|
17
17
|
const truncate_string_1 = require("@snack-uikit/truncate-string");
|
|
18
|
-
const components_1 = require("../../../components");
|
|
19
18
|
const constants_1 = require("../../../constants");
|
|
20
19
|
const contexts_1 = require("../../../contexts");
|
|
21
20
|
const constants_2 = require("./constants");
|
|
@@ -37,8 +36,7 @@ function getTreeColumnDef(_ref) {
|
|
|
37
36
|
header,
|
|
38
37
|
accessorKey,
|
|
39
38
|
cell: renderCell,
|
|
40
|
-
enableSelection
|
|
41
|
-
rowSelectionAppearance
|
|
39
|
+
enableSelection
|
|
42
40
|
} = _ref;
|
|
43
41
|
const cell = function TreeCell(ctx) {
|
|
44
42
|
var _a;
|
|
@@ -59,7 +57,6 @@ function getTreeColumnDef(_ref) {
|
|
|
59
57
|
const {
|
|
60
58
|
ref
|
|
61
59
|
} = (0, contexts_1.useCellResize)(constants_2.TREE_CELL_ID, cell);
|
|
62
|
-
const isToggleHidden = !isRowsSelectionEnabled && rowSelectionAppearance === components_1.RowAppearance.HideToggler;
|
|
63
60
|
const linesVisibilityByIndex = (0, react_1.useMemo)(() => {
|
|
64
61
|
var _a;
|
|
65
62
|
const parents = [];
|
|
@@ -144,7 +141,7 @@ function getTreeColumnDef(_ref) {
|
|
|
144
141
|
"data-disabled": !isRowsSelectionEnabled || undefined,
|
|
145
142
|
"data-selected": isRowSelected || undefined,
|
|
146
143
|
"data-multiselect": isMultiSelect || undefined,
|
|
147
|
-
children: [showToggle &&
|
|
144
|
+
children: [showToggle && (0, jsx_runtime_1.jsx)("div", {
|
|
148
145
|
tabIndex: -1,
|
|
149
146
|
className: styles_module_scss_1.default.treeCheckboxWrap,
|
|
150
147
|
children: isMultiSelect ? (0, jsx_runtime_1.jsx)(toggles_1.Checkbox, {
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { Row as TableRow } from '@tanstack/react-table';
|
|
2
2
|
import { MouseEvent } from 'react';
|
|
3
|
-
import { RowAppearance } from '../../components';
|
|
4
3
|
import { ColumnOrder } from '../../types';
|
|
5
4
|
import { RowProps } from './Row';
|
|
6
5
|
export type RowInfo<TData> = {
|
|
@@ -15,6 +14,5 @@ export type BodyRowProps<TData> = Pick<RowProps, 'rowAutoHeight'> & {
|
|
|
15
14
|
onRowClick?: RowClickHandler<TData>;
|
|
16
15
|
columnOrder: ColumnOrder;
|
|
17
16
|
enableColumnsOrderSortByDrag?: boolean;
|
|
18
|
-
disabledRowAppearance?: RowAppearance;
|
|
19
17
|
};
|
|
20
|
-
export declare function BodyRow<TData>({ row, onRowClick, rowAutoHeight, columnOrder, enableColumnsOrderSortByDrag,
|
|
18
|
+
export declare function BodyRow<TData>({ row, onRowClick, rowAutoHeight, columnOrder, enableColumnsOrderSortByDrag, }: BodyRowProps<TData>): import("react/jsx-runtime").JSX.Element;
|
|
@@ -12,7 +12,6 @@ exports.BodyRow = BodyRow;
|
|
|
12
12
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
13
13
|
const sortable_1 = require("@dnd-kit/sortable");
|
|
14
14
|
const react_1 = require("react");
|
|
15
|
-
const components_1 = require("../../components");
|
|
16
15
|
const constants_1 = require("../../constants");
|
|
17
16
|
const Cells_1 = require("../Cells");
|
|
18
17
|
const contexts_1 = require("../contexts");
|
|
@@ -26,8 +25,7 @@ function BodyRow(_ref) {
|
|
|
26
25
|
onRowClick,
|
|
27
26
|
rowAutoHeight,
|
|
28
27
|
columnOrder,
|
|
29
|
-
enableColumnsOrderSortByDrag
|
|
30
|
-
disabledRowAppearance = components_1.RowAppearance.Disabled
|
|
28
|
+
enableColumnsOrderSortByDrag
|
|
31
29
|
} = _ref;
|
|
32
30
|
const {
|
|
33
31
|
leftPinned,
|
|
@@ -59,7 +57,6 @@ function BodyRow(_ref) {
|
|
|
59
57
|
onClick: handleRowClick,
|
|
60
58
|
"data-clickable": Boolean(onRowClick) || undefined,
|
|
61
59
|
"data-disabled": disabled || undefined,
|
|
62
|
-
"data-row-appearance": disabled ? disabledRowAppearance : undefined,
|
|
63
60
|
"data-selected": isSelected || undefined,
|
|
64
61
|
"data-actions-opened": dropListOpened || undefined,
|
|
65
62
|
"data-test-id": constants_1.TEST_IDS.bodyRow,
|
|
@@ -84,11 +84,9 @@
|
|
|
84
84
|
}
|
|
85
85
|
.bodyRow[data-disabled]{
|
|
86
86
|
cursor:not-allowed;
|
|
87
|
-
}
|
|
88
|
-
.bodyRow[data-row-appearance=disabled]{
|
|
89
87
|
background-color:var(--sys-neutral-background, #eeeff3);
|
|
90
88
|
}
|
|
91
|
-
.bodyRow[data-
|
|
89
|
+
.bodyRow[data-disabled] .rowPinnedCells{
|
|
92
90
|
background-color:var(--sys-neutral-background, #eeeff3);
|
|
93
91
|
}
|
|
94
92
|
.bodyRow[data-selected]{
|
|
@@ -1,12 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
export type EmptyStateProps = {
|
|
4
|
-
title?: string;
|
|
5
|
-
description?: string;
|
|
6
|
-
icon?: Pick<IconPredefinedProps, 'icon' | 'decor' | 'appearance'>;
|
|
7
|
-
footer?: ReactNode;
|
|
8
|
-
className?: string;
|
|
9
|
-
};
|
|
1
|
+
import { InfoBlockProps } from '@snack-uikit/info-block';
|
|
2
|
+
export type EmptyStateProps = Pick<InfoBlockProps, 'title' | 'description' | 'icon' | 'footer' | 'className'>;
|
|
10
3
|
export type TableEmptyState = {
|
|
11
4
|
emptyStates: {
|
|
12
5
|
noDataState: EmptyStateProps;
|
|
@@ -1 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
import debounce from 'lodash.debounce';
|
|
2
|
+
type ChangeHandler = (newValue: string) => void;
|
|
3
|
+
type SearchHandler = (newValue: string, onChange: ChangeHandler) => void;
|
|
4
|
+
type OnSearchDebouncedType = ReturnType<typeof debounce<SearchHandler>>;
|
|
5
|
+
export declare const onSearchDebounced: OnSearchDebouncedType;
|
|
6
|
+
export {};
|
|
@@ -58,8 +58,7 @@ export function Table(_a) {
|
|
|
58
58
|
enableSelection,
|
|
59
59
|
enableSelectPinned,
|
|
60
60
|
expanding,
|
|
61
|
-
|
|
62
|
-
}), [columnDefinitions, enableSelection, enableSelectPinned, expanding, rowSelectionProp === null || rowSelectionProp === void 0 ? void 0 : rowSelectionProp.appearance]);
|
|
61
|
+
}), [columnDefinitions, enableSelection, enableSelectPinned, expanding]);
|
|
63
62
|
const pinnedGroups = useMemo(() => getPinnedGroups(allTableColumns), [allTableColumns]);
|
|
64
63
|
const { enabledColumns, setEnabledColumns, getColumnsSettings, enabledTableColumns, enabledColumnsDefinitions, areColumnsSettingsEnabled, } = useColumnSettings({
|
|
65
64
|
columnDefinitions,
|
|
@@ -166,6 +165,9 @@ export function Table(_a) {
|
|
|
166
165
|
pageSize: Math.min(Math.max(pageSize, 5), DEFAULT_PAGE_SIZE),
|
|
167
166
|
columnDefinitions: enabledColumnsDefinitions,
|
|
168
167
|
columnPinning,
|
|
168
|
+
enableSelection,
|
|
169
|
+
enableSelectPinned,
|
|
170
|
+
expanding,
|
|
169
171
|
});
|
|
170
172
|
const handleOnRefresh = useCallback(() => {
|
|
171
173
|
table.resetRowSelection();
|
|
@@ -300,7 +302,7 @@ export function Table(_a) {
|
|
|
300
302
|
}
|
|
301
303
|
},
|
|
302
304
|
}
|
|
303
|
-
: undefined, bulkActions: bulkActions, selectionMode: (rowSelectionProp === null || rowSelectionProp === void 0 ? void 0 : rowSelectionProp.multiRow) ? 'multiple' : 'single', checked: table.getIsAllPageRowsSelected(), indeterminate: table.getIsSomePageRowsSelected(), onCheck: enableSelection ? handleOnToolbarCheck : undefined, outline: outline, after: toolbarAfter || exportSettings || areColumnsSettingsEnabled ? (_jsxs(_Fragment, { children: [toolbarAfter, exportSettings && (_jsx(ExportButton, { settings: exportSettings, columnDefinitions: columnDefinitions, data: data, topRows: filteredTopRows, centerRows: centerRows })), areColumnsSettingsEnabled && (_jsx(ColumnsSettings, { columnsSettings: columnsSettings, enabledColumns: enabledColumns, setEnabledColumns: setEnabledColumns }))] })) : undefined, moreActions: moreActions, filterRow: patchedFilter, "data-test-id": TEST_IDS.toolbar }) })), _jsxs(Scroll, { size: 's', className: styles.table, ref: scrollContainerRef, "data-outline": outline || undefined, children: [_jsx("div", { className: styles.tableContent, style: columnSizes.vars, children: _jsx(CellAutoResizeContext.Provider, { value: { updateCellMap }, children: _jsx(DndContext, Object.assign({}, dndContextProps, { children: _jsx(TableContext.Provider, { value: { table, getRowBackgroundColor }, children: (!infiniteLoading || !data.length) && loading ? (_jsxs(SkeletonContextProvider, { loading: true, children: [_jsx(HeaderRow, { rowAutoHeight: rowAutoHeight, columnOrder: columnOrder }), loadingTableRows.map(row => (_jsx(BodyRow, { row: row, rowAutoHeight: rowAutoHeight, columnOrder: columnOrder
|
|
305
|
+
: undefined, bulkActions: bulkActions, selectionMode: (rowSelectionProp === null || rowSelectionProp === void 0 ? void 0 : rowSelectionProp.multiRow) ? 'multiple' : 'single', checked: table.getIsAllPageRowsSelected(), indeterminate: table.getIsSomePageRowsSelected(), onCheck: enableSelection ? handleOnToolbarCheck : undefined, outline: outline, after: toolbarAfter || exportSettings || areColumnsSettingsEnabled ? (_jsxs(_Fragment, { children: [toolbarAfter, exportSettings && (_jsx(ExportButton, { settings: exportSettings, columnDefinitions: columnDefinitions, data: data, topRows: filteredTopRows, centerRows: centerRows })), areColumnsSettingsEnabled && (_jsx(ColumnsSettings, { columnsSettings: columnsSettings, enabledColumns: enabledColumns, setEnabledColumns: setEnabledColumns }))] })) : undefined, moreActions: moreActions, filterRow: patchedFilter, "data-test-id": TEST_IDS.toolbar }) })), _jsxs(Scroll, { size: 's', className: styles.table, ref: scrollContainerRef, "data-outline": outline || undefined, children: [_jsx("div", { className: styles.tableContent, style: columnSizes.vars, children: _jsx(CellAutoResizeContext.Provider, { value: { updateCellMap }, children: _jsx(DndContext, Object.assign({}, dndContextProps, { children: _jsx(TableContext.Provider, { value: { table, getRowBackgroundColor }, children: (!infiniteLoading || !data.length) && loading ? (_jsxs(SkeletonContextProvider, { loading: true, children: [_jsx(HeaderRow, { rowAutoHeight: rowAutoHeight, columnOrder: columnOrder }), loadingTableRows.map(row => (_jsx(BodyRow, { row: row, rowAutoHeight: rowAutoHeight, columnOrder: columnOrder }, row.id)))] })) : (_jsxs(_Fragment, { children: [centerRows.length || filteredTopRows.length ? (_jsx(HeaderRow, { rowAutoHeight: rowAutoHeight, columnOrder: columnOrder, enableColumnsOrderSortByDrag: enableColumnsOrderSortByDrag })) : null, filteredTopRows.length ? (_jsx("div", { className: styles.topRowWrapper, children: filteredTopRows.map(row => (_jsx(BodyRow, { row: row, onRowClick: onRowClick, rowAutoHeight: rowAutoHeight, columnOrder: columnOrder, enableColumnsOrderSortByDrag: enableColumnsOrderSortByDrag }, row.id))) })) : null, centerRows.map(row => (_jsx(BodyRow, { row: row, onRowClick: onRowClick, rowAutoHeight: rowAutoHeight, columnOrder: columnOrder, enableColumnsOrderSortByDrag: enableColumnsOrderSortByDrag }, row.id))), data.length > 0 && infiniteLoading && loading && !dataError && (_jsx(SkeletonContextProvider, { loading: true, children: loadingTableRows.slice(0, 3).map(row => (_jsx(BodyRow, { row: row, columnOrder: columnOrder, enableColumnsOrderSortByDrag: enableColumnsOrderSortByDrag }, row.id))) })), _jsx(TableEmptyState, { emptyStates: emptyStates, dataError: dataError, dataFiltered: dataFiltered || Boolean(table.getState().globalFilter), tableRowsLength: tableRows.length + filteredTopRows.length })] })) }) })) }) }), _jsx("div", { className: styles.scrollStub, ref: scrollRef })] }), !infiniteLoading && !suppressPagination && (_jsx(TablePagination, { table: table, options: paginationProp === null || paginationProp === void 0 ? void 0 : paginationProp.options, optionsLabel: paginationProp === null || paginationProp === void 0 ? void 0 : paginationProp.optionsLabel, pageCount: pageCount, optionsRender: paginationProp === null || paginationProp === void 0 ? void 0 : paginationProp.optionsRender }))] })));
|
|
304
306
|
}
|
|
305
307
|
Table.getStatusColumnDef = getStatusColumnDef;
|
|
306
308
|
Table.statusAppearances = STATUS_APPEARANCE;
|
|
@@ -32,8 +32,7 @@ export function useColumnSettings({ columnDefinitions, columnsSettings, pinnedGr
|
|
|
32
32
|
enableSelection,
|
|
33
33
|
enableSelectPinned,
|
|
34
34
|
expanding,
|
|
35
|
-
|
|
36
|
-
}), [enableSelectPinned, enableSelection, enabledColumnsDefinitions, expanding, rowSelection === null || rowSelection === void 0 ? void 0 : rowSelection.appearance]);
|
|
35
|
+
}), [enableSelectPinned, enableSelection, enabledColumnsDefinitions, expanding]);
|
|
37
36
|
const areAllColumnsEnabled = enabledColumns.length === configurableColumns.length;
|
|
38
37
|
const getColumnsSettings = useCallback((columnOrder) => prepareColumnsSettings({
|
|
39
38
|
pinnedGroups,
|
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
import { ColumnPinningState } from '@tanstack/react-table';
|
|
2
2
|
import { ColumnDefinition } from '../../../types';
|
|
3
|
-
|
|
3
|
+
import { TableProps } from '../../types';
|
|
4
|
+
type UseLoadingTableProps<TData extends object> = {
|
|
4
5
|
columnDefinitions: ColumnDefinition<TData>[];
|
|
5
6
|
pageSize: number;
|
|
6
7
|
columnPinning: ColumnPinningState;
|
|
8
|
+
enableSelection?: boolean;
|
|
9
|
+
enableSelectPinned?: boolean;
|
|
10
|
+
expanding?: TableProps<TData>['expanding'];
|
|
7
11
|
};
|
|
8
|
-
export declare function useLoadingTable<TData>({ pageSize, columnDefinitions, columnPinning }: UseLoadingTableProps<TData>): {
|
|
12
|
+
export declare function useLoadingTable<TData extends object>({ pageSize, columnDefinitions, columnPinning, enableSelection, enableSelectPinned, expanding, }: UseLoadingTableProps<TData>): {
|
|
9
13
|
loadingTable: import("@tanstack/react-table").Table<TData>;
|
|
10
14
|
};
|
|
11
15
|
export {};
|
|
@@ -2,10 +2,29 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
2
2
|
import { getCoreRowModel, useReactTable } from '@tanstack/react-table';
|
|
3
3
|
import { useMemo } from 'react';
|
|
4
4
|
import { SkeletonText } from '@snack-uikit/skeleton';
|
|
5
|
+
import { getSelectionCellColumnDef, getTreeColumnDef } from '../../../helperComponents';
|
|
5
6
|
import styles from '../styles.module.css';
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
function CellSkeleton() {
|
|
8
|
+
return _jsx(SkeletonText, { className: styles.skeleton, lines: 1, width: '100%' });
|
|
9
|
+
}
|
|
10
|
+
export function useLoadingTable({ pageSize, columnDefinitions, columnPinning, enableSelection, enableSelectPinned, expanding, }) {
|
|
11
|
+
const data = useMemo(() => Array.from({ length: pageSize }).map(() => ({})), [pageSize]);
|
|
12
|
+
const columns = useMemo(() => {
|
|
13
|
+
let cols = columnDefinitions.map(column => (Object.assign(Object.assign({}, column), { cell: () => _jsx(CellSkeleton, {}) })));
|
|
14
|
+
// for selection column
|
|
15
|
+
if (enableSelection && !expanding) {
|
|
16
|
+
const selectionColumnDef = getSelectionCellColumnDef(enableSelectPinned !== null && enableSelectPinned !== void 0 ? enableSelectPinned : false);
|
|
17
|
+
const loadingSelectionColumn = Object.assign(Object.assign({}, selectionColumnDef), { cell: () => _jsx(CellSkeleton, {}) });
|
|
18
|
+
cols = [loadingSelectionColumn, ...cols];
|
|
19
|
+
}
|
|
20
|
+
// for tree column
|
|
21
|
+
if (expanding) {
|
|
22
|
+
const treeColumnDef = getTreeColumnDef(Object.assign(Object.assign({}, expanding.expandingColumnDefinition), { enableSelection }));
|
|
23
|
+
const loadingTreeColumn = Object.assign(Object.assign({}, treeColumnDef), { cell: () => _jsx(CellSkeleton, {}) });
|
|
24
|
+
cols = [loadingTreeColumn, ...cols];
|
|
25
|
+
}
|
|
26
|
+
return cols;
|
|
27
|
+
}, [columnDefinitions, enableSelection, enableSelectPinned, expanding]);
|
|
9
28
|
const loadingTable = useReactTable({
|
|
10
29
|
data,
|
|
11
30
|
columns,
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { ColumnDefinition } from '../../../types';
|
|
2
|
-
import {
|
|
2
|
+
import { TableProps } from '../../types';
|
|
3
3
|
type GetTableColumnsDefinitionsProps<TData extends object> = {
|
|
4
4
|
columnDefinitions: ColumnDefinition<TData>[];
|
|
5
5
|
enableSelection: boolean;
|
|
6
6
|
enableSelectPinned: boolean;
|
|
7
7
|
expanding: TableProps<TData>['expanding'];
|
|
8
|
-
rowSelectionAppearance?: RowAppearance;
|
|
9
8
|
};
|
|
10
|
-
export declare function getTableColumnsDefinitions<TData extends object>({ columnDefinitions, enableSelection, enableSelectPinned, expanding,
|
|
9
|
+
export declare function getTableColumnsDefinitions<TData extends object>({ columnDefinitions, enableSelection, enableSelectPinned, expanding, }: GetTableColumnsDefinitionsProps<TData>): ColumnDefinition<TData>[];
|
|
11
10
|
export {};
|
|
@@ -1,15 +1,11 @@
|
|
|
1
1
|
import { getSelectionCellColumnDef, getTreeColumnDef } from '../../../helperComponents';
|
|
2
|
-
|
|
3
|
-
export function getTableColumnsDefinitions({ columnDefinitions, enableSelection, enableSelectPinned, expanding, rowSelectionAppearance = RowAppearance.Disabled, }) {
|
|
2
|
+
export function getTableColumnsDefinitions({ columnDefinitions, enableSelection, enableSelectPinned, expanding, }) {
|
|
4
3
|
let cols = columnDefinitions;
|
|
5
4
|
if (enableSelection && !expanding) {
|
|
6
5
|
cols = [getSelectionCellColumnDef(enableSelectPinned), ...cols];
|
|
7
6
|
}
|
|
8
7
|
if (expanding) {
|
|
9
|
-
cols = [
|
|
10
|
-
getTreeColumnDef(Object.assign(Object.assign({}, expanding.expandingColumnDefinition), { enableSelection, rowSelectionAppearance })),
|
|
11
|
-
...cols,
|
|
12
|
-
];
|
|
8
|
+
cols = [getTreeColumnDef(Object.assign(Object.assign({}, expanding.expandingColumnDefinition), { enableSelection })), ...cols];
|
|
13
9
|
}
|
|
14
10
|
return cols;
|
|
15
11
|
}
|
|
@@ -10,10 +10,6 @@ export type TableRowColor = ValueOf<typeof TABLE_ROW_COLOR>;
|
|
|
10
10
|
type BulkAction = Omit<NonNullable<ToolbarProps<Record<string, string>>['bulkActions']>[number], 'onClick'> & {
|
|
11
11
|
onClick?(selectionState: RowSelectionState, resetRowSelection: (defaultState?: boolean) => void): void;
|
|
12
12
|
};
|
|
13
|
-
export declare enum RowAppearance {
|
|
14
|
-
Disabled = "disabled",
|
|
15
|
-
HideToggler = "hide-toggler"
|
|
16
|
-
}
|
|
17
13
|
type BaseTableProps<TData extends object, TFilters extends FiltersState = Record<string, unknown>> = WithSupportProps<{
|
|
18
14
|
/** Данные для отрисовки */
|
|
19
15
|
data: TData[];
|
|
@@ -59,7 +55,6 @@ type BaseTableProps<TData extends object, TFilters extends FiltersState = Record
|
|
|
59
55
|
* <strong>initialState</strong>: Начальное состояние выбора строк <br>
|
|
60
56
|
* <strong>state</strong>: Состояние выбора строк, жестко устанавливаемое снаружи <br>
|
|
61
57
|
* <strong>enable</strong>: Колбэк определяющий можно ли выбрать строку <br>
|
|
62
|
-
* <strong>appearance</strong>: Режим отображения недоступной для выбора строки. Опции: RowAppearance.Disabled (по дефолту) - серый фон, чекбокс/радиобаттон скрыт, RowAppearance.HideToggler - обычный фон, чекбокс/радиобаттон скрыт <br>
|
|
63
58
|
* <strong>multiRow</strong>: Мульти-выбор строк (включен по-умолчанию, когда включается выбор) <br>
|
|
64
59
|
* <strong>onChange</strong>: Колбэк на выбор строк
|
|
65
60
|
* */
|
|
@@ -69,7 +64,6 @@ type BaseTableProps<TData extends object, TFilters extends FiltersState = Record
|
|
|
69
64
|
enable?: RowSelectionOptions<TData>['enableRowSelection'];
|
|
70
65
|
multiRow?: boolean;
|
|
71
66
|
onChange?(state: RowSelectionState): void;
|
|
72
|
-
appearance?: RowAppearance;
|
|
73
67
|
};
|
|
74
68
|
/** Параметры отвечают за глобальный поиск в таблице <br>
|
|
75
69
|
* <strong>initialState</strong>: Начальное состояние строки поиска <br>
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { CellContext } from '@tanstack/react-table';
|
|
2
2
|
import { ReactNode } from 'react';
|
|
3
|
-
import { RowAppearance } from '../../../components';
|
|
4
3
|
import { ColumnDefinition } from '../../../types';
|
|
5
4
|
type BaseTreeColumnDef = {
|
|
6
5
|
/** Имя ключа соответствующее полю в data */
|
|
@@ -27,8 +26,7 @@ type TreeColumnDefWithDescription<TData> = BaseTreeColumnDef & {
|
|
|
27
26
|
export type TreeColumnDefinitionProps<TData> = TreeColumnDef | TreeColumnDefWithDescription<TData>;
|
|
28
27
|
type TreeColDefProps<TData> = TreeColumnDefinitionProps<TData> & {
|
|
29
28
|
enableSelection?: boolean;
|
|
30
|
-
rowSelectionAppearance: RowAppearance;
|
|
31
29
|
};
|
|
32
30
|
/** Вспомогательная функция для создания ячейки со статусом */
|
|
33
|
-
export declare function getTreeColumnDef<TData>({ showToggle, icon, expandedIcon, collapsedIcon, header, accessorKey, cell: renderCell, enableSelection,
|
|
31
|
+
export declare function getTreeColumnDef<TData>({ showToggle, icon, expandedIcon, collapsedIcon, header, accessorKey, cell: renderCell, enableSelection, }: TreeColDefProps<TData>): ColumnDefinition<TData>;
|
|
34
32
|
export {};
|
|
@@ -4,14 +4,13 @@ import { ButtonFunction } from '@snack-uikit/button';
|
|
|
4
4
|
import { ChevronRightSVG, FileSVG, FolderOpenSVG, FolderSVG } from '@snack-uikit/icons';
|
|
5
5
|
import { Checkbox, Radio } from '@snack-uikit/toggles';
|
|
6
6
|
import { TruncateString } from '@snack-uikit/truncate-string';
|
|
7
|
-
import { RowAppearance } from '../../../components';
|
|
8
7
|
import { COLUMN_PIN_POSITION, TEST_IDS } from '../../../constants';
|
|
9
8
|
import { useCellResize } from '../../../contexts';
|
|
10
9
|
import { TREE_CELL_ID } from './constants';
|
|
11
10
|
import styles from './styles.module.css';
|
|
12
11
|
import { TreeLine } from './TreeLine';
|
|
13
12
|
/** Вспомогательная функция для создания ячейки со статусом */
|
|
14
|
-
export function getTreeColumnDef({ showToggle = false, icon = _jsx(FileSVG, { size: 24 }), expandedIcon = _jsx(FolderOpenSVG, { size: 24 }), collapsedIcon = _jsx(FolderSVG, { size: 24 }), header, accessorKey, cell: renderCell, enableSelection,
|
|
13
|
+
export function getTreeColumnDef({ showToggle = false, icon = _jsx(FileSVG, { size: 24 }), expandedIcon = _jsx(FolderOpenSVG, { size: 24 }), collapsedIcon = _jsx(FolderSVG, { size: 24 }), header, accessorKey, cell: renderCell, enableSelection, }) {
|
|
15
14
|
const cell = function TreeCell(ctx) {
|
|
16
15
|
var _a;
|
|
17
16
|
const { row, cell } = ctx;
|
|
@@ -26,7 +25,6 @@ export function getTreeColumnDef({ showToggle = false, icon = _jsx(FileSVG, { si
|
|
|
26
25
|
const isLastChildRow = ((_a = parent === null || parent === void 0 ? void 0 : parent.subRows.at(-1)) === null || _a === void 0 ? void 0 : _a.id) === row.id;
|
|
27
26
|
const depth = row.depth;
|
|
28
27
|
const { ref } = useCellResize(TREE_CELL_ID, cell);
|
|
29
|
-
const isToggleHidden = !isRowsSelectionEnabled && rowSelectionAppearance === RowAppearance.HideToggler;
|
|
30
28
|
const linesVisibilityByIndex = useMemo(() => {
|
|
31
29
|
var _a;
|
|
32
30
|
const parents = [];
|
|
@@ -84,7 +82,7 @@ export function getTreeColumnDef({ showToggle = false, icon = _jsx(FileSVG, { si
|
|
|
84
82
|
// @ts-ignore
|
|
85
83
|
cell.row.original[accessorKey]
|
|
86
84
|
: cell.getValue();
|
|
87
|
-
return (_jsx("div", { role: 'presentation', "data-test-id": TEST_IDS.tree.node, className: styles.treeCellContainer, onClick: toggleClickHandler, children: _jsxs("div", { className: styles.treeCell, ref: ref, children: [lines, Boolean(parent) && _jsx(TreeLine, { horizontal: true, visible: true }), isExpandable && (_jsx(ButtonFunction, { size: 'xs', "data-test-id": TEST_IDS.tree.chevron, icon: _jsx(ChevronRightSVG, {}), onClick: chevronClickHandler, className: styles.cellExpandButton, "data-expanded": isExpanded || undefined })), _jsxs("div", { className: styles.treeNodeContent, "data-disabled": !isRowsSelectionEnabled || undefined, "data-selected": isRowSelected || undefined, "data-multiselect": isMultiSelect || undefined, children: [showToggle &&
|
|
85
|
+
return (_jsx("div", { role: 'presentation', "data-test-id": TEST_IDS.tree.node, className: styles.treeCellContainer, onClick: toggleClickHandler, children: _jsxs("div", { className: styles.treeCell, ref: ref, children: [lines, Boolean(parent) && _jsx(TreeLine, { horizontal: true, visible: true }), isExpandable && (_jsx(ButtonFunction, { size: 'xs', "data-test-id": TEST_IDS.tree.chevron, icon: _jsx(ChevronRightSVG, {}), onClick: chevronClickHandler, className: styles.cellExpandButton, "data-expanded": isExpanded || undefined })), _jsxs("div", { className: styles.treeNodeContent, "data-disabled": !isRowsSelectionEnabled || undefined, "data-selected": isRowSelected || undefined, "data-multiselect": isMultiSelect || undefined, children: [showToggle && (_jsx("div", { tabIndex: -1, className: styles.treeCheckboxWrap, children: isMultiSelect ? (_jsx(Checkbox, { size: 's', disabled: !isRowsSelectionEnabled, checked: isRowSelected, "data-test-id": TEST_IDS.tree.checkbox, indeterminate: isSomeSubRowSelected && !isAllSubRowsSelected })) : (_jsx(Radio, { size: 's', disabled: !isRowsSelectionEnabled, "data-test-id": TEST_IDS.tree.radio, checked: isRowSelected })) })), _jsxs("div", { role: 'presentation', onClick: chevronClickHandler, className: styles.cellUserToggleIcon, children: [isExpandable && isExpanded && expandedIcon, isExpandable && !isExpanded && collapsedIcon] }), _jsxs("div", { role: 'presentation', className: styles.userContent, children: [!isExpandable && icon, renderCell ? renderCell(ctx) : _jsx(TruncateString, { text: value })] })] })] }) }));
|
|
88
86
|
};
|
|
89
87
|
return {
|
|
90
88
|
id: TREE_CELL_ID,
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { Row as TableRow } from '@tanstack/react-table';
|
|
2
2
|
import { MouseEvent } from 'react';
|
|
3
|
-
import { RowAppearance } from '../../components';
|
|
4
3
|
import { ColumnOrder } from '../../types';
|
|
5
4
|
import { RowProps } from './Row';
|
|
6
5
|
export type RowInfo<TData> = {
|
|
@@ -15,6 +14,5 @@ export type BodyRowProps<TData> = Pick<RowProps, 'rowAutoHeight'> & {
|
|
|
15
14
|
onRowClick?: RowClickHandler<TData>;
|
|
16
15
|
columnOrder: ColumnOrder;
|
|
17
16
|
enableColumnsOrderSortByDrag?: boolean;
|
|
18
|
-
disabledRowAppearance?: RowAppearance;
|
|
19
17
|
};
|
|
20
|
-
export declare function BodyRow<TData>({ row, onRowClick, rowAutoHeight, columnOrder, enableColumnsOrderSortByDrag,
|
|
18
|
+
export declare function BodyRow<TData>({ row, onRowClick, rowAutoHeight, columnOrder, enableColumnsOrderSortByDrag, }: BodyRowProps<TData>): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { horizontalListSortingStrategy, SortableContext } from '@dnd-kit/sortable';
|
|
3
3
|
import { useState } from 'react';
|
|
4
|
-
import { RowAppearance } from '../../components';
|
|
5
4
|
import { COLUMN_PIN_POSITION, TEST_IDS } from '../../constants';
|
|
6
5
|
import { BodyCell } from '../Cells';
|
|
7
6
|
import { RowContext, useTableContext } from '../contexts';
|
|
@@ -9,7 +8,7 @@ import { useRowCells } from '../hooks';
|
|
|
9
8
|
import { PinnedCells } from './PinnedCells';
|
|
10
9
|
import { Row } from './Row';
|
|
11
10
|
import styles from './styles.module.css';
|
|
12
|
-
export function BodyRow({ row, onRowClick, rowAutoHeight, columnOrder, enableColumnsOrderSortByDrag,
|
|
11
|
+
export function BodyRow({ row, onRowClick, rowAutoHeight, columnOrder, enableColumnsOrderSortByDrag, }) {
|
|
13
12
|
const { leftPinned, rightPinned, unpinned } = useRowCells(row);
|
|
14
13
|
const [dropListOpened, setDropListOpen] = useState(false);
|
|
15
14
|
const disabled = !row.getCanSelect();
|
|
@@ -26,5 +25,5 @@ export function BodyRow({ row, onRowClick, rowAutoHeight, columnOrder, enableCol
|
|
|
26
25
|
};
|
|
27
26
|
const isSelected = row.getIsSelected() || (row.getIsSomeSelected() && !row.getCanMultiSelect() && !row.getIsExpanded());
|
|
28
27
|
const rowBackgroundColor = getRowBackgroundColor === null || getRowBackgroundColor === void 0 ? void 0 : getRowBackgroundColor(row.original);
|
|
29
|
-
return (_jsx(RowContext.Provider, { value: { dropListOpened, setDropListOpen }, children: _jsxs(Row, { onClick: handleRowClick, "data-clickable": Boolean(onRowClick) || undefined, "data-disabled": disabled || undefined, "data-
|
|
28
|
+
return (_jsx(RowContext.Provider, { value: { dropListOpened, setDropListOpen }, children: _jsxs(Row, { onClick: handleRowClick, "data-clickable": Boolean(onRowClick) || undefined, "data-disabled": disabled || undefined, "data-selected": isSelected || undefined, "data-actions-opened": dropListOpened || undefined, "data-test-id": TEST_IDS.bodyRow, "data-row-id": row.id, "data-row-bg-appearance": rowBackgroundColor && !disabled && !isSelected ? rowBackgroundColor : undefined, className: styles.bodyRow, rowAutoHeight: rowAutoHeight, children: [leftPinned && (_jsx(PinnedCells, { position: COLUMN_PIN_POSITION.Left, children: leftPinned.map(cell => (_jsx(BodyCell, { cell: cell, rowAutoHeight: rowAutoHeight }, cell.id))) })), unpinned.map(cell => (_jsx(SortableContext, { items: columnOrder, strategy: horizontalListSortingStrategy, children: _jsx(BodyCell, { cell: cell, rowAutoHeight: rowAutoHeight, isDraggable: enableColumnsOrderSortByDrag }, cell.id) }, cell.id))), rightPinned && (_jsx(PinnedCells, { position: COLUMN_PIN_POSITION.Right, children: rightPinned.map(cell => (_jsx(BodyCell, { cell: cell, rowAutoHeight: rowAutoHeight, isDraggable: enableColumnsOrderSortByDrag }, cell.id))) }))] }) }));
|
|
30
29
|
}
|
|
@@ -84,11 +84,9 @@
|
|
|
84
84
|
}
|
|
85
85
|
.bodyRow[data-disabled]{
|
|
86
86
|
cursor:not-allowed;
|
|
87
|
-
}
|
|
88
|
-
.bodyRow[data-row-appearance=disabled]{
|
|
89
87
|
background-color:var(--sys-neutral-background, #eeeff3);
|
|
90
88
|
}
|
|
91
|
-
.bodyRow[data-
|
|
89
|
+
.bodyRow[data-disabled] .rowPinnedCells{
|
|
92
90
|
background-color:var(--sys-neutral-background, #eeeff3);
|
|
93
91
|
}
|
|
94
92
|
.bodyRow[data-selected]{
|
|
@@ -1,12 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
export type EmptyStateProps = {
|
|
4
|
-
title?: string;
|
|
5
|
-
description?: string;
|
|
6
|
-
icon?: Pick<IconPredefinedProps, 'icon' | 'decor' | 'appearance'>;
|
|
7
|
-
footer?: ReactNode;
|
|
8
|
-
className?: string;
|
|
9
|
-
};
|
|
1
|
+
import { InfoBlockProps } from '@snack-uikit/info-block';
|
|
2
|
+
export type EmptyStateProps = Pick<InfoBlockProps, 'title' | 'description' | 'icon' | 'footer' | 'className'>;
|
|
10
3
|
export type TableEmptyState = {
|
|
11
4
|
emptyStates: {
|
|
12
5
|
noDataState: EmptyStateProps;
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
6
|
"title": "Table",
|
|
7
|
-
"version": "0.37.16
|
|
7
|
+
"version": "0.37.16",
|
|
8
8
|
"sideEffects": [
|
|
9
9
|
"*.css",
|
|
10
10
|
"*.woff",
|
|
@@ -43,7 +43,6 @@
|
|
|
43
43
|
"@dnd-kit/utilities": "3.2.2",
|
|
44
44
|
"@snack-uikit/button": "0.19.16",
|
|
45
45
|
"@snack-uikit/chips": "0.28.8",
|
|
46
|
-
"@snack-uikit/icon-predefined": "0.7.10",
|
|
47
46
|
"@snack-uikit/icons": "0.27.3",
|
|
48
47
|
"@snack-uikit/info-block": "0.6.33",
|
|
49
48
|
"@snack-uikit/list": "0.32.7",
|
|
@@ -66,5 +65,5 @@
|
|
|
66
65
|
"peerDependencies": {
|
|
67
66
|
"@snack-uikit/locale": "*"
|
|
68
67
|
},
|
|
69
|
-
"gitHead": "
|
|
68
|
+
"gitHead": "4bd295f8a30dd647edfec1dfdcad4dc1918e4cbc"
|
|
70
69
|
}
|
|
@@ -2,6 +2,11 @@ import debounce from 'lodash.debounce';
|
|
|
2
2
|
|
|
3
3
|
import { SEARCH_DELAY } from './constants';
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
type ChangeHandler = (newValue: string) => void;
|
|
6
|
+
type SearchHandler = (newValue: string, onChange: ChangeHandler) => void;
|
|
7
|
+
|
|
8
|
+
type OnSearchDebouncedType = ReturnType<typeof debounce<SearchHandler>>;
|
|
9
|
+
|
|
10
|
+
export const onSearchDebounced: OnSearchDebouncedType = debounce((newValue, onChange) => {
|
|
6
11
|
onChange(newValue);
|
|
7
12
|
}, SEARCH_DELAY);
|
|
@@ -173,9 +173,8 @@ export function Table<TData extends object, TFilters extends FiltersState = Reco
|
|
|
173
173
|
enableSelection,
|
|
174
174
|
enableSelectPinned,
|
|
175
175
|
expanding,
|
|
176
|
-
rowSelectionAppearance: rowSelectionProp?.appearance,
|
|
177
176
|
}),
|
|
178
|
-
[columnDefinitions, enableSelection, enableSelectPinned, expanding
|
|
177
|
+
[columnDefinitions, enableSelection, enableSelectPinned, expanding],
|
|
179
178
|
);
|
|
180
179
|
const pinnedGroups = useMemo(() => getPinnedGroups(allTableColumns), [allTableColumns]);
|
|
181
180
|
|
|
@@ -306,6 +305,9 @@ export function Table<TData extends object, TFilters extends FiltersState = Reco
|
|
|
306
305
|
pageSize: Math.min(Math.max(pageSize, 5), DEFAULT_PAGE_SIZE),
|
|
307
306
|
columnDefinitions: enabledColumnsDefinitions,
|
|
308
307
|
columnPinning,
|
|
308
|
+
enableSelection,
|
|
309
|
+
enableSelectPinned,
|
|
310
|
+
expanding,
|
|
309
311
|
});
|
|
310
312
|
|
|
311
313
|
const handleOnRefresh = useCallback(() => {
|
|
@@ -531,13 +533,7 @@ export function Table<TData extends object, TFilters extends FiltersState = Reco
|
|
|
531
533
|
<SkeletonContextProvider loading>
|
|
532
534
|
<HeaderRow rowAutoHeight={rowAutoHeight} columnOrder={columnOrder} />
|
|
533
535
|
{loadingTableRows.map(row => (
|
|
534
|
-
<BodyRow
|
|
535
|
-
key={row.id}
|
|
536
|
-
row={row}
|
|
537
|
-
rowAutoHeight={rowAutoHeight}
|
|
538
|
-
columnOrder={columnOrder}
|
|
539
|
-
disabledRowAppearance={rowSelectionProp?.appearance}
|
|
540
|
-
/>
|
|
536
|
+
<BodyRow key={row.id} row={row} rowAutoHeight={rowAutoHeight} columnOrder={columnOrder} />
|
|
541
537
|
))}
|
|
542
538
|
</SkeletonContextProvider>
|
|
543
539
|
) : (
|
|
@@ -560,7 +556,6 @@ export function Table<TData extends object, TFilters extends FiltersState = Reco
|
|
|
560
556
|
rowAutoHeight={rowAutoHeight}
|
|
561
557
|
columnOrder={columnOrder}
|
|
562
558
|
enableColumnsOrderSortByDrag={enableColumnsOrderSortByDrag}
|
|
563
|
-
disabledRowAppearance={rowSelectionProp?.appearance}
|
|
564
559
|
/>
|
|
565
560
|
))}
|
|
566
561
|
</div>
|
|
@@ -574,7 +569,6 @@ export function Table<TData extends object, TFilters extends FiltersState = Reco
|
|
|
574
569
|
rowAutoHeight={rowAutoHeight}
|
|
575
570
|
columnOrder={columnOrder}
|
|
576
571
|
enableColumnsOrderSortByDrag={enableColumnsOrderSortByDrag}
|
|
577
|
-
disabledRowAppearance={rowSelectionProp?.appearance}
|
|
578
572
|
/>
|
|
579
573
|
))}
|
|
580
574
|
|
|
@@ -586,7 +580,6 @@ export function Table<TData extends object, TFilters extends FiltersState = Reco
|
|
|
586
580
|
row={row}
|
|
587
581
|
columnOrder={columnOrder}
|
|
588
582
|
enableColumnsOrderSortByDrag={enableColumnsOrderSortByDrag}
|
|
589
|
-
disabledRowAppearance={rowSelectionProp?.appearance}
|
|
590
583
|
/>
|
|
591
584
|
))}
|
|
592
585
|
</SkeletonContextProvider>
|
|
@@ -74,9 +74,8 @@ export function useColumnSettings<TData extends object, TFilters extends Record<
|
|
|
74
74
|
enableSelection,
|
|
75
75
|
enableSelectPinned,
|
|
76
76
|
expanding,
|
|
77
|
-
rowSelectionAppearance: rowSelection?.appearance,
|
|
78
77
|
}),
|
|
79
|
-
[enableSelectPinned, enableSelection, enabledColumnsDefinitions, expanding
|
|
78
|
+
[enableSelectPinned, enableSelection, enabledColumnsDefinitions, expanding],
|
|
80
79
|
);
|
|
81
80
|
|
|
82
81
|
const areAllColumnsEnabled = enabledColumns.length === configurableColumns.length;
|
|
@@ -3,25 +3,63 @@ import { useMemo } from 'react';
|
|
|
3
3
|
|
|
4
4
|
import { SkeletonText } from '@snack-uikit/skeleton';
|
|
5
5
|
|
|
6
|
+
import { getSelectionCellColumnDef, getTreeColumnDef } from '../../../helperComponents';
|
|
6
7
|
import { ColumnDefinition } from '../../../types';
|
|
8
|
+
import { TableProps } from '../../types';
|
|
7
9
|
import styles from '../styles.module.scss';
|
|
8
10
|
|
|
9
|
-
type UseLoadingTableProps<TData> = {
|
|
11
|
+
type UseLoadingTableProps<TData extends object> = {
|
|
10
12
|
columnDefinitions: ColumnDefinition<TData>[];
|
|
11
13
|
pageSize: number;
|
|
12
14
|
columnPinning: ColumnPinningState;
|
|
15
|
+
enableSelection?: boolean;
|
|
16
|
+
enableSelectPinned?: boolean;
|
|
17
|
+
expanding?: TableProps<TData>['expanding'];
|
|
13
18
|
};
|
|
14
19
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
20
|
+
function CellSkeleton() {
|
|
21
|
+
return <SkeletonText className={styles.skeleton} lines={1} width={'100%'} />;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function useLoadingTable<TData extends object>({
|
|
25
|
+
pageSize,
|
|
26
|
+
columnDefinitions,
|
|
27
|
+
columnPinning,
|
|
28
|
+
enableSelection,
|
|
29
|
+
enableSelectPinned,
|
|
30
|
+
expanding,
|
|
31
|
+
}: UseLoadingTableProps<TData>) {
|
|
32
|
+
const data = useMemo(() => Array.from({ length: pageSize }).map(() => ({}) as TData), [pageSize]);
|
|
33
|
+
const columns = useMemo(() => {
|
|
34
|
+
let cols: ColumnDefinition<TData>[] = columnDefinitions.map(column => ({
|
|
35
|
+
...column,
|
|
36
|
+
cell: () => <CellSkeleton />,
|
|
37
|
+
}));
|
|
38
|
+
|
|
39
|
+
// for selection column
|
|
40
|
+
if (enableSelection && !expanding) {
|
|
41
|
+
const selectionColumnDef = getSelectionCellColumnDef(enableSelectPinned ?? false);
|
|
42
|
+
const loadingSelectionColumn = {
|
|
43
|
+
...selectionColumnDef,
|
|
44
|
+
cell: () => <CellSkeleton />,
|
|
45
|
+
} as ColumnDefinition<TData>;
|
|
46
|
+
|
|
47
|
+
cols = [loadingSelectionColumn, ...cols];
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// for tree column
|
|
51
|
+
if (expanding) {
|
|
52
|
+
const treeColumnDef = getTreeColumnDef({ ...expanding.expandingColumnDefinition, enableSelection });
|
|
53
|
+
const loadingTreeColumn = {
|
|
54
|
+
...treeColumnDef,
|
|
55
|
+
cell: () => <CellSkeleton />,
|
|
56
|
+
} as ColumnDefinition<TData>;
|
|
57
|
+
|
|
58
|
+
cols = [loadingTreeColumn, ...cols];
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return cols;
|
|
62
|
+
}, [columnDefinitions, enableSelection, enableSelectPinned, expanding]);
|
|
25
63
|
|
|
26
64
|
const loadingTable = useReactTable<TData>({
|
|
27
65
|
data,
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import { getSelectionCellColumnDef, getTreeColumnDef } from '../../../helperComponents';
|
|
2
2
|
import { ColumnDefinition } from '../../../types';
|
|
3
|
-
import {
|
|
3
|
+
import { TableProps } from '../../types';
|
|
4
4
|
|
|
5
5
|
type GetTableColumnsDefinitionsProps<TData extends object> = {
|
|
6
6
|
columnDefinitions: ColumnDefinition<TData>[];
|
|
7
7
|
enableSelection: boolean;
|
|
8
8
|
enableSelectPinned: boolean;
|
|
9
9
|
expanding: TableProps<TData>['expanding'];
|
|
10
|
-
rowSelectionAppearance?: RowAppearance;
|
|
11
10
|
};
|
|
12
11
|
|
|
13
12
|
export function getTableColumnsDefinitions<TData extends object>({
|
|
@@ -15,17 +14,13 @@ export function getTableColumnsDefinitions<TData extends object>({
|
|
|
15
14
|
enableSelection,
|
|
16
15
|
enableSelectPinned,
|
|
17
16
|
expanding,
|
|
18
|
-
rowSelectionAppearance = RowAppearance.Disabled,
|
|
19
17
|
}: GetTableColumnsDefinitionsProps<TData>): ColumnDefinition<TData>[] {
|
|
20
18
|
let cols: ColumnDefinition<TData>[] = columnDefinitions;
|
|
21
19
|
if (enableSelection && !expanding) {
|
|
22
20
|
cols = [getSelectionCellColumnDef(enableSelectPinned), ...cols];
|
|
23
21
|
}
|
|
24
22
|
if (expanding) {
|
|
25
|
-
cols = [
|
|
26
|
-
getTreeColumnDef({ ...expanding.expandingColumnDefinition, enableSelection, rowSelectionAppearance }),
|
|
27
|
-
...cols,
|
|
28
|
-
];
|
|
23
|
+
cols = [getTreeColumnDef({ ...expanding.expandingColumnDefinition, enableSelection }), ...cols];
|
|
29
24
|
}
|
|
30
25
|
return cols;
|
|
31
26
|
}
|
package/src/components/types.ts
CHANGED
|
@@ -22,11 +22,6 @@ type BulkAction = Omit<NonNullable<ToolbarProps<Record<string, string>>['bulkAct
|
|
|
22
22
|
onClick?(selectionState: RowSelectionState, resetRowSelection: (defaultState?: boolean) => void): void;
|
|
23
23
|
};
|
|
24
24
|
|
|
25
|
-
export enum RowAppearance {
|
|
26
|
-
Disabled = 'disabled',
|
|
27
|
-
HideToggler = 'hide-toggler',
|
|
28
|
-
}
|
|
29
|
-
|
|
30
25
|
type BaseTableProps<TData extends object, TFilters extends FiltersState = Record<string, unknown>> = WithSupportProps<{
|
|
31
26
|
/** Данные для отрисовки */
|
|
32
27
|
data: TData[];
|
|
@@ -74,7 +69,6 @@ type BaseTableProps<TData extends object, TFilters extends FiltersState = Record
|
|
|
74
69
|
* <strong>initialState</strong>: Начальное состояние выбора строк <br>
|
|
75
70
|
* <strong>state</strong>: Состояние выбора строк, жестко устанавливаемое снаружи <br>
|
|
76
71
|
* <strong>enable</strong>: Колбэк определяющий можно ли выбрать строку <br>
|
|
77
|
-
* <strong>appearance</strong>: Режим отображения недоступной для выбора строки. Опции: RowAppearance.Disabled (по дефолту) - серый фон, чекбокс/радиобаттон скрыт, RowAppearance.HideToggler - обычный фон, чекбокс/радиобаттон скрыт <br>
|
|
78
72
|
* <strong>multiRow</strong>: Мульти-выбор строк (включен по-умолчанию, когда включается выбор) <br>
|
|
79
73
|
* <strong>onChange</strong>: Колбэк на выбор строк
|
|
80
74
|
* */
|
|
@@ -84,7 +78,6 @@ type BaseTableProps<TData extends object, TFilters extends FiltersState = Record
|
|
|
84
78
|
enable?: RowSelectionOptions<TData>['enableRowSelection'];
|
|
85
79
|
multiRow?: boolean;
|
|
86
80
|
onChange?(state: RowSelectionState): void;
|
|
87
|
-
appearance?: RowAppearance;
|
|
88
81
|
};
|
|
89
82
|
/** Параметры отвечают за глобальный поиск в таблице <br>
|
|
90
83
|
* <strong>initialState</strong>: Начальное состояние строки поиска <br>
|
|
@@ -6,7 +6,6 @@ import { ChevronRightSVG, FileSVG, FolderOpenSVG, FolderSVG } from '@snack-uikit
|
|
|
6
6
|
import { Checkbox, Radio } from '@snack-uikit/toggles';
|
|
7
7
|
import { TruncateString } from '@snack-uikit/truncate-string';
|
|
8
8
|
|
|
9
|
-
import { RowAppearance } from '../../../components';
|
|
10
9
|
import { COLUMN_PIN_POSITION, TEST_IDS } from '../../../constants';
|
|
11
10
|
import { useCellResize } from '../../../contexts';
|
|
12
11
|
import { ColumnDefinition } from '../../../types';
|
|
@@ -43,7 +42,6 @@ export type TreeColumnDefinitionProps<TData> = TreeColumnDef | TreeColumnDefWith
|
|
|
43
42
|
|
|
44
43
|
type TreeColDefProps<TData> = TreeColumnDefinitionProps<TData> & {
|
|
45
44
|
enableSelection?: boolean;
|
|
46
|
-
rowSelectionAppearance: RowAppearance;
|
|
47
45
|
};
|
|
48
46
|
|
|
49
47
|
/** Вспомогательная функция для создания ячейки со статусом */
|
|
@@ -56,7 +54,6 @@ export function getTreeColumnDef<TData>({
|
|
|
56
54
|
accessorKey,
|
|
57
55
|
cell: renderCell,
|
|
58
56
|
enableSelection,
|
|
59
|
-
rowSelectionAppearance,
|
|
60
57
|
}: TreeColDefProps<TData>): ColumnDefinition<TData> {
|
|
61
58
|
const cell: ColumnDefinition<TData>['cell'] = function TreeCell(ctx) {
|
|
62
59
|
const { row, cell } = ctx;
|
|
@@ -72,8 +69,6 @@ export function getTreeColumnDef<TData>({
|
|
|
72
69
|
const depth = row.depth;
|
|
73
70
|
const { ref } = useCellResize(TREE_CELL_ID, cell);
|
|
74
71
|
|
|
75
|
-
const isToggleHidden = !isRowsSelectionEnabled && rowSelectionAppearance === RowAppearance.HideToggler;
|
|
76
|
-
|
|
77
72
|
const linesVisibilityByIndex = useMemo(() => {
|
|
78
73
|
const parents: (Row<TData> | undefined)[] = [];
|
|
79
74
|
for (let i = depth; i >= 0; i--) {
|
|
@@ -186,7 +181,7 @@ export function getTreeColumnDef<TData>({
|
|
|
186
181
|
data-selected={isRowSelected || undefined}
|
|
187
182
|
data-multiselect={isMultiSelect || undefined}
|
|
188
183
|
>
|
|
189
|
-
{showToggle &&
|
|
184
|
+
{showToggle && (
|
|
190
185
|
<div tabIndex={-1} className={styles.treeCheckboxWrap}>
|
|
191
186
|
{isMultiSelect ? (
|
|
192
187
|
<Checkbox
|
|
@@ -2,7 +2,6 @@ import { horizontalListSortingStrategy, SortableContext } from '@dnd-kit/sortabl
|
|
|
2
2
|
import { Row as TableRow } from '@tanstack/react-table';
|
|
3
3
|
import { MouseEvent, useState } from 'react';
|
|
4
4
|
|
|
5
|
-
import { RowAppearance } from '../../components';
|
|
6
5
|
import { COLUMN_PIN_POSITION, TEST_IDS } from '../../constants';
|
|
7
6
|
import { ColumnOrder } from '../../types';
|
|
8
7
|
import { BodyCell } from '../Cells';
|
|
@@ -26,7 +25,6 @@ export type BodyRowProps<TData> = Pick<RowProps, 'rowAutoHeight'> & {
|
|
|
26
25
|
onRowClick?: RowClickHandler<TData>;
|
|
27
26
|
columnOrder: ColumnOrder;
|
|
28
27
|
enableColumnsOrderSortByDrag?: boolean;
|
|
29
|
-
disabledRowAppearance?: RowAppearance;
|
|
30
28
|
};
|
|
31
29
|
|
|
32
30
|
export function BodyRow<TData>({
|
|
@@ -35,7 +33,6 @@ export function BodyRow<TData>({
|
|
|
35
33
|
rowAutoHeight,
|
|
36
34
|
columnOrder,
|
|
37
35
|
enableColumnsOrderSortByDrag,
|
|
38
|
-
disabledRowAppearance = RowAppearance.Disabled,
|
|
39
36
|
}: BodyRowProps<TData>) {
|
|
40
37
|
const { leftPinned, rightPinned, unpinned } = useRowCells(row);
|
|
41
38
|
|
|
@@ -67,7 +64,6 @@ export function BodyRow<TData>({
|
|
|
67
64
|
onClick={handleRowClick}
|
|
68
65
|
data-clickable={Boolean(onRowClick) || undefined}
|
|
69
66
|
data-disabled={disabled || undefined}
|
|
70
|
-
data-row-appearance={disabled ? disabledRowAppearance : undefined}
|
|
71
67
|
data-selected={isSelected || undefined}
|
|
72
68
|
data-actions-opened={dropListOpened || undefined}
|
|
73
69
|
data-test-id={TEST_IDS.bodyRow}
|
|
@@ -108,11 +108,9 @@ $snack-ui-table-row-background: var(--snack-ui-table-row-background);
|
|
|
108
108
|
)};
|
|
109
109
|
}
|
|
110
110
|
}
|
|
111
|
+
|
|
111
112
|
&[data-disabled] {
|
|
112
113
|
cursor: not-allowed;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
&[data-row-appearance='disabled'] {
|
|
116
114
|
background-color: styles-tokens-table.$sys-neutral-background;
|
|
117
115
|
|
|
118
116
|
.rowPinnedCells {
|
|
@@ -1,17 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
import { IconPredefinedProps } from '@snack-uikit/icon-predefined';
|
|
4
|
-
import { InfoBlock } from '@snack-uikit/info-block';
|
|
1
|
+
import { InfoBlock, InfoBlockProps } from '@snack-uikit/info-block';
|
|
5
2
|
|
|
6
3
|
import styles from './styles.module.scss';
|
|
7
4
|
|
|
8
|
-
export type EmptyStateProps =
|
|
9
|
-
title?: string;
|
|
10
|
-
description?: string;
|
|
11
|
-
icon?: Pick<IconPredefinedProps, 'icon' | 'decor' | 'appearance'>;
|
|
12
|
-
footer?: ReactNode;
|
|
13
|
-
className?: string;
|
|
14
|
-
};
|
|
5
|
+
export type EmptyStateProps = Pick<InfoBlockProps, 'title' | 'description' | 'icon' | 'footer' | 'className'>;
|
|
15
6
|
|
|
16
7
|
export type TableEmptyState = {
|
|
17
8
|
emptyStates: {
|