fui-material 2.8.18 → 2.8.20
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/dist/f-ui-kit.es.js +508 -101
- package/dist/f-ui-kit.es.js.map +1 -1
- package/dist/f-ui-kit.umd.js +2 -2
- package/dist/f-ui-kit.umd.js.map +1 -1
- package/dist/index.css +1 -1
- package/dist/types/hooks/index.d.ts +2 -0
- package/dist/types/hooks/useFManualApiQuery/index.d.ts +1 -0
- package/dist/types/hooks/useFManualApiQuery/useFManualApiQuery.d.ts +6 -1
- package/dist/types/hooks/useFManualPagination/index.d.ts +2 -0
- package/dist/types/hooks/useFManualPagination/types.d.ts +105 -0
- package/dist/types/hooks/useFManualPagination/useFManualPagination.d.ts +3 -0
- package/dist/types/material/FOpenImgFull/FOpenImgFull.d.ts +2 -0
- package/dist/types/material/FProgressiveList/FProgressiveList.d.ts +4 -0
- package/dist/types/material/FProgressiveList/index.d.ts +2 -0
- package/dist/types/material/FProgressiveList/types.d.ts +34 -0
- package/dist/types/material/index.d.ts +2 -0
- package/package.json +1 -1
|
@@ -2,3 +2,5 @@ export { default as useFApi } from "./useFApi";
|
|
|
2
2
|
export { default as useFApiMutation } from "./useFApiMutation";
|
|
3
3
|
export { default as useFApiQuery } from "./useFApiQuery";
|
|
4
4
|
export { default as useFManualApiQuery } from "./useFManualApiQuery";
|
|
5
|
+
export { default as useFManualPagination } from "./useFManualPagination";
|
|
6
|
+
export * from "./useFManualPagination/types";
|
|
@@ -7,11 +7,16 @@ import { ExtraOptions } from "../types";
|
|
|
7
7
|
*/
|
|
8
8
|
export interface IUseFManualApiQueryRun<T> {
|
|
9
9
|
/** Новые основные параметры запроса (передаются как `data` в POST или `params` в GET) */
|
|
10
|
-
newParams?: T;
|
|
10
|
+
newParams?: Partial<T> | T;
|
|
11
11
|
/** Дополнительные URL-параметры (query string) */
|
|
12
12
|
newUrlParams?: Record<string, unknown>;
|
|
13
13
|
/** Если `true`, сохраняет предыдущие `params`, если `newParams` не был передан */
|
|
14
14
|
preserveParams?: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Если true — объединяет newParams с текущими params ({ ...params, ...newParams }).
|
|
17
|
+
* Критично для POST-пагинации, чтобы обновлять только { page: 2 } без потери фильтров.
|
|
18
|
+
*/
|
|
19
|
+
mergeParams?: boolean;
|
|
15
20
|
/** Добавочный суффикс к URL (например, `/export` или `/:id`) */
|
|
16
21
|
dopUrl?: string;
|
|
17
22
|
/** Если `true`, объединяет новые `newUrlParams` со старыми вместо перезаписи */
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { AxiosError, AxiosRequestConfig } from "axios";
|
|
2
|
+
import { IFPagination } from "@material/FPagination/FPagination";
|
|
3
|
+
import { ExtraOptions } from "../types";
|
|
4
|
+
export interface IBackendPageMeta {
|
|
5
|
+
/** Общее количество элементов (поддерживает totalItems и totalElements) */
|
|
6
|
+
totalItems: number;
|
|
7
|
+
/** Размер страницы */
|
|
8
|
+
size: number;
|
|
9
|
+
/** Общее количество страниц */
|
|
10
|
+
totalPages: number;
|
|
11
|
+
/** Номер текущей страницы */
|
|
12
|
+
number: number;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Базовый формат ответа бекенда (для обратной совместимости)
|
|
16
|
+
*/
|
|
17
|
+
export interface IStandardBackendResponse<TResult = unknown, TMeta = Record<string, unknown>> {
|
|
18
|
+
meta?: TMeta;
|
|
19
|
+
page: IBackendPageMeta;
|
|
20
|
+
result?: TResult;
|
|
21
|
+
[key: string]: unknown;
|
|
22
|
+
}
|
|
23
|
+
export interface ISubmitFiltersOptions<TFilters> {
|
|
24
|
+
/** Данные формы фильтров */
|
|
25
|
+
payload: TFilters;
|
|
26
|
+
/** Сбрасывать ли номер страницы на 1 при новой фильтрации (по умолчанию true) */
|
|
27
|
+
resetPage?: boolean;
|
|
28
|
+
/** Добавочный суффикс к URL (например, /export) */
|
|
29
|
+
dopUrl?: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Опции для универсального хука `useFManualPagination`
|
|
33
|
+
*
|
|
34
|
+
* @template TQueryFnData - Тип сырого ответа сервера (например, AsvActivitiesFetchResp или Spring Data Page)
|
|
35
|
+
* @template TData - Тип извлеченных данных после select (по умолчанию TQueryFnData)
|
|
36
|
+
* @template TFilters - Тип параметров фильтрации (POST body или query params)
|
|
37
|
+
*/
|
|
38
|
+
export interface IUseFManualPaginationOptions<TQueryFnData = unknown, TData = TQueryFnData, TFilters = Record<string, unknown>> extends ExtraOptions {
|
|
39
|
+
/** Базовый ключ TanStack Query */
|
|
40
|
+
queryKey: string;
|
|
41
|
+
/** URL эндпоинта */
|
|
42
|
+
url: string;
|
|
43
|
+
/** Размер страницы по умолчанию (дефолт 20) */
|
|
44
|
+
defaultPageSize?: number;
|
|
45
|
+
/** Начальные фильтры (если требуются) */
|
|
46
|
+
initialFilters?: TFilters;
|
|
47
|
+
/** Метод запроса (по умолчанию 'POST') */
|
|
48
|
+
method?: 'GET' | 'POST';
|
|
49
|
+
/** Конфиг Axios (заголовки, таймауты и др.) */
|
|
50
|
+
config?: Omit<AxiosRequestConfig, 'params' | 'data' | 'method'>;
|
|
51
|
+
/**
|
|
52
|
+
* Режим работы пагинации:
|
|
53
|
+
* - 'pagination' (по умолчанию): смена страницы заменяет данные (для классической пагинации)
|
|
54
|
+
* - 'infinite': смена страницы конкатенирует данные (для бесконечного скролла)
|
|
55
|
+
*/
|
|
56
|
+
mode?: 'pagination' | 'infinite';
|
|
57
|
+
/**
|
|
58
|
+
* Селектор для извлечения данных из сырого ответа сервера (полный аналог `select` в TanStack Query).
|
|
59
|
+
* Пример: (data) => data._embedded.asvActivities
|
|
60
|
+
* Пример: (data) => data.tables
|
|
61
|
+
* Если не передан, пытается взять data.result ?? data.items ?? data.content ?? data.
|
|
62
|
+
*/
|
|
63
|
+
select?: (data: TQueryFnData) => TData;
|
|
64
|
+
/**
|
|
65
|
+
* Селектор для извлечения метаданных пагинации из сырого ответа сервера.
|
|
66
|
+
* По умолчанию ищет поле `data.page` или `data.pagination` и нормализует totalItems / totalElements.
|
|
67
|
+
* Пример: (data) => data.page
|
|
68
|
+
*/
|
|
69
|
+
selectPage?: (data: TQueryFnData) => IBackendPageMeta | undefined;
|
|
70
|
+
/**
|
|
71
|
+
* Кастомная функция объединения данных для режима `infinite`.
|
|
72
|
+
* По умолчанию объединяет массивы: [...(prev ?? []), ...next]
|
|
73
|
+
*/
|
|
74
|
+
appendData?: (prev: TData | undefined, next: TData) => TData;
|
|
75
|
+
}
|
|
76
|
+
export interface IUseFManualPaginationResult<TData, TFilters = Record<string, unknown>, TQueryFnData = unknown> {
|
|
77
|
+
/** Типизированные данные после применения `select` */
|
|
78
|
+
data: TData | undefined;
|
|
79
|
+
/** Алиас для `data` (для обратной совместимости) */
|
|
80
|
+
result: TData | undefined;
|
|
81
|
+
/** Сырой ответ сервера до `select` */
|
|
82
|
+
rawResponse: TQueryFnData | undefined;
|
|
83
|
+
/** Метаданные отчета (если присутствуют в ответе) */
|
|
84
|
+
meta: Record<string, unknown> | undefined;
|
|
85
|
+
/** Нормализованные метаданные пагинации бекенда */
|
|
86
|
+
pageMeta: IBackendPageMeta | undefined;
|
|
87
|
+
/** Идет ли первичный запрос данных */
|
|
88
|
+
isLoading: boolean;
|
|
89
|
+
/** Идет ли фоновая подгрузка / смена страницы */
|
|
90
|
+
isFetching: boolean;
|
|
91
|
+
/** Идет ли подгрузка следующей страницы в режиме infinite scroll */
|
|
92
|
+
isFetchingMore: boolean;
|
|
93
|
+
/** Есть ли еще страницы для подгрузки (number < totalPages) */
|
|
94
|
+
hasMore: boolean;
|
|
95
|
+
/** Ошибка запроса */
|
|
96
|
+
error: AxiosError | null;
|
|
97
|
+
/** Запуск запроса по кнопке с передачей payload */
|
|
98
|
+
submitFilters: (options: ISubmitFiltersOptions<TFilters>) => Promise<TData>;
|
|
99
|
+
/** Ручная смена страницы (переход на конкретный номер) */
|
|
100
|
+
changePage: (newPage: number) => Promise<TData>;
|
|
101
|
+
/** Подгрузка следующей страницы (для бесконечного скролла) */
|
|
102
|
+
loadMore: () => Promise<TData | undefined>;
|
|
103
|
+
/** Готовые пропсы для передачи в <FPagination {...paginationProps} /> */
|
|
104
|
+
paginationProps: IFPagination;
|
|
105
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { IUseFManualPaginationOptions, IUseFManualPaginationResult } from './types';
|
|
2
|
+
export declare function useFManualPagination<TQueryFnData = unknown, TData = TQueryFnData, TFilters extends Record<string, unknown> = Record<string, unknown>>(options: IUseFManualPaginationOptions<TQueryFnData, TData, TFilters>): IUseFManualPaginationResult<TData, TFilters, TQueryFnData>;
|
|
3
|
+
export default useFManualPagination;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { IFProgressiveListProps } from './types';
|
|
3
|
+
export declare function FProgressiveList<T>({ items, chunkSize, estimatedItemHeight, keyExtractor, className, st, showProgress, renderProgress, children, onLoadMore, hasMore, isLoadingMore, loader, threshold }: IFProgressiveListProps<T>): React.ReactElement;
|
|
4
|
+
export default FProgressiveList;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface IFProgressiveListProps<T> {
|
|
3
|
+
/** Массив исходных данных (например, 100 объектов таблиц) */
|
|
4
|
+
items: T[];
|
|
5
|
+
/** Количество элементов, монтируемых за один кадр анимации (по умолчанию 6) */
|
|
6
|
+
chunkSize?: number;
|
|
7
|
+
/** Примерная высота одного блока в px для исключения скачков скролла (по умолчанию 280) */
|
|
8
|
+
estimatedItemHeight?: number;
|
|
9
|
+
/** Функция генерации стабильного уникального ключа */
|
|
10
|
+
keyExtractor: (item: T, index: number) => string | number;
|
|
11
|
+
/** Дополнительный CSS класс для контейнера */
|
|
12
|
+
className?: string;
|
|
13
|
+
/** Инлайновые стили контейнера */
|
|
14
|
+
st?: React.CSSProperties;
|
|
15
|
+
/** Показывать ли индикатор достройки блоков при переданном `renderProgress` (дефолт true) */
|
|
16
|
+
showProgress?: boolean;
|
|
17
|
+
/** Кастомный рендер индикатора прогресса/догрузки. Если не передан — индикатор по умолчанию не отображается */
|
|
18
|
+
renderProgress?: (rendered: number, total: number) => React.ReactNode;
|
|
19
|
+
/** Ленивая функция отрисовки каждого элемента (Function as Child) */
|
|
20
|
+
children: (item: T, index: number) => React.ReactNode;
|
|
21
|
+
/**
|
|
22
|
+
* Коллбэк, вызываемый при доскролливании до конца списка для подгрузки следующей страницы.
|
|
23
|
+
* Защищен от преждевременного вызова: срабатывает только когда текущая пачка уже смонтирована в DOM.
|
|
24
|
+
*/
|
|
25
|
+
onLoadMore?: () => void;
|
|
26
|
+
/** Флаг наличия следующих страниц на сервере (например, page.number < page.totalPages) */
|
|
27
|
+
hasMore?: boolean;
|
|
28
|
+
/** Флаг активной загрузки следующей страницы (показывает лоадер снизу) */
|
|
29
|
+
isLoadingMore?: boolean;
|
|
30
|
+
/** Кастомный элемент-лоадер внизу списка во время isLoadingMore */
|
|
31
|
+
loader?: React.ReactNode;
|
|
32
|
+
/** Отступ до низа в пикселях для упреждающего срабатывания (по умолчанию 250px) */
|
|
33
|
+
threshold?: number;
|
|
34
|
+
}
|
|
@@ -54,3 +54,5 @@ export { default as FSearchableSelect } from "./FSearchableSelect";
|
|
|
54
54
|
export { default as FSegmentedControl } from "./FSegmentedControl";
|
|
55
55
|
export { default as FTableActions } from "./TableComponents/FTableActions";
|
|
56
56
|
export { default as FStatusBadge } from "./FStatusBadge";
|
|
57
|
+
export { default as FProgressiveList } from "./FProgressiveList";
|
|
58
|
+
export * from "./FProgressiveList/types";
|