@esfaenza/flow-builder 20.3.4 → 20.3.6

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
@@ -1,5 +1,5 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { InjectionToken, AfterViewChecked } from '@angular/core';
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
5
 
@@ -1637,140 +1637,33 @@ declare function stageStepOutputReferenced(reference: string | undefined, steps:
1637
1637
  */
1638
1638
  declare const ORCHESTRATION_CONDITION_OUTPUT = "isOrchestrationConditionMet";
1639
1639
 
1640
- /** Un node come lo vede l'editor: il node piu' da dove viene. */
1641
- interface FlowNodeRef {
1642
- name: string;
1643
- type: FlowElementType;
1644
- collection: FlowNodeCollection;
1645
- index: number;
1646
- node: FlowAnyNode;
1647
- }
1648
- /** Un arco derivato dal documento, con la sua origine precisa. */
1649
- interface FlowEdge {
1650
- /** Id stabile: `<sorgente>|<chiave uscita>`. */
1651
- id: string;
1652
- /** `$start` per gli archi uscenti dallo Start. */
1653
- from: string;
1654
- /** `undefined` il connector esiste ma non ha destinazione: ramo incompleto (§6.4). */
1655
- to?: string;
1656
- outletKey: string;
1657
- kind: FlowConnectionKind;
1658
- label?: string | null;
1659
- isGoTo?: boolean;
1660
- }
1661
- /** Una risorsa come la vede l'editor. */
1662
- interface FlowResourceRef {
1663
- name: string;
1664
- collection: FlowResourceCollection;
1665
- index: number;
1666
- resource: Record<string, unknown>;
1667
- }
1668
- /** Documento minimo per un flow nuovo (§11, "Creare un flow"). */
1669
- declare function emptyFlowDefinition(fullName: string, label: string, processType: string): FlowDefinition;
1670
- declare class FlowDocumentStore {
1671
- private readonly _document;
1672
- private readonly _isDirty;
1673
- private readonly _undoStack;
1674
- private readonly _redoStack;
1675
- /** Il documento in lavorazione. Sola lettura: si modifica con i metodi di questo store. */
1676
- readonly document: _angular_core.Signal<FlowDefinition>;
1677
- readonly isDirty: _angular_core.Signal<boolean>;
1678
- readonly canUndo: _angular_core.Signal<boolean>;
1679
- readonly canRedo: _angular_core.Signal<boolean>;
1680
- /** §3.4 — l'elemento Start: array di uno, usa sempre il primo. */
1681
- readonly start: _angular_core.Signal<FlowStart>;
1682
- /** §3.1 — tutte le collection appiattite in un'unica lista di node. */
1683
- readonly nodes: _angular_core.Signal<FlowNodeRef[]>;
1684
- readonly nodeByName: _angular_core.Signal<Map<string, FlowNodeRef>>;
1685
- readonly resources: _angular_core.Signal<FlowResourceRef[]>;
1686
- /**
1687
- * §3.3 — l'insieme dei nomi già usati: node, risorse **e** step di orchestrazione, un unico
1688
- * spazio di nomi. Il controllo di unicita' che guarda solo le variabili lascia passare una
1689
- * variabile omonima di un node (§13.5); quello che dimentica gli step lascia passare uno
1690
- * step omonimo di una variabile, che e' `NAME_DUPLICATED` allo stesso modo (§5.13).
1691
- */
1692
- readonly usedNames: _angular_core.Signal<string[]>;
1693
- /** Gli archi derivati dal documento, Start incluso. */
1694
- readonly edges: _angular_core.Signal<FlowEdge[]>;
1695
- /**
1696
- * Raggiungibilita' calcolata localmente, per un feedback immediato mentre si disegna.
1697
- * La fonte autoritativa resta `isReachable` di `POST /flows/outline` (§6.4): questa e'
1698
- * un'anticipazione, non un sostituto.
1699
- */
1700
- readonly reachableNames: _angular_core.Signal<ReadonlySet<string>>;
1701
- /** Carica un documento dal backend: azzera storico e flag di modifica. */
1702
- load(definition: FlowDefinition): void;
1703
- /** Dopo un salvataggio riuscito: il documento resta, la modifica non e' piu' pendente. */
1704
- markSaved(): void;
1705
- /**
1706
- * Applica una modifica al documento.
1707
- * Il mutatore riceve una **copia** e la modifica liberamente; lo store si occupa di
1708
- * storico e di sostituire il riferimento (nuovo oggetto → i signal derivati ricalcolano).
1709
- */
1710
- update(mutate: (draft: FlowDefinition) => void, options?: {
1711
- silent?: boolean;
1712
- }): void;
1713
- private pushHistory;
1714
- undo(): void;
1715
- redo(): void;
1716
- /** Inserisce un node nella collection indicata dal dizionario (`metadataProperty`). */
1717
- addNode(collection: FlowNodeCollection, node: FlowAnyNode): void;
1718
- /** Modifica un node per nome. Il mutatore riceve la copia di lavoro. */
1719
- updateNode(name: string, mutate: (node: FlowAnyNode) => void, options?: {
1720
- silent?: boolean;
1721
- }): void;
1722
- /** Modifica lo Start. */
1723
- updateStart(mutate: (start: FlowStart) => void, options?: {
1724
- silent?: boolean;
1725
- }): void;
1726
- /**
1727
- * Sposta un node sul canvas. `silent` per non riempire lo storico durante il drag:
1728
- * il chiamante registra un solo passo alla fine del gesto.
1729
- */
1730
- moveNode(name: string, x: number, y: number, options?: {
1731
- silent?: boolean;
1732
- }): void;
1733
- /**
1734
- * Rimuove un node **e** ogni connector che lo referenzia: un `targetReference` orfano
1735
- * e' `CONNECTOR_TARGET_UNKNOWN`, cioe' un errore che blocca l'attivazione (§7).
1736
- */
1737
- removeNode(name: string): void;
1738
- /** Azzera i connector che puntano a un node scomparso, Start compreso. */
1739
- private static clearReferencesTo;
1740
- /**
1741
- * Rinomina un node riscrivendo **tutti** i riferimenti che lo raggiungono.
1742
- * Nessuna primitiva del backend lo fa (§13.8): se l'editor offre la rinomina, la
1743
- * riscrittura la deve fare lui. Copre `targetReference`, i riferimenti a risorsa e i
1744
- * riferimenti a output automatico (`Vecchio.Campo` → `Nuovo.Campo`).
1745
- */
1746
- renameNode(oldName: string, newName: string): void;
1747
- /** Rinomina una risorsa, riscrivendo i riferimenti che la usano. */
1748
- renameResource(collection: FlowResourceCollection, index: number, newName: string): void;
1749
- /**
1750
- * Riscrive ogni occorrenza di un nome nei campi che contengono riferimenti.
1751
- * Cammina l'intero documento: e' l'unico modo per non dimenticare un campo, dato che
1752
- * i riferimenti compaiono in una ventina di posti diversi (§4).
1753
- */
1754
- private static rewriteReferences;
1755
- /** Duplica un node con un nome nuovo, senza copiarne le uscite. */
1756
- duplicateNode(name: string, newName: string, offset?: {
1757
- x: number;
1758
- y: number;
1759
- }): void;
1760
- /** Scrive la destinazione di un'uscita. `target` assente → il ramo resta incompleto. */
1761
- setConnector(fromName: string, outletKey: string, target: string | undefined, isGoTo?: boolean): void;
1762
- /** Rimuove un arco: il percorso finisce lì, che e' legittimo (§3.5). */
1763
- removeConnector(fromName: string, outletKey: string): void;
1764
- addResource(collection: FlowResourceCollection, resource: Record<string, unknown>): void;
1765
- updateResource(collection: FlowResourceCollection, index: number, mutate: (resource: Record<string, unknown>) => void): void;
1766
- removeResource(collection: FlowResourceCollection, index: number): void;
1767
- /** Modifica i campi del documento radice (label, description, processType, …). */
1768
- updateHeader(mutate: (definition: FlowDefinition) => void, options?: {
1769
- silent?: boolean;
1770
- }): void;
1771
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<FlowDocumentStore, never>;
1772
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<FlowDocumentStore>;
1773
- }
1640
+ /**
1641
+ * La gravita' di un rilievo, ridotta a tre secchi — FRONTEND.md §7.
1642
+ *
1643
+ * Perche' esiste: `FlowIssueSeverity` e' un tipo **aperto** (`'Error' | 'Warning' | 'Info' |
1644
+ * string`) perche' il backend puo' aggiungere livelli senza toccare il frontend (§13.11). La
1645
+ * conseguenza e' che confrontare la stringa cosi' com'e' e' un fallimento silenzioso: un
1646
+ * `error` minuscolo, un `WARN`, un `Log` non corrispondono a niente, e allora il filtro del
1647
+ * pannello non seleziona nulla, il conteggio resta a zero e il node sul canvas non si colora —
1648
+ * senza un errore da nessuna parte. Era il difetto dei filtri della §7.
1649
+ *
1650
+ * Da qui in avanti si confronta il **secchio**, non la stringa. I livelli che non conosciamo
1651
+ * cadono in `Info`: sono note, non problemi, e restano visibili invece di sparire.
1652
+ */
1653
+ /** Le tre gravita' su cui l'interfaccia decide: colore, icona, filtro, attivazione. */
1654
+ type FlowSeverityBucket = 'Error' | 'Warning' | 'Info';
1655
+ /** Un livello sconosciuto e' una nota: si mostra, non si nasconde. */
1656
+ declare function severityBucket(severity: string | null | undefined): FlowSeverityBucket;
1657
+ /** L'ordine in cui si presentano: prima cio' che blocca l'attivazione. */
1658
+ declare const SEVERITY_BUCKETS: readonly FlowSeverityBucket[];
1659
+ declare const SEVERITY_LABEL: Record<FlowSeverityBucket, string>;
1660
+ /**
1661
+ * Caratteri Unicode, non icone: la libreria non porta asset e non dipende dal font di icone
1662
+ * dell'applicazione ospite — la stessa scelta di `element-icons.ts`. Sono glifi che rendono
1663
+ * bene dentro un pastiglia colorata a 14px e non hanno un fallback emoji che cambia forma da
1664
+ * un sistema all'altro.
1665
+ */
1666
+ declare const SEVERITY_ICON: Record<FlowSeverityBucket, string>;
1774
1667
 
1775
1668
  declare class FlowDictionaryStore {
1776
1669
  private readonly api;
@@ -1960,6 +1853,313 @@ declare class FlowCatalogStore {
1960
1853
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<FlowCatalogStore>;
1961
1854
  }
1962
1855
 
1856
+ /**
1857
+ * Navigazione dei percorsi puntati — FRONTEND.md §4.4, §4.7, §4.7.1, §5.2, §5.7.
1858
+ *
1859
+ * La specifica e' cambiata su questo punto: i percorsi con il punto **si verificano**. Un percorso
1860
+ * di relazione (`Cliente.Citta`) si naviga un segmento alla volta e l'ultimo si verifica come un
1861
+ * campo semplice; dentro un'istanza di classe i membri annidati (`Richiesta.Cliente.Nome`) si
1862
+ * verificano **fino in fondo**, seguendo `objectType` di classe in classe e passando ai campi
1863
+ * dello schema quando il membro porta un record. Dove la catena si interrompe il rilievo e'
1864
+ * l'avviso `PATH_NOT_VERIFIABLE`, che significa "non lo so" e non "sbagliato".
1865
+ *
1866
+ * Perche' sta qui e non in tre pickers: la catena e' la stessa per campi e membri — cambiano solo
1867
+ * la primitiva che descrive la tappa (`listFields` contro `describeStructure`) e le parole
1868
+ * dell'avviso. Tenerla in un posto solo e' anche il modo di non far divergere l'editor dal
1869
+ * validatore, che naviga la stessa catena.
1870
+ *
1871
+ * Le due cose da non confondere:
1872
+ *
1873
+ * - **`objectType` di un membro** porta il nome di una classe se il membro e' `Structure`, il nome
1874
+ * di un'**entita' dello schema** se il membro e' `Object` — e da lì in poi si continua con i
1875
+ * campi, non con i membri (§4.7.1). Un `Enum` non e' un contenitore: `objectType` lì e' un tipo
1876
+ * di enumerazione e il percorso finisce.
1877
+ * - **scrivibile** non vuol dire la stessa cosa nei due mondi: un membro porta il proprio
1878
+ * `isWritable`, un campo no — fuori da un Create o da un Update il contesto non c'e', quindi
1879
+ * basta che sia `isCreateable` **oppure** `isUpdateable`, e un campo che non e' ne' l'uno ne'
1880
+ * l'altro e' `TARGET_NOT_WRITABLE` in qualunque contesto (§5.7).
1881
+ */
1882
+
1883
+ /** Una tappa navigabile: un'entita' dello schema, oppure una classe (§4.7). */
1884
+ type PathContainerKind = 'object' | 'structure';
1885
+ interface PathContainer {
1886
+ kind: PathContainerKind;
1887
+ /** Nome dell'entita' o della classe. */
1888
+ name: string;
1889
+ }
1890
+ /**
1891
+ * Un segmento proponibile in una tappa — campo o membro ridotti al minimo comune, perche' chi
1892
+ * naviga non deve sapere quale dei due sta guardando.
1893
+ */
1894
+ interface PathEntry {
1895
+ name: string;
1896
+ label?: string | null;
1897
+ description?: string | null;
1898
+ dataType?: FlowDataType;
1899
+ objectType?: string | null;
1900
+ isCollection?: boolean;
1901
+ /** Scrivibile come destinazione: `isWritable` per un membro, `createable || updateable` per un campo. */
1902
+ isWritable: boolean;
1903
+ /** Dove il percorso continua dopo questo segmento; assente = qui finisce cio' che si sa. */
1904
+ next?: PathContainer;
1905
+ }
1906
+ /**
1907
+ * Esito della descrizione di una tappa. Sono quattro come per le classi (§4.7.1) e vanno tenuti
1908
+ * distinti: solo `declared` autorizza a dire che un segmento non esiste.
1909
+ */
1910
+ type PathLevelStatus = 'declared' | 'undeclared' | 'unknown-container' | 'unknown-catalog';
1911
+ interface PathLevel {
1912
+ container: PathContainer;
1913
+ status: PathLevelStatus;
1914
+ entries: PathEntry[];
1915
+ /** L'etichetta della tappa, quando la descrizione la porta (l'involucro della §4.7.1). */
1916
+ label?: string | null;
1917
+ }
1918
+ /**
1919
+ * Cio' che serve per navigare: le due primitive di catalogo. {@link FlowCatalogStore} la soddisfa
1920
+ * per forma, e prenderla come parametro tiene questo modulo verificabile senza un'iniezione.
1921
+ */
1922
+ interface PathCatalog {
1923
+ listFields(object: string, usage?: FlowFieldUsage): Promise<FlowFieldDescription[]>;
1924
+ describeStructure(className: string): Promise<FlowStructureDescribed>;
1925
+ }
1926
+ /**
1927
+ * Perche' la navigazione si e' fermata. `unknown-segment` e' l'unico che accusa qualcuno: gli altri
1928
+ * sono `PATH_NOT_VERIFIABLE`, cioe' "non lo so".
1929
+ */
1930
+ type PathStopReason = 'unknown-segment'
1931
+ /** Il segmento non dichiara dove continuare: nessun `objectType`, o un tipo che non e' un contenitore. */
1932
+ | 'no-object-type'
1933
+ /** Dentro una collection non si naviga: il percorso designa l'insieme, non un elemento. */
1934
+ | 'collection'
1935
+ /** Tappa valida di cui campi o membri non sono dichiarati: si digita, non si accusa. */
1936
+ | 'undeclared'
1937
+ /** Classe non registrata (404): l'errore sta sulla classe, non sul percorso. */
1938
+ | 'unknown-container'
1939
+ /** Catalogo assente o richiesta fallita: non dice niente sulla tappa. */
1940
+ | 'unknown-catalog';
1941
+ interface PathResolution {
1942
+ root: PathContainer;
1943
+ /** Il percorso come e' stato scritto, ripulito dagli spazi. */
1944
+ path: string;
1945
+ segments: string[];
1946
+ /** Le tappe attraversate, nell'ordine. L'ultima e' quella dove la navigazione si e' fermata. */
1947
+ levels: PathLevel[];
1948
+ /** I segmenti risolti, uno per tappa attraversata. */
1949
+ resolved: PathEntry[];
1950
+ /**
1951
+ * - `empty`: non c'e' ancora un ultimo segmento da verificare (percorso vuoto, o appena aperto
1952
+ * con il punto): niente da segnalare, ma c'e' da proporre;
1953
+ * - `resolved`: ogni segmento verificato, {@link last} e' cio' che il percorso designa;
1954
+ * - `unknown`: un segmento non esiste nella sua tappa, che era autorevole;
1955
+ * - `unverifiable`: la catena si interrompe — `PATH_NOT_VERIFIABLE`.
1956
+ */
1957
+ status: 'empty' | 'resolved' | 'unknown' | 'unverifiable';
1958
+ reason?: PathStopReason;
1959
+ /** Dove si e' fermata: indice nel percorso e testo del segmento. */
1960
+ stoppedAt?: {
1961
+ index: number;
1962
+ segment: string;
1963
+ };
1964
+ /** Il segmento finale, solo con `resolved`: e' il campo o il membro che il percorso designa. */
1965
+ last?: PathEntry;
1966
+ /**
1967
+ * La tappa dell'**ultimo** segmento, quando la navigazione ci e' arrivata: e' cio' che l'editor
1968
+ * propone, con `prefix` da premettere al nome scelto. Assente se la catena si e' interrotta
1969
+ * prima: lì non c'e' niente da proporre.
1970
+ */
1971
+ tail?: {
1972
+ level: PathLevel;
1973
+ prefix: string;
1974
+ segment: string;
1975
+ };
1976
+ }
1977
+ /**
1978
+ * Descrive una tappa. `usage` vale solo per le entita' e solo dove serve: i segmenti **intermedi**
1979
+ * si chiedono sempre con `any`, perche' l'uso riguarda l'ultimo — un filtro su `Cliente.Citta`
1980
+ * esige che `Citta` sia filtrabile, non che lo sia la relazione (§4.4).
1981
+ */
1982
+ declare function loadPathLevel(catalog: PathCatalog, container: PathContainer, usage?: FlowFieldUsage): Promise<PathLevel>;
1983
+ /**
1984
+ * Naviga `path` a partire da `root`, un segmento alla volta. Non rifiuta mai: un catalogo assente
1985
+ * e' un esito (`unverifiable`), non un errore da gestire in ogni chiamante.
1986
+ */
1987
+ declare function resolvePath(catalog: PathCatalog, root: PathContainer, path: string | undefined, options?: {
1988
+ usage?: FlowFieldUsage;
1989
+ }): Promise<PathResolution>;
1990
+ /** Come chiamare una tappa in un messaggio: la classe ha una label, l'entita' il proprio nome. */
1991
+ declare function pathContainerLabel(level: PathLevel | undefined): string;
1992
+ /**
1993
+ * Il testo dell'avviso `PATH_NOT_VERIFIABLE`, con il **motivo**: "non verificabile" senza dire
1994
+ * perche' e' indistinguibile da un difetto dell'editor.
1995
+ */
1996
+ declare function pathNotVerifiableMessage(resolution: PathResolution): string;
1997
+ /** I nomi proponibili nella tappa dove un segmento non e' stato trovato: il messaggio li elenca. */
1998
+ declare function pathAvailableNames(resolution: PathResolution): string[];
1999
+ /**
2000
+ * La riga di descrizione di un segmento proponibile. `showWritability` la chiede chi sta
2001
+ * compilando una **destinazione**: in un filtro "sola lettura" sarebbe rumore, in un campo di
2002
+ * destinazione e' l'informazione che evita `TARGET_NOT_WRITABLE`.
2003
+ */
2004
+ declare function describePathEntry(entry: PathEntry, options?: {
2005
+ showWritability?: boolean;
2006
+ }): string;
2007
+ interface PathNavigationRequest {
2008
+ /** `null` = niente da navigare: nessuna radice scelta, o radice non navigabile. */
2009
+ root: PathContainer | null;
2010
+ path: string | undefined;
2011
+ /** L'uso con cui chiedere i campi dell'**ultimo** segmento (§6.4). */
2012
+ usage?: FlowFieldUsage;
2013
+ }
2014
+ interface PathNavigation {
2015
+ /** `null` finche' non c'e' una radice o la prima risposta non e' arrivata. */
2016
+ resolution: Signal<PathResolution | null>;
2017
+ isPending: Signal<boolean>;
2018
+ }
2019
+ /**
2020
+ * La navigazione come coppia di signal, per i pickers. Da chiamare in un **contesto di
2021
+ * iniezione** (il costruttore del componente), perche' dentro crea un `effect`.
2022
+ *
2023
+ * Il token di sequenza non e' cosmetico: le tappe si caricano una alla volta e una risposta
2024
+ * superata che arriva dopo mostrerebbe l'avviso di un percorso che l'utente ha già cambiato.
2025
+ */
2026
+ declare function navigatePath(catalog: PathCatalog, request: () => PathNavigationRequest | null): PathNavigation;
2027
+
2028
+ /** Un node come lo vede l'editor: il node piu' da dove viene. */
2029
+ interface FlowNodeRef {
2030
+ name: string;
2031
+ type: FlowElementType;
2032
+ collection: FlowNodeCollection;
2033
+ index: number;
2034
+ node: FlowAnyNode;
2035
+ }
2036
+ /** Un arco derivato dal documento, con la sua origine precisa. */
2037
+ interface FlowEdge {
2038
+ /** Id stabile: `<sorgente>|<chiave uscita>`. */
2039
+ id: string;
2040
+ /** `$start` per gli archi uscenti dallo Start. */
2041
+ from: string;
2042
+ /** `undefined` → il connector esiste ma non ha destinazione: ramo incompleto (§6.4). */
2043
+ to?: string;
2044
+ outletKey: string;
2045
+ kind: FlowConnectionKind;
2046
+ label?: string | null;
2047
+ isGoTo?: boolean;
2048
+ }
2049
+ /** Una risorsa come la vede l'editor. */
2050
+ interface FlowResourceRef {
2051
+ name: string;
2052
+ collection: FlowResourceCollection;
2053
+ index: number;
2054
+ resource: Record<string, unknown>;
2055
+ }
2056
+ /** Documento minimo per un flow nuovo (§11, "Creare un flow"). */
2057
+ declare function emptyFlowDefinition(fullName: string, label: string, processType: string): FlowDefinition;
2058
+ declare class FlowDocumentStore {
2059
+ private readonly _document;
2060
+ private readonly _isDirty;
2061
+ private readonly _undoStack;
2062
+ private readonly _redoStack;
2063
+ /** Il documento in lavorazione. Sola lettura: si modifica con i metodi di questo store. */
2064
+ readonly document: _angular_core.Signal<FlowDefinition>;
2065
+ readonly isDirty: _angular_core.Signal<boolean>;
2066
+ readonly canUndo: _angular_core.Signal<boolean>;
2067
+ readonly canRedo: _angular_core.Signal<boolean>;
2068
+ /** §3.4 — l'elemento Start: array di uno, usa sempre il primo. */
2069
+ readonly start: _angular_core.Signal<FlowStart>;
2070
+ /** §3.1 — tutte le collection appiattite in un'unica lista di node. */
2071
+ readonly nodes: _angular_core.Signal<FlowNodeRef[]>;
2072
+ readonly nodeByName: _angular_core.Signal<Map<string, FlowNodeRef>>;
2073
+ readonly resources: _angular_core.Signal<FlowResourceRef[]>;
2074
+ /**
2075
+ * §3.3 — l'insieme dei nomi già usati: node, risorse **e** step di orchestrazione, un unico
2076
+ * spazio di nomi. Il controllo di unicita' che guarda solo le variabili lascia passare una
2077
+ * variabile omonima di un node (§13.5); quello che dimentica gli step lascia passare uno
2078
+ * step omonimo di una variabile, che e' `NAME_DUPLICATED` allo stesso modo (§5.13).
2079
+ */
2080
+ readonly usedNames: _angular_core.Signal<string[]>;
2081
+ /** Gli archi derivati dal documento, Start incluso. */
2082
+ readonly edges: _angular_core.Signal<FlowEdge[]>;
2083
+ /**
2084
+ * Raggiungibilita' calcolata localmente, per un feedback immediato mentre si disegna.
2085
+ * La fonte autoritativa resta `isReachable` di `POST /flows/outline` (§6.4): questa e'
2086
+ * un'anticipazione, non un sostituto.
2087
+ */
2088
+ readonly reachableNames: _angular_core.Signal<ReadonlySet<string>>;
2089
+ /** Carica un documento dal backend: azzera storico e flag di modifica. */
2090
+ load(definition: FlowDefinition): void;
2091
+ /** Dopo un salvataggio riuscito: il documento resta, la modifica non e' piu' pendente. */
2092
+ markSaved(): void;
2093
+ /**
2094
+ * Applica una modifica al documento.
2095
+ * Il mutatore riceve una **copia** e la modifica liberamente; lo store si occupa di
2096
+ * storico e di sostituire il riferimento (nuovo oggetto → i signal derivati ricalcolano).
2097
+ */
2098
+ update(mutate: (draft: FlowDefinition) => void, options?: {
2099
+ silent?: boolean;
2100
+ }): void;
2101
+ private pushHistory;
2102
+ undo(): void;
2103
+ redo(): void;
2104
+ /** Inserisce un node nella collection indicata dal dizionario (`metadataProperty`). */
2105
+ addNode(collection: FlowNodeCollection, node: FlowAnyNode): void;
2106
+ /** Modifica un node per nome. Il mutatore riceve la copia di lavoro. */
2107
+ updateNode(name: string, mutate: (node: FlowAnyNode) => void, options?: {
2108
+ silent?: boolean;
2109
+ }): void;
2110
+ /** Modifica lo Start. */
2111
+ updateStart(mutate: (start: FlowStart) => void, options?: {
2112
+ silent?: boolean;
2113
+ }): void;
2114
+ /**
2115
+ * Sposta un node sul canvas. `silent` per non riempire lo storico durante il drag:
2116
+ * il chiamante registra un solo passo alla fine del gesto.
2117
+ */
2118
+ moveNode(name: string, x: number, y: number, options?: {
2119
+ silent?: boolean;
2120
+ }): void;
2121
+ /**
2122
+ * Rimuove un node **e** ogni connector che lo referenzia: un `targetReference` orfano
2123
+ * e' `CONNECTOR_TARGET_UNKNOWN`, cioe' un errore che blocca l'attivazione (§7).
2124
+ */
2125
+ removeNode(name: string): void;
2126
+ /** Azzera i connector che puntano a un node scomparso, Start compreso. */
2127
+ private static clearReferencesTo;
2128
+ /**
2129
+ * Rinomina un node riscrivendo **tutti** i riferimenti che lo raggiungono.
2130
+ * Nessuna primitiva del backend lo fa (§13.8): se l'editor offre la rinomina, la
2131
+ * riscrittura la deve fare lui. Copre `targetReference`, i riferimenti a risorsa e i
2132
+ * riferimenti a output automatico (`Vecchio.Campo` → `Nuovo.Campo`).
2133
+ */
2134
+ renameNode(oldName: string, newName: string): void;
2135
+ /** Rinomina una risorsa, riscrivendo i riferimenti che la usano. */
2136
+ renameResource(collection: FlowResourceCollection, index: number, newName: string): void;
2137
+ /**
2138
+ * Riscrive ogni occorrenza di un nome nei campi che contengono riferimenti.
2139
+ * Cammina l'intero documento: e' l'unico modo per non dimenticare un campo, dato che
2140
+ * i riferimenti compaiono in una ventina di posti diversi (§4).
2141
+ */
2142
+ private static rewriteReferences;
2143
+ /** Duplica un node con un nome nuovo, senza copiarne le uscite. */
2144
+ duplicateNode(name: string, newName: string, offset?: {
2145
+ x: number;
2146
+ y: number;
2147
+ }): void;
2148
+ /** Scrive la destinazione di un'uscita. `target` assente → il ramo resta incompleto. */
2149
+ setConnector(fromName: string, outletKey: string, target: string | undefined, isGoTo?: boolean): void;
2150
+ /** Rimuove un arco: il percorso finisce lì, che e' legittimo (§3.5). */
2151
+ removeConnector(fromName: string, outletKey: string): void;
2152
+ addResource(collection: FlowResourceCollection, resource: Record<string, unknown>): void;
2153
+ updateResource(collection: FlowResourceCollection, index: number, mutate: (resource: Record<string, unknown>) => void): void;
2154
+ removeResource(collection: FlowResourceCollection, index: number): void;
2155
+ /** Modifica i campi del documento radice (label, description, processType, …). */
2156
+ updateHeader(mutate: (definition: FlowDefinition) => void, options?: {
2157
+ silent?: boolean;
2158
+ }): void;
2159
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FlowDocumentStore, never>;
2160
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<FlowDocumentStore>;
2161
+ }
2162
+
1963
2163
  declare class FlowValidationStore {
1964
2164
  private readonly api;
1965
2165
  private readonly destroyRef;
@@ -1975,7 +2175,16 @@ declare class FlowValidationStore {
1975
2175
  readonly issues: _angular_core.Signal<FlowValidationIssue[]>;
1976
2176
  readonly errorCount: _angular_core.Signal<number>;
1977
2177
  readonly warningCount: _angular_core.Signal<number>;
1978
- readonly infoCount: _angular_core.Signal<number>;
2178
+ /**
2179
+ * I conteggi per gravita' **ricavati dai rilievi**, non quelli del risultato.
2180
+ *
2181
+ * Servono a etichettare i filtri del pannello, e un'etichetta di filtro deve contare
2182
+ * esattamente cio' che il filtro mostrera': `errorCount` del backend e' l'unica verita' per
2183
+ * l'attivazione (§8.3) ma non e' allineato ai secchi, quindi usarlo sul chip produrrebbe un
2184
+ * «Errori 3» che apre una lista di due. Il livello si normalizza (`severityBucket`) perche'
2185
+ * la stringa e' aperta.
2186
+ */
2187
+ readonly issueCounts: _angular_core.Signal<Record<FlowSeverityBucket, number>>;
1979
2188
  /**
1980
2189
  * `false` finche' non e' arrivata una validazione: non presentare l'assenza di rilievi
1981
2190
  * come garanzia di correttezza (§7, ultimo capoverso).
@@ -1989,7 +2198,7 @@ declare class FlowValidationStore {
1989
2198
  readonly documentIssues: _angular_core.Signal<FlowValidationIssue[]>;
1990
2199
  constructor();
1991
2200
  /** La gravita' peggiore su un elemento, per decidere il colore del node sul canvas. */
1992
- severityOf(elementName: string): 'Error' | 'Warning' | 'Info' | null;
2201
+ severityOf(elementName: string): FlowSeverityBucket | null;
1993
2202
  /**
1994
2203
  * I rilievi che riguardano un campo dentro un elemento.
1995
2204
  * `path` e' del tipo `rules[Approvato].connector.targetReference`: il confronto e' per
@@ -2203,8 +2412,12 @@ interface FlowCanvasNode {
2203
2412
  showsOutletLabels: boolean;
2204
2413
  /** `false` → nessun percorso lo raggiunge dallo Start: va reso "scollegato" (§6.4). */
2205
2414
  isReachable: boolean;
2206
- /** La gravita' peggiore dei rilievi sull'elemento (§7). */
2207
- severity: FlowIssueSeverity | null;
2415
+ /**
2416
+ * La gravita' peggiore dei rilievi sull'elemento (§7), **normalizzata**: il template
2417
+ * confronta `=== 'Error'`, e `FlowIssueSeverity` e' un tipo aperto in cui un `error`
2418
+ * minuscolo non colorerebbe niente.
2419
+ */
2420
+ severity: FlowSeverityBucket | null;
2208
2421
  /** Numero di rilievi, per il badge. */
2209
2422
  issueCount: number;
2210
2423
  /** L'elemento espone il proprio risultato sotto il proprio nome (§4.5). */
@@ -2258,6 +2471,12 @@ declare class FlowCanvasComponent {
2258
2471
  * Assente → si usa il calcolo locale.
2259
2472
  */
2260
2473
  readonly outline: _angular_core.InputSignal<FlowOutline | null>;
2474
+ /**
2475
+ * Lo decide il backend, non il client (§8): su una versione non modificabile i comandi che
2476
+ * mutano il documento non si offrono. Arriva come input invece di leggere la sessione,
2477
+ * perche' il canvas resti montabile da solo.
2478
+ */
2479
+ readonly isEditable: _angular_core.InputSignal<boolean>;
2261
2480
  readonly selectionChange: _angular_core.OutputEmitterRef<string | null>;
2262
2481
  readonly nodeOpened: _angular_core.OutputEmitterRef<string>;
2263
2482
  readonly nodeRemoveRequested: _angular_core.OutputEmitterRef<string>;
@@ -2270,6 +2489,28 @@ declare class FlowCanvasComponent {
2270
2489
  x: number;
2271
2490
  y: number;
2272
2491
  }>;
2492
+ private readonly canvas;
2493
+ private readonly _hasMovedViewport;
2494
+ /** L'utente ha zoomato o spostato la vista: il comando per rimetterla a posto ha senso. */
2495
+ readonly hasMovedViewport: _angular_core.Signal<boolean>;
2496
+ /** Il primo `fNodesRendered` inquadra, i successivi no: rifarlo combatterebbe con l'utente. */
2497
+ private hasFramedOnce;
2498
+ /**
2499
+ * `fitToScreen` va chiamato **dopo** che i node sono stati renderizzati: prima, la libreria
2500
+ * non conosce ancora le loro dimensioni e inquadra la vista sbagliata (FF1009).
2501
+ *
2502
+ * Con un solo node (un flow appena creato ha solo lo Start) non si inquadra niente: la
2503
+ * vista si spalancherebbe su una card sola.
2504
+ */
2505
+ onNodesRendered(): void;
2506
+ /**
2507
+ * Qualunque zoom o panoramica accende il pulsante. `frameFlow` passa
2508
+ * `emitCanvasChange: false`, quindi il ritorno alla vista iniziale non rientra da qui e il
2509
+ * pulsante si spegne invece di restare acceso per sempre.
2510
+ */
2511
+ onCanvasChange(): void;
2512
+ resetViewport(): void;
2513
+ private frameFlow;
2273
2514
  /** Raggiungibilita': backend se c'e', locale altrimenti. */
2274
2515
  private readonly reachability;
2275
2516
  readonly nodes: _angular_core.Signal<FlowCanvasNode[]>;
@@ -2336,6 +2577,12 @@ declare class FlowCanvasComponent {
2336
2577
  * dell'area sottostante.
2337
2578
  */
2338
2579
  onEditClick(event: Event, name: string): void;
2580
+ /**
2581
+ * `stopPropagation` come per ✎: senza, il clic arriva anche al node e la selezione cambia
2582
+ * mentre l'elemento sta sparendo. La rimozione la esegue il documento, non il canvas:
2583
+ * `removeNode` toglie anche i connector che lo puntavano.
2584
+ */
2585
+ onRemoveClick(event: Event, name: string): void;
2339
2586
  connectorIdOf(node: FlowCanvasNode, outletKey: string): string;
2340
2587
  targetIdOf(node: FlowCanvasNode): string;
2341
2588
  isSelected(node: FlowCanvasNode): boolean;
@@ -2344,7 +2591,7 @@ declare class FlowCanvasComponent {
2344
2591
  /** Classe della fascia colorata, per categoria del dizionario. */
2345
2592
  categoryClass(node: FlowCanvasNode): string;
2346
2593
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FlowCanvasComponent, never>;
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>;
2594
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FlowCanvasComponent, "fb-flow-canvas", never, { "selectedName": { "alias": "selectedName"; "required": false; "isSignal": true; }; "outline": { "alias": "outline"; "required": false; "isSignal": true; }; "isEditable": { "alias": "isEditable"; "required": false; "isSignal": true; }; }, { "selectionChange": "selectionChange"; "nodeOpened": "nodeOpened"; "nodeRemoveRequested": "nodeRemoveRequested"; "nodeDuplicateRequested": "nodeDuplicateRequested"; "elementDropped": "elementDropped"; }, never, never, true, never>;
2348
2595
  }
2349
2596
 
2350
2597
  /** Il gesto scelto sulla palette: un tipo e, dove esiste, la sua variante (§5.5). */
@@ -2436,13 +2683,26 @@ declare class ReferencePickerComponent {
2436
2683
  readonly query: _angular_core.WritableSignal<string>;
2437
2684
  constructor();
2438
2685
  /**
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;
2686
+ * La risorsa da cui il valore corrente sta navigando, quando la sua forma e' **dichiarata**: una
2687
+ * `Structure` con la classe, un record con l'entita'. È cio' che rende il percorso verificabile.
2688
+ *
2689
+ * Un output automatico e' escluso di proposito: la primitiva ne dichiara il tipo, ma la
2690
+ * specifica tiene i percorsi che ne partono fuori dalla validazione (§7, ultimo capoverso), e
2691
+ * l'editor non deve accusare cio' che il backend non verifica.
2692
+ */
2693
+ private readonly navigableRoot;
2694
+ /** Il percorso dopo la radice: `Cliente.Email` di `Richiesta.Cliente.Email`. */
2695
+ private readonly navigatedPath;
2696
+ private readonly navigation;
2697
+ private readonly resolution;
2698
+ /** La tappa in cui si sta scrivendo: da qui vengono le proposte dei segmenti. */
2699
+ private readonly tail;
2700
+ /**
2701
+ * I segmenti come riferimenti navigati: `Richiesta.Cliente.Email`, col tipo del segmento. Un
2702
+ * segmento di sola lettura non si propone in un campo di destinazione, a meno che da lì il
2703
+ * percorso continui: `Richiesta.Cliente` non si assegna, ma `Richiesta.Cliente.Email` sì (§5.7).
2704
+ */
2705
+ private readonly pathReferences;
2446
2706
  readonly options: _angular_core.Signal<FlowReference[]>;
2447
2707
  /** Le opzioni raggruppate per `kind`, così gli output automatici si distinguono. */
2448
2708
  readonly groups: _angular_core.Signal<{
@@ -2454,20 +2714,23 @@ declare class ReferencePickerComponent {
2454
2714
  /**
2455
2715
  * Stato del valore corrente rispetto all'elenco.
2456
2716
  * - `known`: presente nell'elenco;
2457
- * - `navigated`: la radice e' nota ma c'e' un percorso dopo il punto (campo di record,
2458
- * output automatico navigato): la validazione non verifica i percorsi con il punto,
2459
- * quindi si accetta senza segnalare;
2717
+ * - `navigated`: la radice e' nota ma la sua forma non e' dichiarata (output automatico di un
2718
+ * elemento): il percorso resta fuori dalla validazione, quindi si accetta senza segnalare;
2460
2719
  * - `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
2720
+ * - `member`: percorso dentro una forma dichiarata, verificato fino in fondo (§4.4, §4.7.1);
2721
+ * - `memberUnknown`: un segmento non esiste nella sua tappa: `STRUCTURE_MEMBER_UNKNOWN` su una
2722
+ * classe, `FIELD_UNKNOWN` su un'entita', e a differenza di prima si sa per certo;
2723
+ * - `memberNotWritable`: il segmento esiste, non e' scrivibile, e questo campo vuole una
2465
2724
  * destinazione: `TARGET_NOT_WRITABLE`;
2725
+ * - `pathUnverified`: la catena si interrompe (`PATH_NOT_VERIFIABLE`): avviso, non errore;
2466
2726
  * - `unknown`: nessuna corrispondenza: si avvisa, senza bloccare. Ci finisce anche il
2467
2727
  * percorso inesistente di uno scope che i percorsi li dichiara, perche' lì il backend
2468
2728
  * risponderebbe `GLOBAL_UNKNOWN`.
2469
2729
  */
2470
- readonly valueState: _angular_core.Signal<"empty" | "known" | "navigated" | "host" | "member" | "memberUnknown" | "memberNotWritable" | "unknown">;
2730
+ readonly valueState: _angular_core.Signal<"empty" | "unknown" | "known" | "navigated" | "host" | "member" | "memberUnknown" | "memberNotWritable" | "pathUnverified">;
2731
+ /** Le parole cambiano con la tappa: un campo di un'entita' non e' un membro di una classe. */
2732
+ private readonly tailIsObject;
2733
+ private readonly tailContainer;
2471
2734
  readonly hint: _angular_core.Signal<string | null>;
2472
2735
  /** I due stati che sono errori e non avvisi: il colore deve dirlo. */
2473
2736
  readonly isHintError: _angular_core.Signal<boolean>;
@@ -2477,7 +2740,15 @@ declare class ReferencePickerComponent {
2477
2740
  toggle(): void;
2478
2741
  onQuery(value: string): void;
2479
2742
  choose(reference: FlowReference): void;
2480
- /** Scrittura libera: indispensabile per i campi di un record e per gli scope dell'host. */
2743
+ /**
2744
+ * Scende di un livello dentro un percorso proponibile invece di scegliere il segmento: scrive il
2745
+ * punto, e l'elenco diventa quello della tappa successiva. Serve perche' `Richiesta.Cliente` puo'
2746
+ * essere il riferimento che si vuole **oppure** la tappa da cui continuare.
2747
+ */
2748
+ descend(reference: FlowReference): void;
2749
+ /** `true` se da questo riferimento il percorso continua: la sua forma e' dichiarata. */
2750
+ canDescend(reference: FlowReference): boolean;
2751
+ /** Scrittura libera: indispensabile per gli scope dell'host e per i percorsi non enumerabili. */
2481
2752
  onManualInput(value: string): void;
2482
2753
  clear(): void;
2483
2754
  describe(reference: FlowReference): string;
@@ -2535,29 +2806,55 @@ declare class FieldPickerComponent {
2535
2806
  readonly placeholder: _angular_core.InputSignal<string>;
2536
2807
  readonly disabled: _angular_core.InputSignal<boolean>;
2537
2808
  readonly valueChange: _angular_core.OutputEmitterRef<string | undefined>;
2538
- private readonly fields;
2539
- private readonly loadFailed;
2540
2809
  readonly isOpen: _angular_core.WritableSignal<boolean>;
2541
2810
  /** Il testo digitato mentre il pannello e' aperto: filtra l'elenco. */
2542
2811
  private readonly query;
2812
+ /**
2813
+ * La navigazione del percorso corrente. Il testo digitato conta quanto il valore: mentre si
2814
+ * scrive `Cliente.Cit` l'elenco deve già essere quello dei campi di `Cliente`.
2815
+ */
2816
+ private readonly navigation;
2817
+ private readonly resolution;
2543
2818
  constructor();
2544
2819
  readonly text: _angular_core.Signal<string>;
2545
- readonly options: _angular_core.Signal<FlowFieldDescription[]>;
2820
+ /** La tappa in cui si sta scrivendo: da qui vengono le proposte, non dalla radice. */
2821
+ private readonly tail;
2822
+ /** Cio' che si premette al nome scelto: `''` sul primo segmento, `Cliente.` sul secondo. */
2823
+ readonly prefix: _angular_core.Signal<string>;
2824
+ readonly options: _angular_core.Signal<PathEntry[]>;
2825
+ /** `true` se la tappa in cui si scrive ha un elenco **autorevole** (§4.7.1). */
2546
2826
  readonly hasCatalog: _angular_core.Signal<boolean>;
2547
- /** `true` se il valore e' un percorso di relazione: non enumerabile, non verificato (§4.4). */
2548
- readonly isRelationPath: _angular_core.Signal<boolean>;
2827
+ /** L'etichetta della tappa: serve nell'intestazione dell'elenco quando non e' la radice. */
2828
+ readonly levelLabel: _angular_core.Signal<string>;
2829
+ /** `true` se il valore e' un percorso navigato: cambia il testo dei messaggi, non la severita'. */
2830
+ readonly isPath: _angular_core.Signal<boolean>;
2549
2831
  readonly isUnknown: _angular_core.Signal<boolean>;
2550
- /** L'avviso dipende dall'uso: un campo puo' esistere e non essere filtrabile. */
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.">;
2832
+ /** §4.4 la catena si e' interrotta: avviso, non errore. Il percorso puo' essere giusto. */
2833
+ readonly isNotVerifiable: _angular_core.Signal<boolean>;
2834
+ /**
2835
+ * L'avviso dipende dall'uso — un campo puo' esistere e non essere filtrabile — e dalla **tappa**:
2836
+ * su `Cliente.Citta` il campo che non esiste e' di `Cliente`, non dell'oggetto di partenza.
2837
+ */
2838
+ readonly unknownMessage: _angular_core.Signal<string>;
2839
+ readonly notVerifiableMessage: _angular_core.Signal<string>;
2552
2840
  readonly describeValue: _angular_core.Signal<string | null>;
2841
+ /** Catalogo non raggiungibile sulla **radice**: il campo resta scrivibile a mano, non bloccato. */
2553
2842
  readonly loadErrored: _angular_core.Signal<boolean>;
2554
2843
  open(): void;
2555
2844
  close(): void;
2556
2845
  toggle(): void;
2557
2846
  onInput(text: string): void;
2558
- choose(field: FlowFieldDescription): void;
2847
+ choose(entry: PathEntry): void;
2848
+ /**
2849
+ * Scende dentro una relazione invece di scegliere il campo: il pannello resta aperto e l'elenco
2850
+ * diventa quello dell'oggetto referenziato. È l'equivalente di scrivere il punto, e infatti
2851
+ * scrive il punto: il valore intermedio e' quello che si vedrebbe digitando.
2852
+ */
2853
+ descend(entry: PathEntry): void;
2854
+ /** `true` se da questo campo il percorso continua: e' una relazione con l'oggetto dichiarato. */
2855
+ canDescend(entry: PathEntry): boolean;
2559
2856
  clear(): void;
2560
- describe(field: FlowFieldDescription): string;
2857
+ describe(entry: PathEntry): string;
2561
2858
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FieldPickerComponent, never>;
2562
2859
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<FieldPickerComponent, "fb-field-picker", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "object": { "alias": "object"; "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>;
2563
2860
  }
@@ -2631,55 +2928,76 @@ declare class StructureMemberPickerComponent {
2631
2928
  readonly placeholder: _angular_core.InputSignal<string>;
2632
2929
  readonly disabled: _angular_core.InputSignal<boolean>;
2633
2930
  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
2931
  readonly isOpen: _angular_core.WritableSignal<boolean>;
2642
2932
  /** Il testo digitato mentre il pannello e' aperto: filtra l'elenco. */
2643
2933
  private readonly query;
2934
+ /**
2935
+ * La navigazione del percorso corrente, dalla classe in giu'. Il testo digitato conta quanto il
2936
+ * valore: mentre si scrive `Cliente.No` l'elenco deve già essere quello dei campi di `Cliente`.
2937
+ */
2938
+ private readonly navigation;
2939
+ private readonly resolution;
2644
2940
  constructor();
2645
2941
  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[]>;
2942
+ /** La tappa in cui si sta scrivendo: la classe di partenza, o quella in cui si e' entrati. */
2943
+ private readonly tail;
2944
+ /** Cio' che si premette al nome scelto: `''` sul primo segmento, `Cliente.` sul secondo. */
2945
+ readonly prefix: _angular_core.Signal<string>;
2649
2946
  /**
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.
2947
+ * Con `usage="writable"` i segmenti di sola lettura non si propongono affatto con
2948
+ * un'eccezione: quelli **navigabili** restano, perche' un membro record che non si sostituisce
2949
+ * puo' avere campi aggiornabili, e nasconderlo chiuderebbe la strada a `Richiesta.Cliente.Email`.
2950
+ */
2951
+ readonly available: _angular_core.Signal<PathEntry[]>;
2952
+ readonly options: _angular_core.Signal<PathEntry[]>;
2953
+ /**
2954
+ * Come chiamare la tappa: la `label` la porta l'involucro della descrizione, ed e' il motivo per
2955
+ * cui l'involucro esiste (§4.7.1). Assente, si mostra il nome della classe o dell'entita'.
2652
2956
  */
2653
2957
  readonly classLabel: _angular_core.Signal<string>;
2654
- /** Elenco autorevole: solo qui un membro fuori elenco e' un errore (§4.7.1). */
2958
+ /** `true` se la tappa in cui si scrive ha un elenco **autorevole** (§4.7.1). */
2655
2959
  readonly hasCatalog: _angular_core.Signal<boolean>;
2656
- /** 404: la classe non e' registrata. Il nome del membro non c'e' modo di indovinarlo. */
2960
+ /** Nell'elenco dei campi di un'entita' il titolo lo dice: non sono membri di una classe. */
2961
+ readonly isObjectLevel: _angular_core.Signal<boolean>;
2962
+ private readonly rootStatus;
2963
+ /** 404 sulla classe di partenza: il nome del membro non c'e' modo di indovinarlo. */
2657
2964
  readonly isClassUnknown: _angular_core.Signal<boolean>;
2658
2965
  /** Classe valida, membri non dichiarati: si digita, e non si segnala niente. */
2659
2966
  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;
2967
+ /** Catalogo assente per un motivo che non riguarda la classe: "non lo so". */
2968
+ readonly loadErrored: _angular_core.Signal<boolean>;
2665
2969
  readonly isUnknown: _angular_core.Signal<boolean>;
2666
- /** Il messaggio elenca i disponibili: dire solo "non esiste" non aiuta a correggere. */
2970
+ /** §4.4, §4.7.1 la catena si e' interrotta: avviso, non errore. */
2971
+ readonly isNotVerifiable: _angular_core.Signal<boolean>;
2972
+ /**
2973
+ * Il messaggio elenca i disponibili: dire solo "non esiste" non aiuta a correggere. Su un
2974
+ * percorso annidato il segmento che manca e' di **quella** tappa, e le parole cambiano con essa —
2975
+ * un campo di un'entita' non e' un membro di una classe.
2976
+ */
2667
2977
  readonly unknownMessage: _angular_core.Signal<string>;
2978
+ readonly notVerifiableMessage: _angular_core.Signal<string>;
2668
2979
  /**
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.
2980
+ * Un segmento che esiste ma non e' scrivibile, scelto dove serve una destinazione: capita su un
2981
+ * documento scritto altrove, e va detto qui invece di lasciarlo scoprire dall'attivazione. Su un
2982
+ * campo di record "scrivibile" vuol dire `createable` **oppure** `updateable` (§5.7).
2671
2983
  */
2672
2984
  readonly isNotWritable: _angular_core.Signal<boolean>;
2985
+ readonly notWritableMessage: _angular_core.Signal<"Questo campo non si scrive ne’ creando ne’ aggiornando un record: assegnarlo e’ TARGET_NOT_WRITABLE." | "Questo membro e’ calcolato: si legge, ma assegnarlo e’ TARGET_NOT_WRITABLE.">;
2673
2986
  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
2987
  open(): void;
2677
2988
  close(): void;
2678
2989
  toggle(): void;
2679
2990
  onInput(text: string): void;
2680
- choose(member: FlowStructureMember): void;
2991
+ choose(entry: PathEntry): void;
2992
+ /**
2993
+ * Scende dentro un membro composto invece di sceglierlo: e' l'equivalente di scrivere il punto, e
2994
+ * infatti scrive il punto. Serve perche' `Richiesta.Cliente` puo' essere la destinazione che si
2995
+ * vuole **oppure** la tappa da cui continuare.
2996
+ */
2997
+ descend(entry: PathEntry): void;
2998
+ canDescend(entry: PathEntry): boolean;
2681
2999
  clear(): void;
2682
- describe(member: FlowStructureMember): string;
3000
+ describe(entry: PathEntry): string;
2683
3001
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StructureMemberPickerComponent, never>;
2684
3002
  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>;
2685
3003
  }
@@ -3305,7 +3623,7 @@ declare class ResourcePanelComponent {
3305
3623
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<ResourcePanelComponent, "fb-resource-panel", never, {}, { "closed": "closed"; }, never, never, true, never>;
3306
3624
  }
3307
3625
 
3308
- type SeverityFilter = 'all' | 'Error' | 'Warning' | 'Info';
3626
+ type SeverityFilter = 'all' | FlowSeverityBucket;
3309
3627
  declare class ProblemsPanelComponent {
3310
3628
  private readonly validation;
3311
3629
  /** Chiede di selezionare l'elemento: `$start` per i rilievi sul documento. */
@@ -3315,12 +3633,25 @@ declare class ProblemsPanelComponent {
3315
3633
  readonly isRunning: _angular_core.Signal<boolean>;
3316
3634
  readonly hasResult: _angular_core.Signal<boolean>;
3317
3635
  readonly lastError: _angular_core.Signal<string | null>;
3636
+ /**
3637
+ * I conteggi dei chip vengono dai rilievi, non dal risultato: il numero sul filtro deve
3638
+ * essere quello che il filtro apre (vedi `FlowValidationStore.issueCounts`).
3639
+ */
3640
+ private readonly counts;
3318
3641
  readonly errorCount: _angular_core.Signal<number>;
3319
3642
  readonly warningCount: _angular_core.Signal<number>;
3320
3643
  readonly infoCount: _angular_core.Signal<number>;
3644
+ readonly totalCount: _angular_core.Signal<number>;
3321
3645
  readonly issues: _angular_core.Signal<FlowValidationIssue[]>;
3322
3646
  readonly isClean: _angular_core.Signal<boolean>;
3647
+ /** Ci sono rilievi, ma il filtro attivo non ne mostra nessuno: va detto, non lasciato in bianco. */
3648
+ readonly isFilteredEmpty: _angular_core.Signal<boolean>;
3649
+ readonly activeFilterLabel: _angular_core.Signal<string>;
3650
+ /** Un secondo clic sul filtro attivo torna a «Tutti»: e' l'unico modo per uscirne col mouse dov'e'. */
3323
3651
  setFilter(filter: SeverityFilter): void;
3652
+ bucketOf(issue: FlowValidationIssue): FlowSeverityBucket;
3653
+ iconText(bucket: FlowSeverityBucket): string;
3654
+ labelText(bucket: FlowSeverityBucket): string;
3324
3655
  focus(issue: FlowValidationIssue): void;
3325
3656
  close(): void;
3326
3657
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ProblemsPanelComponent, never>;
@@ -3524,6 +3855,14 @@ declare class FlowBuilderComponent {
3524
3855
  setInterviewLabel(value: string): void;
3525
3856
  setProcessType(value: string): void;
3526
3857
  readonly processTypes: _angular_core.Signal<_esfaenza_flow_builder.FlowDictionaryEntry[]>;
3858
+ /**
3859
+ * Il `processType` del documento non e' fra quelli del dizionario. Non e' un caso di scuola:
3860
+ * basta che il dizionario arrivi senza `processTypes`, o che il backend salvi una scrittura
3861
+ * diversa da quella che elenca, e la select — che non ha un'opzione corrispondente — si
3862
+ * presenta bianca su un flow che invece ha il suo tipo. Il template aggiunge l'opzione
3863
+ * mancante; qui si decide solo se serve.
3864
+ */
3865
+ readonly isProcessTypeOutOfCatalog: _angular_core.Signal<boolean>;
3527
3866
  /** `AutoLaunched` + screen e' un errore di validazione: si segnala subito (§13.6). */
3528
3867
  readonly hasScreensInAutoLaunched: _angular_core.Signal<boolean>;
3529
3868
  /** Un flow `Screen` senza screen e' `SCREEN_FLOW_WITHOUT_SCREENS`. */
@@ -3606,5 +3945,5 @@ declare class SelectValueDirective implements AfterViewChecked {
3606
3945
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<SelectValueDirective, "select[fbValue]", never, { "fbValue": { "alias": "fbValue"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
3607
3946
  }
3608
3947
 
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 };
3948
+ 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, SEVERITY_BUCKETS, SEVERITY_ICON, SEVERITY_LABEL, START_NODE_NAME, SelectValueDirective, StartInspectorComponent, StructureMemberPickerComponent, StructurePickerComponent, TYPES_WITH_AUTOMATIC_OUTPUT, TYPE_BY_COLLECTION, UNSUPPORTED_TYPES, ValueEditorComponent, VersionPanelComponent, areTypesComparable, canvasNodeId, checkConditionLogic, checkFlowName, describePathEntry, elementIcon, emptyFlowDefinition, flowNodeWidth, flowNodeWidthClass, isCustomConditionLogic, isGlobalReference, isNumericType, isTypeCheckedOperator, isValidFlowName, loadPathLevel, moveCondition, navigatePath, outletByKey, outletsOf, parseCanvasNodeId, parseInvariantNumber, parseSourceConnectorId, parseTargetConnectorId, pathAvailableNames, pathContainerLabel, pathNotVerifiableMessage, referenceRoot, remapConditionLogic, removeCondition, resolvePath, severityBucket, slugifyFlowName, sourceConnectorId, stageStepNames, stageStepOutputReferenced, stepsOf, targetConnectorId, uniqueFlowName, variantFieldOf, variantOf, variantPresetOf };
3949
+ 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, 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, 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 };