@verisoft/core 18.1.0 → 18.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.json +43 -43
- package/README.md +7 -7
- package/jest.config.ts +22 -22
- package/ng-package.json +7 -7
- package/package.json +14 -11
- package/project.json +36 -36
- package/src/index.ts +3 -7
- package/src/lib/index.ts +1 -0
- package/src/lib/{base/models → models}/all-item.datasource.ts +5 -5
- package/src/lib/models/base-http.models.ts +144 -0
- package/src/lib/models/constants.ts +8 -0
- package/src/lib/models/datasource.model.ts +77 -0
- package/src/lib/models/environment.model.ts +5 -0
- package/src/lib/models/error-provider.model.ts +20 -0
- package/src/lib/models/event.models.ts +7 -0
- package/src/lib/models/index.ts +7 -0
- package/src/lib/services/base-http.service.ts +114 -104
- package/src/lib/services/error-provider.service.ts +29 -0
- package/src/lib/services/index.ts +3 -0
- package/src/lib/services/local-storage.service.ts +13 -0
- package/src/lib/services/storage.service.ts +13 -0
- package/src/lib/utils/array.utils.spec.ts +49 -0
- package/src/lib/utils/array.utils.ts +54 -9
- package/src/lib/utils/clear.utils.ts +53 -53
- package/src/lib/utils/data.utils.ts +34 -34
- package/src/lib/utils/date.utils.ts +30 -0
- package/src/lib/utils/index.ts +1 -0
- package/src/lib/utils/keyOrFn.utils.ts +15 -15
- package/src/lib/utils/object.utils.spec.ts +36 -1
- package/src/lib/utils/object.utils.ts +16 -0
- package/src/test-setup.ts +8 -8
- package/tsconfig.json +29 -29
- package/tsconfig.lib.json +17 -17
- package/tsconfig.lib.prod.json +9 -9
- package/tsconfig.spec.json +16 -16
- package/src/lib/base/models/base-http.models.ts +0 -96
- package/src/lib/base/models/table-datasource.models.ts +0 -9
- package/src/lib/models/lazy-load.model.ts +0 -4
package/.eslintrc.json
CHANGED
|
@@ -1,43 +1,43 @@
|
|
|
1
|
-
{
|
|
2
|
-
"extends": ["../../../.eslintrc.base.json"],
|
|
3
|
-
"ignorePatterns": ["!**/*"],
|
|
4
|
-
"overrides": [
|
|
5
|
-
{
|
|
6
|
-
"files": ["*.ts"],
|
|
7
|
-
"extends": [
|
|
8
|
-
"plugin:@nx/angular",
|
|
9
|
-
"plugin:@angular-eslint/template/process-inline-templates"
|
|
10
|
-
],
|
|
11
|
-
"rules": {
|
|
12
|
-
"@angular-eslint/directive-selector": [
|
|
13
|
-
"error",
|
|
14
|
-
{
|
|
15
|
-
"type": "attribute",
|
|
16
|
-
"prefix": "v",
|
|
17
|
-
"style": "camelCase"
|
|
18
|
-
}
|
|
19
|
-
],
|
|
20
|
-
"@angular-eslint/component-selector": [
|
|
21
|
-
"error",
|
|
22
|
-
{
|
|
23
|
-
"type": "element",
|
|
24
|
-
"prefix": "v",
|
|
25
|
-
"style": "kebab-case"
|
|
26
|
-
}
|
|
27
|
-
]
|
|
28
|
-
}
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
"files": ["*.html"],
|
|
32
|
-
"extends": ["plugin:@nx/angular-template"],
|
|
33
|
-
"rules": {}
|
|
34
|
-
},
|
|
35
|
-
{
|
|
36
|
-
"files": ["*.json"],
|
|
37
|
-
"parser": "jsonc-eslint-parser",
|
|
38
|
-
"rules": {
|
|
39
|
-
"@nx/dependency-checks": "error"
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
]
|
|
43
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"extends": ["../../../.eslintrc.base.json"],
|
|
3
|
+
"ignorePatterns": ["!**/*"],
|
|
4
|
+
"overrides": [
|
|
5
|
+
{
|
|
6
|
+
"files": ["*.ts"],
|
|
7
|
+
"extends": [
|
|
8
|
+
"plugin:@nx/angular",
|
|
9
|
+
"plugin:@angular-eslint/template/process-inline-templates"
|
|
10
|
+
],
|
|
11
|
+
"rules": {
|
|
12
|
+
"@angular-eslint/directive-selector": [
|
|
13
|
+
"error",
|
|
14
|
+
{
|
|
15
|
+
"type": "attribute",
|
|
16
|
+
"prefix": "v",
|
|
17
|
+
"style": "camelCase"
|
|
18
|
+
}
|
|
19
|
+
],
|
|
20
|
+
"@angular-eslint/component-selector": [
|
|
21
|
+
"error",
|
|
22
|
+
{
|
|
23
|
+
"type": "element",
|
|
24
|
+
"prefix": "v",
|
|
25
|
+
"style": "kebab-case"
|
|
26
|
+
}
|
|
27
|
+
]
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"files": ["*.html"],
|
|
32
|
+
"extends": ["plugin:@nx/angular-template"],
|
|
33
|
+
"rules": {}
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"files": ["*.json"],
|
|
37
|
+
"parser": "jsonc-eslint-parser",
|
|
38
|
+
"rules": {
|
|
39
|
+
"@nx/dependency-checks": "error"
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
]
|
|
43
|
+
}
|
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
# core
|
|
2
|
-
|
|
3
|
-
This library was generated with [Nx](https://nx.dev).
|
|
4
|
-
|
|
5
|
-
## Running unit tests
|
|
6
|
-
|
|
7
|
-
Run `nx test core` to execute the unit tests.
|
|
1
|
+
# core
|
|
2
|
+
|
|
3
|
+
This library was generated with [Nx](https://nx.dev).
|
|
4
|
+
|
|
5
|
+
## Running unit tests
|
|
6
|
+
|
|
7
|
+
Run `nx test core` to execute the unit tests.
|
package/jest.config.ts
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
/* eslint-disable */
|
|
2
|
-
export default {
|
|
3
|
-
displayName: 'core',
|
|
4
|
-
preset: '../../../jest.preset.js',
|
|
5
|
-
setupFilesAfterEnv: ['<rootDir>/src/test-setup.ts'],
|
|
6
|
-
coverageDirectory: '../../../coverage/src/libs/core',
|
|
7
|
-
transform: {
|
|
8
|
-
'^.+\\.(ts|mjs|js|html)$': [
|
|
9
|
-
'jest-preset-angular',
|
|
10
|
-
{
|
|
11
|
-
tsconfig: '<rootDir>/tsconfig.spec.json',
|
|
12
|
-
stringifyContentPathRegex: '\\.(html|svg)$',
|
|
13
|
-
},
|
|
14
|
-
],
|
|
15
|
-
},
|
|
16
|
-
transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'],
|
|
17
|
-
snapshotSerializers: [
|
|
18
|
-
'jest-preset-angular/build/serializers/no-ng-attributes',
|
|
19
|
-
'jest-preset-angular/build/serializers/ng-snapshot',
|
|
20
|
-
'jest-preset-angular/build/serializers/html-comment',
|
|
21
|
-
],
|
|
22
|
-
};
|
|
1
|
+
/* eslint-disable */
|
|
2
|
+
export default {
|
|
3
|
+
displayName: 'core',
|
|
4
|
+
preset: '../../../jest.preset.js',
|
|
5
|
+
setupFilesAfterEnv: ['<rootDir>/src/test-setup.ts'],
|
|
6
|
+
coverageDirectory: '../../../coverage/src/libs/core',
|
|
7
|
+
transform: {
|
|
8
|
+
'^.+\\.(ts|mjs|js|html)$': [
|
|
9
|
+
'jest-preset-angular',
|
|
10
|
+
{
|
|
11
|
+
tsconfig: '<rootDir>/tsconfig.spec.json',
|
|
12
|
+
stringifyContentPathRegex: '\\.(html|svg)$',
|
|
13
|
+
},
|
|
14
|
+
],
|
|
15
|
+
},
|
|
16
|
+
transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'],
|
|
17
|
+
snapshotSerializers: [
|
|
18
|
+
'jest-preset-angular/build/serializers/no-ng-attributes',
|
|
19
|
+
'jest-preset-angular/build/serializers/ng-snapshot',
|
|
20
|
+
'jest-preset-angular/build/serializers/html-comment',
|
|
21
|
+
],
|
|
22
|
+
};
|
package/ng-package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "../../../node_modules/ng-packagr/ng-package.schema.json",
|
|
3
|
-
"dest": "../../../dist/src/libs/core",
|
|
4
|
-
"lib": {
|
|
5
|
-
"entryFile": "src/index.ts"
|
|
6
|
-
}
|
|
7
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"$schema": "../../../node_modules/ng-packagr/ng-package.schema.json",
|
|
3
|
+
"dest": "../../../dist/src/libs/core",
|
|
4
|
+
"lib": {
|
|
5
|
+
"entryFile": "src/index.ts"
|
|
6
|
+
}
|
|
7
|
+
}
|
package/package.json
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@verisoft/core",
|
|
3
|
-
"version": "18.
|
|
4
|
-
"peerDependencies": {
|
|
5
|
-
"@angular/common": "^18.2.8",
|
|
6
|
-
"@angular/core": "^18.2.8",
|
|
7
|
-
"moment": "^2.30.1",
|
|
8
|
-
"rxjs": "~7.8.0"
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@verisoft/core",
|
|
3
|
+
"version": "18.3.0",
|
|
4
|
+
"peerDependencies": {
|
|
5
|
+
"@angular/common": "^18.2.8",
|
|
6
|
+
"@angular/core": "^18.2.8",
|
|
7
|
+
"moment": "^2.30.1",
|
|
8
|
+
"rxjs": "~7.8.0",
|
|
9
|
+
"@angular/forms": "18.2.8",
|
|
10
|
+
"@ngx-translate/core": "^15.0.0"
|
|
11
|
+
},
|
|
12
|
+
"sideEffects": false,
|
|
13
|
+
"dependencies": {}
|
|
14
|
+
}
|
package/project.json
CHANGED
|
@@ -1,36 +1,36 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "core",
|
|
3
|
-
"$schema": "../../../node_modules/nx/schemas/project-schema.json",
|
|
4
|
-
"sourceRoot": "src/libs/core/src",
|
|
5
|
-
"prefix": "lib",
|
|
6
|
-
"projectType": "library",
|
|
7
|
-
"tags": [],
|
|
8
|
-
"targets": {
|
|
9
|
-
"build": {
|
|
10
|
-
"executor": "@nx/angular:package",
|
|
11
|
-
"outputs": ["{workspaceRoot}/dist/{projectRoot}"],
|
|
12
|
-
"options": {
|
|
13
|
-
"project": "src/libs/core/ng-package.json"
|
|
14
|
-
},
|
|
15
|
-
"configurations": {
|
|
16
|
-
"production": {
|
|
17
|
-
"tsConfig": "src/libs/core/tsconfig.lib.prod.json"
|
|
18
|
-
},
|
|
19
|
-
"development": {
|
|
20
|
-
"tsConfig": "src/libs/core/tsconfig.lib.json"
|
|
21
|
-
}
|
|
22
|
-
},
|
|
23
|
-
"defaultConfiguration": "production"
|
|
24
|
-
},
|
|
25
|
-
"test": {
|
|
26
|
-
"executor": "@nx/jest:jest",
|
|
27
|
-
"outputs": ["{workspaceRoot}/coverage/{projectRoot}"],
|
|
28
|
-
"options": {
|
|
29
|
-
"jestConfig": "src/libs/core/jest.config.ts"
|
|
30
|
-
}
|
|
31
|
-
},
|
|
32
|
-
"lint": {
|
|
33
|
-
"executor": "@nx/eslint:lint"
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "core",
|
|
3
|
+
"$schema": "../../../node_modules/nx/schemas/project-schema.json",
|
|
4
|
+
"sourceRoot": "src/libs/core/src",
|
|
5
|
+
"prefix": "lib",
|
|
6
|
+
"projectType": "library",
|
|
7
|
+
"tags": [],
|
|
8
|
+
"targets": {
|
|
9
|
+
"build": {
|
|
10
|
+
"executor": "@nx/angular:package",
|
|
11
|
+
"outputs": ["{workspaceRoot}/dist/{projectRoot}"],
|
|
12
|
+
"options": {
|
|
13
|
+
"project": "src/libs/core/ng-package.json"
|
|
14
|
+
},
|
|
15
|
+
"configurations": {
|
|
16
|
+
"production": {
|
|
17
|
+
"tsConfig": "src/libs/core/tsconfig.lib.prod.json"
|
|
18
|
+
},
|
|
19
|
+
"development": {
|
|
20
|
+
"tsConfig": "src/libs/core/tsconfig.lib.json"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"defaultConfiguration": "production"
|
|
24
|
+
},
|
|
25
|
+
"test": {
|
|
26
|
+
"executor": "@nx/jest:jest",
|
|
27
|
+
"outputs": ["{workspaceRoot}/coverage/{projectRoot}"],
|
|
28
|
+
"options": {
|
|
29
|
+
"jestConfig": "src/libs/core/jest.config.ts"
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"lint": {
|
|
33
|
+
"executor": "@nx/eslint:lint"
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
export * from './lib/
|
|
2
|
-
export * from './lib/
|
|
3
|
-
export * from './lib/
|
|
4
|
-
|
|
5
|
-
export * from './lib/services/base-http.service';
|
|
6
|
-
|
|
7
|
-
export * from './lib/utils';
|
|
1
|
+
export * from './lib/models';
|
|
2
|
+
export * from './lib/services';
|
|
3
|
+
export * from './lib/utils';
|
package/src/lib/index.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './models';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Observable } from 'rxjs';
|
|
2
|
-
|
|
3
|
-
export interface AllItemDatasource<T> {
|
|
4
|
-
getData$: () => Observable<T[]>
|
|
5
|
-
}
|
|
1
|
+
import { Observable } from 'rxjs';
|
|
2
|
+
|
|
3
|
+
export interface AllItemDatasource<T> {
|
|
4
|
+
getData$: () => Observable<T[]>
|
|
5
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
import { HttpParams, HttpResponse } from '@angular/common/http';
|
|
3
|
+
import { InjectionToken } from '@angular/core';
|
|
4
|
+
|
|
5
|
+
export const BASE_URL_PATH = new InjectionToken<string>('BASE_URL_PATH');
|
|
6
|
+
|
|
7
|
+
export function requestParamsToHttpParams<T>(
|
|
8
|
+
requestParams: Partial<RequestParams<T>>,
|
|
9
|
+
httpParams: HttpParams = new HttpParams()
|
|
10
|
+
): HttpParams {
|
|
11
|
+
if (requestParams.limit != undefined) {
|
|
12
|
+
httpParams = httpParams.append('limit', requestParams.limit.toString());
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
if (requestParams.offset != undefined) {
|
|
16
|
+
httpParams = httpParams.append('offset', requestParams.offset.toString());
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
if (requestParams.id != '' && requestParams.id != undefined) {
|
|
20
|
+
httpParams = httpParams.append('id', requestParams.id as any);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
httpParams = getFilter(requestParams, httpParams);
|
|
24
|
+
httpParams = getSort(requestParams, httpParams);
|
|
25
|
+
|
|
26
|
+
return httpParams;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function getFilter<T>(
|
|
30
|
+
requestParams: Partial<RequestParams<any>>,
|
|
31
|
+
httpParams: HttpParams
|
|
32
|
+
): HttpParams {
|
|
33
|
+
if (!requestParams.filter) {
|
|
34
|
+
return httpParams;
|
|
35
|
+
}
|
|
36
|
+
Object.keys(requestParams?.filter).forEach((key) => {
|
|
37
|
+
const value = requestParams.filter?.[key as keyof Partial<T>];
|
|
38
|
+
if (value != undefined && !(typeof value === 'string' && value.trim() === "")) {
|
|
39
|
+
if (Array.isArray(value)) {
|
|
40
|
+
value.forEach((valueItem: any) => {
|
|
41
|
+
httpParams = httpParams.append(
|
|
42
|
+
'Filter.' + key, valueItem
|
|
43
|
+
);
|
|
44
|
+
});
|
|
45
|
+
} else {
|
|
46
|
+
httpParams = httpParams.append('Filter.' + key, value);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
return httpParams;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function getSort(
|
|
54
|
+
requestParams: Partial<RequestParams<any>>,
|
|
55
|
+
httpParams: HttpParams
|
|
56
|
+
): HttpParams {
|
|
57
|
+
if (!requestParams.sort) {
|
|
58
|
+
return httpParams;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
requestParams.sort?.forEach((sort) => {
|
|
62
|
+
httpParams = httpParams
|
|
63
|
+
.append('Sort.Field', sort.field)
|
|
64
|
+
.append('Sort.Direction', sort.direction);
|
|
65
|
+
});
|
|
66
|
+
return httpParams;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export function saveFile(response: HttpResponse<Blob>) {
|
|
70
|
+
const fileName = response.headers
|
|
71
|
+
.get('Content-Disposition')
|
|
72
|
+
?.split(';')[1]
|
|
73
|
+
.split('=')[1];
|
|
74
|
+
const blob: Blob = response.body as Blob;
|
|
75
|
+
const a = document.createElement('a');
|
|
76
|
+
a.download = fileName ?? 'undefined';
|
|
77
|
+
a.href = window.URL.createObjectURL(blob);
|
|
78
|
+
a.click();
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export enum SortDirection {
|
|
82
|
+
asc = 'asc',
|
|
83
|
+
desc = 'desc',
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export declare type SortDirectionType = keyof typeof SortDirection;
|
|
87
|
+
|
|
88
|
+
export declare interface Sort {
|
|
89
|
+
field: string;
|
|
90
|
+
direction: SortDirectionType;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export interface RequestParams<T> extends AllDataRequestParams<T> {
|
|
94
|
+
offset: number;
|
|
95
|
+
limit: number;
|
|
96
|
+
id?: string;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export interface AllDataRequestParams<T> {
|
|
100
|
+
filter?: Partial<T>;
|
|
101
|
+
sort?: Sort[];
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export interface Page<T> {
|
|
105
|
+
data: T[];
|
|
106
|
+
total: number;
|
|
107
|
+
limit: number;
|
|
108
|
+
offset: number;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export interface CustomExport<T> {
|
|
112
|
+
sortDefinition?: Sort;
|
|
113
|
+
filter?: Partial<T>;
|
|
114
|
+
columnsToExport: ColumnExportSpecification[];
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export interface ColumnExportSpecification {
|
|
118
|
+
name: string;
|
|
119
|
+
header: string;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export const DEFAULT_SEARCH_LIMIT = 50;
|
|
123
|
+
|
|
124
|
+
export const DEFAULT_SEARCH_PARAMS: RequestParams<any> = {
|
|
125
|
+
offset: 0,
|
|
126
|
+
limit: DEFAULT_SEARCH_LIMIT,
|
|
127
|
+
id: '',
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
export function normalizeRequest<T>(
|
|
131
|
+
request: Partial<RequestParams<T>>,
|
|
132
|
+
minLimit: number | undefined = undefined
|
|
133
|
+
): RequestParams<T> {
|
|
134
|
+
return {
|
|
135
|
+
offset: request?.offset ?? 0,
|
|
136
|
+
limit: !request?.limit
|
|
137
|
+
? DEFAULT_SEARCH_LIMIT
|
|
138
|
+
: minLimit && request.limit < minLimit
|
|
139
|
+
? minLimit
|
|
140
|
+
: request.limit,
|
|
141
|
+
filter: request?.filter,
|
|
142
|
+
sort: request?.sort,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { HttpClient } from '@angular/common/http';
|
|
2
|
+
import { isObservable, map, Observable, of } from 'rxjs';
|
|
3
|
+
import { BaseHttpService } from '../services/base-http.service';
|
|
4
|
+
import { AllItemDatasource } from './all-item.datasource';
|
|
5
|
+
import { Page, RequestParams } from './base-http.models';
|
|
6
|
+
import { DEFAULT_PAGE_SIZE } from './constants';
|
|
7
|
+
|
|
8
|
+
export type DatasourceType<T> =
|
|
9
|
+
| string
|
|
10
|
+
| Observable<T[]>
|
|
11
|
+
| Observable<Page<T>>
|
|
12
|
+
| BaseHttpService<T>
|
|
13
|
+
| T[]
|
|
14
|
+
| Page<T>
|
|
15
|
+
| AllItemDatasource<T>;
|
|
16
|
+
|
|
17
|
+
export type DataSourceFunctionType<T> = (
|
|
18
|
+
requestParams: RequestParams<T>
|
|
19
|
+
) => Observable<Page<T>>;
|
|
20
|
+
|
|
21
|
+
export function convertDatasource<T>(
|
|
22
|
+
datasource: DatasourceType<T>,
|
|
23
|
+
basePath: string,
|
|
24
|
+
httpClient: HttpClient
|
|
25
|
+
): DataSourceFunctionType<T> {
|
|
26
|
+
if (!datasource) {
|
|
27
|
+
throw new Error('Datasource is not defined');
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
if (typeof datasource === 'string') {
|
|
31
|
+
const service = new BaseHttpService<T>(httpClient, basePath, datasource);
|
|
32
|
+
return (requestParams: RequestParams<T>) =>
|
|
33
|
+
service.fetchList(requestParams);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if (datasource instanceof BaseHttpService) {
|
|
37
|
+
return (requestParams: RequestParams<T>) =>
|
|
38
|
+
datasource.fetchList(requestParams);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (isObservable(datasource)) {
|
|
42
|
+
return () =>
|
|
43
|
+
(datasource as Observable<Page<T> | T[]>).pipe(map(convertArrayToPage));
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const allItemDatasource = <AllItemDatasource<T>>datasource;
|
|
47
|
+
if (allItemDatasource.getData$) {
|
|
48
|
+
return () =>
|
|
49
|
+
allItemDatasource
|
|
50
|
+
.getData$()
|
|
51
|
+
.pipe(map((data) => convertArrayToPage(data)));
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const page = <Page<T>>datasource;
|
|
55
|
+
if (page.data) {
|
|
56
|
+
return () => of(page);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (Array.isArray(datasource)) {
|
|
60
|
+
return () => of(convertArrayToPage(datasource));
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
throw new Error('Datasource is not supported');
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function convertArrayToPage<T>(data: Page<T> | T[]): Page<T> {
|
|
67
|
+
if (Array.isArray(data)) {
|
|
68
|
+
return {
|
|
69
|
+
data: data ?? [],
|
|
70
|
+
total: data?.length ?? 0,
|
|
71
|
+
limit: data?.length ?? DEFAULT_PAGE_SIZE,
|
|
72
|
+
offset: 0,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
return data as Page<T>;
|
|
77
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { InjectionToken } from '@angular/core';
|
|
2
|
+
import { ValidationErrors } from '@angular/forms';
|
|
3
|
+
import { Observable } from 'rxjs';
|
|
4
|
+
|
|
5
|
+
export interface ErrorProvider {
|
|
6
|
+
mapError(errors: ValidationErrors): Observable<string>;
|
|
7
|
+
errors: Record<string, (value?: any) => string>;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export const ERROR_PROVIDER_TOKEN
|
|
11
|
+
= new InjectionToken<ErrorProvider>('ERROR_PROVIDER_TOKEN');
|
|
12
|
+
|
|
13
|
+
export enum CustomValidationCodes {}
|
|
14
|
+
|
|
15
|
+
export const ErrorMap: Record<string, (value?: any) => string> = {
|
|
16
|
+
required: () => `VALIDATIONS.REQUIRED`,
|
|
17
|
+
email: () => `VALIDATIONS.EMAIL`,
|
|
18
|
+
minLength: () => 'VALIDATIONS.MIN_LENGTH',
|
|
19
|
+
maxLength: () => 'VALIDATIONS.MAX_LENGTH',
|
|
20
|
+
};
|