@esfaenza/flow-builder 20.3.15 → 20.3.17

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/index.d.ts CHANGED
@@ -2,7 +2,7 @@ import * as _angular_core from '@angular/core';
2
2
  import { InjectionToken, Signal, AfterViewChecked } from '@angular/core';
3
3
  import * as _esfaenza_flow_builder from '@esfaenza/flow-builder';
4
4
  import { EFMarkerType, EFConnectableSide } from '@foblex/flow';
5
- import { CdkDragDrop } from '@angular/cdk/drag-drop';
5
+ import { CdkDragMove, CdkDragEnd } from '@angular/cdk/drag-drop';
6
6
 
7
7
  /**
8
8
  * Modello del documento Flow — FRONTEND.md §3, §4, §5.
@@ -132,7 +132,11 @@ interface FlowFormula {
132
132
  description?: string;
133
133
  dataType?: FlowDataType;
134
134
  scale?: number;
135
- /** Passata verbatim al motore di regole: il backend non la valida (§4.6). */
135
+ /**
136
+ * Passata verbatim al motore di regole: il backend non la interpreta, ma la fa **verificare**
137
+ * al motore — `POST /flows/validate-formula` mentre si digita, e la stessa cosa durante la
138
+ * validazione del documento (§4.6, §6.3).
139
+ */
136
140
  expression?: string;
137
141
  }
138
142
  interface FlowTextTemplate {
@@ -876,11 +880,27 @@ interface FlowStructureDescription {
876
880
  */
877
881
  members?: FlowStructureMember[];
878
882
  }
883
+ /**
884
+ * In quale dei due ruoli un artefatto del frontend e' utilizzabile (§5.1, §5.2, §6.4).
885
+ *
886
+ * `Form` e' una **schermata intera** (`formName` di uno Screen), `Component` un **componente**
887
+ * montabile dentro uno screen dinamico (`extensionName` di un `ComponentInstance`). `Any` — che
888
+ * e' anche cio' che significa il campo assente — dice «va bene in entrambi i posti»: un catalogo
889
+ * che il ruolo non lo dichiara non deve diventare un catalogo che vieta tutto.
890
+ */
891
+ type FlowFormKind = 'Form' | 'Component' | 'Any' | string;
879
892
  /** Voce di catalogo per action, script, form, eventi, tipi di enum, classi. */
880
893
  interface FlowCatalogEntry {
881
894
  name: string;
882
895
  label?: string | null;
883
896
  description?: string | null;
897
+ /**
898
+ * Solo per il catalogo dei form. Assente = `Any`: proponibile sia come schermata sia come
899
+ * componente. Una voce usata nel ruolo sbagliato e' `FORM_KIND_MISMATCH`, che e' un errore
900
+ * **diverso** da «il nome non esiste» — il nome esiste, e dirlo sconosciuto manderebbe a
901
+ * cercare un artefatto che c'e' (§5.1, §7).
902
+ */
903
+ formKind?: FlowFormKind | null;
884
904
  }
885
905
  /**
886
906
  * Parametro dichiarato da un'action, uno script o un form.
@@ -954,6 +974,50 @@ interface FlowValidationResult {
954
974
  warningCount: number;
955
975
  isValid: boolean;
956
976
  }
977
+ /**
978
+ * Dove comparira' l'espressione. Non e' cosmesi: e' cio' che permette al motore di dire
979
+ * «qui serve un booleano» invece di accettare un'espressione che poi fallira' a runtime (§6.3).
980
+ */
981
+ type FlowFormulaUsage = 'Resource' | 'Condition' | 'ValidationRule' | 'Value' | string;
982
+ /**
983
+ * L'unica primitiva della §6.3 che **avvolge** il documento invece di prenderlo nudo: oltre al
984
+ * flow deve portare l'espressione e cosa ci si aspetta che produca (§6.4, ultimo capoverso).
985
+ * Il documento va mandato **in lavorazione**: una formula cita le variabili appena aggiunte, e
986
+ * verificarla contro la versione salvata la direbbe sbagliata.
987
+ */
988
+ interface FlowFormulaValidationRequest {
989
+ flow: FlowDefinition;
990
+ expression: string;
991
+ /** `Boolean` per una condizione o una validation rule, il tipo dichiarato per una risorsa. */
992
+ expectedDataType?: FlowDataType;
993
+ usage?: FlowFormulaUsage;
994
+ /** Solo dove il tipo atteso e' `Number` o `Integer` (§4.6). */
995
+ scale?: number;
996
+ }
997
+ /**
998
+ * Come {@link FlowValidationIssue}, piu' la **posizione del tratto sbagliato** dentro
999
+ * l'espressione: e' il motivo per cui questa primitiva esiste accanto a `POST /flows/validate`.
1000
+ * `code` resta del motore: l'elenco della §7 non lo comprende, quindi si mostra e non si
1001
+ * interpreta.
1002
+ */
1003
+ interface FlowFormulaIssue extends FlowValidationIssue {
1004
+ /** Indice del primo carattere, 0-based. Puo' mancare: non ogni rilievo ha una posizione. */
1005
+ position?: number | null;
1006
+ length?: number | null;
1007
+ }
1008
+ interface FlowFormulaValidationResult {
1009
+ issues: FlowFormulaIssue[];
1010
+ /** Il tipo che l'espressione produce, quando il motore sa dirlo. Puo' mancare. */
1011
+ resultDataType?: FlowDataType | null;
1012
+ isCollection?: boolean;
1013
+ /**
1014
+ * `false` significa «nessun motore di validazione configurato»: nessun rilievo, ma nemmeno
1015
+ * una conferma. **Non e' una promozione** — una spunta verde su un'espressione mai
1016
+ * controllata e' peggio di nessuna spunta (§6.3).
1017
+ */
1018
+ isVerified: boolean;
1019
+ isValid: boolean;
1020
+ }
957
1021
  interface FlowCreateRequest {
958
1022
  definition: FlowDefinition;
959
1023
  flowName?: string;
@@ -1305,6 +1369,21 @@ declare abstract class FlowBuilderApi {
1305
1369
  abstract validateDefinition(definition: FlowDefinition): Promise<FlowValidationResult>;
1306
1370
  /** `GET /flows/{name}/versions/{v}/validate` — valida una versione già salvata. */
1307
1371
  validateVersion(flowName: string, version: number): Promise<FlowValidationResult>;
1372
+ /**
1373
+ * `POST /flows/validate-formula` — verifica **una sola** espressione mentre l'utente la
1374
+ * scrive (§6.3). È l'editor di formule, non il pannello dei problemi: i rilievi portano la
1375
+ * `position` del tratto sbagliato, che la validazione dell'intero documento non ha.
1376
+ *
1377
+ * Unica primitiva di analisi con un involucro: il documento sta sotto `flow` perche' il body
1378
+ * deve portare anche l'espressione e il tipo atteso (§6.4).
1379
+ *
1380
+ * Opzionale come tutte le primitive che dipendono da un servizio dell'host: senza motore di
1381
+ * validazione delle formule l'editor deve restare usabile. Ci sono **due** modi in cui manca,
1382
+ * e sono diversi — il rifiuto `MissingService` (la primitiva non c'e') e la risposta con
1383
+ * `isVerified: false` (la primitiva c'e', il motore no): in entrambi i casi l'espressione non
1384
+ * si accompagna a una conferma, mai a una spunta verde.
1385
+ */
1386
+ validateFormula(request: FlowFormulaValidationRequest): Promise<FlowFormulaValidationResult>;
1308
1387
  /**
1309
1388
  * `GET /flows/dictionaries?processType=` — le tendine in una risposta.
1310
1389
  *
@@ -1361,8 +1440,18 @@ declare abstract class FlowBuilderApi {
1361
1440
  abstract listScripts(): Promise<FlowCatalogEntry[]>;
1362
1441
  /** `GET /catalog/scripts/{name}/parameters` */
1363
1442
  abstract listScriptParameters(scriptName: string): Promise<FlowCatalogParameter[]>;
1364
- /** `GET /catalog/forms` — i form realizzati a mano nel frontend applicativo (§5.1). */
1365
- abstract listForms(): Promise<FlowCatalogEntry[]>;
1443
+ /**
1444
+ * `GET /catalog/forms?kind=` — gli artefatti realizzati a mano nel frontend applicativo (§5.1,
1445
+ * §5.2). Un solo catalogo per due ruoli: le **schermate intere** che uno Screen mostra
1446
+ * (`formName`) e i **componenti** che uno screen dinamico monta (`extensionName`) sono la
1447
+ * stessa domanda al frontend — cosa sa rendere, e con quali parametri.
1448
+ *
1449
+ * `kind` filtra: `Form`, `Component`, o assente per tutto. Chiederlo non e' un dettaglio —
1450
+ * proporre una schermata intera dove va un componente porta a `FORM_KIND_MISMATCH`, che e' un
1451
+ * errore e blocca l'attivazione. Una voce senza `formKind` vale `Any` e resta proponibile in
1452
+ * entrambi i posti: un catalogo che il ruolo non lo dichiara non deve vietare tutto (§6.4).
1453
+ */
1454
+ abstract listForms(kind?: FlowFormKind): Promise<FlowCatalogEntry[]>;
1366
1455
  /** `GET /catalog/forms/{name}/parameters` */
1367
1456
  abstract listFormParameters(formName: string): Promise<FlowCatalogParameter[]>;
1368
1457
  /** `GET /catalog/enum-types` — per `objectType` delle risorse `Enum`. */
@@ -1500,6 +1589,11 @@ declare class HttpFlowBuilderApi extends FlowBuilderApi {
1500
1589
  * validazione di un flow vuoto, cioe' «manca lo Start».
1501
1590
  */
1502
1591
  validateDefinition(definition: FlowDefinition): Promise<FlowValidationResult>;
1592
+ /**
1593
+ * L'eccezione alla regola del documento nudo: qui l'involucro c'e' e il flow sta sotto
1594
+ * `flow`, perche' il body porta anche l'espressione e cosa deve produrre (§6.3, §6.4).
1595
+ */
1596
+ validateFormula(request: FlowFormulaValidationRequest): Promise<FlowFormulaValidationResult>;
1503
1597
  validateVersion(flowName: string, version: number): Promise<FlowValidationResult>;
1504
1598
  getDictionaries(processType?: string): Promise<FlowDictionaries>;
1505
1599
  /**
@@ -1521,7 +1615,7 @@ declare class HttpFlowBuilderApi extends FlowBuilderApi {
1521
1615
  listActionParameters(actionType: string, actionName: string): Promise<FlowCatalogParameter[]>;
1522
1616
  listScripts(): Promise<FlowCatalogEntry[]>;
1523
1617
  listScriptParameters(scriptName: string): Promise<FlowCatalogParameter[]>;
1524
- listForms(): Promise<FlowCatalogEntry[]>;
1618
+ listForms(kind?: FlowFormKind): Promise<FlowCatalogEntry[]>;
1525
1619
  listFormParameters(formName: string): Promise<FlowCatalogParameter[]>;
1526
1620
  listEnumTypes(): Promise<FlowCatalogEntry[]>;
1527
1621
  /** §4.6 — i valori di un tipo: `enumType` e' l'`objectType`, e va nel path come segmento. */
@@ -2147,7 +2241,12 @@ declare class FlowCatalogStore {
2147
2241
  listActionParameters(actionType: string, actionName: string): Promise<FlowCatalogParameter[]>;
2148
2242
  listScripts(): Promise<FlowCatalogEntry[]>;
2149
2243
  listScriptParameters(scriptName: string): Promise<FlowCatalogParameter[]>;
2150
- listForms(): Promise<FlowCatalogEntry[]>;
2244
+ /**
2245
+ * La cache e' **per ruolo**: `Form` e `Component` sono due risposte diverse dello stesso
2246
+ * catalogo, e una chiave sola le farebbe sovrascrivere a vicenda — il primo inspector aperto
2247
+ * deciderebbe cosa vede il secondo (§6.4).
2248
+ */
2249
+ listForms(kind?: FlowFormKind): Promise<FlowCatalogEntry[]>;
2151
2250
  listFormParameters(formName: string): Promise<FlowCatalogParameter[]>;
2152
2251
  listEnumTypes(): Promise<FlowCatalogEntry[]>;
2153
2252
  /**
@@ -2519,7 +2618,7 @@ declare class FlowDocumentStore {
2519
2618
  x: number;
2520
2619
  y: number;
2521
2620
  }): void;
2522
- /** Scrive la destinazione di un'uscita. `target` assente → il ramo resta incompleto. */
2621
+ /** Scrive la destinazione di un'uscita. `target` assente → il ramo si stacca del tutto. */
2523
2622
  setConnector(fromName: string, outletKey: string, target: string | undefined, isGoTo?: boolean): void;
2524
2623
  /** Rimuove un arco: il percorso finisce lì, che e' legittimo (§3.5). */
2525
2624
  removeConnector(fromName: string, outletKey: string): void;
@@ -2595,6 +2694,29 @@ declare class FlowValidationStore {
2595
2694
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<FlowValidationStore>;
2596
2695
  }
2597
2696
 
2697
+ declare class FormulaValidationService {
2698
+ private readonly api;
2699
+ private readonly _isSupported;
2700
+ private readonly _lastError;
2701
+ /**
2702
+ * `false` quando la primitiva non e' esposta da questo ambiente. Diverso da
2703
+ * `isVerified: false` nella risposta, che dice «primitiva sì, motore no»: per l'utente
2704
+ * l'effetto e' lo stesso — nessuna conferma — ma il secondo caso lo dice il backend e lo si
2705
+ * riferisce, il primo e' silenzio (§6.3).
2706
+ */
2707
+ readonly isSupported: _angular_core.Signal<boolean>;
2708
+ readonly lastError: _angular_core.Signal<string | null>;
2709
+ /** Ci si puo' provare: la primitiva c'e' e l'ultima chiamata non e' esplosa. */
2710
+ readonly canValidate: _angular_core.Signal<boolean>;
2711
+ /**
2712
+ * Verifica l'espressione. `null` significa «non lo so»: primitiva assente o richiesta
2713
+ * fallita. Non e' «formula valida» — chi chiama non deve mostrare una conferma su un `null`.
2714
+ */
2715
+ validate(request: FlowFormulaValidationRequest): Promise<FlowFormulaValidationResult | null>;
2716
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FormulaValidationService, never>;
2717
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<FormulaValidationService>;
2718
+ }
2719
+
2598
2720
  interface FlowLayoutNodeInput {
2599
2721
  name: string;
2600
2722
  width: number;
@@ -2661,7 +2783,15 @@ declare class FlowEditorSession {
2661
2783
  readonly lastSaveResult: _angular_core.Signal<FlowSaveResult | null>;
2662
2784
  readonly conflict: _angular_core.Signal<FlowConflictState | null>;
2663
2785
  readonly expectedUpdatedAt: _angular_core.Signal<string | undefined>;
2664
- /** `true` finche' il flow non e' mai stato salvato: il comando e' "Crea", non "Salva". */
2786
+ /**
2787
+ * `true` finche' il flow non e' mai stato salvato: il comando e' "Crea", non "Salva".
2788
+ *
2789
+ * Il confronto e' `== null` e non `=== null` di proposito: il segnale e' tipato
2790
+ * `number | null`, ma cio' che ci arriva viene da una risposta del backend, e una risposta
2791
+ * senza `version` porta `undefined`. Con `=== null` un `undefined` sarebbe «versione nota»:
2792
+ * lo stato diventa «Nuovo» con il chip «v», il comando primario «Nuova versione» e l'editor
2793
+ * in sola lettura, tutti insieme, senza nessun errore che lo spieghi.
2794
+ */
2665
2795
  readonly isNew: _angular_core.Signal<boolean>;
2666
2796
  readonly currentVersionSummary: _angular_core.Signal<FlowVersionSummary | undefined>;
2667
2797
  /**
@@ -2684,8 +2814,18 @@ declare class FlowEditorSession {
2684
2814
  open(flowName: string, version?: number): Promise<void>;
2685
2815
  /** Senza `version` il backend restituisce la versione attiva, altrimenti l'ultima (§6.1). */
2686
2816
  private static pickVersion;
2687
- /** Ricarica l'elenco versioni: dopo un'attivazione la precedente e' `Obsolete` (§8.4). */
2688
- refreshVersions(): Promise<void>;
2817
+ /**
2818
+ * Ricarica l'elenco versioni: dopo un'attivazione la precedente e' `Obsolete` (§8.4).
2819
+ *
2820
+ * `adoptVersion` serve dopo una scrittura la cui risposta non porta il numero di versione
2821
+ * (§6.2): l'elenco e' l'altra fonte che quel numero lo sa, e senza il ripiego un flow appena
2822
+ * creato resterebbe «Nuovo» — cioe' il salvataggio successivo tenterebbe una *creazione* su un
2823
+ * nome che esiste già. Sta dietro un flag perche' altrove una versione assente e' un flow
2824
+ * davvero nuovo, e adottarla lo farebbe passare per salvato.
2825
+ */
2826
+ refreshVersions(options?: {
2827
+ adoptVersion?: boolean;
2828
+ }): Promise<void>;
2689
2829
  /**
2690
2830
  * Crea o salva, a seconda dello stato. Non lancia su definizione invalida: il
2691
2831
  * salvataggio riesce anche con errori e il chiamante legge `validation` (§8.2).
@@ -2697,6 +2837,22 @@ declare class FlowEditorSession {
2697
2837
  activate?: boolean;
2698
2838
  flowName?: string;
2699
2839
  }): Promise<FlowSaveResult>;
2840
+ /**
2841
+ * Il risultato di una scrittura riportato alla forma su cui l'editor puo' contare.
2842
+ *
2843
+ * La §6.2 dice che `flowName` e `version` ci sono sempre, ma se mancano — risposta vuota,
2844
+ * `204`, o piu' spesso un host che serializza in PascalCase, dove `Version` non e' `version` —
2845
+ * il difetto non e' un errore: e' `undefined` che entra nello stato della sessione e ricompare
2846
+ * ovunque. Il chip della versione diventa «v», il banner dice «Versione undefined attivata», e
2847
+ * al salvataggio successivo si manda `flowName: undefined`. Nessuna eccezione, nessun rilievo.
2848
+ *
2849
+ * Cio' che sappiamo lo sappiamo già: il nome del flow e la versione sono quelli che abbiamo
2850
+ * appena chiesto di scrivere. Si tengono, e la discrepanza si dice **una volta** in console —
2851
+ * a chi integra, perche' e' la sua risposta a non avere la forma del contratto.
2852
+ */
2853
+ private normalizeResult;
2854
+ private static readonly warned;
2855
+ private static warnOnce;
2700
2856
  private applySaveResult;
2701
2857
  /** Copia la versione corrente in una nuova bozza (§8.1): il comando delle versioni chiuse. */
2702
2858
  createNewVersion(): Promise<FlowSaveResult>;
@@ -2896,9 +3052,10 @@ declare class FlowCanvasComponent {
2896
3052
  /** Sullo Start conta il trigger: e' cio' che decide quando il flow parte (§3.4). */
2897
3053
  private startSubtitle;
2898
3054
  /**
2899
- * Creazione di un arco. `targetId` assente significa rilascio nel vuoto: si lascia il
2900
- * ramo dichiarato ma senza destinazione, che e' esattamente il "ramo incompleto" del
2901
- * modello, invece di scartare il gesto.
3055
+ * Creazione di un arco. `targetId` assente significa rilascio nel vuoto: il ramo resta
3056
+ * **staccato**, cioe' omesso dal documento (`CONNECTOR_MISSING`, «il percorso finisce
3057
+ * qui»), non dichiarato-senza-destinazione che sarebbe `CONNECTOR_TARGET_MISSING`, un
3058
+ * avviso su un ramo che l'utente non ha mai voluto collegare.
2902
3059
  */
2903
3060
  onCreateConnection(event: {
2904
3061
  sourceId: string;
@@ -3094,7 +3251,20 @@ declare class ReferencePickerComponent {
3094
3251
  * `String` sta solo nell'elenco non filtrato.
3095
3252
  */
3096
3253
  private readonly declaredPrefix;
3254
+ /**
3255
+ * La radice **verificabile**: e' quella su cui si giudica il valore scritto (`valueState`), e
3256
+ * tiene fuori gli output automatici perche' la validazione non guarda i loro percorsi (§4.5, §7).
3257
+ */
3097
3258
  private readonly navigableRoot;
3259
+ /**
3260
+ * La radice da cui si **propone**, che comprende anche gli output automatici. Sono due computed e
3261
+ * non uno perche' le due domande sono diverse: proporre i campi di `Leggi_Ordine` aiuta a scrivere
3262
+ * `Leggi_Ordine.Numero` — un riferimento valido — mentre giudicarne i segmenti significherebbe
3263
+ * accusare cio' che il backend non verifica. Con una radice sola una delle due cose sarebbe
3264
+ * sbagliata: o la riga sparisce dai campi tipizzati, o un campo scritto a mano diventa
3265
+ * `FIELD_UNKNOWN` senza che nessuna primitiva lo dica.
3266
+ */
3267
+ private readonly proposalRoot;
3098
3268
  /** Il percorso dopo la radice: `Cliente.Email` di `Richiesta.Cliente.Email`. */
3099
3269
  private readonly navigatedPath;
3100
3270
  private readonly navigation;
@@ -3114,6 +3284,12 @@ declare class ReferencePickerComponent {
3114
3284
  */
3115
3285
  private readonly isReadOnlyPath;
3116
3286
  private readonly pathReferences;
3287
+ /**
3288
+ * Cosa dire di un segmento proposto. Sotto un output automatico «sola lettura» sarebbe vero ma
3289
+ * fuorviante — in un campo che vuole un valore nessuno stava cercando una destinazione: cio' che
3290
+ * cambia il comportamento e' che il percorso non lo verifica nessuno (§4.5).
3291
+ */
3292
+ private segmentDescription;
3117
3293
  /**
3118
3294
  * Lo stesso filtro delle radici (§6.4), applicato ai segmenti di un percorso: in un parametro
3119
3295
  * `String` non si propone un membro `Date`. Un segmento da cui si scende resta comunque proposto
@@ -3156,7 +3332,7 @@ declare class ReferencePickerComponent {
3156
3332
  * percorso inesistente di uno scope che i percorsi li dichiara, perche' lì il backend
3157
3333
  * risponderebbe `GLOBAL_UNKNOWN`.
3158
3334
  */
3159
- readonly valueState: _angular_core.Signal<"empty" | "known" | "navigated" | "host" | "member" | "containerRoot" | "memberUnknown" | "memberNotWritable" | "pathUnverified" | "globalPathUntyped" | "globalPathInvalid" | "unknown">;
3335
+ readonly valueState: _angular_core.Signal<"member" | "empty" | "unknown" | "known" | "navigated" | "host" | "containerRoot" | "memberUnknown" | "memberNotWritable" | "pathUnverified" | "globalPathUntyped" | "globalPathInvalid">;
3160
3336
  /** Le parole cambiano con la tappa: un campo di un'entita' non e' un membro di una classe. */
3161
3337
  private readonly tailIsObject;
3162
3338
  private readonly tailContainer;
@@ -3177,7 +3353,17 @@ declare class ReferencePickerComponent {
3177
3353
  * essere il riferimento che si vuole **oppure** la tappa da cui continuare.
3178
3354
  */
3179
3355
  descend(reference: FlowReference): void;
3180
- /** `true` se da questo riferimento il percorso continua: la sua forma e' dichiarata. */
3356
+ /**
3357
+ * `true` se da questo riferimento il percorso continua, cioe' se si conosce la forma di cio' che
3358
+ * designa. Comprende gli **output automatici** di un elemento: `Leggi_Ordine` dichiara la propria
3359
+ * entita', quindi i suoi campi si possono proporre — che il backend non verifichi i segmenti dopo
3360
+ * il punto (§4.5) cambia cosa si **dice** del valore scritto, non cosa si puo' proporre. Prima
3361
+ * l'esclusione era qui, e l'effetto era che in un campo tipizzato la riga spariva del tutto: il
3362
+ * filtro di tipo scarta il record, e senza `›` non restava nessuna strada verso `Leggi_Ordine.Numero`.
3363
+ *
3364
+ * Una collection resta esclusa: il riferimento designa l'insieme, e un campo di un insieme non
3365
+ * esiste — per scorrerlo c'e' il Loop.
3366
+ */
3181
3367
  canDescend(reference: FlowReference): boolean;
3182
3368
  /** Scrittura libera: indispensabile per gli scope dell'host e per i percorsi non enumerabili. */
3183
3369
  onManualInput(value: string): void;
@@ -3309,6 +3495,15 @@ declare class NamePickerComponent {
3309
3495
  * senza versione attiva e' un avviso. Mostrarli con lo stesso colore direbbe il falso.
3310
3496
  */
3311
3497
  readonly unknownSeverity: _angular_core.InputSignal<"error" | "warn">;
3498
+ /**
3499
+ * Nomi che **esistono** ma non sono utilizzabili qui. Il caso vero e' il catalogo dei form,
3500
+ * dove una schermata intera e un componente vivono nello stesso elenco e si distinguono per
3501
+ * `formKind`: usare l'uno al posto dell'altro e' `FORM_KIND_MISMATCH`, non `FORM_UNKNOWN`
3502
+ * (§5.1, §5.2). Senza questo secondo elenco il picker direbbe «non esiste» di un nome che c'e',
3503
+ * e manderebbe a cercare un artefatto già scritto.
3504
+ */
3505
+ readonly unusableOptions: _angular_core.InputSignal<NamePickerOption[]>;
3506
+ readonly unusableMessage: _angular_core.InputSignal<string>;
3312
3507
  /** Cosa dire quando l'elenco e' vuoto: e' il caso "non lo so", non un errore. */
3313
3508
  readonly emptyMessage: _angular_core.InputSignal<string>;
3314
3509
  /** Testo monospazio: i nomi tecnici si leggono meglio, ed e' come li mostra il resto del form. */
@@ -3320,6 +3515,8 @@ declare class NamePickerComponent {
3320
3515
  readonly text: _angular_core.Signal<string>;
3321
3516
  readonly visibleOptions: _angular_core.Signal<NamePickerOption[]>;
3322
3517
  readonly hasOptions: _angular_core.Signal<boolean>;
3518
+ /** Il nome c'e' nel catalogo, ma in un ruolo che qui non va: e' un errore a se' (§7). */
3519
+ readonly isUnusable: _angular_core.Signal<boolean>;
3323
3520
  readonly isUnknown: _angular_core.Signal<boolean>;
3324
3521
  readonly labelOfValue: _angular_core.Signal<string | null>;
3325
3522
  open(): void;
@@ -3330,7 +3527,7 @@ declare class NamePickerComponent {
3330
3527
  clear(): void;
3331
3528
  describe(option: NamePickerOption): string;
3332
3529
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NamePickerComponent, never>;
3333
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<NamePickerComponent, "fb-name-picker", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "unknownMessage": { "alias": "unknownMessage"; "required": false; "isSignal": true; }; "unknownSeverity": { "alias": "unknownSeverity"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "isMono": { "alias": "isMono"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
3530
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NamePickerComponent, "fb-name-picker", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "unknownMessage": { "alias": "unknownMessage"; "required": false; "isSignal": true; }; "unknownSeverity": { "alias": "unknownSeverity"; "required": false; "isSignal": true; }; "unusableOptions": { "alias": "unusableOptions"; "required": false; "isSignal": true; }; "unusableMessage": { "alias": "unusableMessage"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "isMono": { "alias": "isMono"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
3334
3531
  }
3335
3532
 
3336
3533
  declare class StructurePickerComponent {
@@ -3458,6 +3655,114 @@ declare class EnumValuePickerComponent {
3458
3655
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<EnumValuePickerComponent, "fb-enum-value-picker", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "enumType": { "alias": "enumType"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
3459
3656
  }
3460
3657
 
3658
+ declare class FormulaEditorComponent {
3659
+ private readonly store;
3660
+ private readonly api;
3661
+ private readonly service;
3662
+ private readonly destroyRef;
3663
+ readonly expression: _angular_core.InputSignal<string>;
3664
+ /** Dove comparira': e' cio' che dice al motore cosa pretendere (§6.3). */
3665
+ readonly usage: _angular_core.InputSignal<string>;
3666
+ /** `Boolean` per condizioni e validation rule, il tipo dichiarato per una risorsa. */
3667
+ readonly expectedDataType: _angular_core.InputSignal<string | undefined>;
3668
+ readonly scale: _angular_core.InputSignal<number | undefined>;
3669
+ readonly placeholder: _angular_core.InputSignal<string>;
3670
+ readonly ariaLabel: _angular_core.InputSignal<string>;
3671
+ readonly disabled: _angular_core.InputSignal<boolean>;
3672
+ readonly rows: _angular_core.InputSignal<number>;
3673
+ /**
3674
+ * Quando propagare al documento. `input` a ogni tasto, `change` all'uscita dal campo: la
3675
+ * seconda serve dove mutare il documento ridisegna mezza schermata — l'anteprima dello screen
3676
+ * dinamico — e riscriverla a ogni tasto costa. La **verifica** parte comunque durante la
3677
+ * digitazione: usa la bozza locale, non cio' che e' arrivato al documento.
3678
+ */
3679
+ readonly commitOn: _angular_core.InputSignal<"input" | "change">;
3680
+ readonly expressionChange: _angular_core.OutputEmitterRef<string>;
3681
+ private readonly area;
3682
+ /**
3683
+ * Il testo che si sta scrivendo. Non e' legato al DOM — la casella tiene il suo valore e la
3684
+ * `[value]` resta quella del documento — perche' riscrivere l'attributo a ogni tasto sposta il
3685
+ * cursore quando si corregge in mezzo all'espressione.
3686
+ */
3687
+ private readonly draft;
3688
+ private readonly _result;
3689
+ private readonly _isChecking;
3690
+ private timer?;
3691
+ /** Cresce a ogni richiesta: scarta le risposte di verifiche già superate. */
3692
+ private sequence;
3693
+ readonly result: _angular_core.Signal<FlowFormulaValidationResult | null>;
3694
+ readonly isChecking: _angular_core.Signal<boolean>;
3695
+ readonly isSupported: _angular_core.Signal<boolean>;
3696
+ /**
3697
+ * I nomi citabili, per l'autocompletamento (§6.3): li da' `POST /flows/references`, cioe' la
3698
+ * stessa fonte del reference picker — compresi gli **output automatici**, che sono riferimenti
3699
+ * validi pur non essendo dichiarati in nessuna collection (§4.5, §13.3). Qui non si filtra per
3700
+ * tipo: dentro un'espressione il tipo lo decide il motore, non il campo.
3701
+ */
3702
+ private readonly references;
3703
+ /** Il documento per cui l'elenco e' stato chiesto: evita una richiesta a ogni focus. */
3704
+ private loadedFor;
3705
+ /** La parola sotto il cursore, che e' cio' che si sta completando. */
3706
+ private readonly token;
3707
+ protected readonly highlighted: _angular_core.WritableSignal<number>;
3708
+ readonly suggestions: _angular_core.Signal<FlowReference[]>;
3709
+ readonly issues: _angular_core.Signal<FlowFormulaIssue[]>;
3710
+ readonly hasErrors: _angular_core.Signal<boolean>;
3711
+ /**
3712
+ * L'esito e' una conferma **solo** se un motore ha davvero guardato l'espressione: senza
3713
+ * `isVerified` non si mostra la spunta, perche' una spunta verde su un'espressione mai
3714
+ * controllata e' peggio di nessuna spunta (§6.3).
3715
+ */
3716
+ readonly isConfirmed: _angular_core.Signal<boolean>;
3717
+ /** Il motore c'e' come primitiva ma non come motore: si dice, non si tace (§6.3). */
3718
+ readonly isUnverified: _angular_core.Signal<boolean>;
3719
+ /**
3720
+ * Il tipo prodotto quando il motore sa dirlo. Serve a segnalare una formula dichiarata
3721
+ * `String` che restituisce una data — ma il rilievo lo fa il motore: se l'ha già emesso,
3722
+ * qui non si ripete lo stesso avviso con parole diverse.
3723
+ */
3724
+ readonly resultDataType: _angular_core.Signal<string | null>;
3725
+ readonly typeMismatch: _angular_core.Signal<{
3726
+ expected: string;
3727
+ produced: string;
3728
+ } | null>;
3729
+ constructor();
3730
+ onInput(value: string): void;
3731
+ onCommit(value: string): void;
3732
+ onFocus(): void;
3733
+ /** Il cursore si sposta anche senza digitare: la parola sotto il cursore va riletta. */
3734
+ onCaretMove(): void;
3735
+ onBlur(): void;
3736
+ /**
3737
+ * Le frecce scorrono l'elenco e Invio inserisce. Senza, l'elenco sarebbe una decorazione: chi
3738
+ * scrive una formula ha le mani sulla tastiera e non va a cercare il mouse.
3739
+ */
3740
+ onKeyDown(event: KeyboardEvent): void;
3741
+ /**
3742
+ * Sostituisce la parola sotto il cursore col nome scelto. Si scrive nel DOM e poi si propaga:
3743
+ * la casella e' la sorgente del testo mentre si digita, e riscrivere solo il documento
3744
+ * lascerebbe indietro il cursore.
3745
+ */
3746
+ insert(name: string): void;
3747
+ private loadReferences;
3748
+ /** La parola sotto il cursore: identificatore o percorso puntato, com'e' in un riferimento. */
3749
+ private refreshToken;
3750
+ severityOf(issue: FlowFormulaIssue): string;
3751
+ hasPosition(issue: FlowFormulaIssue): boolean;
3752
+ /** Il tratto citato dal rilievo, così il messaggio dice *dove* anche senza il salto. */
3753
+ excerptOf(issue: FlowFormulaIssue): string;
3754
+ /**
3755
+ * Porta il cursore sul tratto segnalato. È il payoff di `position`: un indice di carattere
3756
+ * che l'utente dovrebbe contare a mano non aiuta nessuno.
3757
+ */
3758
+ goToIssue(issue: FlowFormulaIssue): void;
3759
+ private schedule;
3760
+ private run;
3761
+ private cancel;
3762
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FormulaEditorComponent, never>;
3763
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FormulaEditorComponent, "fb-formula-editor", never, { "expression": { "alias": "expression"; "required": false; "isSignal": true; }; "usage": { "alias": "usage"; "required": false; "isSignal": true; }; "expectedDataType": { "alias": "expectedDataType"; "required": false; "isSignal": true; }; "scale": { "alias": "scale"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "commitOn": { "alias": "commitOn"; "required": false; "isSignal": true; }; }, { "expressionChange": "expressionChange"; }, never, ["*"], true, never>;
3764
+ }
3765
+
3461
3766
  /** Le modalita' offerte: una per campo del modello. */
3462
3767
  type ValueMode = 'reference' | 'literal' | 'formula' | 'globalConstant' | 'empty';
3463
3768
  declare class ValueEditorComponent {
@@ -4049,28 +4354,70 @@ declare class OrchestratedStageInspectorComponent extends NodeInspectorBase {
4049
4354
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<OrchestratedStageInspectorComponent, "fb-orchestrated-stage-inspector", never, {}, {}, never, never, true, never>;
4050
4355
  }
4051
4356
 
4052
- /** Il payload della lista di rilascio: l'albero appiattito, cioe' le righe che si vedono. */
4053
- type DropData = FlowScreenFieldNode[];
4357
+ /** Il punto di inserimento calcolato dal trascinamento: dove, e in che posizione. */
4358
+ interface DropTarget {
4359
+ parent: FlowScreenFieldPath;
4360
+ index: number;
4361
+ /**
4362
+ * Dove disegnare la barra di inserimento, in coordinate del frame dell'anteprima. La calcola
4363
+ * {@link DynamicScreenInspectorComponent.hitTest} perche' e' lì che si conoscono i rettangoli
4364
+ * dei fratelli, e la barra e' un **velo**: non sta nel flusso (vedi `dropMarker`). Assente per
4365
+ * il bersaglio dei comandi a clic, che non nasce da un puntatore e non disegna niente.
4366
+ */
4367
+ marker?: DropMarker;
4368
+ }
4369
+ /** La barra di inserimento, in pixel relativi al frame dell'anteprima. */
4370
+ interface DropMarker {
4371
+ left: number;
4372
+ top: number;
4373
+ width: number;
4374
+ height: number;
4375
+ }
4054
4376
  declare class DynamicScreenInspectorComponent extends NodeInspectorBase {
4055
4377
  private readonly catalog;
4378
+ private readonly document;
4056
4379
  protected readonly dictionary: FlowDictionaryStore;
4057
4380
  readonly elementType: FlowElementType;
4058
4381
  readonly screen: _angular_core.Signal<FlowDynamicScreen>;
4059
- /** Il percorso del campo selezionato: `null` = nessuno, e il pannello destro lo dice. */
4382
+ /** Il percorso del campo selezionato: `null` = nessuno, e a destra ci sono le proprieta'
4383
+ * della **schermata** — lo stesso gesto del cliccare fuori da un campo. */
4060
4384
  private readonly selection;
4061
- /** L'albero appiattito: e' anche cio' che serve per capire quali percorsi esistono ancora. */
4062
- readonly tree: _angular_core.Signal<FlowScreenFieldNode[]>;
4063
4385
  readonly selectedPath: _angular_core.Signal<FlowScreenFieldPath | null>;
4064
4386
  readonly selectedField: _angular_core.Signal<FlowScreenField | undefined>;
4065
4387
  /** La voce di dizionario del campo selezionato: e' lei a decidere il form di destra. */
4066
4388
  readonly selectedType: _angular_core.Signal<FlowScreenFieldTypeEntry | undefined>;
4389
+ /**
4390
+ * Due elenchi e non uno: un **componente** si sceglie per tipo (che cosa fa), un **campo di
4391
+ * un'entita'** si sceglie per nome (quale dato), e da lì tipo, etichetta, obbligatorieta' e
4392
+ * opzioni arrivano dallo schema (§5.2). Metterli insieme costringerebbe a scegliere prima
4393
+ * `ObjectProvided` e poi il campo, che e' il contrario dell'ordine in cui si pensa.
4394
+ */
4395
+ readonly paletteTab: _angular_core.WritableSignal<"fields" | "components">;
4396
+ /** L'entita' di cui elencare i campi nella seconda scheda. */
4397
+ readonly fieldsObject: _angular_core.WritableSignal<string | undefined>;
4398
+ private readonly objectFields;
4399
+ readonly fieldsOfObject: _angular_core.Signal<FlowFieldDescription[]>;
4400
+ iconOf(type: string | undefined): string;
4401
+ setPaletteTab(tab: 'components' | 'fields'): void;
4402
+ setFieldsObject(object: string | undefined): void;
4067
4403
  /** Componenti e form sono la stessa domanda al frontend, e lo stesso catalogo (§5.2). */
4404
+ /** I soli **componenti**: `GET /catalog/forms?kind=Component` (§5.2, §6.4). */
4068
4405
  private readonly components;
4406
+ /**
4407
+ * Le schermate intere, che qui non vanno. Serve a dire la cosa giusta su un nome che esiste:
4408
+ * `FORM_KIND_MISMATCH` e non `SCREEN_COMPONENT_UNKNOWN` (§5.2).
4409
+ */
4410
+ private readonly forms;
4069
4411
  private readonly componentParameters;
4070
4412
  /** I tipi di enumerazione: dizionario chiuso, quindi `<select>` e non combo (§4.6). */
4071
4413
  private readonly enumTypes;
4072
4414
  constructor();
4073
4415
  readonly componentOptions: _angular_core.Signal<NamePickerOption[]>;
4416
+ /**
4417
+ * Le schermate che **non** sono anche componenti: una voce senza `formKind` vale `Any` e
4418
+ * compare in entrambe le risposte, quindi qui non va accusata (§6.4).
4419
+ */
4420
+ readonly unusableComponents: _angular_core.Signal<NamePickerOption[]>;
4074
4421
  readonly enumOptions: _angular_core.Signal<FlowCatalogEntry[]>;
4075
4422
  readonly componentParameterList: _angular_core.Signal<FlowCatalogParameter[]>;
4076
4423
  /**
@@ -4081,16 +4428,143 @@ declare class DynamicScreenInspectorComponent extends NodeInspectorBase {
4081
4428
  readonly choiceOptions: _angular_core.Signal<NamePickerOption[]>;
4082
4429
  /** Gli stage dichiarati: `stageReference` alimenta l'indicatore di avanzamento (§5.2). */
4083
4430
  readonly stageOptions: _angular_core.Signal<NamePickerOption[]>;
4084
- readonly icon: string;
4085
4431
  isSelected(path: FlowScreenFieldPath): boolean;
4086
4432
  isContainer(field: FlowScreenField | undefined): boolean;
4087
- /** L'etichetta mostrata nell'albero: `fieldText`, poi il nome, poi un segnaposto. */
4433
+ /** `true` sulla sezione, che dispone i figli **in riga**: le colonne stanno una accanto all'altra. */
4434
+ isSection(field: FlowScreenField | undefined): boolean;
4435
+ childPath(parent: FlowScreenFieldPath, index: number): FlowScreenFieldPath;
4436
+ /** L'etichetta da disegnare: `fieldText`, poi il nome, poi un segnaposto esplicito. */
4088
4437
  captionOf(field: FlowScreenField): string;
4089
4438
  typeLabelOf(field: FlowScreenField): string;
4090
- /** La larghezza in dodicesimi: assente = tutta la riga, che e' il comportamento di default. */
4439
+ /**
4440
+ * La larghezza in dodicesimi: assente = tutta la riga, che e' il default del runtime. È anche
4441
+ * il numero di colonne che il campo occupa nella griglia dell'anteprima, limitato a 1..12
4442
+ * perche' un valore fuori scala romperebbe la griglia invece di segnalarsi.
4443
+ */
4091
4444
  widthOf(field: FlowScreenField): number;
4092
- /** `true` dove il tipo non e' nel dizionario: il form di destra lo dice invece di indovinare. */
4445
+ /** `true` dove il tipo non e' nel dizionario: si dice, invece di indovinare un disegno. */
4093
4446
  isUnknownType(field: FlowScreenField | undefined): boolean;
4447
+ /**
4448
+ * Le etichette delle opzioni, per disegnarle nell'anteprima: il `choiceText` di una
4449
+ * `FlowChoice`, il nome del choice set (le sue opzioni sono una query, e non esistono finche'
4450
+ * la schermata non viene presentata — §5.2).
4451
+ */
4452
+ choiceLabelsOf(field: FlowScreenField): string[];
4453
+ /** Il testo mostrato dentro il controllo inerte: il default, se ce n'e' uno leggibile. */
4454
+ placeholderOf(field: FlowScreenField): string;
4455
+ /** Il campo che si sta trascinando: la sua anteprima si sbiadisce e non intercetta il mouse. */
4456
+ readonly dragging: _angular_core.WritableSignal<FlowScreenFieldPath | null>;
4457
+ /** Il punto di inserimento corrente, disegnato come una barra fra i campi. */
4458
+ readonly dropTarget: _angular_core.WritableSignal<DropTarget | null>;
4459
+ isDragging(path: FlowScreenFieldPath): boolean;
4460
+ /**
4461
+ * La barra di inserimento, disegnata **sopra** l'anteprima e non dentro il contenitore.
4462
+ *
4463
+ * Un tempo era un figlio del contenitore di rilascio, e in una griglia a 12 tracce questo la
4464
+ * rendeva ingovernabile: una barra orizzontale prende `1 / -1`, cioe' una **riga intera piu' il
4465
+ * gap**, e spinge in basso tutto cio' che la segue — compresa la sezione che si stava puntando,
4466
+ * che si sposta di sotto il puntatore. Il gesto successivo rimisurava allora una geometria che
4467
+ * la barra stessa aveva cambiato, il bersaglio cambiava, la barra spariva, la sezione risaliva:
4468
+ * un'oscillazione a ogni movimento, e nessun modo di rilasciare dentro la sezione. Fuori dal
4469
+ * flusso la barra non muove niente, e `hitTest` misura sempre la stessa anteprima.
4470
+ *
4471
+ * Il secondo difetto che questo risolve: fra due colonne che riempivano tutte e 12 le tracce la
4472
+ * barra verticale finiva mandata a capo su una riga di altezza zero, cioe' **invisibile** —
4473
+ * proprio dove serviva di piu'.
4474
+ */
4475
+ readonly dropMarker: _angular_core.Signal<DropMarker | null>;
4476
+ onFieldDragStarted(path: FlowScreenFieldPath): void;
4477
+ onFieldDragMoved(event: CdkDragMove): void;
4478
+ onFieldDragEnded(event: CdkDragEnd, path: FlowScreenFieldPath): void;
4479
+ /** Trascinamento **dalla palette**: non sposta niente, crea. */
4480
+ onPaletteDragMoved(event: CdkDragMove): void;
4481
+ onComponentDragEnded(event: CdkDragEnd, type: string): void;
4482
+ onObjectFieldDragEnded(event: CdkDragEnd, field: FlowFieldDescription): void;
4483
+ /**
4484
+ * Il documento si muta **dopo** che il gesto e' finito, non dentro `cdkDragEnded`: lì
4485
+ * l'anteprima si ridisegnerebbe mentre il CDK sta ancora chiudendo il trascinamento
4486
+ * sull'elemento che Angular in quel momento riusa per un altro campo. Un rinvio al task
4487
+ * successivo basta, e per chi guarda lo spostamento resta istantaneo.
4488
+ */
4489
+ private afterDrag;
4490
+ /**
4491
+ * Il bersaglio del rilascio, calcolato dal **DOM** e non dalle drop list del CDK.
4492
+ *
4493
+ * Le drop list annidate qui sono ambigue per costruzione: il rettangolo di una sezione
4494
+ * contiene quello delle sue colonne, e a ricevere il rilascio finisce sempre la lista
4495
+ * registrata per prima, cioe' la radice. Interrogando `elementFromPoint` si prende invece il
4496
+ * contenitore **piu' interno** sotto il puntatore, che e' esattamente quello che si vede.
4497
+ *
4498
+ * L'indice viene dal confronto con la mezzeria dei fratelli, sull'asse del contenitore: le
4499
+ * colonne di una sezione stanno in riga, tutto il resto in colonna.
4500
+ *
4501
+ * La misura e' **sempre** su un'anteprima senza barra di inserimento: la barra e' un velo
4502
+ * assoluto (vedi `dropMarker`), quindi non c'e' il ciclo per cui disegnarla spostava cio' che
4503
+ * si stava puntando.
4504
+ */
4505
+ private hitTest;
4506
+ /** Barra verticale a sinistra di un campo, alta quanto lui. */
4507
+ private barBefore;
4508
+ /** Barra verticale a destra di un campo. */
4509
+ private barAfter;
4510
+ /** Barra orizzontale sopra un campo, larga quanto le tracce del contenitore. */
4511
+ private barAbove;
4512
+ /** Barra orizzontale sotto un campo. */
4513
+ private barBelow;
4514
+ /** Barra orizzontale in mezzo a un contenitore vuoto, dov'e' il segnaposto. */
4515
+ private barInside;
4516
+ /** La banda occupata dalle tracce della griglia: il rettangolo del contenitore meno il padding. */
4517
+ private contentBand;
4518
+ /** `true` se il campo occupa tutte le tracce, cioe' se la sua riga e' sua e basta. */
4519
+ private fillsRow;
4520
+ /**
4521
+ * Da coordinate del viewport a coordinate del frame dell'anteprima, che e' il contenitore
4522
+ * posizionato in cui vive il velo. Senza la conversione la barra sarebbe fuori posto appena la
4523
+ * dialog e' scorsa.
4524
+ */
4525
+ private toFrame;
4526
+ /** `"0.2"` → `[0, 2]`; la radice e' la stringa vuota. */
4527
+ private static parsePath;
4528
+ /** Il valore dell'attributo che marca un contenitore di rilascio. */
4529
+ dropId(path: FlowScreenFieldPath): string;
4530
+ /**
4531
+ * Dove finisce un campo aggiunto **con un clic**: dentro il contenitore selezionato, oppure
4532
+ * accanto al campo selezionato, oppure in fondo alla schermata. È l'ordine in cui uno se lo
4533
+ * aspetta dopo aver cliccato una colonna.
4534
+ */
4535
+ private clickTarget;
4536
+ addComponentAtSelection(type: string): void;
4537
+ addObjectFieldAtSelection(field: FlowFieldDescription): void;
4538
+ /**
4539
+ * Un componente nuovo. Una sezione nasce **con una colonna dentro**: una sezione vuota e'
4540
+ * `SCREEN_CONTAINER_EMPTY` e non ha nemmeno un posto in cui rilasciare i campi, quindi il
4541
+ * primo gesto sarebbe sempre lo stesso.
4542
+ */
4543
+ private addComponent;
4544
+ /**
4545
+ * §5.2 — un campo dell'entita': `objectFieldReference` fa arrivare tipo, label,
4546
+ * obbligatorieta', scala e le opzioni **dallo schema**, invece di ridichiararli qui.
4547
+ */
4548
+ private addObjectField;
4549
+ select(path: FlowScreenFieldPath): void;
4550
+ /** Cliccare la schermata fuori da un campo: a destra tornano le proprieta' della schermata. */
4551
+ selectScreen(): void;
4552
+ removeSelected(): void;
4553
+ duplicateSelected(): void;
4554
+ /**
4555
+ * Spostamento con i tasti: la stessa operazione del trascinamento, per chi non trascina e
4556
+ * perche' spostare di una posizione con il mouse e' piu' difficile che con una freccia.
4557
+ */
4558
+ moveSelected(direction: -1 | 1): void;
4559
+ /** Estrae il campo dal proprio contenitore e lo mette subito dopo di esso. */
4560
+ outdentSelected(): void;
4561
+ readonly canOutdent: _angular_core.Signal<boolean>;
4562
+ /**
4563
+ * `preRemoval` distingue le due convenzioni sull'indice di arrivo: i comandi (su, giu', porta
4564
+ * fuori) ragionano sulla lista **dopo** l'estrazione, il rilascio su cio' che si vedeva
4565
+ * **prima**. Confonderle sposta di uno ogni trascinamento verso il basso.
4566
+ */
4567
+ private applyMove;
4094
4568
  /** Il campo raccoglie un valore, quindi e' referenziabile per nome nel resto del flow (§5.2). */
4095
4569
  readonly selectedIsResource: _angular_core.Signal<boolean>;
4096
4570
  /**
@@ -4122,46 +4596,6 @@ declare class DynamicScreenInspectorComponent extends NodeInspectorBase {
4122
4596
  /** L'oggetto di un `ObjectProvided`, cioe' la parte prima del punto (§5.2). */
4123
4597
  readonly providedObject: _angular_core.Signal<string>;
4124
4598
  readonly providedField: _angular_core.Signal<string>;
4125
- select(path: FlowScreenFieldPath): void;
4126
- /** Aggiunge un campo dentro il contenitore selezionato, o in fondo alla schermata. */
4127
- addField(type: string): void;
4128
- /**
4129
- * Dove finisce un campo nuovo: dentro il contenitore selezionato (o dentro il contenitore
4130
- * che contiene il campo selezionato), altrimenti in fondo alla schermata. È il gesto che
4131
- * l'utente si aspetta dopo aver cliccato una colonna.
4132
- */
4133
- private parentForNewField;
4134
- removeSelected(): void;
4135
- duplicateSelected(): void;
4136
- /**
4137
- * Spostamento con i tasti: la stessa operazione del trascinamento, per chi non trascina e per
4138
- * i casi in cui la lista e' piu' alta del pannello.
4139
- */
4140
- moveSelected(direction: -1 | 1): void;
4141
- /**
4142
- * Sposta il campo dentro il contenitore che lo precede. È la controparte esplicita del
4143
- * trascinamento: dove l'albero e' lungo, mirare la riga giusta costa piu' di un clic.
4144
- */
4145
- indentSelected(): void;
4146
- /** Il contenitore in cui «porta dentro» metterebbe il campo, o `null` se non ce n'e' uno. */
4147
- readonly indentTarget: _angular_core.Signal<FlowScreenFieldPath | null>;
4148
- /** Estrae il campo dal proprio contenitore e lo mette subito dopo di esso. */
4149
- outdentSelected(): void;
4150
- /**
4151
- * Rilascio del trascinamento sulla lista **piatta**.
4152
- *
4153
- * Il contenitore di arrivo non lo dice il CDK — c'e' una sola lista — ma si deduce dalla riga
4154
- * che **precede** il punto di rilascio, che e' anche cio' che l'utente vede: rilasciare subito
4155
- * sotto una sezione o una colonna significa «mettilo dentro»; rilasciare sotto un campo
4156
- * normale significa «mettilo accanto». Sono le due sole intenzioni possibili.
4157
- */
4158
- onDrop(event: CdkDragDrop<DropData>): void;
4159
- /**
4160
- * `preRemoval` distingue le due convenzioni sull'indice di arrivo: i comandi (su, giu',
4161
- * porta fuori) ragionano sulla lista **dopo** l'estrazione, il rilascio ragiona su cio' che
4162
- * si vedeva **prima**. Confonderle sposta di uno ogni trascinamento verso il basso.
4163
- */
4164
- private applyMove;
4165
4599
  /** Scrive una proprieta' del campo selezionato; valore vuoto → chiave omessa (§2). */
4166
4600
  private patchField;
4167
4601
  setFieldProperty(property: keyof FlowScreenField, value: unknown): void;
@@ -4600,5 +5034,5 @@ declare class SelectValueDirective implements AfterViewChecked {
4600
5034
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<SelectValueDirective, "select[fbValue]", never, { "fbValue": { "alias": "fbValue"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
4601
5035
  }
4602
5036
 
4603
- export { ConditionEditorComponent, ConnectorEditorComponent, DebugPanelComponent, DynamicScreenInspectorComponent, ElementDialogComponent, ElementInspectorComponent, ElementPaletteComponent, EnumValuePickerComponent, FALLBACK_COLLECTION_BY_TYPE, FALLBACK_TYPE_LABEL, FLOW_BUILDER_HTTP_CONFIG, FLOW_ELEMENT_ICONS, FLOW_ELEMENT_VARIANT_FIELDS, FLOW_ELEMENT_VARIANT_ICONS, FLOW_ERROR_FALLBACK_MESSAGE, FLOW_ERROR_HTTP_STATUS, FLOW_NAME_PATTERN, FLOW_NODE_COLLECTIONS, FLOW_NODE_HEIGHT, FLOW_NODE_WIDTH, FLOW_RESOURCE_COLLECTIONS, FLOW_VALUE_FIELDS, FLOW_VALUE_LITERAL_FIELDS, FieldAssignmentEditorComponent, FieldPickerComponent, FlowApiError, FlowBuilderApi, FlowBuilderComponent, FlowCanvasComponent, FlowCatalogStore, FlowDictionaryStore, FlowDocumentStore, FlowEditorSession, FlowLayoutService, FlowValidationStore, HttpFlowBuilderApi, NamePickerComponent, NodeInspectorBase, ORCHESTRATION_CONDITION_OUTPUT, ObjectPickerComponent, OrchestratedStageInspectorComponent, ParameterEditorComponent, ProblemsPanelComponent, RecordFilterEditorComponent, ReferencePickerComponent, ResourcePanelComponent, SEVERITY_BUCKETS, SEVERITY_ICON, SEVERITY_LABEL, START_NODE_NAME, SelectValueDirective, StartInspectorComponent, StructureMemberPickerComponent, StructurePickerComponent, TYPES_WITH_AUTOMATIC_OUTPUT, TYPE_BY_COLLECTION, UNSUPPORTED_TYPES, ValueEditorComponent, VersionPanelComponent, allFieldsOf, areTypesComparable, canvasNodeId, checkConditionLogic, checkFlowName, describePathEntry, duplicateField, elementIcon, emptyFlowDefinition, fieldAt, filterReferences, flattenFields, flowNodeWidth, flowNodeWidthClass, insertField, isCustomConditionLogic, isEmptyReferenceFilter, isFieldResource, isGlobalReference, isNumericType, isPathInside, isTypeCheckedOperator, isValidFlowName, isValued, loadPathLevel, matchesReferenceFilter, moveCondition, moveField, navigatePath, outletByKey, outletsOf, parseCanvasNodeId, parseInvariantNumber, parseSourceConnectorId, parseTargetConnectorId, pathAvailableNames, pathContainerLabel, pathKey, pathNotVerifiableMessage, referenceRoot, remapConditionLogic, removeCondition, removeField, resolvePath, samePath, screenFieldNames, severityBucket, slugifyFlowName, sourceConnectorId, stageStepNames, stageStepOutputReferenced, stepsOf, targetConnectorId, uniqueFlowName, valuedFieldOf, valuedFieldsOf, variantFieldOf, variantOf, variantPresetOf };
4604
- export type { FieldAssignmentHolder, FilterHolder, FlowActionCall, FlowAnyNode, FlowAssignment, FlowAssignmentItem, FlowAssignmentOperator, FlowAssignmentOperatorEntry, FlowBuilderHttpConfig, FlowCanvasEdge, FlowCanvasNode, FlowCatalogEntry, FlowCatalogParameter, FlowChoice, FlowCloneRequest, FlowCollectionProcessor, FlowCollectionProcessorType, FlowComparisonOperator, FlowComparisonOperatorEntry, FlowCondition, FlowConditionHolder, FlowConditionLogic, FlowConflictState, FlowConnectionKind, FlowConnector, FlowConnectorTarget, FlowConstant, FlowCreateRequest, FlowCustomError, FlowCustomErrorMessage, FlowCustomProperty, FlowDataType, FlowDataTypeEntry, FlowDecision, FlowDecisionRule, FlowDefinition, FlowDictionaries, FlowDictionaryEntry, FlowDynamicChoiceSet, FlowDynamicScreen, FlowEdge, FlowElementType, FlowElementTypeEntry, FlowEnumValue, FlowErrorCategory, FlowExportQuery, FlowFieldDescription, FlowFieldUsage, FlowFieldValue, FlowFormula, FlowGlobalVariableEntry, FlowInputFieldAssignment, FlowInputParameter, FlowInterviewResult, FlowInterviewStatus, FlowIssueSeverity, FlowLayoutDirection, FlowLayoutNodeInput, FlowLayoutOptions, FlowLayoutResult, FlowListQuery, FlowLoop, FlowNameCheck, FlowNameProblem, FlowNewVersionRequest, FlowNodeBase, FlowNodeCollection, FlowNodeRef, FlowObjectDescription, FlowObjectSummary, FlowOffsetUnit, FlowOrchestratedStage, FlowOutlet, FlowOutline, FlowOutlineConnection, FlowOutlineNode, FlowOutputFieldAssignment, FlowOutputParameter, FlowPalettePick, FlowPendingScreen, FlowProcessType, FlowRecordCreate, FlowRecordDelete, FlowRecordFilter, FlowRecordFilterOperator, FlowRecordLookup, FlowRecordRollback, FlowRecordTriggerType, FlowRecordUpdate, FlowRecordValue, FlowReference, FlowReferenceFilter, FlowReferenceKind, FlowRegionContainerType, FlowResourceCollection, FlowResourceKindEntry, FlowResourceRef, FlowResumeRequest, FlowSaveRequest, FlowSaveResult, FlowSchedule, FlowScheduledPath, FlowScreen, FlowScreenField, FlowScreenFieldInputsRevisited, FlowScreenFieldNode, FlowScreenFieldPath, FlowScreenFieldType, FlowScreenFieldTypeEntry, FlowScreenNavigation, FlowScreenResponseRequest, FlowScreenValidationRule, FlowScriptPluginCall, FlowSeverityBucket, FlowSortOption, FlowSortOrder, FlowStage, FlowStageStep, FlowStageStepActionType, FlowStageStepAssignee, FlowStageStepConditionActionType, FlowStageStepRequest, FlowStageStepState, FlowStageStepStatus, FlowStageStepTypeEntry, FlowStart, FlowStartInterviewRequest, FlowStructureDescribed, FlowStructureDescription, FlowStructureInstance, FlowStructureMember, FlowSubflow, FlowSubflowInputAssignment, FlowSubflowOutputAssignment, FlowSummary, FlowTextTemplate, FlowTraceEntry, FlowTransactionModel, FlowTransform, FlowTransformType, FlowTransformValue, FlowTransformValueAction, FlowTriggerType, FlowTypedEntry, FlowTypedValue, FlowUnsupportedNode, FlowValidationIssue, FlowValidationResult, FlowValue, FlowVariable, FlowVersionStatus, FlowVersionSummary, FlowWait, FlowWaitEvent, NamePickerOption, PaletteGroup, PaletteItem, ParameterHolder, PathCatalog, PathContainer, PathContainerKind, PathEntry, PathLevel, PathLevelStatus, PathNavigation, PathNavigationRequest, PathResolution, PathStopReason, StructureMemberUsage, ValueMode };
5037
+ export { ConditionEditorComponent, ConnectorEditorComponent, DebugPanelComponent, DynamicScreenInspectorComponent, ElementDialogComponent, ElementInspectorComponent, ElementPaletteComponent, EnumValuePickerComponent, FALLBACK_COLLECTION_BY_TYPE, FALLBACK_TYPE_LABEL, FLOW_BUILDER_HTTP_CONFIG, FLOW_ELEMENT_ICONS, FLOW_ELEMENT_VARIANT_FIELDS, FLOW_ELEMENT_VARIANT_ICONS, FLOW_ERROR_FALLBACK_MESSAGE, FLOW_ERROR_HTTP_STATUS, FLOW_NAME_PATTERN, FLOW_NODE_COLLECTIONS, FLOW_NODE_HEIGHT, FLOW_NODE_WIDTH, FLOW_RESOURCE_COLLECTIONS, FLOW_VALUE_FIELDS, FLOW_VALUE_LITERAL_FIELDS, FieldAssignmentEditorComponent, FieldPickerComponent, FlowApiError, FlowBuilderApi, FlowBuilderComponent, FlowCanvasComponent, FlowCatalogStore, FlowDictionaryStore, FlowDocumentStore, FlowEditorSession, FlowLayoutService, FlowValidationStore, FormulaEditorComponent, FormulaValidationService, HttpFlowBuilderApi, NamePickerComponent, NodeInspectorBase, ORCHESTRATION_CONDITION_OUTPUT, ObjectPickerComponent, OrchestratedStageInspectorComponent, ParameterEditorComponent, ProblemsPanelComponent, RecordFilterEditorComponent, ReferencePickerComponent, ResourcePanelComponent, SEVERITY_BUCKETS, SEVERITY_ICON, SEVERITY_LABEL, START_NODE_NAME, SelectValueDirective, StartInspectorComponent, StructureMemberPickerComponent, StructurePickerComponent, TYPES_WITH_AUTOMATIC_OUTPUT, TYPE_BY_COLLECTION, UNSUPPORTED_TYPES, ValueEditorComponent, VersionPanelComponent, allFieldsOf, areTypesComparable, canvasNodeId, checkConditionLogic, checkFlowName, describePathEntry, duplicateField, elementIcon, emptyFlowDefinition, fieldAt, filterReferences, flattenFields, flowNodeWidth, flowNodeWidthClass, insertField, isCustomConditionLogic, isEmptyReferenceFilter, isFieldResource, isGlobalReference, isNumericType, isPathInside, isTypeCheckedOperator, isValidFlowName, isValued, loadPathLevel, matchesReferenceFilter, moveCondition, moveField, navigatePath, outletByKey, outletsOf, parseCanvasNodeId, parseInvariantNumber, parseSourceConnectorId, parseTargetConnectorId, pathAvailableNames, pathContainerLabel, pathKey, pathNotVerifiableMessage, referenceRoot, remapConditionLogic, removeCondition, removeField, resolvePath, samePath, screenFieldNames, severityBucket, slugifyFlowName, sourceConnectorId, stageStepNames, stageStepOutputReferenced, stepsOf, targetConnectorId, uniqueFlowName, valuedFieldOf, valuedFieldsOf, variantFieldOf, variantOf, variantPresetOf };
5038
+ export type { FieldAssignmentHolder, FilterHolder, FlowActionCall, FlowAnyNode, FlowAssignment, FlowAssignmentItem, FlowAssignmentOperator, FlowAssignmentOperatorEntry, FlowBuilderHttpConfig, FlowCanvasEdge, FlowCanvasNode, FlowCatalogEntry, FlowCatalogParameter, FlowChoice, FlowCloneRequest, FlowCollectionProcessor, FlowCollectionProcessorType, FlowComparisonOperator, FlowComparisonOperatorEntry, FlowCondition, FlowConditionHolder, FlowConditionLogic, FlowConflictState, FlowConnectionKind, FlowConnector, FlowConnectorTarget, FlowConstant, FlowCreateRequest, FlowCustomError, FlowCustomErrorMessage, FlowCustomProperty, FlowDataType, FlowDataTypeEntry, FlowDecision, FlowDecisionRule, FlowDefinition, FlowDictionaries, FlowDictionaryEntry, FlowDynamicChoiceSet, FlowDynamicScreen, FlowEdge, FlowElementType, FlowElementTypeEntry, FlowEnumValue, FlowErrorCategory, FlowExportQuery, FlowFieldDescription, FlowFieldUsage, FlowFieldValue, FlowFormKind, FlowFormula, FlowFormulaIssue, FlowFormulaUsage, FlowFormulaValidationRequest, FlowFormulaValidationResult, FlowGlobalVariableEntry, FlowInputFieldAssignment, FlowInputParameter, FlowInterviewResult, FlowInterviewStatus, FlowIssueSeverity, FlowLayoutDirection, FlowLayoutNodeInput, FlowLayoutOptions, FlowLayoutResult, FlowListQuery, FlowLoop, FlowNameCheck, FlowNameProblem, FlowNewVersionRequest, FlowNodeBase, FlowNodeCollection, FlowNodeRef, FlowObjectDescription, FlowObjectSummary, FlowOffsetUnit, FlowOrchestratedStage, FlowOutlet, FlowOutline, FlowOutlineConnection, FlowOutlineNode, FlowOutputFieldAssignment, FlowOutputParameter, FlowPalettePick, FlowPendingScreen, FlowProcessType, FlowRecordCreate, FlowRecordDelete, FlowRecordFilter, FlowRecordFilterOperator, FlowRecordLookup, FlowRecordRollback, FlowRecordTriggerType, FlowRecordUpdate, FlowRecordValue, FlowReference, FlowReferenceFilter, FlowReferenceKind, FlowRegionContainerType, FlowResourceCollection, FlowResourceKindEntry, FlowResourceRef, FlowResumeRequest, FlowSaveRequest, FlowSaveResult, FlowSchedule, FlowScheduledPath, FlowScreen, FlowScreenField, FlowScreenFieldInputsRevisited, FlowScreenFieldNode, FlowScreenFieldPath, FlowScreenFieldType, FlowScreenFieldTypeEntry, FlowScreenNavigation, FlowScreenResponseRequest, FlowScreenValidationRule, FlowScriptPluginCall, FlowSeverityBucket, FlowSortOption, FlowSortOrder, FlowStage, FlowStageStep, FlowStageStepActionType, FlowStageStepAssignee, FlowStageStepConditionActionType, FlowStageStepRequest, FlowStageStepState, FlowStageStepStatus, FlowStageStepTypeEntry, FlowStart, FlowStartInterviewRequest, FlowStructureDescribed, FlowStructureDescription, FlowStructureInstance, FlowStructureMember, FlowSubflow, FlowSubflowInputAssignment, FlowSubflowOutputAssignment, FlowSummary, FlowTextTemplate, FlowTraceEntry, FlowTransactionModel, FlowTransform, FlowTransformType, FlowTransformValue, FlowTransformValueAction, FlowTriggerType, FlowTypedEntry, FlowTypedValue, FlowUnsupportedNode, FlowValidationIssue, FlowValidationResult, FlowValue, FlowVariable, FlowVersionStatus, FlowVersionSummary, FlowWait, FlowWaitEvent, NamePickerOption, PaletteGroup, PaletteItem, ParameterHolder, PathCatalog, PathContainer, PathContainerKind, PathEntry, PathLevel, PathLevelStatus, PathNavigation, PathNavigationRequest, PathResolution, PathStopReason, StructureMemberUsage, ValueMode };