@astral/ui 4.3.0 → 4.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,163 +1,3 @@
1
- import { type ReactNode } from 'react';
2
- import { Variant } from './enums';
3
- import { type NoDataProps } from './NoData';
4
- import type { CellValue, DataGridColumns, DataGridRow, DataGridRowWithOptions, DataGridSort } from './types';
5
- export type DataGridProps<TData extends Record<string, CellValue> = DataGridRow, TSortField extends keyof TData = keyof TData> = {
6
- /**
7
- * Название класса, применяется к корневому компоненту
8
- */
9
- className?: string;
10
- /**
11
- * Массив данных для таблицы
12
- */
13
- rows: DataGridRowWithOptions<TData>[];
14
- /**
15
- * @example <DataGrid columns={[
16
- * {
17
- * field: 'test',
18
- * label: 'Тестовая колонка',
19
- * sortable: true,
20
- * }]} />
21
- * Конфигурация колонок для таблицы
22
- */
23
- columns: DataGridColumns<TData>[];
24
- /**
25
- * Идентификатор активного элемента массива rows. Выделяет активную строку в таблице
26
- */
27
- activeRowId?: string;
28
- /**
29
- * Поле, которое будет использоваться в качестве ключа
30
- */
31
- keyId: keyof TData;
32
- /**
33
- * @example <DataGrid selectedRows={[{name: 'test'}]} />
34
- * Массив выбранных строк
35
- */
36
- selectedRows?: TData[];
37
- /**
38
- * @example <DataGrid sorting={{fieldId: 'test', sort: 'asc'}} />
39
- * Параметры сортируемой колонки
40
- */
41
- sorting?: DataGridSort<TSortField>;
42
- /**
43
- * Компонент кастомного футера (например Pagination)
44
- */
45
- footer?: ReactNode;
46
- /**
47
- * Используется для отображения placeholder при отсутствии данных в таблице
48
- */
49
- noDataPlaceholder?: ReactNode;
50
- /**
51
- * Максимальная высота для таблицы
52
- */
53
- maxHeight?: number;
54
- /**
55
- * Если true, показывается анимация загрузки
56
- */
57
- isLoading?: boolean;
58
- /**
59
- * Если true, таблица будет заблокирована для взаимодействия
60
- */
61
- isDisabled?: boolean;
62
- /**
63
- * Флаг состояния ошибки
64
- */
65
- isError?: boolean;
66
- /**
67
- * Текст ошибки
68
- */
69
- errorMsg?: string;
70
- /**
71
- * Вариант отображения вложенных элементов
72
- * @default 'tree'
73
- */
74
- variant?: `${Variant}`;
75
- /**
76
- * Опции для отображения древовидных списков
77
- * Применяется если variant="tree"
78
- */
79
- tree?: {
80
- /**
81
- * Если true, то дерево будет раскрыто по умолчанию
82
- * @default 'false'
83
- */
84
- isInitialExpanded?: boolean;
85
- /**
86
- * Уровень раскрытия дерева по умолчанию, при `isInitialExpanded=true`
87
- * @default '1'
88
- */
89
- expandedLevel?: number;
90
- /**
91
- * Количество отображаемых по умолчанию дочерних элементов
92
- * @default '2'
93
- */
94
- initialVisibleChildrenCount?: number;
95
- };
96
- /**
97
- * Опции для отображения вложенных списков
98
- * Применяется если variant="subrows"
99
- */
100
- subrows?: {
101
- /**
102
- * Уровень раскрытия дочерних элементов по умолчанию, при `isInitialExpanded=true`
103
- * @default '1'
104
- */
105
- expandedLevel?: number;
106
- /**
107
- * Количество отображаемых по умолчанию дочерних элементов
108
- * @default '2'
109
- */
110
- initialVisibleChildrenCount?: number;
111
- /**
112
- * Номер колонки, в которой будет расположена кнопка "Показать все"
113
- * @default 1
114
- */
115
- moreButtonColumnPosition?: number;
116
- /**
117
- * Если false, кнопка разворачивания элементов не показывается
118
- * @default true
119
- */
120
- isVisibleCollapseButton?: boolean;
121
- };
122
- /**
123
- * Заглушка для пустых ячеек (если отсутствует field и filter и renderCell)
124
- * @default '—'
125
- */
126
- emptyCellValue?: ReactNode;
127
- /**
128
- * Используется для отображения переданного кол-ва строк при отсутствии данных
129
- * @default 10
130
- */
131
- minDisplayRows?: number;
132
- /**
133
- * Функция обработки нажатия на кнопку "Повторить запрос"
134
- */
135
- onRetry: () => void;
136
- /**
137
- * Обработчик клика строки таблицы
138
- */
139
- onRowClick?: (row: TData) => void;
140
- /**
141
- * Обработчик выбора строки
142
- */
143
- onSelectRow?: (row: TData[]) => void;
144
- /**
145
- * @example <DataGrid onSort={({fieldId: 'test', sort: 'asc'}) => console.log('sorted')} />
146
- * Обработчик сортировки
147
- */
148
- onSort?: (sorting: DataGridSort<TSortField> | undefined) => void;
149
- /**
150
- * Используется для кастомизации компонента, использующегося в сценарии отсутствия данных
151
- */
152
- noDataOptions?: NoDataProps;
153
- /**
154
- * Используется для скрытия чекбокса "Выбрать все"
155
- */
156
- isHideSelectAll?: boolean;
157
- /**
158
- * Место для рендера перед head страницы
159
- * @private Предполагается для использования в реализации изменения размеров таблицы
160
- */
161
- headPreAddon?: ReactNode;
162
- };
1
+ /// <reference types="react" />
2
+ import { type DataGridProps, type DataGridRow } from './types';
163
3
  export declare const DataGrid: <TData extends Record<string, unknown> = DataGridRow, TSortField extends keyof TData = keyof TData>(props: DataGridProps<TData, TSortField>) => JSX.Element;
@@ -12,7 +12,7 @@ import { NoData } from './NoData';
12
12
  import { Container, DataGridWrapper, DisabledDataGridWrapper } from './styles';
13
13
  import { useLogic } from './useLogic';
14
14
  export const DataGrid = (props) => {
15
- const { isDataGridDisabled, treeRenderConfig, headProps, bodyProps, loaderProps, renderRows, isAllowHorizontalScroll, } = useLogic(props);
15
+ const { isDataGridDisabled, treeRenderConfig, headProps, bodyProps, loaderProps, renderRows, isAllowHorizontalScroll, isHideHead, } = useLogic(props);
16
16
  const { emptySymbol } = useContext(ConfigContext);
17
17
  const { columns, selectedRows = [], sorting, maxHeight, minDisplayRows = MIN_DISPLAY_ROWS_BY_DEFAULT, errorMsg, variant = Variant.Tree, footer, noDataPlaceholder, isLoading, isError, subrows, keyId, activeRowId, emptyCellValue = emptySymbol, className, onRowClick, onSort, noDataOptions, onRetry, headPreAddon, } = props;
18
18
  const { moreButtonColumnPosition = 1, isVisibleCollapseButton = true } = subrows || {};
@@ -26,5 +26,5 @@ export const DataGrid = (props) => {
26
26
  }
27
27
  return null;
28
28
  }, [noDataPlaceholder, noDataOptions, isLoading]);
29
- return (_jsx(DataGridContextProvider, { isLoading: isLoading, children: _jsxs(Container, { "$maxHeight": maxHeight, "$isAllowHorizontalScroll": isAllowHorizontalScroll, className: classNames(dataGridClassnames.root, className), children: [_jsxs(TableContainer, { "$isAllowHorizontalScroll": isAllowHorizontalScroll, inert: isDataGridDisabled ? '' : undefined, children: [headPreAddon, _jsx(Head, { ...headProps, sorting: sorting, onSort: onSort }), _jsx(Body, { ...bodyProps, activeRowId: activeRowId, keyId: keyId, selectedRows: selectedRows, minDisplayRows: minDisplayRows, rows: renderRows, columns: columns, variant: variant, emptyCellValue: emptyCellValue, isInitialExpanded: isInitialExpanded, expandedLevel: expandedLevel, initialVisibleChildrenCount: initialVisibleChildrenCount, moreButtonColumnPosition: moreButtonColumnPosition, isVisibleCollapseButton: isVisibleCollapseButton, isLoading: isLoading, isError: isError, errorMsg: errorMsg, noDataPlaceholder: renderedPlaceholder(), onRowClick: onRowClick, onRetry: onRetry })] }), _jsx(Loader, { ...loaderProps }), footer && footer] }) }));
29
+ return (_jsx(DataGridContextProvider, { isLoading: isLoading, children: _jsxs(Container, { "$maxHeight": maxHeight, "$isAllowHorizontalScroll": isAllowHorizontalScroll, className: classNames(dataGridClassnames.root, className), children: [_jsxs(TableContainer, { "$isAllowHorizontalScroll": isAllowHorizontalScroll, inert: isDataGridDisabled ? '' : undefined, children: [headPreAddon, !isHideHead && (_jsx(Head, { ...headProps, sorting: sorting, onSort: onSort })), _jsx(Body, { ...bodyProps, activeRowId: activeRowId, keyId: keyId, selectedRows: selectedRows, minDisplayRows: minDisplayRows, rows: renderRows, columns: columns, variant: variant, emptyCellValue: emptyCellValue, isInitialExpanded: isInitialExpanded, expandedLevel: expandedLevel, initialVisibleChildrenCount: initialVisibleChildrenCount, moreButtonColumnPosition: moreButtonColumnPosition, isVisibleCollapseButton: isVisibleCollapseButton, isLoading: isLoading, isError: isError, errorMsg: errorMsg, noDataPlaceholder: renderedPlaceholder(), onRowClick: onRowClick, onRetry: onRetry })] }), _jsx(Loader, { ...loaderProps }), footer && footer] }) }));
30
30
  };
@@ -1,9 +1,173 @@
1
1
  import { type CSSProperties, type ReactNode } from 'react';
2
2
  import { type Target } from '../utils';
3
+ import { type Variant } from './enums';
4
+ import type { NoDataProps } from './NoData';
3
5
  export type AlignVariant = 'left' | 'center' | 'right';
4
6
  export type SortState = 'asc' | 'desc';
5
7
  export type RenderCell<TData> = (params: TData) => ReactNode;
6
8
  export type CellValue = unknown;
9
+ export type DataGridProps<TData extends Record<string, CellValue> = DataGridRow, TSortField extends keyof TData = keyof TData> = {
10
+ /**
11
+ * Название класса, применяется к корневому компоненту
12
+ */
13
+ className?: string;
14
+ /**
15
+ * Массив данных для таблицы
16
+ */
17
+ rows: DataGridRowWithOptions<TData>[];
18
+ /**
19
+ * @example <DataGrid columns={[
20
+ * {
21
+ * field: 'test',
22
+ * label: 'Тестовая колонка',
23
+ * sortable: true,
24
+ * }]} />
25
+ * Конфигурация колонок для таблицы
26
+ */
27
+ columns: DataGridColumns<TData>[];
28
+ /**
29
+ * Идентификатор активного элемента массива rows. Выделяет активную строку в таблице
30
+ */
31
+ activeRowId?: string;
32
+ /**
33
+ * Поле, которое будет использоваться в качестве ключа
34
+ */
35
+ keyId: keyof TData;
36
+ /**
37
+ * @example <DataGrid selectedRows={[{name: 'test'}]} />
38
+ * Массив выбранных строк
39
+ */
40
+ selectedRows?: TData[];
41
+ /**
42
+ * @example <DataGrid sorting={{fieldId: 'test', sort: 'asc'}} />
43
+ * Параметры сортируемой колонки
44
+ */
45
+ sorting?: DataGridSort<TSortField>;
46
+ /**
47
+ * Компонент кастомного футера (например Pagination)
48
+ */
49
+ footer?: ReactNode;
50
+ /**
51
+ * Используется для отображения placeholder при отсутствии данных в таблице
52
+ */
53
+ noDataPlaceholder?: ReactNode;
54
+ /**
55
+ * Максимальная высота для таблицы
56
+ */
57
+ maxHeight?: number;
58
+ /**
59
+ * Если true, показывается анимация загрузки
60
+ */
61
+ isLoading?: boolean;
62
+ /**
63
+ * Если true, таблица будет заблокирована для взаимодействия
64
+ */
65
+ isDisabled?: boolean;
66
+ /**
67
+ * Флаг состояния ошибки
68
+ */
69
+ isError?: boolean;
70
+ /**
71
+ * Текст ошибки
72
+ */
73
+ errorMsg?: string;
74
+ /**
75
+ * Вариант отображения вложенных элементов
76
+ * @default 'tree'
77
+ */
78
+ variant?: `${Variant}`;
79
+ /**
80
+ * Опции для отображения древовидных списков
81
+ * Применяется если variant="tree"
82
+ */
83
+ tree?: {
84
+ /**
85
+ * Если true, то дерево будет раскрыто по умолчанию
86
+ * @default 'false'
87
+ */
88
+ isInitialExpanded?: boolean;
89
+ /**
90
+ * Уровень раскрытия дерева по умолчанию, при `isInitialExpanded=true`
91
+ * @default '1'
92
+ */
93
+ expandedLevel?: number;
94
+ /**
95
+ * Количество отображаемых по умолчанию дочерних элементов
96
+ * @default '2'
97
+ */
98
+ initialVisibleChildrenCount?: number;
99
+ };
100
+ /**
101
+ * Опции для отображения вложенных списков
102
+ * Применяется если variant="subrows"
103
+ */
104
+ subrows?: {
105
+ /**
106
+ * Уровень раскрытия дочерних элементов по умолчанию, при `isInitialExpanded=true`
107
+ * @default '1'
108
+ */
109
+ expandedLevel?: number;
110
+ /**
111
+ * Количество отображаемых по умолчанию дочерних элементов
112
+ * @default '2'
113
+ */
114
+ initialVisibleChildrenCount?: number;
115
+ /**
116
+ * Номер колонки, в которой будет расположена кнопка "Показать все"
117
+ * @default 1
118
+ */
119
+ moreButtonColumnPosition?: number;
120
+ /**
121
+ * Если false, кнопка разворачивания элементов не показывается
122
+ * @default true
123
+ */
124
+ isVisibleCollapseButton?: boolean;
125
+ };
126
+ /**
127
+ * Заглушка для пустых ячеек (если отсутствует field и filter и renderCell)
128
+ * @default '—'
129
+ */
130
+ emptyCellValue?: ReactNode;
131
+ /**
132
+ * Используется для отображения переданного кол-ва строк при отсутствии данных
133
+ * @default 10
134
+ */
135
+ minDisplayRows?: number;
136
+ /**
137
+ * Функция обработки нажатия на кнопку "Повторить запрос"
138
+ */
139
+ onRetry: () => void;
140
+ /**
141
+ * Обработчик клика строки таблицы
142
+ */
143
+ onRowClick?: (row: TData) => void;
144
+ /**
145
+ * Обработчик выбора строки
146
+ */
147
+ onSelectRow?: (row: TData[]) => void;
148
+ /**
149
+ * @example <DataGrid onSort={({fieldId: 'test', sort: 'asc'}) => console.log('sorted')} />
150
+ * Обработчик сортировки
151
+ */
152
+ onSort?: (sorting: DataGridSort<TSortField> | undefined) => void;
153
+ /**
154
+ * Используется для кастомизации компонента, использующегося в сценарии отсутствия данных
155
+ */
156
+ noDataOptions?: NoDataProps;
157
+ /**
158
+ * Используется для скрытия чекбокса "Выбрать все"
159
+ */
160
+ isHideSelectAll?: boolean;
161
+ /**
162
+ * Место для рендера перед head страницы
163
+ * @private Предполагается для использования в реализации изменения размеров таблицы
164
+ */
165
+ headPreAddon?: ReactNode;
166
+ /**
167
+ * Убирает шапку таблицы, когда нет данных
168
+ */
169
+ isHideHeaderIfNoData?: boolean;
170
+ };
7
171
  export type DataGridSort<TSortField> = {
8
172
  /**
9
173
  * @example {fieldId: 'test'}
@@ -1,8 +1,7 @@
1
1
  import { type ChangeEvent } from 'react';
2
- import { type DataGridProps } from '../DataGrid';
3
- import type { CellValue, DataGridRow } from '../types';
2
+ import type { CellValue, DataGridProps, DataGridRow } from '../types';
4
3
  type UseLogicParams<TData extends Record<string, CellValue> = DataGridRow, TSortField extends keyof TData = keyof TData> = DataGridProps<TData, TSortField>;
5
- export declare const useLogic: <TData extends Record<string, unknown> = DataGridRow, TSortField extends keyof TData = keyof TData>({ keyId, columns, rows, variant, tree, subrows, selectedRows, isLoading, isDisabled, onSelectRow, isHideSelectAll, }: UseLogicParams<TData, TSortField>) => {
4
+ export declare const useLogic: <TData extends Record<string, unknown> = DataGridRow, TSortField extends keyof TData = keyof TData>({ keyId, columns, rows, variant, tree, subrows, selectedRows, isLoading, isDisabled, onSelectRow, isHideSelectAll, isHideHeaderIfNoData, }: UseLogicParams<TData, TSortField>) => {
6
5
  isDataGridDisabled: boolean | undefined;
7
6
  treeRenderConfig: {
8
7
  isInitialExpanded?: boolean | undefined;
@@ -11,6 +10,7 @@ export declare const useLogic: <TData extends Record<string, unknown> = DataGrid
11
10
  } | undefined;
12
11
  renderRows: TData[];
13
12
  isAllowHorizontalScroll: boolean;
13
+ isHideHead: boolean;
14
14
  headProps: {
15
15
  rowsCount: number;
16
16
  uncheckedRowsCount: number;
@@ -3,7 +3,7 @@ import { useFirstMountState } from '../../hooks';
3
3
  import { prop, uniqueBy } from '../../utils';
4
4
  import { Variant } from '../enums';
5
5
  import { getGridTemplateColumns, getIsAllowHorizontalScroll } from './utils';
6
- export const useLogic = ({ keyId, columns, rows = [], variant, tree, subrows, selectedRows = [], isLoading, isDisabled, onSelectRow, isHideSelectAll, }) => {
6
+ export const useLogic = ({ keyId, columns, rows = [], variant, tree, subrows, selectedRows = [], isLoading, isDisabled, onSelectRow, isHideSelectAll, isHideHeaderIfNoData = false, }) => {
7
7
  const isFirstRender = useFirstMountState();
8
8
  const isSelectable = Boolean(onSelectRow);
9
9
  const isDataGridDisabled = isLoading || isDisabled;
@@ -54,11 +54,13 @@ export const useLogic = ({ keyId, columns, rows = [], variant, tree, subrows, se
54
54
  }
55
55
  onSelectRow(selectedRowsRef.current.filter((selectedRow) => selectedRow[keyId] !== row[keyId]));
56
56
  };
57
+ const isHideHead = isHideHeaderIfNoData && rows.length === 0;
57
58
  return {
58
59
  isDataGridDisabled,
59
60
  treeRenderConfig,
60
61
  renderRows,
61
62
  isAllowHorizontalScroll,
63
+ isHideHead,
62
64
  headProps: {
63
65
  rowsCount: availableRows.length,
64
66
  uncheckedRowsCount,
@@ -1,17 +1,4 @@
1
1
  /// <reference types="react" />
2
- import { type CellValue, type DataGridProps, type DataGridRow } from '../DataGrid';
3
- export type DataGridInfiniteProps<TData extends Record<string, CellValue> = DataGridRow, TSortField extends keyof TData = keyof TData> = Omit<DataGridProps<TData, TSortField>, 'footer' | 'minDisplayRows'> & {
4
- /**
5
- * Флаг достижения конца списка
6
- */
7
- isEndReached?: boolean;
8
- /**
9
- * Текст достижения конца списка
10
- */
11
- endOfScrollMsg?: string;
12
- /**
13
- * Обработчик подгрузки данных
14
- */
15
- onEndReached?: () => void;
16
- };
2
+ import { type DataGridRow } from '../DataGrid';
3
+ import { type DataGridInfiniteProps } from './types';
17
4
  export declare const DataGridInfinite: <TData extends Record<string, unknown> = DataGridRow, TSortField extends keyof TData = keyof TData>(props: DataGridInfiniteProps<TData, TSortField>) => JSX.Element;
@@ -18,12 +18,12 @@ import { useLogic } from './useLogic';
18
18
  const INITIAL_LEVEL = 0;
19
19
  export const DataGridInfinite = (props) => {
20
20
  const { imagesMap, emptySymbol } = useContext(ConfigContext);
21
- const { isNoData, isDataGridDisabled, isStickyButtonActive, treeRenderConfig, virtuosoProps, headProps, rowProps, scrollToTopButtonProps, isEndReached, } = useLogic(props);
21
+ const { isNoData, isDataGridDisabled, isStickyButtonActive, treeRenderConfig, virtuosoProps, headProps, rowProps, scrollToTopButtonProps, isEndReached, isHideHead, } = useLogic(props);
22
22
  const { columns, rows = [], selectedRows = [], sorting, maxHeight, isLoading, isDisabled, keyId, activeRowId, emptyCellValue = emptySymbol, variant = Variant.Tree, subrows, className, isError, endOfScrollMsg, errorMsg, noDataPlaceholder, onRowClick, onSort, onRetry, headPreAddon, } = props;
23
23
  const { moreButtonColumnPosition = 1, isVisibleCollapseButton = true } = subrows || {};
24
24
  const { isInitialExpanded = false, expandedLevel = EXPANDED_LEVEL_BY_DEFAULT, initialVisibleChildrenCount = INITIAL_OPENED_NESTED_CHILDREN_COUNT_BY_DEFAULT, } = treeRenderConfig || {};
25
25
  const TableContainer = isDisabled ? DisabledDataGridWrapper : DataGridWrapper;
26
- return (_jsx(DataGridContextProvider, { children: _jsxs(Container, { "$maxHeight": maxHeight, className: classNames(dataGridClassnames.root, className), children: [headPreAddon, _jsxs(TableContainer, { inert: isDataGridDisabled ? '' : undefined, children: [_jsx(Head, { ...headProps, onSort: onSort, sorting: sorting, columns: columns }), _jsx(ContentState, { isLoading: isLoading && !isNoData, loadingTitle: "\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u0434\u0430\u043D\u043D\u044B\u0445", isError: isError && !isNoData, errorState: {
26
+ return (_jsx(DataGridContextProvider, { children: _jsxs(Container, { "$maxHeight": maxHeight, className: classNames(dataGridClassnames.root, className), children: [headPreAddon, _jsxs(TableContainer, { inert: isDataGridDisabled ? '' : undefined, children: [!isHideHead && (_jsx(Head, { ...headProps, onSort: onSort, sorting: sorting, columns: columns })), _jsx(ContentState, { isLoading: isLoading && !isNoData, loadingTitle: "\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u0434\u0430\u043D\u043D\u044B\u0445", isError: isError && !isNoData, errorState: {
27
27
  imgAlt: 'Что-то пошло не так',
28
28
  errorList: [errorMsg || ''],
29
29
  imgSrc: imagesMap.defaultErrorImgSrc,
@@ -1 +1,2 @@
1
1
  export * from './DataGridInfinite';
2
+ export type { DataGridInfiniteProps } from './types';
@@ -0,0 +1,19 @@
1
+ import type { CellValue, DataGridProps, DataGridRow } from '../DataGrid';
2
+ export type DataGridInfiniteProps<TData extends Record<string, CellValue> = DataGridRow, TSortField extends keyof TData = keyof TData> = Omit<DataGridProps<TData, TSortField>, 'footer' | 'minDisplayRows'> & {
3
+ /**
4
+ * Флаг достижения конца списка
5
+ */
6
+ isEndReached?: boolean;
7
+ /**
8
+ * Текст достижения конца списка
9
+ */
10
+ endOfScrollMsg?: string;
11
+ /**
12
+ * Обработчик подгрузки данных
13
+ */
14
+ onEndReached?: () => void;
15
+ /**
16
+ * Убирает шапку таблицы, когда нет данных
17
+ */
18
+ isHideHeaderIfNoData?: boolean;
19
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -1,9 +1,9 @@
1
1
  import { type ChangeEvent } from 'react';
2
2
  import type { ListRange, VirtuosoHandle } from 'react-virtuoso';
3
3
  import { type CellValue, type DataGridRow } from '../../DataGrid';
4
- import { type DataGridInfiniteProps } from '../DataGridInfinite';
4
+ import { type DataGridInfiniteProps } from '../types';
5
5
  type UseLogicParams<TData extends Record<string, CellValue> = DataGridRow, TSortField extends keyof TData = keyof TData> = DataGridInfiniteProps<TData, TSortField>;
6
- export declare const useLogic: <TData extends Record<string, unknown> = DataGridRow, TSortField extends keyof TData = keyof TData>({ keyId, columns, rows, variant, tree, subrows, selectedRows, isLoading, isDisabled, isEndReached, onEndReached, onSelectRow, isHideSelectAll, }: UseLogicParams<TData, TSortField>) => {
6
+ export declare const useLogic: <TData extends Record<string, unknown> = DataGridRow, TSortField extends keyof TData = keyof TData>({ keyId, columns, rows, variant, tree, subrows, selectedRows, isLoading, isDisabled, isEndReached, onEndReached, onSelectRow, isHideSelectAll, isHideHeaderIfNoData, }: UseLogicParams<TData, TSortField>) => {
7
7
  isNoData: boolean;
8
8
  isDataGridDisabled: boolean | undefined;
9
9
  isStickyButtonActive: boolean;
@@ -13,6 +13,7 @@ export declare const useLogic: <TData extends Record<string, unknown> = DataGrid
13
13
  initialVisibleChildrenCount?: number | undefined;
14
14
  } | undefined;
15
15
  isEndReached: boolean | undefined;
16
+ isHideHead: boolean;
16
17
  virtuosoProps: {
17
18
  id: string;
18
19
  ref: import("react").RefObject<VirtuosoHandle>;
@@ -4,7 +4,7 @@ import { getGridTemplateColumns } from '../../DataGrid/useLogic/utils';
4
4
  import { useToggle } from '../../hooks';
5
5
  import { prop, uniqueBy } from '../../utils';
6
6
  import { VIRTUOSO_CONTAINER_ID, VIRTUOSO_LIST_ID } from '../constants';
7
- export const useLogic = ({ keyId, columns, rows, variant, tree, subrows, selectedRows = [], isLoading, isDisabled, isEndReached, onEndReached, onSelectRow, isHideSelectAll, }) => {
7
+ export const useLogic = ({ keyId, columns, rows, variant, tree, subrows, selectedRows = [], isLoading, isDisabled, isEndReached, onEndReached, onSelectRow, isHideSelectAll, isHideHeaderIfNoData = false, }) => {
8
8
  const virtuoso = useRef(null);
9
9
  const [hasVerticalScroll, setHasVerticalScroll] = useState(false);
10
10
  const [isStickyButtonActive, showStickyButton, hideStickyButton] = useToggle();
@@ -57,12 +57,14 @@ export const useLogic = ({ keyId, columns, rows, variant, tree, subrows, selecte
57
57
  setHasVerticalScroll(list?.clientHeight > container?.clientHeight);
58
58
  }
59
59
  };
60
+ const isHideHead = isHideHeaderIfNoData && rows.length === 0;
60
61
  return {
61
62
  isNoData,
62
63
  isDataGridDisabled,
63
64
  isStickyButtonActive,
64
65
  treeRenderConfig,
65
66
  isEndReached: isEndReached && hasVerticalScroll,
67
+ isHideHead,
66
68
  virtuosoProps: {
67
69
  id: VIRTUOSO_CONTAINER_ID,
68
70
  ref: virtuoso,
@@ -1,163 +1,3 @@
1
- import { type ReactNode } from 'react';
2
- import { Variant } from './enums';
3
- import { type NoDataProps } from './NoData';
4
- import type { CellValue, DataGridColumns, DataGridRow, DataGridRowWithOptions, DataGridSort } from './types';
5
- export type DataGridProps<TData extends Record<string, CellValue> = DataGridRow, TSortField extends keyof TData = keyof TData> = {
6
- /**
7
- * Название класса, применяется к корневому компоненту
8
- */
9
- className?: string;
10
- /**
11
- * Массив данных для таблицы
12
- */
13
- rows: DataGridRowWithOptions<TData>[];
14
- /**
15
- * @example <DataGrid columns={[
16
- * {
17
- * field: 'test',
18
- * label: 'Тестовая колонка',
19
- * sortable: true,
20
- * }]} />
21
- * Конфигурация колонок для таблицы
22
- */
23
- columns: DataGridColumns<TData>[];
24
- /**
25
- * Идентификатор активного элемента массива rows. Выделяет активную строку в таблице
26
- */
27
- activeRowId?: string;
28
- /**
29
- * Поле, которое будет использоваться в качестве ключа
30
- */
31
- keyId: keyof TData;
32
- /**
33
- * @example <DataGrid selectedRows={[{name: 'test'}]} />
34
- * Массив выбранных строк
35
- */
36
- selectedRows?: TData[];
37
- /**
38
- * @example <DataGrid sorting={{fieldId: 'test', sort: 'asc'}} />
39
- * Параметры сортируемой колонки
40
- */
41
- sorting?: DataGridSort<TSortField>;
42
- /**
43
- * Компонент кастомного футера (например Pagination)
44
- */
45
- footer?: ReactNode;
46
- /**
47
- * Используется для отображения placeholder при отсутствии данных в таблице
48
- */
49
- noDataPlaceholder?: ReactNode;
50
- /**
51
- * Максимальная высота для таблицы
52
- */
53
- maxHeight?: number;
54
- /**
55
- * Если true, показывается анимация загрузки
56
- */
57
- isLoading?: boolean;
58
- /**
59
- * Если true, таблица будет заблокирована для взаимодействия
60
- */
61
- isDisabled?: boolean;
62
- /**
63
- * Флаг состояния ошибки
64
- */
65
- isError?: boolean;
66
- /**
67
- * Текст ошибки
68
- */
69
- errorMsg?: string;
70
- /**
71
- * Вариант отображения вложенных элементов
72
- * @default 'tree'
73
- */
74
- variant?: `${Variant}`;
75
- /**
76
- * Опции для отображения древовидных списков
77
- * Применяется если variant="tree"
78
- */
79
- tree?: {
80
- /**
81
- * Если true, то дерево будет раскрыто по умолчанию
82
- * @default 'false'
83
- */
84
- isInitialExpanded?: boolean;
85
- /**
86
- * Уровень раскрытия дерева по умолчанию, при `isInitialExpanded=true`
87
- * @default '1'
88
- */
89
- expandedLevel?: number;
90
- /**
91
- * Количество отображаемых по умолчанию дочерних элементов
92
- * @default '2'
93
- */
94
- initialVisibleChildrenCount?: number;
95
- };
96
- /**
97
- * Опции для отображения вложенных списков
98
- * Применяется если variant="subrows"
99
- */
100
- subrows?: {
101
- /**
102
- * Уровень раскрытия дочерних элементов по умолчанию, при `isInitialExpanded=true`
103
- * @default '1'
104
- */
105
- expandedLevel?: number;
106
- /**
107
- * Количество отображаемых по умолчанию дочерних элементов
108
- * @default '2'
109
- */
110
- initialVisibleChildrenCount?: number;
111
- /**
112
- * Номер колонки, в которой будет расположена кнопка "Показать все"
113
- * @default 1
114
- */
115
- moreButtonColumnPosition?: number;
116
- /**
117
- * Если false, кнопка разворачивания элементов не показывается
118
- * @default true
119
- */
120
- isVisibleCollapseButton?: boolean;
121
- };
122
- /**
123
- * Заглушка для пустых ячеек (если отсутствует field и filter и renderCell)
124
- * @default '—'
125
- */
126
- emptyCellValue?: ReactNode;
127
- /**
128
- * Используется для отображения переданного кол-ва строк при отсутствии данных
129
- * @default 10
130
- */
131
- minDisplayRows?: number;
132
- /**
133
- * Функция обработки нажатия на кнопку "Повторить запрос"
134
- */
135
- onRetry: () => void;
136
- /**
137
- * Обработчик клика строки таблицы
138
- */
139
- onRowClick?: (row: TData) => void;
140
- /**
141
- * Обработчик выбора строки
142
- */
143
- onSelectRow?: (row: TData[]) => void;
144
- /**
145
- * @example <DataGrid onSort={({fieldId: 'test', sort: 'asc'}) => console.log('sorted')} />
146
- * Обработчик сортировки
147
- */
148
- onSort?: (sorting: DataGridSort<TSortField> | undefined) => void;
149
- /**
150
- * Используется для кастомизации компонента, использующегося в сценарии отсутствия данных
151
- */
152
- noDataOptions?: NoDataProps;
153
- /**
154
- * Используется для скрытия чекбокса "Выбрать все"
155
- */
156
- isHideSelectAll?: boolean;
157
- /**
158
- * Место для рендера перед head страницы
159
- * @private Предполагается для использования в реализации изменения размеров таблицы
160
- */
161
- headPreAddon?: ReactNode;
162
- };
1
+ /// <reference types="react" />
2
+ import { type DataGridProps, type DataGridRow } from './types';
163
3
  export declare const DataGrid: <TData extends Record<string, unknown> = DataGridRow, TSortField extends keyof TData = keyof TData>(props: DataGridProps<TData, TSortField>) => JSX.Element;
@@ -15,7 +15,7 @@ const NoData_1 = require("./NoData");
15
15
  const styles_1 = require("./styles");
16
16
  const useLogic_1 = require("./useLogic");
17
17
  const DataGrid = (props) => {
18
- const { isDataGridDisabled, treeRenderConfig, headProps, bodyProps, loaderProps, renderRows, isAllowHorizontalScroll, } = (0, useLogic_1.useLogic)(props);
18
+ const { isDataGridDisabled, treeRenderConfig, headProps, bodyProps, loaderProps, renderRows, isAllowHorizontalScroll, isHideHead, } = (0, useLogic_1.useLogic)(props);
19
19
  const { emptySymbol } = (0, react_1.useContext)(ConfigProvider_1.ConfigContext);
20
20
  const { columns, selectedRows = [], sorting, maxHeight, minDisplayRows = constants_1.MIN_DISPLAY_ROWS_BY_DEFAULT, errorMsg, variant = enums_1.Variant.Tree, footer, noDataPlaceholder, isLoading, isError, subrows, keyId, activeRowId, emptyCellValue = emptySymbol, className, onRowClick, onSort, noDataOptions, onRetry, headPreAddon, } = props;
21
21
  const { moreButtonColumnPosition = 1, isVisibleCollapseButton = true } = subrows || {};
@@ -29,6 +29,6 @@ const DataGrid = (props) => {
29
29
  }
30
30
  return null;
31
31
  }, [noDataPlaceholder, noDataOptions, isLoading]);
32
- return ((0, jsx_runtime_1.jsx)(DataGridContext_1.DataGridContextProvider, { isLoading: isLoading, children: (0, jsx_runtime_1.jsxs)(styles_1.Container, { "$maxHeight": maxHeight, "$isAllowHorizontalScroll": isAllowHorizontalScroll, className: (0, utils_1.classNames)(constants_1.dataGridClassnames.root, className), children: [(0, jsx_runtime_1.jsxs)(TableContainer, { "$isAllowHorizontalScroll": isAllowHorizontalScroll, inert: isDataGridDisabled ? '' : undefined, children: [headPreAddon, (0, jsx_runtime_1.jsx)(Head_1.Head, { ...headProps, sorting: sorting, onSort: onSort }), (0, jsx_runtime_1.jsx)(Body_1.Body, { ...bodyProps, activeRowId: activeRowId, keyId: keyId, selectedRows: selectedRows, minDisplayRows: minDisplayRows, rows: renderRows, columns: columns, variant: variant, emptyCellValue: emptyCellValue, isInitialExpanded: isInitialExpanded, expandedLevel: expandedLevel, initialVisibleChildrenCount: initialVisibleChildrenCount, moreButtonColumnPosition: moreButtonColumnPosition, isVisibleCollapseButton: isVisibleCollapseButton, isLoading: isLoading, isError: isError, errorMsg: errorMsg, noDataPlaceholder: renderedPlaceholder(), onRowClick: onRowClick, onRetry: onRetry })] }), (0, jsx_runtime_1.jsx)(Loader_1.Loader, { ...loaderProps }), footer && footer] }) }));
32
+ return ((0, jsx_runtime_1.jsx)(DataGridContext_1.DataGridContextProvider, { isLoading: isLoading, children: (0, jsx_runtime_1.jsxs)(styles_1.Container, { "$maxHeight": maxHeight, "$isAllowHorizontalScroll": isAllowHorizontalScroll, className: (0, utils_1.classNames)(constants_1.dataGridClassnames.root, className), children: [(0, jsx_runtime_1.jsxs)(TableContainer, { "$isAllowHorizontalScroll": isAllowHorizontalScroll, inert: isDataGridDisabled ? '' : undefined, children: [headPreAddon, !isHideHead && ((0, jsx_runtime_1.jsx)(Head_1.Head, { ...headProps, sorting: sorting, onSort: onSort })), (0, jsx_runtime_1.jsx)(Body_1.Body, { ...bodyProps, activeRowId: activeRowId, keyId: keyId, selectedRows: selectedRows, minDisplayRows: minDisplayRows, rows: renderRows, columns: columns, variant: variant, emptyCellValue: emptyCellValue, isInitialExpanded: isInitialExpanded, expandedLevel: expandedLevel, initialVisibleChildrenCount: initialVisibleChildrenCount, moreButtonColumnPosition: moreButtonColumnPosition, isVisibleCollapseButton: isVisibleCollapseButton, isLoading: isLoading, isError: isError, errorMsg: errorMsg, noDataPlaceholder: renderedPlaceholder(), onRowClick: onRowClick, onRetry: onRetry })] }), (0, jsx_runtime_1.jsx)(Loader_1.Loader, { ...loaderProps }), footer && footer] }) }));
33
33
  };
34
34
  exports.DataGrid = DataGrid;
@@ -1,9 +1,173 @@
1
1
  import { type CSSProperties, type ReactNode } from 'react';
2
2
  import { type Target } from '../utils';
3
+ import { type Variant } from './enums';
4
+ import type { NoDataProps } from './NoData';
3
5
  export type AlignVariant = 'left' | 'center' | 'right';
4
6
  export type SortState = 'asc' | 'desc';
5
7
  export type RenderCell<TData> = (params: TData) => ReactNode;
6
8
  export type CellValue = unknown;
9
+ export type DataGridProps<TData extends Record<string, CellValue> = DataGridRow, TSortField extends keyof TData = keyof TData> = {
10
+ /**
11
+ * Название класса, применяется к корневому компоненту
12
+ */
13
+ className?: string;
14
+ /**
15
+ * Массив данных для таблицы
16
+ */
17
+ rows: DataGridRowWithOptions<TData>[];
18
+ /**
19
+ * @example <DataGrid columns={[
20
+ * {
21
+ * field: 'test',
22
+ * label: 'Тестовая колонка',
23
+ * sortable: true,
24
+ * }]} />
25
+ * Конфигурация колонок для таблицы
26
+ */
27
+ columns: DataGridColumns<TData>[];
28
+ /**
29
+ * Идентификатор активного элемента массива rows. Выделяет активную строку в таблице
30
+ */
31
+ activeRowId?: string;
32
+ /**
33
+ * Поле, которое будет использоваться в качестве ключа
34
+ */
35
+ keyId: keyof TData;
36
+ /**
37
+ * @example <DataGrid selectedRows={[{name: 'test'}]} />
38
+ * Массив выбранных строк
39
+ */
40
+ selectedRows?: TData[];
41
+ /**
42
+ * @example <DataGrid sorting={{fieldId: 'test', sort: 'asc'}} />
43
+ * Параметры сортируемой колонки
44
+ */
45
+ sorting?: DataGridSort<TSortField>;
46
+ /**
47
+ * Компонент кастомного футера (например Pagination)
48
+ */
49
+ footer?: ReactNode;
50
+ /**
51
+ * Используется для отображения placeholder при отсутствии данных в таблице
52
+ */
53
+ noDataPlaceholder?: ReactNode;
54
+ /**
55
+ * Максимальная высота для таблицы
56
+ */
57
+ maxHeight?: number;
58
+ /**
59
+ * Если true, показывается анимация загрузки
60
+ */
61
+ isLoading?: boolean;
62
+ /**
63
+ * Если true, таблица будет заблокирована для взаимодействия
64
+ */
65
+ isDisabled?: boolean;
66
+ /**
67
+ * Флаг состояния ошибки
68
+ */
69
+ isError?: boolean;
70
+ /**
71
+ * Текст ошибки
72
+ */
73
+ errorMsg?: string;
74
+ /**
75
+ * Вариант отображения вложенных элементов
76
+ * @default 'tree'
77
+ */
78
+ variant?: `${Variant}`;
79
+ /**
80
+ * Опции для отображения древовидных списков
81
+ * Применяется если variant="tree"
82
+ */
83
+ tree?: {
84
+ /**
85
+ * Если true, то дерево будет раскрыто по умолчанию
86
+ * @default 'false'
87
+ */
88
+ isInitialExpanded?: boolean;
89
+ /**
90
+ * Уровень раскрытия дерева по умолчанию, при `isInitialExpanded=true`
91
+ * @default '1'
92
+ */
93
+ expandedLevel?: number;
94
+ /**
95
+ * Количество отображаемых по умолчанию дочерних элементов
96
+ * @default '2'
97
+ */
98
+ initialVisibleChildrenCount?: number;
99
+ };
100
+ /**
101
+ * Опции для отображения вложенных списков
102
+ * Применяется если variant="subrows"
103
+ */
104
+ subrows?: {
105
+ /**
106
+ * Уровень раскрытия дочерних элементов по умолчанию, при `isInitialExpanded=true`
107
+ * @default '1'
108
+ */
109
+ expandedLevel?: number;
110
+ /**
111
+ * Количество отображаемых по умолчанию дочерних элементов
112
+ * @default '2'
113
+ */
114
+ initialVisibleChildrenCount?: number;
115
+ /**
116
+ * Номер колонки, в которой будет расположена кнопка "Показать все"
117
+ * @default 1
118
+ */
119
+ moreButtonColumnPosition?: number;
120
+ /**
121
+ * Если false, кнопка разворачивания элементов не показывается
122
+ * @default true
123
+ */
124
+ isVisibleCollapseButton?: boolean;
125
+ };
126
+ /**
127
+ * Заглушка для пустых ячеек (если отсутствует field и filter и renderCell)
128
+ * @default '—'
129
+ */
130
+ emptyCellValue?: ReactNode;
131
+ /**
132
+ * Используется для отображения переданного кол-ва строк при отсутствии данных
133
+ * @default 10
134
+ */
135
+ minDisplayRows?: number;
136
+ /**
137
+ * Функция обработки нажатия на кнопку "Повторить запрос"
138
+ */
139
+ onRetry: () => void;
140
+ /**
141
+ * Обработчик клика строки таблицы
142
+ */
143
+ onRowClick?: (row: TData) => void;
144
+ /**
145
+ * Обработчик выбора строки
146
+ */
147
+ onSelectRow?: (row: TData[]) => void;
148
+ /**
149
+ * @example <DataGrid onSort={({fieldId: 'test', sort: 'asc'}) => console.log('sorted')} />
150
+ * Обработчик сортировки
151
+ */
152
+ onSort?: (sorting: DataGridSort<TSortField> | undefined) => void;
153
+ /**
154
+ * Используется для кастомизации компонента, использующегося в сценарии отсутствия данных
155
+ */
156
+ noDataOptions?: NoDataProps;
157
+ /**
158
+ * Используется для скрытия чекбокса "Выбрать все"
159
+ */
160
+ isHideSelectAll?: boolean;
161
+ /**
162
+ * Место для рендера перед head страницы
163
+ * @private Предполагается для использования в реализации изменения размеров таблицы
164
+ */
165
+ headPreAddon?: ReactNode;
166
+ /**
167
+ * Убирает шапку таблицы, когда нет данных
168
+ */
169
+ isHideHeaderIfNoData?: boolean;
170
+ };
7
171
  export type DataGridSort<TSortField> = {
8
172
  /**
9
173
  * @example {fieldId: 'test'}
@@ -1,8 +1,7 @@
1
1
  import { type ChangeEvent } from 'react';
2
- import { type DataGridProps } from '../DataGrid';
3
- import type { CellValue, DataGridRow } from '../types';
2
+ import type { CellValue, DataGridProps, DataGridRow } from '../types';
4
3
  type UseLogicParams<TData extends Record<string, CellValue> = DataGridRow, TSortField extends keyof TData = keyof TData> = DataGridProps<TData, TSortField>;
5
- export declare const useLogic: <TData extends Record<string, unknown> = DataGridRow, TSortField extends keyof TData = keyof TData>({ keyId, columns, rows, variant, tree, subrows, selectedRows, isLoading, isDisabled, onSelectRow, isHideSelectAll, }: UseLogicParams<TData, TSortField>) => {
4
+ export declare const useLogic: <TData extends Record<string, unknown> = DataGridRow, TSortField extends keyof TData = keyof TData>({ keyId, columns, rows, variant, tree, subrows, selectedRows, isLoading, isDisabled, onSelectRow, isHideSelectAll, isHideHeaderIfNoData, }: UseLogicParams<TData, TSortField>) => {
6
5
  isDataGridDisabled: boolean | undefined;
7
6
  treeRenderConfig: {
8
7
  isInitialExpanded?: boolean | undefined;
@@ -11,6 +10,7 @@ export declare const useLogic: <TData extends Record<string, unknown> = DataGrid
11
10
  } | undefined;
12
11
  renderRows: TData[];
13
12
  isAllowHorizontalScroll: boolean;
13
+ isHideHead: boolean;
14
14
  headProps: {
15
15
  rowsCount: number;
16
16
  uncheckedRowsCount: number;
@@ -6,7 +6,7 @@ const hooks_1 = require("../../hooks");
6
6
  const utils_1 = require("../../utils");
7
7
  const enums_1 = require("../enums");
8
8
  const utils_2 = require("./utils");
9
- const useLogic = ({ keyId, columns, rows = [], variant, tree, subrows, selectedRows = [], isLoading, isDisabled, onSelectRow, isHideSelectAll, }) => {
9
+ const useLogic = ({ keyId, columns, rows = [], variant, tree, subrows, selectedRows = [], isLoading, isDisabled, onSelectRow, isHideSelectAll, isHideHeaderIfNoData = false, }) => {
10
10
  const isFirstRender = (0, hooks_1.useFirstMountState)();
11
11
  const isSelectable = Boolean(onSelectRow);
12
12
  const isDataGridDisabled = isLoading || isDisabled;
@@ -57,11 +57,13 @@ const useLogic = ({ keyId, columns, rows = [], variant, tree, subrows, selectedR
57
57
  }
58
58
  onSelectRow(selectedRowsRef.current.filter((selectedRow) => selectedRow[keyId] !== row[keyId]));
59
59
  };
60
+ const isHideHead = isHideHeaderIfNoData && rows.length === 0;
60
61
  return {
61
62
  isDataGridDisabled,
62
63
  treeRenderConfig,
63
64
  renderRows,
64
65
  isAllowHorizontalScroll,
66
+ isHideHead,
65
67
  headProps: {
66
68
  rowsCount: availableRows.length,
67
69
  uncheckedRowsCount,
@@ -1,17 +1,4 @@
1
1
  /// <reference types="react" />
2
- import { type CellValue, type DataGridProps, type DataGridRow } from '../DataGrid';
3
- export type DataGridInfiniteProps<TData extends Record<string, CellValue> = DataGridRow, TSortField extends keyof TData = keyof TData> = Omit<DataGridProps<TData, TSortField>, 'footer' | 'minDisplayRows'> & {
4
- /**
5
- * Флаг достижения конца списка
6
- */
7
- isEndReached?: boolean;
8
- /**
9
- * Текст достижения конца списка
10
- */
11
- endOfScrollMsg?: string;
12
- /**
13
- * Обработчик подгрузки данных
14
- */
15
- onEndReached?: () => void;
16
- };
2
+ import { type DataGridRow } from '../DataGrid';
3
+ import { type DataGridInfiniteProps } from './types';
17
4
  export declare const DataGridInfinite: <TData extends Record<string, unknown> = DataGridRow, TSortField extends keyof TData = keyof TData>(props: DataGridInfiniteProps<TData, TSortField>) => JSX.Element;
@@ -21,12 +21,12 @@ const useLogic_1 = require("./useLogic");
21
21
  const INITIAL_LEVEL = 0;
22
22
  const DataGridInfinite = (props) => {
23
23
  const { imagesMap, emptySymbol } = (0, react_1.useContext)(ConfigProvider_1.ConfigContext);
24
- const { isNoData, isDataGridDisabled, isStickyButtonActive, treeRenderConfig, virtuosoProps, headProps, rowProps, scrollToTopButtonProps, isEndReached, } = (0, useLogic_1.useLogic)(props);
24
+ const { isNoData, isDataGridDisabled, isStickyButtonActive, treeRenderConfig, virtuosoProps, headProps, rowProps, scrollToTopButtonProps, isEndReached, isHideHead, } = (0, useLogic_1.useLogic)(props);
25
25
  const { columns, rows = [], selectedRows = [], sorting, maxHeight, isLoading, isDisabled, keyId, activeRowId, emptyCellValue = emptySymbol, variant = DataGrid_1.Variant.Tree, subrows, className, isError, endOfScrollMsg, errorMsg, noDataPlaceholder, onRowClick, onSort, onRetry, headPreAddon, } = props;
26
26
  const { moreButtonColumnPosition = 1, isVisibleCollapseButton = true } = subrows || {};
27
27
  const { isInitialExpanded = false, expandedLevel = DataGrid_1.EXPANDED_LEVEL_BY_DEFAULT, initialVisibleChildrenCount = DataGrid_1.INITIAL_OPENED_NESTED_CHILDREN_COUNT_BY_DEFAULT, } = treeRenderConfig || {};
28
28
  const TableContainer = isDisabled ? styles_1.DisabledDataGridWrapper : styles_1.DataGridWrapper;
29
- return ((0, jsx_runtime_1.jsx)(DataGridContext_1.DataGridContextProvider, { children: (0, jsx_runtime_1.jsxs)(DataGrid_1.Container, { "$maxHeight": maxHeight, className: (0, utils_1.classNames)(DataGrid_1.dataGridClassnames.root, className), children: [headPreAddon, (0, jsx_runtime_1.jsxs)(TableContainer, { inert: isDataGridDisabled ? '' : undefined, children: [(0, jsx_runtime_1.jsx)(DataGrid_1.Head, { ...headProps, onSort: onSort, sorting: sorting, columns: columns }), (0, jsx_runtime_1.jsx)(ContentState_1.ContentState, { isLoading: isLoading && !isNoData, loadingTitle: "\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u0434\u0430\u043D\u043D\u044B\u0445", isError: isError && !isNoData, errorState: {
29
+ return ((0, jsx_runtime_1.jsx)(DataGridContext_1.DataGridContextProvider, { children: (0, jsx_runtime_1.jsxs)(DataGrid_1.Container, { "$maxHeight": maxHeight, className: (0, utils_1.classNames)(DataGrid_1.dataGridClassnames.root, className), children: [headPreAddon, (0, jsx_runtime_1.jsxs)(TableContainer, { inert: isDataGridDisabled ? '' : undefined, children: [!isHideHead && ((0, jsx_runtime_1.jsx)(DataGrid_1.Head, { ...headProps, onSort: onSort, sorting: sorting, columns: columns })), (0, jsx_runtime_1.jsx)(ContentState_1.ContentState, { isLoading: isLoading && !isNoData, loadingTitle: "\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u0434\u0430\u043D\u043D\u044B\u0445", isError: isError && !isNoData, errorState: {
30
30
  imgAlt: 'Что-то пошло не так',
31
31
  errorList: [errorMsg || ''],
32
32
  imgSrc: imagesMap.defaultErrorImgSrc,
@@ -1 +1,2 @@
1
1
  export * from './DataGridInfinite';
2
+ export type { DataGridInfiniteProps } from './types';
@@ -0,0 +1,19 @@
1
+ import type { CellValue, DataGridProps, DataGridRow } from '../DataGrid';
2
+ export type DataGridInfiniteProps<TData extends Record<string, CellValue> = DataGridRow, TSortField extends keyof TData = keyof TData> = Omit<DataGridProps<TData, TSortField>, 'footer' | 'minDisplayRows'> & {
3
+ /**
4
+ * Флаг достижения конца списка
5
+ */
6
+ isEndReached?: boolean;
7
+ /**
8
+ * Текст достижения конца списка
9
+ */
10
+ endOfScrollMsg?: string;
11
+ /**
12
+ * Обработчик подгрузки данных
13
+ */
14
+ onEndReached?: () => void;
15
+ /**
16
+ * Убирает шапку таблицы, когда нет данных
17
+ */
18
+ isHideHeaderIfNoData?: boolean;
19
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,9 +1,9 @@
1
1
  import { type ChangeEvent } from 'react';
2
2
  import type { ListRange, VirtuosoHandle } from 'react-virtuoso';
3
3
  import { type CellValue, type DataGridRow } from '../../DataGrid';
4
- import { type DataGridInfiniteProps } from '../DataGridInfinite';
4
+ import { type DataGridInfiniteProps } from '../types';
5
5
  type UseLogicParams<TData extends Record<string, CellValue> = DataGridRow, TSortField extends keyof TData = keyof TData> = DataGridInfiniteProps<TData, TSortField>;
6
- export declare const useLogic: <TData extends Record<string, unknown> = DataGridRow, TSortField extends keyof TData = keyof TData>({ keyId, columns, rows, variant, tree, subrows, selectedRows, isLoading, isDisabled, isEndReached, onEndReached, onSelectRow, isHideSelectAll, }: UseLogicParams<TData, TSortField>) => {
6
+ export declare const useLogic: <TData extends Record<string, unknown> = DataGridRow, TSortField extends keyof TData = keyof TData>({ keyId, columns, rows, variant, tree, subrows, selectedRows, isLoading, isDisabled, isEndReached, onEndReached, onSelectRow, isHideSelectAll, isHideHeaderIfNoData, }: UseLogicParams<TData, TSortField>) => {
7
7
  isNoData: boolean;
8
8
  isDataGridDisabled: boolean | undefined;
9
9
  isStickyButtonActive: boolean;
@@ -13,6 +13,7 @@ export declare const useLogic: <TData extends Record<string, unknown> = DataGrid
13
13
  initialVisibleChildrenCount?: number | undefined;
14
14
  } | undefined;
15
15
  isEndReached: boolean | undefined;
16
+ isHideHead: boolean;
16
17
  virtuosoProps: {
17
18
  id: string;
18
19
  ref: import("react").RefObject<VirtuosoHandle>;
@@ -7,7 +7,7 @@ const utils_1 = require("../../DataGrid/useLogic/utils");
7
7
  const hooks_1 = require("../../hooks");
8
8
  const utils_2 = require("../../utils");
9
9
  const constants_1 = require("../constants");
10
- const useLogic = ({ keyId, columns, rows, variant, tree, subrows, selectedRows = [], isLoading, isDisabled, isEndReached, onEndReached, onSelectRow, isHideSelectAll, }) => {
10
+ const useLogic = ({ keyId, columns, rows, variant, tree, subrows, selectedRows = [], isLoading, isDisabled, isEndReached, onEndReached, onSelectRow, isHideSelectAll, isHideHeaderIfNoData = false, }) => {
11
11
  const virtuoso = (0, react_1.useRef)(null);
12
12
  const [hasVerticalScroll, setHasVerticalScroll] = (0, react_1.useState)(false);
13
13
  const [isStickyButtonActive, showStickyButton, hideStickyButton] = (0, hooks_1.useToggle)();
@@ -60,12 +60,14 @@ const useLogic = ({ keyId, columns, rows, variant, tree, subrows, selectedRows =
60
60
  setHasVerticalScroll(list?.clientHeight > container?.clientHeight);
61
61
  }
62
62
  };
63
+ const isHideHead = isHideHeaderIfNoData && rows.length === 0;
63
64
  return {
64
65
  isNoData,
65
66
  isDataGridDisabled,
66
67
  isStickyButtonActive,
67
68
  treeRenderConfig,
68
69
  isEndReached: isEndReached && hasVerticalScroll,
70
+ isHideHead,
69
71
  virtuosoProps: {
70
72
  id: constants_1.VIRTUOSO_CONTAINER_ID,
71
73
  ref: virtuoso,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@astral/ui",
3
- "version": "4.3.0",
3
+ "version": "4.4.0",
4
4
  "browser": "./index.js",
5
5
  "main": "./node/index.js",
6
6
  "dependencies": {