@zeitune-sasu/risk-form 0.0.0-stage → 0.1.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.
@@ -0,0 +1,266 @@
1
+ import { SafeHtml } from '@angular/platform-browser';
2
+ import * as i0 from '@angular/core';
3
+ import { TemplateRef, EventEmitter } from '@angular/core';
4
+
5
+ /** Le nom stable d'une icône du modèle : lui-même s'il existe, son équivalent s'il est ancien, `document` sinon ; null s'il est vide. */
6
+ declare function resolveRiskIcon(name: string | null | undefined): string | null;
7
+ /** Le SVG complet d'une icône, à la taille du texte. */
8
+ declare function riskIconSvg(name: string | null | undefined): string;
9
+ /** Un pictogramme embarqué : aucun jeu d'icônes à charger, il suit la couleur et la taille du texte. */
10
+ declare class RfIconComponent {
11
+ private readonly sanitizer;
12
+ html: SafeHtml;
13
+ set name(value: string | null | undefined);
14
+ static ɵfac: i0.ɵɵFactoryDeclaration<RfIconComponent, never>;
15
+ static ɵcmp: i0.ɵɵComponentDeclaration<RfIconComponent, "rf-icon", never, { "name": { "alias": "name"; "required": false; }; }, {}, never, never, true, never>;
16
+ }
17
+
18
+ /** Nom stable -> contenu SVG (viewBox 24, trait 2, arrondi). */
19
+ declare const ICON_SVG: Readonly<Record<string, string>>;
20
+ /** Les pictogrammes proposés dans l'éditeur, regroupés comme dans le catalogue. */
21
+ declare const ICON_CATALOG: ReadonlyArray<{
22
+ name: string;
23
+ label: string;
24
+ keywords: string;
25
+ }>;
26
+
27
+ /** Ce que le rendu sait d'un champ : tout modèle de risque, du front métier comme de l'admin, y répond. */
28
+ interface RfFieldLike {
29
+ code: string;
30
+ label: string;
31
+ valueType: string;
32
+ width?: number | null;
33
+ identifier?: boolean;
34
+ required?: boolean;
35
+ computed?: boolean;
36
+ /** La clé de transmission du champ (ancien nom) ; à défaut, son code. */
37
+ /** Rempli par le système : jamais montré dans le formulaire. */
38
+ internal?: boolean;
39
+ options?: ReadonlyArray<{
40
+ value: string;
41
+ label: string;
42
+ }> | null;
43
+ presentation?: {
44
+ style?: string | null;
45
+ icon?: string | null;
46
+ placeholder?: string | null;
47
+ trueLabel?: string | null;
48
+ falseLabel?: string | null;
49
+ } | null;
50
+ }
51
+ interface RfSectionLike {
52
+ code: string;
53
+ title: string;
54
+ position: number;
55
+ columns?: number | null;
56
+ icon?: string | null;
57
+ }
58
+ /** Un bloc du formulaire : le titre de sa section (aucun pour la section par défaut, en tête) et ses champs. */
59
+ interface RfGroup<F = RfFieldLike> {
60
+ code: string | null;
61
+ title: string | null;
62
+ /** Nom stable de l'icône, déjà résolu. */
63
+ icon: string | null;
64
+ columns: number;
65
+ /** Les oui / non en deux boutons, dans l'en-tête de la section. */
66
+ toggles: F[];
67
+ /** Les champs de la grille. */
68
+ fields: F[];
69
+ /** Les oui / non en tuiles : une rangée sous la grille. */
70
+ options: F[];
71
+ }
72
+ declare const DEFAULT_COLUMNS = 4;
73
+ declare const MAX_COLUMNS = 12;
74
+ /** Les colonnes d'une section : celles qu'elle déclare (1 à 12), 4 sinon. */
75
+ declare function sectionColumns(section: Pick<RfSectionLike, 'columns'> | null | undefined): number;
76
+ /**
77
+ * Le nombre de colonnes qu'occupe un champ : sa largeur, sinon un identifiant prend 4, un texte ou une liste 2, le reste 1.
78
+ * Un champ ne dépasse jamais la grille de sa section.
79
+ */
80
+ declare function fieldSpan(field: Pick<RfFieldLike, 'width' | 'valueType' | 'identifier'>, columns?: number): number;
81
+ /** La part d'une rangée de 2 colonnes (écran moyen) : un champ pleine largeur prend la rangée, les autres une colonne. */
82
+ declare function midSpan(span: number, columns: number): number;
83
+ /**
84
+ * Range les champs (déjà triés et filtrés) par section : la section par défaut en tête, puis les sections dans l'ordre du
85
+ * modèle. `keepEmpty` garde les sections sans champ (l'éditeur les montre pour qu'on y dépose des champs).
86
+ */
87
+ declare function buildGroups<F extends RfFieldLike>(fields: F[], sections: ReadonlyArray<RfSectionLike> | null | undefined, sectionOf: (field: F) => string | null | undefined, keepEmpty?: boolean): RfGroup<F>[];
88
+ /** Un choix de largeur : une part de la ligne, et le nombre de colonnes qu'elle prend dans la grille de la section. */
89
+ interface WidthChoice {
90
+ span: number;
91
+ label: string;
92
+ }
93
+ /** Le libellé d'une largeur : une fraction usuelle, sinon « n/m ». */
94
+ declare function widthLabel(span: number, columns: number): string;
95
+ /**
96
+ * Les largeurs offertes pour une grille de `columns` colonnes : les fractions qui tombent juste (¼ ½ ¾ pleine pour 4,
97
+ * ⅓ ½ ⅔ pleine pour 6 ou 12…) ; une section de 3 colonnes ou moins offre chaque colonne. `current` s'ajoute s'il n'y est pas.
98
+ */
99
+ declare function widthChoices(columns: number, current?: number | null): WidthChoice[];
100
+ /** Une largeur gardée dans la même part de la ligne quand la section change de nombre de colonnes (2 sur 4 → 3 sur 6). */
101
+ declare function rescaleSpan(span: number, from: number, to: number): number;
102
+ /**
103
+ * Garde les objets d'avant quand rien n'a changé : un formulaire recalcule ses sections à chaque vérification, et un
104
+ * composant qui reçoit chaque fois de nouveaux objets se redessine pour rien (et Angular s'en plaint en développement).
105
+ */
106
+ declare function stableGroups<F>(previous: RfGroup<F>[] | null | undefined, next: RfGroup<F>[]): RfGroup<F>[];
107
+ /** Un champ absent du vrai formulaire : calculé, ou interne (rempli par le système). L'éditeur le montre, l'essai non. */
108
+ declare function isHiddenInForm(field: Pick<RfFieldLike, 'computed' | 'internal'>): boolean;
109
+
110
+ /** Le contexte d'un champ : sa part de la grille de la section, et si c'est un champ de la grille ou une tuile d'option. */
111
+ interface RfFieldContext<F = RfFieldLike> {
112
+ $implicit: F;
113
+ group: RfGroup<F>;
114
+ span: number;
115
+ mid: number;
116
+ kind: 'field' | 'option';
117
+ }
118
+ /** Le gabarit d'un champ : `<ng-template rfField let-field let-span="span" let-mid="mid">`. */
119
+ declare class RfFieldTemplateDirective {
120
+ readonly template: TemplateRef<RfFieldContext<any>>;
121
+ constructor(template: TemplateRef<RfFieldContext<any>>);
122
+ static ɵfac: i0.ɵɵFactoryDeclaration<RfFieldTemplateDirective, never>;
123
+ static ɵdir: i0.ɵɵDirectiveDeclaration<RfFieldTemplateDirective, "ng-template[rfField]", never, {}, {}, never, never, true, never>;
124
+ }
125
+ /** Ce qui s'ajoute à droite du titre (bascules, modes de saisie…). */
126
+ declare class RfHeaderTemplateDirective {
127
+ readonly template: TemplateRef<{
128
+ $implicit: RfGroup<any>;
129
+ }>;
130
+ constructor(template: TemplateRef<{
131
+ $implicit: RfGroup<any>;
132
+ }>);
133
+ static ɵfac: i0.ɵɵFactoryDeclaration<RfHeaderTemplateDirective, never>;
134
+ static ɵdir: i0.ɵɵDirectiveDeclaration<RfHeaderTemplateDirective, "ng-template[rfHeader]", never, {}, {}, never, never, true, never>;
135
+ }
136
+ /** Ce qui suit la grille, avant les options (une alerte, par exemple). */
137
+ declare class RfAfterTemplateDirective {
138
+ readonly template: TemplateRef<{
139
+ $implicit: RfGroup<any>;
140
+ }>;
141
+ constructor(template: TemplateRef<{
142
+ $implicit: RfGroup<any>;
143
+ }>);
144
+ static ɵfac: i0.ɵɵFactoryDeclaration<RfAfterTemplateDirective, never>;
145
+ static ɵdir: i0.ɵɵDirectiveDeclaration<RfAfterTemplateDirective, "ng-template[rfAfter]", never, {}, {}, never, never, true, never>;
146
+ }
147
+ /** Ce qui paraît quand la section n'a aucun champ (l'éditeur y invite à déposer). */
148
+ declare class RfEmptyTemplateDirective {
149
+ readonly template: TemplateRef<{
150
+ $implicit: RfGroup<any>;
151
+ }>;
152
+ constructor(template: TemplateRef<{
153
+ $implicit: RfGroup<any>;
154
+ }>);
155
+ static ɵfac: i0.ɵɵFactoryDeclaration<RfEmptyTemplateDirective, never>;
156
+ static ɵdir: i0.ɵɵDirectiveDeclaration<RfEmptyTemplateDirective, "ng-template[rfEmpty]", never, {}, {}, never, never, true, never>;
157
+ }
158
+ /**
159
+ * Une section du formulaire d'un risque : une carte, son icône et son titre, puis la grille de ses champs. C'est le seul
160
+ * rendu de la structure : le vrai formulaire (front métier) et l'éditeur (admin) l'utilisent tous les deux, avec chacun
161
+ * son propre contenu de champ.
162
+ */
163
+ declare class RfSectionComponent {
164
+ group: RfGroup<any>;
165
+ /** Montre toujours la grille déclarée, quelle que soit la largeur de la carte (l'éditeur). */
166
+ forceGrid: boolean;
167
+ fieldTpl?: RfFieldTemplateDirective;
168
+ headerTpl?: RfHeaderTemplateDirective;
169
+ afterTpl?: RfAfterTemplateDirective;
170
+ emptyTpl?: RfEmptyTemplateDirective;
171
+ private readonly contexts;
172
+ /** Un champ avec sa part de grille. Le même objet revient tant que rien ne change : le gabarit ne se redessine pas pour rien. */
173
+ context(field: RfFieldLike, kind: 'field' | 'option'): RfFieldContext<any>;
174
+ /** Remplace la largeur lue sur le champ (la largeur d'une autre place, selon une condition). */
175
+ spanSource?: (field: any) => Pick<RfFieldLike, 'width' | 'valueType' | 'identifier'>;
176
+ static ɵfac: i0.ɵɵFactoryDeclaration<RfSectionComponent, never>;
177
+ static ɵcmp: i0.ɵɵComponentDeclaration<RfSectionComponent, "rf-section", never, { "group": { "alias": "group"; "required": true; }; "forceGrid": { "alias": "forceGrid"; "required": false; }; "spanSource": { "alias": "spanSource"; "required": false; }; }, {}, ["fieldTpl", "headerTpl", "afterTpl", "emptyTpl"], never, true, never>;
178
+ }
179
+
180
+ /** Le texte que montre un champ vide : ses bornes, ses premiers choix, ou son format. */
181
+ declare function fieldHint(field: RfFieldLike & {
182
+ min?: string | null;
183
+ max?: string | null;
184
+ }): string;
185
+ /**
186
+ * Un champ du formulaire d'un risque, dessiné comme dans le vrai formulaire : l'étiquette au-dessus, un contrôle de la
187
+ * hauteur commune, l'icône à gauche. Il sert à l'éditeur (contrôles inertes) et à son essai (contrôles actifs).
188
+ */
189
+ declare class RfFieldPreviewComponent {
190
+ field: RfFieldLike & {
191
+ min?: string | null;
192
+ max?: string | null;
193
+ };
194
+ /** Obligatoire maintenant (le champ le dit, ou une condition). */
195
+ required: boolean;
196
+ /** Contrôles actifs (l'essai) ; sinon inertes. */
197
+ interactive: boolean;
198
+ invalid: boolean;
199
+ /** Non modifiable (rempli par une fiche, calculé, en lecture seule, verrouillé) : un seul aspect, quelle que soit la cause. */
200
+ locked: boolean;
201
+ value: unknown;
202
+ valueChange: EventEmitter<unknown>;
203
+ get style(): string | null | undefined;
204
+ get iconName(): string | null;
205
+ get placeholder(): string | null;
206
+ get hint(): string;
207
+ static ɵfac: i0.ɵɵFactoryDeclaration<RfFieldPreviewComponent, never>;
208
+ static ɵcmp: i0.ɵɵComponentDeclaration<RfFieldPreviewComponent, "rf-field-preview", never, { "field": { "alias": "field"; "required": true; }; "required": { "alias": "required"; "required": false; }; "interactive": { "alias": "interactive"; "required": false; }; "invalid": { "alias": "invalid"; "required": false; }; "locked": { "alias": "locked"; "required": false; }; "value": { "alias": "value"; "required": false; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
209
+ }
210
+
211
+ /** Un oui / non en deux boutons, tel qu'il paraît dans l'en-tête d'une section. */
212
+ declare class RfToggleComponent {
213
+ value: boolean;
214
+ yesLabel: string | null | undefined;
215
+ noLabel: string | null | undefined;
216
+ yesIcon: string;
217
+ noIcon: string;
218
+ disabled: boolean;
219
+ valueChange: EventEmitter<boolean>;
220
+ static ɵfac: i0.ɵɵFactoryDeclaration<RfToggleComponent, never>;
221
+ static ɵcmp: i0.ɵɵComponentDeclaration<RfToggleComponent, "rf-toggle", never, { "value": { "alias": "value"; "required": false; }; "yesLabel": { "alias": "yesLabel"; "required": false; }; "noLabel": { "alias": "noLabel"; "required": false; }; "yesIcon": { "alias": "yesIcon"; "required": false; }; "noIcon": { "alias": "noIcon"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
222
+ }
223
+
224
+ /**
225
+ * Le conteneur du formulaire d'un risque : les sections s'y empilent, avec les mesures communes des contrôles
226
+ * (`--vehicle-control-*`). `themed` pose des valeurs par défaut pour les jetons de couleur, quand l'hôte n'a pas
227
+ * le thème du front métier (l'admin).
228
+ */
229
+ declare class RfFormComponent {
230
+ themed: boolean;
231
+ static ɵfac: i0.ɵɵFactoryDeclaration<RfFormComponent, never>;
232
+ static ɵcmp: i0.ɵɵComponentDeclaration<RfFormComponent, "rf-form", never, { "themed": { "alias": "themed"; "required": false; }; }, {}, never, ["*"], true, never>;
233
+ }
234
+
235
+ /** Une suggestion : sa clé (ce qui se pose dans le champ) et ses lignes d'affichage (la première est le titre). */
236
+ interface RiskSuggestion {
237
+ key: string;
238
+ lines: string[];
239
+ }
240
+ /**
241
+ * La liste de suggestions d'un champ à recherche dans un registre. Une seule source de vérité visuelle : les classes
242
+ * `.rfv-suggest*` de `risk-form-visual-rules.scss` (aucune dépendance à Tailwind ni à spartan). Le champ garde le focus ;
243
+ * la navigation au clavier passe par {@link move} et {@link pickActive}, appelées par le champ.
244
+ */
245
+ declare class RiskSuggestionsComponent {
246
+ private _items;
247
+ set items(value: RiskSuggestion[]);
248
+ get items(): RiskSuggestion[];
249
+ busy: boolean;
250
+ picked: EventEmitter<RiskSuggestion>;
251
+ private entries;
252
+ /** L'entrée active (clavier ou survol) ; -1 : aucune. */
253
+ active: number;
254
+ /** Descend (+1) ou monte (-1) d'une entrée, en boucle, et la garde visible. */
255
+ move(delta: 1 | -1): void;
256
+ /** Choisit l'entrée active ; faux s'il n'y en a pas (le champ fait alors sa recherche exacte). */
257
+ pickActive(): boolean;
258
+ static ɵfac: i0.ɵɵFactoryDeclaration<RiskSuggestionsComponent, never>;
259
+ static ɵcmp: i0.ɵɵComponentDeclaration<RiskSuggestionsComponent, "app-risk-suggestions", never, { "items": { "alias": "items"; "required": false; }; "busy": { "alias": "busy"; "required": false; }; }, { "picked": "picked"; }, never, never, true, never>;
260
+ }
261
+
262
+ /** Tout ce qu'un composant (ou un module) importe pour dessiner le formulaire d'un risque. */
263
+ declare const RISK_FORM_IMPORTS: readonly [typeof RfFormComponent, typeof RfSectionComponent, typeof RfFieldTemplateDirective, typeof RfHeaderTemplateDirective, typeof RfAfterTemplateDirective, typeof RfEmptyTemplateDirective, typeof RfFieldPreviewComponent, typeof RfToggleComponent, typeof RfIconComponent, typeof RiskSuggestionsComponent];
264
+
265
+ export { DEFAULT_COLUMNS, ICON_CATALOG, ICON_SVG, MAX_COLUMNS, RISK_FORM_IMPORTS, RfAfterTemplateDirective, RfEmptyTemplateDirective, RfFieldPreviewComponent, RfFieldTemplateDirective, RfFormComponent, RfHeaderTemplateDirective, RfIconComponent, RfSectionComponent, RfToggleComponent, RiskSuggestionsComponent, buildGroups, fieldHint, fieldSpan, isHiddenInForm, midSpan, rescaleSpan, resolveRiskIcon, riskIconSvg, sectionColumns, stableGroups, widthChoices, widthLabel };
266
+ export type { RfFieldContext, RfFieldLike, RfGroup, RfSectionLike, RiskSuggestion, WidthChoice };