@snack-uikit/table 0.33.3 → 0.34.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.
Files changed (80) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +5 -3
  3. package/dist/cjs/components/Table/Table.d.ts +1 -1
  4. package/dist/cjs/components/Table/Table.js +107 -48
  5. package/dist/cjs/components/Table/hooks/index.d.ts +1 -0
  6. package/dist/cjs/components/Table/hooks/index.js +2 -1
  7. package/dist/cjs/components/Table/hooks/useColumnOrderByDrag.d.ts +8 -0
  8. package/dist/cjs/components/Table/hooks/useColumnOrderByDrag.js +49 -0
  9. package/dist/cjs/components/Table/utils.d.ts +13 -0
  10. package/dist/cjs/components/Table/utils.js +71 -0
  11. package/dist/cjs/components/types.d.ts +12 -3
  12. package/dist/cjs/constants.d.ts +1 -0
  13. package/dist/cjs/constants.js +3 -2
  14. package/dist/cjs/helperComponents/Cells/BodyCell/BodyCell.d.ts +2 -1
  15. package/dist/cjs/helperComponents/Cells/BodyCell/BodyCell.js +13 -3
  16. package/dist/cjs/helperComponents/Cells/HeaderCell/HeaderCell.d.ts +2 -1
  17. package/dist/cjs/helperComponents/Cells/HeaderCell/HeaderCell.js +41 -17
  18. package/dist/cjs/helperComponents/Cells/HeaderCell/styles.module.css +10 -0
  19. package/dist/cjs/helperComponents/ColumnsSettings/ColumnsSettings.d.ts +8 -0
  20. package/dist/cjs/helperComponents/ColumnsSettings/ColumnsSettings.js +38 -0
  21. package/dist/cjs/helperComponents/ColumnsSettings/index.d.ts +1 -0
  22. package/dist/cjs/helperComponents/ColumnsSettings/index.js +25 -0
  23. package/dist/cjs/helperComponents/ColumnsSettings/styles.module.css +3 -0
  24. package/dist/cjs/helperComponents/Rows/BodyRow.d.ts +4 -1
  25. package/dist/cjs/helperComponents/Rows/BodyRow.js +20 -11
  26. package/dist/cjs/helperComponents/Rows/HeaderRow.d.ts +7 -1
  27. package/dist/cjs/helperComponents/Rows/HeaderRow.js +13 -5
  28. package/dist/cjs/helperComponents/hooks.d.ts +9 -9
  29. package/dist/cjs/helperComponents/hooks.js +39 -11
  30. package/dist/cjs/helperComponents/index.d.ts +1 -0
  31. package/dist/cjs/helperComponents/index.js +2 -1
  32. package/dist/cjs/types.d.ts +11 -3
  33. package/dist/esm/components/Table/Table.d.ts +1 -1
  34. package/dist/esm/components/Table/Table.js +40 -12
  35. package/dist/esm/components/Table/hooks/index.d.ts +1 -0
  36. package/dist/esm/components/Table/hooks/index.js +1 -0
  37. package/dist/esm/components/Table/hooks/useColumnOrderByDrag.d.ts +8 -0
  38. package/dist/esm/components/Table/hooks/useColumnOrderByDrag.js +39 -0
  39. package/dist/esm/components/Table/utils.d.ts +13 -0
  40. package/dist/esm/components/Table/utils.js +70 -0
  41. package/dist/esm/components/types.d.ts +12 -3
  42. package/dist/esm/constants.d.ts +1 -0
  43. package/dist/esm/constants.js +1 -0
  44. package/dist/esm/helperComponents/Cells/BodyCell/BodyCell.d.ts +2 -1
  45. package/dist/esm/helperComponents/Cells/BodyCell/BodyCell.js +7 -3
  46. package/dist/esm/helperComponents/Cells/HeaderCell/HeaderCell.d.ts +2 -1
  47. package/dist/esm/helperComponents/Cells/HeaderCell/HeaderCell.js +14 -4
  48. package/dist/esm/helperComponents/Cells/HeaderCell/styles.module.css +10 -0
  49. package/dist/esm/helperComponents/ColumnsSettings/ColumnsSettings.d.ts +8 -0
  50. package/dist/esm/helperComponents/ColumnsSettings/ColumnsSettings.js +12 -0
  51. package/dist/esm/helperComponents/ColumnsSettings/index.d.ts +1 -0
  52. package/dist/esm/helperComponents/ColumnsSettings/index.js +1 -0
  53. package/dist/esm/helperComponents/ColumnsSettings/styles.module.css +3 -0
  54. package/dist/esm/helperComponents/Rows/BodyRow.d.ts +4 -1
  55. package/dist/esm/helperComponents/Rows/BodyRow.js +4 -3
  56. package/dist/esm/helperComponents/Rows/HeaderRow.d.ts +7 -1
  57. package/dist/esm/helperComponents/Rows/HeaderRow.js +3 -2
  58. package/dist/esm/helperComponents/hooks.d.ts +9 -9
  59. package/dist/esm/helperComponents/hooks.js +32 -11
  60. package/dist/esm/helperComponents/index.d.ts +1 -0
  61. package/dist/esm/helperComponents/index.js +1 -0
  62. package/dist/esm/types.d.ts +11 -3
  63. package/package.json +9 -5
  64. package/src/components/Table/Table.tsx +147 -61
  65. package/src/components/Table/hooks/index.ts +1 -0
  66. package/src/components/Table/hooks/useColumnOrderByDrag.ts +67 -0
  67. package/src/components/Table/utils.ts +118 -0
  68. package/src/components/types.ts +13 -3
  69. package/src/constants.tsx +1 -0
  70. package/src/helperComponents/Cells/BodyCell/BodyCell.tsx +9 -2
  71. package/src/helperComponents/Cells/HeaderCell/HeaderCell.tsx +50 -23
  72. package/src/helperComponents/Cells/HeaderCell/styles.module.scss +15 -0
  73. package/src/helperComponents/ColumnsSettings/ColumnsSettings.tsx +28 -0
  74. package/src/helperComponents/ColumnsSettings/index.ts +1 -0
  75. package/src/helperComponents/ColumnsSettings/styles.module.scss +5 -0
  76. package/src/helperComponents/Rows/BodyRow.tsx +30 -8
  77. package/src/helperComponents/Rows/HeaderRow.tsx +21 -4
  78. package/src/helperComponents/hooks.ts +41 -11
  79. package/src/helperComponents/index.ts +1 -0
  80. package/src/types.ts +21 -3
package/CHANGELOG.md CHANGED
@@ -3,6 +3,28 @@
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
+ # 0.34.0 (2025-03-06)
7
+
8
+
9
+ ### Features
10
+
11
+ * **PDS-1483:** table columns reorder by drag and columns settings ([80d43af](https://github.com/cloud-ru-tech/snack-uikit/commit/80d43af40c6acca38e2d788fcfa4fbd944818059))
12
+
13
+
14
+
15
+
16
+
17
+ ## 0.33.4 (2025-03-05)
18
+
19
+ ### Only dependencies have been changed
20
+ * [@snack-uikit/chips@0.26.1](https://github.com/cloud-ru-tech/snack-uikit/blob/master/packages/chips/CHANGELOG.md)
21
+ * [@snack-uikit/list@0.27.0](https://github.com/cloud-ru-tech/snack-uikit/blob/master/packages/list/CHANGELOG.md)
22
+ * [@snack-uikit/toolbar@0.12.4](https://github.com/cloud-ru-tech/snack-uikit/blob/master/packages/toolbar/CHANGELOG.md)
23
+
24
+
25
+
26
+
27
+
6
28
  ## 0.33.3 (2025-03-05)
7
29
 
8
30
  ### Only dependencies have been changed
package/README.md CHANGED
@@ -115,6 +115,7 @@ const columnDefinitions: ColumnDefinition<TableData>[] = [
115
115
  | copyPinnedRows | `boolean` | - | Параметр отвечает за сохранение закрепленных строк в теле таблицы |
116
116
  | enableSelectPinned | `boolean` | - | Параметр отвечает за чекбокс выбора закрепленных строк |
117
117
  | sorting | `{ initialState?: SortingState; state?: SortingState; onChange?(state: SortingState): void; }` | - | Параметры отвечают за возможность сортировки, их стоит использовать если нужно отслеживать состояние <br> <strong>initialState</strong>: Начальное состояние сортировки <br> <strong>state</strong>: Состояние сортировки, жестко устанавливаемое снаружи <br> <strong>onChange</strong>: Колбэк на изменение сортировки |
118
+ | columnsSettings | `{ enableDrag?: boolean; headerLabel?: string; }` | - | Параметры отвечают за настройки колонок <br> <strong>enableDrag</strong>: Включение сортировки порядка столбцов вручную перетаскиванием <br> <strong>headerLabel</strong>: Название меню настроек колонок. Наличие включает показ настроек <br> <strong>selectAllButtonLabels</strong>: Значения кнопки включения/отключения всех айтемов ([вкл, выкл]) <br> |
118
119
  | expanding | `{ getSubRows: (element: TData) => TData[]; expandingColumnDefinition: TreeColumnDefinitionProps<TData>; }` | - | Параметр отвечает за общие настройки раскрывающихся строк |
119
120
  | 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>: Колбэк на выбор строк |
120
121
  | 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 строки поиска |
@@ -126,7 +127,7 @@ const columnDefinitions: ColumnDefinition<TableData>[] = [
126
127
  | loading | `boolean` | - | Состояние загрузки |
127
128
  | onRefresh | `() => void` | - | Колбек обновления данных |
128
129
  | outline | `boolean` | - | Внешний бордер для тулбара и таблицы |
129
- | columnFilters | `ChipChoiceRowProps<TFilters>` | - | Фильтры |
130
+ | columnFilters | `FilterRow<TFilters>` | - | Фильтры |
130
131
  | dataFiltered | `boolean` | - | Флаг, показывающий что данные были отфильтрованы при пустых данных |
131
132
  | dataError | `boolean` | - | Флаг, показывающий что произошла ошибка запроса при пустых данных |
132
133
  | noDataState | `EmptyStateProps` | - | Экран при отстутствии данных |
@@ -178,6 +179,7 @@ const columnDefinitions: ColumnDefinition<TableData>[] = [
178
179
  |------|------|---------------|-------------|
179
180
  | onChangePage* | `(offset: number, limit: number) => void` | - | |
180
181
  | columnDefinitions* | `ColumnDefinition<TData>[]` | - | Определение внешнего вида и функционала колонок |
182
+ | className | `string` | - | CSS-класс |
181
183
  | onRefresh | `() => void` | - | Колбек обновления данных |
182
184
  | moreActions | `Action[]` | - | Элементы выпадающего списка кнопки с действиями |
183
185
  | bulkActions | `BulkAction[]` | - | Список действия для массовых операций |
@@ -185,15 +187,15 @@ const columnDefinitions: ColumnDefinition<TableData>[] = [
185
187
  | copyPinnedRows | `boolean` | false | Параметр отвечает за сохранение закрепленных строк в теле таблицы |
186
188
  | enableSelectPinned | `boolean` | - | Параметр отвечает за чекбокс выбора закрепленных строк |
187
189
  | sorting | `{ initialState?: SortingState; state?: SortingState; onChange?(state: SortingState): void; }` | - | Параметры отвечают за возможность сортировки, их стоит использовать если нужно отслеживать состояние <br> <strong>initialState</strong>: Начальное состояние сортировки <br> <strong>state</strong>: Состояние сортировки, жестко устанавливаемое снаружи <br> <strong>onChange</strong>: Колбэк на изменение сортировки |
190
+ | columnsSettings | `{ enableDrag?: boolean; headerLabel?: string; }` | - | Параметры отвечают за настройки колонок <br> <strong>enableDrag</strong>: Включение сортировки порядка столбцов вручную перетаскиванием <br> <strong>headerLabel</strong>: Название меню настроек колонок. Наличие включает показ настроек <br> <strong>selectAllButtonLabels</strong>: Значения кнопки включения/отключения всех айтемов ([вкл, выкл]) <br> |
188
191
  | expanding | `{ getSubRows: (element: TData) => TData[]; expandingColumnDefinition: TreeColumnDefinitionProps<TData>; }` | - | Параметр отвечает за общие настройки раскрывающихся строк |
189
192
  | 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>: Колбэк на выбор строк |
190
193
  | enableFuzzySearch | `boolean` | - | Включить нечеткий поиск |
191
194
  | rowAutoHeight | `boolean` | - | |
192
195
  | onRowClick | `RowClickHandler<TData>` | - | Колбэк клика по строке |
193
- | className | `string` | - | CSS-класс |
194
196
  | loading | `boolean` | - | Состояние загрузки |
195
197
  | outline | `boolean` | - | Внешний бордер для тулбара и таблицы |
196
- | columnFilters | `ChipChoiceRowProps<TFilters>` | - | Фильтры |
198
+ | columnFilters | `FilterRow<TFilters>` | - | Фильтры |
197
199
  | dataFiltered | `boolean` | - | Флаг, показывающий что данные были отфильтрованы при пустых данных |
198
200
  | dataError | `boolean` | - | Флаг, показывающий что произошла ошибка запроса при пустых данных |
199
201
  | noDataState | `EmptyStateProps` | - | Экран при отстутствии данных |
@@ -1,7 +1,7 @@
1
1
  import { FiltersState } from '@snack-uikit/chips';
2
2
  import { TableProps } from '../types';
3
3
  /** Компонент таблицы */
4
- export declare function Table<TData extends object, TFilters extends FiltersState = Record<string, unknown>>({ data, rowPinning, columnDefinitions, keepPinnedRows, copyPinnedRows, enableSelectPinned, rowSelection: rowSelectionProp, search, sorting: sortingProp, columnFilters, pagination: paginationProp, className, onRowClick, onRefresh, pageSize, pageCount, loading, infiniteLoading, outline, moreActions, exportSettings, dataFiltered, dataError, noDataState, noResultsState, errorDataState, suppressToolbar, suppressSearch, toolbarAfter, suppressPagination, manualSorting, manualPagination: manualPaginationProp, manualFiltering, autoResetPageIndex, scrollRef, scrollContainerRef, getRowId, enableFuzzySearch, savedState, expanding, bulkActions: bulkActionsProp, rowAutoHeight, ...rest }: TableProps<TData, TFilters>): import("react/jsx-runtime").JSX.Element;
4
+ export declare function Table<TData extends object, TFilters extends FiltersState = Record<string, unknown>>({ data, rowPinning, columnDefinitions, keepPinnedRows, copyPinnedRows, enableSelectPinned, rowSelection: rowSelectionProp, search, sorting: sortingProp, columnFilters, pagination: paginationProp, className, onRowClick, onRefresh, pageSize, pageCount, loading, infiniteLoading, outline, moreActions, exportSettings, dataFiltered, dataError, noDataState, noResultsState, errorDataState, suppressToolbar, suppressSearch, toolbarAfter, suppressPagination, manualSorting, manualPagination: manualPaginationProp, manualFiltering, autoResetPageIndex, scrollRef, scrollContainerRef, getRowId, enableFuzzySearch, savedState, expanding, bulkActions: bulkActionsProp, rowAutoHeight, columnsSettings: columnsSettingsProp, ...rest }: TableProps<TData, TFilters>): import("react/jsx-runtime").JSX.Element;
5
5
  export declare namespace Table {
6
6
  var getStatusColumnDef: typeof import("../../helperComponents").getStatusColumnDef;
7
7
  var statusAppearances: Record<string, string>;
@@ -18,6 +18,8 @@ Object.defineProperty(exports, "__esModule", {
18
18
  });
19
19
  exports.Table = Table;
20
20
  const jsx_runtime_1 = require("react/jsx-runtime");
21
+ const core_1 = require("@dnd-kit/core");
22
+ const modifiers_1 = require("@dnd-kit/modifiers");
21
23
  const react_table_1 = require("@tanstack/react-table");
22
24
  const classnames_1 = __importDefault(require("classnames"));
23
25
  const react_1 = require("react");
@@ -83,9 +85,10 @@ function Table(_a) {
83
85
  savedState,
84
86
  expanding,
85
87
  bulkActions: bulkActionsProp,
86
- rowAutoHeight
88
+ rowAutoHeight,
89
+ columnsSettings: columnsSettingsProp
87
90
  } = _a,
88
- rest = __rest(_a, ["data", "rowPinning", "columnDefinitions", "keepPinnedRows", "copyPinnedRows", "enableSelectPinned", "rowSelection", "search", "sorting", "columnFilters", "pagination", "className", "onRowClick", "onRefresh", "pageSize", "pageCount", "loading", "infiniteLoading", "outline", "moreActions", "exportSettings", "dataFiltered", "dataError", "noDataState", "noResultsState", "errorDataState", "suppressToolbar", "suppressSearch", "toolbarAfter", "suppressPagination", "manualSorting", "manualPagination", "manualFiltering", "autoResetPageIndex", "scrollRef", "scrollContainerRef", "getRowId", "enableFuzzySearch", "savedState", "expanding", "bulkActions", "rowAutoHeight"]);
91
+ rest = __rest(_a, ["data", "rowPinning", "columnDefinitions", "keepPinnedRows", "copyPinnedRows", "enableSelectPinned", "rowSelection", "search", "sorting", "columnFilters", "pagination", "className", "onRowClick", "onRefresh", "pageSize", "pageCount", "loading", "infiniteLoading", "outline", "moreActions", "exportSettings", "dataFiltered", "dataError", "noDataState", "noResultsState", "errorDataState", "suppressToolbar", "suppressSearch", "toolbarAfter", "suppressPagination", "manualSorting", "manualPagination", "manualFiltering", "autoResetPageIndex", "scrollRef", "scrollContainerRef", "getRowId", "enableFuzzySearch", "savedState", "expanding", "bulkActions", "rowAutoHeight", "columnsSettings"]);
89
92
  const {
90
93
  setDataToStorages,
91
94
  defaultFilter
@@ -111,6 +114,7 @@ function Table(_a) {
111
114
  initialState: [],
112
115
  onChange: columnFilters === null || columnFilters === void 0 ? void 0 : columnFilters.onVisibleFiltersChange
113
116
  }, constants_1.DEFAULT_FILTER_VISIBILITY);
117
+ const [areColumnFiltersOpen, setAreColumnFiltersOpen] = (0, react_1.useState)(true);
114
118
  (0, react_1.useEffect)(() => {
115
119
  setDataToStorages({
116
120
  pagination,
@@ -130,16 +134,30 @@ function Table(_a) {
130
134
  // Только для первого рендера, чтобы проинициализировать фильтр
131
135
  // eslint-disable-next-line
132
136
  }, [defaultFilter]);
133
- const patchedFilter = (0, react_1.useMemo)(() => columnFilters ? Object.assign(Object.assign({}, columnFilters), {
134
- value: filter,
135
- onChange: setFilter,
136
- visibleFilters: filterVisibility,
137
- onVisibleFiltersChange: setFilterVisibility
138
- }) : undefined, [columnFilters, filter, setFilter, filterVisibility, setFilterVisibility]);
137
+ const patchedFilter = (0, react_1.useMemo)(() => {
138
+ if (!columnFilters) {
139
+ return undefined;
140
+ }
141
+ return Object.assign(Object.assign({}, columnFilters), {
142
+ open: areColumnFiltersOpen,
143
+ onOpenChange: setAreColumnFiltersOpen,
144
+ value: filter,
145
+ onChange: setFilter,
146
+ visibleFilters: filterVisibility,
147
+ onVisibleFiltersChange: setFilterVisibility
148
+ });
149
+ }, [columnFilters, areColumnFiltersOpen, filter, setFilter, filterVisibility, setFilterVisibility]);
139
150
  const enableSelection = Boolean(rowSelectionProp === null || rowSelectionProp === void 0 ? void 0 : rowSelectionProp.enable);
140
151
  const manualPagination = infiniteLoading || manualPaginationProp;
152
+ const [enabledColumns, setEnabledColumns] = (0, react_1.useState)(() => (0, utils_3.prepareColumnsSettingsMap)(columnDefinitions));
153
+ const filteredColumnDefinitions = (0, react_1.useMemo)(() => columnDefinitions.filter(colDef => {
154
+ if ((0, utils_3.isFilterableColumn)(colDef)) {
155
+ return enabledColumns.includes(colDef.id);
156
+ }
157
+ return true;
158
+ }), [columnDefinitions, enabledColumns]);
141
159
  const tableColumns = (0, react_1.useMemo)(() => {
142
- let cols = columnDefinitions;
160
+ let cols = filteredColumnDefinitions;
143
161
  if (enableSelection && !expanding) {
144
162
  cols = [(0, helperComponents_1.getSelectionCellColumnDef)(enableSelectPinned), ...cols];
145
163
  }
@@ -147,7 +165,25 @@ function Table(_a) {
147
165
  cols = [(0, TreeCell_1.getTreeColumnDef)(expanding.expandingColumnDefinition), ...cols];
148
166
  }
149
167
  return cols;
150
- }, [columnDefinitions, enableSelection, enableSelectPinned, expanding]);
168
+ }, [filteredColumnDefinitions, enableSelection, enableSelectPinned, expanding]);
169
+ const {
170
+ columnOrder,
171
+ setColumnOrder,
172
+ sensors,
173
+ handleDragEnd
174
+ } = (0, hooks_1.useColumnOrderByDrag)(tableColumns);
175
+ const filterableColumns = (0, react_1.useMemo)(() => columnDefinitions.filter(utils_3.isFilterableColumn), [columnDefinitions]);
176
+ const areAllColumnsEnabled = filterableColumns.length === enabledColumns.length;
177
+ const {
178
+ t
179
+ } = (0, locale_1.useLocale)('Table');
180
+ const columnsSettings = (0, react_1.useMemo)(() => (0, utils_3.prepareColumnsSettings)({
181
+ columnDefinitions,
182
+ columnOrder,
183
+ areAllColumnsEnabled,
184
+ columnsSettingsHeader: columnsSettingsProp === null || columnsSettingsProp === void 0 ? void 0 : columnsSettingsProp.headerLabel,
185
+ t
186
+ }), [areAllColumnsEnabled, columnDefinitions, columnOrder, columnsSettingsProp === null || columnsSettingsProp === void 0 ? void 0 : columnsSettingsProp.headerLabel, t]);
151
187
  const columnPinning = (0, react_1.useMemo)(() => {
152
188
  var _a;
153
189
  const pinningState = {
@@ -176,6 +212,7 @@ function Table(_a) {
176
212
  columns: tableColumns,
177
213
  state: {
178
214
  columnPinning,
215
+ columnOrder,
179
216
  globalFilter,
180
217
  rowSelection,
181
218
  sorting,
@@ -199,6 +236,7 @@ function Table(_a) {
199
236
  });
200
237
  }
201
238
  },
239
+ onColumnOrderChange: setColumnOrder,
202
240
  manualSorting,
203
241
  manualPagination,
204
242
  manualFiltering,
@@ -236,7 +274,7 @@ function Table(_a) {
236
274
  loadingTable
237
275
  } = (0, hooks_1.useLoadingTable)({
238
276
  pageSize: Math.min(Math.max(pageSize, 5), constants_1.DEFAULT_PAGE_SIZE),
239
- columnDefinitions: tableColumns,
277
+ columnDefinitions: filteredColumnDefinitions,
240
278
  columnPinning
241
279
  });
242
280
  const handleOnRefresh = (0, react_1.useCallback)(() => {
@@ -350,9 +388,6 @@ function Table(_a) {
350
388
  const loadingTableRows = loadingTable.getRowModel().rows;
351
389
  const filteredTopRows = table.getState().globalFilter ? topRows.filter(tr => tableFilteredRowsIds.includes(tr.id)) : topRows;
352
390
  const centerRows = copyPinnedRows ? tableRows : tableCenterRows;
353
- const {
354
- t
355
- } = (0, locale_1.useLocale)('Table');
356
391
  const emptyStates = (0, helperComponents_1.useEmptyState)({
357
392
  noDataState,
358
393
  noResultsState,
@@ -369,6 +404,8 @@ function Table(_a) {
369
404
  updateCellMap
370
405
  } = (0, contexts_1.useCellAutoResizeController)(table);
371
406
  const showToolbar = !suppressToolbar;
407
+ const showColumnsSettings = Boolean(columnsSettingsProp === null || columnsSettingsProp === void 0 ? void 0 : columnsSettingsProp.headerLabel);
408
+ const enableColumnsOrderSortByDrag = Boolean(columnsSettingsProp === null || columnsSettingsProp === void 0 ? void 0 : columnsSettingsProp.enableDrag);
372
409
  return (0, jsx_runtime_1.jsxs)("div", Object.assign({
373
410
  className: (0, classnames_1.default)(styles_module_scss_1.default.wrapper, className)
374
411
  }, (0, utils_1.extractSupportProps)(rest), {
@@ -389,13 +426,17 @@ function Table(_a) {
389
426
  indeterminate: table.getIsSomePageRowsSelected(),
390
427
  onCheck: enableSelection ? handleOnToolbarCheck : undefined,
391
428
  outline: outline,
392
- after: toolbarAfter || exportSettings ? (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, {
429
+ after: toolbarAfter || exportSettings || showColumnsSettings ? (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, {
393
430
  children: [toolbarAfter, exportSettings && (0, jsx_runtime_1.jsx)(helperComponents_1.ExportButton, {
394
431
  settings: exportSettings,
395
432
  columnDefinitions: columnDefinitions,
396
433
  data: data,
397
434
  topRows: filteredTopRows,
398
435
  centerRows: centerRows
436
+ }), showColumnsSettings && (0, jsx_runtime_1.jsx)(helperComponents_1.ColumnsSettings, {
437
+ columnsSettings: columnsSettings,
438
+ enabledColumns: enabledColumns,
439
+ setEnabledColumns: setEnabledColumns
399
440
  })]
400
441
  }) : undefined,
401
442
  moreActions: moreActions,
@@ -414,41 +455,59 @@ function Table(_a) {
414
455
  value: {
415
456
  updateCellMap
416
457
  },
417
- children: (0, jsx_runtime_1.jsx)(helperComponents_1.TableContext.Provider, {
418
- value: {
419
- table
420
- },
421
- children: (!infiniteLoading || !data.length) && loading ? (0, jsx_runtime_1.jsxs)(skeleton_1.SkeletonContextProvider, {
422
- loading: true,
423
- children: [(0, jsx_runtime_1.jsx)(helperComponents_1.HeaderRow, {
424
- rowAutoHeight: rowAutoHeight
425
- }), loadingTableRows.map(row => (0, jsx_runtime_1.jsx)(helperComponents_1.BodyRow, {
426
- row: row,
427
- rowAutoHeight: rowAutoHeight
428
- }, row.id))]
429
- }) : (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, {
430
- children: [centerRows.length || filteredTopRows.length ? (0, jsx_runtime_1.jsx)(helperComponents_1.HeaderRow, {}) : null, filteredTopRows.length ? (0, jsx_runtime_1.jsx)("div", {
431
- className: styles_module_scss_1.default.topRowWrapper,
432
- children: filteredTopRows.map(row => (0, jsx_runtime_1.jsx)(helperComponents_1.BodyRow, {
458
+ children: (0, jsx_runtime_1.jsx)(core_1.DndContext, {
459
+ collisionDetection: core_1.closestCenter,
460
+ modifiers: [modifiers_1.restrictToHorizontalAxis],
461
+ onDragEnd: handleDragEnd,
462
+ sensors: sensors,
463
+ children: (0, jsx_runtime_1.jsx)(helperComponents_1.TableContext.Provider, {
464
+ value: {
465
+ table
466
+ },
467
+ children: (!infiniteLoading || !data.length) && loading ? (0, jsx_runtime_1.jsxs)(skeleton_1.SkeletonContextProvider, {
468
+ loading: true,
469
+ children: [(0, jsx_runtime_1.jsx)(helperComponents_1.HeaderRow, {
470
+ rowAutoHeight: rowAutoHeight,
471
+ columnOrder: columnOrder
472
+ }), loadingTableRows.map(row => (0, jsx_runtime_1.jsx)(helperComponents_1.BodyRow, {
473
+ row: row,
474
+ rowAutoHeight: rowAutoHeight,
475
+ columnOrder: columnOrder
476
+ }, row.id))]
477
+ }) : (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, {
478
+ children: [centerRows.length || filteredTopRows.length ? (0, jsx_runtime_1.jsx)(helperComponents_1.HeaderRow, {
479
+ rowAutoHeight: rowAutoHeight,
480
+ columnOrder: columnOrder,
481
+ enableColumnsOrderSortByDrag: enableColumnsOrderSortByDrag
482
+ }) : null, filteredTopRows.length ? (0, jsx_runtime_1.jsx)("div", {
483
+ className: styles_module_scss_1.default.topRowWrapper,
484
+ children: filteredTopRows.map(row => (0, jsx_runtime_1.jsx)(helperComponents_1.BodyRow, {
485
+ row: row,
486
+ onRowClick: onRowClick,
487
+ rowAutoHeight: rowAutoHeight,
488
+ columnOrder: columnOrder,
489
+ enableColumnsOrderSortByDrag: enableColumnsOrderSortByDrag
490
+ }, row.id))
491
+ }) : null, centerRows.map(row => (0, jsx_runtime_1.jsx)(helperComponents_1.BodyRow, {
433
492
  row: row,
434
493
  onRowClick: onRowClick,
435
- rowAutoHeight: rowAutoHeight
436
- }, row.id))
437
- }) : null, centerRows.map(row => (0, jsx_runtime_1.jsx)(helperComponents_1.BodyRow, {
438
- row: row,
439
- onRowClick: onRowClick,
440
- rowAutoHeight: rowAutoHeight
441
- }, row.id)), data.length > 0 && infiniteLoading && loading && !dataError && (0, jsx_runtime_1.jsx)(skeleton_1.SkeletonContextProvider, {
442
- loading: true,
443
- children: loadingTableRows.slice(0, 3).map(row => (0, jsx_runtime_1.jsx)(helperComponents_1.BodyRow, {
444
- row: row
445
- }, row.id))
446
- }), (0, jsx_runtime_1.jsx)(helperComponents_1.TableEmptyState, {
447
- emptyStates: emptyStates,
448
- dataError: dataError,
449
- dataFiltered: dataFiltered || Boolean(table.getState().globalFilter),
450
- tableRowsLength: tableRows.length + filteredTopRows.length
451
- })]
494
+ rowAutoHeight: rowAutoHeight,
495
+ columnOrder: columnOrder,
496
+ enableColumnsOrderSortByDrag: enableColumnsOrderSortByDrag
497
+ }, row.id)), data.length > 0 && infiniteLoading && loading && !dataError && (0, jsx_runtime_1.jsx)(skeleton_1.SkeletonContextProvider, {
498
+ loading: true,
499
+ children: loadingTableRows.slice(0, 3).map(row => (0, jsx_runtime_1.jsx)(helperComponents_1.BodyRow, {
500
+ row: row,
501
+ columnOrder: columnOrder,
502
+ enableColumnsOrderSortByDrag: enableColumnsOrderSortByDrag
503
+ }, row.id))
504
+ }), (0, jsx_runtime_1.jsx)(helperComponents_1.TableEmptyState, {
505
+ emptyStates: emptyStates,
506
+ dataError: dataError,
507
+ dataFiltered: dataFiltered || Boolean(table.getState().globalFilter),
508
+ tableRowsLength: tableRows.length + filteredTopRows.length
509
+ })]
510
+ })
452
511
  })
453
512
  })
454
513
  })
@@ -1,2 +1,3 @@
1
1
  export * from './useLoadingTable';
2
2
  export * from './useStateControl';
3
+ export * from './useColumnOrderByDrag';
@@ -23,4 +23,5 @@ Object.defineProperty(exports, "__esModule", {
23
23
  value: true
24
24
  });
25
25
  __exportStar(require("./useLoadingTable"), exports);
26
- __exportStar(require("./useStateControl"), exports);
26
+ __exportStar(require("./useStateControl"), exports);
27
+ __exportStar(require("./useColumnOrderByDrag"), exports);
@@ -0,0 +1,8 @@
1
+ import { DragEndEvent, SensorOptions } from '@dnd-kit/core';
2
+ import { ColumnDefinition } from '../../../types';
3
+ export declare function useColumnOrderByDrag<TData extends object>(tableColumns: ColumnDefinition<TData>[]): {
4
+ columnOrder: string[];
5
+ setColumnOrder: import("react").Dispatch<import("react").SetStateAction<string[]>>;
6
+ handleDragEnd: ({ active, over }: DragEndEvent) => void;
7
+ sensors: import("@dnd-kit/core").SensorDescriptor<SensorOptions>[];
8
+ };
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useColumnOrderByDrag = useColumnOrderByDrag;
7
+ const core_1 = require("@dnd-kit/core");
8
+ const sortable_1 = require("@dnd-kit/sortable");
9
+ const react_1 = require("react");
10
+ function prepareInitialState(tableColumns) {
11
+ return tableColumns.filter(column => column.pinned !== 'left' && column.pinned !== 'right').map(c => c.id);
12
+ }
13
+ const draggingOptions = {
14
+ activationConstraint: {
15
+ distance: 5 // Is required to differ click (sort) from drag
16
+ }
17
+ };
18
+ function useColumnOrderByDrag(tableColumns) {
19
+ const [columnOrder, setColumnOrder] = (0, react_1.useState)(() => prepareInitialState(tableColumns));
20
+ const handleDragEnd = (0, react_1.useCallback)(_ref => {
21
+ let {
22
+ active,
23
+ over
24
+ } = _ref;
25
+ if (!active || !over) {
26
+ return;
27
+ }
28
+ const activeId = active.id.toString();
29
+ const overId = over.id.toString();
30
+ if (activeId === overId) {
31
+ return;
32
+ }
33
+ if (!columnOrder.includes(overId)) {
34
+ return;
35
+ }
36
+ setColumnOrder(columnOrder => {
37
+ const oldIndex = columnOrder.indexOf(activeId);
38
+ const newIndex = columnOrder.indexOf(overId);
39
+ return (0, sortable_1.arrayMove)(columnOrder, oldIndex, newIndex);
40
+ });
41
+ }, [columnOrder]);
42
+ const sensors = (0, core_1.useSensors)((0, core_1.useSensor)(core_1.MouseSensor, draggingOptions), (0, core_1.useSensor)(core_1.TouchSensor, {}), (0, core_1.useSensor)(core_1.KeyboardSensor, {}));
43
+ return {
44
+ columnOrder,
45
+ setColumnOrder,
46
+ handleDragEnd,
47
+ sensors
48
+ };
49
+ }
@@ -1,3 +1,6 @@
1
+ import { GroupSelectItemProps } from '@snack-uikit/list';
2
+ import { useLocale } from '@snack-uikit/locale';
3
+ import { ColumnDefinition, FilterableColumnDefinition } from '../../types';
1
4
  export declare function getCurrentlyConfiguredHeaderWidth(id: string): number;
2
5
  export declare function getColumnStyleVars(id: string): {
3
6
  sizeKey: string;
@@ -14,4 +17,14 @@ type SaveStateToLocalStorageProps = {
14
17
  size: string;
15
18
  };
16
19
  export declare function saveStateToLocalStorage({ id, columnId, size }: SaveStateToLocalStorageProps): void;
20
+ export declare function isFilterableColumn<TData extends object>(colDef: ColumnDefinition<TData>): colDef is FilterableColumnDefinition<TData>;
21
+ export declare function prepareColumnsSettingsMap<TData extends object>(columnDefinitions: ColumnDefinition<TData>[]): string[];
22
+ type PrepareColumnsSettingsProps<TData extends object> = {
23
+ columnDefinitions: ColumnDefinition<TData>[];
24
+ columnOrder: string[];
25
+ areAllColumnsEnabled: boolean;
26
+ columnsSettingsHeader?: string;
27
+ t: ReturnType<typeof useLocale<'Table'>>['t'];
28
+ };
29
+ export declare function prepareColumnsSettings<TData extends object>({ columnDefinitions, columnOrder, columnsSettingsHeader, areAllColumnsEnabled, t, }: PrepareColumnsSettingsProps<TData>): [GroupSelectItemProps];
17
30
  export {};
@@ -7,6 +7,9 @@ exports.getCurrentlyConfiguredHeaderWidth = getCurrentlyConfiguredHeaderWidth;
7
7
  exports.getColumnStyleVars = getColumnStyleVars;
8
8
  exports.getInitColumnSizeFromLocalStorage = getInitColumnSizeFromLocalStorage;
9
9
  exports.saveStateToLocalStorage = saveStateToLocalStorage;
10
+ exports.isFilterableColumn = isFilterableColumn;
11
+ exports.prepareColumnsSettingsMap = prepareColumnsSettingsMap;
12
+ exports.prepareColumnsSettings = prepareColumnsSettings;
10
13
  const utils_1 = require("@snack-uikit/utils");
11
14
  function getCurrentlyConfiguredHeaderWidth(id) {
12
15
  if ((0, utils_1.isBrowser)()) {
@@ -56,4 +59,72 @@ function saveStateToLocalStorage(_ref2) {
56
59
  localStorage.setItem(id, JSON.stringify(Object.assign(Object.assign({}, savedStateFromStorage || {}), {
57
60
  resizeState: newResizeState
58
61
  })));
62
+ }
63
+ function isFilterableColumn(colDef) {
64
+ return 'id' in colDef && 'headerConfigLabel' in colDef;
65
+ }
66
+ function prepareColumnsSettingsMap(columnDefinitions) {
67
+ return columnDefinitions.filter(isFilterableColumn).map(colDef => colDef.id);
68
+ }
69
+ const sortColumnDefinitions = columnOrder => function sortColDefs(colDefA, colDefB) {
70
+ const indexItemA = columnOrder.findIndex(columnIndex => columnIndex === colDefA.id);
71
+ const indexItemB = columnOrder.findIndex(columnIndex => columnIndex === colDefB.id);
72
+ return indexItemA - indexItemB;
73
+ };
74
+ function createColumnsSettingsOption(columnDefinition) {
75
+ return {
76
+ id: columnDefinition.id,
77
+ content: {
78
+ option: columnDefinition.headerConfigLabel
79
+ },
80
+ switch: true,
81
+ showSwitchIcon: true
82
+ };
83
+ }
84
+ function prepareColumnsSettings(_ref3) {
85
+ let {
86
+ columnDefinitions,
87
+ columnOrder,
88
+ columnsSettingsHeader,
89
+ areAllColumnsEnabled,
90
+ t
91
+ } = _ref3;
92
+ const groupedItems = columnDefinitions.filter(isFilterableColumn).sort(sortColumnDefinitions(columnOrder)).reduce((accSettings, colDef) => {
93
+ const item = createColumnsSettingsOption(colDef);
94
+ switch (colDef.pinned) {
95
+ case 'left':
96
+ accSettings.pinTop.push(item);
97
+ break;
98
+ case 'right':
99
+ accSettings.pinBottom.push(item);
100
+ break;
101
+ default:
102
+ accSettings.unpinned.push(item);
103
+ }
104
+ return accSettings;
105
+ }, {
106
+ pinTop: [],
107
+ unpinned: [],
108
+ pinBottom: []
109
+ });
110
+ return [{
111
+ divider: false,
112
+ items: [{
113
+ divider: false,
114
+ items: groupedItems.pinTop,
115
+ type: 'group'
116
+ }, {
117
+ divider: true,
118
+ items: groupedItems.unpinned,
119
+ type: 'group'
120
+ }, {
121
+ divider: true,
122
+ items: groupedItems.pinBottom,
123
+ type: 'group'
124
+ }],
125
+ selectButtonLabel: areAllColumnsEnabled ? t('groupSelectButton.hide') : t('groupSelectButton.show'),
126
+ label: columnsSettingsHeader || 'Display settings',
127
+ mode: 'primary',
128
+ type: 'group-select'
129
+ }];
59
130
  }
@@ -1,7 +1,7 @@
1
1
  import { PaginationState, Row, RowPinningState, RowSelectionOptions, RowSelectionState, SortingState } from '@tanstack/react-table';
2
2
  import { ReactNode, RefObject } from 'react';
3
- import { ChipChoiceRowProps, FiltersState } from '@snack-uikit/chips';
4
- import { ToolbarProps } from '@snack-uikit/toolbar';
3
+ import { FiltersState } from '@snack-uikit/chips';
4
+ import { FilterRow, ToolbarProps } from '@snack-uikit/toolbar';
5
5
  import { WithSupportProps } from '@snack-uikit/utils';
6
6
  import { EmptyStateProps, ExportButtonProps, RowClickHandler } from '../helperComponents';
7
7
  import { TreeColumnDefinitionProps } from '../helperComponents/Cells/TreeCell';
@@ -30,6 +30,15 @@ type BaseTableProps<TData extends object, TFilters extends FiltersState = Record
30
30
  state?: SortingState;
31
31
  onChange?(state: SortingState): void;
32
32
  };
33
+ /** Параметры отвечают за настройки колонок <br>
34
+ * <strong>enableDrag</strong>: Включение сортировки порядка столбцов вручную перетаскиванием <br>
35
+ * <strong>headerLabel</strong>: Название меню настроек колонок. Наличие включает показ настроек <br>
36
+ * <strong>selectAllButtonLabels</strong>: Значения кнопки включения/отключения всех айтемов ([вкл, выкл]) <br>
37
+ * */
38
+ columnsSettings?: {
39
+ enableDrag?: boolean;
40
+ headerLabel?: string;
41
+ };
33
42
  /** Параметр отвечает за общие настройки раскрывающихся строк*/
34
43
  expanding?: {
35
44
  /** Метод отвечает за получение дочерних строк*/
@@ -80,7 +89,7 @@ type BaseTableProps<TData extends object, TFilters extends FiltersState = Record
80
89
  /** Внешний бордер для тулбара и таблицы */
81
90
  outline?: boolean;
82
91
  /** Фильтры */
83
- columnFilters?: ChipChoiceRowProps<TFilters>;
92
+ columnFilters?: FilterRow<TFilters>;
84
93
  /** Флаг, показывающий что данные были отфильтрованы при пустых данных */
85
94
  dataFiltered?: boolean;
86
95
  /** Флаг, показывающий что произошла ошибка запроса при пустых данных */
@@ -38,3 +38,4 @@ export declare const DEFAULT_PAGE_SIZE = 10;
38
38
  export declare const DEFAULT_SORTING: never[];
39
39
  export declare const DEFAULT_FILTER_VISIBILITY: never[];
40
40
  export declare const DEFAULT_ROW_SELECTION: {};
41
+ export declare const DEFAULT_COLUMNS: string[];
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.DEFAULT_ROW_SELECTION = exports.DEFAULT_FILTER_VISIBILITY = exports.DEFAULT_SORTING = exports.DEFAULT_PAGE_SIZE = exports.SORT_FN = exports.TEST_IDS = exports.COLUMN_ALIGN = exports.COLUMN_PIN_POSITION = void 0;
6
+ exports.DEFAULT_COLUMNS = exports.DEFAULT_ROW_SELECTION = exports.DEFAULT_FILTER_VISIBILITY = exports.DEFAULT_SORTING = exports.DEFAULT_PAGE_SIZE = exports.SORT_FN = exports.TEST_IDS = exports.COLUMN_ALIGN = exports.COLUMN_PIN_POSITION = void 0;
7
7
  exports.COLUMN_PIN_POSITION = {
8
8
  Left: 'left',
9
9
  Right: 'right'
@@ -43,4 +43,5 @@ exports.SORT_FN = {
43
43
  exports.DEFAULT_PAGE_SIZE = 10;
44
44
  exports.DEFAULT_SORTING = [];
45
45
  exports.DEFAULT_FILTER_VISIBILITY = [];
46
- exports.DEFAULT_ROW_SELECTION = {};
46
+ exports.DEFAULT_ROW_SELECTION = {};
47
+ exports.DEFAULT_COLUMNS = ['snack_predefined_statusColumn', 'selectionCell', 'rowActions'];
@@ -3,6 +3,7 @@ import { CellProps } from '../Cell';
3
3
  type BodyCellProps<TData> = Omit<CellProps, 'style' | 'children'> & {
4
4
  cell: TableCell<TData, unknown>;
5
5
  rowAutoHeight?: boolean;
6
+ isDraggable?: boolean;
6
7
  };
7
- export declare function BodyCell<TData>({ cell, className, rowAutoHeight, ...props }: BodyCellProps<TData>): import("react/jsx-runtime").JSX.Element;
8
+ export declare function BodyCell<TData>({ cell, className, rowAutoHeight, isDraggable, ...props }: BodyCellProps<TData>): import("react/jsx-runtime").JSX.Element;
8
9
  export {};
@@ -18,6 +18,7 @@ Object.defineProperty(exports, "__esModule", {
18
18
  });
19
19
  exports.BodyCell = BodyCell;
20
20
  const jsx_runtime_1 = require("react/jsx-runtime");
21
+ const sortable_1 = require("@dnd-kit/sortable");
21
22
  const react_table_1 = require("@tanstack/react-table");
22
23
  const classnames_1 = __importDefault(require("classnames"));
23
24
  const constants_1 = require("../../../constants");
@@ -28,12 +29,21 @@ function BodyCell(_a) {
28
29
  var {
29
30
  cell,
30
31
  className,
31
- rowAutoHeight
32
+ rowAutoHeight,
33
+ isDraggable
32
34
  } = _a,
33
- props = __rest(_a, ["cell", "className", "rowAutoHeight"]);
35
+ props = __rest(_a, ["cell", "className", "rowAutoHeight", "isDraggable"]);
34
36
  const columnDef = cell.column.columnDef;
35
- const style = (0, hooks_1.useCellSizes)(cell);
37
+ const style = (0, hooks_1.useCellSizes)(cell, {
38
+ isDraggable
39
+ });
40
+ const {
41
+ setNodeRef
42
+ } = (0, sortable_1.useSortable)({
43
+ id: cell.column.id
44
+ });
36
45
  return (0, jsx_runtime_1.jsx)(Cell_1.Cell, Object.assign({}, props, {
46
+ ref: setNodeRef,
37
47
  style: style,
38
48
  className: (0, classnames_1.default)(styles_module_scss_1.default.tableBodyCell, className, columnDef.cellClassName),
39
49
  "data-row-auto-height": rowAutoHeight || undefined,
@@ -5,6 +5,7 @@ type HeaderCellProps<TData> = Omit<CellProps, 'align' | 'children' | 'onClick' |
5
5
  header: Header<TData, unknown>;
6
6
  pinPosition?: ColumnPinPosition;
7
7
  rowAutoHeight?: boolean;
8
+ isDraggable?: boolean;
8
9
  };
9
- export declare function HeaderCell<TData>({ header, pinPosition, className, rowAutoHeight }: HeaderCellProps<TData>): import("react/jsx-runtime").JSX.Element;
10
+ export declare function HeaderCell<TData>({ header, pinPosition, className, rowAutoHeight, isDraggable, }: HeaderCellProps<TData>): import("react/jsx-runtime").JSX.Element;
10
11
  export {};