@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.
@@ -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":"AAOA,MAAa,yBAAyB;CAClC;CAAQ;CAAc;CAAiB;CAAa;CACpD;CAAgB;CAAe;CAAe;AACxC"}
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.49",
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 et
1895
- * enregistré par le composant généré (Base[X]Component.registerFormSections) : liste des
1896
- * enregistrements de l'entité dont le critère `filterProperty` vaut l'Id de l'enregistrement
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;