@dflat-core/web 1.0.49 → 1.0.51
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/README.md +54 -0
- package/fesm2022/dflat-core-web-core-data.mjs +4 -0
- package/fesm2022/dflat-core-web-core-data.mjs.map +1 -1
- package/fesm2022/dflat-core-web-core-ux-testing.mjs +442 -0
- package/fesm2022/dflat-core-web-core-ux-testing.mjs.map +1 -0
- package/fesm2022/dflat-core-web-core-ux.mjs +31 -2
- package/fesm2022/dflat-core-web-core-ux.mjs.map +1 -1
- package/fesm2022/dflat-core-web-system-ux.mjs +2892 -2817
- package/fesm2022/dflat-core-web-system-ux.mjs.map +1 -1
- package/fesm2022/dflat-core-web.mjs.map +1 -1
- package/package.json +5 -1
- package/types/dflat-core-web-core-data.d.ts +7 -0
- package/types/dflat-core-web-core-ux-testing.d.ts +246 -0
- package/types/dflat-core-web-core-ux.d.ts +71 -4
- package/types/dflat-core-web-system-ux.d.ts +126 -55
package/README.md
CHANGED
|
@@ -11,6 +11,7 @@ Librairies Angular de Dflat, empaquetées en un module npm unique (Angular Packa
|
|
|
11
11
|
| `@dflat-core/web/core-services` | Authentification, messages, menus, hub SignalR... |
|
|
12
12
|
| `@dflat-core/web/core-data` | `DataService`, `EntityDataService` |
|
|
13
13
|
| `@dflat-core/web/core-ux` | Composants, directives et services d'interface |
|
|
14
|
+
| `@dflat-core/web/core-ux/testing` | Suites de test standard (`describeBaseComponent`, `describeGeneratedModule`) et doublures, pour les fichiers `.spec.ts` |
|
|
14
15
|
| `@dflat-core/web/system-model` | Modèle du module System (généré) |
|
|
15
16
|
| `@dflat-core/web/system-data` | Services de données du module System (générés) |
|
|
16
17
|
| `@dflat-core/web/system-root` | Permissions, clés d'entités et menus du module System |
|
|
@@ -56,6 +57,59 @@ La recherche globale n'interroge que les sources déclarées par l'application :
|
|
|
56
57
|
dérivée de `DflatSearchProvider` par famille d'objets, fournie en `multi` sous le jeton
|
|
57
58
|
`DFLAT_SEARCH_PROVIDERS`.
|
|
58
59
|
|
|
60
|
+
## Tester
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
yarn test # tous les *.spec.ts du package (Vitest, jsdom)
|
|
64
|
+
yarn vitest run core-ux # un dossier ou un fichier
|
|
65
|
+
yarn tsc -p tsconfig.spec.json # contrôle des types des tests
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
`@dflat-core/web/core-ux/testing` fournit la suite de test standard de `BaseComponent` :
|
|
69
|
+
|
|
70
|
+
```ts
|
|
71
|
+
describeBaseComponent('BaseCountryComponent', (app, route) => new TestCountryComponent(app, route), {
|
|
72
|
+
entityKey: 'country', path: '/sys/country', title: 'Pays', permissionKey: 'system.country', requestsSections: true
|
|
73
|
+
});
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Elle vérifie le contrat de `BaseComponent` sans rendre de gabarit : création dans un contexte
|
|
77
|
+
d'injection, clé d'entité, lien, titre et permission, façade demandée au registre avec la clé de
|
|
78
|
+
l'entité, `ngOnInit` (fil d'Ariane, chargement branché sur `dataService.search`, abonnement aux
|
|
79
|
+
notifications, demande des onglets au registre `EntitySections`), `Search` / `refresh`, mise à
|
|
80
|
+
jour sur notification, `ngOnDestroy`.
|
|
81
|
+
Elle n'utilise que les fonctions globales de l'outil de test (`describe`, `it`, `beforeEach`,
|
|
82
|
+
`expect`) et `TestBed` : elle ne dépend pas de l'outil. `BaseComponentTestContext` fournit les
|
|
83
|
+
services du composant (vraies classes du socle, doublures pour `DataService` et `Router`).
|
|
84
|
+
|
|
85
|
+
- `core-ux/src/lib/v2/components/base-component/base-component.spec.ts` applique la suite à un
|
|
86
|
+
composant minimal et teste les cas propres à la classe ;
|
|
87
|
+
- `dflat -g ts` génère, pour chaque composant `Base<X>Component` d'un module,
|
|
88
|
+
`<x>.component.generated.spec.ts` (la même suite, avec les valeurs attendues du générateur) et,
|
|
89
|
+
par module, `<module>-components.generated.spec.ts` (`describeGeneratedModule` : chaque
|
|
90
|
+
composant a sa route, clés d'entité uniques, onglets des entités liées attendus par entité et
|
|
91
|
+
pointant vers des entités et composants du module, éléments de menu vers une route existante
|
|
92
|
+
et porteurs d'une permission du module).
|
|
93
|
+
|
|
94
|
+
Les onglets des entités liées (sections `@relations` des formulaires) sont déclarés pour tout le
|
|
95
|
+
module par le service généré `<Module>GeneratedSectionService`
|
|
96
|
+
(`<module>-sections.generated.ts`), seul fichier généré qui importe les composants des onglets.
|
|
97
|
+
Le module Angular `<module>-ux` l'enregistre dans son constructeur,
|
|
98
|
+
`EntitySections.register(injector.get(<Module>GeneratedSectionService))`, et `Base<X>Component`
|
|
99
|
+
demande ses onglets par la clé de son entité
|
|
100
|
+
(`EntitySections.registerSections(this.getEntityKey(), this.facade)`), sans importer d'autre
|
|
101
|
+
composant : pas de dépendance circulaire entre composants. Le service n'est interrogé qu'une
|
|
102
|
+
fois par entité : la définition des onglets est gardée dans le cache d'initialisation des écrans
|
|
103
|
+
(`InitCacheService`, `DataService.getCachedValue`), comme les descripteurs de filtre et le filtre
|
|
104
|
+
vide, et vidée avec eux ; l'enregistrement sur la façade est fait à chaque initialisation.
|
|
105
|
+
|
|
106
|
+
Dans le package, Vitest est lancé directement (`vitest.config.mts`, `tools/vitest.setup.ts`), sans
|
|
107
|
+
`angular.json` : les décorateurs sont compilés en mode JIT et les gabarits remplacés par un
|
|
108
|
+
gabarit vide. Une application lance les mêmes tests par sa cible `test`
|
|
109
|
+
(`@angular/build:unit-test`, Vitest et jsdom), que le modèle `dflat-webhost` déclare
|
|
110
|
+
(`yarn test` dans `webapps`). Les `.spec.ts` ne sont pas publiés ; seul le point d'entrée
|
|
111
|
+
`testing` l'est.
|
|
112
|
+
|
|
59
113
|
## Construire
|
|
60
114
|
|
|
61
115
|
```bash
|
|
@@ -7,6 +7,7 @@ import * as i3 from "@dflat-core/web/core-services";
|
|
|
7
7
|
import { InitCacheService } from "@dflat-core/web/core-services";
|
|
8
8
|
import * as i2 from "@angular/common/http";
|
|
9
9
|
import { HttpParams } from "@angular/common/http";
|
|
10
|
+
import { defer, of } from "rxjs";
|
|
10
11
|
import { map } from "rxjs/operators";
|
|
11
12
|
var DataService = class DataService {
|
|
12
13
|
constructor(env, httpClient, headerService) {
|
|
@@ -55,6 +56,9 @@ var DataService = class DataService {
|
|
|
55
56
|
getCached(entityKey, action) {
|
|
56
57
|
return this.initCache.get(`${entityKey}/${action}`, () => this.httpClient.get(this.baseUrl + `/${entityKey}/${action}`, {}));
|
|
57
58
|
}
|
|
59
|
+
getCachedValue(entityKey, name, factory) {
|
|
60
|
+
return this.initCache.get(`${entityKey}/${name}`, () => defer(() => of(factory())));
|
|
61
|
+
}
|
|
58
62
|
clearCached(entityKey) {
|
|
59
63
|
this.initCache.clear(Utilities.IsNil(entityKey) ? null : `${entityKey}/`);
|
|
60
64
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dflat-core-web-core-data.mjs","names":["i1.DataService"],"sources":["../../core-data/src/lib/services/data-service.ts","../../core-data/src/lib/core-data.module.ts","../../core-data/src/lib/services/entity-data-service.ts"],"sourcesContent":["import { EnvironmentBase, Utilities } from '@dflat-core/web/core';\r\nimport { ActionDescriptor, ColumnDescriptor, EntityViewModelWithFields, EntityWithSpecifics, ExtendedProperty, FilterDescriptor, PagedList, SaveResult, SaveResults, TrackRecordProperty } from '@dflat-core/web/core-model';\r\nimport { HeadersService, InitCacheService } from '@dflat-core/web/core-services';\r\nimport { HttpClient, HttpParams, HttpResponse } from '@angular/common/http';\r\nimport { inject, Injectable, Type } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\n\r\n\r\n@Injectable()\r\nexport class DataService {\r\n\r\n baseUrl = this.env.apiUrl;\r\n httpClient: HttpClient;\r\n data: any[];\r\n private initCache = inject(InitCacheService);\r\n constructor(\r\n private env: EnvironmentBase,\r\n httpClient: HttpClient,\r\n private headerService: HeadersService) {\r\n this.httpClient = httpClient\r\n }\r\n\r\n getFormattedParams(params: any): any {\r\n // Point d'entrée public : conserve le comportement historique\r\n // (stringify uniquement quand params racine est un tableau).\r\n if (Array.isArray(params)) {\r\n if (params.length > 0 && typeof (params[0]) === 'number') {\r\n return JSON.stringify(params);\r\n }\r\n const result = params.map(entity => this.formatValueRecursive(entity));\r\n return JSON.stringify(result);\r\n }\r\n\r\n return this.formatValueRecursive(params);\r\n }\r\n\r\n // Transforme récursivement un objet/tableau/valeur, sans jamais stringifier.\r\n // Utilisée pour descendre dans les propriétés imbriquées (ex: un tableau\r\n // d'objets contenu dans une propriété d'un objet racine), qui étaient\r\n // auparavant copiées telles quelles et donc jamais nettoyées de leurs Date.\r\n private formatValueRecursive(val: any): any {\r\n if (val === undefined || val === null) {\r\n return val;\r\n }\r\n\r\n if (val instanceof Date) {\r\n return `${Utilities.Format2Digits(val.getFullYear())}-${Utilities.Format2Digits(val.getMonth() + 1)}-${Utilities.Format2Digits(val.getDate())}T00:00:00.000Z`;\r\n }\r\n\r\n if (Array.isArray(val)) {\r\n // Tableau de nombres : on le laisse tel quel (comme au niveau racine)\r\n if (val.length > 0 && typeof (val[0]) === 'number') {\r\n return val;\r\n }\r\n return val.map(item => this.formatValueRecursive(item));\r\n }\r\n\r\n if (typeof val === 'object') {\r\n const result: any = {};\r\n for (let key in val) {\r\n if (val.hasOwnProperty(key)) {\r\n const propVal = val[key];\r\n if (propVal !== undefined && propVal !== null) {\r\n result[key] = this.formatValueRecursive(propVal);\r\n }\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n // primitive (string, number, boolean...) : inchangé\r\n return val;\r\n }\r\n\r\n\r\n getUrlQueryParams(filter: any): HttpParams {\r\n let requestParams = new HttpParams();\r\n let formattedFilter = this.getFormattedParams(filter);\r\n for (let key in formattedFilter) {\r\n if (formattedFilter.hasOwnProperty(key)) {\r\n let vals = formattedFilter[key];\r\n if (Array.isArray(vals) && vals.length > 0)\r\n {\r\n for (let key2 in vals) {\r\n requestParams = requestParams.append(key, vals[key2]);\r\n }\r\n }\r\n else if (typeof vals === 'object') {\r\n requestParams = requestParams.set(key, JSON.stringify(vals));\r\n }\r\n else\r\n {\r\n requestParams = requestParams.set(key, vals);\r\n }\r\n }\r\n }\r\n return requestParams;\r\n }\r\n\r\n /*getUrlQueryArrayParams(filter: any): HttpParams {\r\n let requestParams = new HttpParams();\r\n let formattedFilter = this.getFormattedParams(filter);\r\n for (let key in formattedFilter) {\r\n if (formattedFilter.hasOwnProperty(key)) {\r\n let vals = formattedFilter[key];\r\n for (let key2 in vals) {\r\n requestParams = requestParams.append(key, vals[key2]);\r\n }\r\n }\r\n }\r\n return requestParams;\r\n }*/\r\n\r\n /**\r\n * Appel GET sans paramètre gardé dans le cache d'initialisation (InitCacheService) : données\r\n * chargées avant la recherche, identiques d'une ouverture de l'écran à l'autre. Le cache est\r\n * vidé au redémarrage de l'API (horodatage du jeton d'accès) et au changement d'utilisateur.\r\n */\r\n getCached<T>(entityKey: string, action: string): Observable<T> {\r\n return this.initCache.get<T>(`${entityKey}/${action}`,\r\n () => this.httpClient.get<T>(this.baseUrl + `/${entityKey}/${action}`, {}));\r\n }\r\n\r\n /** Vide le cache d'initialisation d'une entité, ou tout le cache. */\r\n clearCached(entityKey?: string): void {\r\n this.initCache.clear(Utilities.IsNil(entityKey) ? null : `${entityKey}/`);\r\n }\r\n\r\n getViewFilterDescriptors(entityKey: string): Observable<FilterDescriptor[]> {\r\n return this.getCached<FilterDescriptor[]>(entityKey, 'GetFilterDescriptors');\r\n }\r\n\r\n getViewColumns(entityKey: string): Observable<ColumnDescriptor[]> {\r\n return this.getCached<ColumnDescriptor[]>(entityKey, 'GetGridColumns');\r\n }\r\n\r\n search<TData>(entityKey: string, filter: any): Observable<PagedList<TData>> {\r\n let _url = this.baseUrl + `/${entityKey}/Search`;\r\n let requestParams = this.getUrlQueryParams(filter);\r\n return this.httpClient.get<PagedList<TData>>(_url, { params: requestParams });\r\n }\r\n\r\n getDetails<TData>(entityKey: string, id: number): Observable<TData> {\r\n let _url = this.baseUrl + `/${entityKey}/GetDetails?`;\r\n if (id === undefined || id === null)\r\n throw new Error(\"The parameter 'id' must be defined and cannot be null.\");\r\n else\r\n _url += \"id=\" + encodeURI(\"\" + id);\r\n\r\n _url = _url.replace(/[?&]$/, \"\");\r\n\r\n return this.httpClient.get<TData>(_url);\r\n }\r\n\r\n getEmptyFilter<T>(entityKey: string): Observable<T> {\r\n return this.getCached<T>(entityKey, 'GetEmptyFilter');\r\n }\r\n\r\n /**\r\n * fonction \"async\" liant le front(Angular) et le back(C#)\r\n * - Principalement appelée par \"src.app.core.layout.BaseEditorComponent.loadEntityViewModel()\" lorsque l'on cherche à afficher un Objet de type \"EntityViewModel\"\r\n * - C'est elle qui lance l'appel à la fonction \"back\" BaseFilterController.GetEntityViewModel<TData>(id).\r\n * - Puis elle crée un observable avec la réponse qu'elle obtient du \"back\"\r\n *\r\n * @async\r\n * @function\r\n * @name getEntityViewModel<TData>\r\n * @param {string} entityKey\r\n * @param {number} id\r\n * @returns {(Observable)EntityViewModelWithFields<TData>}\r\n * @memberof DataService\r\n * @summary Demande les données d'une entité au back(C#) à travers \"getEntityViewModel\".\r\n * @see {@link src.app.core.layout.BaseEditorComponent.loadEntityViewModel()} for more information\r\n * @throws new Error(\"The parameter 'id' must be defined and cannot be null.\") if (id === undefined ou id === null)\r\n */\r\n getEntityViewModel<TData>(entityKey: string, id: number): Observable<EntityViewModelWithFields<TData>> {\r\n let _url = this. baseUrl + `/${entityKey}/GetEntityViewModel?`;\r\n if (id === undefined || id === null)\r\n throw new Error(\"The parameter 'id' must be defined and cannot be null.\");\r\n else if (id === 0)\r\n // Formulaire vide (id 0) : donnée d'initialisation, gardée en cache.\r\n return this.getCached<EntityViewModelWithFields<TData>>(entityKey, 'GetEntityViewModel?id=0');\r\n else\r\n _url += \"id=\" + encodeURI(\"\" + id);\r\n\r\n _url = _url.replace(/[?&]$/, \"\");\r\n\r\n return this.httpClient.get(_url).pipe(\r\n map((resp: Response) => <EntityViewModelWithFields<TData>>resp));\r\n }\r\n\r\n getExtendedProperties(entityKey: string, entityIds: number[]): Observable<ExtendedProperty[]> {\r\n let _url = this.baseUrl + `/${entityKey}/GetExtendedProperties`;\r\n\r\n let requestParams = this.getUrlQueryParams({ entityIds: entityIds });\r\n return this.httpClient.get<ExtendedProperty[]>(_url, { params: requestParams });\r\n }\r\n\r\n getExtendedActions (entityKey: string) : Observable<ActionDescriptor[]> {\r\n return this.getCached<ActionDescriptor[]>(entityKey, 'GetExtendedActions');\r\n }\r\n \r\n getTrackRecordProperties(entityKey: string, entityIds: number[]): Observable<TrackRecordProperty[]> {\r\n let _url = this.baseUrl + `/${entityKey}/GetTrackRecordProperties`;\r\n\r\n let requestParams = this.getUrlQueryParams({ entityIds: entityIds });\r\n return this.httpClient.get<TrackRecordProperty[]>(_url, { params: requestParams });\r\n }\r\n\r\n saveEntity<TData>(entityKey: string, entity: TData): Observable<SaveResult> {\r\n let _url = this.baseUrl + `/${entityKey}/SaveEntity`;\r\n return this.httpClient.post<SaveResult>(_url, this.getFormattedParams(entity));\r\n }\r\n\r\n deleteEntity<TData>(entityKey: string, entity: TData): Observable<SaveResult> {\r\n let _url = this.baseUrl + `/${entityKey}/DeleteEntity`;\r\n return this.httpClient.post<SaveResult>(_url, this.getFormattedParams(entity));\r\n }\r\n\r\n deleteEntities<TData>(entityKey: string, entities: TData[]): Observable<SaveResults<TData>> {\r\n let _url = this.baseUrl + `/${entityKey}/DeleteEntities`;\r\n return this.httpClient.post<SaveResults<TData>>(_url, this.getFormattedParams(entities));\r\n }\r\n\r\n saveEntities<TData>(entityKey: string, entities: TData[]): Observable<SaveResults<TData>> {\r\n let _url = this.baseUrl + `/${entityKey}/saveEntities`;\r\n let toSave = [];\r\n entities.forEach(entity => {\r\n toSave.push(this.getFormattedParams(entity));\r\n });\r\n return this.httpClient.post<SaveResults<TData>>(_url, JSON.stringify(toSave));\r\n }\r\n\r\n\r\n\r\n SaveEntityWithSpecifics<TData>(entityKey: string, DataToSave: EntityWithSpecifics<TData>): Observable<{ success: boolean, rowVersion?: Date }> {\r\n let _url = this.baseUrl + `/${entityKey}/SaveEntityWithSpecifics`;\r\n return this.httpClient.post<{ success: boolean, rowVersion?: Date }>(_url, this.getFormattedParams(DataToSave));\r\n }\r\n\r\n exportAll<TData>(entityKey: string, filter: any) {\r\n let _url = this.baseUrl + `/${entityKey}/ExportAll`;\r\n let requestParams = this.getUrlQueryParams(filter);\r\n\r\n return this.httpClient.get(_url, { observe: 'response', params: requestParams, withCredentials: true, responseType: 'blob' })\r\n .pipe(map((r: HttpResponse<Blob>) => this.getFileInfo(r)))\r\n }\r\n\r\n exportResults<TData>(entityKey: string, exportModel: any) {\r\n let _url = this.baseUrl + `/${entityKey}/ExportResults`;\r\n const _body = JSON.stringify(exportModel);\r\n\r\n return this.httpClient.post(_url, _body, { observe: 'response', responseType: 'blob' })\r\n .pipe(map((r: HttpResponse<Blob>) => this.getFileInfo(r)));\r\n }\r\n\r\n public getFileInfo(resp: HttpResponse<Blob>): { fileBlob: Blob, fileName: string } {\r\n var type = resp.headers.get(\"Content-Type\");\r\n let b = new Blob([resp.body], { type: type });\r\n return {\r\n fileBlob: b,\r\n fileName: (resp.headers.get(\"Content-Disposition\") || \"\").split(\";\")[1].trim().split(\"=\")[1].replace(/['\"]/g, '')\r\n };\r\n }\r\n\r\n uploadFileToExtract(file: File, inputId: number, correlationId: string) {\r\n return this.uploadFiles(\"/DataImport/PostImportFile\", [file], { inputId: inputId, correlationId: correlationId });\r\n }\r\n\r\n uploadFilesWithParams(files: File[], customParams?: {}, forceMultipleFiles: boolean = false): Observable<any> {\r\n\r\n const _url = this.baseUrl + \"/DataImport/PostFiles\";\r\n\r\n let formData = new FormData();\r\n if (files.length == 1 && !forceMultipleFiles) {\r\n formData.append('file', files[0]);\r\n }\r\n else {\r\n for (var i = 0; i < files.length; i++) {\r\n formData.append('files', files[i]);\r\n }\r\n }\r\n\r\n formData.append('data', JSON.stringify((customParams as any).dataModel));\r\n let params = new HttpParams();\r\n\r\n return this.httpClient.post(_url, formData, {\r\n params,\r\n reportProgress: true,\r\n observe: 'body',\r\n headers: this.headerService.authFileUploadHeaders()\r\n });\r\n }\r\n\r\n uploadFiles(url: string, files: File[], customParams?: {}, forceMultipleFiles: boolean = false): Observable<any> {\r\n\r\n const _url = this.baseUrl + url;\r\n\r\n let formData = new FormData();\r\n if (files.length == 1 && !forceMultipleFiles) {\r\n formData.append('file', files[0]);\r\n }\r\n else {\r\n for (var i = 0; i < files.length; i++) {\r\n formData.append('files', files[i]);\r\n }\r\n }\r\n\r\n if (customParams) {\r\n for (let p in customParams) {\r\n if (customParams.hasOwnProperty(p)) {\r\n formData.append(p, customParams[p]);\r\n }\r\n }\r\n }\r\n\r\n let params = new HttpParams();\r\n\r\n\r\n return this.httpClient.post(_url, formData, {\r\n params,\r\n reportProgress: true,\r\n observe: 'body',\r\n headers: this.headerService.authFileUploadHeaders()\r\n });\r\n }\r\n\r\n uploadFilesWithEvents(url: string, files: File[], customParams?: {}, forceMultipleFiles: boolean = false): Observable<any> {\r\n\r\n const _url = this.baseUrl + url;\r\n\r\n let formData = new FormData();\r\n if (files.length == 1 && !forceMultipleFiles) {\r\n formData.append('file', files[0]);\r\n }\r\n else {\r\n for (var i = 0; i < files.length; i++) {\r\n formData.append('files', files[i]);\r\n }\r\n }\r\n\r\n if (customParams) {\r\n for (let p in customParams) {\r\n if (customParams.hasOwnProperty(p)) {\r\n formData.append(p, customParams[p]);\r\n }\r\n }\r\n }\r\n\r\n let params = new HttpParams();\r\n return this.httpClient.post<any>(_url, formData, {\r\n params,\r\n reportProgress: true,\r\n observe: 'events',\r\n headers: this.headerService.authFileUploadHeaders()\r\n });\r\n\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\n\r\nimport { DataService } from './services/data-service';\r\n\r\n\r\n@NgModule({\r\n imports: [CommonModule],\r\n providers: [DataService]\r\n})\r\nexport class CoreDataModule {}\r\n","import { ActionDescriptor, ColumnDescriptor, EntityViewModel, EntityViewModelWithFields, EntityWithSpecifics, ExportModel, ExtendedProperty, FilterDescriptor, FilterViewModel, PagedList, SaveResult, SaveResults, TrackRecordProperty } from '@dflat-core/web/core-model';\r\n\r\nimport { DataService } from './data-service';\r\nimport { HttpResponse } from '@angular/common/http';\r\nimport { Directive } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\n\r\n@Directive()\r\nexport abstract class EntityDataService<TData extends EntityViewModel, TFilter extends FilterViewModel> \r\n{\r\n abstract getEntityKey(): string;\r\n\r\n constructor(protected dataService : DataService) {}\r\n deleteEntities (sources:TData[]) : Observable<SaveResults<TData>> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/DeleteEntities`;\r\n const requestParams = this.dataService.getFormattedParams(sources);\r\n return this.dataService.httpClient.post<SaveResults<TData>>(_url, requestParams);\r\n }\r\n\r\n deleteEntity (source:TData) : Observable<SaveResult> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/DeleteEntity`;\r\n const requestParams = this.dataService.getFormattedParams(source);\r\n return this.dataService.httpClient.post<SaveResult>(_url, requestParams);\r\n }\r\n\r\n exportAll (filter:TFilter) {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/ExportAll`;\r\n const requestParams = this.dataService.getFormattedParams(filter);\r\n return this.dataService.httpClient.get(_url, { observe: 'response', params: requestParams, withCredentials: true, responseType: 'blob' }).pipe(map((r: HttpResponse<Blob>) => this.dataService.getFileInfo(r)));\r\n }\r\n\r\n exportResults (model:ExportModel<TFilter>) {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/ExportResults`;\r\n const requestParams = this.dataService.getFormattedParams(model);\r\n return this.dataService.httpClient.get(_url, { observe: 'response', params: requestParams, withCredentials: true, responseType: 'blob' }).pipe(map((r: HttpResponse<Blob>) => this.dataService.getFileInfo(r)));\r\n }\r\n\r\n getAlternateEntityViewModel (id:number) : Observable<EntityViewModelWithFields<TData>> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/GetAlternateEntityViewModel`;\r\n const requestParams = this.dataService.getUrlQueryParams({ id:id });\r\n return this.dataService.httpClient.get<EntityViewModelWithFields<TData>>(_url, { params: requestParams });\r\n }\r\n\r\n getCacheManager () : Observable<TData[]> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/GetCacheManager`;\r\n return this.dataService.httpClient.get<TData[]>(_url, {});\r\n }\r\n\r\n getColumns () : Observable<ColumnDescriptor[]> {\r\n return this.dataService.getCached<ColumnDescriptor[]>(this.getEntityKey(), 'GetColumns');\r\n }\r\n\r\n getDetails (id:number) : Observable<TData> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/GetDetails`;\r\n const requestParams = this.dataService.getUrlQueryParams({ id:id });\r\n return this.dataService.httpClient.get<TData>(_url, { params: requestParams });\r\n }\r\n\r\n getEmptyFilter () : Observable<TFilter> {\r\n return this.dataService.getCached<TFilter>(this.getEntityKey(), 'GetEmptyFilter');\r\n }\r\n\r\n getEntityViewModel (id:number) : Observable<EntityViewModelWithFields<TData>> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/GetEntityViewModel`;\r\n const requestParams = this.dataService.getUrlQueryParams({ id:id });\r\n return this.dataService.httpClient.get<EntityViewModelWithFields<TData>>(_url, { params: requestParams });\r\n }\r\n\r\n getExtendedActions () : Observable<ActionDescriptor[]> {\r\n return this.dataService.getCached<ActionDescriptor[]>(this.getEntityKey(), 'GetExtendedActions');\r\n }\r\n\r\n getExtendedProperties (entityIds:number[]) : Observable<ExtendedProperty[]> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/GetExtendedProperties`;\r\n const requestParams = this.dataService.getUrlQueryParams({ entityIds:entityIds });\r\n return this.dataService.httpClient.get<ExtendedProperty[]>(_url, { params: requestParams });\r\n }\r\n\r\n getFilterDescriptors () : Observable<FilterDescriptor[]> {\r\n return this.dataService.getCached<FilterDescriptor[]>(this.getEntityKey(), 'GetFilterDescriptors');\r\n }\r\n\r\n getSortColumn (col:string) : Observable<string> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/GetSortColumn`;\r\n const requestParams = this.dataService.getUrlQueryParams({ col:col });\r\n return this.dataService.httpClient.get<string>(_url, { params: requestParams });\r\n }\r\n\r\n getTrackRecordProperties (entityIds:number[]) : Observable<TrackRecordProperty[]> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/GetTrackRecordProperties`;\r\n const requestParams = this.dataService.getUrlQueryParams({ entityIds:entityIds });\r\n return this.dataService.httpClient.get<TrackRecordProperty[]>(_url, { params: requestParams });\r\n }\r\n \r\n saveEntities (sources:TData[]) : Observable<SaveResults<TData>> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/SaveEntities`;\r\n const requestParams = this.dataService.getFormattedParams(sources);\r\n return this.dataService.httpClient.post<SaveResults<TData>>(_url, requestParams);\r\n }\r\n\r\n saveEntity (source:TData) : Observable<SaveResult> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/SaveEntity`;\r\n const requestParams = this.dataService.getFormattedParams(source);\r\n return this.dataService.httpClient.post<SaveResult>(_url, requestParams);\r\n }\r\n\r\n saveEntityWithSpecifics (source:EntityWithSpecifics<TData>) : Observable<any> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/SaveEntityWithSpecifics`;\r\n const requestParams = this.dataService.getFormattedParams(source);\r\n return this.dataService.httpClient.post<any>(_url, requestParams);\r\n }\r\n\r\n search (filter:TFilter) : Observable<PagedList<TData>> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/Search`;\r\n const requestParams = this.dataService.getFormattedParams(filter);\r\n return this.dataService.httpClient.get<PagedList<TData>>(_url, { params: requestParams });\r\n }\r\n\r\n toggleFavorite (filter:TFilter) : Observable<any> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/ToggleFavorite`;\r\n const requestParams = this.dataService.getFormattedParams(filter);\r\n return this.dataService.httpClient.post<any>(_url, requestParams);\r\n }\r\n\r\n}\r\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dflat-core-web-core-data.mjs","names":["i1.DataService"],"sources":["../../core-data/src/lib/services/data-service.ts","../../core-data/src/lib/core-data.module.ts","../../core-data/src/lib/services/entity-data-service.ts"],"sourcesContent":["import { EnvironmentBase, Utilities } from '@dflat-core/web/core';\r\nimport { ActionDescriptor, ColumnDescriptor, EntityViewModelWithFields, EntityWithSpecifics, ExtendedProperty, FilterDescriptor, PagedList, SaveResult, SaveResults, TrackRecordProperty } from '@dflat-core/web/core-model';\r\nimport { HeadersService, InitCacheService } from '@dflat-core/web/core-services';\r\nimport { HttpClient, HttpParams, HttpResponse } from '@angular/common/http';\r\nimport { inject, Injectable, Type } from '@angular/core';\r\nimport { defer, Observable, of } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\n\r\n\r\n@Injectable()\r\nexport class DataService {\r\n\r\n baseUrl = this.env.apiUrl;\r\n httpClient: HttpClient;\r\n data: any[];\r\n private initCache = inject(InitCacheService);\r\n constructor(\r\n private env: EnvironmentBase,\r\n httpClient: HttpClient,\r\n private headerService: HeadersService) {\r\n this.httpClient = httpClient\r\n }\r\n\r\n getFormattedParams(params: any): any {\r\n // Point d'entrée public : conserve le comportement historique\r\n // (stringify uniquement quand params racine est un tableau).\r\n if (Array.isArray(params)) {\r\n if (params.length > 0 && typeof (params[0]) === 'number') {\r\n return JSON.stringify(params);\r\n }\r\n const result = params.map(entity => this.formatValueRecursive(entity));\r\n return JSON.stringify(result);\r\n }\r\n\r\n return this.formatValueRecursive(params);\r\n }\r\n\r\n // Transforme récursivement un objet/tableau/valeur, sans jamais stringifier.\r\n // Utilisée pour descendre dans les propriétés imbriquées (ex: un tableau\r\n // d'objets contenu dans une propriété d'un objet racine), qui étaient\r\n // auparavant copiées telles quelles et donc jamais nettoyées de leurs Date.\r\n private formatValueRecursive(val: any): any {\r\n if (val === undefined || val === null) {\r\n return val;\r\n }\r\n\r\n if (val instanceof Date) {\r\n return `${Utilities.Format2Digits(val.getFullYear())}-${Utilities.Format2Digits(val.getMonth() + 1)}-${Utilities.Format2Digits(val.getDate())}T00:00:00.000Z`;\r\n }\r\n\r\n if (Array.isArray(val)) {\r\n // Tableau de nombres : on le laisse tel quel (comme au niveau racine)\r\n if (val.length > 0 && typeof (val[0]) === 'number') {\r\n return val;\r\n }\r\n return val.map(item => this.formatValueRecursive(item));\r\n }\r\n\r\n if (typeof val === 'object') {\r\n const result: any = {};\r\n for (let key in val) {\r\n if (val.hasOwnProperty(key)) {\r\n const propVal = val[key];\r\n if (propVal !== undefined && propVal !== null) {\r\n result[key] = this.formatValueRecursive(propVal);\r\n }\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n // primitive (string, number, boolean...) : inchangé\r\n return val;\r\n }\r\n\r\n\r\n getUrlQueryParams(filter: any): HttpParams {\r\n let requestParams = new HttpParams();\r\n let formattedFilter = this.getFormattedParams(filter);\r\n for (let key in formattedFilter) {\r\n if (formattedFilter.hasOwnProperty(key)) {\r\n let vals = formattedFilter[key];\r\n if (Array.isArray(vals) && vals.length > 0)\r\n {\r\n for (let key2 in vals) {\r\n requestParams = requestParams.append(key, vals[key2]);\r\n }\r\n }\r\n else if (typeof vals === 'object') {\r\n requestParams = requestParams.set(key, JSON.stringify(vals));\r\n }\r\n else\r\n {\r\n requestParams = requestParams.set(key, vals);\r\n }\r\n }\r\n }\r\n return requestParams;\r\n }\r\n\r\n /*getUrlQueryArrayParams(filter: any): HttpParams {\r\n let requestParams = new HttpParams();\r\n let formattedFilter = this.getFormattedParams(filter);\r\n for (let key in formattedFilter) {\r\n if (formattedFilter.hasOwnProperty(key)) {\r\n let vals = formattedFilter[key];\r\n for (let key2 in vals) {\r\n requestParams = requestParams.append(key, vals[key2]);\r\n }\r\n }\r\n }\r\n return requestParams;\r\n }*/\r\n\r\n /**\r\n * Appel GET sans paramètre gardé dans le cache d'initialisation (InitCacheService) : données\r\n * chargées avant la recherche, identiques d'une ouverture de l'écran à l'autre. Le cache est\r\n * vidé au redémarrage de l'API (horodatage du jeton d'accès) et au changement d'utilisateur.\r\n */\r\n getCached<T>(entityKey: string, action: string): Observable<T> {\r\n return this.initCache.get<T>(`${entityKey}/${action}`,\r\n () => this.httpClient.get<T>(this.baseUrl + `/${entityKey}/${action}`, {}));\r\n }\r\n\r\n /**\r\n * Valeur d'initialisation d'une entité calculée par le front (ex. définition de ses onglets,\r\n * voir EntitySections), gardée dans le même cache que les appels de getCached et sous la même\r\n * portée (clé de l'entité) : `factory` n'est appelée qu'une fois, jusqu'à ce que le cache soit\r\n * vidé (clearCached, redémarrage de l'API, changement d'utilisateur).\r\n */\r\n getCachedValue<T>(entityKey: string, name: string, factory: () => T): Observable<T> {\r\n return this.initCache.get<T>(`${entityKey}/${name}`, () => defer(() => of(factory())));\r\n }\r\n\r\n /** Vide le cache d'initialisation d'une entité, ou tout le cache. */\r\n clearCached(entityKey?: string): void {\r\n this.initCache.clear(Utilities.IsNil(entityKey) ? null : `${entityKey}/`);\r\n }\r\n\r\n getViewFilterDescriptors(entityKey: string): Observable<FilterDescriptor[]> {\r\n return this.getCached<FilterDescriptor[]>(entityKey, 'GetFilterDescriptors');\r\n }\r\n\r\n getViewColumns(entityKey: string): Observable<ColumnDescriptor[]> {\r\n return this.getCached<ColumnDescriptor[]>(entityKey, 'GetGridColumns');\r\n }\r\n\r\n search<TData>(entityKey: string, filter: any): Observable<PagedList<TData>> {\r\n let _url = this.baseUrl + `/${entityKey}/Search`;\r\n let requestParams = this.getUrlQueryParams(filter);\r\n return this.httpClient.get<PagedList<TData>>(_url, { params: requestParams });\r\n }\r\n\r\n getDetails<TData>(entityKey: string, id: number): Observable<TData> {\r\n let _url = this.baseUrl + `/${entityKey}/GetDetails?`;\r\n if (id === undefined || id === null)\r\n throw new Error(\"The parameter 'id' must be defined and cannot be null.\");\r\n else\r\n _url += \"id=\" + encodeURI(\"\" + id);\r\n\r\n _url = _url.replace(/[?&]$/, \"\");\r\n\r\n return this.httpClient.get<TData>(_url);\r\n }\r\n\r\n getEmptyFilter<T>(entityKey: string): Observable<T> {\r\n return this.getCached<T>(entityKey, 'GetEmptyFilter');\r\n }\r\n\r\n /**\r\n * fonction \"async\" liant le front(Angular) et le back(C#)\r\n * - Principalement appelée par \"src.app.core.layout.BaseEditorComponent.loadEntityViewModel()\" lorsque l'on cherche à afficher un Objet de type \"EntityViewModel\"\r\n * - C'est elle qui lance l'appel à la fonction \"back\" BaseFilterController.GetEntityViewModel<TData>(id).\r\n * - Puis elle crée un observable avec la réponse qu'elle obtient du \"back\"\r\n *\r\n * @async\r\n * @function\r\n * @name getEntityViewModel<TData>\r\n * @param {string} entityKey\r\n * @param {number} id\r\n * @returns {(Observable)EntityViewModelWithFields<TData>}\r\n * @memberof DataService\r\n * @summary Demande les données d'une entité au back(C#) à travers \"getEntityViewModel\".\r\n * @see {@link src.app.core.layout.BaseEditorComponent.loadEntityViewModel()} for more information\r\n * @throws new Error(\"The parameter 'id' must be defined and cannot be null.\") if (id === undefined ou id === null)\r\n */\r\n getEntityViewModel<TData>(entityKey: string, id: number): Observable<EntityViewModelWithFields<TData>> {\r\n let _url = this. baseUrl + `/${entityKey}/GetEntityViewModel?`;\r\n if (id === undefined || id === null)\r\n throw new Error(\"The parameter 'id' must be defined and cannot be null.\");\r\n else if (id === 0)\r\n // Formulaire vide (id 0) : donnée d'initialisation, gardée en cache.\r\n return this.getCached<EntityViewModelWithFields<TData>>(entityKey, 'GetEntityViewModel?id=0');\r\n else\r\n _url += \"id=\" + encodeURI(\"\" + id);\r\n\r\n _url = _url.replace(/[?&]$/, \"\");\r\n\r\n return this.httpClient.get(_url).pipe(\r\n map((resp: Response) => <EntityViewModelWithFields<TData>>resp));\r\n }\r\n\r\n getExtendedProperties(entityKey: string, entityIds: number[]): Observable<ExtendedProperty[]> {\r\n let _url = this.baseUrl + `/${entityKey}/GetExtendedProperties`;\r\n\r\n let requestParams = this.getUrlQueryParams({ entityIds: entityIds });\r\n return this.httpClient.get<ExtendedProperty[]>(_url, { params: requestParams });\r\n }\r\n\r\n getExtendedActions (entityKey: string) : Observable<ActionDescriptor[]> {\r\n return this.getCached<ActionDescriptor[]>(entityKey, 'GetExtendedActions');\r\n }\r\n \r\n getTrackRecordProperties(entityKey: string, entityIds: number[]): Observable<TrackRecordProperty[]> {\r\n let _url = this.baseUrl + `/${entityKey}/GetTrackRecordProperties`;\r\n\r\n let requestParams = this.getUrlQueryParams({ entityIds: entityIds });\r\n return this.httpClient.get<TrackRecordProperty[]>(_url, { params: requestParams });\r\n }\r\n\r\n saveEntity<TData>(entityKey: string, entity: TData): Observable<SaveResult> {\r\n let _url = this.baseUrl + `/${entityKey}/SaveEntity`;\r\n return this.httpClient.post<SaveResult>(_url, this.getFormattedParams(entity));\r\n }\r\n\r\n deleteEntity<TData>(entityKey: string, entity: TData): Observable<SaveResult> {\r\n let _url = this.baseUrl + `/${entityKey}/DeleteEntity`;\r\n return this.httpClient.post<SaveResult>(_url, this.getFormattedParams(entity));\r\n }\r\n\r\n deleteEntities<TData>(entityKey: string, entities: TData[]): Observable<SaveResults<TData>> {\r\n let _url = this.baseUrl + `/${entityKey}/DeleteEntities`;\r\n return this.httpClient.post<SaveResults<TData>>(_url, this.getFormattedParams(entities));\r\n }\r\n\r\n saveEntities<TData>(entityKey: string, entities: TData[]): Observable<SaveResults<TData>> {\r\n let _url = this.baseUrl + `/${entityKey}/saveEntities`;\r\n let toSave = [];\r\n entities.forEach(entity => {\r\n toSave.push(this.getFormattedParams(entity));\r\n });\r\n return this.httpClient.post<SaveResults<TData>>(_url, JSON.stringify(toSave));\r\n }\r\n\r\n\r\n\r\n SaveEntityWithSpecifics<TData>(entityKey: string, DataToSave: EntityWithSpecifics<TData>): Observable<{ success: boolean, rowVersion?: Date }> {\r\n let _url = this.baseUrl + `/${entityKey}/SaveEntityWithSpecifics`;\r\n return this.httpClient.post<{ success: boolean, rowVersion?: Date }>(_url, this.getFormattedParams(DataToSave));\r\n }\r\n\r\n exportAll<TData>(entityKey: string, filter: any) {\r\n let _url = this.baseUrl + `/${entityKey}/ExportAll`;\r\n let requestParams = this.getUrlQueryParams(filter);\r\n\r\n return this.httpClient.get(_url, { observe: 'response', params: requestParams, withCredentials: true, responseType: 'blob' })\r\n .pipe(map((r: HttpResponse<Blob>) => this.getFileInfo(r)))\r\n }\r\n\r\n exportResults<TData>(entityKey: string, exportModel: any) {\r\n let _url = this.baseUrl + `/${entityKey}/ExportResults`;\r\n const _body = JSON.stringify(exportModel);\r\n\r\n return this.httpClient.post(_url, _body, { observe: 'response', responseType: 'blob' })\r\n .pipe(map((r: HttpResponse<Blob>) => this.getFileInfo(r)));\r\n }\r\n\r\n public getFileInfo(resp: HttpResponse<Blob>): { fileBlob: Blob, fileName: string } {\r\n var type = resp.headers.get(\"Content-Type\");\r\n let b = new Blob([resp.body], { type: type });\r\n return {\r\n fileBlob: b,\r\n fileName: (resp.headers.get(\"Content-Disposition\") || \"\").split(\";\")[1].trim().split(\"=\")[1].replace(/['\"]/g, '')\r\n };\r\n }\r\n\r\n uploadFileToExtract(file: File, inputId: number, correlationId: string) {\r\n return this.uploadFiles(\"/DataImport/PostImportFile\", [file], { inputId: inputId, correlationId: correlationId });\r\n }\r\n\r\n uploadFilesWithParams(files: File[], customParams?: {}, forceMultipleFiles: boolean = false): Observable<any> {\r\n\r\n const _url = this.baseUrl + \"/DataImport/PostFiles\";\r\n\r\n let formData = new FormData();\r\n if (files.length == 1 && !forceMultipleFiles) {\r\n formData.append('file', files[0]);\r\n }\r\n else {\r\n for (var i = 0; i < files.length; i++) {\r\n formData.append('files', files[i]);\r\n }\r\n }\r\n\r\n formData.append('data', JSON.stringify((customParams as any).dataModel));\r\n let params = new HttpParams();\r\n\r\n return this.httpClient.post(_url, formData, {\r\n params,\r\n reportProgress: true,\r\n observe: 'body',\r\n headers: this.headerService.authFileUploadHeaders()\r\n });\r\n }\r\n\r\n uploadFiles(url: string, files: File[], customParams?: {}, forceMultipleFiles: boolean = false): Observable<any> {\r\n\r\n const _url = this.baseUrl + url;\r\n\r\n let formData = new FormData();\r\n if (files.length == 1 && !forceMultipleFiles) {\r\n formData.append('file', files[0]);\r\n }\r\n else {\r\n for (var i = 0; i < files.length; i++) {\r\n formData.append('files', files[i]);\r\n }\r\n }\r\n\r\n if (customParams) {\r\n for (let p in customParams) {\r\n if (customParams.hasOwnProperty(p)) {\r\n formData.append(p, customParams[p]);\r\n }\r\n }\r\n }\r\n\r\n let params = new HttpParams();\r\n\r\n\r\n return this.httpClient.post(_url, formData, {\r\n params,\r\n reportProgress: true,\r\n observe: 'body',\r\n headers: this.headerService.authFileUploadHeaders()\r\n });\r\n }\r\n\r\n uploadFilesWithEvents(url: string, files: File[], customParams?: {}, forceMultipleFiles: boolean = false): Observable<any> {\r\n\r\n const _url = this.baseUrl + url;\r\n\r\n let formData = new FormData();\r\n if (files.length == 1 && !forceMultipleFiles) {\r\n formData.append('file', files[0]);\r\n }\r\n else {\r\n for (var i = 0; i < files.length; i++) {\r\n formData.append('files', files[i]);\r\n }\r\n }\r\n\r\n if (customParams) {\r\n for (let p in customParams) {\r\n if (customParams.hasOwnProperty(p)) {\r\n formData.append(p, customParams[p]);\r\n }\r\n }\r\n }\r\n\r\n let params = new HttpParams();\r\n return this.httpClient.post<any>(_url, formData, {\r\n params,\r\n reportProgress: true,\r\n observe: 'events',\r\n headers: this.headerService.authFileUploadHeaders()\r\n });\r\n\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\n\r\nimport { DataService } from './services/data-service';\r\n\r\n\r\n@NgModule({\r\n imports: [CommonModule],\r\n providers: [DataService]\r\n})\r\nexport class CoreDataModule {}\r\n","import { ActionDescriptor, ColumnDescriptor, EntityViewModel, EntityViewModelWithFields, EntityWithSpecifics, ExportModel, ExtendedProperty, FilterDescriptor, FilterViewModel, PagedList, SaveResult, SaveResults, TrackRecordProperty } from '@dflat-core/web/core-model';\r\n\r\nimport { DataService } from './data-service';\r\nimport { HttpResponse } from '@angular/common/http';\r\nimport { Directive } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\n\r\n@Directive()\r\nexport abstract class EntityDataService<TData extends EntityViewModel, TFilter extends FilterViewModel> \r\n{\r\n abstract getEntityKey(): string;\r\n\r\n constructor(protected dataService : DataService) {}\r\n deleteEntities (sources:TData[]) : Observable<SaveResults<TData>> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/DeleteEntities`;\r\n const requestParams = this.dataService.getFormattedParams(sources);\r\n return this.dataService.httpClient.post<SaveResults<TData>>(_url, requestParams);\r\n }\r\n\r\n deleteEntity (source:TData) : Observable<SaveResult> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/DeleteEntity`;\r\n const requestParams = this.dataService.getFormattedParams(source);\r\n return this.dataService.httpClient.post<SaveResult>(_url, requestParams);\r\n }\r\n\r\n exportAll (filter:TFilter) {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/ExportAll`;\r\n const requestParams = this.dataService.getFormattedParams(filter);\r\n return this.dataService.httpClient.get(_url, { observe: 'response', params: requestParams, withCredentials: true, responseType: 'blob' }).pipe(map((r: HttpResponse<Blob>) => this.dataService.getFileInfo(r)));\r\n }\r\n\r\n exportResults (model:ExportModel<TFilter>) {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/ExportResults`;\r\n const requestParams = this.dataService.getFormattedParams(model);\r\n return this.dataService.httpClient.get(_url, { observe: 'response', params: requestParams, withCredentials: true, responseType: 'blob' }).pipe(map((r: HttpResponse<Blob>) => this.dataService.getFileInfo(r)));\r\n }\r\n\r\n getAlternateEntityViewModel (id:number) : Observable<EntityViewModelWithFields<TData>> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/GetAlternateEntityViewModel`;\r\n const requestParams = this.dataService.getUrlQueryParams({ id:id });\r\n return this.dataService.httpClient.get<EntityViewModelWithFields<TData>>(_url, { params: requestParams });\r\n }\r\n\r\n getCacheManager () : Observable<TData[]> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/GetCacheManager`;\r\n return this.dataService.httpClient.get<TData[]>(_url, {});\r\n }\r\n\r\n getColumns () : Observable<ColumnDescriptor[]> {\r\n return this.dataService.getCached<ColumnDescriptor[]>(this.getEntityKey(), 'GetColumns');\r\n }\r\n\r\n getDetails (id:number) : Observable<TData> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/GetDetails`;\r\n const requestParams = this.dataService.getUrlQueryParams({ id:id });\r\n return this.dataService.httpClient.get<TData>(_url, { params: requestParams });\r\n }\r\n\r\n getEmptyFilter () : Observable<TFilter> {\r\n return this.dataService.getCached<TFilter>(this.getEntityKey(), 'GetEmptyFilter');\r\n }\r\n\r\n getEntityViewModel (id:number) : Observable<EntityViewModelWithFields<TData>> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/GetEntityViewModel`;\r\n const requestParams = this.dataService.getUrlQueryParams({ id:id });\r\n return this.dataService.httpClient.get<EntityViewModelWithFields<TData>>(_url, { params: requestParams });\r\n }\r\n\r\n getExtendedActions () : Observable<ActionDescriptor[]> {\r\n return this.dataService.getCached<ActionDescriptor[]>(this.getEntityKey(), 'GetExtendedActions');\r\n }\r\n\r\n getExtendedProperties (entityIds:number[]) : Observable<ExtendedProperty[]> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/GetExtendedProperties`;\r\n const requestParams = this.dataService.getUrlQueryParams({ entityIds:entityIds });\r\n return this.dataService.httpClient.get<ExtendedProperty[]>(_url, { params: requestParams });\r\n }\r\n\r\n getFilterDescriptors () : Observable<FilterDescriptor[]> {\r\n return this.dataService.getCached<FilterDescriptor[]>(this.getEntityKey(), 'GetFilterDescriptors');\r\n }\r\n\r\n getSortColumn (col:string) : Observable<string> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/GetSortColumn`;\r\n const requestParams = this.dataService.getUrlQueryParams({ col:col });\r\n return this.dataService.httpClient.get<string>(_url, { params: requestParams });\r\n }\r\n\r\n getTrackRecordProperties (entityIds:number[]) : Observable<TrackRecordProperty[]> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/GetTrackRecordProperties`;\r\n const requestParams = this.dataService.getUrlQueryParams({ entityIds:entityIds });\r\n return this.dataService.httpClient.get<TrackRecordProperty[]>(_url, { params: requestParams });\r\n }\r\n \r\n saveEntities (sources:TData[]) : Observable<SaveResults<TData>> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/SaveEntities`;\r\n const requestParams = this.dataService.getFormattedParams(sources);\r\n return this.dataService.httpClient.post<SaveResults<TData>>(_url, requestParams);\r\n }\r\n\r\n saveEntity (source:TData) : Observable<SaveResult> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/SaveEntity`;\r\n const requestParams = this.dataService.getFormattedParams(source);\r\n return this.dataService.httpClient.post<SaveResult>(_url, requestParams);\r\n }\r\n\r\n saveEntityWithSpecifics (source:EntityWithSpecifics<TData>) : Observable<any> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/SaveEntityWithSpecifics`;\r\n const requestParams = this.dataService.getFormattedParams(source);\r\n return this.dataService.httpClient.post<any>(_url, requestParams);\r\n }\r\n\r\n search (filter:TFilter) : Observable<PagedList<TData>> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/Search`;\r\n const requestParams = this.dataService.getFormattedParams(filter);\r\n return this.dataService.httpClient.get<PagedList<TData>>(_url, { params: requestParams });\r\n }\r\n\r\n toggleFavorite (filter:TFilter) : Observable<any> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/ToggleFavorite`;\r\n const requestParams = this.dataService.getFormattedParams(filter);\r\n return this.dataService.httpClient.post<any>(_url, requestParams);\r\n }\r\n\r\n}\r\n"],"mappings":"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"}
|