@esfaenza/flow-builder 20.3.2 → 20.3.4

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
@@ -13,8 +13,13 @@ import { EFMarkerType, EFConnectableSide } from '@foblex/flow';
13
13
  * - gli enum sono stringhe, ma i tipi sono aperti (`| string`) perche' gli elenchi
14
14
  * autoritativi arrivano da `GET /flows/dictionaries` e possono crescere (§13.11).
15
15
  */
16
- /** §4.2 — i sette tipi del sistema. Aperto: il dizionario `dataTypes` e' autoritativo. */
17
- type FlowDataType = 'String' | 'Integer' | 'Number' | 'Date' | 'Boolean' | 'Enum' | 'Object' | string;
16
+ /**
17
+ * §4.2 gli otto tipi del sistema. Aperto: il dizionario `dataTypes` e' autoritativo.
18
+ *
19
+ * `Structure` non e' un doppione di `Object` (§4.7): di un `Object` non record il flow non sa
20
+ * nulla oltre a trasportarlo, di una `Structure` legge e scrive i **membri**.
21
+ */
22
+ type FlowDataType = 'String' | 'Integer' | 'Number' | 'Date' | 'Boolean' | 'Enum' | 'Object' | 'Structure' | string;
18
23
  type FlowProcessType = 'Screen' | 'AutoLaunched' | 'Evaluation' | 'Orchestration' | string;
19
24
  type FlowVersionStatus = 'Draft' | 'InvalidDraft' | 'UnderReview' | 'Active' | 'Obsolete' | string;
20
25
  type FlowTriggerType = 'None' | 'RecordBeforeSave' | 'RecordAfterSave' | 'RecordBeforeDelete' | 'Scheduled' | 'Event' | string;
@@ -28,6 +33,9 @@ type FlowTransactionModel = 'Automatic' | 'CurrentTransaction' | 'NewTransaction
28
33
  * §4.2 — un riferimento **oppure** un valore letterale.
29
34
  * Va valorizzato **uno e un solo** campo; `formulaExpression` e' l'unica eccezione
30
35
  * (espressione + tipo atteso). Piu' campi insieme = `VALUE_AMBIGUOUS`.
36
+ *
37
+ * Non esiste un `structureValue` e non ci sara' (§4.7): un'istanza di classe nasce dal runtime
38
+ * e nel metadata si cita solo per riferimento, come un record.
31
39
  */
32
40
  interface FlowValue {
33
41
  elementReference?: string;
@@ -98,7 +106,11 @@ interface FlowVariable {
98
106
  name?: string;
99
107
  description?: string;
100
108
  dataType?: FlowDataType;
101
- /** Obbligatorio per `Object` ed `Enum`: nome dell'entita' o del tipo di enum. */
109
+ /**
110
+ * Obbligatorio per `Object`, `Enum` e `Structure`: nome dell'entita', del tipo di enum o
111
+ * della classe. Su una `Structure` la sua assenza e' un **errore** (`OBJECT_TYPE_MISSING`),
112
+ * non un avviso: senza il nome della classe il runtime non ha nulla da istanziare (§4.7).
113
+ */
102
114
  objectType?: string;
103
115
  isCollection?: boolean;
104
116
  isInput?: boolean;
@@ -348,6 +360,10 @@ interface FlowCustomError extends FlowNodeBase {
348
360
  /** §5.12 */
349
361
  interface FlowTransformValueAction {
350
362
  transformType?: FlowTransformType;
363
+ /**
364
+ * Il campo di destinazione, oppure — se il target e' una `Structure` — il nome del
365
+ * **membro** della classe (§5.12, §4.7).
366
+ */
351
367
  outputFieldApiName?: string;
352
368
  value?: FlowValue;
353
369
  inputParameters?: FlowInputParameter[];
@@ -539,10 +555,19 @@ interface FlowDictionaryEntry {
539
555
  }
540
556
  interface FlowDataTypeEntry extends FlowDictionaryEntry {
541
557
  value: FlowDataType;
542
- /** `Object` ed `Enum` richiedono `objectType` (§4.6). */
558
+ /**
559
+ * `Object`, `Enum` e `Structure` richiedono `objectType` (§4.6). Su una `Structure` la sua
560
+ * assenza e' un errore e non un avviso: vedi {@link isStructure} e §4.7.
561
+ */
543
562
  requiresObjectType?: boolean;
544
563
  /** `scale` si applica solo ai numerici (§4.6). */
545
564
  supportsScale?: boolean;
565
+ /**
566
+ * §4.7 — il tipo e' un'istanza di classe: `objectType` porta il nome della classe, i valori
567
+ * proponibili arrivano da `listStructures()` e i suoi **membri** da
568
+ * `describeStructure()`. Non ha una forma letterale con cui esprimersi.
569
+ */
570
+ isStructure?: boolean;
546
571
  }
547
572
  /** §3.2 — la voce che descrive un tipo di elemento. */
548
573
  interface FlowElementTypeEntry extends FlowDictionaryEntry {
@@ -658,20 +683,69 @@ interface FlowFieldDescription {
658
683
  label?: string | null;
659
684
  dataType?: FlowDataType;
660
685
  objectType?: string | null;
686
+ /**
687
+ * `false` → non si puo' filtrare su questo campo. Non e' un dettaglio: la chiave di
688
+ * un'entita' con chiave composta puo' essere **non filtrabile** (porta la forma canonica
689
+ * della chiave), e il filtro «per identificativo» va scritto una colonna alla volta (§5.7).
690
+ */
661
691
  isFilterable?: boolean;
662
692
  isSortable?: boolean;
693
+ /** Aggiornabile da un Update: altrimenti `FIELD_NOT_UPDATEABLE` (§5.7). */
663
694
  isUpdateable?: boolean;
695
+ /**
696
+ * Valorizzabile da un Create: altrimenti `FIELD_NOT_CREATEABLE` (§5.7). **Non** e' lo stesso
697
+ * insieme di `isUpdateable` — la colonna di una chiave naturale la scrive chi crea il record
698
+ * e non si cambia dopo, un identificativo generato dal database e' l'opposto.
699
+ */
700
+ isCreateable?: boolean;
664
701
  isRequired?: boolean;
665
702
  /** `true` → i valori ammessi si chiedono a `.../fields/{field}/values`. */
666
703
  hasClosedValueSet?: boolean;
667
704
  }
668
- /** `any` | `filterable` | `sortable` | `updateable` (§6.4). */
669
- type FlowFieldUsage = 'any' | 'filterable' | 'sortable' | 'updateable';
705
+ /** `any` | `filterable` | `sortable` | `updateable` | `createable` (§6.4). */
706
+ type FlowFieldUsage = 'any' | 'filterable' | 'sortable' | 'updateable' | 'createable';
670
707
  interface FlowFieldValue {
671
708
  value: string;
672
709
  label?: string | null;
673
710
  }
674
- /** Voce di catalogo per action, script, form, eventi, tipi di enum. */
711
+ /**
712
+ * §4.7 — un membro di una classe utilizzabile come `Structure`.
713
+ *
714
+ * È l'analogo di {@link FlowFieldDescription} per le classi, e la colonna che conta e'
715
+ * `isWritable`: un membro calcolato (una property senza setter) si legge in una condizione ma
716
+ * assegnarlo e' `TARGET_NOT_WRITABLE`. Nei campi che chiedono una **destinazione** si propongono
717
+ * quindi solo i membri scrivibili.
718
+ */
719
+ interface FlowStructureMember {
720
+ name: string;
721
+ label?: string | null;
722
+ description?: string | null;
723
+ dataType?: FlowDataType;
724
+ isCollection?: boolean;
725
+ /** Per un membro `Object`, `Enum` o `Structure`: l'entita', l'enum o la classe annidata. */
726
+ objectType?: string | null;
727
+ isWritable?: boolean;
728
+ }
729
+ /**
730
+ * §4.7.1 — la risposta di `GET /catalog/structures/{className}/members`: **non** un array di
731
+ * membri, ma la descrizione della classe con l'array sotto `members`.
732
+ *
733
+ * L'involucro porta la `label` della classe, che l'array nudo perderebbe e che serve
734
+ * all'intestazione dell'elenco dei membri; `className` e' ridondante rispetto al path e rende la
735
+ * risposta autoconsistente se finisce in cache. `members` e' **piatto e non ricorsivo**: un membro
736
+ * di tipo `Structure` porta la classe annidata in `objectType` e i suoi membri sono una seconda
737
+ * chiamata, altrimenti una classe che si referenzia renderebbe la risposta infinita.
738
+ */
739
+ interface FlowStructureDescription {
740
+ className?: string;
741
+ label?: string | null;
742
+ /**
743
+ * Vuoto significa **membri non dichiarati**, non "classe inesistente": quella e' un 404, e le
744
+ * due cose portano a comportamenti opposti (digitare a mano contro segnalare la classe).
745
+ */
746
+ members?: FlowStructureMember[];
747
+ }
748
+ /** Voce di catalogo per action, script, form, eventi, tipi di enum, classi. */
675
749
  interface FlowCatalogEntry {
676
750
  name: string;
677
751
  label?: string | null;
@@ -852,10 +926,35 @@ type FlowInterviewStatus = 'Completed' | 'WaitingForScreen' | 'Paused' | 'Suspen
852
926
  /** I criteri dello Start non erano soddisfatti: non e' un errore (§6.5). */
853
927
  | 'NotStarted' | string;
854
928
  type FlowScreenNavigation = 'Next' | 'Previous' | 'Pause' | 'Finish' | string;
855
- /** Il tipo dichiarato **vince** in lettura: distingue `Integer` da `Number` (§6.5). */
929
+ /** §6.5 un record dentro un valore tipizzato: forma propria, non `value`. */
930
+ interface FlowRecordValue {
931
+ objectType?: string;
932
+ id?: string | null;
933
+ fields?: Record<string, unknown>;
934
+ }
935
+ /**
936
+ * §4.7, §6.5 — un'istanza di classe: `className` piu' i **membri**, ognuno a sua volta un
937
+ * valore tipizzato. È la stessa forma in lettura e in scrittura: passando un'istanza come input
938
+ * si scrive `className` e i soli membri che si vogliono valorizzare.
939
+ */
940
+ interface FlowStructureInstance {
941
+ className?: string;
942
+ members?: Record<string, FlowTypedValue>;
943
+ }
944
+ /**
945
+ * Il tipo dichiarato **vince** in lettura: distingue `Integer` da `Number` (§6.5).
946
+ *
947
+ * Due tipi hanno una forma propria invece di `value`: un record (`record`) e un'istanza di
948
+ * classe (`instance`). Chi legge guarda `type` e poi il campo giusto — un `Structure` con
949
+ * `value` valorizzato non esiste.
950
+ */
856
951
  interface FlowTypedValue {
857
952
  type?: FlowDataType;
858
953
  value?: unknown;
954
+ /** Con `type: 'Object'` su un record (§6.5). */
955
+ record?: FlowRecordValue;
956
+ /** Con `type: 'Structure'` (§4.7). */
957
+ instance?: FlowStructureInstance;
859
958
  }
860
959
  interface FlowPendingScreen {
861
960
  elementName?: string;
@@ -975,7 +1074,15 @@ type FlowErrorCategory =
975
1074
  /** Qualcun altro ha salvato: proponi ricarica (§9). */
976
1075
  | 'VersionConflict'
977
1076
  /** Funzione non configurata su questo ambiente: disabilita il comando. */
978
- | 'MissingService' | 'InvalidToken' | 'InterviewNotFound'
1077
+ | 'MissingService'
1078
+ /**
1079
+ * §4.7.1 — classe non registrata (o `IStructureMgr` assente sull'host): il 404 dei membri di
1080
+ * una classe. **Non e' una lista vuota**: quella dice "membri non dichiarati" e lascia
1081
+ * digitare il nome, questa dice "classe sconosciuta" e va segnalata sulla risorsa
1082
+ * (`STRUCTURE_TYPE_UNKNOWN`). Categoria propria perche' altrimenti un 404 ricadrebbe su
1083
+ * `FlowNotFound`, che qui vorrebbe dire una cosa diversa e falsa.
1084
+ */
1085
+ | 'StructureNotFound' | 'InvalidToken' | 'InterviewNotFound'
979
1086
  /** Fallback per un errore di trasporto non categorizzato. */
980
1087
  | 'Unknown' | string;
981
1088
  /** L'errore che ogni primitiva puo' rifiutare (§6, §10). */
@@ -1121,6 +1228,38 @@ declare abstract class FlowBuilderApi {
1121
1228
  abstract listFormParameters(formName: string): Promise<FlowCatalogParameter[]>;
1122
1229
  /** `GET /catalog/enum-types` — per `objectType` delle risorse `Enum`. */
1123
1230
  abstract listEnumTypes(): Promise<FlowCatalogEntry[]>;
1231
+ /**
1232
+ * `GET /catalog/structures` — le classi utilizzabili come `objectType` di una risorsa
1233
+ * `Structure` (§4.7). È un **elenco di classi** nella forma di ogni altro catalogo: i membri
1234
+ * non ci sono, si chiedono con {@link describeStructure} (§4.7.1).
1235
+ *
1236
+ * Opzionale di proposito: un ambiente che non la espone non deve rompersi. L'effetto e' che le
1237
+ * classi non sono verificabili — elenco vuoto significa "non lo so", non "nessuna" — e il nome
1238
+ * si scrive a mano, esattamente come per un catalogo non popolato (§7).
1239
+ */
1240
+ listStructures(): Promise<FlowCatalogEntry[]>;
1241
+ /**
1242
+ * `GET /catalog/structures/{className}/members` — la **descrizione** di una classe: l'analogo di
1243
+ * `listFields` per le `Structure` (§4.7). Si chiama `describeStructure` e non
1244
+ * `listStructureMembers` perche' la risposta non e' un elenco: e' un oggetto con `className`,
1245
+ * `label` e l'array sotto `members` (§4.7.1, `IStructureMgr.DescribeStructure`).
1246
+ *
1247
+ * `members` e' **piatto**: nessuna paginazione e **nessun membro annidato** — un membro di tipo
1248
+ * `Structure` porta la classe in `objectType` e i suoi membri si chiedono con una seconda
1249
+ * chiamata. La risposta e' non ricorsiva di proposito: una classe che si referenzia sarebbe
1250
+ * infinita.
1251
+ *
1252
+ * `isWritable` e' la colonna che decide: nei campi che chiedono una **destinazione** si
1253
+ * propongono solo i membri scrivibili, perche' un membro calcolato si legge ma assegnarlo e'
1254
+ * `TARGET_NOT_WRITABLE`.
1255
+ *
1256
+ * **Tre esiti, non due** (§4.7.1): `members` popolato e' un elenco **autorevole** (fuori
1257
+ * elenco = `STRUCTURE_MEMBER_UNKNOWN`); `members` **vuoto** dice "membri non dichiarati" e il
1258
+ * nome del membro va lasciato digitare; un rifiuto `StructureNotFound` dice "classe non
1259
+ * registrata", ed e' la classe che va segnalata, non il membro. Chi implementa l'interfaccia
1260
+ * non deve appiattire il rifiuto in una descrizione vuota: sono cose diverse.
1261
+ */
1262
+ describeStructure(className: string): Promise<FlowStructureDescription>;
1124
1263
  /** `GET /catalog/events` — per gli eventi di un Wait. */
1125
1264
  abstract listEvents(): Promise<FlowCatalogEntry[]>;
1126
1265
  /**
@@ -1217,6 +1356,18 @@ declare class HttpFlowBuilderApi extends FlowBuilderApi {
1217
1356
  listForms(): Promise<FlowCatalogEntry[]>;
1218
1357
  listFormParameters(formName: string): Promise<FlowCatalogParameter[]>;
1219
1358
  listEnumTypes(): Promise<FlowCatalogEntry[]>;
1359
+ /** §4.7.1 — solo l'elenco delle classi: i membri **non** ci sono, si chiedono a parte. */
1360
+ listStructures(): Promise<FlowCatalogEntry[]>;
1361
+ /**
1362
+ * §4.7.1 — la descrizione della classe: `className`, `label` e i membri sotto `members`. Non e'
1363
+ * un array nudo, e leggerlo come tale darebbe zero membri senza un errore.
1364
+ *
1365
+ * Il 404 non e' `members: []`, e qui e' l'unico posto che lo sappia: senza questa traduzione
1366
+ * ricadrebbe su `FlowNotFound` («il flow non esiste piu’»), che sarebbe falso e indistinguibile
1367
+ * da "membri non dichiarati". Diventa `StructureNotFound`, e chi chiama decide: classe
1368
+ * sconosciuta = segnalare, lista vuota = lasciar digitare.
1369
+ */
1370
+ describeStructure(className: string): Promise<FlowStructureDescription>;
1220
1371
  listEvents(): Promise<FlowCatalogEntry[]>;
1221
1372
  listSubflowCandidates(excluding?: string): Promise<FlowSummary[]>;
1222
1373
  startInterview(request: FlowStartInterviewRequest): Promise<FlowInterviewResult>;
@@ -1294,10 +1445,45 @@ declare const TYPES_WITH_AUTOMATIC_OUTPUT: ReadonlySet<string>;
1294
1445
  */
1295
1446
  declare const FLOW_ELEMENT_ICONS: Record<string, string>;
1296
1447
  /**
1297
- * Il glifo del tipo. Per un tipo che il dizionario del backend aggiunge e questa mappa non
1298
- * conosce, l'iniziale dell'etichetta e' un segnaposto migliore di un simbolo generico.
1448
+ * Il glifo delle varianti (§5.5): due voci di palette dello stesso tipo con lo stesso simbolo
1449
+ * si distinguerebbero solo dall'etichetta, e sulla palette il simbolo e' la prima cosa che si
1450
+ * guarda. La chiave e' `tipo:variante`.
1451
+ */
1452
+ declare const FLOW_ELEMENT_VARIANT_ICONS: Record<string, string>;
1453
+ /**
1454
+ * Il glifo del tipo, o della sua variante quando c'e'. Per un tipo che il dizionario del
1455
+ * backend aggiunge e questa mappa non conosce, l'iniziale dell'etichetta e' un segnaposto
1456
+ * migliore di un simbolo generico.
1457
+ */
1458
+ declare function elementIcon(type: string, label?: string, variant?: string): string;
1459
+
1460
+ /**
1461
+ * I tipi che sulla palette valgono per **piu' di una voce** — FRONTEND.md §5.5.
1462
+ *
1463
+ * Il Collection Processor e' un solo tipo di node con un discriminatore
1464
+ * (`collectionProcessorType`: `Sort` o `Filter`), e i campi rilevanti cambiano con esso: un
1465
+ * `Sort` vuole `sortOptions`, un `Filter` vuole condizioni. Sono due gesti diversi, e una
1466
+ * voce sola («ordina o filtra») costringe a scegliere dopo, dentro il form.
1467
+ *
1468
+ * Qui sta **solo** la mappa tipo → campo del discriminatore: i valori ammessi restano nel
1469
+ * dizionario del backend (`collectionProcessorTypes`), come per ogni altro enum (§6.4). Senza
1470
+ * quel dizionario il tipo torna a essere una voce sola, che e' il comportamento giusto quando
1471
+ * non si sa quali varianti esistano.
1472
+ *
1473
+ * Se un tipo nuovo arrivasse con lo stesso schema — un node con un discriminatore che ne
1474
+ * cambia i campi — si aggiunge una riga qui e la palette si divide da se'.
1475
+ */
1476
+ /** Tipo di elemento → campo del node che porta la variante. */
1477
+ declare const FLOW_ELEMENT_VARIANT_FIELDS: Record<string, string>;
1478
+ /** Il campo del discriminatore, se il tipo ne ha uno. */
1479
+ declare function variantFieldOf(type: string): string | undefined;
1480
+ /** La variante di un node già scritto, letta dal suo discriminatore. */
1481
+ declare function variantOf(type: string, node: Record<string, unknown>): string | undefined;
1482
+ /**
1483
+ * I campi da scrivere su un node appena creato dalla variante scelta. Vuoto per i tipi senza
1484
+ * varianti: chi crea l'elemento non deve sapere quali sono.
1299
1485
  */
1300
- declare function elementIcon(type: string, label?: string): string;
1486
+ declare function variantPresetOf(type: string, variant: string | undefined): Record<string, unknown>;
1301
1487
 
1302
1488
  /**
1303
1489
  * Nomi — FRONTEND.md §3.3, §13.5.
@@ -1634,6 +1820,15 @@ declare class FlowDictionaryStore {
1634
1820
  /** Le categorie della palette, nell'ordine di prima apparizione nel dizionario. */
1635
1821
  readonly paletteCategories: _angular_core.Signal<string[]>;
1636
1822
  elementType(value: string): FlowElementTypeEntry | undefined;
1823
+ /**
1824
+ * Le varianti di un tipo, cioe' i valori del suo discriminatore (§5.5). L'unico oggi e' il
1825
+ * Collection Processor. Elenco vuoto = tipo senza varianti, **oppure** dizionario non
1826
+ * disponibile: in entrambi i casi la palette mostra una voce sola, che e' l'unica cosa
1827
+ * onesta da fare quando non si sa quali varianti esistano.
1828
+ */
1829
+ variantsOf(type: string): FlowDictionaryEntry[];
1830
+ /** L'etichetta di una variante, con fallback sul valore grezzo. */
1831
+ variantLabelOf(type: string, variant: string | undefined): string;
1637
1832
  /** La collection in cui scrivere un node: `metadataProperty`, con fallback locale (§3.2). */
1638
1833
  collectionOf(type: string): FlowNodeCollection | undefined;
1639
1834
  /** Etichetta di un tipo, con fallback: un tipo sconosciuto mostra il proprio `value`. */
@@ -1673,13 +1868,48 @@ declare class FlowDictionaryStore {
1673
1868
  /** `stepInteractive` e `stepApproval` vogliono gli assegnatari (§5.13). */
1674
1869
  stageStepRequiresAssignees(actionType: string | undefined | null): boolean;
1675
1870
  dataType(value: string | undefined | null): FlowDataTypeEntry | undefined;
1676
- /** §4.6 — `Object` ed `Enum` richiedono `objectType`. */
1871
+ /** §4.6, §4.7 — `Object`, `Enum` e `Structure` richiedono `objectType`. */
1677
1872
  requiresObjectType(dataType: string | undefined | null): boolean;
1873
+ /**
1874
+ * §4.7 — il tipo e' un'istanza di classe. Il flag arriva dal dizionario (`isStructure`); il
1875
+ * fallback sul nome serve solo se il backend non lo dichiara.
1876
+ */
1877
+ isStructure(dataType: string | undefined | null): boolean;
1878
+ /**
1879
+ * §4.7 — su una `Structure` un `objectType` mancante **blocca l'attivazione**: e' un errore
1880
+ * (`OBJECT_TYPE_MISSING`), non un avviso, perche' il runtime non ha nulla da istanziare. La
1881
+ * differenza serve all'interfaccia, che deve mostrare i due casi con colori diversi.
1882
+ */
1883
+ objectTypeIsError(dataType: string | undefined | null): boolean;
1678
1884
  /** §4.6 — `scale` si applica solo ai numerici. */
1679
1885
  supportsScale(dataType: string | undefined | null): boolean;
1680
1886
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FlowDictionaryStore, never>;
1681
1887
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<FlowDictionaryStore>;
1682
1888
  }
1889
+ /**
1890
+ * §4.7.1 — la descrizione di una classe come la vede la UI: i membri, la `label` della classe che
1891
+ * arriva dall'involucro della risposta, e l'**esito**, che ha **tre** casi da non confondere:
1892
+ *
1893
+ * - `declared`: elenco **autorevole**. Si propongono solo questi, e un membro fuori elenco e'
1894
+ * `STRUCTURE_MEMBER_UNKNOWN`.
1895
+ * - `undeclared`: la classe e' valida ma `members` e' vuoto — i membri non sono dichiarati (un
1896
+ * host con `IStructureMgr` a registro esplicito). Tendina vuota, nome del membro
1897
+ * **digitabile**, e nessuna accusa: non si sa, non e' "sbagliato".
1898
+ * - `unknown-class`: 404, la classe non e' registrata. Non si propone e non si digita niente di
1899
+ * utile: e' la **classe** a essere segnalata (`STRUCTURE_TYPE_UNKNOWN`), una volta sulla
1900
+ * risorsa e non a ogni riferimento.
1901
+ * - `unknown-catalog`: la primitiva non c'e' o la richiesta e' fallita. Come `undeclared` per
1902
+ * la UI, ma per un motivo diverso, e non dice nulla sulla classe.
1903
+ *
1904
+ * Trattare il 404 come "nessun membro" farebbe digitare membri che il runtime rifiutera';
1905
+ * trattare `members: []` come un 404 renderebbe inutilizzabile una classe perfettamente valida.
1906
+ */
1907
+ interface FlowStructureDescribed {
1908
+ status: 'declared' | 'undeclared' | 'unknown-class' | 'unknown-catalog';
1909
+ members: FlowStructureMember[];
1910
+ /** La `label` della classe, quando la descrizione l'ha portata: `null` = ricadi sul nome. */
1911
+ label?: string | null;
1912
+ }
1683
1913
  declare class FlowCatalogStore {
1684
1914
  private readonly api;
1685
1915
  private readonly objectsCache;
@@ -1687,6 +1917,7 @@ declare class FlowCatalogStore {
1687
1917
  private readonly fieldValuesCache;
1688
1918
  private readonly entriesCache;
1689
1919
  private readonly parametersCache;
1920
+ private readonly membersCache;
1690
1921
  /**
1691
1922
  * Una lista vuota significa "non lo so", non "nessuno": con il catalogo non popolato la
1692
1923
  * validazione salta i controlli invece di produrre falsi allarmi (§7). L'editor fa lo
@@ -1706,6 +1937,22 @@ declare class FlowCatalogStore {
1706
1937
  listForms(): Promise<FlowCatalogEntry[]>;
1707
1938
  listFormParameters(formName: string): Promise<FlowCatalogParameter[]>;
1708
1939
  listEnumTypes(): Promise<FlowCatalogEntry[]>;
1940
+ /**
1941
+ * §4.7 — le classi utilizzabili come `objectType` di una `Structure`. La primitiva e'
1942
+ * opzionale: se l'ambiente non la espone, l'errore non si memoizza e l'elenco resta vuoto —
1943
+ * che significa "non lo so", e il nome della classe si scrive a mano.
1944
+ */
1945
+ listStructures(): Promise<FlowCatalogEntry[]>;
1946
+ /**
1947
+ * §4.7.1 — la descrizione di una classe, **con l'esito**: sono tre e non due, e appiattirli in
1948
+ * una lista vuota perde l'informazione che serve alla UI. Vedi {@link FlowStructureDescribed}.
1949
+ */
1950
+ describeStructure(className: string): Promise<FlowStructureDescribed>;
1951
+ /**
1952
+ * §4.7 — i soli membri, per chi non deve distinguere gli esiti. Chi mostra un avviso o accusa
1953
+ * un membro usa {@link describeStructure}: qui una lista vuota e' ambigua per costruzione.
1954
+ */
1955
+ listStructureMembers(className: string): Promise<FlowStructureMember[]>;
1709
1956
  listEvents(): Promise<FlowCatalogEntry[]>;
1710
1957
  /** Da chiamare se lo schema cambia sotto i piedi (raro, ma il comando esiste). */
1711
1958
  clear(): void;
@@ -2018,6 +2265,8 @@ declare class FlowCanvasComponent {
2018
2265
  /** Rilascio di un elemento dalla palette: tipo + punto nel sistema del canvas. */
2019
2266
  readonly elementDropped: _angular_core.OutputEmitterRef<{
2020
2267
  type: FlowElementType;
2268
+ /** La variante scelta sulla palette, dove il tipo ne ha (§5.5). */
2269
+ variant?: string;
2021
2270
  x: number;
2022
2271
  y: number;
2023
2272
  }>;
@@ -2068,7 +2317,11 @@ declare class FlowCanvasComponent {
2068
2317
  onDeleteSelected(event: {
2069
2318
  nodeIds: string[];
2070
2319
  }): void;
2071
- /** Rilascio di un elemento trascinato dalla palette. */
2320
+ /**
2321
+ * Rilascio di un elemento trascinato dalla palette. Il dato e' `{type, variant}`, ma si
2322
+ * accetta ancora la stringa nuda: un ospite che monta il canvas con una palette propria
2323
+ * potrebbe passare il solo tipo.
2324
+ */
2072
2325
  onCreateNode(event: {
2073
2326
  data: unknown;
2074
2327
  externalItemRect: {
@@ -2094,9 +2347,27 @@ declare class FlowCanvasComponent {
2094
2347
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<FlowCanvasComponent, "fb-flow-canvas", never, { "selectedName": { "alias": "selectedName"; "required": false; "isSignal": true; }; "outline": { "alias": "outline"; "required": false; "isSignal": true; }; }, { "selectionChange": "selectionChange"; "nodeOpened": "nodeOpened"; "nodeRemoveRequested": "nodeRemoveRequested"; "nodeDuplicateRequested": "nodeDuplicateRequested"; "elementDropped": "elementDropped"; }, never, never, true, never>;
2095
2348
  }
2096
2349
 
2350
+ /** Il gesto scelto sulla palette: un tipo e, dove esiste, la sua variante (§5.5). */
2351
+ interface FlowPalettePick {
2352
+ type: FlowElementType;
2353
+ variant?: string;
2354
+ }
2355
+ /**
2356
+ * Una voce della palette. Non coincide con una voce del dizionario: un tipo con varianti ne
2357
+ * produce una per variante, perche' «ordina» e «filtra» sono due gesti diversi anche se il
2358
+ * modello li scrive nello stesso node.
2359
+ */
2360
+ interface PaletteItem {
2361
+ /** Chiave stabile della voce: serve al `track` e all'id del trascinamento. */
2362
+ key: string;
2363
+ entry: FlowElementTypeEntry;
2364
+ variant?: string;
2365
+ label: string;
2366
+ data: FlowPalettePick;
2367
+ }
2097
2368
  interface PaletteGroup {
2098
2369
  category: string;
2099
- entries: FlowElementTypeEntry[];
2370
+ items: PaletteItem[];
2100
2371
  }
2101
2372
  declare class ElementPaletteComponent {
2102
2373
  private readonly dictionaries;
@@ -2106,23 +2377,29 @@ declare class ElementPaletteComponent {
2106
2377
  * prima che l'utente lo scopra dal pannello dei problemi.
2107
2378
  */
2108
2379
  readonly processType: _angular_core.InputSignal<string | undefined>;
2109
- readonly elementPicked: _angular_core.OutputEmitterRef<string>;
2380
+ readonly elementPicked: _angular_core.OutputEmitterRef<FlowPalettePick>;
2110
2381
  private readonly filter;
2382
+ /** Le voci, con i tipi a varianti già divisi: e' l'elenco che l'utente vede. */
2383
+ private readonly items;
2111
2384
  readonly groups: _angular_core.Signal<PaletteGroup[]>;
2112
2385
  readonly isEmpty: _angular_core.Signal<boolean>;
2113
2386
  onFilter(value: string): void;
2114
- pick(entry: FlowElementTypeEntry): void;
2387
+ pick(item: PaletteItem): void;
2115
2388
  /** Uno screen in un flow che non mostra nulla: si segnala, non si nasconde (§3.1). */
2116
- isIncompatible(entry: FlowElementTypeEntry): boolean;
2117
- incompatibleHint(entry: FlowElementTypeEntry): string | null;
2389
+ isIncompatible(item: PaletteItem): boolean;
2390
+ /**
2391
+ * Il testo del tooltip. Su una voce che nasce da una variante ci va anche il nome del tipo:
2392
+ * e' l'unico posto in cui si vede che «ordina» e «filtra» sono lo stesso elemento.
2393
+ */
2394
+ hintOf(item: PaletteItem): string;
2118
2395
  /** Lo stesso glifo che l'elemento avra' sul canvas, così il trascinamento e' prevedibile. */
2119
- iconOf(entry: FlowElementTypeEntry): string;
2396
+ iconOf(item: PaletteItem): string;
2120
2397
  /**
2121
2398
  * L'etichetta del ramo di fault, presa dalla mappa delle uscite invece di scrivere «ramo di
2122
2399
  * errore» per tutti: su uno stage di orchestrazione quel ramo **non** e' un guasto, e' lo step
2123
2400
  * rifiutato (§5.13). Un tipo nuovo eredita l'etichetta giusta senza toccare la palette.
2124
2401
  */
2125
- faultLabel(entry: FlowElementTypeEntry): string | null;
2402
+ faultLabel(item: PaletteItem): string | null;
2126
2403
  categoryClass(category: string): string;
2127
2404
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ElementPaletteComponent, never>;
2128
2405
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<ElementPaletteComponent, "fb-element-palette", never, { "processType": { "alias": "processType"; "required": false; "isSignal": true; }; }, { "elementPicked": "elementPicked"; }, never, never, true, never>;
@@ -2132,6 +2409,7 @@ declare class ReferencePickerComponent {
2132
2409
  private readonly api;
2133
2410
  private readonly store;
2134
2411
  private readonly dictionaries;
2412
+ private readonly catalog;
2135
2413
  readonly value: _angular_core.InputSignal<string | undefined>;
2136
2414
  readonly label: _angular_core.InputSignal<string>;
2137
2415
  readonly placeholder: _angular_core.InputSignal<string>;
@@ -2157,6 +2435,14 @@ declare class ReferencePickerComponent {
2157
2435
  readonly isOpen: _angular_core.WritableSignal<boolean>;
2158
2436
  readonly query: _angular_core.WritableSignal<string>;
2159
2437
  constructor();
2438
+ /**
2439
+ * §4.7 — la risorsa `Structure` da cui il valore corrente sta navigando, se c'e'. È quella
2440
+ * che rende i membri proponibili: senza classe non c'e' catalogo da interrogare.
2441
+ */
2442
+ readonly structureRoot: _angular_core.Signal<FlowReference | undefined>;
2443
+ private readonly members;
2444
+ /** I membri come riferimenti navigati: `Richiesta.Ragione`, col tipo del membro. */
2445
+ private readonly memberReferences;
2160
2446
  readonly options: _angular_core.Signal<FlowReference[]>;
2161
2447
  /** Le opzioni raggruppate per `kind`, così gli output automatici si distinguono. */
2162
2448
  readonly groups: _angular_core.Signal<{
@@ -2172,12 +2458,19 @@ declare class ReferencePickerComponent {
2172
2458
  * output automatico navigato): la validazione non verifica i percorsi con il punto,
2173
2459
  * quindi si accetta senza segnalare;
2174
2460
  * - `host`: scope del sistema ospite che **non dichiara percorsi**: non verificabile (§4.1);
2461
+ * - `member`: membro di una classe, esistente: qui il percorso **e'** verificato (§4.7);
2462
+ * - `memberUnknown`: la radice e' una `Structure` ma il membro non c'e': e'
2463
+ * `STRUCTURE_MEMBER_UNKNOWN`, e a differenza di un campo di record si sa per certo;
2464
+ * - `memberNotWritable`: il membro esiste, e' calcolato, e questo campo vuole una
2465
+ * destinazione: `TARGET_NOT_WRITABLE`;
2175
2466
  * - `unknown`: nessuna corrispondenza: si avvisa, senza bloccare. Ci finisce anche il
2176
2467
  * percorso inesistente di uno scope che i percorsi li dichiara, perche' lì il backend
2177
2468
  * risponderebbe `GLOBAL_UNKNOWN`.
2178
2469
  */
2179
- readonly valueState: _angular_core.Signal<"empty" | "known" | "navigated" | "host" | "unknown">;
2470
+ readonly valueState: _angular_core.Signal<"empty" | "known" | "navigated" | "host" | "member" | "memberUnknown" | "memberNotWritable" | "unknown">;
2180
2471
  readonly hint: _angular_core.Signal<string | null>;
2472
+ /** I due stati che sono errori e non avvisi: il colore deve dirlo. */
2473
+ readonly isHintError: _angular_core.Signal<boolean>;
2181
2474
  readonly errorMessage: _angular_core.Signal<string | null>;
2182
2475
  open(): void;
2183
2476
  close(): void;
@@ -2255,7 +2548,7 @@ declare class FieldPickerComponent {
2255
2548
  readonly isRelationPath: _angular_core.Signal<boolean>;
2256
2549
  readonly isUnknown: _angular_core.Signal<boolean>;
2257
2550
  /** L'avviso dipende dall'uso: un campo puo' esistere e non essere filtrabile. */
2258
- readonly unknownMessage: _angular_core.Signal<"Questo campo non e’ fra quelli filtrabili dell’oggetto." | "Questo campo non e’ fra quelli su cui si puo’ ordinare." | "Questo campo non e’ fra quelli aggiornabili dell’oggetto." | "Questo campo non e’ fra quelli dell’oggetto.">;
2551
+ readonly unknownMessage: _angular_core.Signal<"Questo campo non e’ fra quelli filtrabili dell’oggetto." | "Questo campo non e’ fra quelli su cui si puo’ ordinare." | "Questo campo non e’ fra quelli aggiornabili dell’oggetto." | "Questo campo non e’ fra quelli valorizzabili alla creazione." | "Questo campo non e’ fra quelli dell’oggetto.">;
2259
2552
  readonly describeValue: _angular_core.Signal<string | null>;
2260
2553
  readonly loadErrored: _angular_core.Signal<boolean>;
2261
2554
  open(): void;
@@ -2282,6 +2575,12 @@ declare class NamePickerComponent {
2282
2575
  readonly disabled: _angular_core.InputSignal<boolean>;
2283
2576
  /** Il testo dell'avviso sul nome fuori elenco: dipende da cosa si sta scegliendo. */
2284
2577
  readonly unknownMessage: _angular_core.InputSignal<string>;
2578
+ /**
2579
+ * La gravita' dell'avviso. Non e' cosmetica: un'action o un form che non esistono sono
2580
+ * **errori** che bloccano l'attivazione (`ACTION_UNKNOWN`, `FORM_UNKNOWN`), mentre un flow
2581
+ * senza versione attiva e' un avviso. Mostrarli con lo stesso colore direbbe il falso.
2582
+ */
2583
+ readonly unknownSeverity: _angular_core.InputSignal<"error" | "warn">;
2285
2584
  /** Cosa dire quando l'elenco e' vuoto: e' il caso "non lo so", non un errore. */
2286
2585
  readonly emptyMessage: _angular_core.InputSignal<string>;
2287
2586
  /** Testo monospazio: i nomi tecnici si leggono meglio, ed e' come li mostra il resto del form. */
@@ -2303,7 +2602,86 @@ declare class NamePickerComponent {
2303
2602
  clear(): void;
2304
2603
  describe(option: NamePickerOption): string;
2305
2604
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NamePickerComponent, never>;
2306
- 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; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "isMono": { "alias": "isMono"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
2605
+ 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>;
2606
+ }
2607
+
2608
+ declare class StructurePickerComponent {
2609
+ private readonly catalog;
2610
+ readonly value: _angular_core.InputSignal<string | undefined>;
2611
+ readonly label: _angular_core.InputSignal<string>;
2612
+ readonly placeholder: _angular_core.InputSignal<string>;
2613
+ readonly disabled: _angular_core.InputSignal<boolean>;
2614
+ readonly valueChange: _angular_core.OutputEmitterRef<string | undefined>;
2615
+ private readonly structures;
2616
+ constructor();
2617
+ readonly options: _angular_core.Signal<NamePickerOption[]>;
2618
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StructurePickerComponent, never>;
2619
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StructurePickerComponent, "fb-structure-picker", never, { "value": { "alias": "value"; "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>;
2620
+ }
2621
+
2622
+ /** `any` per un membro da leggere, `writable` per una destinazione. */
2623
+ type StructureMemberUsage = 'any' | 'writable';
2624
+ declare class StructureMemberPickerComponent {
2625
+ private readonly catalog;
2626
+ readonly value: _angular_core.InputSignal<string | undefined>;
2627
+ /** La classe di cui elencare i membri: senza classe non c'e' catalogo. */
2628
+ readonly className: _angular_core.InputSignal<string | undefined>;
2629
+ readonly usage: _angular_core.InputSignal<StructureMemberUsage>;
2630
+ readonly label: _angular_core.InputSignal<string>;
2631
+ readonly placeholder: _angular_core.InputSignal<string>;
2632
+ readonly disabled: _angular_core.InputSignal<boolean>;
2633
+ readonly valueChange: _angular_core.OutputEmitterRef<string | undefined>;
2634
+ /**
2635
+ * §4.7.1 — non basta l'elenco: serve l'**esito**. Elenco vuoto perche' i membri non sono
2636
+ * dichiarati (si digita a mano) e classe non registrata (non c'e' niente da digitare) hanno
2637
+ * la stessa lista e messaggi opposti.
2638
+ */
2639
+ private readonly result;
2640
+ private readonly members;
2641
+ readonly isOpen: _angular_core.WritableSignal<boolean>;
2642
+ /** Il testo digitato mentre il pannello e' aperto: filtra l'elenco. */
2643
+ private readonly query;
2644
+ constructor();
2645
+ readonly text: _angular_core.Signal<string>;
2646
+ /** Con `usage="writable"` i membri di sola lettura non si propongono affatto. */
2647
+ readonly available: _angular_core.Signal<FlowStructureMember[]>;
2648
+ readonly options: _angular_core.Signal<FlowStructureMember[]>;
2649
+ /**
2650
+ * Come chiamare la classe: la `label` la porta l'involucro della descrizione, ed e' il motivo
2651
+ * per cui l'involucro esiste (§4.7.1). Assente, si mostra il nome della classe.
2652
+ */
2653
+ readonly classLabel: _angular_core.Signal<string>;
2654
+ /** Elenco autorevole: solo qui un membro fuori elenco e' un errore (§4.7.1). */
2655
+ readonly hasCatalog: _angular_core.Signal<boolean>;
2656
+ /** 404: la classe non e' registrata. Il nome del membro non c'e' modo di indovinarlo. */
2657
+ readonly isClassUnknown: _angular_core.Signal<boolean>;
2658
+ /** Classe valida, membri non dichiarati: si digita, e non si segnala niente. */
2659
+ readonly isUndeclared: _angular_core.Signal<boolean>;
2660
+ /** Il primo segmento: e' l'unico che si puo' verificare (§4.7). */
2661
+ private readonly firstSegment;
2662
+ /** `true` se il valore naviga dentro un membro: oltre il primo segmento non si verifica. */
2663
+ readonly isNestedPath: _angular_core.Signal<boolean>;
2664
+ private readonly declared;
2665
+ readonly isUnknown: _angular_core.Signal<boolean>;
2666
+ /** Il messaggio elenca i disponibili: dire solo "non esiste" non aiuta a correggere. */
2667
+ readonly unknownMessage: _angular_core.Signal<string>;
2668
+ /**
2669
+ * Un membro che esiste ma non e' scrivibile, scelto dove serve una destinazione: capita su un
2670
+ * documento scritto altrove, e va detto qui invece di lasciarlo scoprire dall'attivazione.
2671
+ */
2672
+ readonly isNotWritable: _angular_core.Signal<boolean>;
2673
+ readonly describeValue: _angular_core.Signal<string | null>;
2674
+ /** Catalogo assente per un motivo che non riguarda la classe: "non lo so". */
2675
+ readonly loadErrored: _angular_core.Signal<boolean>;
2676
+ open(): void;
2677
+ close(): void;
2678
+ toggle(): void;
2679
+ onInput(text: string): void;
2680
+ choose(member: FlowStructureMember): void;
2681
+ clear(): void;
2682
+ describe(member: FlowStructureMember): string;
2683
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StructureMemberPickerComponent, never>;
2684
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StructureMemberPickerComponent, "fb-structure-member-picker", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "className": { "alias": "className"; "required": false; "isSignal": true; }; "usage": { "alias": "usage"; "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>;
2307
2685
  }
2308
2686
 
2309
2687
  /** Le modalita' offerte: una per campo del modello. */
@@ -2329,13 +2707,19 @@ declare class ValueEditorComponent {
2329
2707
  */
2330
2708
  readonly filledFieldCount: _angular_core.Signal<number>;
2331
2709
  readonly isAmbiguous: _angular_core.Signal<boolean>;
2332
- /** Il campo del valore che corrisponde al `dataType` (§4.2, tabella dei sette tipi). */
2710
+ /**
2711
+ * Il campo del valore che corrisponde al `dataType` (§4.2, tabella degli otto tipi). `Object` e
2712
+ * `Structure` non ci sono: si passano per riferimento, e {@link literalAllowed} li esclude.
2713
+ */
2333
2714
  readonly literalField: _angular_core.Signal<keyof FlowValue>;
2334
2715
  /**
2335
2716
  * `Object` non ha un campo letterale: un record si passa per riferimento (§4.2).
2336
- * Lo stesso vale per una collection.
2717
+ * Lo stesso vale per una collection e per una `Structure`, che non ha un `structureValue` e
2718
+ * non lo avra': un'istanza nasce dal runtime e nel metadata si cita per riferimento (§4.7).
2337
2719
  */
2338
2720
  readonly literalAllowed: _angular_core.Signal<boolean>;
2721
+ /** §4.7 — la destinazione e' un'istanza di classe: si passa per riferimento e basta. */
2722
+ readonly isStructureTarget: _angular_core.Signal<boolean>;
2339
2723
  readonly literalInputType: _angular_core.Signal<string>;
2340
2724
  readonly literalText: _angular_core.Signal<string>;
2341
2725
  readonly booleanValue: _angular_core.Signal<boolean>;
@@ -2407,7 +2791,7 @@ declare class ConditionEditorComponent {
2407
2791
  */
2408
2792
  hasTypeMismatch(condition: FlowCondition): boolean;
2409
2793
  typeMismatchMessage(condition: FlowCondition): string;
2410
- readonly logicMode: _angular_core.Signal<"and" | "or" | "custom" | "formula">;
2794
+ readonly logicMode: _angular_core.Signal<"and" | "or" | "formula" | "custom">;
2411
2795
  readonly customLogic: _angular_core.Signal<string>;
2412
2796
  /** Feedback immediato sull'espressione: la verita' resta della validazione backend. */
2413
2797
  readonly customLogicError: _angular_core.Signal<string | null>;
@@ -2475,13 +2859,21 @@ declare class RecordFilterEditorComponent {
2475
2859
  * (§5.7, §13.10).
2476
2860
  */
2477
2861
  readonly emptyWarning: _angular_core.InputSignal<string | null>;
2478
- readonly emptyWarningSeverity: _angular_core.InputSignal<"warn" | "error">;
2862
+ readonly emptyWarningSeverity: _angular_core.InputSignal<"error" | "warn">;
2479
2863
  readonly changed: _angular_core.OutputEmitterRef<(holder: FilterHolder) => void>;
2480
2864
  private readonly fields;
2865
+ /** Tutti i campi, filtrabili o no: serve solo a riconoscere le chiavi composte (§5.7). */
2866
+ private readonly allFields;
2481
2867
  readonly filters: _angular_core.Signal<FlowRecordFilter[]>;
2482
2868
  readonly operators: _angular_core.Signal<_esfaenza_flow_builder.FlowDictionaryEntry[]>;
2483
2869
  constructor();
2484
- readonly logicMode: _angular_core.Signal<"and" | "or" | "custom" | "formula">;
2870
+ /**
2871
+ * §5.7 — l'identificativo esiste ma **non e' filtrabile**: e' il caso di una chiave composta,
2872
+ * dove `Id` porta la forma canonica della chiave e le colonne filtrabili sono altre. Dirlo
2873
+ * evita la ricerca di un campo che nell'elenco non c'e' e non ci sara'.
2874
+ */
2875
+ readonly identifierNotFilterable: _angular_core.Signal<boolean>;
2876
+ readonly logicMode: _angular_core.Signal<"and" | "or" | "formula" | "custom">;
2485
2877
  readonly customLogic: _angular_core.Signal<string>;
2486
2878
  readonly showEmptyWarning: _angular_core.Signal<boolean>;
2487
2879
  addFilter(): void;
@@ -2525,11 +2917,18 @@ declare class ParameterEditorComponent {
2525
2917
  readonly hasCatalog: _angular_core.Signal<boolean>;
2526
2918
  readonly inputCatalog: _angular_core.Signal<FlowCatalogParameter[]>;
2527
2919
  readonly outputCatalog: _angular_core.Signal<FlowCatalogParameter[]>;
2920
+ /**
2921
+ * I candidati come li vuole il picker. Il tipo e l'obbligatorieta' finiscono nella
2922
+ * descrizione: nel `<select>` erano un asterisco muto, che non diceva quale valore ci sta.
2923
+ */
2924
+ readonly inputOptions: _angular_core.Signal<NamePickerOption[]>;
2925
+ readonly outputOptions: _angular_core.Signal<NamePickerOption[]>;
2528
2926
  /** Parametri obbligatori dichiarati dal catalogo e non ancora presenti. */
2529
2927
  readonly missingRequired: _angular_core.Signal<FlowCatalogParameter[]>;
2530
- /** Parametri presenti che il catalogo non conosce: sarebbero `PARAMETER_UNKNOWN`. */
2531
- unknownInput(parameter: FlowInputParameter): boolean;
2532
- unknownOutput(parameter: FlowOutputParameter): boolean;
2928
+ /**
2929
+ * Il parametro fuori catalogo (`PARAMETER_UNKNOWN`) lo segnala il picker, che ha in mano sia
2930
+ * l'elenco sia il valore. Qui resta la descrizione, che serve all'editor di valore.
2931
+ */
2533
2932
  describe(name: string | undefined): FlowCatalogParameter | undefined;
2534
2933
  addInput(name?: string): void;
2535
2934
  addOutput(name?: string): void;
@@ -2550,6 +2949,8 @@ declare class FieldAssignmentEditorComponent {
2550
2949
  private readonly catalog;
2551
2950
  readonly holder: _angular_core.InputSignal<FieldAssignmentHolder>;
2552
2951
  readonly object: _angular_core.InputSignal<string | undefined>;
2952
+ /** `createable` su un Create, `updateable` su un Update: lo decide il chiamante (§5.7). */
2953
+ readonly usage: _angular_core.InputSignal<FlowFieldUsage>;
2553
2954
  readonly title: _angular_core.InputSignal<string>;
2554
2955
  readonly disabledReason: _angular_core.InputSignal<string | null>;
2555
2956
  readonly changed: _angular_core.OutputEmitterRef<(holder: FieldAssignmentHolder) => void>;
@@ -2569,7 +2970,7 @@ declare class FieldAssignmentEditorComponent {
2569
2970
  */
2570
2971
  describe(name: string | undefined): FlowFieldDescription | undefined;
2571
2972
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FieldAssignmentEditorComponent, never>;
2572
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<FieldAssignmentEditorComponent, "fb-field-assignment-editor", never, { "holder": { "alias": "holder"; "required": true; "isSignal": true; }; "object": { "alias": "object"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "disabledReason": { "alias": "disabledReason"; "required": false; "isSignal": true; }; }, { "changed": "changed"; }, never, never, true, never>;
2973
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FieldAssignmentEditorComponent, "fb-field-assignment-editor", never, { "holder": { "alias": "holder"; "required": true; "isSignal": true; }; "object": { "alias": "object"; "required": false; "isSignal": true; }; "usage": { "alias": "usage"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "disabledReason": { "alias": "disabledReason"; "required": false; "isSignal": true; }; }, { "changed": "changed"; }, never, never, true, never>;
2573
2974
  }
2574
2975
 
2575
2976
  declare class ConnectorEditorComponent {
@@ -2882,6 +3283,16 @@ declare class ResourcePanelComponent {
2882
3283
  requiresObjectType(reference: FlowResourceRef): boolean;
2883
3284
  supportsScale(reference: FlowResourceRef): boolean;
2884
3285
  isEnum(reference: FlowResourceRef): boolean;
3286
+ /** §4.7 — un'istanza di classe: `objectType` e' il nome della classe, non di un'entita'. */
3287
+ isStructure(reference: FlowResourceRef): boolean;
3288
+ /**
3289
+ * §4.7 — una `Structure` non ha una forma letterale: nasce dal runtime come istanza vuota e i
3290
+ * membri si assegnano uno alla volta. Mostrare un campo «valore iniziale» prometterebbe una
3291
+ * cosa che il modello non sa esprimere.
3292
+ */
3293
+ supportsInitialValue(reference: FlowResourceRef): boolean;
3294
+ /** Su una `Structure` l'`objectType` mancante e' un errore, non un avviso (§4.7). */
3295
+ missingObjectType(reference: FlowResourceRef): boolean;
2885
3296
  /** Una costante che referenzia una risorsa e' `CONSTANT_REFERENCES_RESOURCE`. */
2886
3297
  constantReferencesResource(reference: FlowResourceRef): boolean;
2887
3298
  /** `stageOrder` duplicati: quale stage sia il corrente all'avvio diventa arbitrario. */
@@ -2950,6 +3361,9 @@ declare class DebugPanelComponent {
2950
3361
  private readonly api;
2951
3362
  private readonly store;
2952
3363
  private readonly session;
3364
+ private readonly dictionaries;
3365
+ private readonly catalog;
3366
+ constructor();
2953
3367
  readonly closed: _angular_core.OutputEmitterRef<void>;
2954
3368
  /** Chiede all'host di evidenziare l'elemento corrente dell'esecuzione. */
2955
3369
  readonly elementFocused: _angular_core.OutputEmitterRef<string>;
@@ -2963,6 +3377,14 @@ declare class DebugPanelComponent {
2963
3377
  readonly screenOutputs: _angular_core.WritableSignal<Record<string, string>>;
2964
3378
  /** Le variabili `isInput` del flow: il contratto verso chi lo invoca (§4.6). */
2965
3379
  readonly inputVariables: _angular_core.Signal<FlowVariable[]>;
3380
+ /**
3381
+ * §4.7 — i membri delle classi delle variabili `Structure` di input, per classe. Un'istanza si
3382
+ * compila un membro alla volta: non c'e' un letterale con cui scriverla in un campo solo.
3383
+ */
3384
+ private readonly membersByClass;
3385
+ /** I membri **scrivibili** di una classe: gli altri li calcola il backend. */
3386
+ membersOf(className: string | undefined): FlowStructureMember[];
3387
+ isStructureVariable(variable: FlowVariable): boolean;
2966
3388
  readonly canRun: _angular_core.Signal<boolean>;
2967
3389
  readonly status: _angular_core.Signal<string | null>;
2968
3390
  readonly pendingScreen: _angular_core.Signal<_esfaenza_flow_builder.FlowPendingScreen | null>;
@@ -2994,10 +3416,17 @@ declare class DebugPanelComponent {
2994
3416
  }[]>;
2995
3417
  /** I nomi degli output dichiarati dallo screen, per generare i campi da compilare. */
2996
3418
  readonly screenOutputNames: _angular_core.Signal<string[]>;
3419
+ /**
3420
+ * §6.5 — il tipo dichiarato vince, e due tipi hanno una forma propria invece di `value`: un
3421
+ * record e un'istanza di classe. Cercare `value` su un `Structure` mostrerebbe «—» pur avendo
3422
+ * i dati sotto gli occhi (§4.7).
3423
+ */
2997
3424
  private static render;
2998
3425
  setDebugEnabled(value: boolean): void;
2999
3426
  setInputValue(name: string, value: string): void;
3000
3427
  setScreenOutput(name: string, value: string): void;
3428
+ /** Converte un valore del form nel tipo dichiarato: il tipo vince, anche in scrittura (§6.5). */
3429
+ private static coerce;
3001
3430
  /** Converte i valori del form nel tipo dichiarato dalla variabile. */
3002
3431
  private coerceInputs;
3003
3432
  start(): Promise<void>;
@@ -3128,11 +3557,12 @@ declare class FlowBuilderComponent {
3128
3557
  /** Rilascio dalla palette: il punto di rilascio diventa `locationX`/`locationY` (§11). */
3129
3558
  onElementDropped(event: {
3130
3559
  type: FlowElementType;
3560
+ variant?: string;
3131
3561
  x: number;
3132
3562
  y: number;
3133
3563
  }): void;
3134
3564
  /** Click sulla palette: l'elemento si posiziona in una zona libera. */
3135
- onElementPicked(type: FlowElementType): void;
3565
+ onElementPicked(pick: FlowPalettePick): void;
3136
3566
  private createElement;
3137
3567
  onRemoveNode(name: string): void;
3138
3568
  onDuplicateNode(name: string): void;
@@ -3176,5 +3606,5 @@ declare class SelectValueDirective implements AfterViewChecked {
3176
3606
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<SelectValueDirective, "select[fbValue]", never, { "fbValue": { "alias": "fbValue"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
3177
3607
  }
3178
3608
 
3179
- export { ConditionEditorComponent, ConnectorEditorComponent, DebugPanelComponent, ElementDialogComponent, ElementInspectorComponent, ElementPaletteComponent, FALLBACK_COLLECTION_BY_TYPE, FALLBACK_TYPE_LABEL, FLOW_BUILDER_HTTP_CONFIG, FLOW_ELEMENT_ICONS, FLOW_ERROR_FALLBACK_MESSAGE, FLOW_ERROR_HTTP_STATUS, FLOW_NAME_PATTERN, FLOW_NODE_COLLECTIONS, FLOW_NODE_HEIGHT, FLOW_NODE_WIDTH, FLOW_RESOURCE_COLLECTIONS, 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, START_NODE_NAME, SelectValueDirective, StartInspectorComponent, TYPES_WITH_AUTOMATIC_OUTPUT, TYPE_BY_COLLECTION, UNSUPPORTED_TYPES, ValueEditorComponent, VersionPanelComponent, areTypesComparable, canvasNodeId, checkConditionLogic, checkFlowName, elementIcon, emptyFlowDefinition, flowNodeWidth, flowNodeWidthClass, isCustomConditionLogic, isGlobalReference, isNumericType, isTypeCheckedOperator, isValidFlowName, moveCondition, outletByKey, outletsOf, parseCanvasNodeId, parseInvariantNumber, parseSourceConnectorId, parseTargetConnectorId, referenceRoot, remapConditionLogic, removeCondition, slugifyFlowName, sourceConnectorId, stageStepNames, stageStepOutputReferenced, stepsOf, targetConnectorId, uniqueFlowName };
3180
- 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, FlowEdge, FlowElementType, FlowElementTypeEntry, 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, FlowPendingScreen, FlowProcessType, FlowRecordCreate, FlowRecordDelete, FlowRecordFilter, FlowRecordFilterOperator, FlowRecordLookup, FlowRecordRollback, FlowRecordTriggerType, FlowRecordUpdate, FlowReference, FlowReferenceKind, FlowReferenceQuery, FlowResourceCollection, FlowResourceKindEntry, FlowResourceRef, FlowResumeRequest, FlowSaveRequest, FlowSaveResult, FlowSchedule, FlowScheduledPath, FlowScreen, FlowScreenNavigation, FlowScreenResponseRequest, FlowScriptPluginCall, FlowSortOption, FlowSortOrder, FlowStage, FlowStageStep, FlowStageStepActionType, FlowStageStepAssignee, FlowStageStepConditionActionType, FlowStageStepRequest, FlowStageStepState, FlowStageStepStatus, FlowStageStepTypeEntry, FlowStart, FlowStartInterviewRequest, FlowSubflow, FlowSubflowInputAssignment, FlowSubflowOutputAssignment, FlowSummary, FlowTextTemplate, FlowTraceEntry, FlowTransactionModel, FlowTransform, FlowTransformType, FlowTransformValue, FlowTransformValueAction, FlowTriggerType, FlowTypedValue, FlowUnsupportedNode, FlowValidationIssue, FlowValidationResult, FlowValue, FlowVariable, FlowVersionStatus, FlowVersionSummary, FlowWait, FlowWaitEvent, NamePickerOption, ParameterHolder, ValueMode };
3609
+ export { ConditionEditorComponent, ConnectorEditorComponent, DebugPanelComponent, ElementDialogComponent, ElementInspectorComponent, ElementPaletteComponent, 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, 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, START_NODE_NAME, SelectValueDirective, StartInspectorComponent, StructureMemberPickerComponent, StructurePickerComponent, TYPES_WITH_AUTOMATIC_OUTPUT, TYPE_BY_COLLECTION, UNSUPPORTED_TYPES, ValueEditorComponent, VersionPanelComponent, areTypesComparable, canvasNodeId, checkConditionLogic, checkFlowName, elementIcon, emptyFlowDefinition, flowNodeWidth, flowNodeWidthClass, isCustomConditionLogic, isGlobalReference, isNumericType, isTypeCheckedOperator, isValidFlowName, moveCondition, outletByKey, outletsOf, parseCanvasNodeId, parseInvariantNumber, parseSourceConnectorId, parseTargetConnectorId, referenceRoot, remapConditionLogic, removeCondition, slugifyFlowName, sourceConnectorId, stageStepNames, stageStepOutputReferenced, stepsOf, targetConnectorId, uniqueFlowName, variantFieldOf, variantOf, variantPresetOf };
3610
+ 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, FlowEdge, FlowElementType, FlowElementTypeEntry, 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, FlowReferenceKind, FlowReferenceQuery, FlowResourceCollection, FlowResourceKindEntry, FlowResourceRef, FlowResumeRequest, FlowSaveRequest, FlowSaveResult, FlowSchedule, FlowScheduledPath, FlowScreen, FlowScreenNavigation, FlowScreenResponseRequest, FlowScriptPluginCall, 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, FlowTypedValue, FlowUnsupportedNode, FlowValidationIssue, FlowValidationResult, FlowValue, FlowVariable, FlowVersionStatus, FlowVersionSummary, FlowWait, FlowWaitEvent, NamePickerOption, PaletteGroup, PaletteItem, ParameterHolder, StructureMemberUsage, ValueMode };