@webiny/app-utils 0.0.0-unstable.0156a4c312
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/LICENSE +21 -0
- package/README.md +11 -0
- package/features/List/FilterFeature.d.ts +11 -0
- package/features/List/FilterFeature.js +26 -0
- package/features/List/FilterFeature.js.map +1 -0
- package/features/List/ListQueryParamsRepository.d.ts +18 -0
- package/features/List/ListQueryParamsRepository.js +68 -0
- package/features/List/ListQueryParamsRepository.js.map +1 -0
- package/features/List/LoadMoreFeature.d.ts +13 -0
- package/features/List/LoadMoreFeature.js +28 -0
- package/features/List/LoadMoreFeature.js.map +1 -0
- package/features/List/LoadingRepository.d.ts +15 -0
- package/features/List/LoadingRepository.js +48 -0
- package/features/List/LoadingRepository.js.map +1 -0
- package/features/List/SearchFeature.d.ts +10 -0
- package/features/List/SearchFeature.js +20 -0
- package/features/List/SearchFeature.js.map +1 -0
- package/features/List/SortFeature.d.ts +10 -0
- package/features/List/SortFeature.js +23 -0
- package/features/List/SortFeature.js.map +1 -0
- package/features/List/abstractions.d.ts +73 -0
- package/features/List/abstractions.js +11 -0
- package/features/List/abstractions.js.map +1 -0
- package/features/List/feature.d.ts +8 -0
- package/features/List/feature.js +30 -0
- package/features/List/feature.js.map +1 -0
- package/fta/Domain/Models/Meta/Meta.d.ts +13 -0
- package/fta/Domain/Models/Meta/Meta.js +20 -0
- package/fta/Domain/Models/Meta/Meta.js.map +1 -0
- package/fta/Domain/Models/Meta/MetaMapper.d.ts +4 -0
- package/fta/Domain/Models/Meta/MetaMapper.js +12 -0
- package/fta/Domain/Models/Meta/MetaMapper.js.map +1 -0
- package/fta/Domain/Models/Meta/index.d.ts +2 -0
- package/fta/Domain/Models/Meta/index.js +2 -0
- package/fta/Domain/Models/Sorting/Sorting.d.ts +10 -0
- package/fta/Domain/Models/Sorting/Sorting.js +12 -0
- package/fta/Domain/Models/Sorting/Sorting.js.map +1 -0
- package/fta/Domain/Models/Sorting/SortingMapper.d.ts +12 -0
- package/fta/Domain/Models/Sorting/SortingMapper.js +31 -0
- package/fta/Domain/Models/Sorting/SortingMapper.js.map +1 -0
- package/fta/Domain/Models/Sorting/index.d.ts +2 -0
- package/fta/Domain/Models/Sorting/index.js +2 -0
- package/fta/Domain/Models/index.d.ts +2 -0
- package/fta/Domain/Models/index.js +2 -0
- package/fta/Domain/Repositories/Loading/ILoadingRepository.d.ts +9 -0
- package/fta/Domain/Repositories/Loading/ILoadingRepository.js +0 -0
- package/fta/Domain/Repositories/Loading/LoadingRepository.d.ts +14 -0
- package/fta/Domain/Repositories/Loading/LoadingRepository.js +43 -0
- package/fta/Domain/Repositories/Loading/LoadingRepository.js.map +1 -0
- package/fta/Domain/Repositories/Loading/LoadingRepositoryFactory.d.ts +7 -0
- package/fta/Domain/Repositories/Loading/LoadingRepositoryFactory.js +18 -0
- package/fta/Domain/Repositories/Loading/LoadingRepositoryFactory.js.map +1 -0
- package/fta/Domain/Repositories/Loading/index.d.ts +3 -0
- package/fta/Domain/Repositories/Loading/index.js +2 -0
- package/fta/Domain/Repositories/Meta/IMetaRepository.d.ts +7 -0
- package/fta/Domain/Repositories/Meta/IMetaRepository.js +0 -0
- package/fta/Domain/Repositories/Meta/MetaRepository.d.ts +11 -0
- package/fta/Domain/Repositories/Meta/MetaRepository.js +38 -0
- package/fta/Domain/Repositories/Meta/MetaRepository.js.map +1 -0
- package/fta/Domain/Repositories/Meta/MetaRepositoryFactory.d.ts +7 -0
- package/fta/Domain/Repositories/Meta/MetaRepositoryFactory.js +18 -0
- package/fta/Domain/Repositories/Meta/MetaRepositoryFactory.js.map +1 -0
- package/fta/Domain/Repositories/Meta/index.d.ts +3 -0
- package/fta/Domain/Repositories/Meta/index.js +2 -0
- package/fta/Domain/Repositories/Sorting/ISortingRepository.d.ts +5 -0
- package/fta/Domain/Repositories/Sorting/ISortingRepository.js +0 -0
- package/fta/Domain/Repositories/Sorting/SortingRepository.d.ts +8 -0
- package/fta/Domain/Repositories/Sorting/SortingRepository.js +16 -0
- package/fta/Domain/Repositories/Sorting/SortingRepository.js.map +1 -0
- package/fta/Domain/Repositories/Sorting/SortingRepositoryFactory.d.ts +7 -0
- package/fta/Domain/Repositories/Sorting/SortingRepositoryFactory.js +18 -0
- package/fta/Domain/Repositories/Sorting/SortingRepositoryFactory.js.map +1 -0
- package/fta/Domain/Repositories/Sorting/index.d.ts +3 -0
- package/fta/Domain/Repositories/Sorting/index.js +2 -0
- package/fta/Domain/Repositories/index.d.ts +3 -0
- package/fta/Domain/Repositories/index.js +3 -0
- package/fta/Domain/index.d.ts +2 -0
- package/fta/Domain/index.js +2 -0
- package/fta/index.d.ts +1 -0
- package/fta/index.js +1 -0
- package/index.d.ts +1 -0
- package/index.js +1 -0
- package/package.json +31 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) Webiny
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# @webiny/app-utils
|
|
2
|
+
|
|
3
|
+
> [!NOTE]
|
|
4
|
+
> This package is part of the [Webiny](https://www.webiny.com) monorepo.
|
|
5
|
+
> It’s **included in every Webiny project by default** and is not meant to be used as a standalone package.
|
|
6
|
+
|
|
7
|
+
📘 **Documentation:** [https://www.webiny.com/docs](https://www.webiny.com/docs)
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
_This README file is automatically generated during the publish process._
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type IFilterFeature, ListQueryParamsRepository, type BaseListParams } from "./abstractions.js";
|
|
2
|
+
declare class FilterFeatureImpl<TParams extends BaseListParams> implements IFilterFeature {
|
|
3
|
+
private queryParams;
|
|
4
|
+
constructor(queryParams: ListQueryParamsRepository.Interface<TParams>);
|
|
5
|
+
setFilter(key: string, value: unknown): Promise<void>;
|
|
6
|
+
clearAllFilters(): Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
export declare const FilterFeature: typeof FilterFeatureImpl & {
|
|
9
|
+
__abstraction: import("@webiny/di").Abstraction<IFilterFeature>;
|
|
10
|
+
};
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { FilterFeature, ListQueryParamsRepository } from "./abstractions.js";
|
|
2
|
+
class FilterFeatureImpl {
|
|
3
|
+
constructor(queryParams){
|
|
4
|
+
this.queryParams = queryParams;
|
|
5
|
+
}
|
|
6
|
+
async setFilter(key, value) {
|
|
7
|
+
await this.queryParams.set((params)=>{
|
|
8
|
+
if (!params.filters) params.filters = {};
|
|
9
|
+
params.filters[key] = value;
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
async clearAllFilters() {
|
|
13
|
+
await this.queryParams.set((params)=>{
|
|
14
|
+
params.filters = {};
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
const FilterFeature_FilterFeature = FilterFeature.createImplementation({
|
|
19
|
+
implementation: FilterFeatureImpl,
|
|
20
|
+
dependencies: [
|
|
21
|
+
ListQueryParamsRepository
|
|
22
|
+
]
|
|
23
|
+
});
|
|
24
|
+
export { FilterFeature_FilterFeature as FilterFeature };
|
|
25
|
+
|
|
26
|
+
//# sourceMappingURL=FilterFeature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/List/FilterFeature.js","sources":["../../../src/features/List/FilterFeature.ts"],"sourcesContent":["import {\n FilterFeature as Abstraction,\n type IFilterFeature,\n ListQueryParamsRepository,\n type BaseListParams\n} from \"./abstractions.js\";\n\nclass FilterFeatureImpl<TParams extends BaseListParams> implements IFilterFeature {\n constructor(private queryParams: ListQueryParamsRepository.Interface<TParams>) {}\n\n async setFilter(key: string, value: unknown): Promise<void> {\n await this.queryParams.set(params => {\n if (!params.filters) {\n params.filters = {};\n }\n params.filters[key] = value;\n });\n }\n\n async clearAllFilters(): Promise<void> {\n await this.queryParams.set(params => {\n params.filters = {};\n });\n }\n}\n\nexport const FilterFeature = Abstraction.createImplementation({\n implementation: FilterFeatureImpl,\n dependencies: [ListQueryParamsRepository]\n});\n"],"names":["FilterFeatureImpl","queryParams","key","value","params","FilterFeature","Abstraction","ListQueryParamsRepository"],"mappings":";AAOA,MAAMA;IACF,YAAoBC,WAAyD,CAAE;aAA3DA,WAAW,GAAXA;IAA4D;IAEhF,MAAM,UAAUC,GAAW,EAAEC,KAAc,EAAiB;QACxD,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAACC,CAAAA;YACvB,IAAI,CAACA,OAAO,OAAO,EACfA,OAAO,OAAO,GAAG,CAAC;YAEtBA,OAAO,OAAO,CAACF,IAAI,GAAGC;QAC1B;IACJ;IAEA,MAAM,kBAAiC;QACnC,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAACC,CAAAA;YACvBA,OAAO,OAAO,GAAG,CAAC;QACtB;IACJ;AACJ;AAEO,MAAMC,8BAAgBC,cAAAA,oBAAgC,CAAC;IAC1D,gBAAgBN;IAChB,cAAc;QAACO;KAA0B;AAC7C"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type BaseListParams, type IListQueryParamsRepository } from "./abstractions.js";
|
|
2
|
+
export declare class ListQueryParamsRepositoryImpl<TParams extends BaseListParams> implements IListQueryParamsRepository<TParams> {
|
|
3
|
+
private params;
|
|
4
|
+
private readonly initial;
|
|
5
|
+
private readonly listeners;
|
|
6
|
+
constructor();
|
|
7
|
+
get(): TParams;
|
|
8
|
+
set(updater: (params: TParams) => void): Promise<void>;
|
|
9
|
+
replace(next: TParams): Promise<void>;
|
|
10
|
+
reset(): void;
|
|
11
|
+
subscribe(listener: (next: TParams) => void): () => void;
|
|
12
|
+
dispose(): void;
|
|
13
|
+
private notify;
|
|
14
|
+
private clone;
|
|
15
|
+
}
|
|
16
|
+
export declare const ListQueryParamsRepository: typeof ListQueryParamsRepositoryImpl & {
|
|
17
|
+
__abstraction: import("@webiny/di").Abstraction<IListQueryParamsRepository<any>>;
|
|
18
|
+
};
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { makeAutoObservable, runInAction } from "mobx";
|
|
2
|
+
import { ListQueryParamsRepository } from "./abstractions.js";
|
|
3
|
+
class ListQueryParamsRepositoryImpl {
|
|
4
|
+
constructor(){
|
|
5
|
+
this.listeners = new Set();
|
|
6
|
+
this.initial = {
|
|
7
|
+
search: "",
|
|
8
|
+
sort: [],
|
|
9
|
+
filters: {},
|
|
10
|
+
limit: 50
|
|
11
|
+
};
|
|
12
|
+
this.params = this.clone(this.initial);
|
|
13
|
+
makeAutoObservable(this, {
|
|
14
|
+
subscribe: false,
|
|
15
|
+
dispose: false
|
|
16
|
+
}, {
|
|
17
|
+
autoBind: true
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
get() {
|
|
21
|
+
return this.clone(this.params);
|
|
22
|
+
}
|
|
23
|
+
async set(updater) {
|
|
24
|
+
runInAction(()=>{
|
|
25
|
+
updater(this.params);
|
|
26
|
+
});
|
|
27
|
+
this.notify();
|
|
28
|
+
}
|
|
29
|
+
async replace(next) {
|
|
30
|
+
runInAction(()=>{
|
|
31
|
+
this.params = this.clone(next);
|
|
32
|
+
});
|
|
33
|
+
this.notify();
|
|
34
|
+
}
|
|
35
|
+
reset() {
|
|
36
|
+
runInAction(()=>{
|
|
37
|
+
this.params = this.clone(this.initial);
|
|
38
|
+
});
|
|
39
|
+
this.notify();
|
|
40
|
+
}
|
|
41
|
+
subscribe(listener) {
|
|
42
|
+
this.listeners.add(listener);
|
|
43
|
+
return ()=>{
|
|
44
|
+
this.listeners.delete(listener);
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
dispose() {
|
|
48
|
+
this.listeners.clear();
|
|
49
|
+
}
|
|
50
|
+
notify() {
|
|
51
|
+
const snap = this.clone(this.params);
|
|
52
|
+
for (const listener of this.listeners)try {
|
|
53
|
+
listener(snap);
|
|
54
|
+
} catch (error) {
|
|
55
|
+
console.error("Error in ListQueryParams listener:", error);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
clone(value) {
|
|
59
|
+
return structuredClone ? structuredClone(value) : JSON.parse(JSON.stringify(value));
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
const ListQueryParamsRepository_ListQueryParamsRepository = ListQueryParamsRepository.createImplementation({
|
|
63
|
+
implementation: ListQueryParamsRepositoryImpl,
|
|
64
|
+
dependencies: []
|
|
65
|
+
});
|
|
66
|
+
export { ListQueryParamsRepositoryImpl, ListQueryParamsRepository_ListQueryParamsRepository as ListQueryParamsRepository };
|
|
67
|
+
|
|
68
|
+
//# sourceMappingURL=ListQueryParamsRepository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/List/ListQueryParamsRepository.js","sources":["../../../src/features/List/ListQueryParamsRepository.ts"],"sourcesContent":["import { makeAutoObservable, runInAction } from \"mobx\";\nimport {\n ListQueryParamsRepository as Abstraction,\n type BaseListParams,\n type IListQueryParamsRepository\n} from \"./abstractions.js\";\n\nexport class ListQueryParamsRepositoryImpl<\n TParams extends BaseListParams\n> implements IListQueryParamsRepository<TParams> {\n private params: TParams;\n private readonly initial: TParams;\n private readonly listeners = new Set<(next: TParams) => void>();\n\n constructor() {\n this.initial = { search: \"\", sort: [], filters: {}, limit: 50 } as unknown as TParams;\n this.params = this.clone(this.initial) as unknown as TParams;\n\n makeAutoObservable(\n this,\n {\n subscribe: false,\n dispose: false\n },\n { autoBind: true }\n );\n }\n\n get(): TParams {\n return this.clone(this.params);\n }\n\n async set(updater: (params: TParams) => void): Promise<void> {\n runInAction(() => {\n updater(this.params);\n });\n this.notify();\n }\n\n async replace(next: TParams): Promise<void> {\n runInAction(() => {\n this.params = this.clone(next);\n });\n this.notify();\n }\n\n reset(): void {\n runInAction(() => {\n this.params = this.clone(this.initial);\n });\n this.notify();\n }\n\n subscribe(listener: (next: TParams) => void): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n dispose(): void {\n this.listeners.clear();\n }\n\n private notify(): void {\n const snap = this.clone(this.params);\n for (const listener of this.listeners) {\n try {\n listener(snap);\n } catch (error) {\n // Swallow listener errors to prevent cascading failures\n console.error(\"Error in ListQueryParams listener:\", error);\n }\n }\n }\n\n private clone(value: TParams): TParams {\n return structuredClone ? structuredClone(value) : JSON.parse(JSON.stringify(value));\n }\n}\n\nexport const ListQueryParamsRepository = Abstraction.createImplementation({\n implementation: ListQueryParamsRepositoryImpl,\n dependencies: []\n});\n"],"names":["ListQueryParamsRepositoryImpl","Set","makeAutoObservable","updater","runInAction","next","listener","snap","error","console","value","structuredClone","JSON","ListQueryParamsRepository","Abstraction"],"mappings":";;AAOO,MAAMA;IAOT,aAAc;aAFG,SAAS,GAAG,IAAIC;QAG7B,IAAI,CAAC,OAAO,GAAG;YAAE,QAAQ;YAAI,MAAM,EAAE;YAAE,SAAS,CAAC;YAAG,OAAO;QAAG;QAC9D,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO;QAErCC,mBACI,IAAI,EACJ;YACI,WAAW;YACX,SAAS;QACb,GACA;YAAE,UAAU;QAAK;IAEzB;IAEA,MAAe;QACX,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM;IACjC;IAEA,MAAM,IAAIC,OAAkC,EAAiB;QACzDC,YAAY;YACRD,QAAQ,IAAI,CAAC,MAAM;QACvB;QACA,IAAI,CAAC,MAAM;IACf;IAEA,MAAM,QAAQE,IAAa,EAAiB;QACxCD,YAAY;YACR,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAACC;QAC7B;QACA,IAAI,CAAC,MAAM;IACf;IAEA,QAAc;QACVD,YAAY;YACR,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO;QACzC;QACA,IAAI,CAAC,MAAM;IACf;IAEA,UAAUE,QAAiC,EAAc;QACrD,IAAI,CAAC,SAAS,CAAC,GAAG,CAACA;QACnB,OAAO;YACH,IAAI,CAAC,SAAS,CAAC,MAAM,CAACA;QAC1B;IACJ;IAEA,UAAgB;QACZ,IAAI,CAAC,SAAS,CAAC,KAAK;IACxB;IAEQ,SAAe;QACnB,MAAMC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM;QACnC,KAAK,MAAMD,YAAY,IAAI,CAAC,SAAS,CACjC,IAAI;YACAA,SAASC;QACb,EAAE,OAAOC,OAAO;YAEZC,QAAQ,KAAK,CAAC,sCAAsCD;QACxD;IAER;IAEQ,MAAME,KAAc,EAAW;QACnC,OAAOC,kBAAkBA,gBAAgBD,SAASE,KAAK,KAAK,CAACA,KAAK,SAAS,CAACF;IAChF;AACJ;AAEO,MAAMG,sDAA4BC,0BAAAA,oBAAgC,CAAC;IACtE,gBAAgBd;IAChB,cAAc,EAAE;AACpB"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type ILoadMoreFeature, ListDataRepository, ListQueryParamsRepository, LoadingRepository, type BaseListParams } from "./abstractions.js";
|
|
2
|
+
declare class LoadMoreFeatureImpl<TItem, TParams extends BaseListParams> implements ILoadMoreFeature {
|
|
3
|
+
private repository;
|
|
4
|
+
private queryParams;
|
|
5
|
+
private loading;
|
|
6
|
+
constructor(repository: ListDataRepository.Interface<TItem, TParams>, queryParams: ListQueryParamsRepository.Interface<TParams>, loading: LoadingRepository.Interface);
|
|
7
|
+
execute(): Promise<void>;
|
|
8
|
+
private canLoadMore;
|
|
9
|
+
}
|
|
10
|
+
export declare const LoadMoreFeature: typeof LoadMoreFeatureImpl & {
|
|
11
|
+
__abstraction: import("@webiny/di").Abstraction<ILoadMoreFeature>;
|
|
12
|
+
};
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { ListDataRepository, ListQueryParamsRepository, LoadMoreFeature, LoadingRepository } from "./abstractions.js";
|
|
2
|
+
class LoadMoreFeatureImpl {
|
|
3
|
+
constructor(repository, queryParams, loading){
|
|
4
|
+
this.repository = repository;
|
|
5
|
+
this.queryParams = queryParams;
|
|
6
|
+
this.loading = loading;
|
|
7
|
+
}
|
|
8
|
+
async execute() {
|
|
9
|
+
if (!this.canLoadMore()) return;
|
|
10
|
+
const params = this.queryParams.get();
|
|
11
|
+
await this.loading.runCallback(this.repository.append(params), "loadMore");
|
|
12
|
+
}
|
|
13
|
+
canLoadMore() {
|
|
14
|
+
if (this.loading.isLoading("loadMore")) return false;
|
|
15
|
+
return this.repository.hasMore();
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
const LoadMoreFeature_LoadMoreFeature = LoadMoreFeature.createImplementation({
|
|
19
|
+
implementation: LoadMoreFeatureImpl,
|
|
20
|
+
dependencies: [
|
|
21
|
+
ListDataRepository,
|
|
22
|
+
ListQueryParamsRepository,
|
|
23
|
+
LoadingRepository
|
|
24
|
+
]
|
|
25
|
+
});
|
|
26
|
+
export { LoadMoreFeature_LoadMoreFeature as LoadMoreFeature };
|
|
27
|
+
|
|
28
|
+
//# sourceMappingURL=LoadMoreFeature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/List/LoadMoreFeature.js","sources":["../../../src/features/List/LoadMoreFeature.ts"],"sourcesContent":["import {\n LoadMoreFeature as Abstraction,\n type ILoadMoreFeature,\n ListDataRepository,\n ListQueryParamsRepository,\n LoadingRepository,\n type BaseListParams\n} from \"./abstractions.js\";\n\nclass LoadMoreFeatureImpl<TItem, TParams extends BaseListParams> implements ILoadMoreFeature {\n constructor(\n private repository: ListDataRepository.Interface<TItem, TParams>,\n private queryParams: ListQueryParamsRepository.Interface<TParams>,\n private loading: LoadingRepository.Interface\n ) {}\n\n async execute(): Promise<void> {\n if (!this.canLoadMore()) {\n return;\n }\n\n const params = this.queryParams.get();\n\n await this.loading.runCallback(this.repository.append(params), \"loadMore\");\n }\n\n private canLoadMore(): boolean {\n // Don't allow load more if already loading\n if (this.loading.isLoading(\"loadMore\")) {\n return false;\n }\n\n // Check if repository has more items\n return this.repository.hasMore();\n }\n}\n\nexport const LoadMoreFeature = Abstraction.createImplementation({\n implementation: LoadMoreFeatureImpl,\n dependencies: [ListDataRepository, ListQueryParamsRepository, LoadingRepository]\n});\n"],"names":["LoadMoreFeatureImpl","repository","queryParams","loading","params","LoadMoreFeature","Abstraction","ListDataRepository","ListQueryParamsRepository","LoadingRepository"],"mappings":";AASA,MAAMA;IACF,YACYC,UAAwD,EACxDC,WAAyD,EACzDC,OAAoC,CAC9C;aAHUF,UAAU,GAAVA;aACAC,WAAW,GAAXA;aACAC,OAAO,GAAPA;IACT;IAEH,MAAM,UAAyB;QAC3B,IAAI,CAAC,IAAI,CAAC,WAAW,IACjB;QAGJ,MAAMC,SAAS,IAAI,CAAC,WAAW,CAAC,GAAG;QAEnC,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAACA,SAAS;IACnE;IAEQ,cAAuB;QAE3B,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,aACvB,OAAO;QAIX,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO;IAClC;AACJ;AAEO,MAAMC,kCAAkBC,gBAAAA,oBAAgC,CAAC;IAC5D,gBAAgBN;IAChB,cAAc;QAACO;QAAoBC;QAA2BC;KAAkB;AACpF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type ILoadingRepository } from "./abstractions.js";
|
|
2
|
+
declare class LoadingRepositoryImpl implements ILoadingRepository {
|
|
3
|
+
private loadingStates;
|
|
4
|
+
constructor();
|
|
5
|
+
get(): Record<string, boolean>;
|
|
6
|
+
set(action: string, isLoading?: boolean): Promise<void>;
|
|
7
|
+
runCallback<T>(callback: Promise<T>, action: string): Promise<T>;
|
|
8
|
+
isLoading(action: string): boolean;
|
|
9
|
+
hasLoading(): boolean;
|
|
10
|
+
isEmpty(): boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare const LoadingRepository: typeof LoadingRepositoryImpl & {
|
|
13
|
+
__abstraction: import("@webiny/di").Abstraction<ILoadingRepository>;
|
|
14
|
+
};
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { makeAutoObservable, runInAction } from "mobx";
|
|
2
|
+
import { LoadingRepository } from "./abstractions.js";
|
|
3
|
+
class LoadingRepositoryImpl {
|
|
4
|
+
constructor(){
|
|
5
|
+
this.loadingStates = {};
|
|
6
|
+
makeAutoObservable(this, {}, {
|
|
7
|
+
autoBind: true
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
get() {
|
|
11
|
+
return {
|
|
12
|
+
...this.loadingStates
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
async set(action, isLoading = true) {
|
|
16
|
+
runInAction(()=>{
|
|
17
|
+
if (isLoading) this.loadingStates[action] = true;
|
|
18
|
+
else delete this.loadingStates[action];
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
async runCallback(callback, action) {
|
|
22
|
+
await this.set(action, true);
|
|
23
|
+
try {
|
|
24
|
+
const result = await callback;
|
|
25
|
+
await this.set(action, false);
|
|
26
|
+
return result;
|
|
27
|
+
} catch (error) {
|
|
28
|
+
await this.set(action, false);
|
|
29
|
+
throw error;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
isLoading(action) {
|
|
33
|
+
return true === this.loadingStates[action];
|
|
34
|
+
}
|
|
35
|
+
hasLoading() {
|
|
36
|
+
return Object.keys(this.loadingStates).length > 0;
|
|
37
|
+
}
|
|
38
|
+
isEmpty() {
|
|
39
|
+
return 0 === Object.keys(this.loadingStates).length;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const LoadingRepository_LoadingRepository = LoadingRepository.createImplementation({
|
|
43
|
+
implementation: LoadingRepositoryImpl,
|
|
44
|
+
dependencies: []
|
|
45
|
+
});
|
|
46
|
+
export { LoadingRepository_LoadingRepository as LoadingRepository };
|
|
47
|
+
|
|
48
|
+
//# sourceMappingURL=LoadingRepository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/List/LoadingRepository.js","sources":["../../../src/features/List/LoadingRepository.ts"],"sourcesContent":["import { makeAutoObservable, runInAction } from \"mobx\";\nimport { LoadingRepository as Abstraction, type ILoadingRepository } from \"./abstractions.js\";\n\nclass LoadingRepositoryImpl implements ILoadingRepository {\n private loadingStates: Record<string, boolean> = {};\n\n constructor() {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n get(): Record<string, boolean> {\n return { ...this.loadingStates };\n }\n\n async set(action: string, isLoading: boolean = true): Promise<void> {\n runInAction(() => {\n if (isLoading) {\n this.loadingStates[action] = true;\n } else {\n delete this.loadingStates[action];\n }\n });\n }\n\n async runCallback<T>(callback: Promise<T>, action: string): Promise<T> {\n await this.set(action, true);\n try {\n const result = await callback;\n await this.set(action, false);\n return result;\n } catch (error) {\n await this.set(action, false);\n throw error;\n }\n }\n\n isLoading(action: string): boolean {\n return this.loadingStates[action] === true;\n }\n\n hasLoading(): boolean {\n return Object.keys(this.loadingStates).length > 0;\n }\n\n isEmpty(): boolean {\n return Object.keys(this.loadingStates).length === 0;\n }\n}\n\nexport const LoadingRepository = Abstraction.createImplementation({\n implementation: LoadingRepositoryImpl,\n dependencies: []\n});\n"],"names":["LoadingRepositoryImpl","makeAutoObservable","action","isLoading","runInAction","callback","result","error","Object","LoadingRepository","Abstraction"],"mappings":";;AAGA,MAAMA;IAGF,aAAc;aAFN,aAAa,GAA4B,CAAC;QAG9CC,mBAAmB,IAAI,EAAE,CAAC,GAAG;YAAE,UAAU;QAAK;IAClD;IAEA,MAA+B;QAC3B,OAAO;YAAE,GAAG,IAAI,CAAC,aAAa;QAAC;IACnC;IAEA,MAAM,IAAIC,MAAc,EAAEC,YAAqB,IAAI,EAAiB;QAChEC,YAAY;YACR,IAAID,WACA,IAAI,CAAC,aAAa,CAACD,OAAO,GAAG;iBAE7B,OAAO,IAAI,CAAC,aAAa,CAACA,OAAO;QAEzC;IACJ;IAEA,MAAM,YAAeG,QAAoB,EAAEH,MAAc,EAAc;QACnE,MAAM,IAAI,CAAC,GAAG,CAACA,QAAQ;QACvB,IAAI;YACA,MAAMI,SAAS,MAAMD;YACrB,MAAM,IAAI,CAAC,GAAG,CAACH,QAAQ;YACvB,OAAOI;QACX,EAAE,OAAOC,OAAO;YACZ,MAAM,IAAI,CAAC,GAAG,CAACL,QAAQ;YACvB,MAAMK;QACV;IACJ;IAEA,UAAUL,MAAc,EAAW;QAC/B,OAAO,AAA+B,SAA/B,IAAI,CAAC,aAAa,CAACA,OAAO;IACrC;IAEA,aAAsB;QAClB,OAAOM,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG;IACpD;IAEA,UAAmB;QACf,OAAOA,AAA2C,MAA3CA,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM;IACjD;AACJ;AAEO,MAAMC,sCAAoBC,kBAAAA,oBAAgC,CAAC;IAC9D,gBAAgBV;IAChB,cAAc,EAAE;AACpB"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type ISearchFeature, ListQueryParamsRepository, type BaseListParams } from "./abstractions.js";
|
|
2
|
+
declare class SearchFeatureImpl<TParams extends BaseListParams> implements ISearchFeature {
|
|
3
|
+
private queryParams;
|
|
4
|
+
constructor(queryParams: ListQueryParamsRepository.Interface<TParams>);
|
|
5
|
+
setSearch(query: string): Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
export declare const SearchFeature: typeof SearchFeatureImpl & {
|
|
8
|
+
__abstraction: import("@webiny/di").Abstraction<ISearchFeature>;
|
|
9
|
+
};
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ListQueryParamsRepository, SearchFeature } from "./abstractions.js";
|
|
2
|
+
class SearchFeatureImpl {
|
|
3
|
+
constructor(queryParams){
|
|
4
|
+
this.queryParams = queryParams;
|
|
5
|
+
}
|
|
6
|
+
async setSearch(query) {
|
|
7
|
+
await this.queryParams.set((params)=>{
|
|
8
|
+
params.search = query;
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
const SearchFeature_SearchFeature = SearchFeature.createImplementation({
|
|
13
|
+
implementation: SearchFeatureImpl,
|
|
14
|
+
dependencies: [
|
|
15
|
+
ListQueryParamsRepository
|
|
16
|
+
]
|
|
17
|
+
});
|
|
18
|
+
export { SearchFeature_SearchFeature as SearchFeature };
|
|
19
|
+
|
|
20
|
+
//# sourceMappingURL=SearchFeature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/List/SearchFeature.js","sources":["../../../src/features/List/SearchFeature.ts"],"sourcesContent":["import {\n SearchFeature as Abstraction,\n type ISearchFeature,\n ListQueryParamsRepository,\n type BaseListParams\n} from \"./abstractions.js\";\n\nclass SearchFeatureImpl<TParams extends BaseListParams> implements ISearchFeature {\n constructor(private queryParams: ListQueryParamsRepository.Interface<TParams>) {}\n\n async setSearch(query: string): Promise<void> {\n await this.queryParams.set(params => {\n params.search = query;\n });\n }\n}\n\nexport const SearchFeature = Abstraction.createImplementation({\n implementation: SearchFeatureImpl,\n dependencies: [ListQueryParamsRepository]\n});\n"],"names":["SearchFeatureImpl","queryParams","query","params","SearchFeature","Abstraction","ListQueryParamsRepository"],"mappings":";AAOA,MAAMA;IACF,YAAoBC,WAAyD,CAAE;aAA3DA,WAAW,GAAXA;IAA4D;IAEhF,MAAM,UAAUC,KAAa,EAAiB;QAC1C,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAACC,CAAAA;YACvBA,OAAO,MAAM,GAAGD;QACpB;IACJ;AACJ;AAEO,MAAME,8BAAgBC,cAAAA,oBAAgC,CAAC;IAC1D,gBAAgBL;IAChB,cAAc;QAACM;KAA0B;AAC7C"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type ISortFeature, ListQueryParamsRepository, type BaseListParams } from "./abstractions.js";
|
|
2
|
+
declare class SortFeatureImpl<TParams extends BaseListParams> implements ISortFeature {
|
|
3
|
+
private queryParams;
|
|
4
|
+
constructor(queryParams: ListQueryParamsRepository.Interface<TParams>);
|
|
5
|
+
setSort(by: string, dir: "asc" | "desc"): Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
export declare const SortFeature: typeof SortFeatureImpl & {
|
|
8
|
+
__abstraction: import("@webiny/di").Abstraction<ISortFeature>;
|
|
9
|
+
};
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { ListQueryParamsRepository, SortFeature } from "./abstractions.js";
|
|
2
|
+
class SortFeatureImpl {
|
|
3
|
+
constructor(queryParams){
|
|
4
|
+
this.queryParams = queryParams;
|
|
5
|
+
}
|
|
6
|
+
async setSort(by, dir) {
|
|
7
|
+
await this.queryParams.set((params)=>{
|
|
8
|
+
params.sort = {
|
|
9
|
+
by,
|
|
10
|
+
dir
|
|
11
|
+
};
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
const SortFeature_SortFeature = SortFeature.createImplementation({
|
|
16
|
+
implementation: SortFeatureImpl,
|
|
17
|
+
dependencies: [
|
|
18
|
+
ListQueryParamsRepository
|
|
19
|
+
]
|
|
20
|
+
});
|
|
21
|
+
export { SortFeature_SortFeature as SortFeature };
|
|
22
|
+
|
|
23
|
+
//# sourceMappingURL=SortFeature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/List/SortFeature.js","sources":["../../../src/features/List/SortFeature.ts"],"sourcesContent":["import {\n SortFeature as Abstraction,\n type ISortFeature,\n ListQueryParamsRepository,\n type BaseListParams\n} from \"./abstractions.js\";\n\nclass SortFeatureImpl<TParams extends BaseListParams> implements ISortFeature {\n constructor(private queryParams: ListQueryParamsRepository.Interface<TParams>) {}\n\n async setSort(by: string, dir: \"asc\" | \"desc\"): Promise<void> {\n await this.queryParams.set(params => {\n params.sort = { by, dir };\n });\n }\n}\n\nexport const SortFeature = Abstraction.createImplementation({\n implementation: SortFeatureImpl,\n dependencies: [ListQueryParamsRepository]\n});\n"],"names":["SortFeatureImpl","queryParams","by","dir","params","SortFeature","Abstraction","ListQueryParamsRepository"],"mappings":";AAOA,MAAMA;IACF,YAAoBC,WAAyD,CAAE;aAA3DA,WAAW,GAAXA;IAA4D;IAEhF,MAAM,QAAQC,EAAU,EAAEC,GAAmB,EAAiB;QAC1D,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAACC,CAAAA;YACvBA,OAAO,IAAI,GAAG;gBAAEF;gBAAIC;YAAI;QAC5B;IACJ;AACJ;AAEO,MAAME,0BAAcC,YAAAA,oBAAgC,CAAC;IACxD,gBAAgBN;IAChB,cAAc;QAACO;KAA0B;AAC7C"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
export interface BaseListParams {
|
|
2
|
+
search?: string;
|
|
3
|
+
sort?: {
|
|
4
|
+
by: string;
|
|
5
|
+
dir: "asc" | "desc";
|
|
6
|
+
};
|
|
7
|
+
filters?: Record<string, unknown>;
|
|
8
|
+
limit?: number;
|
|
9
|
+
}
|
|
10
|
+
export interface IListQueryParamsRepository<TParams extends BaseListParams> {
|
|
11
|
+
get(): TParams;
|
|
12
|
+
set(updater: (params: TParams) => void): Promise<void>;
|
|
13
|
+
replace(next: TParams): Promise<void>;
|
|
14
|
+
reset(): void;
|
|
15
|
+
subscribe(listener: (next: TParams) => void): () => void;
|
|
16
|
+
dispose(): void;
|
|
17
|
+
}
|
|
18
|
+
export declare const ListQueryParamsRepository: import("@webiny/di").Abstraction<IListQueryParamsRepository<any>>;
|
|
19
|
+
export declare namespace ListQueryParamsRepository {
|
|
20
|
+
type Interface<TParams extends BaseListParams = BaseListParams> = IListQueryParamsRepository<TParams>;
|
|
21
|
+
}
|
|
22
|
+
export interface ILoadingRepository {
|
|
23
|
+
get(): Record<string, boolean>;
|
|
24
|
+
set(action: string, isLoading?: boolean): Promise<void>;
|
|
25
|
+
runCallback<T>(callback: Promise<T>, action: string): Promise<T>;
|
|
26
|
+
isLoading(action: string): boolean;
|
|
27
|
+
hasLoading(): boolean;
|
|
28
|
+
isEmpty(): boolean;
|
|
29
|
+
}
|
|
30
|
+
export declare const LoadingRepository: import("@webiny/di").Abstraction<ILoadingRepository>;
|
|
31
|
+
export declare namespace LoadingRepository {
|
|
32
|
+
type Interface = ILoadingRepository;
|
|
33
|
+
}
|
|
34
|
+
export interface IListDataRepository<TItem, TParams extends BaseListParams> {
|
|
35
|
+
load(params: TParams): Promise<void>;
|
|
36
|
+
append(params: TParams): Promise<void>;
|
|
37
|
+
getAll(): TItem[];
|
|
38
|
+
hasMore(): boolean;
|
|
39
|
+
clear(): void;
|
|
40
|
+
}
|
|
41
|
+
export declare const ListDataRepository: import("@webiny/di").Abstraction<IListDataRepository<any, any>>;
|
|
42
|
+
export declare namespace ListDataRepository {
|
|
43
|
+
type Interface<TItem = any, TParams extends BaseListParams = BaseListParams> = IListDataRepository<TItem, TParams>;
|
|
44
|
+
}
|
|
45
|
+
export interface ISearchFeature {
|
|
46
|
+
setSearch(query: string): Promise<void>;
|
|
47
|
+
}
|
|
48
|
+
export declare const SearchFeature: import("@webiny/di").Abstraction<ISearchFeature>;
|
|
49
|
+
export declare namespace SearchFeature {
|
|
50
|
+
type Interface = ISearchFeature;
|
|
51
|
+
}
|
|
52
|
+
export interface IFilterFeature {
|
|
53
|
+
setFilter(key: string, value: unknown): Promise<void>;
|
|
54
|
+
clearAllFilters(): Promise<void>;
|
|
55
|
+
}
|
|
56
|
+
export declare const FilterFeature: import("@webiny/di").Abstraction<IFilterFeature>;
|
|
57
|
+
export declare namespace FilterFeature {
|
|
58
|
+
type Interface = IFilterFeature;
|
|
59
|
+
}
|
|
60
|
+
export interface ISortFeature {
|
|
61
|
+
setSort(by: string, dir: "asc" | "desc"): Promise<void>;
|
|
62
|
+
}
|
|
63
|
+
export declare const SortFeature: import("@webiny/di").Abstraction<ISortFeature>;
|
|
64
|
+
export declare namespace SortFeature {
|
|
65
|
+
type Interface = ISortFeature;
|
|
66
|
+
}
|
|
67
|
+
export interface ILoadMoreFeature {
|
|
68
|
+
execute(): Promise<void>;
|
|
69
|
+
}
|
|
70
|
+
export declare const LoadMoreFeature: import("@webiny/di").Abstraction<ILoadMoreFeature>;
|
|
71
|
+
export declare namespace LoadMoreFeature {
|
|
72
|
+
type Interface = ILoadMoreFeature;
|
|
73
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { createAbstraction } from "@webiny/feature/admin";
|
|
2
|
+
const ListQueryParamsRepository = createAbstraction("ListQueryParamsRepository");
|
|
3
|
+
const LoadingRepository = createAbstraction("LoadingRepository");
|
|
4
|
+
const ListDataRepository = createAbstraction("ListDataRepository");
|
|
5
|
+
const SearchFeature = createAbstraction("SearchFeature");
|
|
6
|
+
const FilterFeature = createAbstraction("FilterFeature");
|
|
7
|
+
const SortFeature = createAbstraction("SortFeature");
|
|
8
|
+
const LoadMoreFeature = createAbstraction("LoadMoreFeature");
|
|
9
|
+
export { FilterFeature, ListDataRepository, ListQueryParamsRepository, LoadMoreFeature, LoadingRepository, SearchFeature, SortFeature };
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=abstractions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/List/abstractions.js","sources":["../../../src/features/List/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/admin\";\n\n// ============================================================================\n// Base Types\n// ============================================================================\n\nexport interface BaseListParams {\n search?: string;\n sort?: { by: string; dir: \"asc\" | \"desc\" };\n filters?: Record<string, unknown>;\n limit?: number;\n}\n\n// ============================================================================\n// Query Params Repository\n// ============================================================================\n\nexport interface IListQueryParamsRepository<TParams extends BaseListParams> {\n get(): TParams;\n set(updater: (params: TParams) => void): Promise<void>;\n replace(next: TParams): Promise<void>;\n reset(): void;\n subscribe(listener: (next: TParams) => void): () => void;\n dispose(): void;\n}\n\nexport const ListQueryParamsRepository = createAbstraction<IListQueryParamsRepository<any>>(\n \"ListQueryParamsRepository\"\n);\n\nexport namespace ListQueryParamsRepository {\n export type Interface<TParams extends BaseListParams = BaseListParams> =\n IListQueryParamsRepository<TParams>;\n}\n\n// ============================================================================\n// Loading Repository\n// ============================================================================\n\nexport interface ILoadingRepository {\n get(): Record<string, boolean>;\n set(action: string, isLoading?: boolean): Promise<void>;\n runCallback<T>(callback: Promise<T>, action: string): Promise<T>;\n isLoading(action: string): boolean;\n hasLoading(): boolean;\n isEmpty(): boolean;\n}\n\nexport const LoadingRepository = createAbstraction<ILoadingRepository>(\"LoadingRepository\");\n\nexport namespace LoadingRepository {\n export type Interface = ILoadingRepository;\n}\n\n// ============================================================================\n// List Data Repository\n// ============================================================================\n\nexport interface IListDataRepository<TItem, TParams extends BaseListParams> {\n load(params: TParams): Promise<void>;\n append(params: TParams): Promise<void>;\n getAll(): TItem[];\n hasMore(): boolean;\n clear(): void;\n}\n\nexport const ListDataRepository =\n createAbstraction<IListDataRepository<any, any>>(\"ListDataRepository\");\n\nexport namespace ListDataRepository {\n export type Interface<\n TItem = any,\n TParams extends BaseListParams = BaseListParams\n > = IListDataRepository<TItem, TParams>;\n}\n\n// ============================================================================\n// Features\n// ============================================================================\n\nexport interface ISearchFeature {\n setSearch(query: string): Promise<void>;\n}\n\nexport const SearchFeature = createAbstraction<ISearchFeature>(\"SearchFeature\");\n\nexport namespace SearchFeature {\n export type Interface = ISearchFeature;\n}\n\nexport interface IFilterFeature {\n setFilter(key: string, value: unknown): Promise<void>;\n clearAllFilters(): Promise<void>;\n}\n\nexport const FilterFeature = createAbstraction<IFilterFeature>(\"FilterFeature\");\n\nexport namespace FilterFeature {\n export type Interface = IFilterFeature;\n}\n\nexport interface ISortFeature {\n setSort(by: string, dir: \"asc\" | \"desc\"): Promise<void>;\n}\n\nexport const SortFeature = createAbstraction<ISortFeature>(\"SortFeature\");\n\nexport namespace SortFeature {\n export type Interface = ISortFeature;\n}\n\nexport interface ILoadMoreFeature {\n execute(): Promise<void>;\n}\n\nexport const LoadMoreFeature = createAbstraction<ILoadMoreFeature>(\"LoadMoreFeature\");\n\nexport namespace LoadMoreFeature {\n export type Interface = ILoadMoreFeature;\n}\n"],"names":["ListQueryParamsRepository","createAbstraction","LoadingRepository","ListDataRepository","SearchFeature","FilterFeature","SortFeature","LoadMoreFeature"],"mappings":";AA0BO,MAAMA,4BAA4BC,kBACrC;AAqBG,MAAMC,oBAAoBD,kBAAsC;AAkBhE,MAAME,qBACTF,kBAAiD;AAiB9C,MAAMG,gBAAgBH,kBAAkC;AAWxD,MAAMI,gBAAgBJ,kBAAkC;AAUxD,MAAMK,cAAcL,kBAAgC;AAUpD,MAAMM,kBAAkBN,kBAAoC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const ListFeature: import("@webiny/feature/admin/createFeature.js").FeatureDefinition<{
|
|
2
|
+
queryParams: import("./abstractions.js").IListQueryParamsRepository<any>;
|
|
3
|
+
loading: import("./abstractions.js").ILoadingRepository;
|
|
4
|
+
search: import("./abstractions.js").ISearchFeature;
|
|
5
|
+
filter: import("./abstractions.js").IFilterFeature;
|
|
6
|
+
sort: import("./abstractions.js").ISortFeature;
|
|
7
|
+
loadMore: import("./abstractions.js").ILoadMoreFeature;
|
|
8
|
+
}, []>;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { createFeature } from "@webiny/feature/admin/index.js";
|
|
2
|
+
import { FilterFeature, ListQueryParamsRepository, LoadMoreFeature, LoadingRepository, SearchFeature, SortFeature } from "./abstractions.js";
|
|
3
|
+
import { ListQueryParamsRepository as external_ListQueryParamsRepository_js_ListQueryParamsRepository } from "./ListQueryParamsRepository.js";
|
|
4
|
+
import { LoadingRepository as external_LoadingRepository_js_LoadingRepository } from "./LoadingRepository.js";
|
|
5
|
+
import { SearchFeature as external_SearchFeature_js_SearchFeature } from "./SearchFeature.js";
|
|
6
|
+
import { FilterFeature as external_FilterFeature_js_FilterFeature } from "./FilterFeature.js";
|
|
7
|
+
import { SortFeature as external_SortFeature_js_SortFeature } from "./SortFeature.js";
|
|
8
|
+
import { LoadMoreFeature as external_LoadMoreFeature_js_LoadMoreFeature } from "./LoadMoreFeature.js";
|
|
9
|
+
const ListFeature = createFeature({
|
|
10
|
+
name: "ListFeature",
|
|
11
|
+
register: (container)=>{
|
|
12
|
+
container.register(external_ListQueryParamsRepository_js_ListQueryParamsRepository);
|
|
13
|
+
container.register(external_LoadingRepository_js_LoadingRepository);
|
|
14
|
+
container.register(external_SearchFeature_js_SearchFeature);
|
|
15
|
+
container.register(external_FilterFeature_js_FilterFeature);
|
|
16
|
+
container.register(external_SortFeature_js_SortFeature);
|
|
17
|
+
container.register(external_LoadMoreFeature_js_LoadMoreFeature);
|
|
18
|
+
},
|
|
19
|
+
resolve: (container)=>({
|
|
20
|
+
queryParams: container.resolve(ListQueryParamsRepository),
|
|
21
|
+
loading: container.resolve(LoadingRepository),
|
|
22
|
+
search: container.resolve(SearchFeature),
|
|
23
|
+
filter: container.resolve(FilterFeature),
|
|
24
|
+
sort: container.resolve(SortFeature),
|
|
25
|
+
loadMore: container.resolve(LoadMoreFeature)
|
|
26
|
+
})
|
|
27
|
+
});
|
|
28
|
+
export { ListFeature };
|
|
29
|
+
|
|
30
|
+
//# sourceMappingURL=feature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/List/feature.js","sources":["../../../src/features/List/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/admin/index.js\";\nimport {\n ListQueryParamsRepository as QueryParamsAbstraction,\n LoadingRepository as LoadingAbstraction,\n SearchFeature as SearchAbstraction,\n FilterFeature as FilterAbstraction,\n SortFeature as SortAbstraction,\n LoadMoreFeature as LoadMoreAbstraction\n} from \"./abstractions.js\";\nimport { ListQueryParamsRepository } from \"./ListQueryParamsRepository.js\";\nimport { LoadingRepository } from \"./LoadingRepository.js\";\nimport { SearchFeature } from \"./SearchFeature.js\";\nimport { FilterFeature } from \"./FilterFeature.js\";\nimport { SortFeature } from \"./SortFeature.js\";\nimport { LoadMoreFeature } from \"./LoadMoreFeature.js\";\n\nexport const ListFeature = createFeature({\n name: \"ListFeature\",\n register: container => {\n // Register infrastructure\n container.register(ListQueryParamsRepository);\n container.register(LoadingRepository);\n\n // Register features\n container.register(SearchFeature);\n container.register(FilterFeature);\n container.register(SortFeature);\n container.register(LoadMoreFeature);\n },\n resolve: container => {\n return {\n queryParams: container.resolve(QueryParamsAbstraction),\n loading: container.resolve(LoadingAbstraction),\n search: container.resolve(SearchAbstraction),\n filter: container.resolve(FilterAbstraction),\n sort: container.resolve(SortAbstraction),\n loadMore: container.resolve(LoadMoreAbstraction)\n };\n }\n});\n"],"names":["ListFeature","createFeature","container","ListQueryParamsRepository","LoadingRepository","SearchFeature","FilterFeature","SortFeature","LoadMoreFeature","QueryParamsAbstraction","LoadingAbstraction","SearchAbstraction","FilterAbstraction","SortAbstraction","LoadMoreAbstraction"],"mappings":";;;;;;;;AAgBO,MAAMA,cAAcC,cAAc;IACrC,MAAM;IACN,UAAUC,CAAAA;QAENA,UAAU,QAAQ,CAACC;QACnBD,UAAU,QAAQ,CAACE;QAGnBF,UAAU,QAAQ,CAACG;QACnBH,UAAU,QAAQ,CAACI;QACnBJ,UAAU,QAAQ,CAACK;QACnBL,UAAU,QAAQ,CAACM;IACvB;IACA,SAASN,CAAAA,YACE;YACH,aAAaA,UAAU,OAAO,CAACO;YAC/B,SAASP,UAAU,OAAO,CAACQ;YAC3B,QAAQR,UAAU,OAAO,CAACS;YAC1B,QAAQT,UAAU,OAAO,CAACU;YAC1B,MAAMV,UAAU,OAAO,CAACW;YACxB,UAAUX,UAAU,OAAO,CAACY;QAChC;AAER"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface MetaDTO {
|
|
2
|
+
totalCount: number;
|
|
3
|
+
cursor: string | null;
|
|
4
|
+
hasMoreItems: boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare class Meta {
|
|
7
|
+
totalCount: number;
|
|
8
|
+
cursor: string | null;
|
|
9
|
+
hasMoreItems: boolean;
|
|
10
|
+
protected constructor(meta: MetaDTO);
|
|
11
|
+
static create(meta: MetaDTO): Meta;
|
|
12
|
+
static createEmpty(): Meta;
|
|
13
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
class Meta {
|
|
2
|
+
constructor(meta){
|
|
3
|
+
this.totalCount = meta.totalCount;
|
|
4
|
+
this.cursor = meta.cursor;
|
|
5
|
+
this.hasMoreItems = meta.hasMoreItems;
|
|
6
|
+
}
|
|
7
|
+
static create(meta) {
|
|
8
|
+
return new Meta(meta);
|
|
9
|
+
}
|
|
10
|
+
static createEmpty() {
|
|
11
|
+
return new Meta({
|
|
12
|
+
totalCount: 0,
|
|
13
|
+
cursor: null,
|
|
14
|
+
hasMoreItems: false
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export { Meta };
|
|
19
|
+
|
|
20
|
+
//# sourceMappingURL=Meta.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fta/Domain/Models/Meta/Meta.js","sources":["../../../../../src/fta/Domain/Models/Meta/Meta.ts"],"sourcesContent":["export interface MetaDTO {\n totalCount: number;\n cursor: string | null;\n hasMoreItems: boolean;\n}\n\nexport class Meta {\n public totalCount: number;\n public cursor: string | null;\n public hasMoreItems: boolean;\n\n protected constructor(meta: MetaDTO) {\n this.totalCount = meta.totalCount;\n this.cursor = meta.cursor;\n this.hasMoreItems = meta.hasMoreItems;\n }\n\n static create(meta: MetaDTO) {\n return new Meta(meta);\n }\n\n static createEmpty() {\n return new Meta({\n totalCount: 0,\n cursor: null,\n hasMoreItems: false\n });\n }\n}\n"],"names":["Meta","meta"],"mappings":"AAMO,MAAMA;IAKT,YAAsBC,IAAa,CAAE;QACjC,IAAI,CAAC,UAAU,GAAGA,KAAK,UAAU;QACjC,IAAI,CAAC,MAAM,GAAGA,KAAK,MAAM;QACzB,IAAI,CAAC,YAAY,GAAGA,KAAK,YAAY;IACzC;IAEA,OAAO,OAAOA,IAAa,EAAE;QACzB,OAAO,IAAID,KAAKC;IACpB;IAEA,OAAO,cAAc;QACjB,OAAO,IAAID,KAAK;YACZ,YAAY;YACZ,QAAQ;YACR,cAAc;QAClB;IACJ;AACJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fta/Domain/Models/Meta/MetaMapper.js","sources":["../../../../../src/fta/Domain/Models/Meta/MetaMapper.ts"],"sourcesContent":["import type { Meta, MetaDTO } from \"./Meta.js\";\n\nexport class MetaMapper {\n static toDto(data: Meta | MetaDTO): MetaDTO {\n return {\n totalCount: data.totalCount ?? 0,\n cursor: data.cursor ?? null,\n hasMoreItems: data.hasMoreItems ?? false\n };\n }\n}\n"],"names":["MetaMapper","data"],"mappings":"AAEO,MAAMA;IACT,OAAO,MAAMC,IAAoB,EAAW;QACxC,OAAO;YACH,YAAYA,KAAK,UAAU,IAAI;YAC/B,QAAQA,KAAK,MAAM,IAAI;YACvB,cAAcA,KAAK,YAAY,IAAI;QACvC;IACJ;AACJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fta/Domain/Models/Sorting/Sorting.js","sources":["../../../../../src/fta/Domain/Models/Sorting/Sorting.ts"],"sourcesContent":["export interface SortingDTO {\n field: string;\n order: \"asc\" | \"desc\";\n}\n\nexport class Sorting {\n public field: string;\n public order: \"asc\" | \"desc\";\n\n protected constructor(sorting: SortingDTO) {\n this.field = sorting.field;\n this.order = sorting.order;\n }\n\n static create(sorting: SortingDTO) {\n return new Sorting(sorting);\n }\n}\n"],"names":["Sorting","sorting"],"mappings":"AAKO,MAAMA;IAIT,YAAsBC,OAAmB,CAAE;QACvC,IAAI,CAAC,KAAK,GAAGA,QAAQ,KAAK;QAC1B,IAAI,CAAC,KAAK,GAAGA,QAAQ,KAAK;IAC9B;IAEA,OAAO,OAAOA,OAAmB,EAAE;QAC/B,OAAO,IAAID,QAAQC;IACvB;AACJ"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Sorting, SortingDTO } from "./Sorting.js";
|
|
2
|
+
export type DbSorting = `${string}_ASC` | `${string}_DESC`;
|
|
3
|
+
export interface ColumnSorting {
|
|
4
|
+
id: string;
|
|
5
|
+
desc: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare class SortingMapper {
|
|
8
|
+
static toDTO(data: Sorting | SortingDTO): SortingDTO;
|
|
9
|
+
static fromColumnToDTO(data: ColumnSorting): SortingDTO;
|
|
10
|
+
static fromDTOtoColumn(data: SortingDTO): ColumnSorting;
|
|
11
|
+
static fromDTOtoDb(data: SortingDTO): DbSorting;
|
|
12
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
class SortingMapper {
|
|
2
|
+
static toDTO(data) {
|
|
3
|
+
const { field, order } = data;
|
|
4
|
+
return {
|
|
5
|
+
field,
|
|
6
|
+
order
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
static fromColumnToDTO(data) {
|
|
10
|
+
const { id, desc } = data;
|
|
11
|
+
return {
|
|
12
|
+
field: id,
|
|
13
|
+
order: desc ? "desc" : "asc"
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
static fromDTOtoColumn(data) {
|
|
17
|
+
const { field, order } = data;
|
|
18
|
+
return {
|
|
19
|
+
id: field,
|
|
20
|
+
desc: "desc" === order
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
static fromDTOtoDb(data) {
|
|
24
|
+
const { field, order } = data;
|
|
25
|
+
if ("asc" === order) return `${field}_ASC`;
|
|
26
|
+
return `${field}_DESC`;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export { SortingMapper };
|
|
30
|
+
|
|
31
|
+
//# sourceMappingURL=SortingMapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fta/Domain/Models/Sorting/SortingMapper.js","sources":["../../../../../src/fta/Domain/Models/Sorting/SortingMapper.ts"],"sourcesContent":["import type { Sorting, SortingDTO } from \"./Sorting.js\";\n\nexport type DbSorting = `${string}_ASC` | `${string}_DESC`;\n\nexport interface ColumnSorting {\n id: string;\n desc: boolean;\n}\n\nexport class SortingMapper {\n static toDTO(data: Sorting | SortingDTO): SortingDTO {\n const { field, order } = data;\n\n return {\n field,\n order\n };\n }\n\n static fromColumnToDTO(data: ColumnSorting): SortingDTO {\n const { id, desc } = data;\n\n return {\n field: id,\n order: desc ? \"desc\" : \"asc\"\n };\n }\n\n static fromDTOtoColumn(data: SortingDTO): ColumnSorting {\n const { field, order } = data;\n\n return {\n id: field,\n desc: order === \"desc\"\n };\n }\n\n static fromDTOtoDb(data: SortingDTO): DbSorting {\n const { field, order } = data;\n\n if (order === \"asc\") {\n return `${field}_ASC`;\n }\n\n return `${field}_DESC`;\n }\n}\n"],"names":["SortingMapper","data","field","order","id","desc"],"mappings":"AASO,MAAMA;IACT,OAAO,MAAMC,IAA0B,EAAc;QACjD,MAAM,EAAEC,KAAK,EAAEC,KAAK,EAAE,GAAGF;QAEzB,OAAO;YACHC;YACAC;QACJ;IACJ;IAEA,OAAO,gBAAgBF,IAAmB,EAAc;QACpD,MAAM,EAAEG,EAAE,EAAEC,IAAI,EAAE,GAAGJ;QAErB,OAAO;YACH,OAAOG;YACP,OAAOC,OAAO,SAAS;QAC3B;IACJ;IAEA,OAAO,gBAAgBJ,IAAgB,EAAiB;QACpD,MAAM,EAAEC,KAAK,EAAEC,KAAK,EAAE,GAAGF;QAEzB,OAAO;YACH,IAAIC;YACJ,MAAMC,AAAU,WAAVA;QACV;IACJ;IAEA,OAAO,YAAYF,IAAgB,EAAa;QAC5C,MAAM,EAAEC,KAAK,EAAEC,KAAK,EAAE,GAAGF;QAEzB,IAAIE,AAAU,UAAVA,OACA,OAAO,GAAGD,MAAM,IAAI,CAAC;QAGzB,OAAO,GAAGA,MAAM,KAAK,CAAC;IAC1B;AACJ"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface ILoadingRepository {
|
|
2
|
+
get: () => Record<string, boolean>;
|
|
3
|
+
set: (action: string, isLoading?: boolean) => Promise<void>;
|
|
4
|
+
getActiveLoadings(): string[];
|
|
5
|
+
runCallBack: <T>(callback: Promise<T>, action: string) => Promise<T>;
|
|
6
|
+
isLoading: (action: string) => boolean;
|
|
7
|
+
hasLoading: () => boolean;
|
|
8
|
+
isEmpty: () => boolean;
|
|
9
|
+
}
|
|
File without changes
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ILoadingRepository } from "./ILoadingRepository.js";
|
|
2
|
+
export declare class LoadingRepository implements ILoadingRepository {
|
|
3
|
+
private loadings;
|
|
4
|
+
constructor();
|
|
5
|
+
get(): {
|
|
6
|
+
[k: string]: boolean;
|
|
7
|
+
};
|
|
8
|
+
getActiveLoadings(): string[];
|
|
9
|
+
hasLoading(): boolean;
|
|
10
|
+
isLoading(action: string): boolean;
|
|
11
|
+
isEmpty(): boolean;
|
|
12
|
+
set(action: string, isLoading?: boolean): Promise<void>;
|
|
13
|
+
runCallBack(callback: Promise<any>, action: string): Promise<any>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { makeAutoObservable } from "mobx";
|
|
2
|
+
class LoadingRepository {
|
|
3
|
+
constructor(){
|
|
4
|
+
this.loadings = new Map();
|
|
5
|
+
makeAutoObservable(this);
|
|
6
|
+
}
|
|
7
|
+
get() {
|
|
8
|
+
return Object.fromEntries(this.loadings);
|
|
9
|
+
}
|
|
10
|
+
getActiveLoadings() {
|
|
11
|
+
return [
|
|
12
|
+
...this.loadings.entries()
|
|
13
|
+
].filter(([, value])=>value).map(([key])=>key);
|
|
14
|
+
}
|
|
15
|
+
hasLoading() {
|
|
16
|
+
return [
|
|
17
|
+
...this.loadings.values()
|
|
18
|
+
].some(Boolean);
|
|
19
|
+
}
|
|
20
|
+
isLoading(action) {
|
|
21
|
+
return this.loadings.get(action) ?? false;
|
|
22
|
+
}
|
|
23
|
+
isEmpty() {
|
|
24
|
+
return 0 === this.loadings.size;
|
|
25
|
+
}
|
|
26
|
+
async set(action, isLoading = true) {
|
|
27
|
+
this.loadings.set(action, isLoading);
|
|
28
|
+
}
|
|
29
|
+
async runCallBack(callback, action) {
|
|
30
|
+
await this.set(action, true);
|
|
31
|
+
try {
|
|
32
|
+
const result = await callback;
|
|
33
|
+
await this.set(action, false);
|
|
34
|
+
return result;
|
|
35
|
+
} catch (error) {
|
|
36
|
+
await this.set(action, false);
|
|
37
|
+
throw error;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export { LoadingRepository };
|
|
42
|
+
|
|
43
|
+
//# sourceMappingURL=LoadingRepository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fta/Domain/Repositories/Loading/LoadingRepository.js","sources":["../../../../../src/fta/Domain/Repositories/Loading/LoadingRepository.ts"],"sourcesContent":["import { makeAutoObservable } from \"mobx\";\nimport type { ILoadingRepository } from \"./ILoadingRepository.js\";\n\nexport class LoadingRepository implements ILoadingRepository {\n private loadings: Map<string, boolean>;\n\n constructor() {\n this.loadings = new Map();\n makeAutoObservable(this);\n }\n\n get() {\n return Object.fromEntries(this.loadings);\n }\n\n getActiveLoadings(): string[] {\n return [...this.loadings.entries()].filter(([, value]) => value).map(([key]) => key);\n }\n\n hasLoading() {\n return [...this.loadings.values()].some(Boolean);\n }\n\n isLoading(action: string) {\n return this.loadings.get(action) ?? false;\n }\n\n isEmpty() {\n return this.loadings.size === 0;\n }\n\n async set(action: string, isLoading = true) {\n this.loadings.set(action, isLoading);\n }\n\n async runCallBack(callback: Promise<any>, action: string) {\n await this.set(action, true);\n try {\n const result = await callback;\n await this.set(action, false);\n return result;\n } catch (error) {\n await this.set(action, false);\n throw error;\n }\n }\n}\n"],"names":["LoadingRepository","Map","makeAutoObservable","Object","value","key","Boolean","action","isLoading","callback","result","error"],"mappings":";AAGO,MAAMA;IAGT,aAAc;QACV,IAAI,CAAC,QAAQ,GAAG,IAAIC;QACpBC,mBAAmB,IAAI;IAC3B;IAEA,MAAM;QACF,OAAOC,OAAO,WAAW,CAAC,IAAI,CAAC,QAAQ;IAC3C;IAEA,oBAA8B;QAC1B,OAAO;eAAI,IAAI,CAAC,QAAQ,CAAC,OAAO;SAAG,CAAC,MAAM,CAAC,CAAC,GAAGC,MAAM,GAAKA,OAAO,GAAG,CAAC,CAAC,CAACC,IAAI,GAAKA;IACpF;IAEA,aAAa;QACT,OAAO;eAAI,IAAI,CAAC,QAAQ,CAAC,MAAM;SAAG,CAAC,IAAI,CAACC;IAC5C;IAEA,UAAUC,MAAc,EAAE;QACtB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAACA,WAAW;IACxC;IAEA,UAAU;QACN,OAAO,AAAuB,MAAvB,IAAI,CAAC,QAAQ,CAAC,IAAI;IAC7B;IAEA,MAAM,IAAIA,MAAc,EAAEC,YAAY,IAAI,EAAE;QACxC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAACD,QAAQC;IAC9B;IAEA,MAAM,YAAYC,QAAsB,EAAEF,MAAc,EAAE;QACtD,MAAM,IAAI,CAAC,GAAG,CAACA,QAAQ;QACvB,IAAI;YACA,MAAMG,SAAS,MAAMD;YACrB,MAAM,IAAI,CAAC,GAAG,CAACF,QAAQ;YACvB,OAAOG;QACX,EAAE,OAAOC,OAAO;YACZ,MAAM,IAAI,CAAC,GAAG,CAACJ,QAAQ;YACvB,MAAMI;QACV;IACJ;AACJ"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { LoadingRepository } from "./LoadingRepository.js";
|
|
2
|
+
export declare class LoadingRepositoryFactory {
|
|
3
|
+
private cache;
|
|
4
|
+
getRepository(namespace?: string): LoadingRepository;
|
|
5
|
+
private getCacheKey;
|
|
6
|
+
}
|
|
7
|
+
export declare const loadingRepositoryFactory: LoadingRepositoryFactory;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { LoadingRepository } from "./LoadingRepository.js";
|
|
2
|
+
class LoadingRepositoryFactory {
|
|
3
|
+
getRepository(namespace) {
|
|
4
|
+
const cacheKey = this.getCacheKey(namespace);
|
|
5
|
+
if (!this.cache.has(cacheKey)) this.cache.set(cacheKey, new LoadingRepository());
|
|
6
|
+
return this.cache.get(cacheKey);
|
|
7
|
+
}
|
|
8
|
+
getCacheKey(namespace) {
|
|
9
|
+
return namespace ?? Date.now().toString();
|
|
10
|
+
}
|
|
11
|
+
constructor(){
|
|
12
|
+
this.cache = new Map();
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
const loadingRepositoryFactory = new LoadingRepositoryFactory();
|
|
16
|
+
export { LoadingRepositoryFactory, loadingRepositoryFactory };
|
|
17
|
+
|
|
18
|
+
//# sourceMappingURL=LoadingRepositoryFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fta/Domain/Repositories/Loading/LoadingRepositoryFactory.js","sources":["../../../../../src/fta/Domain/Repositories/Loading/LoadingRepositoryFactory.ts"],"sourcesContent":["import { LoadingRepository } from \"./LoadingRepository.js\";\n\nexport class LoadingRepositoryFactory {\n private cache: Map<string, LoadingRepository> = new Map();\n\n getRepository(namespace?: string) {\n const cacheKey = this.getCacheKey(namespace);\n\n if (!this.cache.has(cacheKey)) {\n this.cache.set(cacheKey, new LoadingRepository());\n }\n\n return this.cache.get(cacheKey) as LoadingRepository;\n }\n\n private getCacheKey(namespace?: string) {\n return namespace ?? Date.now().toString();\n }\n}\n\nexport const loadingRepositoryFactory = new LoadingRepositoryFactory();\n"],"names":["LoadingRepositoryFactory","namespace","cacheKey","LoadingRepository","Date","Map","loadingRepositoryFactory"],"mappings":";AAEO,MAAMA;IAGT,cAAcC,SAAkB,EAAE;QAC9B,MAAMC,WAAW,IAAI,CAAC,WAAW,CAACD;QAElC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAACC,WAChB,IAAI,CAAC,KAAK,CAAC,GAAG,CAACA,UAAU,IAAIC;QAGjC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAACD;IAC1B;IAEQ,YAAYD,SAAkB,EAAE;QACpC,OAAOA,aAAaG,KAAK,GAAG,GAAG,QAAQ;IAC3C;;aAdQ,KAAK,GAAmC,IAAIC;;AAexD;AAEO,MAAMC,2BAA2B,IAAIN"}
|
|
File without changes
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { IMetaRepository } from "./IMetaRepository.js";
|
|
2
|
+
import type { MetaDTO } from "../../../../fta/Domain/Models/Meta/index.js";
|
|
3
|
+
export declare class MetaRepository implements IMetaRepository {
|
|
4
|
+
private meta;
|
|
5
|
+
constructor();
|
|
6
|
+
set(meta: MetaDTO): Promise<void>;
|
|
7
|
+
get(): MetaDTO;
|
|
8
|
+
decreaseTotalCount(count?: number): Promise<void>;
|
|
9
|
+
increaseTotalCount(count?: number): Promise<void>;
|
|
10
|
+
private updateMetaOnColumnDeltaChange;
|
|
11
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { makeAutoObservable, runInAction } from "mobx";
|
|
2
|
+
import { decodeCursor, encodeCursor } from "@webiny/utils";
|
|
3
|
+
import { Meta, MetaMapper } from "../../Models/Meta/index.js";
|
|
4
|
+
class MetaRepository {
|
|
5
|
+
constructor(){
|
|
6
|
+
this.meta = Meta.createEmpty();
|
|
7
|
+
makeAutoObservable(this);
|
|
8
|
+
}
|
|
9
|
+
async set(meta) {
|
|
10
|
+
runInAction(()=>{
|
|
11
|
+
this.meta = Meta.create(meta);
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
get() {
|
|
15
|
+
return MetaMapper.toDto(this.meta);
|
|
16
|
+
}
|
|
17
|
+
async decreaseTotalCount(count = 1) {
|
|
18
|
+
return await this.updateMetaOnColumnDeltaChange(-count);
|
|
19
|
+
}
|
|
20
|
+
async increaseTotalCount(count = 1) {
|
|
21
|
+
return await this.updateMetaOnColumnDeltaChange(count);
|
|
22
|
+
}
|
|
23
|
+
async updateMetaOnColumnDeltaChange(countDelta) {
|
|
24
|
+
const current = this.get();
|
|
25
|
+
const totalCount = current.totalCount + countDelta;
|
|
26
|
+
const cursorDecoded = decodeCursor(current.cursor);
|
|
27
|
+
const newCursorDecoded = String(Number(cursorDecoded) + countDelta);
|
|
28
|
+
const cursor = encodeCursor(newCursorDecoded);
|
|
29
|
+
return await this.set({
|
|
30
|
+
...current,
|
|
31
|
+
totalCount,
|
|
32
|
+
cursor
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export { MetaRepository };
|
|
37
|
+
|
|
38
|
+
//# sourceMappingURL=MetaRepository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fta/Domain/Repositories/Meta/MetaRepository.js","sources":["../../../../../src/fta/Domain/Repositories/Meta/MetaRepository.ts"],"sourcesContent":["import { makeAutoObservable, runInAction } from \"mobx\";\nimport { decodeCursor, encodeCursor } from \"@webiny/utils\";\nimport type { IMetaRepository } from \"./IMetaRepository.js\";\nimport type { MetaDTO } from \"~/fta/Domain/Models/Meta/index.js\";\nimport { Meta, MetaMapper } from \"~/fta/Domain/Models/Meta/index.js\";\n\nexport class MetaRepository implements IMetaRepository {\n private meta: Meta;\n\n constructor() {\n this.meta = Meta.createEmpty();\n makeAutoObservable(this);\n }\n\n async set(meta: MetaDTO) {\n runInAction(() => {\n this.meta = Meta.create(meta);\n });\n }\n\n get() {\n return MetaMapper.toDto(this.meta);\n }\n\n async decreaseTotalCount(count = 1) {\n return await this.updateMetaOnColumnDeltaChange(-count);\n }\n\n async increaseTotalCount(count = 1) {\n return await this.updateMetaOnColumnDeltaChange(count);\n }\n\n private async updateMetaOnColumnDeltaChange(countDelta: number) {\n // Retrieve the current meta\n const current = this.get();\n\n // Calculate the new totalCount based on the delta change\n const totalCount = current.totalCount + countDelta;\n\n // Calculate the new cursor position based on the delta change\n const cursorDecoded = decodeCursor(current.cursor);\n const newCursorDecoded = String(Number(cursorDecoded) + countDelta);\n const cursor = encodeCursor(newCursorDecoded);\n\n // Update the meta with the new totalCount and cursor\n return await this.set({ ...current, totalCount, cursor });\n }\n}\n"],"names":["MetaRepository","Meta","makeAutoObservable","meta","runInAction","MetaMapper","count","countDelta","current","totalCount","cursorDecoded","decodeCursor","newCursorDecoded","String","Number","cursor","encodeCursor"],"mappings":";;;AAMO,MAAMA;IAGT,aAAc;QACV,IAAI,CAAC,IAAI,GAAGC,KAAK,WAAW;QAC5BC,mBAAmB,IAAI;IAC3B;IAEA,MAAM,IAAIC,IAAa,EAAE;QACrBC,YAAY;YACR,IAAI,CAAC,IAAI,GAAGH,KAAK,MAAM,CAACE;QAC5B;IACJ;IAEA,MAAM;QACF,OAAOE,WAAW,KAAK,CAAC,IAAI,CAAC,IAAI;IACrC;IAEA,MAAM,mBAAmBC,QAAQ,CAAC,EAAE;QAChC,OAAO,MAAM,IAAI,CAAC,6BAA6B,CAAC,CAACA;IACrD;IAEA,MAAM,mBAAmBA,QAAQ,CAAC,EAAE;QAChC,OAAO,MAAM,IAAI,CAAC,6BAA6B,CAACA;IACpD;IAEA,MAAc,8BAA8BC,UAAkB,EAAE;QAE5D,MAAMC,UAAU,IAAI,CAAC,GAAG;QAGxB,MAAMC,aAAaD,QAAQ,UAAU,GAAGD;QAGxC,MAAMG,gBAAgBC,aAAaH,QAAQ,MAAM;QACjD,MAAMI,mBAAmBC,OAAOC,OAAOJ,iBAAiBH;QACxD,MAAMQ,SAASC,aAAaJ;QAG5B,OAAO,MAAM,IAAI,CAAC,GAAG,CAAC;YAAE,GAAGJ,OAAO;YAAEC;YAAYM;QAAO;IAC3D;AACJ"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { MetaRepository } from "./MetaRepository.js";
|
|
2
|
+
class MetaRepositoryFactory {
|
|
3
|
+
getRepository(namespace) {
|
|
4
|
+
const cacheKey = this.getCacheKey(namespace);
|
|
5
|
+
if (!this.cache.has(cacheKey)) this.cache.set(cacheKey, new MetaRepository());
|
|
6
|
+
return this.cache.get(cacheKey);
|
|
7
|
+
}
|
|
8
|
+
getCacheKey(namespace) {
|
|
9
|
+
return namespace ?? Date.now().toString();
|
|
10
|
+
}
|
|
11
|
+
constructor(){
|
|
12
|
+
this.cache = new Map();
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
const metaRepositoryFactory = new MetaRepositoryFactory();
|
|
16
|
+
export { MetaRepositoryFactory, metaRepositoryFactory };
|
|
17
|
+
|
|
18
|
+
//# sourceMappingURL=MetaRepositoryFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fta/Domain/Repositories/Meta/MetaRepositoryFactory.js","sources":["../../../../../src/fta/Domain/Repositories/Meta/MetaRepositoryFactory.ts"],"sourcesContent":["import { MetaRepository } from \"./MetaRepository.js\";\n\nexport class MetaRepositoryFactory {\n private cache: Map<string, MetaRepository> = new Map();\n\n getRepository(namespace?: string) {\n const cacheKey = this.getCacheKey(namespace);\n\n if (!this.cache.has(cacheKey)) {\n this.cache.set(cacheKey, new MetaRepository());\n }\n\n return this.cache.get(cacheKey) as MetaRepository;\n }\n\n private getCacheKey(namespace?: string) {\n return namespace ?? Date.now().toString();\n }\n}\n\nexport const metaRepositoryFactory = new MetaRepositoryFactory();\n"],"names":["MetaRepositoryFactory","namespace","cacheKey","MetaRepository","Date","Map","metaRepositoryFactory"],"mappings":";AAEO,MAAMA;IAGT,cAAcC,SAAkB,EAAE;QAC9B,MAAMC,WAAW,IAAI,CAAC,WAAW,CAACD;QAElC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAACC,WAChB,IAAI,CAAC,KAAK,CAAC,GAAG,CAACA,UAAU,IAAIC;QAGjC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAACD;IAC1B;IAEQ,YAAYD,SAAkB,EAAE;QACpC,OAAOA,aAAaG,KAAK,GAAG,GAAG,QAAQ;IAC3C;;aAdQ,KAAK,GAAgC,IAAIC;;AAerD;AAEO,MAAMC,wBAAwB,IAAIN"}
|
|
File without changes
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ISortingRepository } from "./ISortingRepository.js";
|
|
2
|
+
import type { Sorting } from "../../../../fta/Domain/Models/index.js";
|
|
3
|
+
export declare class SortingRepository implements ISortingRepository {
|
|
4
|
+
private sorting;
|
|
5
|
+
constructor();
|
|
6
|
+
get(): Sorting[];
|
|
7
|
+
set(sorts: Sorting[]): Promise<void>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { makeAutoObservable } from "mobx";
|
|
2
|
+
class SortingRepository {
|
|
3
|
+
constructor(){
|
|
4
|
+
this.sorting = [];
|
|
5
|
+
makeAutoObservable(this);
|
|
6
|
+
}
|
|
7
|
+
get() {
|
|
8
|
+
return this.sorting;
|
|
9
|
+
}
|
|
10
|
+
async set(sorts) {
|
|
11
|
+
this.sorting = sorts;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export { SortingRepository };
|
|
15
|
+
|
|
16
|
+
//# sourceMappingURL=SortingRepository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fta/Domain/Repositories/Sorting/SortingRepository.js","sources":["../../../../../src/fta/Domain/Repositories/Sorting/SortingRepository.ts"],"sourcesContent":["import { makeAutoObservable } from \"mobx\";\nimport type { ISortingRepository } from \"./ISortingRepository.js\";\nimport type { Sorting } from \"~/fta/Domain/Models/index.js\";\n\nexport class SortingRepository implements ISortingRepository {\n private sorting: Sorting[] = [];\n\n constructor() {\n makeAutoObservable(this);\n }\n\n get() {\n return this.sorting;\n }\n\n async set(sorts: Sorting[]) {\n this.sorting = sorts;\n }\n}\n"],"names":["SortingRepository","makeAutoObservable","sorts"],"mappings":";AAIO,MAAMA;IAGT,aAAc;aAFN,OAAO,GAAc,EAAE;QAG3BC,mBAAmB,IAAI;IAC3B;IAEA,MAAM;QACF,OAAO,IAAI,CAAC,OAAO;IACvB;IAEA,MAAM,IAAIC,KAAgB,EAAE;QACxB,IAAI,CAAC,OAAO,GAAGA;IACnB;AACJ"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ISortingRepository } from "../../../../fta/index.js";
|
|
2
|
+
export declare class SortingRepositoryFactory {
|
|
3
|
+
private cache;
|
|
4
|
+
getRepository(namespace?: string): ISortingRepository;
|
|
5
|
+
private getCacheKey;
|
|
6
|
+
}
|
|
7
|
+
export declare const sortRepositoryFactory: SortingRepositoryFactory;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { SortingRepository } from "./SortingRepository.js";
|
|
2
|
+
class SortingRepositoryFactory {
|
|
3
|
+
getRepository(namespace) {
|
|
4
|
+
const cacheKey = this.getCacheKey(namespace);
|
|
5
|
+
if (!this.cache.has(cacheKey)) this.cache.set(cacheKey, new SortingRepository());
|
|
6
|
+
return this.cache.get(cacheKey);
|
|
7
|
+
}
|
|
8
|
+
getCacheKey(namespace) {
|
|
9
|
+
return namespace ?? Date.now().toString();
|
|
10
|
+
}
|
|
11
|
+
constructor(){
|
|
12
|
+
this.cache = new Map();
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
const sortRepositoryFactory = new SortingRepositoryFactory();
|
|
16
|
+
export { SortingRepositoryFactory, sortRepositoryFactory };
|
|
17
|
+
|
|
18
|
+
//# sourceMappingURL=SortingRepositoryFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fta/Domain/Repositories/Sorting/SortingRepositoryFactory.js","sources":["../../../../../src/fta/Domain/Repositories/Sorting/SortingRepositoryFactory.ts"],"sourcesContent":["import { SortingRepository } from \"./SortingRepository.js\";\nimport type { ISortingRepository } from \"~/fta/index.js\";\n\nexport class SortingRepositoryFactory {\n private cache: Map<string, ISortingRepository> = new Map();\n\n getRepository(namespace?: string) {\n const cacheKey = this.getCacheKey(namespace);\n\n if (!this.cache.has(cacheKey)) {\n this.cache.set(cacheKey, new SortingRepository());\n }\n\n return this.cache.get(cacheKey) as ISortingRepository;\n }\n\n private getCacheKey(namespace?: string) {\n return namespace ?? Date.now().toString();\n }\n}\n\nexport const sortRepositoryFactory = new SortingRepositoryFactory();\n"],"names":["SortingRepositoryFactory","namespace","cacheKey","SortingRepository","Date","Map","sortRepositoryFactory"],"mappings":";AAGO,MAAMA;IAGT,cAAcC,SAAkB,EAAE;QAC9B,MAAMC,WAAW,IAAI,CAAC,WAAW,CAACD;QAElC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAACC,WAChB,IAAI,CAAC,KAAK,CAAC,GAAG,CAACA,UAAU,IAAIC;QAGjC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAACD;IAC1B;IAEQ,YAAYD,SAAkB,EAAE;QACpC,OAAOA,aAAaG,KAAK,GAAG,GAAG,QAAQ;IAC3C;;aAdQ,KAAK,GAAoC,IAAIC;;AAezD;AAEO,MAAMC,wBAAwB,IAAIN"}
|
package/fta/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./Domain/index.js";
|
package/fta/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./Domain/index.js";
|
package/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./fta/index.js";
|
package/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./fta/index.js";
|
package/package.json
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@webiny/app-utils",
|
|
3
|
+
"version": "0.0.0-unstable.0156a4c312",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"exports": {
|
|
6
|
+
".": "./index.js",
|
|
7
|
+
"./*": "./*"
|
|
8
|
+
},
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "https://github.com/webiny/webiny-js.git",
|
|
12
|
+
"directory": "packages/app-utils"
|
|
13
|
+
},
|
|
14
|
+
"author": "Webiny Ltd.",
|
|
15
|
+
"license": "MIT",
|
|
16
|
+
"dependencies": {
|
|
17
|
+
"@webiny/feature": "0.0.0-unstable.0156a4c312",
|
|
18
|
+
"@webiny/utils": "0.0.0-unstable.0156a4c312",
|
|
19
|
+
"mobx": "7.1.4"
|
|
20
|
+
},
|
|
21
|
+
"devDependencies": {
|
|
22
|
+
"@webiny/build-tools": "0.0.0-unstable.0156a4c312",
|
|
23
|
+
"typescript": "7.0.2"
|
|
24
|
+
},
|
|
25
|
+
"publishConfig": {
|
|
26
|
+
"access": "public"
|
|
27
|
+
},
|
|
28
|
+
"webiny": {
|
|
29
|
+
"publishFrom": "dist"
|
|
30
|
+
}
|
|
31
|
+
}
|