@starterlib/ui 0.14.0 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@starterlib/ui",
3
- "version": "0.14.0",
3
+ "version": "0.15.0",
4
4
  "description": "Bibliotheque de composants st-* du socle frontal starter, sur CDK et Aria.",
5
5
  "license": "UNLICENSED",
6
6
  "sideEffects": false,
@@ -25,8 +25,8 @@
25
25
  "@angular/forms": "^22.2.0",
26
26
  "@angular/cdk": "^22.2.0",
27
27
  "@angular/aria": "^22.2.0",
28
- "@starterlib/tokens": "^0.14.0",
29
- "@starterlib/util": "^0.14.0",
28
+ "@starterlib/tokens": "^0.15.0",
29
+ "@starterlib/util": "^0.15.0",
30
30
  "@zxcvbn-ts/core": "^4.2.0",
31
31
  "@zxcvbn-ts/language-common": "^4.1.3",
32
32
  "@zxcvbn-ts/language-en": "^4.1.1",
@@ -93,6 +93,10 @@
93
93
  "types": "./types/starterlib-ui-indicateurs.d.ts",
94
94
  "default": "./fesm2022/starterlib-ui-indicateurs.mjs"
95
95
  },
96
+ "./journal": {
97
+ "types": "./types/starterlib-ui-journal.d.ts",
98
+ "default": "./fesm2022/starterlib-ui-journal.mjs"
99
+ },
96
100
  "./libelles-en": {
97
101
  "types": "./types/starterlib-ui-libelles-en.d.ts",
98
102
  "default": "./fesm2022/starterlib-ui-libelles-en.mjs"
@@ -0,0 +1,214 @@
1
+ import { ApiError } from "@starterlib/util";
2
+ import { OptionDeListe } from "@starterlib/ui/saisie";
3
+ import * as i0 from "@angular/core";
4
+ import { InjectionToken, Injector, Provider, Signal } from "@angular/core";
5
+ import { CatalogueDuPointDEntree, NiveauDeTitre } from "@starterlib/ui";
6
+ import { EnvoiDeFormulaire } from "@starterlib/ui/formulaires";
7
+ /** Le motif libre d'une action journalisee : dix caracteres au moins, cinq cents au plus (bornes par defaut). */
8
+ export declare const LONGUEUR_MINIMALE_DU_MOTIF = 10;
9
+ export declare const LONGUEUR_MAXIMALE_DU_MOTIF = 500;
10
+ /** L'adresse du journal filtre sur une reference : un chemin du routeur de l'application et ses parametres. */
11
+ export interface AdresseDuJournal {
12
+ readonly chemin: string;
13
+ readonly parametres: Readonly<Record<string, string>>;
14
+ }
15
+ /**
16
+ * Ce que demande une ecriture journalisee (un geste d'exploitation qui entre au journal d'audit) : ses textes deja
17
+ * traduits par l'application, son motif, son envoi. Le socle ne porte aucun metier : l'application dit ce que fait le
18
+ * geste, le serveur juge.
19
+ */
20
+ export interface DemandeDActionJournalisee {
21
+ /** Le titre du dialogue : le geste (« Retirer une exception »). */
22
+ readonly titre: string;
23
+ /** Ce que le geste fait, et ce qui suit. */
24
+ readonly consigne: string;
25
+ readonly libelleDuMotif: string;
26
+ /** L'aide du motif ; par defaut, celle du socle (dix caracteres au moins, le motif part avec l'action). */
27
+ readonly aideDuMotif?: string;
28
+ /** Le motif en liste fermee, la ou l'application l'exige ; sinon un texte libre. */
29
+ readonly motifs?: readonly OptionDeListe[];
30
+ /** Les bornes du motif libre ; par defaut 10 et 500 caracteres. */
31
+ readonly longueurMinimaleDuMotif?: number;
32
+ readonly longueurMaximaleDuMotif?: number;
33
+ readonly libelleDuBouton: string;
34
+ /** Ce qui vient d'etre fait (« Exception retiree ») ; par defaut, « Action journalisee ». */
35
+ readonly titreDeLaConfirmation?: string;
36
+ /**
37
+ * L'envoi : le motif part AVEC l'action, jamais apres ; la cle est celle de l'INTENTION, tiree une fois a
38
+ * l'ouverture du dialogue et rejouee a chaque renvoi (a poser en `CLE_D_IDEMPOTENCE`). Rend le corps de la reponse,
39
+ * ou la reference d'audit est lue (`lireLaReferenceDAudit`).
40
+ */
41
+ readonly executer: (motif: string, cle: string) => Promise<unknown>;
42
+ /**
43
+ * La lecture d'un refus d'`executer` : `versApiError` du noyau (`@starterlib/core`), que l'application passe telle
44
+ * quelle (`{ ..., versApiError }`). `ui` ne connait pas `core` : le refus se lit comme partout ailleurs, sans copie.
45
+ */
46
+ readonly versApiError: (erreur: unknown) => ApiError;
47
+ /**
48
+ * Le message d'un refus propre a ce geste, deja traduit ; `null` laisse le socle dire le refus (hors ligne, motif
49
+ * refuse, refus generiques des codes du socle backend, puis le message generique avec son code et sa trace).
50
+ */
51
+ readonly messageDuRefus?: (erreur: ApiError) => string | null;
52
+ /** Un refus ou un retrait (refuser, retirer, revoquer) : le bouton du geste en rouge avec son icone. */
53
+ readonly retrait?: boolean;
54
+ /** L'adresse du journal filtre sur la reference rendue ; sans elle, la confirmation ne montre aucun lien. */
55
+ readonly adresseDuJournal?: (reference: string) => AdresseDuJournal;
56
+ /** Ce qui precise la confirmation (« Validation unique », par exemple), deja traduit ; lu a la confirmation. */
57
+ readonly precisionDeLaConfirmation?: () => string | null;
58
+ }
59
+ /** Ce que rend le dialogue a sa fermeture apres l'action : la reference d'audit, `null` si le serveur n'en rend aucune. */
60
+ export interface ResultatDActionJournalisee {
61
+ readonly referenceDAudit: string | null;
62
+ }
63
+ /**
64
+ * La reference d'audit d'une reponse (`{ "referenceDAudit": "..." }`), si elle a la forme du contrat ; `null` sinon :
65
+ * jamais une reference devinee.
66
+ */
67
+ export declare function lireLaReferenceDAudit(corps: unknown): string | null;
68
+ /**
69
+ * Le motif refuse par la validation de forme du serveur (`PLATFORM_VALIDATION_FAILED`, violation du champ `motif`) :
70
+ * aucun code propre au motif manquant, le socle backend le dit par sa validation.
71
+ */
72
+ export declare function motifRefuse(erreur: ApiError): boolean;
73
+ /**
74
+ * Les libelles de `@starterlib/ui/journal` (reste R-407 d'Aplomb) : le catalogue par point d'entree (AD-10, D154),
75
+ * comme ceux du parcours et de la messagerie. La langue suit celle du dictionnaire du tronc.
76
+ */
77
+ export interface LibellesDuJournal {
78
+ /** L'aide du motif libre, sa longueur minimale ecrite. */
79
+ readonly aideDuMotif: (minimum: number) => string;
80
+ /** Le rappel sous le motif : le geste et son motif entrent au journal d'audit. */
81
+ readonly journal: string;
82
+ /** Quitter le dialogue sans agir. */
83
+ readonly annuler: string;
84
+ /** Fermer le dialogue apres la confirmation. */
85
+ readonly fermer: string;
86
+ /** Le titre de la confirmation, par defaut. */
87
+ readonly journalisee: string;
88
+ /** L'etiquette de la reference d'audit. */
89
+ readonly reference: string;
90
+ /** Le serveur n'a rendu aucune reference : jamais une reference devinee. */
91
+ readonly sansReference: string;
92
+ readonly voirAuJournal: string;
93
+ /** Le titre d'un refus. */
94
+ readonly titreDuRefus: string;
95
+ readonly horsLigne: string;
96
+ /** Le motif refuse par la validation de forme du serveur. */
97
+ readonly motifRequis: string;
98
+ /** Un refus sans message propre : son code et sa trace se montrent, copiables. */
99
+ readonly refusGenerique: string;
100
+ /** Les refus generiques des codes du socle backend (`PLATFORM_*`), par code. */
101
+ readonly refusDuSocle: Readonly<Record<string, string>>;
102
+ }
103
+ export declare const LIBELLES_DU_JOURNAL_FR: LibellesDuJournal;
104
+ export declare const LIBELLES_DU_JOURNAL_EN: LibellesDuJournal;
105
+ /**
106
+ * Les catalogues du journal par langue (sous-etiquette primaire : `fr`, `en`). Une application qui ajoute une langue
107
+ * au dictionnaire du tronc ajoute la sienne ici, par `fournirLibellesDuJournal({ de: ... })`.
108
+ */
109
+ export declare const ST_LIBELLES_DU_JOURNAL: InjectionToken<Readonly<Record<string, LibellesDuJournal>>>;
110
+ /** Ajoute (ou remplace) des catalogues du journal, par langue. */
111
+ export declare function fournirLibellesDuJournal(catalogues: Readonly<Record<string, LibellesDuJournal>>): Provider;
112
+ /** Le catalogue de la langue du dictionnaire du tronc. A appeler dans un contexte d'injection. */
113
+ export declare function libellesDuJournal(): Signal<LibellesDuJournal>;
114
+ /**
115
+ * Le catalogue du journal ET la langue de son repli (`catalogueDuPointDEntree`) : `lang` de ce qu'il ecrit seul (D-29).
116
+ * A appeler dans un contexte d'injection.
117
+ */
118
+ export declare function catalogueDuJournal(): Signal<CatalogueDuPointDEntree<LibellesDuJournal>>;
119
+ /**
120
+ * La confirmation d'une action journalisee (reste R-407 d'Aplomb, question P10-05-patrons ; patron monte de la coquille
121
+ * de la console) : « Action journalisee », la reference d'audit que le serveur a rendue et, quand l'application donne
122
+ * son adresse, le lien vers le journal filtre sur elle. Une reponse sans reference le dit : jamais une reference
123
+ * devinee. Ce qui precise l'issue (une validation unique, par exemple) vient de l'application, deja traduit.
124
+ *
125
+ * ```html
126
+ * <st-confirmation-journalisee [reference]="reference()" [adresse]="adresseDuJournal(reference())" />
127
+ * ```
128
+ */
129
+ export declare class StConfirmationJournalisee {
130
+ protected readonly catalogue: import("@angular/core").Signal<import("@starterlib/ui").CatalogueDuPointDEntree<import("@starterlib/ui/journal").LibellesDuJournal>>;
131
+ /** La reference d'audit que le serveur a rendue ; `null` s'il n'en a pas rendu. */
132
+ readonly reference: import("@angular/core").InputSignal<string | null>;
133
+ /** Ce qui vient d'etre fait (« Exception retiree »), deja traduit ; par defaut, « Action journalisee ». */
134
+ readonly titre: import("@angular/core").InputSignal<string | null>;
135
+ readonly niveauDuTitre: import("@angular/core").InputSignal<NiveauDeTitre>;
136
+ /** L'adresse du journal filtre sur la reference ; sans elle (ou sans reference), aucun lien. */
137
+ readonly adresse: import("@angular/core").InputSignal<AdresseDuJournal | null>;
138
+ /** Ce qui precise l'issue, deja traduit (« Validation unique »), apres la mention d'une reference absente. */
139
+ readonly precision: import("@angular/core").InputSignal<string | null>;
140
+ protected readonly lien: import("@angular/core").Signal<AdresseDuJournal | null>;
141
+ protected readonly phrase: import("@angular/core").Signal<string | null>;
142
+ static ɵfac: i0.ɵɵFactoryDeclaration<StConfirmationJournalisee, never>;
143
+ static ɵcmp: i0.ɵɵComponentDeclaration<StConfirmationJournalisee, "st-confirmation-journalisee", never, {
144
+ "reference": {
145
+ "alias": "reference";
146
+ "required": true;
147
+ "isSignal": true;
148
+ };
149
+ "titre": {
150
+ "alias": "titre";
151
+ "required": false;
152
+ "isSignal": true;
153
+ };
154
+ "niveauDuTitre": {
155
+ "alias": "niveauDuTitre";
156
+ "required": false;
157
+ "isSignal": true;
158
+ };
159
+ "adresse": {
160
+ "alias": "adresse";
161
+ "required": false;
162
+ "isSignal": true;
163
+ };
164
+ "precision": {
165
+ "alias": "precision";
166
+ "required": false;
167
+ "isSignal": true;
168
+ };
169
+ }, {}, never, never, true, never>;
170
+ }
171
+ interface Motif {
172
+ motif: string;
173
+ }
174
+ /**
175
+ * Le dialogue d'une action journalisee (reste R-407 d'Aplomb, question P10-05-patrons ; patron monte de la coquille de
176
+ * la console) : le motif (texte libre de dix caracteres au moins, ou liste fermee), envoye AVEC l'action ; la cle
177
+ * d'idempotence de l'intention (tiree une fois a l'ouverture : un double envoi ne fait qu'une action) ; le bouton
178
+ * occupe pendant l'envoi ; un refus dit depuis son code (`st-refusal` : le message propre du geste, sinon ceux du
179
+ * socle, decompte d'un `429`, code et trace copiables pour un refus inconnu) ; hors ligne, rien n'est mis en file. Apres
180
+ * l'action, sa confirmation dans le meme dialogue (`st-confirmation-journalisee`), puis « Fermer » rend la reference.
181
+ * « Annuler » quitte sans agir : rouge, comme tout abandon d'un geste.
182
+ *
183
+ * S'ouvre par `ouvrirUneActionJournalisee(injecteur, demande)` ; jamais un second dialogue par-dessus.
184
+ */
185
+ export declare class StActionJournalisee {
186
+ protected readonly demande: DemandeDActionJournalisee;
187
+ protected readonly catalogue: import("@angular/core").Signal<import("@starterlib/ui").CatalogueDuPointDEntree<import("@starterlib/ui/journal").LibellesDuJournal>>;
188
+ /** La cle de l'INTENTION : tiree une fois, rejouee a chaque renvoi (jamais une cle par requete). */
189
+ private readonly cle;
190
+ protected readonly minimum: number;
191
+ private readonly maximum;
192
+ protected readonly refus: import("@angular/core").WritableSignal<ApiError | null>;
193
+ protected readonly attente: import("@angular/core").WritableSignal<boolean>;
194
+ protected readonly resultat: import("@angular/core").WritableSignal<ResultatDActionJournalisee | null>;
195
+ protected readonly action: import("@angular/forms/signals").FieldTree<Motif, string | number, "writable">;
196
+ /** L'adresse du journal filtre sur la reference rendue, si l'application la donne. */
197
+ protected readonly adresse: import("@angular/core").Signal<import("@starterlib/ui/journal").AdresseDuJournal | null>;
198
+ /** Ce qui precise la confirmation, lu a la confirmation seulement. */
199
+ protected readonly precision: import("@angular/core").Signal<string | null>;
200
+ protected readonly envoyer: EnvoiDeFormulaire<Motif>;
201
+ /** Le message d'un refus : hors ligne, le motif refuse, le message propre du geste, ceux du socle, le generique. */
202
+ protected message(erreur: ApiError): string;
203
+ /** Vrai quand le refus a un message ; sinon `st-refusal` montre le code et la trace, copiables. */
204
+ protected connu(erreur: ApiError): boolean;
205
+ static ɵfac: i0.ɵɵFactoryDeclaration<StActionJournalisee, never>;
206
+ static ɵcmp: i0.ɵɵComponentDeclaration<StActionJournalisee, "st-action-journalisee", never, {}, {}, never, never, true, never>;
207
+ }
208
+ /**
209
+ * Ouvre le dialogue d'une action journalisee ; resout a sa fermeture : le resultat apres l'action, `undefined` si la
210
+ * personne l'a quitte sans agir. A charger au geste (import dynamique du point d'entree), hors du premier ecran.
211
+ */
212
+ export declare function ouvrirUneActionJournalisee(injecteur: Injector, demande: DemandeDActionJournalisee): Promise<ResultatDActionJournalisee | undefined>;
213
+
214
+ export {};
@@ -1159,6 +1159,17 @@ export interface LibellesParcours {
1159
1159
  readonly annuler: string;
1160
1160
  /** L'annonce d'un changement d'etat (« Demande : programmee »). */
1161
1161
  readonly etatDeLaDemande: (etat: string) => string;
1162
+ /** L'annulation motivee, dans la meme fenetre (reste R-498 d'Aplomb) : ce qu'elle fait. */
1163
+ readonly consigneDAnnulation: string;
1164
+ readonly motifDAnnulation: string;
1165
+ /** L'aide du motif d'annulation, sa longueur minimale citee. */
1166
+ readonly aideDuMotifDAnnulation: (minimum: number) => string;
1167
+ readonly motifDAnnulationRequis: string;
1168
+ /** Le motif trop court, sa longueur minimale citee. */
1169
+ readonly motifDAnnulationTropCourt: (minimum: number) => string;
1170
+ readonly confirmerLAnnulation: string;
1171
+ /** Quitter l'annulation sans annuler : « Annuler », comme tout abandon d'un geste. */
1172
+ readonly abandonnerLAnnulation: string;
1162
1173
  }
1163
1174
  export declare const LIBELLES_PARCOURS_FR: LibellesParcours;
1164
1175
  export declare const LIBELLES_PARCOURS_EN: LibellesParcours;
@@ -1210,7 +1221,9 @@ export declare function catalogueDuParcours(): Signal<CatalogueDuPointDEntree<Li
1210
1221
  * « Soumettre la demande » une fois l'effet montre ; `envoyerAvec` fait l'appel selon l'etat. Le
1211
1222
  * double clic est avale (`chargement`), la cle d'idempotence posee par l'intercepteur du socle.
1212
1223
  * - Apres la previsualisation, la saisie se fige (« Modifier la demande » la rouvre : `modification`)
1213
- * ; envoyee, elle ne change plus, et « Annuler la demande » reste (`annulation`).
1224
+ * ; envoyee, elle ne change plus, et « Annuler la demande » reste (`annulation`). Avec `annulationMotivee`, le
1225
+ * motif de l'annulation s'ecrit sous la demande, dans la meme fenetre, jamais dans un dialogue par-dessus (reste
1226
+ * R-498 d'Aplomb) ; `annulation` le rend, `annulationEnCours` et `refusDAnnulation` disent la suite.
1214
1227
  * - Un changement d'etat s'annonce ; un refus prend le focus (`st-refusal`).
1215
1228
  */
1216
1229
  export declare class StChangeRequest {
@@ -1230,15 +1243,45 @@ export declare class StChangeRequest {
1230
1243
  readonly plage: import("@angular/core").InputSignal<PlageDeDemande | null>;
1231
1244
  /** Le refus du serveur, montre a l'etat `refuse`. */
1232
1245
  readonly refus: import("@angular/core").InputSignal<RefusDeDemande | null>;
1246
+ /**
1247
+ * L'annulation demande son motif DANS la meme fenetre (reste R-498 d'Aplomb : jamais deux fenetres l'une sur
1248
+ * l'autre) : « Annuler la demande » ouvre le motif sous la demande, puis « Confirmer l'annulation » l'emet. Faux, le
1249
+ * bouton emet aussitot, sans motif.
1250
+ */
1251
+ readonly annulationMotivee: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
1252
+ /** La longueur minimale du motif d'annulation : dix caracteres par defaut. */
1253
+ readonly longueurMinimaleDuMotifDAnnulation: import("@angular/core").InputSignalWithTransform<number, unknown>;
1254
+ /** L'annulation part : la confirmation est occupee, le motif fige (un double clic est avale). */
1255
+ readonly annulationEnCours: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
1256
+ /** Le refus de l'annulation, deja traduit par l'application : dit dans l'etape, qui reste ouverte. */
1257
+ readonly refusDAnnulation: import("@angular/core").InputSignal<string | null>;
1233
1258
  /** « Modifier la demande » : apres une previsualisation ou un refus, la saisie se rouvre. */
1234
1259
  readonly modification: import("@angular/core").OutputEmitterRef<void>;
1235
- /** « Annuler la demande » : une demande envoyee, encore en attente ou programmee. */
1236
- readonly annulation: import("@angular/core").OutputEmitterRef<void>;
1260
+ /**
1261
+ * « Annuler la demande » : une demande envoyee, encore en attente ou programmee. Rend le motif quand l'annulation est
1262
+ * motivee (`annulationMotivee`), sinon une chaine vide.
1263
+ */
1264
+ readonly annulation: import("@angular/core").OutputEmitterRef<string>;
1237
1265
  protected readonly identifiants: {
1238
1266
  readonly titre: `${string}-titre`;
1239
1267
  readonly gel: `${string}-gel`;
1240
1268
  readonly previsualisation: `${string}-previsualisation`;
1269
+ readonly annulation: `${string}-annulation`;
1241
1270
  };
1271
+ private readonly injecteur;
1272
+ private readonly boutonDAnnulation;
1273
+ private readonly champDuMotif;
1274
+ /** L'etape du motif d'annulation, ouverte tant que la demande reste envoyee. */
1275
+ private readonly etapeDAnnulation;
1276
+ protected readonly annulationOuverte: import("@angular/core").Signal<boolean>;
1277
+ protected readonly motifDAnnulation: import("@angular/core").WritableSignal<string>;
1278
+ /** Une confirmation a ete tentee : les erreurs du motif se montrent des lors. */
1279
+ protected readonly tentative: import("@angular/core").WritableSignal<boolean>;
1280
+ /** Le motif d'annulation tel que le juge le composant : obligatoire, et sa longueur minimale. */
1281
+ protected readonly erreursDuMotif: import("@angular/core").Signal<{
1282
+ kind: string;
1283
+ message: string;
1284
+ }[]>;
1242
1285
  protected readonly pastille: import("@angular/core").Signal<{
1243
1286
  readonly ton: TonDeStatut;
1244
1287
  readonly icone: NomDIcone;
@@ -1254,6 +1297,12 @@ export declare class StChangeRequest {
1254
1297
  protected readonly enCours: import("@angular/core").Signal<boolean>;
1255
1298
  /** Le recapitulatif sous le titre : un niveau de plus, 4 au plus. */
1256
1299
  protected readonly niveauDuRecapitulatif: import("@angular/core").Signal<3 | 4>;
1300
+ /** « Annuler la demande » : sans motif, l'annulation part ; motivee, son motif s'ecrit sous la demande. */
1301
+ protected demanderLAnnulation(): void;
1302
+ /** « Confirmer l'annulation » : le motif valide part ; sinon le champ dit pourquoi et reprend le focus. */
1303
+ protected confirmerLAnnulation(): void;
1304
+ /** « Annuler » : l'annulation est abandonnee, rien ne part ; le focus revient au bouton qui l'avait ouverte. */
1305
+ protected abandonnerLAnnulation(): void;
1257
1306
  constructor();
1258
1307
  static ɵfac: i0.ɵɵFactoryDeclaration<StChangeRequest, never>;
1259
1308
  static ɵcmp: i0.ɵɵComponentDeclaration<StChangeRequest, "st-change-request", never, {
@@ -1287,6 +1336,26 @@ export declare class StChangeRequest {
1287
1336
  "required": false;
1288
1337
  "isSignal": true;
1289
1338
  };
1339
+ "annulationMotivee": {
1340
+ "alias": "annulationMotivee";
1341
+ "required": false;
1342
+ "isSignal": true;
1343
+ };
1344
+ "longueurMinimaleDuMotifDAnnulation": {
1345
+ "alias": "longueurMinimaleDuMotifDAnnulation";
1346
+ "required": false;
1347
+ "isSignal": true;
1348
+ };
1349
+ "annulationEnCours": {
1350
+ "alias": "annulationEnCours";
1351
+ "required": false;
1352
+ "isSignal": true;
1353
+ };
1354
+ "refusDAnnulation": {
1355
+ "alias": "refusDAnnulation";
1356
+ "required": false;
1357
+ "isSignal": true;
1358
+ };
1290
1359
  }, {
1291
1360
  "modification": "modification";
1292
1361
  "annulation": "annulation";