@snack-uikit/table 0.20.12 → 0.21.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 +20 -0
- package/README.md +2 -0
- package/dist/components/Table/Table.d.ts +1 -1
- package/dist/components/Table/Table.js +13 -3
- package/dist/components/Table/utils.d.ts +12 -0
- package/dist/components/Table/utils.js +15 -0
- package/dist/components/types.d.ts +8 -0
- package/package.json +3 -3
- package/src/components/Table/Table.tsx +21 -2
- package/src/components/Table/utils.ts +35 -0
- package/src/components/types.ts +9 -0
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,26 @@
|
|
|
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.21.0 (2024-08-19)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
* **PDS-516:** add saving resize mode ([e3c0137](https://github.com/cloud-ru-tech/snack-uikit/commit/e3c0137c6ff88bb4ea262f8509add7707ba65431))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
## 0.20.13 (2024-08-15)
|
|
18
|
+
|
|
19
|
+
### Only dependencies have been changed
|
|
20
|
+
* [@snack-uikit/pagination@0.7.0](https://github.com/cloud-ru-tech/snack-uikit/blob/master/packages/pagination/CHANGELOG.md)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
6
26
|
## 0.20.12 (2024-08-14)
|
|
7
27
|
|
|
8
28
|
### Only dependencies have been changed
|
package/README.md
CHANGED
|
@@ -147,6 +147,7 @@ const columnDefinitions: ColumnDefinition<TableData>[] = [
|
|
|
147
147
|
| scrollRef | `RefObject<HTMLElement>` | - | Ссылка на элемент, обозначающий самый конец прокручиваемого списка |
|
|
148
148
|
| scrollContainerRef | `RefObject<HTMLElement>` | - | Ссылка на контейнер, который скроллится |
|
|
149
149
|
| rowPinning | `Pick<RowPinningState, "top">` | { top: [], } | Определение какие строки должны быть закреплены в таблице |
|
|
150
|
+
| savedState | `{ id: string; resize?: boolean; }` | - | Конфиг для сохранения состояния в localStorage. <br> Поле id должно быть уникальным для разных таблиц в рамках приложения. <br> Для корректной работы необходимо наличие id в конфиге columnDefinitions |
|
|
150
151
|
## Table.getStatusColumnDef
|
|
151
152
|
Вспомогательная функция для создания ячейки со статусом
|
|
152
153
|
### Props
|
|
@@ -206,6 +207,7 @@ const columnDefinitions: ColumnDefinition<TableData>[] = [
|
|
|
206
207
|
| scrollRef | `RefObject<HTMLElement>` | - | Ссылка на элемент, обозначающий самый конец прокручиваемого списка |
|
|
207
208
|
| scrollContainerRef | `RefObject<HTMLElement>` | - | Ссылка на контейнер, который скроллится |
|
|
208
209
|
| rowPinning | `Pick<RowPinningState, "top">` | - | Определение какие строки должны быть закреплены в таблице |
|
|
210
|
+
| savedState | `{ id: string; resize?: boolean; }` | - | Конфиг для сохранения состояния в localStorage. <br> Поле id должно быть уникальным для разных таблиц в рамках приложения. <br> Для корректной работы необходимо наличие id в конфиге columnDefinitions |
|
|
209
211
|
| items | `TData[]` | - | Данные для отрисовки |
|
|
210
212
|
| total | `number` | 10 | Общее кол-во строк |
|
|
211
213
|
| limit | `number` | 10 | Кол-во строк на страницу |
|
|
@@ -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, 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, 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>;
|
|
@@ -25,12 +25,12 @@ import { fuzzyFilter } from '../../utils';
|
|
|
25
25
|
import { useLoadingTable, useStateControl } from './hooks';
|
|
26
26
|
import { usePageReset } from './hooks/usePageReset';
|
|
27
27
|
import styles from './styles.module.css';
|
|
28
|
-
import { getColumnStyleVars, getCurrentlyConfiguredHeaderWidth } from './utils';
|
|
28
|
+
import { getColumnStyleVars, getCurrentlyConfiguredHeaderWidth, getInitColumnSizeFromLocalStorage, saveStateToLocalStorage, } from './utils';
|
|
29
29
|
/** Компонент таблицы */
|
|
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, 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", "exportSettings", "dataFiltered", "dataError", "noDataState", "noResultsState", "errorDataState", "suppressToolbar", "toolbarBefore", "toolbarAfter", "suppressPagination", "manualSorting", "manualPagination", "manualFiltering", "autoResetPageIndex", "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, 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(() => ({
|
|
@@ -150,8 +150,15 @@ export function Table(_a) {
|
|
|
150
150
|
}
|
|
151
151
|
else {
|
|
152
152
|
const originalColumnDefSize = originalColDef === null || originalColDef === void 0 ? void 0 : originalColDef.size;
|
|
153
|
-
|
|
153
|
+
let initSize = originalColumnDefSize ? `${originalColumnDefSize}px` : '100%';
|
|
154
154
|
const prevSize = (_a = columnSizeVarsRef.current) === null || _a === void 0 ? void 0 : _a[sizeKey];
|
|
155
|
+
const isResizeSavedToStore = (originalColDef === null || originalColDef === void 0 ? void 0 : originalColDef.enableResizing) && (savedState === null || savedState === void 0 ? void 0 : savedState.id) && (savedState === null || savedState === void 0 ? void 0 : savedState.resize) !== false;
|
|
156
|
+
if (isResizeSavedToStore) {
|
|
157
|
+
const savedSize = getInitColumnSizeFromLocalStorage({ id: savedState.id, columnId: header.id });
|
|
158
|
+
if (savedSize) {
|
|
159
|
+
initSize = savedSize;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
155
162
|
let size = initSize;
|
|
156
163
|
if (header.column.getCanResize()) {
|
|
157
164
|
const currentSize = header.getSize();
|
|
@@ -163,6 +170,9 @@ export function Table(_a) {
|
|
|
163
170
|
size = `${realSize}px`;
|
|
164
171
|
}
|
|
165
172
|
}
|
|
173
|
+
if (isResizeSavedToStore) {
|
|
174
|
+
saveStateToLocalStorage({ id: savedState.id, columnId: header.id, size });
|
|
175
|
+
}
|
|
166
176
|
colSizes[sizeKey] = size;
|
|
167
177
|
colSizes[flexKey] = size === '100%' ? 'unset' : '0';
|
|
168
178
|
}
|
|
@@ -3,3 +3,15 @@ export declare function getColumnStyleVars(id: string): {
|
|
|
3
3
|
sizeKey: string;
|
|
4
4
|
flexKey: string;
|
|
5
5
|
};
|
|
6
|
+
type GetSavedStateFromLocalStorageProps = {
|
|
7
|
+
id: string;
|
|
8
|
+
columnId: string;
|
|
9
|
+
};
|
|
10
|
+
export declare function getInitColumnSizeFromLocalStorage({ id, columnId }: GetSavedStateFromLocalStorageProps): string | undefined;
|
|
11
|
+
type SaveStateToLocalStorageProps = {
|
|
12
|
+
id: string;
|
|
13
|
+
columnId: string;
|
|
14
|
+
size: string;
|
|
15
|
+
};
|
|
16
|
+
export declare function saveStateToLocalStorage({ id, columnId, size }: SaveStateToLocalStorageProps): void;
|
|
17
|
+
export {};
|
|
@@ -14,3 +14,18 @@ export function getColumnStyleVars(id) {
|
|
|
14
14
|
flexKey: `--table-column-${id}-flex`,
|
|
15
15
|
};
|
|
16
16
|
}
|
|
17
|
+
const RESIZED_KEY = 'RESIZED_COLUMN_KEY';
|
|
18
|
+
export function getInitColumnSizeFromLocalStorage({ id, columnId }) {
|
|
19
|
+
var _a;
|
|
20
|
+
const savedStateFromStorage = JSON.parse(localStorage.getItem(id || '') || 'null');
|
|
21
|
+
if (savedStateFromStorage) {
|
|
22
|
+
const currentSize = (_a = savedStateFromStorage.resizeState) === null || _a === void 0 ? void 0 : _a[`${RESIZED_KEY}-${columnId}`];
|
|
23
|
+
return currentSize;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export function saveStateToLocalStorage({ id, columnId, size }) {
|
|
27
|
+
const savedStateFromStorage = JSON.parse(localStorage.getItem(id) || 'null');
|
|
28
|
+
const newResizeState = (savedStateFromStorage === null || savedStateFromStorage === void 0 ? void 0 : savedStateFromStorage.resizeState) || {};
|
|
29
|
+
newResizeState[`${RESIZED_KEY}-${columnId}`] = size;
|
|
30
|
+
localStorage.setItem(id, JSON.stringify(Object.assign(Object.assign({}, (savedStateFromStorage || {})), { resizeState: newResizeState })));
|
|
31
|
+
}
|
|
@@ -121,6 +121,14 @@ export type TableProps<TData extends object> = WithSupportProps<{
|
|
|
121
121
|
scrollContainerRef?: RefObject<HTMLElement>;
|
|
122
122
|
/** Определение какие строки должны быть закреплены в таблице */
|
|
123
123
|
rowPinning?: Pick<RowPinningState, 'top'>;
|
|
124
|
+
/** Конфиг для сохранения состояния в localStorage. <br>
|
|
125
|
+
* Поле id должно быть уникальным для разных таблиц в рамках приложения. <br>
|
|
126
|
+
* Для корректной работы необходимо наличие id в конфиге columnDefinitions
|
|
127
|
+
* */
|
|
128
|
+
savedState?: {
|
|
129
|
+
id: string;
|
|
130
|
+
resize?: boolean;
|
|
131
|
+
};
|
|
124
132
|
}>;
|
|
125
133
|
export type ServerTableProps<TData extends object> = Omit<TableProps<TData>, 'pageSize' | 'pageCount' | 'pagination' | 'search' | 'data'> & {
|
|
126
134
|
/** Данные для отрисовки */
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
6
|
"title": "Table",
|
|
7
|
-
"version": "0.
|
|
7
|
+
"version": "0.21.0",
|
|
8
8
|
"sideEffects": [
|
|
9
9
|
"*.css",
|
|
10
10
|
"*.woff",
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"@snack-uikit/icons": "0.22.0",
|
|
39
39
|
"@snack-uikit/info-block": "0.4.6",
|
|
40
40
|
"@snack-uikit/list": "0.15.3",
|
|
41
|
-
"@snack-uikit/pagination": "0.
|
|
41
|
+
"@snack-uikit/pagination": "0.7.0",
|
|
42
42
|
"@snack-uikit/scroll": "0.6.0",
|
|
43
43
|
"@snack-uikit/skeleton": "0.3.4",
|
|
44
44
|
"@snack-uikit/toggles": "0.10.3",
|
|
@@ -57,5 +57,5 @@
|
|
|
57
57
|
"peerDependencies": {
|
|
58
58
|
"@snack-uikit/locale": "*"
|
|
59
59
|
},
|
|
60
|
-
"gitHead": "
|
|
60
|
+
"gitHead": "88e1132e1aa2180d7d806847fa61f6edf1b5854b"
|
|
61
61
|
}
|
|
@@ -41,7 +41,12 @@ import { TableProps } from '../types';
|
|
|
41
41
|
import { useLoadingTable, useStateControl } from './hooks';
|
|
42
42
|
import { usePageReset } from './hooks/usePageReset';
|
|
43
43
|
import styles from './styles.module.scss';
|
|
44
|
-
import {
|
|
44
|
+
import {
|
|
45
|
+
getColumnStyleVars,
|
|
46
|
+
getCurrentlyConfiguredHeaderWidth,
|
|
47
|
+
getInitColumnSizeFromLocalStorage,
|
|
48
|
+
saveStateToLocalStorage,
|
|
49
|
+
} from './utils';
|
|
45
50
|
|
|
46
51
|
/** Компонент таблицы */
|
|
47
52
|
export function Table<TData extends object>({
|
|
@@ -85,6 +90,7 @@ export function Table<TData extends object>({
|
|
|
85
90
|
scrollContainerRef,
|
|
86
91
|
getRowId,
|
|
87
92
|
enableFuzzySearch,
|
|
93
|
+
savedState,
|
|
88
94
|
|
|
89
95
|
...rest
|
|
90
96
|
}: TableProps<TData>) {
|
|
@@ -235,9 +241,18 @@ export function Table<TData extends object>({
|
|
|
235
241
|
colSizes[flexKey] = '100%';
|
|
236
242
|
} else {
|
|
237
243
|
const originalColumnDefSize = originalColDef?.size;
|
|
238
|
-
|
|
244
|
+
let initSize = originalColumnDefSize ? `${originalColumnDefSize}px` : '100%';
|
|
239
245
|
const prevSize = columnSizeVarsRef.current?.[sizeKey];
|
|
240
246
|
|
|
247
|
+
const isResizeSavedToStore = originalColDef?.enableResizing && savedState?.id && savedState?.resize !== false;
|
|
248
|
+
|
|
249
|
+
if (isResizeSavedToStore) {
|
|
250
|
+
const savedSize = getInitColumnSizeFromLocalStorage({ id: savedState.id, columnId: header.id });
|
|
251
|
+
if (savedSize) {
|
|
252
|
+
initSize = savedSize;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
241
256
|
let size = initSize;
|
|
242
257
|
|
|
243
258
|
if (header.column.getCanResize()) {
|
|
@@ -254,6 +269,10 @@ export function Table<TData extends object>({
|
|
|
254
269
|
}
|
|
255
270
|
}
|
|
256
271
|
|
|
272
|
+
if (isResizeSavedToStore) {
|
|
273
|
+
saveStateToLocalStorage({ id: savedState.id, columnId: header.id, size });
|
|
274
|
+
}
|
|
275
|
+
|
|
257
276
|
colSizes[sizeKey] = size;
|
|
258
277
|
colSizes[flexKey] = size === '100%' ? 'unset' : '0';
|
|
259
278
|
}
|
|
@@ -19,3 +19,38 @@ export function getColumnStyleVars(id: string) {
|
|
|
19
19
|
flexKey: `--table-column-${id}-flex`,
|
|
20
20
|
};
|
|
21
21
|
}
|
|
22
|
+
|
|
23
|
+
const RESIZED_KEY = 'RESIZED_COLUMN_KEY';
|
|
24
|
+
|
|
25
|
+
type GetSavedStateFromLocalStorageProps = {
|
|
26
|
+
id: string;
|
|
27
|
+
columnId: string;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
type SavedState = {
|
|
31
|
+
resizeState?: Record<string, string>;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export function getInitColumnSizeFromLocalStorage({ id, columnId }: GetSavedStateFromLocalStorageProps) {
|
|
35
|
+
const savedStateFromStorage: SavedState | null = JSON.parse(localStorage.getItem(id || '') || 'null');
|
|
36
|
+
|
|
37
|
+
if (savedStateFromStorage) {
|
|
38
|
+
const currentSize = savedStateFromStorage.resizeState?.[`${RESIZED_KEY}-${columnId}`] as string | undefined;
|
|
39
|
+
return currentSize;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
type SaveStateToLocalStorageProps = {
|
|
44
|
+
id: string;
|
|
45
|
+
columnId: string;
|
|
46
|
+
size: string;
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
export function saveStateToLocalStorage({ id, columnId, size }: SaveStateToLocalStorageProps) {
|
|
50
|
+
const savedStateFromStorage: SavedState | null = JSON.parse(localStorage.getItem(id) || 'null');
|
|
51
|
+
|
|
52
|
+
const newResizeState: Record<string, string> = savedStateFromStorage?.resizeState || {};
|
|
53
|
+
newResizeState[`${RESIZED_KEY}-${columnId}`] = size;
|
|
54
|
+
|
|
55
|
+
localStorage.setItem(id, JSON.stringify({ ...(savedStateFromStorage || {}), resizeState: newResizeState }));
|
|
56
|
+
}
|
package/src/components/types.ts
CHANGED
|
@@ -152,6 +152,15 @@ export type TableProps<TData extends object> = WithSupportProps<{
|
|
|
152
152
|
scrollContainerRef?: RefObject<HTMLElement>;
|
|
153
153
|
/** Определение какие строки должны быть закреплены в таблице */
|
|
154
154
|
rowPinning?: Pick<RowPinningState, 'top'>;
|
|
155
|
+
|
|
156
|
+
/** Конфиг для сохранения состояния в localStorage. <br>
|
|
157
|
+
* Поле id должно быть уникальным для разных таблиц в рамках приложения. <br>
|
|
158
|
+
* Для корректной работы необходимо наличие id в конфиге columnDefinitions
|
|
159
|
+
* */
|
|
160
|
+
savedState?: {
|
|
161
|
+
id: string;
|
|
162
|
+
resize?: boolean;
|
|
163
|
+
};
|
|
155
164
|
}>;
|
|
156
165
|
|
|
157
166
|
export type ServerTableProps<TData extends object> = Omit<
|