@snack-uikit/table 0.20.13 → 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 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.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
+
6
17
  ## 0.20.13 (2024-08-15)
7
18
 
8
19
  ### 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
- const initSize = originalColumnDefSize ? `${originalColumnDefSize}px` : '100%';
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.20.13",
7
+ "version": "0.21.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": "01d09f2bffea51f14bcf910ba49f7e4493f8b560"
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 { getColumnStyleVars, getCurrentlyConfiguredHeaderWidth } from './utils';
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
- const initSize = originalColumnDefSize ? `${originalColumnDefSize}px` : '100%';
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
+ }
@@ -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<