@snack-uikit/table 0.22.3-preview-5d095019.0 → 0.23.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.
- package/CHANGELOG.md +11 -0
- package/README.md +2 -4
- package/dist/components/Table/Table.d.ts +1 -1
- package/dist/components/Table/Table.js +2 -2
- package/dist/components/types.d.ts +0 -2
- package/dist/helperComponents/ExportButton/ExportButton.d.ts +8 -5
- package/dist/helperComponents/ExportButton/ExportButton.js +6 -6
- package/dist/helperComponents/Rows/BodyRow.d.ts +2 -4
- package/dist/helperComponents/Rows/BodyRow.js +2 -2
- package/dist/helperComponents/Rows/styles.module.css +1 -0
- package/package.json +2 -2
- package/src/components/Table/Table.tsx +2 -3
- package/src/components/types.ts +0 -3
- package/src/helperComponents/ExportButton/ExportButton.tsx +10 -13
- package/src/helperComponents/Rows/BodyRow.tsx +3 -5
- package/src/helperComponents/Rows/styles.module.scss +1 -0
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,17 @@
|
|
|
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.23.0 (2024-09-12)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### BREAKING CHANGES
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
* **FF-5443:** extracted export functions from component ([eba84e2](https://github.com/cloud-ru-tech/snack-uikit/commit/eba84e2a67efba27300c0a952890ea3cb61c8794))
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
6
17
|
## 0.22.2 (2024-09-06)
|
|
7
18
|
|
|
8
19
|
### Only dependencies have been changed
|
package/README.md
CHANGED
|
@@ -131,7 +131,7 @@ const columnDefinitions: ColumnDefinition<TableData>[] = [
|
|
|
131
131
|
| columnFilters | `ReactNode` | - | Фильтры |
|
|
132
132
|
| dataFiltered | `boolean` | - | |
|
|
133
133
|
| dataError | `boolean` | - | |
|
|
134
|
-
| exportSettings | `{ fileName: string;
|
|
134
|
+
| exportSettings | `{ fileName: string; filterData?: boolean; exportToCSV?(args: ExportProps<TData>): void; exportToXLSX?(args: ExportProps<TData>): void; }` | - | Настройки экспорта в тулбаре |
|
|
135
135
|
| moreActions | `Action[]` | - | Элементы выпадающего списка кнопки с действиями |
|
|
136
136
|
| noDataState | `EmptyStateProps` | - | Экран при отстутствии данных |
|
|
137
137
|
| noResultsState | `EmptyStateProps` | - | Экран при отстутствии результатов поиска или фильтров |
|
|
@@ -144,7 +144,6 @@ const columnDefinitions: ColumnDefinition<TableData>[] = [
|
|
|
144
144
|
| manualPagination | `boolean` | - | |
|
|
145
145
|
| manualFiltering | `boolean` | - | |
|
|
146
146
|
| getRowId | `(originalRow: TData, index: number, parent?: Row<TData>) => string` | - | Дополнительная функция используется для получения уникального идентификатора для любой заданной строки |
|
|
147
|
-
| getRowClassName | `(originalRow: TData, index: number, parent?: Row<TData>) => string` | - | Дополнительная функция используется для получения className для любой заданной строки |
|
|
148
147
|
| scrollRef | `RefObject<HTMLElement>` | - | Ссылка на элемент, обозначающий самый конец прокручиваемого списка |
|
|
149
148
|
| scrollContainerRef | `RefObject<HTMLElement>` | - | Ссылка на контейнер, который скроллится |
|
|
150
149
|
| rowPinning | `Pick<RowPinningState, "top">` | { top: [], } | Определение какие строки должны быть закреплены в таблице |
|
|
@@ -192,7 +191,7 @@ const columnDefinitions: ColumnDefinition<TableData>[] = [
|
|
|
192
191
|
| columnFilters | `ReactNode` | - | Фильтры |
|
|
193
192
|
| dataFiltered | `boolean` | - | |
|
|
194
193
|
| dataError | `boolean` | - | |
|
|
195
|
-
| exportSettings | `{ fileName: string;
|
|
194
|
+
| exportSettings | `{ fileName: string; filterData?: boolean; exportToCSV?(args: ExportProps<TData>): void; exportToXLSX?(args: ExportProps<TData>): void; }` | - | Настройки экспорта в тулбаре |
|
|
196
195
|
| moreActions | `Action[]` | - | Элементы выпадающего списка кнопки с действиями |
|
|
197
196
|
| noDataState | `EmptyStateProps` | - | Экран при отстутствии данных |
|
|
198
197
|
| noResultsState | `EmptyStateProps` | - | Экран при отстутствии результатов поиска или фильтров |
|
|
@@ -205,7 +204,6 @@ const columnDefinitions: ColumnDefinition<TableData>[] = [
|
|
|
205
204
|
| manualPagination | `boolean` | true | |
|
|
206
205
|
| manualFiltering | `boolean` | true | |
|
|
207
206
|
| getRowId | `(originalRow: TData, index: number, parent?: Row<TData>) => string` | - | Дополнительная функция используется для получения уникального идентификатора для любой заданной строки |
|
|
208
|
-
| getRowClassName | `(originalRow: TData, index: number, parent?: Row<TData>) => string` | - | Дополнительная функция используется для получения className для любой заданной строки |
|
|
209
207
|
| scrollRef | `RefObject<HTMLElement>` | - | Ссылка на элемент, обозначающий самый конец прокручиваемого списка |
|
|
210
208
|
| scrollContainerRef | `RefObject<HTMLElement>` | - | Ссылка на контейнер, который скроллится |
|
|
211
209
|
| rowPinning | `Pick<RowPinningState, "top">` | - | Определение какие строки должны быть закреплены в таблице |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { TableProps } from '../types';
|
|
2
2
|
/** Компонент таблицы */
|
|
3
|
-
export declare function Table<TData extends object>({ data, rowPinning, columnDefinitions, keepPinnedRows, copyPinnedRows, enableSelectPinned, rowSelection: rowSelectionProp, search, sorting: sortingProp, columnFilters, pagination: paginationProp, className, onRowClick, onRefresh, onDelete, pageSize, pageCount, loading, outline, moreActions, exportSettings, dataFiltered, dataError, noDataState, noResultsState, errorDataState, suppressToolbar, toolbarBefore, toolbarAfter, suppressPagination, manualSorting, manualPagination, manualFiltering, autoResetPageIndex, scrollRef, scrollContainerRef, getRowId,
|
|
3
|
+
export declare function Table<TData extends object>({ data, rowPinning, columnDefinitions, keepPinnedRows, copyPinnedRows, enableSelectPinned, rowSelection: rowSelectionProp, search, sorting: sortingProp, columnFilters, pagination: paginationProp, className, onRowClick, onRefresh, onDelete, pageSize, pageCount, loading, outline, moreActions, exportSettings, dataFiltered, dataError, noDataState, noResultsState, errorDataState, suppressToolbar, toolbarBefore, toolbarAfter, suppressPagination, manualSorting, manualPagination, manualFiltering, autoResetPageIndex, scrollRef, scrollContainerRef, getRowId, enableFuzzySearch, savedState, ...rest }: TableProps<TData>): import("react/jsx-runtime").JSX.Element;
|
|
4
4
|
export declare namespace Table {
|
|
5
5
|
var getStatusColumnDef: typeof import("../../helperComponents").getStatusColumnDef;
|
|
6
6
|
var statusAppearances: Record<string, string>;
|
|
@@ -30,7 +30,7 @@ import { getColumnStyleVars, getCurrentlyConfiguredHeaderWidth, getInitColumnSiz
|
|
|
30
30
|
export function Table(_a) {
|
|
31
31
|
var { data, rowPinning = {
|
|
32
32
|
top: [],
|
|
33
|
-
}, columnDefinitions, keepPinnedRows = false, copyPinnedRows = false, enableSelectPinned = false, rowSelection: rowSelectionProp, search, sorting: sortingProp, columnFilters, pagination: paginationProp, className, onRowClick, onRefresh, onDelete, pageSize = DEFAULT_PAGE_SIZE, pageCount, loading = false, outline = false, moreActions, exportSettings, dataFiltered, dataError, noDataState, noResultsState, errorDataState, suppressToolbar = false, toolbarBefore, toolbarAfter, suppressPagination = false, manualSorting = false, manualPagination = false, manualFiltering = false, autoResetPageIndex = false, scrollRef, scrollContainerRef, getRowId,
|
|
33
|
+
}, columnDefinitions, keepPinnedRows = false, copyPinnedRows = false, enableSelectPinned = false, rowSelection: rowSelectionProp, search, sorting: sortingProp, columnFilters, pagination: paginationProp, className, onRowClick, onRefresh, onDelete, pageSize = DEFAULT_PAGE_SIZE, pageCount, loading = false, outline = false, moreActions, exportSettings, dataFiltered, dataError, noDataState, noResultsState, errorDataState, suppressToolbar = false, toolbarBefore, toolbarAfter, suppressPagination = false, manualSorting = false, manualPagination = false, manualFiltering = false, autoResetPageIndex = false, scrollRef, scrollContainerRef, getRowId, enableFuzzySearch, savedState } = _a, rest = __rest(_a, ["data", "rowPinning", "columnDefinitions", "keepPinnedRows", "copyPinnedRows", "enableSelectPinned", "rowSelection", "search", "sorting", "columnFilters", "pagination", "className", "onRowClick", "onRefresh", "onDelete", "pageSize", "pageCount", "loading", "outline", "moreActions", "exportSettings", "dataFiltered", "dataError", "noDataState", "noResultsState", "errorDataState", "suppressToolbar", "toolbarBefore", "toolbarAfter", "suppressPagination", "manualSorting", "manualPagination", "manualFiltering", "autoResetPageIndex", "scrollRef", "scrollContainerRef", "getRowId", "enableFuzzySearch", "savedState"]);
|
|
34
34
|
const { state: globalFilter, onStateChange: onGlobalFilterChange } = useStateControl(search, '');
|
|
35
35
|
const { state: rowSelection, onStateChange: onRowSelectionChange } = useStateControl(rowSelectionProp, {});
|
|
36
36
|
const defaultPaginationState = useMemo(() => ({
|
|
@@ -222,7 +222,7 @@ export function Table(_a) {
|
|
|
222
222
|
onChange: onGlobalFilterChange,
|
|
223
223
|
loading: search === null || search === void 0 ? void 0 : search.loading,
|
|
224
224
|
placeholder: (search === null || search === void 0 ? void 0 : search.placeholder) || t('searchPlaceholder'),
|
|
225
|
-
}, checked: table.getIsAllPageRowsSelected(), indeterminate: table.getIsSomePageRowsSelected(), className: styles.toolbar, onRefresh: onRefresh ? handleOnRefresh : undefined, onDelete: enableSelection && onDelete ? handleOnDelete : undefined, onCheck: enableSelection ? handleOnCheck : undefined, outline: outline, selectionMode: (rowSelectionProp === null || rowSelectionProp === void 0 ? void 0 : rowSelectionProp.multiRow) ? 'multiple' : 'single', before: toolbarBefore, after: toolbarAfter || exportSettings ? (_jsxs(_Fragment, { children: [toolbarAfter, exportSettings && (_jsx(ExportButton, { settings: exportSettings, columnDefinitions: columnDefinitions, data: data, topRows: filteredTopRows, centerRows: centerRows }))] })) : undefined, moreActions: moreActions }), columnFilters && _jsxs("div", { className: styles.filtersWrapper, children: [" ", columnFilters, " "] })] })), _jsx("div", { className: styles.scrollWrapper, "data-outline": outline || undefined, children: _jsxs(Scroll, { size: 's', className: styles.table, ref: scrollContainerRef, children: [_jsx("div", { className: styles.tableContent, style: columnSizeVars, children: _jsx(TableContext.Provider, { value: { table }, children: loading ? (_jsxs(SkeletonContextProvider, { loading: true, children: [_jsx(HeaderRow, {}), loadingTableRows.map(row => (_jsx(BodyRow, { row: row }, row.id)))] })) : (_jsxs(_Fragment, { children: [centerRows.length || filteredTopRows.length ? _jsx(HeaderRow, {}) : null, filteredTopRows.length ? (_jsx("div", { className: styles.topRowWrapper, children: filteredTopRows.map(row => (_jsx(BodyRow, { row: row, onRowClick: onRowClick
|
|
225
|
+
}, checked: table.getIsAllPageRowsSelected(), indeterminate: table.getIsSomePageRowsSelected(), className: styles.toolbar, onRefresh: onRefresh ? handleOnRefresh : undefined, onDelete: enableSelection && onDelete ? handleOnDelete : undefined, onCheck: enableSelection ? handleOnCheck : undefined, outline: outline, selectionMode: (rowSelectionProp === null || rowSelectionProp === void 0 ? void 0 : rowSelectionProp.multiRow) ? 'multiple' : 'single', before: toolbarBefore, after: toolbarAfter || exportSettings ? (_jsxs(_Fragment, { children: [toolbarAfter, exportSettings && (_jsx(ExportButton, { settings: exportSettings, columnDefinitions: columnDefinitions, data: data, topRows: filteredTopRows, centerRows: centerRows }))] })) : undefined, moreActions: moreActions }), columnFilters && _jsxs("div", { className: styles.filtersWrapper, children: [" ", columnFilters, " "] })] })), _jsx("div", { className: styles.scrollWrapper, "data-outline": outline || undefined, children: _jsxs(Scroll, { size: 's', className: styles.table, ref: scrollContainerRef, children: [_jsx("div", { className: styles.tableContent, style: columnSizeVars, children: _jsx(TableContext.Provider, { value: { table }, children: loading ? (_jsxs(SkeletonContextProvider, { loading: true, children: [_jsx(HeaderRow, {}), loadingTableRows.map(row => (_jsx(BodyRow, { row: row }, row.id)))] })) : (_jsxs(_Fragment, { children: [centerRows.length || filteredTopRows.length ? _jsx(HeaderRow, {}) : null, filteredTopRows.length ? (_jsx("div", { className: styles.topRowWrapper, children: filteredTopRows.map(row => (_jsx(BodyRow, { row: row, onRowClick: onRowClick }, row.id))) })) : null, centerRows.map(row => (_jsx(BodyRow, { row: row, onRowClick: onRowClick }, 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 })] }) }), !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 }))] })) }));
|
|
226
226
|
}
|
|
227
227
|
Table.getStatusColumnDef = getStatusColumnDef;
|
|
228
228
|
Table.statusAppearances = STATUS_APPEARANCE;
|
|
@@ -115,8 +115,6 @@ export type TableProps<TData extends object> = WithSupportProps<{
|
|
|
115
115
|
manualFiltering?: boolean;
|
|
116
116
|
/** Дополнительная функция используется для получения уникального идентификатора для любой заданной строки */
|
|
117
117
|
getRowId?: (originalRow: TData, index: number, parent?: Row<TData>) => string;
|
|
118
|
-
/** Дополнительная функция используется для получения className для любой заданной строки */
|
|
119
|
-
getRowClassName?: (originalRow: TData, index: number, parent?: Row<TData>) => string;
|
|
120
118
|
/** Ссылка на элемент, обозначающий самый конец прокручиваемого списка */
|
|
121
119
|
scrollRef?: RefObject<HTMLElement>;
|
|
122
120
|
/** Ссылка на контейнер, который скроллится */
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { Row } from '@tanstack/react-table';
|
|
2
2
|
import { ColumnDefinition } from '../../types';
|
|
3
|
-
type
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
type ExportProps<TData> = {
|
|
4
|
+
fileName: string;
|
|
5
|
+
columnDefinitions: ColumnDefinition<TData>[];
|
|
6
|
+
data: TData[];
|
|
6
7
|
};
|
|
7
8
|
export type ExportButtonProps<TData extends object> = {
|
|
8
9
|
/** Данные для отрисовки */
|
|
@@ -12,10 +13,12 @@ export type ExportButtonProps<TData extends object> = {
|
|
|
12
13
|
settings: {
|
|
13
14
|
/** Название файла при экспорте */
|
|
14
15
|
fileName: string;
|
|
15
|
-
/** Доступные форматы экспорта */
|
|
16
|
-
format?: Format;
|
|
17
16
|
/** Настройка фильтрации данных */
|
|
18
17
|
filterData?: boolean;
|
|
18
|
+
/** Обработчик экспорта в CSV */
|
|
19
|
+
exportToCSV?(args: ExportProps<TData>): void;
|
|
20
|
+
/** Обработчик экспорта в XLSX */
|
|
21
|
+
exportToXLSX?(args: ExportProps<TData>): void;
|
|
19
22
|
};
|
|
20
23
|
topRows: Row<TData>[];
|
|
21
24
|
centerRows: Row<TData>[];
|
|
@@ -4,12 +4,10 @@ import { ButtonFunction } from '@snack-uikit/button';
|
|
|
4
4
|
import { DownloadSVG } from '@snack-uikit/icons';
|
|
5
5
|
import { Droplist } from '@snack-uikit/list';
|
|
6
6
|
import { useLocale } from '@snack-uikit/locale';
|
|
7
|
-
import { exportToCSV, exportToXLSX } from '../../exportTable';
|
|
8
7
|
export function ExportButton({ settings, data, columnDefinitions, topRows, centerRows, }) {
|
|
9
8
|
const [isOpen, setIsOpen] = useState(false);
|
|
10
9
|
const { t } = useLocale('Table');
|
|
11
10
|
const { fileName, filterData = true } = settings;
|
|
12
|
-
const format = Object.assign({ csv: true, xslx: true }, settings.format);
|
|
13
11
|
const filteredData = useMemo(() => {
|
|
14
12
|
let newData = data;
|
|
15
13
|
if (filterData) {
|
|
@@ -21,18 +19,20 @@ export function ExportButton({ settings, data, columnDefinitions, topRows, cente
|
|
|
21
19
|
{
|
|
22
20
|
content: { option: t('export') + 'CSV' },
|
|
23
21
|
onClick: () => {
|
|
24
|
-
|
|
22
|
+
var _a;
|
|
23
|
+
(_a = settings.exportToCSV) === null || _a === void 0 ? void 0 : _a.call(settings, { fileName, columnDefinitions, data: filteredData });
|
|
25
24
|
setIsOpen(false);
|
|
26
25
|
},
|
|
27
|
-
hidden: !
|
|
26
|
+
hidden: !settings.exportToCSV,
|
|
28
27
|
},
|
|
29
28
|
{
|
|
30
29
|
content: { option: t('export') + 'XLSX' },
|
|
31
30
|
onClick: () => {
|
|
32
|
-
|
|
31
|
+
var _a;
|
|
32
|
+
(_a = settings.exportToXLSX) === null || _a === void 0 ? void 0 : _a.call(settings, { fileName, columnDefinitions, data: filteredData });
|
|
33
33
|
setIsOpen(false);
|
|
34
34
|
},
|
|
35
|
-
hidden: !
|
|
35
|
+
hidden: !settings.exportToXLSX,
|
|
36
36
|
},
|
|
37
37
|
], children: _jsx(ButtonFunction, { size: 'm', icon: _jsx(DownloadSVG, {}) }) }));
|
|
38
38
|
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { Row as TableRow } from '@tanstack/react-table';
|
|
2
2
|
import { MouseEvent } from 'react';
|
|
3
|
-
import { TableProps } from '../../components';
|
|
4
3
|
export type RowInfo<TData> = {
|
|
5
4
|
id: string;
|
|
6
5
|
data: TData;
|
|
@@ -8,10 +7,9 @@ export type RowInfo<TData> = {
|
|
|
8
7
|
toggleSelected(value?: boolean): void;
|
|
9
8
|
};
|
|
10
9
|
export type RowClickHandler<TData> = (e: MouseEvent<HTMLDivElement>, row: RowInfo<TData>) => void;
|
|
11
|
-
type BodyRowProps<TData
|
|
10
|
+
type BodyRowProps<TData> = {
|
|
12
11
|
row: TableRow<TData>;
|
|
13
12
|
onRowClick?: RowClickHandler<TData>;
|
|
14
|
-
getRowClassName?: TableProps<TData>['getRowClassName'];
|
|
15
13
|
};
|
|
16
|
-
export declare function BodyRow<TData
|
|
14
|
+
export declare function BodyRow<TData>({ row, onRowClick }: BodyRowProps<TData>): import("react/jsx-runtime").JSX.Element;
|
|
17
15
|
export {};
|
|
@@ -7,7 +7,7 @@ import { useRowCells } from '../hooks';
|
|
|
7
7
|
import { PinnedCells } from './PinnedCells';
|
|
8
8
|
import { Row } from './Row';
|
|
9
9
|
import styles from './styles.module.css';
|
|
10
|
-
export function BodyRow({ row, onRowClick
|
|
10
|
+
export function BodyRow({ row, onRowClick }) {
|
|
11
11
|
const { pinnedLeft, pinnedRight, unpinned } = useRowCells(row);
|
|
12
12
|
const [dropListOpened, setDropListOpen] = useState(false);
|
|
13
13
|
const disabled = !row.getCanSelect();
|
|
@@ -21,5 +21,5 @@ export function BodyRow({ row, onRowClick, getRowClassName = () => '' }) {
|
|
|
21
21
|
toggleSelected: row.toggleSelected,
|
|
22
22
|
});
|
|
23
23
|
};
|
|
24
|
-
return (_jsx(RowContext.Provider, { value: { dropListOpened, setDropListOpen }, children: _jsxs(Row, { onClick: handleRowClick, "data-clickable": Boolean(onRowClick) || undefined, "data-disabled": disabled || undefined, "data-selected": row.getIsSelected() || undefined, "data-actions-opened": dropListOpened || undefined, "data-test-id": TEST_IDS.bodyRow, "data-row-id": row.id, className:
|
|
24
|
+
return (_jsx(RowContext.Provider, { value: { dropListOpened, setDropListOpen }, children: _jsxs(Row, { onClick: handleRowClick, "data-clickable": Boolean(onRowClick) || undefined, "data-disabled": disabled || undefined, "data-selected": row.getIsSelected() || undefined, "data-actions-opened": dropListOpened || undefined, "data-test-id": TEST_IDS.bodyRow, "data-row-id": row.id, className: styles.bodyRow, children: [pinnedLeft && (_jsx(PinnedCells, { position: COLUMN_PIN_POSITION.Left, children: pinnedLeft.map(cell => (_jsx(BodyCell, { cell: cell }, cell.id))) })), unpinned.map(cell => (_jsx(BodyCell, { cell: cell }, cell.id))), pinnedRight && (_jsx(PinnedCells, { position: COLUMN_PIN_POSITION.Right, children: pinnedRight.map(cell => (_jsx(BodyCell, { cell: cell }, cell.id))) }))] }) }));
|
|
25
25
|
}
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
6
|
"title": "Table",
|
|
7
|
-
"version": "0.
|
|
7
|
+
"version": "0.23.0",
|
|
8
8
|
"sideEffects": [
|
|
9
9
|
"*.css",
|
|
10
10
|
"*.woff",
|
|
@@ -57,5 +57,5 @@
|
|
|
57
57
|
"peerDependencies": {
|
|
58
58
|
"@snack-uikit/locale": "*"
|
|
59
59
|
},
|
|
60
|
-
"gitHead": "
|
|
60
|
+
"gitHead": "60765b1b755cca8059b07769849c3d70694ccea0"
|
|
61
61
|
}
|
|
@@ -89,7 +89,6 @@ export function Table<TData extends object>({
|
|
|
89
89
|
scrollRef,
|
|
90
90
|
scrollContainerRef,
|
|
91
91
|
getRowId,
|
|
92
|
-
getRowClassName,
|
|
93
92
|
enableFuzzySearch,
|
|
94
93
|
savedState,
|
|
95
94
|
|
|
@@ -392,13 +391,13 @@ export function Table<TData extends object>({
|
|
|
392
391
|
{filteredTopRows.length ? (
|
|
393
392
|
<div className={styles.topRowWrapper}>
|
|
394
393
|
{filteredTopRows.map(row => (
|
|
395
|
-
<BodyRow key={row.id} row={row} onRowClick={onRowClick}
|
|
394
|
+
<BodyRow key={row.id} row={row} onRowClick={onRowClick} />
|
|
396
395
|
))}
|
|
397
396
|
</div>
|
|
398
397
|
) : null}
|
|
399
398
|
|
|
400
399
|
{centerRows.map(row => (
|
|
401
|
-
<BodyRow key={row.id} row={row} onRowClick={onRowClick}
|
|
400
|
+
<BodyRow key={row.id} row={row} onRowClick={onRowClick} />
|
|
402
401
|
))}
|
|
403
402
|
|
|
404
403
|
<TableEmptyState
|
package/src/components/types.ts
CHANGED
|
@@ -146,9 +146,6 @@ export type TableProps<TData extends object> = WithSupportProps<{
|
|
|
146
146
|
/** Дополнительная функция используется для получения уникального идентификатора для любой заданной строки */
|
|
147
147
|
getRowId?: (originalRow: TData, index: number, parent?: Row<TData>) => string;
|
|
148
148
|
|
|
149
|
-
/** Дополнительная функция используется для получения className для любой заданной строки */
|
|
150
|
-
getRowClassName?: (originalRow: TData, index: number, parent?: Row<TData>) => string;
|
|
151
|
-
|
|
152
149
|
/** Ссылка на элемент, обозначающий самый конец прокручиваемого списка */
|
|
153
150
|
scrollRef?: RefObject<HTMLElement>;
|
|
154
151
|
/** Ссылка на контейнер, который скроллится */
|
|
@@ -6,13 +6,9 @@ import { DownloadSVG } from '@snack-uikit/icons';
|
|
|
6
6
|
import { Droplist } from '@snack-uikit/list';
|
|
7
7
|
import { useLocale } from '@snack-uikit/locale';
|
|
8
8
|
|
|
9
|
-
import { exportToCSV, exportToXLSX } from '../../exportTable';
|
|
10
9
|
import { ColumnDefinition } from '../../types';
|
|
11
10
|
|
|
12
|
-
type
|
|
13
|
-
csv?: boolean;
|
|
14
|
-
xslx?: boolean;
|
|
15
|
-
};
|
|
11
|
+
type ExportProps<TData> = { fileName: string; columnDefinitions: ColumnDefinition<TData>[]; data: TData[] };
|
|
16
12
|
|
|
17
13
|
export type ExportButtonProps<TData extends object> = {
|
|
18
14
|
/** Данные для отрисовки */
|
|
@@ -24,11 +20,13 @@ export type ExportButtonProps<TData extends object> = {
|
|
|
24
20
|
/** Название файла при экспорте */
|
|
25
21
|
fileName: string;
|
|
26
22
|
|
|
27
|
-
/** Доступные форматы экспорта */
|
|
28
|
-
format?: Format;
|
|
29
|
-
|
|
30
23
|
/** Настройка фильтрации данных */
|
|
31
24
|
filterData?: boolean;
|
|
25
|
+
|
|
26
|
+
/** Обработчик экспорта в CSV */
|
|
27
|
+
exportToCSV?(args: ExportProps<TData>): void;
|
|
28
|
+
/** Обработчик экспорта в XLSX */
|
|
29
|
+
exportToXLSX?(args: ExportProps<TData>): void;
|
|
32
30
|
};
|
|
33
31
|
|
|
34
32
|
topRows: Row<TData>[];
|
|
@@ -46,7 +44,6 @@ export function ExportButton<TData extends object>({
|
|
|
46
44
|
const { t } = useLocale('Table');
|
|
47
45
|
|
|
48
46
|
const { fileName, filterData = true } = settings;
|
|
49
|
-
const format: Format = Object.assign({ csv: true, xslx: true }, settings.format);
|
|
50
47
|
|
|
51
48
|
const filteredData = useMemo(() => {
|
|
52
49
|
let newData = data;
|
|
@@ -69,18 +66,18 @@ export function ExportButton<TData extends object>({
|
|
|
69
66
|
{
|
|
70
67
|
content: { option: t('export') + 'CSV' },
|
|
71
68
|
onClick: () => {
|
|
72
|
-
exportToCSV
|
|
69
|
+
settings.exportToCSV?.({ fileName, columnDefinitions, data: filteredData });
|
|
73
70
|
setIsOpen(false);
|
|
74
71
|
},
|
|
75
|
-
hidden: !
|
|
72
|
+
hidden: !settings.exportToCSV,
|
|
76
73
|
},
|
|
77
74
|
{
|
|
78
75
|
content: { option: t('export') + 'XLSX' },
|
|
79
76
|
onClick: () => {
|
|
80
|
-
exportToXLSX
|
|
77
|
+
settings.exportToXLSX?.({ fileName, columnDefinitions, data: filteredData });
|
|
81
78
|
setIsOpen(false);
|
|
82
79
|
},
|
|
83
|
-
hidden: !
|
|
80
|
+
hidden: !settings.exportToXLSX,
|
|
84
81
|
},
|
|
85
82
|
]}
|
|
86
83
|
>
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { Row as TableRow } from '@tanstack/react-table';
|
|
2
2
|
import { MouseEvent, useState } from 'react';
|
|
3
3
|
|
|
4
|
-
import { TableProps } from '../../components';
|
|
5
4
|
import { COLUMN_PIN_POSITION, TEST_IDS } from '../../constants';
|
|
6
5
|
import { BodyCell } from '../Cells';
|
|
7
6
|
import { RowContext } from '../contexts';
|
|
@@ -19,13 +18,12 @@ export type RowInfo<TData> = {
|
|
|
19
18
|
|
|
20
19
|
export type RowClickHandler<TData> = (e: MouseEvent<HTMLDivElement>, row: RowInfo<TData>) => void;
|
|
21
20
|
|
|
22
|
-
type BodyRowProps<TData
|
|
21
|
+
type BodyRowProps<TData> = {
|
|
23
22
|
row: TableRow<TData>;
|
|
24
23
|
onRowClick?: RowClickHandler<TData>;
|
|
25
|
-
getRowClassName?: TableProps<TData>['getRowClassName'];
|
|
26
24
|
};
|
|
27
25
|
|
|
28
|
-
export function BodyRow<TData
|
|
26
|
+
export function BodyRow<TData>({ row, onRowClick }: BodyRowProps<TData>) {
|
|
29
27
|
const { pinnedLeft, pinnedRight, unpinned } = useRowCells(row);
|
|
30
28
|
|
|
31
29
|
const [dropListOpened, setDropListOpen] = useState(false);
|
|
@@ -53,7 +51,7 @@ export function BodyRow<TData extends object>({ row, onRowClick, getRowClassName
|
|
|
53
51
|
data-actions-opened={dropListOpened || undefined}
|
|
54
52
|
data-test-id={TEST_IDS.bodyRow}
|
|
55
53
|
data-row-id={row.id}
|
|
56
|
-
className={
|
|
54
|
+
className={styles.bodyRow}
|
|
57
55
|
>
|
|
58
56
|
{pinnedLeft && (
|
|
59
57
|
<PinnedCells position={COLUMN_PIN_POSITION.Left}>
|