@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.
Files changed (43) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/README.md +2 -2
  3. package/dist/cjs/components/Table/Table.js +13 -7
  4. package/dist/cjs/components/Table/hooks/useColumnSettings/useColumnSettings.js +3 -2
  5. package/dist/cjs/components/Table/hooks/useLoadingTable.d.ts +3 -2
  6. package/dist/cjs/components/Table/hooks/useLoadingTable.js +5 -3
  7. package/dist/cjs/components/Table/utils/getTableColumnsDefinitions.d.ts +3 -2
  8. package/dist/cjs/components/Table/utils/getTableColumnsDefinitions.js +5 -2
  9. package/dist/cjs/components/types.d.ts +6 -0
  10. package/dist/cjs/components/types.js +7 -1
  11. package/dist/cjs/helperComponents/Cells/RowActionsCell/styles.module.css +0 -1
  12. package/dist/cjs/helperComponents/Cells/SelectionCell/SelectionCell.js +1 -1
  13. package/dist/cjs/helperComponents/Cells/TreeCell/TreeCell.d.ts +3 -1
  14. package/dist/cjs/helperComponents/Cells/TreeCell/TreeCell.js +5 -2
  15. package/dist/cjs/helperComponents/Rows/BodyRow.d.ts +3 -1
  16. package/dist/cjs/helperComponents/Rows/BodyRow.js +4 -1
  17. package/dist/cjs/helperComponents/Rows/styles.module.css +2 -2
  18. package/dist/esm/components/Table/Table.js +4 -2
  19. package/dist/esm/components/Table/hooks/useColumnSettings/useColumnSettings.js +2 -1
  20. package/dist/esm/components/Table/hooks/useLoadingTable.d.ts +3 -2
  21. package/dist/esm/components/Table/hooks/useLoadingTable.js +4 -3
  22. package/dist/esm/components/Table/utils/getTableColumnsDefinitions.d.ts +3 -2
  23. package/dist/esm/components/Table/utils/getTableColumnsDefinitions.js +6 -2
  24. package/dist/esm/components/types.d.ts +6 -0
  25. package/dist/esm/components/types.js +5 -1
  26. package/dist/esm/helperComponents/Cells/RowActionsCell/styles.module.css +0 -1
  27. package/dist/esm/helperComponents/Cells/SelectionCell/SelectionCell.js +1 -1
  28. package/dist/esm/helperComponents/Cells/TreeCell/TreeCell.d.ts +3 -1
  29. package/dist/esm/helperComponents/Cells/TreeCell/TreeCell.js +4 -2
  30. package/dist/esm/helperComponents/Rows/BodyRow.d.ts +3 -1
  31. package/dist/esm/helperComponents/Rows/BodyRow.js +3 -2
  32. package/dist/esm/helperComponents/Rows/styles.module.css +2 -2
  33. package/package.json +2 -2
  34. package/src/components/Table/Table.tsx +13 -2
  35. package/src/components/Table/hooks/useColumnSettings/useColumnSettings.ts +2 -1
  36. package/src/components/Table/hooks/useLoadingTable.tsx +9 -3
  37. package/src/components/Table/utils/getTableColumnsDefinitions.ts +7 -2
  38. package/src/components/types.ts +7 -0
  39. package/src/helperComponents/Cells/RowActionsCell/styles.module.scss +0 -2
  40. package/src/helperComponents/Cells/SelectionCell/SelectionCell.tsx +1 -1
  41. package/src/helperComponents/Cells/TreeCell/TreeCell.tsx +6 -1
  42. package/src/helperComponents/Rows/BodyRow.tsx +4 -0
  43. 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
- }), [columnDefinitions, enableSelection, enableSelectPinned, expanding]);
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
- }), [enableSelectPinned, enableSelection, enabledColumnsDefinitions, expanding]);
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 = {}));
@@ -17,7 +17,6 @@
17
17
 
18
18
  .rowActionsCellWrap{
19
19
  --offset:0px;
20
- cursor:pointer;
21
20
  display:flex;
22
21
  align-items:center;
23
22
  justify-content:center;
@@ -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
- }), [columnDefinitions, enableSelection, enableSelectPinned, expanding]);
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
- }), [enableSelectPinned, enableSelection, enabledColumnsDefinitions, expanding]);
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
- export function getTableColumnsDefinitions({ columnDefinitions, enableSelection, enableSelectPinned, expanding, }) {
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 = [getTreeColumnDef(Object.assign(Object.assign({}, expanding.expandingColumnDefinition), { enableSelection })), ...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>
@@ -1 +1,5 @@
1
- export {};
1
+ export var RowAppearance;
2
+ (function (RowAppearance) {
3
+ RowAppearance["Disabled"] = "disabled";
4
+ RowAppearance["HideToggler"] = "hide-toggler";
5
+ })(RowAppearance || (RowAppearance = {}));
@@ -17,7 +17,6 @@
17
17
 
18
18
  .rowActionsCellWrap{
19
19
  --offset:0px;
20
- cursor:pointer;
21
20
  display:flex;
22
21
  align-items:center;
23
22
  justify-content:center;
@@ -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.18",
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": "8901426ca6a1c3525d9f7ba8c7fb3d0de42041d3"
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 key={row.id} row={row} rowAutoHeight={rowAutoHeight} columnOrder={columnOrder} />
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({ ...expanding.expandingColumnDefinition, enableSelection });
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 = [getTreeColumnDef({ ...expanding.expandingColumnDefinition, enableSelection }), ...cols];
25
+ cols = [
26
+ getTreeColumnDef({ ...expanding.expandingColumnDefinition, enableSelection, rowSelectionAppearance }),
27
+ ...cols,
28
+ ];
24
29
  }
25
30
  return cols;
26
31
  }
@@ -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>
@@ -26,8 +26,6 @@
26
26
  .rowActionsCellWrap {
27
27
  --offset: 0px;
28
28
 
29
- cursor: pointer;
30
-
31
29
  display: flex;
32
30
  align-items: center;
33
31
  justify-content: center;
@@ -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}
@@ -109,7 +109,7 @@ $snack-ui-table-row-background: var(--snack-ui-table-row-background);
109
109
  }
110
110
  }
111
111
 
112
- &[data-disabled] {
112
+ &[data-row-appearance='disabled'] {
113
113
  cursor: not-allowed;
114
114
  background-color: styles-tokens-table.$sys-neutral-background;
115
115