sprof 0.9.5 → 0.9.7
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/auto-import.d.ts +2 -2
- package/dist/auto-import.js +4 -4
- package/dist/core/classes/FileInfo.d.ts +9 -0
- package/dist/core/classes/FileInfo.test.d.ts +1 -0
- package/dist/core/components/atoms/PLoader/PLoader.stories.d.ts +556 -0
- package/dist/core/components/atoms/PLoader/PLoader.test.d.ts +1 -0
- package/dist/core/components/atoms/PLoader/PLoader.vue.d.ts +53 -0
- package/dist/core/components/atoms/index.d.ts +2 -1
- package/dist/core/composables/index.d.ts +7 -1
- package/dist/core/composables/useLoader.d.ts +63 -0
- package/dist/core/composables/useLoader.test.d.ts +1 -0
- package/dist/core/composables/useOptions.d.ts +60 -0
- package/dist/core/composables/useOptions.test.d.ts +1 -0
- package/dist/core/helpers/BaseStore.d.ts +38 -1
- package/dist/core/helpers/Cache.d.ts +3 -1
- package/dist/global-components.d.ts +1 -0
- package/dist/index.d.ts +4 -1
- package/dist/sprof.js +3914 -3667
- package/dist/sprof.umd.cjs +12 -12
- package/dist/style.css +1 -1
- package/package.json +139 -139
- package/dist/core/store/index.d.ts +0 -466
|
@@ -3,7 +3,9 @@
|
|
|
3
3
|
*
|
|
4
4
|
* - useCrud — CRUD-страница: store + loading/items/count/item/searchStr/load/remove/reset;
|
|
5
5
|
* - useFilters — фильтры FTSP: add/replace/remove/has/clear;
|
|
6
|
-
* - usePagination — пагинация FTSP: page (1-based)/rowsPerPage/next/prev/reset
|
|
6
|
+
* - usePagination — пагинация FTSP: page (1-based)/rowsPerPage/next/prev/reset;
|
|
7
|
+
* - useOptions — справочник для селекта: кэш + дедуп (К1, Т8);
|
|
8
|
+
* - useLoader — состояния загрузки: loading/error/data + ретрай (Т2a, пара к `PLoader`).
|
|
7
9
|
*
|
|
8
10
|
* По умолчанию работают с глобальным синглтоном FTSP.Get(); во всех трёх можно
|
|
9
11
|
* передать свой экземпляр FTSP (страница/компонент) — см. T1 в TECH_DEBT.md.
|
|
@@ -12,6 +14,10 @@ export type { UseCrudOptions, UseCrudReturn } from './useCrud';
|
|
|
12
14
|
export { useCrud } from './useCrud';
|
|
13
15
|
export type { UseFiltersReturn } from './useFilters';
|
|
14
16
|
export { useFilters } from './useFilters';
|
|
17
|
+
export type { LoaderFn, LoaderRetryOptions, UseLoaderOptions, UseLoaderReturn } from './useLoader';
|
|
18
|
+
export { useLoader } from './useLoader';
|
|
19
|
+
export type { UseOptionsOptions, UseOptionsReturn } from './useOptions';
|
|
20
|
+
export { useOptions } from './useOptions';
|
|
15
21
|
export type { UsePaginationReturn } from './usePagination';
|
|
16
22
|
export { usePagination } from './usePagination';
|
|
17
23
|
export type { PlatformName, ThemeName, UseThemeOptions, UseThemeReturn } from './useTheme';
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { ComputedRef, Ref } from 'vue';
|
|
2
|
+
import { TryOpts } from '../helpers/Try';
|
|
3
|
+
/** Функция загрузки: может принимать признак «принудительно» (мимо кэша/флага loaded). */
|
|
4
|
+
export type LoaderFn<T> = (force: boolean) => Promise<T> | T;
|
|
5
|
+
/** Попытка загрузки: сколько раз пробуем и с какой паузой (мс). */
|
|
6
|
+
export interface LoaderRetryOptions {
|
|
7
|
+
/** Всего попыток, включая первую (по умолчанию 1 — без повторов). */
|
|
8
|
+
attempts?: number;
|
|
9
|
+
/** Пауза между попытками, мс (по умолчанию 2000; растёт линейно). */
|
|
10
|
+
delay?: number;
|
|
11
|
+
}
|
|
12
|
+
export interface UseLoaderOptions extends LoaderRetryOptions {
|
|
13
|
+
/** Запускать сразу при создании (иначе — вручную: `onMounted(load)`). */
|
|
14
|
+
immediate?: boolean;
|
|
15
|
+
/** Загружать один раз: повторные `load()` без `force` выходят сразу. */
|
|
16
|
+
once?: boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Запросы к `PF.UI.Notify` при ошибке. По умолчанию — МОЛЧА: состояние ошибки
|
|
19
|
+
* показывает сам виджет `PLoader`/экран, и уведомление на каждый отказ — шум.
|
|
20
|
+
* Включать, когда ошибку больше показать негде.
|
|
21
|
+
*/
|
|
22
|
+
notify?: boolean | Pick<TryOpts, 'message'>;
|
|
23
|
+
/** Своё сообщение об ошибке (когда `notify` включён). */
|
|
24
|
+
message?: string;
|
|
25
|
+
}
|
|
26
|
+
export interface UseLoaderReturn<T> {
|
|
27
|
+
/** Идёт загрузка (включая повторные попытки). */
|
|
28
|
+
loading: Ref<boolean>;
|
|
29
|
+
/** Текст ошибки последней попытки; пустая строка — ошибки нет. */
|
|
30
|
+
error: Ref<string>;
|
|
31
|
+
/** Загруженные данные (null — ещё не было успешной загрузки). */
|
|
32
|
+
data: Ref<T | null>;
|
|
33
|
+
/** Успешная загрузка состоялась хотя бы раз. */
|
|
34
|
+
loaded: ComputedRef<boolean>;
|
|
35
|
+
/** Факт ошибки (для `v-if`/слотов виджета). */
|
|
36
|
+
failed: ComputedRef<boolean>;
|
|
37
|
+
/** Ошибка при ПЕРВОЙ загрузке (данных нет) — показываем экран ошибки целиком. */
|
|
38
|
+
failedFirstLoad: ComputedRef<boolean>;
|
|
39
|
+
/**
|
|
40
|
+
* Загрузка людей. При ошибке НЕ бросает: ошибка уходит в `error`
|
|
41
|
+
* (и в уведомление, если `notify`).
|
|
42
|
+
*/
|
|
43
|
+
load: (force?: boolean) => Promise<void>;
|
|
44
|
+
/** Сбросить состояние (данные, ошибку, признак `once`) — перед сменой фильтров. */
|
|
45
|
+
reset: () => void;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Единая обёртка загрузки (запрос из rdkb/map, 14.09): убирает `try/catch` +
|
|
49
|
+
* флаг `loading` + поле `error` + ретрай, которые в 8 клиентах писались руками
|
|
50
|
+
* (ср. `MyTasksPage.vue` до перевода, панель дерева, онбординг incident).
|
|
51
|
+
*
|
|
52
|
+
* ```ts
|
|
53
|
+
* const { loading, error, data, load } = useLoader(() =>
|
|
54
|
+
* PF.H.HttpClient.Get<MyTasks>(), { immediate: true, attempts: 3 },
|
|
55
|
+
* );
|
|
56
|
+
* ```
|
|
57
|
+
*
|
|
58
|
+
* ⚠️ Не дублирует `PF.H.Try`: `Try` — про разбор ошибки и уведомление,
|
|
59
|
+
* `useLoader` — про СОСТОЯНИЕ загрузки (loading/error/data). Ретрай вынесен
|
|
60
|
+
* сюда, потому что он нужен именно циклу загрузки; уведомление включается
|
|
61
|
+
* опцией `notify` и внутри идёт через `Try.Silent` + `Try.Message`.
|
|
62
|
+
*/
|
|
63
|
+
export declare function useLoader<T>(fn: LoaderFn<T>, options?: UseLoaderOptions): UseLoaderReturn<T>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { ComputedRef, Ref } from 'vue';
|
|
2
|
+
import { OptionsCacheOptions, default as BaseStore } from '../helpers/BaseStore';
|
|
3
|
+
import { default as IFileInfosGetter } from '../interfaces/IFileInfosGetter';
|
|
4
|
+
import { default as Option } from '../interfaces/IOption';
|
|
5
|
+
import { default as IWithId } from '../interfaces/IWithId';
|
|
6
|
+
export interface UseOptionsOptions extends OptionsCacheOptions {
|
|
7
|
+
/** Колонка-подпись в `/options/<label>/<value>` */
|
|
8
|
+
labelCol?: string;
|
|
9
|
+
/** Колонка-значение в `/options/<label>/<value>` */
|
|
10
|
+
valueCol?: string;
|
|
11
|
+
/**
|
|
12
|
+
* Грузить сразу при создании (по умолчанию — да).
|
|
13
|
+
* Выключите, если загрузку надо привязать к открытию диалога.
|
|
14
|
+
*/
|
|
15
|
+
immediate?: boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Справочник ТЯЖЁЛЫЙ: искать на сервере (`?query=`), а не тянуть целиком.
|
|
18
|
+
* Включайте для больших справочников (сотрудники, помещения и т.п.).
|
|
19
|
+
*/
|
|
20
|
+
searchable?: boolean;
|
|
21
|
+
/** Задержка дебаунса поиска, мс (по умолчанию 300). */
|
|
22
|
+
debounceMs?: number;
|
|
23
|
+
/** Лимит серверной выдачи (сервер зажмёт по своему потолку). */
|
|
24
|
+
limit?: number;
|
|
25
|
+
}
|
|
26
|
+
export interface UseOptionsReturn {
|
|
27
|
+
/** Опции справочника (реактивный массив стора) */
|
|
28
|
+
options: ComputedRef<Option[]>;
|
|
29
|
+
/** Справочник уже загружен */
|
|
30
|
+
isLoading: ComputedRef<boolean>;
|
|
31
|
+
/** Загрузить (с кэшем; `force` — перечитать) */
|
|
32
|
+
load(override?: OptionsCacheOptions): Promise<void>;
|
|
33
|
+
/** Сбросить кэш справочника (после правки в другом месте) */
|
|
34
|
+
invalidate(): void;
|
|
35
|
+
/** Текущая строка поиска (v-model у поля с `use-input`); только при `searchable` */
|
|
36
|
+
query: Ref<string>;
|
|
37
|
+
/**
|
|
38
|
+
* Строка поиска прямо сейчас (без дебаунса) — для программного поиска
|
|
39
|
+
* (напр. при открытии селекта сразу показать первые варианты).
|
|
40
|
+
*/
|
|
41
|
+
search(rawQuery: string): Promise<void>;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Справочник для селекта: кэш + дедуп (К1) и серверный поиск (К2) в одном вызове.
|
|
45
|
+
*
|
|
46
|
+
* Заменяет ручные `await store.GetOptions()` в `onMounted` — тот подход
|
|
47
|
+
* запрашивал справочник заново при каждом входе и плодил дубли запросов.
|
|
48
|
+
*
|
|
49
|
+
* ```ts
|
|
50
|
+
* // небольшой справочник: тянем целиком, кэш экономит повторные входы
|
|
51
|
+
* const { options } = useOptions(Store.Workers);
|
|
52
|
+
*
|
|
53
|
+
* // тяжёлый: ищем на сервере, в `query` вяжем v-model поля с `use-input`
|
|
54
|
+
* const { options, query } = useOptions(Store.Workers, {
|
|
55
|
+
* searchable: true,
|
|
56
|
+
* labelCol: 'full_name',
|
|
57
|
+
* });
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
export declare function useOptions<T extends IWithId & IFileInfosGetter>(store: BaseStore<T>, options?: UseOptionsOptions): UseOptionsReturn;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -9,6 +9,15 @@ export interface GetAllOptions {
|
|
|
9
9
|
withCache?: boolean;
|
|
10
10
|
ftsp: FTSP;
|
|
11
11
|
}
|
|
12
|
+
/** Настройки кэша справочников (`GetOptions`); К1 (Т8). */
|
|
13
|
+
export interface OptionsCacheOptions {
|
|
14
|
+
/** Использовать кэш (по умолчанию — да). */
|
|
15
|
+
cache?: boolean;
|
|
16
|
+
/** TTL в минутах (по умолчанию 10). */
|
|
17
|
+
ttl?: number;
|
|
18
|
+
/** Перечитать из сети, игнорируя кэш. */
|
|
19
|
+
force?: boolean;
|
|
20
|
+
}
|
|
12
21
|
export default class BaseStore<T extends IWithId & IFileInfosGetter> {
|
|
13
22
|
readonly items: T[];
|
|
14
23
|
readonly item: T;
|
|
@@ -20,7 +29,35 @@ export default class BaseStore<T extends IWithId & IFileInfosGetter> {
|
|
|
20
29
|
constructor(i: Constructable<T>, url: string);
|
|
21
30
|
Set(item: T | void): void;
|
|
22
31
|
getUrl(query?: string): string;
|
|
23
|
-
|
|
32
|
+
/**
|
|
33
|
+
* Загрузить справочник (`<url>/options/<label>/<value>`) — с КЭШЕМ и ДЕДУПОМ (К1, Т8).
|
|
34
|
+
*
|
|
35
|
+
* Раньше каждый вход в список/форму дёргал сервер заново, а параллельные
|
|
36
|
+
* вызовы (несколько селектов на странице) давали несколько одинаковых запросов.
|
|
37
|
+
* Теперь: TTL-кэш в sessionStorage + один запрос на все параллельные вызовы.
|
|
38
|
+
*
|
|
39
|
+
* ⚠️ Ключ кэша включает label/value: тот же справочник можно просить в разных
|
|
40
|
+
* парах полей, это РАЗНЫЕ наборы опций.
|
|
41
|
+
*/
|
|
42
|
+
GetOptions(labelCol?: string, valueCol?: string, options?: OptionsCacheOptions): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* Сбросить кэш справочника — после записи (`Create`/`Update`/`Remove`) (К4).
|
|
45
|
+
* `labelCol`/`valueCol` можно не указывать — сбросится кэш всех вариантов пары.
|
|
46
|
+
*/
|
|
47
|
+
InvalidateOptions(labelCol?: string, valueCol?: string): void;
|
|
48
|
+
/**
|
|
49
|
+
* Серверный поиск по справочнику (К2, Т8) — для тяжёлых справочников.
|
|
50
|
+
*
|
|
51
|
+
* ⚠️ Зачем, если есть `GetOptions`. Крупный справочник (сотрудники — 2250)
|
|
52
|
+
* нельзя тянуть целиком в селект: это секунды и список из тысяч строк, в котором
|
|
53
|
+
* нужное не найти. Здесь сервер отдаёт только совпадения (белый список полей —
|
|
54
|
+
* на модели, см. `Searchable` в sprob).
|
|
55
|
+
*
|
|
56
|
+
* Результат НЕ кэшируется по TTL: это поисковый запрос, а не справочник.
|
|
57
|
+
* Ответ — последние найденные варианты (они же попадают в `Options`).
|
|
58
|
+
*/
|
|
59
|
+
SearchOptions(query: string, labelCol?: string, valueCol?: string, limit?: number): Promise<Option[]>;
|
|
60
|
+
private SetOptions;
|
|
24
61
|
GetAll(options?: GetAllOptions): Promise<void>;
|
|
25
62
|
Get(id?: string): Promise<void>;
|
|
26
63
|
GetBySlug(slug?: string): Promise<void>;
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
export default class Cache {
|
|
2
2
|
name: string;
|
|
3
3
|
constructor(i?: Cache);
|
|
4
|
-
static Set(): void;
|
|
4
|
+
static Set<DataType>(name: string, data: DataType): void;
|
|
5
5
|
static Get<DataType>(name: string, min?: number): DataType | null;
|
|
6
|
+
/** Удалить запись (инвалидация после записи справочника). */
|
|
7
|
+
static Clear(name?: string): void;
|
|
6
8
|
static TryGet<DataType>(name: string, get: () => Promise<DataType | void>, min?: number): Promise<DataType | void | null>;
|
|
7
9
|
}
|
|
@@ -22,6 +22,7 @@ declare module 'vue' {
|
|
|
22
22
|
PLeftSlider: typeof Atoms.PLeftSlider;
|
|
23
23
|
PList: typeof Atoms.PList;
|
|
24
24
|
PListItem: typeof Atoms.PListItem;
|
|
25
|
+
PLoader: typeof Atoms.PLoader;
|
|
25
26
|
POptionsListSingle: typeof Atoms.POptionsListSingle;
|
|
26
27
|
POpts: typeof Atoms.POpts;
|
|
27
28
|
PRadio: typeof Atoms.PRadio;
|
package/dist/index.d.ts
CHANGED
|
@@ -43,10 +43,13 @@ export type { default as Btn } from './core/ui/Btn';
|
|
|
43
43
|
export type { default as AnswerVariant } from './modules/forms/classes/AnswerVariant';
|
|
44
44
|
/** @internal Used by unplugin-auto-import configuration */
|
|
45
45
|
export declare const pfName: readonly ["PF", "PFM"];
|
|
46
|
-
export { useCrud, useFilters, usePagination } from './core/composables/index';
|
|
46
|
+
export { useCrud, useFilters, useLoader, usePagination } from './core/composables/index';
|
|
47
47
|
export type { UseCrudOptions, UseCrudReturn } from './core/composables/useCrud';
|
|
48
48
|
export type { UseFiltersReturn } from './core/composables/useFilters';
|
|
49
|
+
export type { LoaderFn, LoaderRetryOptions, UseLoaderOptions, UseLoaderReturn } from './core/composables/useLoader';
|
|
49
50
|
export type { UsePaginationReturn } from './core/composables/usePagination';
|
|
51
|
+
export type { UseOptionsOptions, UseOptionsReturn } from './core/composables/useOptions';
|
|
52
|
+
export { useOptions } from './core/composables/useOptions';
|
|
50
53
|
export type { PlatformName, ThemeName, UseThemeOptions, UseThemeReturn } from './core/composables/useTheme';
|
|
51
54
|
export { DEFAULT_PLATFORM, getStoredTheme, isThemeLockedLight, lockLightTheme, MOBILE_MAX_WIDTH, resolvePlatform, useTheme } from './core/composables/useTheme';
|
|
52
55
|
export type { QuasarBrand } from './core/brand/quasar';
|