@snack-uikit/table 0.19.5 → 0.19.6-preview-610aeb53.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/README.md CHANGED
@@ -111,14 +111,16 @@ const columnDefinitions: ColumnDefinition<TableData>[] = [
111
111
  |------|------|---------------|-------------|
112
112
  | columnDefinitions* | `ColumnDefinition<TData>[]` | - | Определение внешнего вида и функционала колонок |
113
113
  | data* | `TData[]` | - | Данные для отрисовки |
114
- | keepPinnedRows | `boolean` | - | Параметр овтечает за сохранение закрепленных строк на всех страницах таблицы |
115
- | enableSelectPinned | `boolean` | - | Параметр овтечает за чекбокс выбора закрепленных строк |
114
+ | keepPinnedRows | `boolean` | - | Параметр отвечает за отображение закрепленных строк на всех страницах таблицы |
115
+ | copyPinnedRows | `boolean` | - | Параметр отвечает за сохранение закрепленных строк в теле таблицы |
116
+ | enableSelectPinned | `boolean` | - | Параметр отвечает за чекбокс выбора закрепленных строк |
116
117
  | sorting | `{ initialState?: SortingState; state?: SortingState; onChange?(state: SortingState): void; }` | - | Параметры отвечают за возможность сортировки, их стоит использовать если нужно отслеживать состояние <br> <strong>initialState</strong>: Начальное состояние сортировки <br> <strong>state</strong>: Состояние сортировки, жестко устанавливаемое снаружи <br> <strong>onChange</strong>: Колбэк на изменение сортировки |
117
118
  | 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>: Колбэк на выбор строк |
118
119
  | 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 строки поиска |
119
120
  | enableFuzzySearch | `boolean` | - | Включить нечеткий поиск |
120
121
  | pageSize | `number` | 10 | Максимальное кол-во строк на страницу |
121
- | pagination | `{ state?: PaginationState; options?: number[]; optionsLabel?: string; onChange?(state: PaginationState): void; }` | 'Rows volume: ' <br> <strong>onChange</strong>: Колбэк на изменение пагинации | Параметры отвечают за пагинацию в таблице <br> <strong>state</strong>: Состояние строки поиска, жестко устанавливаемое снаружи <br> <strong>options</strong>: Варианты в выпадающем селекторе для установки кол-ва строк на страницу <br> <strong>optionsLabel</strong>: Текст для селектора кол-ва строк на страницу |
122
+ | pagination | `{ state?: PaginationState; options?: number[]; optionsLabel?: string; onChange?(state: PaginationState): void; optionsRender?(value: string \| number, idx: number): string \| number; }` | 'Rows volume: ' <br> <strong>onChange</strong>: Колбэк на изменение пагинации | Параметры отвечают за пагинацию в таблице <br> <strong>state</strong>: Состояние строки поиска, жестко устанавливаемое снаружи <br> <strong>options</strong>: Варианты в выпадающем селекторе для установки кол-ва строк на страницу <br> <strong>optionsLabel</strong>: Текст для селектора кол-ва строк на страницу |
123
+ | autoResetPageIndex | `boolean` | - | Автоматический сброс пагинации к первой странице при изменении данных или состояния (e.g фильтры, сортировки, и т.д) |
122
124
  | pageCount | `number` | - | Кол-во страниц (используется для внешнего управления) |
123
125
  | onRowClick | `RowClickHandler<TData>` | - | Колбэк клика по строке |
124
126
  | className | `string` | - | CSS-класс |
@@ -171,11 +173,13 @@ const columnDefinitions: ColumnDefinition<TableData>[] = [
171
173
  | onChangePage* | `(offset: number, limit: number) => void` | - | |
172
174
  | columnDefinitions* | `ColumnDefinition<TData>[]` | - | Определение внешнего вида и функционала колонок |
173
175
  | loading | `boolean` | - | Состояние загрузки |
174
- | keepPinnedRows | `boolean` | - | Параметр овтечает за сохранение закрепленных строк на всех страницах таблицы |
175
- | enableSelectPinned | `boolean` | - | Параметр овтечает за чекбокс выбора закрепленных строк |
176
+ | keepPinnedRows | `boolean` | false | Параметр отвечает за отображение закрепленных строк на всех страницах таблицы |
177
+ | copyPinnedRows | `boolean` | false | Параметр отвечает за сохранение закрепленных строк в теле таблицы |
178
+ | enableSelectPinned | `boolean` | - | Параметр отвечает за чекбокс выбора закрепленных строк |
176
179
  | sorting | `{ initialState?: SortingState; state?: SortingState; onChange?(state: SortingState): void; }` | - | Параметры отвечают за возможность сортировки, их стоит использовать если нужно отслеживать состояние <br> <strong>initialState</strong>: Начальное состояние сортировки <br> <strong>state</strong>: Состояние сортировки, жестко устанавливаемое снаружи <br> <strong>onChange</strong>: Колбэк на изменение сортировки |
177
180
  | 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>: Колбэк на выбор строк |
178
181
  | enableFuzzySearch | `boolean` | - | Включить нечеткий поиск |
182
+ | autoResetPageIndex | `boolean` | - | Автоматический сброс пагинации к первой странице при изменении данных или состояния (e.g фильтры, сортировки, и т.д) |
179
183
  | onRowClick | `RowClickHandler<TData>` | - | Колбэк клика по строке |
180
184
  | className | `string` | - | CSS-класс |
181
185
  | onRefresh | `() => void` | - | Колбек обновления данных |
@@ -1,6 +1,6 @@
1
1
  import { TableProps } from '../types';
2
2
  /** Компонент таблицы */
3
- export declare function Table<TData extends object>({ data, rowPinning, columnDefinitions, keepPinnedRows, enableSelectPinned, rowSelection: rowSelectionProp, search, sorting: sortingProp, columnFilters, pagination: paginationProp, className, onRowClick, onRefresh, onDelete, pageSize, pageCount, loading, outline, moreActions, exportFileName, dataFiltered, dataError, noDataState, noResultsState, errorDataState, suppressToolbar, toolbarBefore, toolbarAfter, suppressPagination, manualSorting, manualPagination, manualFiltering, scrollRef, scrollContainerRef, getRowId, enableFuzzySearch, ...rest }: TableProps<TData>): import("react/jsx-runtime").JSX.Element;
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, exportFileName, dataFiltered, dataError, noDataState, noResultsState, errorDataState, suppressToolbar, toolbarBefore, toolbarAfter, suppressPagination, manualSorting, manualPagination, manualFiltering, autoResetPageIndex, scrollRef, scrollContainerRef, getRowId, enableFuzzySearch, ...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: {
@@ -30,7 +30,7 @@ import { getColumnStyleVars, getCurrentlyConfiguredHeaderWidth } from './utils';
30
30
  export function Table(_a) {
31
31
  var { data, rowPinning = {
32
32
  top: [],
33
- }, columnDefinitions, keepPinnedRows = 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, exportFileName, dataFiltered, dataError, noDataState, noResultsState, errorDataState, suppressToolbar = false, toolbarBefore, toolbarAfter, suppressPagination = false, manualSorting = false, manualPagination = false, manualFiltering = false, scrollRef, scrollContainerRef, getRowId, enableFuzzySearch } = _a, rest = __rest(_a, ["data", "rowPinning", "columnDefinitions", "keepPinnedRows", "enableSelectPinned", "rowSelection", "search", "sorting", "columnFilters", "pagination", "className", "onRowClick", "onRefresh", "onDelete", "pageSize", "pageCount", "loading", "outline", "moreActions", "exportFileName", "dataFiltered", "dataError", "noDataState", "noResultsState", "errorDataState", "suppressToolbar", "toolbarBefore", "toolbarAfter", "suppressPagination", "manualSorting", "manualPagination", "manualFiltering", "scrollRef", "scrollContainerRef", "getRowId", "enableFuzzySearch"]);
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, exportFileName, dataFiltered, dataError, noDataState, noResultsState, errorDataState, suppressToolbar = false, toolbarBefore, toolbarAfter, suppressPagination = false, manualSorting = false, manualPagination = false, manualFiltering = false, autoResetPageIndex = false, scrollRef, scrollContainerRef, getRowId, enableFuzzySearch } = _a, rest = __rest(_a, ["data", "rowPinning", "columnDefinitions", "keepPinnedRows", "copyPinnedRows", "enableSelectPinned", "rowSelection", "search", "sorting", "columnFilters", "pagination", "className", "onRowClick", "onRefresh", "onDelete", "pageSize", "pageCount", "loading", "outline", "moreActions", "exportFileName", "dataFiltered", "dataError", "noDataState", "noResultsState", "errorDataState", "suppressToolbar", "toolbarBefore", "toolbarAfter", "suppressPagination", "manualSorting", "manualPagination", "manualFiltering", "autoResetPageIndex", "scrollRef", "scrollContainerRef", "getRowId", "enableFuzzySearch"]);
34
34
  const { state: globalFilter, onStateChange: onGlobalFilterChange } = useStateControl(search, '');
35
35
  const { state: rowSelection, onStateChange: onRowSelectionChange } = useStateControl(rowSelectionProp, {});
36
36
  const defaultPaginationState = useMemo(() => ({
@@ -93,13 +93,17 @@ export function Table(_a) {
93
93
  onSortingChange,
94
94
  getSortedRowModel: getSortedRowModel(),
95
95
  onPaginationChange,
96
- autoResetPageIndex: false,
96
+ autoResetPageIndex,
97
97
  getPaginationRowModel: getPaginationRowModel(),
98
98
  getCoreRowModel: getCoreRowModel(),
99
99
  columnResizeMode: 'onEnd',
100
100
  keepPinnedRows,
101
101
  });
102
- const { loadingTable } = useLoadingTable({ pageSize, columnDefinitions: tableColumns, columnPinning });
102
+ const { loadingTable } = useLoadingTable({
103
+ pageSize: Math.min(Math.max(pageSize, 5), DEFAULT_PAGE_SIZE),
104
+ columnDefinitions: tableColumns,
105
+ columnPinning,
106
+ });
103
107
  const handleOnRefresh = useCallback(() => {
104
108
  table.resetRowSelection();
105
109
  onRefresh === null || onRefresh === void 0 ? void 0 : onRefresh();
@@ -113,15 +117,22 @@ export function Table(_a) {
113
117
  }
114
118
  }, [loading, onDelete, table]);
115
119
  const handleOnCheck = useCallback(() => {
116
- if (!loading && (rowSelectionProp === null || rowSelectionProp === void 0 ? void 0 : rowSelectionProp.multiRow)) {
117
- table.toggleAllPageRowsSelected();
120
+ if (!loading && !enableSelectPinned && table.getTopRows().length) {
121
+ const centerRows = table.getCenterRows();
122
+ const isSomeRowsSelected = table.getIsSomePageRowsSelected();
123
+ const isAllCenterRowsSelected = centerRows.every(row => row.getIsSelected());
124
+ if (isAllCenterRowsSelected) {
125
+ table.resetRowSelection();
126
+ return;
127
+ }
128
+ centerRows.forEach(row => row.toggleSelected(isSomeRowsSelected ? true : undefined));
118
129
  return;
119
130
  }
120
- if (!loading && table.getIsSomePageRowsSelected()) {
121
- table.resetRowSelection();
131
+ if (!loading && (rowSelectionProp === null || rowSelectionProp === void 0 ? void 0 : rowSelectionProp.multiRow)) {
132
+ table.toggleAllPageRowsSelected();
122
133
  return;
123
134
  }
124
- }, [loading, rowSelectionProp === null || rowSelectionProp === void 0 ? void 0 : rowSelectionProp.multiRow, table]);
135
+ }, [loading, rowSelectionProp === null || rowSelectionProp === void 0 ? void 0 : rowSelectionProp.multiRow, table, enableSelectPinned]);
125
136
  const columnSizeVarsRef = useRef();
126
137
  const headers = table.getFlatHeaders();
127
138
  const columnSizeVars = useMemo(() => {
@@ -184,6 +195,7 @@ export function Table(_a) {
184
195
  maximumAvailablePage: pageCount || data.length / pagination.pageSize,
185
196
  pagination,
186
197
  onPaginationChange,
198
+ autoResetPageIndex,
187
199
  });
188
200
  return (_jsx(_Fragment, { children: _jsxs("div", Object.assign({ style: {
189
201
  '--page-size': cssPageSize,
@@ -192,7 +204,7 @@ export function Table(_a) {
192
204
  onChange: onGlobalFilterChange,
193
205
  loading: search === null || search === void 0 ? void 0 : search.loading,
194
206
  placeholder: (search === null || search === void 0 ? void 0 : search.placeholder) || t('searchPlaceholder'),
195
- }, 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 || exportFileName ? (_jsxs(_Fragment, { children: [toolbarAfter, exportFileName && (_jsx(ExportButton, { fileName: exportFileName, columnDefinitions: columnDefinitions, data: data }))] })) : 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: [tableCenterRows.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, tableCenterRows.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 })] })) }) }), _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 }))] })) }));
207
+ }, 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 || exportFileName ? (_jsxs(_Fragment, { children: [toolbarAfter, exportFileName && (_jsx(ExportButton, { fileName: exportFileName, columnDefinitions: columnDefinitions, data: data }))] })) : 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: [tableCenterRows.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, (copyPinnedRows ? tableRows : tableCenterRows).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 }))] })) }));
196
208
  }
197
209
  Table.getStatusColumnDef = getStatusColumnDef;
198
210
  Table.statusAppearances = STATUS_APPEARANCE;
@@ -4,6 +4,7 @@ type UsePageResetProps = {
4
4
  maximumAvailablePage: number;
5
5
  pagination: PaginationState;
6
6
  onPaginationChange(state: PaginationState): void;
7
+ autoResetPageIndex: boolean;
7
8
  };
8
- export declare function usePageReset({ manualPagination, pagination, maximumAvailablePage, onPaginationChange, }: UsePageResetProps): void;
9
+ export declare function usePageReset({ manualPagination, pagination, maximumAvailablePage, onPaginationChange, autoResetPageIndex, }: UsePageResetProps): void;
9
10
  export {};
@@ -1,9 +1,11 @@
1
1
  import { useEffect } from 'react';
2
- export function usePageReset({ manualPagination, pagination, maximumAvailablePage, onPaginationChange, }) {
2
+ export function usePageReset({ manualPagination, pagination, maximumAvailablePage, onPaginationChange, autoResetPageIndex, }) {
3
3
  useEffect(() => {
4
+ if (autoResetPageIndex)
5
+ return;
4
6
  const { pageIndex } = pagination;
5
7
  if (!manualPagination && pageIndex > 0 && pageIndex >= maximumAvailablePage) {
6
8
  onPaginationChange(Object.assign(Object.assign({}, pagination), { pageIndex: 0 }));
7
9
  }
8
- }, [maximumAvailablePage, manualPagination, onPaginationChange, pagination]);
10
+ }, [maximumAvailablePage, manualPagination, onPaginationChange, pagination, autoResetPageIndex]);
9
11
  }
@@ -9,9 +9,11 @@ export type TableProps<TData extends object> = WithSupportProps<{
9
9
  data: TData[];
10
10
  /** Определение внешнего вида и функционала колонок */
11
11
  columnDefinitions: ColumnDefinition<TData>[];
12
- /** Параметр овтечает за сохранение закрепленных строк на всех страницах таблицы */
12
+ /** Параметр отвечает за отображение закрепленных строк на всех страницах таблицы @default false*/
13
13
  keepPinnedRows?: boolean;
14
- /** Параметр овтечает за чекбокс выбора закрепленных строк */
14
+ /** Параметр отвечает за сохранение закрепленных строк в теле таблицы @default false*/
15
+ copyPinnedRows?: boolean;
16
+ /** Параметр отвечает за чекбокс выбора закрепленных строк */
15
17
  enableSelectPinned?: boolean;
16
18
  /** Параметры отвечают за возможность сортировки, их стоит использовать если нужно отслеживать состояние <br>
17
19
  * <strong>initialState</strong>: Начальное состояние сортировки <br>
@@ -66,7 +68,12 @@ export type TableProps<TData extends object> = WithSupportProps<{
66
68
  options?: number[];
67
69
  optionsLabel?: string;
68
70
  onChange?(state: PaginationState): void;
71
+ optionsRender?(value: string | number, idx: number): string | number;
69
72
  };
73
+ /** Автоматический сброс пагинации к первой странице при изменении данных или состояния
74
+ * (e.g фильтры, сортировки, и т.д)
75
+ * */
76
+ autoResetPageIndex?: boolean;
70
77
  /** Кол-во страниц (используется для внешнего управления) */
71
78
  pageCount?: number;
72
79
  /** Колбэк клика по строке */
@@ -3,6 +3,7 @@ export type TablePaginationProps<TData> = {
3
3
  table: Table<TData>;
4
4
  options?: number[];
5
5
  optionsLabel?: string;
6
+ optionsRender?(value: number, idx: number): string | number;
6
7
  pageCount?: number;
7
8
  };
8
- export declare function TablePagination<TData>({ table, options: optionsProp, optionsLabel: optionsLabelProp, }: TablePaginationProps<TData>): import("react/jsx-runtime").JSX.Element | null;
9
+ export declare function TablePagination<TData>({ table, options: optionsProp, optionsLabel: optionsLabelProp, optionsRender, }: TablePaginationProps<TData>): import("react/jsx-runtime").JSX.Element | null;
@@ -4,7 +4,7 @@ import { ChipChoice } from '@snack-uikit/chips';
4
4
  import { useLocale } from '@snack-uikit/locale';
5
5
  import { Pagination } from '@snack-uikit/pagination';
6
6
  import styles from './styles.module.css';
7
- export function TablePagination({ table, options: optionsProp, optionsLabel: optionsLabelProp, }) {
7
+ export function TablePagination({ table, options: optionsProp, optionsLabel: optionsLabelProp, optionsRender, }) {
8
8
  const { t } = useLocale('Table');
9
9
  const optionsLabel = optionsLabelProp !== null && optionsLabelProp !== void 0 ? optionsLabelProp : t('rowsOptionsLabel');
10
10
  const handlePaginationOnChange = useCallback((pageIndex) => {
@@ -13,7 +13,10 @@ export function TablePagination({ table, options: optionsProp, optionsLabel: opt
13
13
  const handleRowsVolumeOnChange = useCallback((value) => {
14
14
  table.setPageSize(Number(value));
15
15
  }, [table]);
16
- const options = useMemo(() => optionsProp === null || optionsProp === void 0 ? void 0 : optionsProp.sort((a, b) => a - b).map(value => ({ label: String(value), value: String(value) })), [optionsProp]);
16
+ const options = useMemo(() => optionsProp === null || optionsProp === void 0 ? void 0 : optionsProp.sort((a, b) => a - b).map((value, idx) => ({
17
+ label: String(optionsRender ? optionsRender(value, idx) : value),
18
+ value: String(value),
19
+ })), [optionsProp, optionsRender]);
17
20
  const tablePaginationState = table.getState().pagination;
18
21
  if (table.getPageCount() <= 1 && !options) {
19
22
  return null;
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "access": "public"
5
5
  },
6
6
  "title": "Table",
7
- "version": "0.19.5",
7
+ "version": "0.19.6-preview-610aeb53.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": "0c81fa6b2657f51768401ba7ce5015fe8d293805"
60
+ "gitHead": "e904a32e742677e77a9f66cfb9d6fd5fbd82968a"
61
61
  }
@@ -51,6 +51,7 @@ export function Table<TData extends object>({
51
51
  },
52
52
  columnDefinitions,
53
53
  keepPinnedRows = false,
54
+ copyPinnedRows = false,
54
55
  enableSelectPinned = false,
55
56
  rowSelection: rowSelectionProp,
56
57
  search,
@@ -79,6 +80,7 @@ export function Table<TData extends object>({
79
80
  manualSorting = false,
80
81
  manualPagination = false,
81
82
  manualFiltering = false,
83
+ autoResetPageIndex = false,
82
84
  scrollRef,
83
85
  scrollContainerRef,
84
86
  getRowId,
@@ -164,14 +166,18 @@ export function Table<TData extends object>({
164
166
  onSortingChange,
165
167
  getSortedRowModel: getSortedRowModel(),
166
168
  onPaginationChange,
167
- autoResetPageIndex: false,
169
+ autoResetPageIndex,
168
170
  getPaginationRowModel: getPaginationRowModel(),
169
171
  getCoreRowModel: getCoreRowModel(),
170
172
  columnResizeMode: 'onEnd',
171
173
  keepPinnedRows,
172
174
  });
173
175
 
174
- const { loadingTable } = useLoadingTable({ pageSize, columnDefinitions: tableColumns, columnPinning });
176
+ const { loadingTable } = useLoadingTable({
177
+ pageSize: Math.min(Math.max(pageSize, 5), DEFAULT_PAGE_SIZE),
178
+ columnDefinitions: tableColumns,
179
+ columnPinning,
180
+ });
175
181
 
176
182
  const handleOnRefresh = useCallback(() => {
177
183
  table.resetRowSelection();
@@ -189,16 +195,25 @@ export function Table<TData extends object>({
189
195
  }, [loading, onDelete, table]);
190
196
 
191
197
  const handleOnCheck = useCallback(() => {
192
- if (!loading && rowSelectionProp?.multiRow) {
193
- table.toggleAllPageRowsSelected();
198
+ if (!loading && !enableSelectPinned && table.getTopRows().length) {
199
+ const centerRows = table.getCenterRows();
200
+ const isSomeRowsSelected = table.getIsSomePageRowsSelected();
201
+ const isAllCenterRowsSelected = centerRows.every(row => row.getIsSelected());
202
+
203
+ if (isAllCenterRowsSelected) {
204
+ table.resetRowSelection();
205
+ return;
206
+ }
207
+
208
+ centerRows.forEach(row => row.toggleSelected(isSomeRowsSelected ? true : undefined));
194
209
  return;
195
210
  }
196
211
 
197
- if (!loading && table.getIsSomePageRowsSelected()) {
198
- table.resetRowSelection();
212
+ if (!loading && rowSelectionProp?.multiRow) {
213
+ table.toggleAllPageRowsSelected();
199
214
  return;
200
215
  }
201
- }, [loading, rowSelectionProp?.multiRow, table]);
216
+ }, [loading, rowSelectionProp?.multiRow, table, enableSelectPinned]);
202
217
 
203
218
  const columnSizeVarsRef = useRef<Record<string, string>>();
204
219
  const headers = table.getFlatHeaders();
@@ -277,6 +292,7 @@ export function Table<TData extends object>({
277
292
  maximumAvailablePage: pageCount || data.length / pagination.pageSize,
278
293
  pagination,
279
294
  onPaginationChange,
295
+ autoResetPageIndex,
280
296
  });
281
297
 
282
298
  return (
@@ -345,7 +361,7 @@ export function Table<TData extends object>({
345
361
  </div>
346
362
  ) : null}
347
363
 
348
- {tableCenterRows.map(row => (
364
+ {(copyPinnedRows ? tableRows : tableCenterRows).map(row => (
349
365
  <BodyRow key={row.id} row={row} onRowClick={onRowClick} />
350
366
  ))}
351
367
 
@@ -353,7 +369,7 @@ export function Table<TData extends object>({
353
369
  emptyStates={emptyStates}
354
370
  dataError={dataError}
355
371
  dataFiltered={dataFiltered || Boolean(table.getState().globalFilter)}
356
- tableRowsLength={tableRows.length}
372
+ tableRowsLength={tableRows.length + filteredTopRows.length}
357
373
  />
358
374
  </>
359
375
  )}
@@ -369,6 +385,7 @@ export function Table<TData extends object>({
369
385
  options={paginationProp?.options}
370
386
  optionsLabel={paginationProp?.optionsLabel}
371
387
  pageCount={pageCount}
388
+ optionsRender={paginationProp?.optionsRender}
372
389
  />
373
390
  )}
374
391
  </div>
@@ -6,6 +6,7 @@ type UsePageResetProps = {
6
6
  maximumAvailablePage: number;
7
7
  pagination: PaginationState;
8
8
  onPaginationChange(state: PaginationState): void;
9
+ autoResetPageIndex: boolean;
9
10
  };
10
11
 
11
12
  export function usePageReset({
@@ -13,12 +14,15 @@ export function usePageReset({
13
14
  pagination,
14
15
  maximumAvailablePage,
15
16
  onPaginationChange,
17
+ autoResetPageIndex,
16
18
  }: UsePageResetProps) {
17
19
  useEffect(() => {
20
+ if (autoResetPageIndex) return;
21
+
18
22
  const { pageIndex } = pagination;
19
23
 
20
24
  if (!manualPagination && pageIndex > 0 && pageIndex >= maximumAvailablePage) {
21
25
  onPaginationChange({ ...pagination, pageIndex: 0 });
22
26
  }
23
- }, [maximumAvailablePage, manualPagination, onPaginationChange, pagination]);
27
+ }, [maximumAvailablePage, manualPagination, onPaginationChange, pagination, autoResetPageIndex]);
24
28
  }
@@ -19,9 +19,11 @@ export type TableProps<TData extends object> = WithSupportProps<{
19
19
  data: TData[];
20
20
  /** Определение внешнего вида и функционала колонок */
21
21
  columnDefinitions: ColumnDefinition<TData>[];
22
- /** Параметр овтечает за сохранение закрепленных строк на всех страницах таблицы */
22
+ /** Параметр отвечает за отображение закрепленных строк на всех страницах таблицы @default false*/
23
23
  keepPinnedRows?: boolean;
24
- /** Параметр овтечает за чекбокс выбора закрепленных строк */
24
+ /** Параметр отвечает за сохранение закрепленных строк в теле таблицы @default false*/
25
+ copyPinnedRows?: boolean;
26
+ /** Параметр отвечает за чекбокс выбора закрепленных строк */
25
27
  enableSelectPinned?: boolean;
26
28
  /** Параметры отвечают за возможность сортировки, их стоит использовать если нужно отслеживать состояние <br>
27
29
  * <strong>initialState</strong>: Начальное состояние сортировки <br>
@@ -79,8 +81,14 @@ export type TableProps<TData extends object> = WithSupportProps<{
79
81
  options?: number[];
80
82
  optionsLabel?: string;
81
83
  onChange?(state: PaginationState): void;
84
+ optionsRender?(value: string | number, idx: number): string | number;
82
85
  };
83
86
 
87
+ /** Автоматический сброс пагинации к первой странице при изменении данных или состояния
88
+ * (e.g фильтры, сортировки, и т.д)
89
+ * */
90
+ autoResetPageIndex?: boolean;
91
+
84
92
  /** Кол-во страниц (используется для внешнего управления) */
85
93
  pageCount?: number;
86
94
 
@@ -11,6 +11,7 @@ export type TablePaginationProps<TData> = {
11
11
  table: Table<TData>;
12
12
  options?: number[];
13
13
  optionsLabel?: string;
14
+ optionsRender?(value: number, idx: number): string | number;
14
15
  pageCount?: number;
15
16
  };
16
17
 
@@ -18,6 +19,7 @@ export function TablePagination<TData>({
18
19
  table,
19
20
  options: optionsProp,
20
21
  optionsLabel: optionsLabelProp,
22
+ optionsRender,
21
23
  }: TablePaginationProps<TData>) {
22
24
  const { t } = useLocale('Table');
23
25
  const optionsLabel = optionsLabelProp ?? t('rowsOptionsLabel');
@@ -37,8 +39,14 @@ export function TablePagination<TData>({
37
39
  );
38
40
 
39
41
  const options = useMemo(
40
- () => optionsProp?.sort((a, b) => a - b).map(value => ({ label: String(value), value: String(value) })),
41
- [optionsProp],
42
+ () =>
43
+ optionsProp
44
+ ?.sort((a, b) => a - b)
45
+ .map((value, idx) => ({
46
+ label: String(optionsRender ? optionsRender(value, idx) : value),
47
+ value: String(value),
48
+ })),
49
+ [optionsProp, optionsRender],
42
50
  );
43
51
 
44
52
  const tablePaginationState = table.getState().pagination;