@snack-uikit/table 0.37.18 → 0.37.19
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/Table/Table.js +13 -7
- package/dist/cjs/components/Table/hooks/useColumnSettings/useColumnSettings.js +3 -2
- package/dist/cjs/components/Table/hooks/useLoadingTable.d.ts +3 -2
- package/dist/cjs/components/Table/hooks/useLoadingTable.js +5 -3
- package/dist/cjs/components/Table/utils/getTableColumnsDefinitions.d.ts +3 -2
- package/dist/cjs/components/Table/utils/getTableColumnsDefinitions.js +5 -2
- package/dist/cjs/components/types.d.ts +6 -0
- package/dist/cjs/components/types.js +7 -1
- package/dist/cjs/helperComponents/Cells/RowActionsCell/styles.module.css +0 -1
- package/dist/cjs/helperComponents/Cells/SelectionCell/SelectionCell.js +1 -1
- package/dist/cjs/helperComponents/Cells/TreeCell/TreeCell.d.ts +3 -1
- package/dist/cjs/helperComponents/Cells/TreeCell/TreeCell.js +5 -2
- package/dist/cjs/helperComponents/Rows/BodyRow.d.ts +3 -1
- package/dist/cjs/helperComponents/Rows/BodyRow.js +4 -1
- package/dist/cjs/helperComponents/Rows/styles.module.css +2 -2
- package/dist/esm/components/Table/Table.js +4 -2
- package/dist/esm/components/Table/hooks/useColumnSettings/useColumnSettings.js +2 -1
- package/dist/esm/components/Table/hooks/useLoadingTable.d.ts +3 -2
- package/dist/esm/components/Table/hooks/useLoadingTable.js +4 -3
- package/dist/esm/components/Table/utils/getTableColumnsDefinitions.d.ts +3 -2
- package/dist/esm/components/Table/utils/getTableColumnsDefinitions.js +6 -2
- package/dist/esm/components/types.d.ts +6 -0
- package/dist/esm/components/types.js +5 -1
- package/dist/esm/helperComponents/Cells/RowActionsCell/styles.module.css +0 -1
- package/dist/esm/helperComponents/Cells/SelectionCell/SelectionCell.js +1 -1
- package/dist/esm/helperComponents/Cells/TreeCell/TreeCell.d.ts +3 -1
- package/dist/esm/helperComponents/Cells/TreeCell/TreeCell.js +4 -2
- package/dist/esm/helperComponents/Rows/BodyRow.d.ts +3 -1
- package/dist/esm/helperComponents/Rows/BodyRow.js +3 -2
- package/dist/esm/helperComponents/Rows/styles.module.css +2 -2
- package/package.json +2 -2
- package/src/components/Table/Table.tsx +13 -2
- package/src/components/Table/hooks/useColumnSettings/useColumnSettings.ts +2 -1
- package/src/components/Table/hooks/useLoadingTable.tsx +9 -3
- package/src/components/Table/utils/getTableColumnsDefinitions.ts +7 -2
- package/src/components/types.ts +7 -0
- package/src/helperComponents/Cells/RowActionsCell/styles.module.scss +0 -2
- package/src/helperComponents/Cells/SelectionCell/SelectionCell.tsx +1 -1
- package/src/helperComponents/Cells/TreeCell/TreeCell.tsx +6 -1
- package/src/helperComponents/Rows/BodyRow.tsx +4 -0
- package/src/helperComponents/Rows/styles.module.scss +1 -1
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.19 (2025-11-26)</small>
|
|
7
|
+
|
|
8
|
+
* fix(PDS-3189): fix selection with shift key for single row selection mode ([2cdfb64](https://github.com/cloud-ru-tech/snack-uikit/commit/2cdfb64))
|
|
9
|
+
* feat(PDS-3156): implement disabled rows appearance variants ([75ed605](https://github.com/cloud-ru-tech/snack-uikit/commit/75ed605))
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
6
15
|
## <small>0.37.18 (2025-11-26)</small>
|
|
7
16
|
|
|
8
17
|
* fix(HCE-284): export table, set column width to maximum content length ([cc1f55b](https://github.com/cloud-ru-tech/snack-uikit/commit/cc1f55b))
|
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; }` | - | Параметры отвечают за возможность выбора строк <br> <strong>initialState</strong>: Начальное состояние выбора строк <br> <strong>state</strong>: Состояние выбора строк, жестко устанавливаемое снаружи <br> <strong>enable</strong>: Колбэк определяющий можно ли выбрать строку <br> <strong>multiRow</strong>: Мульти-выбор строк (включен по-умолчанию, когда включается выбор) <br> <strong>onChange</strong>: Колбэк на выбор строк |
|
|
129
|
+
| rowSelection | `{ initialState?: RowSelectionState; state?: RowSelectionState; enable?: boolean \| ((row: Row<TData>) => boolean); multiRow?: boolean; onChange?(state: RowSelectionState): void; appearance?: RowAppearance; }` | - | Параметры отвечают за возможность выбора строк <br> <strong>initialState</strong>: Начальное состояние выбора строк <br> <strong>state</strong>: Состояние выбора строк, жестко устанавливаемое снаружи <br> <strong>enable</strong>: Колбэк определяющий можно ли выбрать строку <br> <strong>appearance</strong>: Режим отображения недоступной для выбора строки. Опции: RowAppearance.Disabled (по дефолту) - серый фон, чекбокс/радиобаттон скрыт, RowAppearance.HideToggler - обычный фон, чекбокс/радиобаттон скрыт <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; }` | - | Параметры отвечают за возможность выбора строк <br> <strong>initialState</strong>: Начальное состояние выбора строк <br> <strong>state</strong>: Состояние выбора строк, жестко устанавливаемое снаружи <br> <strong>enable</strong>: Колбэк определяющий можно ли выбрать строку <br> <strong>multiRow</strong>: Мульти-выбор строк (включен по-умолчанию, когда включается выбор) <br> <strong>onChange</strong>: Колбэк на выбор строк |
|
|
203
|
+
| rowSelection | `{ initialState?: RowSelectionState; state?: RowSelectionState; enable?: boolean \| ((row: Row<TData>) => boolean); multiRow?: boolean; onChange?(state: RowSelectionState): void; appearance?: RowAppearance; }` | - | Параметры отвечают за возможность выбора строк <br> <strong>initialState</strong>: Начальное состояние выбора строк <br> <strong>state</strong>: Состояние выбора строк, жестко устанавливаемое снаружи <br> <strong>enable</strong>: Колбэк определяющий можно ли выбрать строку <br> <strong>appearance</strong>: Режим отображения недоступной для выбора строки. Опции: RowAppearance.Disabled (по дефолту) - серый фон, чекбокс/радиобаттон скрыт, RowAppearance.HideToggler - обычный фон, чекбокс/радиобаттон скрыт <br> <strong>multiRow</strong>: Мульти-выбор строк (включен по-умолчанию, когда включается выбор) <br> <strong>onChange</strong>: Колбэк на выбор строк |
|
|
204
204
|
| enableFuzzySearch | `boolean` | - | Включить нечеткий поиск |
|
|
205
205
|
| rowAutoHeight | `boolean` | - | |
|
|
206
206
|
| onRowClick | `RowClickHandler<TData>` | - | Колбэк клика по строке |
|
|
@@ -118,8 +118,9 @@ function Table(_a) {
|
|
|
118
118
|
columnDefinitions,
|
|
119
119
|
enableSelection,
|
|
120
120
|
enableSelectPinned,
|
|
121
|
-
expanding
|
|
122
|
-
|
|
121
|
+
expanding,
|
|
122
|
+
rowSelectionAppearance: rowSelectionProp === null || rowSelectionProp === void 0 ? void 0 : rowSelectionProp.appearance
|
|
123
|
+
}), [columnDefinitions, enableSelection, enableSelectPinned, expanding, rowSelectionProp === null || rowSelectionProp === void 0 ? void 0 : rowSelectionProp.appearance]);
|
|
123
124
|
const pinnedGroups = (0, react_1.useMemo)(() => (0, utils_3.getPinnedGroups)(allTableColumns), [allTableColumns]);
|
|
124
125
|
const {
|
|
125
126
|
enabledColumns,
|
|
@@ -248,7 +249,8 @@ function Table(_a) {
|
|
|
248
249
|
columnPinning,
|
|
249
250
|
enableSelection,
|
|
250
251
|
enableSelectPinned,
|
|
251
|
-
expanding
|
|
252
|
+
expanding,
|
|
253
|
+
rowSelectionAppearance: rowSelectionProp === null || rowSelectionProp === void 0 ? void 0 : rowSelectionProp.appearance
|
|
252
254
|
});
|
|
253
255
|
const handleOnRefresh = (0, react_1.useCallback)(() => {
|
|
254
256
|
table.resetRowSelection();
|
|
@@ -460,7 +462,8 @@ function Table(_a) {
|
|
|
460
462
|
}), loadingTableRows.map(row => (0, jsx_runtime_1.jsx)(helperComponents_1.BodyRow, {
|
|
461
463
|
row: row,
|
|
462
464
|
rowAutoHeight: rowAutoHeight,
|
|
463
|
-
columnOrder: columnOrder
|
|
465
|
+
columnOrder: columnOrder,
|
|
466
|
+
disabledRowAppearance: rowSelectionProp === null || rowSelectionProp === void 0 ? void 0 : rowSelectionProp.appearance
|
|
464
467
|
}, row.id))]
|
|
465
468
|
}) : (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, {
|
|
466
469
|
children: [centerRows.length || filteredTopRows.length ? (0, jsx_runtime_1.jsx)(helperComponents_1.HeaderRow, {
|
|
@@ -474,20 +477,23 @@ function Table(_a) {
|
|
|
474
477
|
onRowClick: onRowClick,
|
|
475
478
|
rowAutoHeight: rowAutoHeight,
|
|
476
479
|
columnOrder: columnOrder,
|
|
477
|
-
enableColumnsOrderSortByDrag: enableColumnsOrderSortByDrag
|
|
480
|
+
enableColumnsOrderSortByDrag: enableColumnsOrderSortByDrag,
|
|
481
|
+
disabledRowAppearance: rowSelectionProp === null || rowSelectionProp === void 0 ? void 0 : rowSelectionProp.appearance
|
|
478
482
|
}, row.id))
|
|
479
483
|
}) : null, centerRows.map(row => (0, jsx_runtime_1.jsx)(helperComponents_1.BodyRow, {
|
|
480
484
|
row: row,
|
|
481
485
|
onRowClick: onRowClick,
|
|
482
486
|
rowAutoHeight: rowAutoHeight,
|
|
483
487
|
columnOrder: columnOrder,
|
|
484
|
-
enableColumnsOrderSortByDrag: enableColumnsOrderSortByDrag
|
|
488
|
+
enableColumnsOrderSortByDrag: enableColumnsOrderSortByDrag,
|
|
489
|
+
disabledRowAppearance: rowSelectionProp === null || rowSelectionProp === void 0 ? void 0 : rowSelectionProp.appearance
|
|
485
490
|
}, row.id)), data.length > 0 && infiniteLoading && loading && !dataError && (0, jsx_runtime_1.jsx)(skeleton_1.SkeletonContextProvider, {
|
|
486
491
|
loading: true,
|
|
487
492
|
children: loadingTableRows.slice(0, 3).map(row => (0, jsx_runtime_1.jsx)(helperComponents_1.BodyRow, {
|
|
488
493
|
row: row,
|
|
489
494
|
columnOrder: columnOrder,
|
|
490
|
-
enableColumnsOrderSortByDrag: enableColumnsOrderSortByDrag
|
|
495
|
+
enableColumnsOrderSortByDrag: enableColumnsOrderSortByDrag,
|
|
496
|
+
disabledRowAppearance: rowSelectionProp === null || rowSelectionProp === void 0 ? void 0 : rowSelectionProp.appearance
|
|
491
497
|
}, row.id))
|
|
492
498
|
}), (0, jsx_runtime_1.jsx)(helperComponents_1.TableEmptyState, {
|
|
493
499
|
emptyStates: emptyStates,
|
|
@@ -48,8 +48,9 @@ function useColumnSettings(_ref) {
|
|
|
48
48
|
columnDefinitions: enabledColumnsDefinitions,
|
|
49
49
|
enableSelection,
|
|
50
50
|
enableSelectPinned,
|
|
51
|
-
expanding
|
|
52
|
-
|
|
51
|
+
expanding,
|
|
52
|
+
rowSelectionAppearance: rowSelection === null || rowSelection === void 0 ? void 0 : rowSelection.appearance
|
|
53
|
+
}), [enableSelectPinned, enableSelection, enabledColumnsDefinitions, expanding, rowSelection === null || rowSelection === void 0 ? void 0 : rowSelection.appearance]);
|
|
53
54
|
const areAllColumnsEnabled = enabledColumns.length === configurableColumns.length;
|
|
54
55
|
const getColumnsSettings = (0, react_1.useCallback)(columnOrder => (0, utils_3.prepareColumnsSettings)({
|
|
55
56
|
pinnedGroups,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ColumnPinningState } from '@tanstack/react-table';
|
|
2
2
|
import { ColumnDefinition } from '../../../types';
|
|
3
|
-
import { TableProps } from '../../types';
|
|
3
|
+
import { RowAppearance, TableProps } from '../../types';
|
|
4
4
|
type UseLoadingTableProps<TData extends object> = {
|
|
5
5
|
columnDefinitions: ColumnDefinition<TData>[];
|
|
6
6
|
pageSize: number;
|
|
@@ -8,8 +8,9 @@ type UseLoadingTableProps<TData extends object> = {
|
|
|
8
8
|
enableSelection?: boolean;
|
|
9
9
|
enableSelectPinned?: boolean;
|
|
10
10
|
expanding?: TableProps<TData>['expanding'];
|
|
11
|
+
rowSelectionAppearance?: RowAppearance;
|
|
11
12
|
};
|
|
12
|
-
export declare function useLoadingTable<TData extends object>({ pageSize, columnDefinitions, columnPinning, enableSelection, enableSelectPinned, expanding, }: UseLoadingTableProps<TData>): {
|
|
13
|
+
export declare function useLoadingTable<TData extends object>({ pageSize, columnDefinitions, columnPinning, enableSelection, enableSelectPinned, expanding, rowSelectionAppearance, }: UseLoadingTableProps<TData>): {
|
|
13
14
|
loadingTable: import("@tanstack/react-table").Table<TData>;
|
|
14
15
|
};
|
|
15
16
|
export {};
|
|
@@ -29,7 +29,8 @@ function useLoadingTable(_ref) {
|
|
|
29
29
|
columnPinning,
|
|
30
30
|
enableSelection,
|
|
31
31
|
enableSelectPinned,
|
|
32
|
-
expanding
|
|
32
|
+
expanding,
|
|
33
|
+
rowSelectionAppearance
|
|
33
34
|
} = _ref;
|
|
34
35
|
const data = (0, react_1.useMemo)(() => Array.from({
|
|
35
36
|
length: pageSize
|
|
@@ -49,7 +50,8 @@ function useLoadingTable(_ref) {
|
|
|
49
50
|
// for tree column
|
|
50
51
|
if (expanding) {
|
|
51
52
|
const treeColumnDef = (0, helperComponents_1.getTreeColumnDef)(Object.assign(Object.assign({}, expanding.expandingColumnDefinition), {
|
|
52
|
-
enableSelection
|
|
53
|
+
enableSelection,
|
|
54
|
+
rowSelectionAppearance
|
|
53
55
|
}));
|
|
54
56
|
const loadingTreeColumn = Object.assign(Object.assign({}, treeColumnDef), {
|
|
55
57
|
cell: () => (0, jsx_runtime_1.jsx)(CellSkeleton, {})
|
|
@@ -57,7 +59,7 @@ function useLoadingTable(_ref) {
|
|
|
57
59
|
cols = [loadingTreeColumn, ...cols];
|
|
58
60
|
}
|
|
59
61
|
return cols;
|
|
60
|
-
}, [columnDefinitions, enableSelection, enableSelectPinned, expanding]);
|
|
62
|
+
}, [columnDefinitions, enableSelection, enableSelectPinned, expanding, rowSelectionAppearance]);
|
|
61
63
|
const loadingTable = (0, react_table_1.useReactTable)({
|
|
62
64
|
data,
|
|
63
65
|
columns,
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { ColumnDefinition } from '../../../types';
|
|
2
|
-
import { TableProps } from '../../types';
|
|
2
|
+
import { RowAppearance, 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;
|
|
8
9
|
};
|
|
9
|
-
export declare function getTableColumnsDefinitions<TData extends object>({ columnDefinitions, enableSelection, enableSelectPinned, expanding, }: GetTableColumnsDefinitionsProps<TData>): ColumnDefinition<TData>[];
|
|
10
|
+
export declare function getTableColumnsDefinitions<TData extends object>({ columnDefinitions, enableSelection, enableSelectPinned, expanding, rowSelectionAppearance, }: GetTableColumnsDefinitionsProps<TData>): ColumnDefinition<TData>[];
|
|
10
11
|
export {};
|
|
@@ -5,12 +5,14 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.getTableColumnsDefinitions = getTableColumnsDefinitions;
|
|
7
7
|
const helperComponents_1 = require("../../../helperComponents");
|
|
8
|
+
const types_1 = require("../../types");
|
|
8
9
|
function getTableColumnsDefinitions(_ref) {
|
|
9
10
|
let {
|
|
10
11
|
columnDefinitions,
|
|
11
12
|
enableSelection,
|
|
12
13
|
enableSelectPinned,
|
|
13
|
-
expanding
|
|
14
|
+
expanding,
|
|
15
|
+
rowSelectionAppearance = types_1.RowAppearance.Disabled
|
|
14
16
|
} = _ref;
|
|
15
17
|
let cols = columnDefinitions;
|
|
16
18
|
if (enableSelection && !expanding) {
|
|
@@ -18,7 +20,8 @@ function getTableColumnsDefinitions(_ref) {
|
|
|
18
20
|
}
|
|
19
21
|
if (expanding) {
|
|
20
22
|
cols = [(0, helperComponents_1.getTreeColumnDef)(Object.assign(Object.assign({}, expanding.expandingColumnDefinition), {
|
|
21
|
-
enableSelection
|
|
23
|
+
enableSelection,
|
|
24
|
+
rowSelectionAppearance
|
|
22
25
|
})), ...cols];
|
|
23
26
|
}
|
|
24
27
|
return cols;
|
|
@@ -10,6 +10,10 @@ 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
|
+
}
|
|
13
17
|
type BaseTableProps<TData extends object, TFilters extends FiltersState = Record<string, unknown>> = WithSupportProps<{
|
|
14
18
|
/** Данные для отрисовки */
|
|
15
19
|
data: TData[];
|
|
@@ -55,6 +59,7 @@ type BaseTableProps<TData extends object, TFilters extends FiltersState = Record
|
|
|
55
59
|
* <strong>initialState</strong>: Начальное состояние выбора строк <br>
|
|
56
60
|
* <strong>state</strong>: Состояние выбора строк, жестко устанавливаемое снаружи <br>
|
|
57
61
|
* <strong>enable</strong>: Колбэк определяющий можно ли выбрать строку <br>
|
|
62
|
+
* <strong>appearance</strong>: Режим отображения недоступной для выбора строки. Опции: RowAppearance.Disabled (по дефолту) - серый фон, чекбокс/радиобаттон скрыт, RowAppearance.HideToggler - обычный фон, чекбокс/радиобаттон скрыт <br>
|
|
58
63
|
* <strong>multiRow</strong>: Мульти-выбор строк (включен по-умолчанию, когда включается выбор) <br>
|
|
59
64
|
* <strong>onChange</strong>: Колбэк на выбор строк
|
|
60
65
|
* */
|
|
@@ -64,6 +69,7 @@ type BaseTableProps<TData extends object, TFilters extends FiltersState = Record
|
|
|
64
69
|
enable?: RowSelectionOptions<TData>['enableRowSelection'];
|
|
65
70
|
multiRow?: boolean;
|
|
66
71
|
onChange?(state: RowSelectionState): void;
|
|
72
|
+
appearance?: RowAppearance;
|
|
67
73
|
};
|
|
68
74
|
/** Параметры отвечают за глобальный поиск в таблице <br>
|
|
69
75
|
* <strong>initialState</strong>: Начальное состояние строки поиска <br>
|
|
@@ -2,4 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
|
-
});
|
|
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 = {}));
|
|
@@ -62,7 +62,7 @@ function getSelectionCellColumnDef(enableSelectPinned) {
|
|
|
62
62
|
var _a, _b;
|
|
63
63
|
e.stopPropagation();
|
|
64
64
|
(_a = globalThis.getSelection()) === null || _a === void 0 ? void 0 : _a.removeAllRanges();
|
|
65
|
-
if (e.shiftKey) {
|
|
65
|
+
if (e.shiftKey && isMulti) {
|
|
66
66
|
const {
|
|
67
67
|
rows,
|
|
68
68
|
rowsById
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { CellContext } from '@tanstack/react-table';
|
|
2
2
|
import { ReactNode } from 'react';
|
|
3
|
+
import { RowAppearance } from '../../../components';
|
|
3
4
|
import { ColumnDefinition } from '../../../types';
|
|
4
5
|
type BaseTreeColumnDef = {
|
|
5
6
|
/** Имя ключа соответствующее полю в data */
|
|
@@ -26,7 +27,8 @@ type TreeColumnDefWithDescription<TData> = BaseTreeColumnDef & {
|
|
|
26
27
|
export type TreeColumnDefinitionProps<TData> = TreeColumnDef | TreeColumnDefWithDescription<TData>;
|
|
27
28
|
type TreeColDefProps<TData> = TreeColumnDefinitionProps<TData> & {
|
|
28
29
|
enableSelection?: boolean;
|
|
30
|
+
rowSelectionAppearance?: RowAppearance;
|
|
29
31
|
};
|
|
30
32
|
/** Вспомогательная функция для создания ячейки со статусом */
|
|
31
|
-
export declare function getTreeColumnDef<TData>({ showToggle, icon, expandedIcon, collapsedIcon, header, accessorKey, cell: renderCell, enableSelection, }: TreeColDefProps<TData>): ColumnDefinition<TData>;
|
|
33
|
+
export declare function getTreeColumnDef<TData>({ showToggle, icon, expandedIcon, collapsedIcon, header, accessorKey, cell: renderCell, enableSelection, rowSelectionAppearance, }: TreeColDefProps<TData>): ColumnDefinition<TData>;
|
|
32
34
|
export {};
|
|
@@ -15,6 +15,7 @@ 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");
|
|
18
19
|
const constants_1 = require("../../../constants");
|
|
19
20
|
const contexts_1 = require("../../../contexts");
|
|
20
21
|
const constants_2 = require("./constants");
|
|
@@ -36,7 +37,8 @@ function getTreeColumnDef(_ref) {
|
|
|
36
37
|
header,
|
|
37
38
|
accessorKey,
|
|
38
39
|
cell: renderCell,
|
|
39
|
-
enableSelection
|
|
40
|
+
enableSelection,
|
|
41
|
+
rowSelectionAppearance
|
|
40
42
|
} = _ref;
|
|
41
43
|
const cell = function TreeCell(ctx) {
|
|
42
44
|
var _a;
|
|
@@ -57,6 +59,7 @@ function getTreeColumnDef(_ref) {
|
|
|
57
59
|
const {
|
|
58
60
|
ref
|
|
59
61
|
} = (0, contexts_1.useCellResize)(constants_2.TREE_CELL_ID, cell);
|
|
62
|
+
const isToggleHidden = !isRowsSelectionEnabled && rowSelectionAppearance === components_1.RowAppearance.HideToggler;
|
|
60
63
|
const linesVisibilityByIndex = (0, react_1.useMemo)(() => {
|
|
61
64
|
var _a;
|
|
62
65
|
const parents = [];
|
|
@@ -141,7 +144,7 @@ function getTreeColumnDef(_ref) {
|
|
|
141
144
|
"data-disabled": !isRowsSelectionEnabled || undefined,
|
|
142
145
|
"data-selected": isRowSelected || undefined,
|
|
143
146
|
"data-multiselect": isMultiSelect || undefined,
|
|
144
|
-
children: [showToggle && (0, jsx_runtime_1.jsx)("div", {
|
|
147
|
+
children: [showToggle && !isToggleHidden && (0, jsx_runtime_1.jsx)("div", {
|
|
145
148
|
tabIndex: -1,
|
|
146
149
|
className: styles_module_scss_1.default.treeCheckboxWrap,
|
|
147
150
|
children: isMultiSelect ? (0, jsx_runtime_1.jsx)(toggles_1.Checkbox, {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Row as TableRow } from '@tanstack/react-table';
|
|
2
2
|
import { MouseEvent } from 'react';
|
|
3
|
+
import { RowAppearance } from '../../components';
|
|
3
4
|
import { ColumnOrder } from '../../types';
|
|
4
5
|
import { RowProps } from './Row';
|
|
5
6
|
export type RowInfo<TData> = {
|
|
@@ -14,5 +15,6 @@ export type BodyRowProps<TData> = Pick<RowProps, 'rowAutoHeight'> & {
|
|
|
14
15
|
onRowClick?: RowClickHandler<TData>;
|
|
15
16
|
columnOrder: ColumnOrder;
|
|
16
17
|
enableColumnsOrderSortByDrag?: boolean;
|
|
18
|
+
disabledRowAppearance?: RowAppearance;
|
|
17
19
|
};
|
|
18
|
-
export declare function BodyRow<TData>({ row, onRowClick, rowAutoHeight, columnOrder, enableColumnsOrderSortByDrag, }: BodyRowProps<TData>): import("react/jsx-runtime").JSX.Element;
|
|
20
|
+
export declare function BodyRow<TData>({ row, onRowClick, rowAutoHeight, columnOrder, enableColumnsOrderSortByDrag, disabledRowAppearance, }: BodyRowProps<TData>): import("react/jsx-runtime").JSX.Element;
|
|
@@ -12,6 +12,7 @@ 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");
|
|
15
16
|
const constants_1 = require("../../constants");
|
|
16
17
|
const Cells_1 = require("../Cells");
|
|
17
18
|
const contexts_1 = require("../contexts");
|
|
@@ -25,7 +26,8 @@ function BodyRow(_ref) {
|
|
|
25
26
|
onRowClick,
|
|
26
27
|
rowAutoHeight,
|
|
27
28
|
columnOrder,
|
|
28
|
-
enableColumnsOrderSortByDrag
|
|
29
|
+
enableColumnsOrderSortByDrag,
|
|
30
|
+
disabledRowAppearance = components_1.RowAppearance.Disabled
|
|
29
31
|
} = _ref;
|
|
30
32
|
const {
|
|
31
33
|
leftPinned,
|
|
@@ -57,6 +59,7 @@ function BodyRow(_ref) {
|
|
|
57
59
|
onClick: handleRowClick,
|
|
58
60
|
"data-clickable": Boolean(onRowClick) || undefined,
|
|
59
61
|
"data-disabled": disabled || undefined,
|
|
62
|
+
"data-row-appearance": disabled ? disabledRowAppearance : undefined,
|
|
60
63
|
"data-selected": isSelected || undefined,
|
|
61
64
|
"data-actions-opened": dropListOpened || undefined,
|
|
62
65
|
"data-test-id": constants_1.TEST_IDS.bodyRow,
|
|
@@ -82,11 +82,11 @@
|
|
|
82
82
|
.bodyRow[data-row-bg-appearance=pink]{
|
|
83
83
|
--snack-ui-table-row-background:color-mix(in srgb, var(--sys-pink-accent-default, #d1668e), var(--sys-neutral-background1-level, #fdfdfd) calc((1 - var(--opacity-a008, 0.08)) * 100%));
|
|
84
84
|
}
|
|
85
|
-
.bodyRow[data-disabled]{
|
|
85
|
+
.bodyRow[data-row-appearance=disabled]{
|
|
86
86
|
cursor:not-allowed;
|
|
87
87
|
background-color:var(--sys-neutral-background, #eeeff3);
|
|
88
88
|
}
|
|
89
|
-
.bodyRow[data-disabled] .rowPinnedCells{
|
|
89
|
+
.bodyRow[data-row-appearance=disabled] .rowPinnedCells{
|
|
90
90
|
background-color:var(--sys-neutral-background, #eeeff3);
|
|
91
91
|
}
|
|
92
92
|
.bodyRow[data-selected]{
|
|
@@ -58,7 +58,8 @@ export function Table(_a) {
|
|
|
58
58
|
enableSelection,
|
|
59
59
|
enableSelectPinned,
|
|
60
60
|
expanding,
|
|
61
|
-
|
|
61
|
+
rowSelectionAppearance: rowSelectionProp === null || rowSelectionProp === void 0 ? void 0 : rowSelectionProp.appearance,
|
|
62
|
+
}), [columnDefinitions, enableSelection, enableSelectPinned, expanding, rowSelectionProp === null || rowSelectionProp === void 0 ? void 0 : rowSelectionProp.appearance]);
|
|
62
63
|
const pinnedGroups = useMemo(() => getPinnedGroups(allTableColumns), [allTableColumns]);
|
|
63
64
|
const { enabledColumns, setEnabledColumns, getColumnsSettings, enabledTableColumns, enabledColumnsDefinitions, areColumnsSettingsEnabled, } = useColumnSettings({
|
|
64
65
|
columnDefinitions,
|
|
@@ -168,6 +169,7 @@ export function Table(_a) {
|
|
|
168
169
|
enableSelection,
|
|
169
170
|
enableSelectPinned,
|
|
170
171
|
expanding,
|
|
172
|
+
rowSelectionAppearance: rowSelectionProp === null || rowSelectionProp === void 0 ? void 0 : rowSelectionProp.appearance,
|
|
171
173
|
});
|
|
172
174
|
const handleOnRefresh = useCallback(() => {
|
|
173
175
|
table.resetRowSelection();
|
|
@@ -302,7 +304,7 @@ export function Table(_a) {
|
|
|
302
304
|
}
|
|
303
305
|
},
|
|
304
306
|
}
|
|
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 }))] })));
|
|
307
|
+
: 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, disabledRowAppearance: rowSelectionProp === null || rowSelectionProp === void 0 ? void 0 : rowSelectionProp.appearance }, 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, disabledRowAppearance: rowSelectionProp === null || rowSelectionProp === void 0 ? void 0 : rowSelectionProp.appearance }, row.id))) })) : null, centerRows.map(row => (_jsx(BodyRow, { row: row, onRowClick: onRowClick, rowAutoHeight: rowAutoHeight, columnOrder: columnOrder, enableColumnsOrderSortByDrag: enableColumnsOrderSortByDrag, disabledRowAppearance: rowSelectionProp === null || rowSelectionProp === void 0 ? void 0 : rowSelectionProp.appearance }, 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, disabledRowAppearance: rowSelectionProp === null || rowSelectionProp === void 0 ? void 0 : rowSelectionProp.appearance }, 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 }))] })));
|
|
306
308
|
}
|
|
307
309
|
Table.getStatusColumnDef = getStatusColumnDef;
|
|
308
310
|
Table.statusAppearances = STATUS_APPEARANCE;
|
|
@@ -32,7 +32,8 @@ export function useColumnSettings({ columnDefinitions, columnsSettings, pinnedGr
|
|
|
32
32
|
enableSelection,
|
|
33
33
|
enableSelectPinned,
|
|
34
34
|
expanding,
|
|
35
|
-
|
|
35
|
+
rowSelectionAppearance: rowSelection === null || rowSelection === void 0 ? void 0 : rowSelection.appearance,
|
|
36
|
+
}), [enableSelectPinned, enableSelection, enabledColumnsDefinitions, expanding, rowSelection === null || rowSelection === void 0 ? void 0 : rowSelection.appearance]);
|
|
36
37
|
const areAllColumnsEnabled = enabledColumns.length === configurableColumns.length;
|
|
37
38
|
const getColumnsSettings = useCallback((columnOrder) => prepareColumnsSettings({
|
|
38
39
|
pinnedGroups,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ColumnPinningState } from '@tanstack/react-table';
|
|
2
2
|
import { ColumnDefinition } from '../../../types';
|
|
3
|
-
import { TableProps } from '../../types';
|
|
3
|
+
import { RowAppearance, TableProps } from '../../types';
|
|
4
4
|
type UseLoadingTableProps<TData extends object> = {
|
|
5
5
|
columnDefinitions: ColumnDefinition<TData>[];
|
|
6
6
|
pageSize: number;
|
|
@@ -8,8 +8,9 @@ type UseLoadingTableProps<TData extends object> = {
|
|
|
8
8
|
enableSelection?: boolean;
|
|
9
9
|
enableSelectPinned?: boolean;
|
|
10
10
|
expanding?: TableProps<TData>['expanding'];
|
|
11
|
+
rowSelectionAppearance?: RowAppearance;
|
|
11
12
|
};
|
|
12
|
-
export declare function useLoadingTable<TData extends object>({ pageSize, columnDefinitions, columnPinning, enableSelection, enableSelectPinned, expanding, }: UseLoadingTableProps<TData>): {
|
|
13
|
+
export declare function useLoadingTable<TData extends object>({ pageSize, columnDefinitions, columnPinning, enableSelection, enableSelectPinned, expanding, rowSelectionAppearance, }: UseLoadingTableProps<TData>): {
|
|
13
14
|
loadingTable: import("@tanstack/react-table").Table<TData>;
|
|
14
15
|
};
|
|
15
16
|
export {};
|
|
@@ -7,7 +7,7 @@ import styles from '../styles.module.css';
|
|
|
7
7
|
function CellSkeleton() {
|
|
8
8
|
return _jsx(SkeletonText, { className: styles.skeleton, lines: 1, width: '100%' });
|
|
9
9
|
}
|
|
10
|
-
export function useLoadingTable({ pageSize, columnDefinitions, columnPinning, enableSelection, enableSelectPinned, expanding, }) {
|
|
10
|
+
export function useLoadingTable({ pageSize, columnDefinitions, columnPinning, enableSelection, enableSelectPinned, expanding, rowSelectionAppearance, }) {
|
|
11
11
|
const data = useMemo(() => Array.from({ length: pageSize }).map(() => ({})), [pageSize]);
|
|
12
12
|
const columns = useMemo(() => {
|
|
13
13
|
let cols = columnDefinitions.map(column => (Object.assign(Object.assign({}, column), { cell: () => _jsx(CellSkeleton, {}) })));
|
|
@@ -19,12 +19,13 @@ export function useLoadingTable({ pageSize, columnDefinitions, columnPinning, en
|
|
|
19
19
|
}
|
|
20
20
|
// for tree column
|
|
21
21
|
if (expanding) {
|
|
22
|
-
const treeColumnDef = getTreeColumnDef(Object.assign(Object.assign({}, expanding.expandingColumnDefinition), { enableSelection
|
|
22
|
+
const treeColumnDef = getTreeColumnDef(Object.assign(Object.assign({}, expanding.expandingColumnDefinition), { enableSelection,
|
|
23
|
+
rowSelectionAppearance }));
|
|
23
24
|
const loadingTreeColumn = Object.assign(Object.assign({}, treeColumnDef), { cell: () => _jsx(CellSkeleton, {}) });
|
|
24
25
|
cols = [loadingTreeColumn, ...cols];
|
|
25
26
|
}
|
|
26
27
|
return cols;
|
|
27
|
-
}, [columnDefinitions, enableSelection, enableSelectPinned, expanding]);
|
|
28
|
+
}, [columnDefinitions, enableSelection, enableSelectPinned, expanding, rowSelectionAppearance]);
|
|
28
29
|
const loadingTable = useReactTable({
|
|
29
30
|
data,
|
|
30
31
|
columns,
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { ColumnDefinition } from '../../../types';
|
|
2
|
-
import { TableProps } from '../../types';
|
|
2
|
+
import { RowAppearance, 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;
|
|
8
9
|
};
|
|
9
|
-
export declare function getTableColumnsDefinitions<TData extends object>({ columnDefinitions, enableSelection, enableSelectPinned, expanding, }: GetTableColumnsDefinitionsProps<TData>): ColumnDefinition<TData>[];
|
|
10
|
+
export declare function getTableColumnsDefinitions<TData extends object>({ columnDefinitions, enableSelection, enableSelectPinned, expanding, rowSelectionAppearance, }: GetTableColumnsDefinitionsProps<TData>): ColumnDefinition<TData>[];
|
|
10
11
|
export {};
|
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
import { getSelectionCellColumnDef, getTreeColumnDef } from '../../../helperComponents';
|
|
2
|
-
|
|
2
|
+
import { RowAppearance } from '../../types';
|
|
3
|
+
export function getTableColumnsDefinitions({ columnDefinitions, enableSelection, enableSelectPinned, expanding, rowSelectionAppearance = RowAppearance.Disabled, }) {
|
|
3
4
|
let cols = columnDefinitions;
|
|
4
5
|
if (enableSelection && !expanding) {
|
|
5
6
|
cols = [getSelectionCellColumnDef(enableSelectPinned), ...cols];
|
|
6
7
|
}
|
|
7
8
|
if (expanding) {
|
|
8
|
-
cols = [
|
|
9
|
+
cols = [
|
|
10
|
+
getTreeColumnDef(Object.assign(Object.assign({}, expanding.expandingColumnDefinition), { enableSelection, rowSelectionAppearance })),
|
|
11
|
+
...cols,
|
|
12
|
+
];
|
|
9
13
|
}
|
|
10
14
|
return cols;
|
|
11
15
|
}
|
|
@@ -10,6 +10,10 @@ 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
|
+
}
|
|
13
17
|
type BaseTableProps<TData extends object, TFilters extends FiltersState = Record<string, unknown>> = WithSupportProps<{
|
|
14
18
|
/** Данные для отрисовки */
|
|
15
19
|
data: TData[];
|
|
@@ -55,6 +59,7 @@ type BaseTableProps<TData extends object, TFilters extends FiltersState = Record
|
|
|
55
59
|
* <strong>initialState</strong>: Начальное состояние выбора строк <br>
|
|
56
60
|
* <strong>state</strong>: Состояние выбора строк, жестко устанавливаемое снаружи <br>
|
|
57
61
|
* <strong>enable</strong>: Колбэк определяющий можно ли выбрать строку <br>
|
|
62
|
+
* <strong>appearance</strong>: Режим отображения недоступной для выбора строки. Опции: RowAppearance.Disabled (по дефолту) - серый фон, чекбокс/радиобаттон скрыт, RowAppearance.HideToggler - обычный фон, чекбокс/радиобаттон скрыт <br>
|
|
58
63
|
* <strong>multiRow</strong>: Мульти-выбор строк (включен по-умолчанию, когда включается выбор) <br>
|
|
59
64
|
* <strong>onChange</strong>: Колбэк на выбор строк
|
|
60
65
|
* */
|
|
@@ -64,6 +69,7 @@ type BaseTableProps<TData extends object, TFilters extends FiltersState = Record
|
|
|
64
69
|
enable?: RowSelectionOptions<TData>['enableRowSelection'];
|
|
65
70
|
multiRow?: boolean;
|
|
66
71
|
onChange?(state: RowSelectionState): void;
|
|
72
|
+
appearance?: RowAppearance;
|
|
67
73
|
};
|
|
68
74
|
/** Параметры отвечают за глобальный поиск в таблице <br>
|
|
69
75
|
* <strong>initialState</strong>: Начальное состояние строки поиска <br>
|
|
@@ -46,7 +46,7 @@ export function getSelectionCellColumnDef(enableSelectPinned) {
|
|
|
46
46
|
var _a, _b;
|
|
47
47
|
e.stopPropagation();
|
|
48
48
|
(_a = globalThis.getSelection()) === null || _a === void 0 ? void 0 : _a.removeAllRanges();
|
|
49
|
-
if (e.shiftKey) {
|
|
49
|
+
if (e.shiftKey && isMulti) {
|
|
50
50
|
const { rows, rowsById } = table.getRowModel();
|
|
51
51
|
const rowsToToggle = getRowsToToggle(rows, row.id, rows.map(r => r.id).includes(previousClickedRowId) ? previousClickedRowId : '');
|
|
52
52
|
const isSelected = !((_b = rowsById[row.id]) === null || _b === void 0 ? void 0 : _b.getIsSelected()) || false;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { CellContext } from '@tanstack/react-table';
|
|
2
2
|
import { ReactNode } from 'react';
|
|
3
|
+
import { RowAppearance } from '../../../components';
|
|
3
4
|
import { ColumnDefinition } from '../../../types';
|
|
4
5
|
type BaseTreeColumnDef = {
|
|
5
6
|
/** Имя ключа соответствующее полю в data */
|
|
@@ -26,7 +27,8 @@ type TreeColumnDefWithDescription<TData> = BaseTreeColumnDef & {
|
|
|
26
27
|
export type TreeColumnDefinitionProps<TData> = TreeColumnDef | TreeColumnDefWithDescription<TData>;
|
|
27
28
|
type TreeColDefProps<TData> = TreeColumnDefinitionProps<TData> & {
|
|
28
29
|
enableSelection?: boolean;
|
|
30
|
+
rowSelectionAppearance?: RowAppearance;
|
|
29
31
|
};
|
|
30
32
|
/** Вспомогательная функция для создания ячейки со статусом */
|
|
31
|
-
export declare function getTreeColumnDef<TData>({ showToggle, icon, expandedIcon, collapsedIcon, header, accessorKey, cell: renderCell, enableSelection, }: TreeColDefProps<TData>): ColumnDefinition<TData>;
|
|
33
|
+
export declare function getTreeColumnDef<TData>({ showToggle, icon, expandedIcon, collapsedIcon, header, accessorKey, cell: renderCell, enableSelection, rowSelectionAppearance, }: TreeColDefProps<TData>): ColumnDefinition<TData>;
|
|
32
34
|
export {};
|
|
@@ -4,13 +4,14 @@ 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';
|
|
7
8
|
import { COLUMN_PIN_POSITION, TEST_IDS } from '../../../constants';
|
|
8
9
|
import { useCellResize } from '../../../contexts';
|
|
9
10
|
import { TREE_CELL_ID } from './constants';
|
|
10
11
|
import styles from './styles.module.css';
|
|
11
12
|
import { TreeLine } from './TreeLine';
|
|
12
13
|
/** Вспомогательная функция для создания ячейки со статусом */
|
|
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, }) {
|
|
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, rowSelectionAppearance, }) {
|
|
14
15
|
const cell = function TreeCell(ctx) {
|
|
15
16
|
var _a;
|
|
16
17
|
const { row, cell } = ctx;
|
|
@@ -25,6 +26,7 @@ export function getTreeColumnDef({ showToggle = false, icon = _jsx(FileSVG, { si
|
|
|
25
26
|
const isLastChildRow = ((_a = parent === null || parent === void 0 ? void 0 : parent.subRows.at(-1)) === null || _a === void 0 ? void 0 : _a.id) === row.id;
|
|
26
27
|
const depth = row.depth;
|
|
27
28
|
const { ref } = useCellResize(TREE_CELL_ID, cell);
|
|
29
|
+
const isToggleHidden = !isRowsSelectionEnabled && rowSelectionAppearance === RowAppearance.HideToggler;
|
|
28
30
|
const linesVisibilityByIndex = useMemo(() => {
|
|
29
31
|
var _a;
|
|
30
32
|
const parents = [];
|
|
@@ -82,7 +84,7 @@ export function getTreeColumnDef({ showToggle = false, icon = _jsx(FileSVG, { si
|
|
|
82
84
|
// @ts-ignore
|
|
83
85
|
cell.row.original[accessorKey]
|
|
84
86
|
: cell.getValue();
|
|
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 })] })] })] }) }));
|
|
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 && !isToggleHidden && (_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 })] })] })] }) }));
|
|
86
88
|
};
|
|
87
89
|
return {
|
|
88
90
|
id: TREE_CELL_ID,
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Row as TableRow } from '@tanstack/react-table';
|
|
2
2
|
import { MouseEvent } from 'react';
|
|
3
|
+
import { RowAppearance } from '../../components';
|
|
3
4
|
import { ColumnOrder } from '../../types';
|
|
4
5
|
import { RowProps } from './Row';
|
|
5
6
|
export type RowInfo<TData> = {
|
|
@@ -14,5 +15,6 @@ export type BodyRowProps<TData> = Pick<RowProps, 'rowAutoHeight'> & {
|
|
|
14
15
|
onRowClick?: RowClickHandler<TData>;
|
|
15
16
|
columnOrder: ColumnOrder;
|
|
16
17
|
enableColumnsOrderSortByDrag?: boolean;
|
|
18
|
+
disabledRowAppearance?: RowAppearance;
|
|
17
19
|
};
|
|
18
|
-
export declare function BodyRow<TData>({ row, onRowClick, rowAutoHeight, columnOrder, enableColumnsOrderSortByDrag, }: BodyRowProps<TData>): import("react/jsx-runtime").JSX.Element;
|
|
20
|
+
export declare function BodyRow<TData>({ row, onRowClick, rowAutoHeight, columnOrder, enableColumnsOrderSortByDrag, disabledRowAppearance, }: BodyRowProps<TData>): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,6 +1,7 @@
|
|
|
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';
|
|
4
5
|
import { COLUMN_PIN_POSITION, TEST_IDS } from '../../constants';
|
|
5
6
|
import { BodyCell } from '../Cells';
|
|
6
7
|
import { RowContext, useTableContext } from '../contexts';
|
|
@@ -8,7 +9,7 @@ import { useRowCells } from '../hooks';
|
|
|
8
9
|
import { PinnedCells } from './PinnedCells';
|
|
9
10
|
import { Row } from './Row';
|
|
10
11
|
import styles from './styles.module.css';
|
|
11
|
-
export function BodyRow({ row, onRowClick, rowAutoHeight, columnOrder, enableColumnsOrderSortByDrag, }) {
|
|
12
|
+
export function BodyRow({ row, onRowClick, rowAutoHeight, columnOrder, enableColumnsOrderSortByDrag, disabledRowAppearance = RowAppearance.Disabled, }) {
|
|
12
13
|
const { leftPinned, rightPinned, unpinned } = useRowCells(row);
|
|
13
14
|
const [dropListOpened, setDropListOpen] = useState(false);
|
|
14
15
|
const disabled = !row.getCanSelect();
|
|
@@ -25,5 +26,5 @@ export function BodyRow({ row, onRowClick, rowAutoHeight, columnOrder, enableCol
|
|
|
25
26
|
};
|
|
26
27
|
const isSelected = row.getIsSelected() || (row.getIsSomeSelected() && !row.getCanMultiSelect() && !row.getIsExpanded());
|
|
27
28
|
const rowBackgroundColor = getRowBackgroundColor === null || getRowBackgroundColor === void 0 ? void 0 : getRowBackgroundColor(row.original);
|
|
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))) }))] }) }));
|
|
29
|
+
return (_jsx(RowContext.Provider, { value: { dropListOpened, setDropListOpen }, children: _jsxs(Row, { onClick: handleRowClick, "data-clickable": Boolean(onRowClick) || undefined, "data-disabled": disabled || undefined, "data-row-appearance": disabled ? disabledRowAppearance : 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))) }))] }) }));
|
|
29
30
|
}
|
|
@@ -82,11 +82,11 @@
|
|
|
82
82
|
.bodyRow[data-row-bg-appearance=pink]{
|
|
83
83
|
--snack-ui-table-row-background:color-mix(in srgb, var(--sys-pink-accent-default, #d1668e), var(--sys-neutral-background1-level, #fdfdfd) calc((1 - var(--opacity-a008, 0.08)) * 100%));
|
|
84
84
|
}
|
|
85
|
-
.bodyRow[data-disabled]{
|
|
85
|
+
.bodyRow[data-row-appearance=disabled]{
|
|
86
86
|
cursor:not-allowed;
|
|
87
87
|
background-color:var(--sys-neutral-background, #eeeff3);
|
|
88
88
|
}
|
|
89
|
-
.bodyRow[data-disabled] .rowPinnedCells{
|
|
89
|
+
.bodyRow[data-row-appearance=disabled] .rowPinnedCells{
|
|
90
90
|
background-color:var(--sys-neutral-background, #eeeff3);
|
|
91
91
|
}
|
|
92
92
|
.bodyRow[data-selected]{
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
6
|
"title": "Table",
|
|
7
|
-
"version": "0.37.
|
|
7
|
+
"version": "0.37.19",
|
|
8
8
|
"sideEffects": [
|
|
9
9
|
"*.css",
|
|
10
10
|
"*.woff",
|
|
@@ -65,5 +65,5 @@
|
|
|
65
65
|
"peerDependencies": {
|
|
66
66
|
"@snack-uikit/locale": "*"
|
|
67
67
|
},
|
|
68
|
-
"gitHead": "
|
|
68
|
+
"gitHead": "20705cda6956b2cfe72239357c1e93b55bc3c437"
|
|
69
69
|
}
|
|
@@ -173,8 +173,9 @@ export function Table<TData extends object, TFilters extends FiltersState = Reco
|
|
|
173
173
|
enableSelection,
|
|
174
174
|
enableSelectPinned,
|
|
175
175
|
expanding,
|
|
176
|
+
rowSelectionAppearance: rowSelectionProp?.appearance,
|
|
176
177
|
}),
|
|
177
|
-
[columnDefinitions, enableSelection, enableSelectPinned, expanding],
|
|
178
|
+
[columnDefinitions, enableSelection, enableSelectPinned, expanding, rowSelectionProp?.appearance],
|
|
178
179
|
);
|
|
179
180
|
const pinnedGroups = useMemo(() => getPinnedGroups(allTableColumns), [allTableColumns]);
|
|
180
181
|
|
|
@@ -308,6 +309,7 @@ export function Table<TData extends object, TFilters extends FiltersState = Reco
|
|
|
308
309
|
enableSelection,
|
|
309
310
|
enableSelectPinned,
|
|
310
311
|
expanding,
|
|
312
|
+
rowSelectionAppearance: rowSelectionProp?.appearance,
|
|
311
313
|
});
|
|
312
314
|
|
|
313
315
|
const handleOnRefresh = useCallback(() => {
|
|
@@ -533,7 +535,13 @@ export function Table<TData extends object, TFilters extends FiltersState = Reco
|
|
|
533
535
|
<SkeletonContextProvider loading>
|
|
534
536
|
<HeaderRow rowAutoHeight={rowAutoHeight} columnOrder={columnOrder} />
|
|
535
537
|
{loadingTableRows.map(row => (
|
|
536
|
-
<BodyRow
|
|
538
|
+
<BodyRow
|
|
539
|
+
key={row.id}
|
|
540
|
+
row={row}
|
|
541
|
+
rowAutoHeight={rowAutoHeight}
|
|
542
|
+
columnOrder={columnOrder}
|
|
543
|
+
disabledRowAppearance={rowSelectionProp?.appearance}
|
|
544
|
+
/>
|
|
537
545
|
))}
|
|
538
546
|
</SkeletonContextProvider>
|
|
539
547
|
) : (
|
|
@@ -556,6 +564,7 @@ export function Table<TData extends object, TFilters extends FiltersState = Reco
|
|
|
556
564
|
rowAutoHeight={rowAutoHeight}
|
|
557
565
|
columnOrder={columnOrder}
|
|
558
566
|
enableColumnsOrderSortByDrag={enableColumnsOrderSortByDrag}
|
|
567
|
+
disabledRowAppearance={rowSelectionProp?.appearance}
|
|
559
568
|
/>
|
|
560
569
|
))}
|
|
561
570
|
</div>
|
|
@@ -569,6 +578,7 @@ export function Table<TData extends object, TFilters extends FiltersState = Reco
|
|
|
569
578
|
rowAutoHeight={rowAutoHeight}
|
|
570
579
|
columnOrder={columnOrder}
|
|
571
580
|
enableColumnsOrderSortByDrag={enableColumnsOrderSortByDrag}
|
|
581
|
+
disabledRowAppearance={rowSelectionProp?.appearance}
|
|
572
582
|
/>
|
|
573
583
|
))}
|
|
574
584
|
|
|
@@ -580,6 +590,7 @@ export function Table<TData extends object, TFilters extends FiltersState = Reco
|
|
|
580
590
|
row={row}
|
|
581
591
|
columnOrder={columnOrder}
|
|
582
592
|
enableColumnsOrderSortByDrag={enableColumnsOrderSortByDrag}
|
|
593
|
+
disabledRowAppearance={rowSelectionProp?.appearance}
|
|
583
594
|
/>
|
|
584
595
|
))}
|
|
585
596
|
</SkeletonContextProvider>
|
|
@@ -74,8 +74,9 @@ export function useColumnSettings<TData extends object, TFilters extends Record<
|
|
|
74
74
|
enableSelection,
|
|
75
75
|
enableSelectPinned,
|
|
76
76
|
expanding,
|
|
77
|
+
rowSelectionAppearance: rowSelection?.appearance,
|
|
77
78
|
}),
|
|
78
|
-
[enableSelectPinned, enableSelection, enabledColumnsDefinitions, expanding],
|
|
79
|
+
[enableSelectPinned, enableSelection, enabledColumnsDefinitions, expanding, rowSelection?.appearance],
|
|
79
80
|
);
|
|
80
81
|
|
|
81
82
|
const areAllColumnsEnabled = enabledColumns.length === configurableColumns.length;
|
|
@@ -5,7 +5,7 @@ import { SkeletonText } from '@snack-uikit/skeleton';
|
|
|
5
5
|
|
|
6
6
|
import { getSelectionCellColumnDef, getTreeColumnDef } from '../../../helperComponents';
|
|
7
7
|
import { ColumnDefinition } from '../../../types';
|
|
8
|
-
import { TableProps } from '../../types';
|
|
8
|
+
import { RowAppearance, TableProps } from '../../types';
|
|
9
9
|
import styles from '../styles.module.scss';
|
|
10
10
|
|
|
11
11
|
type UseLoadingTableProps<TData extends object> = {
|
|
@@ -15,6 +15,7 @@ type UseLoadingTableProps<TData extends object> = {
|
|
|
15
15
|
enableSelection?: boolean;
|
|
16
16
|
enableSelectPinned?: boolean;
|
|
17
17
|
expanding?: TableProps<TData>['expanding'];
|
|
18
|
+
rowSelectionAppearance?: RowAppearance;
|
|
18
19
|
};
|
|
19
20
|
|
|
20
21
|
function CellSkeleton() {
|
|
@@ -28,6 +29,7 @@ export function useLoadingTable<TData extends object>({
|
|
|
28
29
|
enableSelection,
|
|
29
30
|
enableSelectPinned,
|
|
30
31
|
expanding,
|
|
32
|
+
rowSelectionAppearance,
|
|
31
33
|
}: UseLoadingTableProps<TData>) {
|
|
32
34
|
const data = useMemo(() => Array.from({ length: pageSize }).map(() => ({}) as TData), [pageSize]);
|
|
33
35
|
const columns = useMemo(() => {
|
|
@@ -49,7 +51,11 @@ export function useLoadingTable<TData extends object>({
|
|
|
49
51
|
|
|
50
52
|
// for tree column
|
|
51
53
|
if (expanding) {
|
|
52
|
-
const treeColumnDef = getTreeColumnDef({
|
|
54
|
+
const treeColumnDef = getTreeColumnDef({
|
|
55
|
+
...expanding.expandingColumnDefinition,
|
|
56
|
+
enableSelection,
|
|
57
|
+
rowSelectionAppearance,
|
|
58
|
+
});
|
|
53
59
|
const loadingTreeColumn = {
|
|
54
60
|
...treeColumnDef,
|
|
55
61
|
cell: () => <CellSkeleton />,
|
|
@@ -59,7 +65,7 @@ export function useLoadingTable<TData extends object>({
|
|
|
59
65
|
}
|
|
60
66
|
|
|
61
67
|
return cols;
|
|
62
|
-
}, [columnDefinitions, enableSelection, enableSelectPinned, expanding]);
|
|
68
|
+
}, [columnDefinitions, enableSelection, enableSelectPinned, expanding, rowSelectionAppearance]);
|
|
63
69
|
|
|
64
70
|
const loadingTable = useReactTable<TData>({
|
|
65
71
|
data,
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { getSelectionCellColumnDef, getTreeColumnDef } from '../../../helperComponents';
|
|
2
2
|
import { ColumnDefinition } from '../../../types';
|
|
3
|
-
import { TableProps } from '../../types';
|
|
3
|
+
import { RowAppearance, 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;
|
|
10
11
|
};
|
|
11
12
|
|
|
12
13
|
export function getTableColumnsDefinitions<TData extends object>({
|
|
@@ -14,13 +15,17 @@ export function getTableColumnsDefinitions<TData extends object>({
|
|
|
14
15
|
enableSelection,
|
|
15
16
|
enableSelectPinned,
|
|
16
17
|
expanding,
|
|
18
|
+
rowSelectionAppearance = RowAppearance.Disabled,
|
|
17
19
|
}: GetTableColumnsDefinitionsProps<TData>): ColumnDefinition<TData>[] {
|
|
18
20
|
let cols: ColumnDefinition<TData>[] = columnDefinitions;
|
|
19
21
|
if (enableSelection && !expanding) {
|
|
20
22
|
cols = [getSelectionCellColumnDef(enableSelectPinned), ...cols];
|
|
21
23
|
}
|
|
22
24
|
if (expanding) {
|
|
23
|
-
cols = [
|
|
25
|
+
cols = [
|
|
26
|
+
getTreeColumnDef({ ...expanding.expandingColumnDefinition, enableSelection, rowSelectionAppearance }),
|
|
27
|
+
...cols,
|
|
28
|
+
];
|
|
24
29
|
}
|
|
25
30
|
return cols;
|
|
26
31
|
}
|
package/src/components/types.ts
CHANGED
|
@@ -22,6 +22,11 @@ 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
|
+
|
|
25
30
|
type BaseTableProps<TData extends object, TFilters extends FiltersState = Record<string, unknown>> = WithSupportProps<{
|
|
26
31
|
/** Данные для отрисовки */
|
|
27
32
|
data: TData[];
|
|
@@ -69,6 +74,7 @@ type BaseTableProps<TData extends object, TFilters extends FiltersState = Record
|
|
|
69
74
|
* <strong>initialState</strong>: Начальное состояние выбора строк <br>
|
|
70
75
|
* <strong>state</strong>: Состояние выбора строк, жестко устанавливаемое снаружи <br>
|
|
71
76
|
* <strong>enable</strong>: Колбэк определяющий можно ли выбрать строку <br>
|
|
77
|
+
* <strong>appearance</strong>: Режим отображения недоступной для выбора строки. Опции: RowAppearance.Disabled (по дефолту) - серый фон, чекбокс/радиобаттон скрыт, RowAppearance.HideToggler - обычный фон, чекбокс/радиобаттон скрыт <br>
|
|
72
78
|
* <strong>multiRow</strong>: Мульти-выбор строк (включен по-умолчанию, когда включается выбор) <br>
|
|
73
79
|
* <strong>onChange</strong>: Колбэк на выбор строк
|
|
74
80
|
* */
|
|
@@ -78,6 +84,7 @@ type BaseTableProps<TData extends object, TFilters extends FiltersState = Record
|
|
|
78
84
|
enable?: RowSelectionOptions<TData>['enableRowSelection'];
|
|
79
85
|
multiRow?: boolean;
|
|
80
86
|
onChange?(state: RowSelectionState): void;
|
|
87
|
+
appearance?: RowAppearance;
|
|
81
88
|
};
|
|
82
89
|
/** Параметры отвечают за глобальный поиск в таблице <br>
|
|
83
90
|
* <strong>initialState</strong>: Начальное состояние строки поиска <br>
|
|
@@ -64,7 +64,7 @@ export function getSelectionCellColumnDef<TData>(enableSelectPinned: boolean): C
|
|
|
64
64
|
|
|
65
65
|
globalThis.getSelection()?.removeAllRanges();
|
|
66
66
|
|
|
67
|
-
if (e.shiftKey) {
|
|
67
|
+
if (e.shiftKey && isMulti) {
|
|
68
68
|
const { rows, rowsById } = table.getRowModel();
|
|
69
69
|
const rowsToToggle = getRowsToToggle(
|
|
70
70
|
rows,
|
|
@@ -6,6 +6,7 @@ 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';
|
|
9
10
|
import { COLUMN_PIN_POSITION, TEST_IDS } from '../../../constants';
|
|
10
11
|
import { useCellResize } from '../../../contexts';
|
|
11
12
|
import { ColumnDefinition } from '../../../types';
|
|
@@ -42,6 +43,7 @@ export type TreeColumnDefinitionProps<TData> = TreeColumnDef | TreeColumnDefWith
|
|
|
42
43
|
|
|
43
44
|
type TreeColDefProps<TData> = TreeColumnDefinitionProps<TData> & {
|
|
44
45
|
enableSelection?: boolean;
|
|
46
|
+
rowSelectionAppearance?: RowAppearance;
|
|
45
47
|
};
|
|
46
48
|
|
|
47
49
|
/** Вспомогательная функция для создания ячейки со статусом */
|
|
@@ -54,6 +56,7 @@ export function getTreeColumnDef<TData>({
|
|
|
54
56
|
accessorKey,
|
|
55
57
|
cell: renderCell,
|
|
56
58
|
enableSelection,
|
|
59
|
+
rowSelectionAppearance,
|
|
57
60
|
}: TreeColDefProps<TData>): ColumnDefinition<TData> {
|
|
58
61
|
const cell: ColumnDefinition<TData>['cell'] = function TreeCell(ctx) {
|
|
59
62
|
const { row, cell } = ctx;
|
|
@@ -69,6 +72,8 @@ export function getTreeColumnDef<TData>({
|
|
|
69
72
|
const depth = row.depth;
|
|
70
73
|
const { ref } = useCellResize(TREE_CELL_ID, cell);
|
|
71
74
|
|
|
75
|
+
const isToggleHidden = !isRowsSelectionEnabled && rowSelectionAppearance === RowAppearance.HideToggler;
|
|
76
|
+
|
|
72
77
|
const linesVisibilityByIndex = useMemo(() => {
|
|
73
78
|
const parents: (Row<TData> | undefined)[] = [];
|
|
74
79
|
for (let i = depth; i >= 0; i--) {
|
|
@@ -181,7 +186,7 @@ export function getTreeColumnDef<TData>({
|
|
|
181
186
|
data-selected={isRowSelected || undefined}
|
|
182
187
|
data-multiselect={isMultiSelect || undefined}
|
|
183
188
|
>
|
|
184
|
-
{showToggle && (
|
|
189
|
+
{showToggle && !isToggleHidden && (
|
|
185
190
|
<div tabIndex={-1} className={styles.treeCheckboxWrap}>
|
|
186
191
|
{isMultiSelect ? (
|
|
187
192
|
<Checkbox
|
|
@@ -2,6 +2,7 @@ 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';
|
|
5
6
|
import { COLUMN_PIN_POSITION, TEST_IDS } from '../../constants';
|
|
6
7
|
import { ColumnOrder } from '../../types';
|
|
7
8
|
import { BodyCell } from '../Cells';
|
|
@@ -25,6 +26,7 @@ export type BodyRowProps<TData> = Pick<RowProps, 'rowAutoHeight'> & {
|
|
|
25
26
|
onRowClick?: RowClickHandler<TData>;
|
|
26
27
|
columnOrder: ColumnOrder;
|
|
27
28
|
enableColumnsOrderSortByDrag?: boolean;
|
|
29
|
+
disabledRowAppearance?: RowAppearance;
|
|
28
30
|
};
|
|
29
31
|
|
|
30
32
|
export function BodyRow<TData>({
|
|
@@ -33,6 +35,7 @@ export function BodyRow<TData>({
|
|
|
33
35
|
rowAutoHeight,
|
|
34
36
|
columnOrder,
|
|
35
37
|
enableColumnsOrderSortByDrag,
|
|
38
|
+
disabledRowAppearance = RowAppearance.Disabled,
|
|
36
39
|
}: BodyRowProps<TData>) {
|
|
37
40
|
const { leftPinned, rightPinned, unpinned } = useRowCells(row);
|
|
38
41
|
|
|
@@ -64,6 +67,7 @@ export function BodyRow<TData>({
|
|
|
64
67
|
onClick={handleRowClick}
|
|
65
68
|
data-clickable={Boolean(onRowClick) || undefined}
|
|
66
69
|
data-disabled={disabled || undefined}
|
|
70
|
+
data-row-appearance={disabled ? disabledRowAppearance : undefined}
|
|
67
71
|
data-selected={isSelected || undefined}
|
|
68
72
|
data-actions-opened={dropListOpened || undefined}
|
|
69
73
|
data-test-id={TEST_IDS.bodyRow}
|