@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dflat-core-web.mjs","names":[],"sources":["../../src/index.ts"],"sourcesContent":["/*\r\n * Point d'entrée principal de @dflat-core/web.\r\n * Les librairies sont exposées par des points d'entrée secondaires :\r\n * @dflat-core/web/core, @dflat-core/web/core-model, @dflat-core/web/core-services, @dflat-core/web/core-data,\r\n * @dflat-core/web/core-ux, @dflat-core/web/system-model, @dflat-core/web/system-data,\r\n * @dflat-core/web/system-root, @dflat-core/web/system-ux\r\n */\r\nexport const DFLAT_WEB_ENTRY_POINTS = [\r\n 'core', 'core-model', 'core-services', 'core-data', 'core-ux',\r\n 'system-model', 'system-data', 'system-root', 'system-ux'\r\n] as const;\r\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"dflat-core-web.mjs","names":[],"sources":["../../src/index.ts"],"sourcesContent":["/*\r\n * Point d'entrée principal de @dflat-core/web.\r\n * Les librairies sont exposées par des points d'entrée secondaires :\r\n * @dflat-core/web/core, @dflat-core/web/core-model, @dflat-core/web/core-services, @dflat-core/web/core-data,\r\n * @dflat-core/web/core-ux, @dflat-core/web/system-model, @dflat-core/web/system-data,\r\n * @dflat-core/web/system-root, @dflat-core/web/system-ux\r\n * et, pour les fichiers de test seulement, @dflat-core/web/core-ux/testing.\r\n */\r\nexport const DFLAT_WEB_ENTRY_POINTS = [\r\n 'core', 'core-model', 'core-services', 'core-data', 'core-ux',\r\n 'system-model', 'system-data', 'system-root', 'system-ux'\r\n] as const;\r\n"],"mappings":"AAQA,MAAa,yBAAyB;CAClC;CAAQ;CAAc;CAAiB;CAAa;CACpD;CAAgB;CAAe;CAAe;AACxC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dflat-core/web",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.51",
|
|
4
4
|
"description": "Librairies Angular Dflat (core, core-*, system-*) et assets partagés, empaquetées en un module npm unique.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"peerDependencies": {
|
|
@@ -66,6 +66,10 @@
|
|
|
66
66
|
"types": "./types/dflat-core-web-core-ux.d.ts",
|
|
67
67
|
"default": "./fesm2022/dflat-core-web-core-ux.mjs"
|
|
68
68
|
},
|
|
69
|
+
"./core-ux/testing": {
|
|
70
|
+
"types": "./types/dflat-core-web-core-ux-testing.d.ts",
|
|
71
|
+
"default": "./fesm2022/dflat-core-web-core-ux-testing.mjs"
|
|
72
|
+
},
|
|
69
73
|
"./system-data": {
|
|
70
74
|
"types": "./types/dflat-core-web-system-data.d.ts",
|
|
71
75
|
"default": "./fesm2022/dflat-core-web-system-data.mjs"
|
|
@@ -27,6 +27,13 @@ export declare class DataService {
|
|
|
27
27
|
* vidé au redémarrage de l'API (horodatage du jeton d'accès) et au changement d'utilisateur.
|
|
28
28
|
*/
|
|
29
29
|
getCached<T>(entityKey: string, action: string): Observable<T>;
|
|
30
|
+
/**
|
|
31
|
+
* Valeur d'initialisation d'une entité calculée par le front (ex. définition de ses onglets,
|
|
32
|
+
* voir EntitySections), gardée dans le même cache que les appels de getCached et sous la même
|
|
33
|
+
* portée (clé de l'entité) : `factory` n'est appelée qu'une fois, jusqu'à ce que le cache soit
|
|
34
|
+
* vidé (clearCached, redémarrage de l'API, changement d'utilisateur).
|
|
35
|
+
*/
|
|
36
|
+
getCachedValue<T>(entityKey: string, name: string, factory: () => T): Observable<T>;
|
|
30
37
|
/** Vide le cache d'initialisation d'une entité, ou tout le cache. */
|
|
31
38
|
clearCached(entityKey?: string): void;
|
|
32
39
|
getViewFilterDescriptors(entityKey: string): Observable<FilterDescriptor[]>;
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import { Provider, Type } from "@angular/core";
|
|
2
|
+
import { ActivatedRoute, NavigationExtras, Router, Routes, UrlCreationOptions, UrlTree } from "@angular/router";
|
|
3
|
+
import { ActionDescriptor, ColumnDescriptor, EntityViewModel, EntityViewModelWithFields, FilterDescriptor, FilterViewModel, PagedList } from "@dflat-core/web/core-model";
|
|
4
|
+
import { ApplicationService, BaseComponent, EntityFacade, EntityFacadeRegistryService, EntitySectionProvider, EntitySelector } from "@dflat-core/web/core-ux";
|
|
5
|
+
import { BreadcrumbService, MenuItem, NotificationMqService } from "@dflat-core/web/core-services";
|
|
6
|
+
import { DataService } from "@dflat-core/web/core-data";
|
|
7
|
+
import { Observable } from "rxjs";
|
|
8
|
+
import { Guid } from "guid-typescript";
|
|
9
|
+
import { Title } from "@angular/platform-browser";
|
|
10
|
+
/** Valeurs attendues d'un composant dérivé de BaseComponent (voir describeBaseComponent). */
|
|
11
|
+
export interface BaseComponentExpectations {
|
|
12
|
+
/** Clé de l'entité (getEntityKey), ex. country. */
|
|
13
|
+
entityKey: string;
|
|
14
|
+
/** Lien du composant (getPath), ex. /sys/country. */
|
|
15
|
+
path: string;
|
|
16
|
+
/** Titre du composant (getTitle). */
|
|
17
|
+
title: string;
|
|
18
|
+
/** Clé de permission du composant (PermissionKey), ex. system.country. */
|
|
19
|
+
permissionKey: string;
|
|
20
|
+
/**
|
|
21
|
+
* Titres des onglets enregistrés par le composant après ngOnInit (facade.sections), dans
|
|
22
|
+
* l'ordre ; non vérifiés si absent.
|
|
23
|
+
*/
|
|
24
|
+
sections?: string[];
|
|
25
|
+
/**
|
|
26
|
+
* Le composant demande (true) ou non (false) les onglets de son entité au registre du socle
|
|
27
|
+
* (EntitySections.registerSections) après ngOnInit ; non vérifié si absent. Les onglets
|
|
28
|
+
* eux-mêmes sont vérifiés avec le module (describeGeneratedModule).
|
|
29
|
+
*/
|
|
30
|
+
requestsSections?: boolean;
|
|
31
|
+
/** Fournisseurs ajoutés au module de test (ex. PP_SERVICE). */
|
|
32
|
+
providers?: Provider[];
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Fabrique du composant à tester : appelée dans un contexte d'injection, avec les services de
|
|
36
|
+
* test (voir BaseComponentTestContext). Ex. `(app, route) => new TestCountryComponent(app, route)`.
|
|
37
|
+
*/
|
|
38
|
+
export type BaseComponentFactory<TFilter extends FilterViewModel, TData extends EntityViewModel> = (app: ApplicationService, route: ActivatedRoute) => BaseComponent<TFilter, TData>;
|
|
39
|
+
/** Fil d'Ariane publié par BreadcrumbService (setCurrent). */
|
|
40
|
+
export interface BreadcrumbData {
|
|
41
|
+
/** Description de la page. */
|
|
42
|
+
description: string;
|
|
43
|
+
/** Le fil d'Ariane est affiché. */
|
|
44
|
+
display: boolean;
|
|
45
|
+
/** En-tête de la page. */
|
|
46
|
+
header: string;
|
|
47
|
+
/** Niveaux du fil d'Ariane : icône, lien et libellé. */
|
|
48
|
+
levels: {
|
|
49
|
+
icon: string;
|
|
50
|
+
link: string[];
|
|
51
|
+
title: string;
|
|
52
|
+
}[];
|
|
53
|
+
}
|
|
54
|
+
/** Compteur des appels d'une méthode (voir countCalls). */
|
|
55
|
+
export interface CallCounter {
|
|
56
|
+
/** Nombre d'appels depuis la pose du compteur. */
|
|
57
|
+
count: number;
|
|
58
|
+
}
|
|
59
|
+
/** Éléments générés d'un module (dflat -g ts) dont describeGeneratedModule vérifie la cohérence. */
|
|
60
|
+
export interface GeneratedModuleExpectations {
|
|
61
|
+
/** Composants des entités ([Module]GeneratedComponents). */
|
|
62
|
+
components: Type<unknown>[];
|
|
63
|
+
/** Routes des composants ([Module]GeneratedRoutes). */
|
|
64
|
+
routes: Routes;
|
|
65
|
+
/** Sélecteurs d'entité ([Module]GeneratedSelectors). */
|
|
66
|
+
selectors: EntitySelector[];
|
|
67
|
+
/** Classe des clés d'entité générées (Base[Module]EntityKeys) : une propriété statique par entité. */
|
|
68
|
+
entityKeys: object;
|
|
69
|
+
/** Lien d'une entité à partir de sa clé (Base[Module]MenuItemProvider.GetLink). */
|
|
70
|
+
getLink: (entityKey: string) => string;
|
|
71
|
+
/** Éléments de menu générés des entités du menu dont la route est générée. */
|
|
72
|
+
menuItems: MenuItem[];
|
|
73
|
+
/** Service des onglets des entités ([Module]GeneratedSectionService) ; onglets non vérifiés si absent. */
|
|
74
|
+
sectionProvider?: EntitySectionProvider;
|
|
75
|
+
/** Titres attendus des onglets, par clé d'entité et dans l'ordre ; titres non vérifiés si absent. */
|
|
76
|
+
sections?: {
|
|
77
|
+
[entityKey: string]: string[];
|
|
78
|
+
};
|
|
79
|
+
/** Classe des permissions du module ([Module]Permissions) ; permissions non vérifiées si absente. */
|
|
80
|
+
permissions?: object;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Vérifications communes aux outils de test (Vitest, Jest, Jasmine) utilisées par les suites
|
|
84
|
+
* standard : seul ce sous-ensemble est appelé, pour ne dépendre d'aucun outil.
|
|
85
|
+
*/
|
|
86
|
+
export interface TestMatchers {
|
|
87
|
+
/** Égalité stricte (===). */
|
|
88
|
+
toBe(expected: unknown): void;
|
|
89
|
+
/** Égalité de structure (objets et tableaux comparés en profondeur). */
|
|
90
|
+
toEqual(expected: unknown): void;
|
|
91
|
+
/** Valeur considérée comme vraie. */
|
|
92
|
+
toBeTruthy(): void;
|
|
93
|
+
/** Valeur considérée comme fausse. */
|
|
94
|
+
toBeFalsy(): void;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Fonctions globales de l'outil de test (Vitest, Jest, Jasmine) utilisées par les suites
|
|
98
|
+
* standard, lues sur globalThis (voir getTestRunner).
|
|
99
|
+
*/
|
|
100
|
+
export interface TestRunner {
|
|
101
|
+
/** Déclare un groupe de tests. */
|
|
102
|
+
describe(name: string, body: () => void): void;
|
|
103
|
+
/** Déclare un test, synchrone ou asynchrone. */
|
|
104
|
+
it(name: string, body: () => void | Promise<void>): void;
|
|
105
|
+
/** Code exécuté avant chaque test du groupe. */
|
|
106
|
+
beforeEach(body: () => void | Promise<void>): void;
|
|
107
|
+
/** Vérifications sur une valeur. */
|
|
108
|
+
expect(actual: unknown): TestMatchers;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Doublure de DataService : aucune requête HTTP. Fournit les données d'initialisation d'une
|
|
112
|
+
* façade (colonnes, filtre vide, formulaire, actions) et enregistre les recherches et lectures
|
|
113
|
+
* de détail demandées par le composant testé.
|
|
114
|
+
*/
|
|
115
|
+
export declare class DataServiceDouble {
|
|
116
|
+
/** Recherches demandées (search), dans l'ordre. */
|
|
117
|
+
readonly searchCalls: {
|
|
118
|
+
entityKey: string;
|
|
119
|
+
filter: FilterViewModel;
|
|
120
|
+
}[];
|
|
121
|
+
/** Lectures de détail demandées (getDetails), dans l'ordre. */
|
|
122
|
+
readonly detailsCalls: {
|
|
123
|
+
entityKey: string;
|
|
124
|
+
id: number;
|
|
125
|
+
}[];
|
|
126
|
+
/** Résultat renvoyé par search. */
|
|
127
|
+
searchResult: PagedList<EntityViewModel>;
|
|
128
|
+
/** Entité renvoyée par getDetails. */
|
|
129
|
+
details: EntityViewModel;
|
|
130
|
+
/** Enregistre la recherche et renvoie searchResult. */
|
|
131
|
+
search<TData>(entityKey: string, filter: FilterViewModel): Observable<PagedList<TData>>;
|
|
132
|
+
/** Enregistre la lecture et renvoie details. */
|
|
133
|
+
getDetails<TData>(entityKey: string, id: number): Observable<TData>;
|
|
134
|
+
/** Paramètres d'URL d'un filtre : copie du filtre, sans mise en forme. */
|
|
135
|
+
getFormattedParams(params: object): object;
|
|
136
|
+
/** Colonnes de la grille : aucune. */
|
|
137
|
+
getViewColumns(): Observable<ColumnDescriptor[]>;
|
|
138
|
+
/** Critères du filtre : aucun. */
|
|
139
|
+
getViewFilterDescriptors(): Observable<FilterDescriptor[]>;
|
|
140
|
+
/** Filtre vide : première page de 25 lignes. */
|
|
141
|
+
getEmptyFilter<TFilter>(): Observable<TFilter>;
|
|
142
|
+
/** Formulaire vide, sans champ. */
|
|
143
|
+
getEntityViewModel<TData>(): Observable<EntityViewModelWithFields<TData>>;
|
|
144
|
+
/** Actions étendues : aucune. */
|
|
145
|
+
getExtendedActions(): Observable<ActionDescriptor[]>;
|
|
146
|
+
/** Valeur d'initialisation calculée par le front : calculée à chaque appel, sans cache. */
|
|
147
|
+
getCachedValue<T>(entityKey: string, name: string, factory: () => T): Observable<T>;
|
|
148
|
+
/** La doublure, vue comme le DataService qu'elle remplace. */
|
|
149
|
+
asDataService(): DataService;
|
|
150
|
+
}
|
|
151
|
+
/** Registre de façades du socle (vraies façades), qui enregistre les façades demandées. */
|
|
152
|
+
export declare class EntityFacadeRegistrySpy extends EntityFacadeRegistryService {
|
|
153
|
+
/** Façades demandées (getFacade), dans l'ordre : clé d'entité, identifiant et façade renvoyée. */
|
|
154
|
+
readonly requests: {
|
|
155
|
+
key: string;
|
|
156
|
+
id: Guid;
|
|
157
|
+
facade: EntityFacade<EntityViewModel>;
|
|
158
|
+
}[];
|
|
159
|
+
/** Enregistre la demande et renvoie la façade du registre. */
|
|
160
|
+
getFacade<TData extends EntityViewModel>(key: string, id: Guid): EntityFacade<TData>;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Doublure de Router : URL courante, construction d'URL (chemin et paramètres) et navigations
|
|
164
|
+
* enregistrées. Une navigation réussit toujours et devient l'URL courante.
|
|
165
|
+
*/
|
|
166
|
+
export declare class RouterDouble {
|
|
167
|
+
/** URL courante. */
|
|
168
|
+
url: string;
|
|
169
|
+
/** Navigations demandées (navigate), dans l'ordre. */
|
|
170
|
+
readonly navigations: {
|
|
171
|
+
commands: unknown[];
|
|
172
|
+
extras?: NavigationExtras;
|
|
173
|
+
}[];
|
|
174
|
+
constructor(url: string);
|
|
175
|
+
/** URL formée des segments `commands` et des paramètres `extras.queryParams`. */
|
|
176
|
+
createUrlTree(commands: unknown[], extras?: UrlCreationOptions): UrlTree;
|
|
177
|
+
/** Enregistre la navigation, qui devient l'URL courante. */
|
|
178
|
+
navigate(commands: unknown[], extras?: NavigationExtras): Promise<boolean>;
|
|
179
|
+
/** La doublure, vue comme le Router qu'elle remplace. */
|
|
180
|
+
asRouter(): Router;
|
|
181
|
+
/** URL d'un chemin et de ses paramètres. */
|
|
182
|
+
private static format;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Services donnés à un composant dérivé de BaseComponent pendant un test : vraies classes du
|
|
186
|
+
* socle quand elles s'instancient sans dépendance (ApplicationService, registre de façades et
|
|
187
|
+
* façades, fil d'Ariane, file de messages), doublures pour le service de données, le routeur et
|
|
188
|
+
* la route. Les services que BaseComponent n'utilise pas (authentification, fenêtres modales,
|
|
189
|
+
* alertes, mise en page...) ne sont pas fournis.
|
|
190
|
+
*/
|
|
191
|
+
export declare class BaseComponentTestContext {
|
|
192
|
+
/** Doublure du service de données. */
|
|
193
|
+
readonly dataService: DataServiceDouble;
|
|
194
|
+
/** Doublure du routeur. */
|
|
195
|
+
readonly router: RouterDouble;
|
|
196
|
+
/** Route active, sans paramètre. */
|
|
197
|
+
readonly route: ActivatedRoute;
|
|
198
|
+
/** Fil d'Ariane du socle. */
|
|
199
|
+
readonly breadcrumb: BreadcrumbService;
|
|
200
|
+
/** File de messages (notifications d'entité) du socle. */
|
|
201
|
+
readonly notifications: NotificationMqService;
|
|
202
|
+
/** Registre de façades du socle, qui enregistre les façades demandées. */
|
|
203
|
+
readonly registry: EntityFacadeRegistrySpy;
|
|
204
|
+
/** ApplicationService du socle, construit sur les services ci-dessus. */
|
|
205
|
+
readonly app: ApplicationService;
|
|
206
|
+
/**
|
|
207
|
+
* @param url URL courante du routeur.
|
|
208
|
+
* @param title Service du titre de la page (TestBed.inject(Title)), utilisé par le fil d'Ariane.
|
|
209
|
+
*/
|
|
210
|
+
constructor(url: string, title: Title);
|
|
211
|
+
/** Fil d'Ariane courant (dernière valeur publiée). */
|
|
212
|
+
get currentBreadcrumb(): BreadcrumbData;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Compte les appels de la méthode `method` de `target`, qui reste exécutée : équivalent, sans
|
|
216
|
+
* outil de test, d'un espion transparent.
|
|
217
|
+
*/
|
|
218
|
+
export declare function countCalls<T extends object, K extends keyof T>(target: T, method: K): CallCounter;
|
|
219
|
+
/**
|
|
220
|
+
* Fonctions globales de l'outil de test (describe, it, beforeEach, expect), lues sur globalThis
|
|
221
|
+
* pour ne dépendre d'aucun outil ni de ses types.
|
|
222
|
+
*/
|
|
223
|
+
export declare function getTestRunner(): TestRunner;
|
|
224
|
+
/**
|
|
225
|
+
* Suite de test standard d'un composant dérivé de BaseComponent : vérifie, sans rendre son
|
|
226
|
+
* gabarit, le contrat de BaseComponent (création, clé d'entité, lien, titre, permission, façade,
|
|
227
|
+
* ngOnInit, demande des onglets, Search / refresh, notifications, ngOnDestroy). À appeler au premier niveau d'un
|
|
228
|
+
* fichier de test :
|
|
229
|
+
* `describeBaseComponent('CountryComponent', (app, route) => new TestCountryComponent(app, route), { ... })`.
|
|
230
|
+
* La suite n'utilise que les fonctions globales de l'outil de test (describe, it, beforeEach,
|
|
231
|
+
* expect) et TestBed.
|
|
232
|
+
*
|
|
233
|
+
* @param name Nom du composant, repris dans le titre de la suite.
|
|
234
|
+
* @param factory Fabrique du composant, appelée dans un contexte d'injection avant chaque test.
|
|
235
|
+
* @param expectations Valeurs attendues du composant.
|
|
236
|
+
*/
|
|
237
|
+
export declare function describeBaseComponent<TFilter extends FilterViewModel, TData extends EntityViewModel>(name: string, factory: BaseComponentFactory<TFilter, TData>, expectations: BaseComponentExpectations): void;
|
|
238
|
+
/**
|
|
239
|
+
* Suite de test standard d'un module généré (dflat -g ts) : cohérence de ses composants, routes,
|
|
240
|
+
* sélecteurs, clés d'entité, onglets, éléments de menu et permissions. Chaque test compare à une liste
|
|
241
|
+
* vide la liste des éléments en défaut, que l'outil de test affiche en cas d'échec.
|
|
242
|
+
*
|
|
243
|
+
* @param name Nom du module (ex. System), repris dans le titre de la suite.
|
|
244
|
+
* @param module Éléments générés du module.
|
|
245
|
+
*/
|
|
246
|
+
export declare function describeGeneratedModule(name: string, module: GeneratedModuleExpectations): void;
|
|
@@ -448,6 +448,14 @@ export declare class LayoutService {
|
|
|
448
448
|
static ɵfac: i0.ɵɵFactoryDeclaration<LayoutService, never>;
|
|
449
449
|
static ɵprov: i0.ɵɵInjectableDeclaration<any>;
|
|
450
450
|
}
|
|
451
|
+
/**
|
|
452
|
+
* Dépendances racines d'ApplicationService et du registre de façades. Le jeton est déclaré dans son
|
|
453
|
+
* propre fichier, sans import d'exécution : ApplicationService et EntityFacadeRegistryService
|
|
454
|
+
* s'importent l'un l'autre, et un jeton déclaré avec ApplicationService serait lu avant son
|
|
455
|
+
* initialisation par le registre quand le package est chargé sans édition de liens Angular
|
|
456
|
+
* (tests unitaires d'une application : "Cannot access 'ROOT_DEPS' before initialization").
|
|
457
|
+
*/
|
|
458
|
+
export declare const ROOT_DEPS: InjectionToken<RootDeps>;
|
|
451
459
|
declare namespace dynamic_form_component_d_exports {
|
|
452
460
|
export { DynamicFormComponent };
|
|
453
461
|
}
|
|
@@ -1891,9 +1899,10 @@ export declare class SectionContext<P extends EntityViewModel> {
|
|
|
1891
1899
|
private defaultLayoutOverride;
|
|
1892
1900
|
registerSection<F extends FilterViewModel, T extends EntityViewModel>(name: string, template: Type<ISectionComponent<T>>, config?: ISectionConfig<T, F, P>): ISpecificSectionContext<T, F, P>;
|
|
1893
1901
|
/**
|
|
1894
|
-
* Onglet d'une entité liée (relation 1..*), décrit par une section du formulaire par défaut
|
|
1895
|
-
*
|
|
1896
|
-
*
|
|
1902
|
+
* Onglet d'une entité liée (relation 1..*), décrit par une section du formulaire par défaut,
|
|
1903
|
+
* déclaré par le service généré du module ([Module]GeneratedSectionService) et enregistré à
|
|
1904
|
+
* la demande du composant généré (Base[X]Component.registerFormSections, voir EntitySections) :
|
|
1905
|
+
* liste des enregistrements de l'entité dont le critère `filterProperty` vaut l'Id de l'enregistrement
|
|
1897
1906
|
* sélectionné. Ignoré si le composant spécifique a déjà enregistré un onglet du même titre ou
|
|
1898
1907
|
* de la même entité (clé d'entité du composant, ex. variante dérivée du composant généré).
|
|
1899
1908
|
*/
|
|
@@ -2707,7 +2716,6 @@ export interface RootDeps {
|
|
|
2707
2716
|
selection: SelectionService<EntityViewModel>;
|
|
2708
2717
|
readonly test: TestService;
|
|
2709
2718
|
}
|
|
2710
|
-
export declare const ROOT_DEPS: InjectionToken<RootDeps>;
|
|
2711
2719
|
export declare class ApplicationService {
|
|
2712
2720
|
deps: RootDeps;
|
|
2713
2721
|
MQService: NotificationMqService;
|
|
@@ -5537,6 +5545,65 @@ export declare class EntitySelectors {
|
|
|
5537
5545
|
injector?: Injector;
|
|
5538
5546
|
} | undefined;
|
|
5539
5547
|
}
|
|
5548
|
+
/**
|
|
5549
|
+
* Définition d'un onglet d'entité liée (relation 1..*) du formulaire d'une entité : liste des
|
|
5550
|
+
* enregistrements de l'entité du composant dont le critère `filterProperty` vaut l'Id de
|
|
5551
|
+
* l'enregistrement sélectionné. L'ordre des onglets est celui de la liste qui les porte.
|
|
5552
|
+
*/
|
|
5553
|
+
export interface EntitySection {
|
|
5554
|
+
/** Libellé de l'onglet. */
|
|
5555
|
+
title: string;
|
|
5556
|
+
/** Composant de recherche de l'entité listée dans l'onglet. */
|
|
5557
|
+
component: Type<ISectionComponent<any>>;
|
|
5558
|
+
/** Critère du filtre de l'entité listée qui reçoit l'Id de l'enregistrement sélectionné (clé étrangère). */
|
|
5559
|
+
filterProperty: string;
|
|
5560
|
+
}
|
|
5561
|
+
/**
|
|
5562
|
+
* Service d'un module qui déclare les onglets d'entités liées de ses entités (service généré
|
|
5563
|
+
* [Module]GeneratedSectionService, voir EntitySections).
|
|
5564
|
+
*/
|
|
5565
|
+
export interface EntitySectionProvider {
|
|
5566
|
+
/** Clés des entités du module qui ont des onglets. */
|
|
5567
|
+
getEntityKeys(): string[];
|
|
5568
|
+
/** Onglets de l'entité de clé `entityKey`, dans l'ordre d'affichage ; liste vide si elle n'en a pas. */
|
|
5569
|
+
getSections(entityKey: string): EntitySection[];
|
|
5570
|
+
}
|
|
5571
|
+
/**
|
|
5572
|
+
* Onglets d'entités liées (relation 1..*) des entités des modules de l'application. Chaque
|
|
5573
|
+
* librairie [module]-ux enregistre le service qui déclare ceux de ses entités, généré par
|
|
5574
|
+
* codegenerator (dflat -g ts) dans [module]-sections.generated.ts, dans le constructeur de son
|
|
5575
|
+
* module Angular :
|
|
5576
|
+
* `constructor(injector: Injector) { EntitySections.register(injector.get(<Module>GeneratedSectionService)); }`.
|
|
5577
|
+
* Un composant généré (Base[X]Component.registerFormSections) demande ses onglets par la clé de
|
|
5578
|
+
* son entité, sans importer ni ce service ni les composants des onglets : pas de dépendance
|
|
5579
|
+
* circulaire entre composants.
|
|
5580
|
+
*
|
|
5581
|
+
* Le service n'est interrogé qu'une fois par entité : la définition des onglets est gardée dans le
|
|
5582
|
+
* cache d'initialisation des écrans (InitCacheService, par DataService.getCachedValue), avec les
|
|
5583
|
+
* descripteurs de filtre et le filtre vide de l'entité, et vidée avec eux. L'enregistrement des
|
|
5584
|
+
* onglets sur la façade, propre à l'instance du composant, est fait à chaque initialisation.
|
|
5585
|
+
*/
|
|
5586
|
+
export declare class EntitySections {
|
|
5587
|
+
/** Nom de la définition des onglets d'une entité dans le cache d'initialisation ([clé d'entité]/FormSections). */
|
|
5588
|
+
static readonly CACHE_NAME = "FormSections";
|
|
5589
|
+
private static readonly providers;
|
|
5590
|
+
/** Enregistre le service des onglets d'un module (le dernier enregistré l'emporte pour une même clé d'entité). */
|
|
5591
|
+
static register(provider: EntitySectionProvider): void;
|
|
5592
|
+
/** Service qui déclare les onglets de l'entité de clé `entityKey` (insensible à la casse), sinon undefined. */
|
|
5593
|
+
static find(entityKey: string): EntitySectionProvider | undefined;
|
|
5594
|
+
/**
|
|
5595
|
+
* Définition d'un onglet d'entité liée : `filterProperty` est vérifié à la compilation parmi
|
|
5596
|
+
* les critères du filtre `F` de l'entité listée par `component`.
|
|
5597
|
+
*/
|
|
5598
|
+
static related<F extends FilterViewModel, T extends EntityViewModel>(title: string, component: Type<ISectionComponent<T>>, filterProperty: keyof F & string): EntitySection;
|
|
5599
|
+
/**
|
|
5600
|
+
* Ajoute à la façade `facade` les onglets de l'entité de clé `entityKey`, dans l'ordre déclaré
|
|
5601
|
+
* par le service de son module (demandé une seule fois, puis lu dans le cache d'initialisation).
|
|
5602
|
+
* Un onglet du même titre ou de la même entité déjà enregistré sur la façade n'est pas dupliqué
|
|
5603
|
+
* (voir SectionContext.registerRelatedSection). Sans service enregistré pour l'entité, rien n'est ajouté.
|
|
5604
|
+
*/
|
|
5605
|
+
static registerSections<T extends EntityViewModel>(entityKey: string, facade: EntityFacade<T>): void;
|
|
5606
|
+
}
|
|
5540
5607
|
export declare class SortableColumnComponent implements OnInit, OnDestroy {
|
|
5541
5608
|
constructor();
|
|
5542
5609
|
columnName: string;
|