sprof 0.9.3 → 0.9.6
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/assets/styles/theme/dark.test.d.ts +1 -0
- package/dist/core/classes/FileInfo.d.ts +9 -0
- package/dist/core/classes/FileInfo.test.d.ts +1 -0
- package/dist/core/composables/index.d.ts +4 -1
- 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/sprof.js +3806 -3696
- 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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -14,6 +14,15 @@ export default class FileInfo {
|
|
|
14
14
|
description: string;
|
|
15
15
|
order: number;
|
|
16
16
|
constructor(i?: FileInfo);
|
|
17
|
+
/**
|
|
18
|
+
* Ссылка на файл: `url`, иначе `${StaticUrl}/${fileSystemPath}`.
|
|
19
|
+
*
|
|
20
|
+
* ⚠️ Если ЗАПОЛНЕНО НЕТ (осиротевшая запись `file_infos` без пути и баннера) —
|
|
21
|
+
* возвращаем ПУСТУЮ строку, а НЕ `${StaticUrl}/`. Раньше в этом случае получался
|
|
22
|
+
* `/api/static/` с пустым путём: браузер звал его при каждом рендере `<img>` и
|
|
23
|
+
* получал 404 (на pros — десятки в сутки). Пустая ссылка — сигнал вызывающему коду
|
|
24
|
+
* не рендерить картинку вовсе (см. способы применения: `if (getFileUrl())`).
|
|
25
|
+
*/
|
|
17
26
|
getFileUrl(): string | URL;
|
|
18
27
|
getFileListObject(): {
|
|
19
28
|
name: string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -3,7 +3,8 @@
|
|
|
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).
|
|
7
8
|
*
|
|
8
9
|
* По умолчанию работают с глобальным синглтоном FTSP.Get(); во всех трёх можно
|
|
9
10
|
* передать свой экземпляр FTSP (страница/компонент) — см. T1 в TECH_DEBT.md.
|
|
@@ -12,6 +13,8 @@ export type { UseCrudOptions, UseCrudReturn } from './useCrud';
|
|
|
12
13
|
export { useCrud } from './useCrud';
|
|
13
14
|
export type { UseFiltersReturn } from './useFilters';
|
|
14
15
|
export { useFilters } from './useFilters';
|
|
16
|
+
export type { UseOptionsOptions, UseOptionsReturn } from './useOptions';
|
|
17
|
+
export { useOptions } from './useOptions';
|
|
15
18
|
export type { UsePaginationReturn } from './usePagination';
|
|
16
19
|
export { usePagination } from './usePagination';
|
|
17
20
|
export type { PlatformName, ThemeName, UseThemeOptions, UseThemeReturn } from './useTheme';
|
|
@@ -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
|
}
|