@esfaenza/flow-builder 20.3.32 → 20.3.34
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/README.md +100 -7
- package/fesm2022/esfaenza-flow-builder.mjs +16510 -14333
- package/fesm2022/esfaenza-flow-builder.mjs.map +1 -1
- package/index.d.ts +905 -18
- package/package.json +1 -1
- package/styles/flow-builder.css +19 -0
package/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as _angular_core from '@angular/core';
|
|
2
2
|
import { InjectionToken, Signal, AfterViewChecked } from '@angular/core';
|
|
3
3
|
import * as _esfaenza_flow_builder from '@esfaenza/flow-builder';
|
|
4
|
-
import { EFMarkerType, EFConnectableSide } from '@foblex/flow';
|
|
4
|
+
import { EFMarkerType, EFConnectableSide, EFResizeHandleType } from '@foblex/flow';
|
|
5
5
|
import { CdkDragMove, CdkDragEnd } from '@angular/cdk/drag-drop';
|
|
6
6
|
|
|
7
7
|
/**
|
|
@@ -683,12 +683,46 @@ interface FlowDefinition {
|
|
|
683
683
|
/** Non supportati: conservati nel round-trip ma non creabili dalla palette. */
|
|
684
684
|
steps?: FlowUnsupportedNode[];
|
|
685
685
|
experiments?: FlowUnsupportedNode[];
|
|
686
|
+
/** §3.6 — riquadri di raggruppamento: commenti sul canvas, nessun effetto sull'esecuzione. */
|
|
687
|
+
groups?: FlowGroup[];
|
|
686
688
|
apiVersion?: string;
|
|
687
689
|
timeZoneSidKey?: string;
|
|
688
690
|
triggerOrder?: number;
|
|
689
691
|
isTemplate?: boolean;
|
|
690
692
|
customProperties?: FlowCustomProperty[];
|
|
691
693
|
}
|
|
694
|
+
/**
|
|
695
|
+
* §3.6 — un riquadro di raggruppamento: l'unica collection del radice che **non contiene node**.
|
|
696
|
+
*
|
|
697
|
+
* E' documentazione, non esecuzione: nessun connector, nessuna raggiungibilita', il runtime non
|
|
698
|
+
* lo legge mai. Da lì vengono le due cose che sorprendono chi lo tratta come un elemento:
|
|
699
|
+
*
|
|
700
|
+
* - il `name` **non** entra nello spazio dei nomi dei riferimenti (§3.3), perche' non c'e'
|
|
701
|
+
* nessun riferimento da rendere ambiguo: un riquadro omonimo di una variabile non e'
|
|
702
|
+
* `NAME_DUPLICATED`, e l'unicita' si verifica **fra i riquadri** (`GROUP_NAME_DUPLICATED`);
|
|
703
|
+
* - l'appartenenza la dichiara `members`, non la geometria: il rettangolo dice come si disegna,
|
|
704
|
+
* `members` chi c'e' dentro. Con un auto-layout le coordinate valgono 0 e un riquadro
|
|
705
|
+
* conterrebbe tutto o niente, e senza `members` non sarebbe implementabile «sposto il
|
|
706
|
+
* riquadro, si spostano i node».
|
|
707
|
+
*/
|
|
708
|
+
interface FlowGroup {
|
|
709
|
+
/** Identificatore del riquadro, univoco **fra i riquadri** (§3.6). */
|
|
710
|
+
name?: string;
|
|
711
|
+
/** Intestazione mostrata sulla barra del riquadro. */
|
|
712
|
+
label?: string;
|
|
713
|
+
/** Il testo del commento. */
|
|
714
|
+
description?: string;
|
|
715
|
+
locationX?: number;
|
|
716
|
+
locationY?: number;
|
|
717
|
+
/** `0` (o assente) significa «calcolala sui membri» (§3.6). */
|
|
718
|
+
width?: number;
|
|
719
|
+
height?: number;
|
|
720
|
+
/** Token concordato fra editor e backend: la libreria non lo interpreta. */
|
|
721
|
+
color?: string;
|
|
722
|
+
isCollapsed?: boolean;
|
|
723
|
+
/** I `name` dei node contenuti. Un nome rimasto indietro e' normale, non un difetto (§3.6). */
|
|
724
|
+
members?: string[];
|
|
725
|
+
}
|
|
692
726
|
/** Le collection di node: `metadataProperty` del dizionario `elementTypes` (§3.2). */
|
|
693
727
|
declare const FLOW_NODE_COLLECTIONS: readonly ["screens", "dynamicScreens", "assignments", "decisions", "loops", "collectionProcessors", "recordLookups", "recordCreates", "recordUpdates", "recordDeletes", "recordRollbacks", "actionCalls", "scriptPluginCalls", "subflows", "transforms", "waits", "customErrors", "orchestratedStages", "steps", "experiments"];
|
|
694
728
|
type FlowNodeCollection = (typeof FLOW_NODE_COLLECTIONS)[number];
|
|
@@ -1219,6 +1253,24 @@ interface FlowOutlineConnection {
|
|
|
1219
1253
|
label?: string | null;
|
|
1220
1254
|
isGoTo?: boolean;
|
|
1221
1255
|
}
|
|
1256
|
+
/**
|
|
1257
|
+
* §3.6, §6.4 — un riquadro di raggruppamento come arriva nell'outline: gli stessi campi del
|
|
1258
|
+
* documento, con i **soli membri che corrispondono a un node esistente**. Quelli rimasti
|
|
1259
|
+
* indietro sono omessi qui e segnalati dalla validazione (`GROUP_MEMBER_UNKNOWN`, un avviso):
|
|
1260
|
+
* chi disegna non deve filtrarli di nuovo.
|
|
1261
|
+
*/
|
|
1262
|
+
interface FlowOutlineGroup {
|
|
1263
|
+
name: string;
|
|
1264
|
+
label?: string | null;
|
|
1265
|
+
description?: string | null;
|
|
1266
|
+
locationX?: number;
|
|
1267
|
+
locationY?: number;
|
|
1268
|
+
width?: number;
|
|
1269
|
+
height?: number;
|
|
1270
|
+
color?: string | null;
|
|
1271
|
+
isCollapsed?: boolean;
|
|
1272
|
+
members?: string[];
|
|
1273
|
+
}
|
|
1222
1274
|
interface FlowOutline {
|
|
1223
1275
|
flowName?: string | null;
|
|
1224
1276
|
label?: string | null;
|
|
@@ -1227,6 +1279,8 @@ interface FlowOutline {
|
|
|
1227
1279
|
entryElementName?: string | null;
|
|
1228
1280
|
nodes: FlowOutlineNode[];
|
|
1229
1281
|
connections: FlowOutlineConnection[];
|
|
1282
|
+
/** I riquadri (§3.6): si disegnano **sotto** i node e non hanno archi. */
|
|
1283
|
+
groups?: FlowOutlineGroup[];
|
|
1230
1284
|
}
|
|
1231
1285
|
type FlowInterviewStatus = 'Completed' | 'WaitingForScreen' | 'Paused' | 'Suspended'
|
|
1232
1286
|
/** **Non** e' un errore HTTP: la richiesta e' riuscita, il flow e' fallito (§6.5). */
|
|
@@ -2257,6 +2311,31 @@ declare function removeField(screen: FlowDynamicScreen, path: FlowScreenFieldPat
|
|
|
2257
2311
|
declare function moveField(screen: FlowDynamicScreen, from: FlowScreenFieldPath, toParent: FlowScreenFieldPath, toIndex: number): FlowScreenFieldPath | undefined;
|
|
2258
2312
|
/** Duplica un campo accanto all'originale, rinominandolo: i nomi restano unici (§3.3). */
|
|
2259
2313
|
declare function duplicateField(screen: FlowDynamicScreen, path: FlowScreenFieldPath, newName: string): FlowScreenFieldPath | undefined;
|
|
2314
|
+
/**
|
|
2315
|
+
* Il `path` di un rilievo di validazione tradotto nel percorso del campo che riguarda.
|
|
2316
|
+
*
|
|
2317
|
+
* Serve a far sì che il clic su un problema porti **sul campo**, non solo sull'elemento: su una
|
|
2318
|
+
* schermata da venti campi «apro la dialog e cercalo» significa contare i figli a mano, e con un
|
|
2319
|
+
* path a indici (`fields[1].fields[1].fields[0]`) contarli e' letteralmente l'unico modo.
|
|
2320
|
+
*
|
|
2321
|
+
* Il `path` e' testo libero deciso dal backend (§7), e i due formati che si incontrano sono
|
|
2322
|
+
* **entrambi** legittimi: per indice (`fields[1]`) e per nome (`fields[Sezione_1]`). Si
|
|
2323
|
+
* accettano tutti e due, perche' un editor che ne capisce uno solo funziona con metà dei
|
|
2324
|
+
* rilievi e non c'e' modo di accorgersene. Cio' che segue i campi (`.defaultValue.formulaExpression`)
|
|
2325
|
+
* si ignora: individua il campo, non il sottocampo, ed e' il campo che va selezionato.
|
|
2326
|
+
*
|
|
2327
|
+
* `null` quando il path non nomina nessun campo (un rilievo sull'elemento) o quando il campo non
|
|
2328
|
+
* esiste piu': una selezione che punta al vuoto mostrerebbe le proprieta' di un altro campo.
|
|
2329
|
+
*/
|
|
2330
|
+
declare function parseFieldPath(screen: FlowDynamicScreen | undefined, path: string | null | undefined): FlowScreenFieldPath | null;
|
|
2331
|
+
/**
|
|
2332
|
+
* Il percorso di un campo scritto **per nome**: `Indirizzo di residenza › Colonna_3 › CAP`.
|
|
2333
|
+
*
|
|
2334
|
+
* E' l'altra metà dello stesso problema: `fields[1].fields[1].fields[2]` e' un percorso che
|
|
2335
|
+
* l'utente non puo' seguire, e il pannello dei problemi lo stampava così com'era. I nomi li ha
|
|
2336
|
+
* il documento, quindi tradurli e' compito dell'editor e non del backend.
|
|
2337
|
+
*/
|
|
2338
|
+
declare function describeFieldPath(screen: FlowDynamicScreen | undefined, path: FlowScreenFieldPath | null): string;
|
|
2260
2339
|
|
|
2261
2340
|
/**
|
|
2262
2341
|
* I dynamic choice set — FRONTEND.md §5.2.
|
|
@@ -2800,6 +2879,149 @@ declare function isEmptyReferenceFilter(filter: FlowReferenceFilter | undefined)
|
|
|
2800
2879
|
declare function matchesReferenceFilter(entry: FlowTypedEntry, filter: FlowReferenceFilter): boolean;
|
|
2801
2880
|
declare function filterReferences(references: readonly FlowReference[], filter: FlowReferenceFilter | undefined): FlowReference[];
|
|
2802
2881
|
|
|
2882
|
+
/**
|
|
2883
|
+
* I riquadri di raggruppamento — FRONTEND.md §3.6.
|
|
2884
|
+
*
|
|
2885
|
+
* Logica pura: geometria e appartenenza. Il documento resta la fonte di verita' e lo scrive
|
|
2886
|
+
* {@link FlowDocumentStore}; qui non si tocca nessun signal.
|
|
2887
|
+
*
|
|
2888
|
+
* Le due cose che un riquadro non lascia indovinare, e che stanno tutte e due qui:
|
|
2889
|
+
*
|
|
2890
|
+
* - **la geometria puo' essere assente.** `width`/`height` a 0 significa «calcolala sui membri»
|
|
2891
|
+
* (§3.6), quindi il rettangolo da disegnare non e' cio' che sta scritto nel documento:
|
|
2892
|
+
* e' {@link groupRect}, che ripiega sull'ingombro dei membri piu' il respiro
|
|
2893
|
+
* dell'intestazione. Leggere `width` direttamente disegna riquadri di larghezza zero, che
|
|
2894
|
+
* non si vedono e non si possono nemmeno afferrare per correggerli;
|
|
2895
|
+
* - **l'appartenenza la dichiara `members`, non la geometria** (§3.6, regola 2). La geometria
|
|
2896
|
+
* serve solo a **calcolarla** quando l'utente trascina un node dentro o fuori
|
|
2897
|
+
* ({@link membersInside}), e il risultato va scritto nel documento. Il contrario — dedurre
|
|
2898
|
+
* l'appartenenza dai rettangoli a ogni disegno — con un auto-layout (tutte le coordinate a 0)
|
|
2899
|
+
* metterebbe tutti i node in tutti i riquadri.
|
|
2900
|
+
*/
|
|
2901
|
+
|
|
2902
|
+
/** Il rettangolo di un node o di un riquadro, in coordinate del canvas. */
|
|
2903
|
+
interface FlowRect {
|
|
2904
|
+
x: number;
|
|
2905
|
+
y: number;
|
|
2906
|
+
width: number;
|
|
2907
|
+
height: number;
|
|
2908
|
+
}
|
|
2909
|
+
/**
|
|
2910
|
+
* Altezza della barra del titolo. Serve due volte: e' il respiro sopra i membri quando la
|
|
2911
|
+
* geometria si calcola, ed e' l'altezza del riquadro **chiuso**.
|
|
2912
|
+
*/
|
|
2913
|
+
declare const GROUP_HEADER_HEIGHT = 30;
|
|
2914
|
+
/** Respiro fra il bordo del riquadro e i node che contiene. */
|
|
2915
|
+
declare const GROUP_PADDING = 28;
|
|
2916
|
+
/** Sotto queste misure il riquadro non si afferra piu': niente titolo, niente maniglia. */
|
|
2917
|
+
declare const GROUP_MIN_WIDTH = 160;
|
|
2918
|
+
declare const GROUP_MIN_HEIGHT = 90;
|
|
2919
|
+
/**
|
|
2920
|
+
* I colori che l'editor propone. `color` e' «un token concordato fra editor e backend» (§3.6),
|
|
2921
|
+
* quindi questo elenco e' una **proposta**, non un dizionario autoritativo: un token che non e'
|
|
2922
|
+
* qui non e' un errore, si disegna con il colore neutro e resta scritto com'e'.
|
|
2923
|
+
*/
|
|
2924
|
+
declare const FLOW_GROUP_COLORS: ReadonlyArray<{
|
|
2925
|
+
value: string;
|
|
2926
|
+
label: string;
|
|
2927
|
+
}>;
|
|
2928
|
+
/** La classe che porta il colore. Token sconosciuto → neutro: la libreria non lo interpreta. */
|
|
2929
|
+
declare function groupColorClass(color: string | undefined): string;
|
|
2930
|
+
/**
|
|
2931
|
+
* L'ingombro di un insieme di rettangoli, piu' il respiro. E' cio' che serve sia a calcolare la
|
|
2932
|
+
* geometria di un riquadro senza misure, sia a crearne uno **attorno alla selezione**.
|
|
2933
|
+
*/
|
|
2934
|
+
declare function boundsAround(rects: readonly FlowRect[]): FlowRect | null;
|
|
2935
|
+
/**
|
|
2936
|
+
* Il rettangolo da disegnare. `width`/`height` a 0 o assenti significano «calcolala sui membri»
|
|
2937
|
+
* (§3.6): si prende l'ingombro dei membri **presenti** — un `members` che nomina un node
|
|
2938
|
+
* cancellato e' normale (§3.6, regola 3) — e se non ne resta nemmeno uno si tiene una misura
|
|
2939
|
+
* minima nel punto dichiarato, perche' un riquadro vuoto deve restare afferrabile per essere
|
|
2940
|
+
* riempito o cancellato.
|
|
2941
|
+
*/
|
|
2942
|
+
declare function groupRect(group: FlowGroup, memberRects: readonly FlowRect[]): FlowRect;
|
|
2943
|
+
/** `true` se la geometria del riquadro e' calcolata sui membri invece che dichiarata. */
|
|
2944
|
+
declare function hasAutoSize(group: FlowGroup): boolean;
|
|
2945
|
+
/**
|
|
2946
|
+
* I node che il rettangolo contiene, per **centro** e non per intersezione: un node che sporge
|
|
2947
|
+
* da un bordo appartiene al riquadro in cui sta la sua parte maggiore, e con l'intersezione un
|
|
2948
|
+
* node in mezzo a due riquadri finirebbe in entrambi.
|
|
2949
|
+
*
|
|
2950
|
+
* L'ordine e' quello dei node passati, così un `members` ricalcolato non cambia solo perche' si
|
|
2951
|
+
* e' spostato qualcosa.
|
|
2952
|
+
*/
|
|
2953
|
+
declare function membersInside(rect: FlowRect, nodes: ReadonlyArray<{
|
|
2954
|
+
name: string;
|
|
2955
|
+
rect: FlowRect;
|
|
2956
|
+
}>): string[];
|
|
2957
|
+
/**
|
|
2958
|
+
* L'elenco dei membri dopo un trascinamento: cio' che il rettangolo contiene, **piu'** due
|
|
2959
|
+
* conservazioni che sembrano dettagli e non lo sono.
|
|
2960
|
+
*
|
|
2961
|
+
* - **l'ordine di prima si mantiene.** `membersInside` risponde nell'ordine delle collection,
|
|
2962
|
+
* quindi adottarlo tale e quale riscriveva l'elenco di **ogni** riquadro a ogni spostamento
|
|
2963
|
+
* di un node qualunque: il documento risultava modificato senza che nulla fosse cambiato, e
|
|
2964
|
+
* il diff del salvataggio era pieno di righe rimescolate;
|
|
2965
|
+
* - **i membri che non sono node restano.** Un nome che non corrisponde a nessun node e' cio'
|
|
2966
|
+
* che resta dopo una cancellazione (§3.6, regola 3): non e' un difetto, e' un avviso da
|
|
2967
|
+
* ripulire — e ripulirlo di soppiatto mentre si trascina un altro elemento farebbe sparire
|
|
2968
|
+
* l'avviso senza che nessuno l'abbia deciso. La ripulitura e' un comando, non un effetto
|
|
2969
|
+
* collaterale.
|
|
2970
|
+
*/
|
|
2971
|
+
declare function recomputeMembers(previous: readonly string[] | undefined, inside: readonly string[], isNode: (name: string) => boolean): string[];
|
|
2972
|
+
/** Due elenchi di membri sono lo stesso elenco: evita di scrivere il documento per niente. */
|
|
2973
|
+
declare function sameMembers(left: readonly string[] | undefined, right: readonly string[]): boolean;
|
|
2974
|
+
|
|
2975
|
+
/**
|
|
2976
|
+
* Innestare un elemento **su un arco** — cioe' in mezzo a un percorso già collegato.
|
|
2977
|
+
*
|
|
2978
|
+
* Perche' esiste: senza, aggiungere un passo in mezzo a una catena e' tutto lavoro manuale.
|
|
2979
|
+
* L'elemento nasce scollegato nel punto del rilascio, poi si riscrivono **due** connettori a
|
|
2980
|
+
* mano (quello di chi precede e quello del nuovo elemento) e infine si trascina il node al suo
|
|
2981
|
+
* posto — su un flow di quaranta elementi distanti duecento pixel e' il gesto piu' costoso che
|
|
2982
|
+
* l'editor chiede.
|
|
2983
|
+
*
|
|
2984
|
+
* Qui c'e' solo il **piano**: dove va il node, quale sua uscita riprende il percorso, e cosa
|
|
2985
|
+
* va spostato per fargli spazio. Applicarlo e' dello store, che lo fa in una mutazione sola —
|
|
2986
|
+
* un annulla, non quattro.
|
|
2987
|
+
*
|
|
2988
|
+
* Due cose non ovvie.
|
|
2989
|
+
*
|
|
2990
|
+
* La prima: **quale uscita riprende il percorso** non e' «la prima». Una Decision riprende dal
|
|
2991
|
+
* ramo `default` («nessuna regola vera»), non dalla prima regola, perche' le regole sono cio'
|
|
2992
|
+
* che l'autore deve ancora scrivere; un Loop riprende da `loopEnd`, perche' `loopNext` e' il
|
|
2993
|
+
* corpo. E un Custom Error non riprende affatto: interrompe l'esecuzione (§5.12), quindi
|
|
2994
|
+
* innestarlo **scollega** cio' che stava a valle — chi applica il piano lo deve dire.
|
|
2995
|
+
*
|
|
2996
|
+
* La seconda: si sposta qualcosa **solo se serve**. Se fra i due elementi c'e' già spazio per
|
|
2997
|
+
* un node, il resto del flow non si muove: un comando che riordina mezzo grafo per fare posto a
|
|
2998
|
+
* un passo e' peggio del problema che risolve.
|
|
2999
|
+
*/
|
|
3000
|
+
|
|
3001
|
+
/** Posizione di un elemento sul canvas, come la tiene il documento (§3.5). */
|
|
3002
|
+
interface FlowNodePosition {
|
|
3003
|
+
x: number;
|
|
3004
|
+
y: number;
|
|
3005
|
+
}
|
|
3006
|
+
/** Il piano di un innesto, pronto da applicare. */
|
|
3007
|
+
interface FlowEdgeInsertion {
|
|
3008
|
+
/** L'arco su cui si innesta: chi precede e da quale sua uscita. */
|
|
3009
|
+
from: string;
|
|
3010
|
+
outletKey: string;
|
|
3011
|
+
/** Cio' che l'arco raggiungeva: diventa la destinazione del nuovo elemento. */
|
|
3012
|
+
to: string;
|
|
3013
|
+
/** Dove nasce il nuovo elemento. */
|
|
3014
|
+
position: FlowNodePosition;
|
|
3015
|
+
/**
|
|
3016
|
+
* Gli elementi da traslare in basso per fare spazio, con il delta. `null` se lo spazio
|
|
3017
|
+
* c'era già: allora niente si muove.
|
|
3018
|
+
*/
|
|
3019
|
+
shift: {
|
|
3020
|
+
names: readonly string[];
|
|
3021
|
+
deltaY: number;
|
|
3022
|
+
} | null;
|
|
3023
|
+
}
|
|
3024
|
+
|
|
2803
3025
|
/** Un node come lo vede l'editor: il node piu' da dove viene. */
|
|
2804
3026
|
interface FlowNodeRef {
|
|
2805
3027
|
name: string;
|
|
@@ -2821,6 +3043,12 @@ interface FlowEdge {
|
|
|
2821
3043
|
label?: string | null;
|
|
2822
3044
|
isGoTo?: boolean;
|
|
2823
3045
|
}
|
|
3046
|
+
/** Un riquadro di raggruppamento come lo vede l'editor (§3.6). */
|
|
3047
|
+
interface FlowGroupRef {
|
|
3048
|
+
name: string;
|
|
3049
|
+
index: number;
|
|
3050
|
+
group: FlowGroup;
|
|
3051
|
+
}
|
|
2824
3052
|
/** Una risorsa come la vede l'editor. */
|
|
2825
3053
|
interface FlowResourceRef {
|
|
2826
3054
|
name: string;
|
|
@@ -2846,6 +3074,18 @@ declare class FlowDocumentStore {
|
|
|
2846
3074
|
readonly nodes: _angular_core.Signal<FlowNodeRef[]>;
|
|
2847
3075
|
readonly nodeByName: _angular_core.Signal<Map<string, FlowNodeRef>>;
|
|
2848
3076
|
readonly resources: _angular_core.Signal<FlowResourceRef[]>;
|
|
3077
|
+
/**
|
|
3078
|
+
* §3.6 — i riquadri di raggruppamento. Non sono node: non hanno uscite, non entrano negli
|
|
3079
|
+
* archi e non partecipano alla raggiungibilita'.
|
|
3080
|
+
*/
|
|
3081
|
+
readonly groups: _angular_core.Signal<FlowGroupRef[]>;
|
|
3082
|
+
/**
|
|
3083
|
+
* I nomi dei riquadri, che sono uno spazio dei nomi **a parte** (§3.6, regola 1): un riquadro
|
|
3084
|
+
* non e' referenziabile, quindi un omonimo di una variabile non e' `NAME_DUPLICATED` e non
|
|
3085
|
+
* deve comparire in {@link usedNames}. Un riquadro nuovo si confronta solo con questi
|
|
3086
|
+
* (`GROUP_NAME_DUPLICATED`).
|
|
3087
|
+
*/
|
|
3088
|
+
readonly groupNames: _angular_core.Signal<string[]>;
|
|
2849
3089
|
/**
|
|
2850
3090
|
* §3.3 — l'insieme dei nomi già usati, che e' **uno solo**: node, risorse e le **tre** cose che non
|
|
2851
3091
|
* sono ne' l'uno ne' l'altro ma il cui nome e' la radice di un riferimento — step di orchestrazione,
|
|
@@ -2883,6 +3123,27 @@ declare class FlowDocumentStore {
|
|
|
2883
3123
|
redo(): void;
|
|
2884
3124
|
/** Inserisce un node nella collection indicata dal dizionario (`metadataProperty`). */
|
|
2885
3125
|
addNode(collection: FlowNodeCollection, node: FlowAnyNode): void;
|
|
3126
|
+
/**
|
|
3127
|
+
* Inserisce un node **in mezzo a un arco**: chi precede punta al nuovo elemento, il nuovo
|
|
3128
|
+
* elemento riprende il percorso da `resumeOutletKey`, e cio' che stava sotto si sposta per
|
|
3129
|
+
* fargli spazio (§3.5).
|
|
3130
|
+
*
|
|
3131
|
+
* Tutto in **una** mutazione: sono quattro modifiche al documento, ma un solo gesto
|
|
3132
|
+
* dell'utente, e annullarlo deve riportare il flow com'era — non a un terzo del lavoro.
|
|
3133
|
+
*
|
|
3134
|
+
* `resumeOutletKey` a `null` e' legittimo e non e' un errore: un Custom Error non ha uscite,
|
|
3135
|
+
* quindi il percorso a valle resta scollegato. Lo decide {@link resumeOutletOf}, e chi chiama
|
|
3136
|
+
* ha il compito di dirlo all'utente.
|
|
3137
|
+
*/
|
|
3138
|
+
insertNodeOnEdge(collection: FlowNodeCollection, node: FlowAnyNode, insertion: FlowEdgeInsertion, resumeOutletKey: string | null): void;
|
|
3139
|
+
/** Il node con quel nome dentro una copia di lavoro: la mappa dei nomi vale sul documento. */
|
|
3140
|
+
private static nodeIn;
|
|
3141
|
+
/**
|
|
3142
|
+
* Scrive la destinazione di un'uscita **su un node**, senza passare dallo storico: la usano
|
|
3143
|
+
* `setConnector` (una modifica sola) e `insertNodeOnEdge` (quattro modifiche in un passo).
|
|
3144
|
+
* Staccare un ramo lo **omette** (§2) — vedi il commento di `setConnector`.
|
|
3145
|
+
*/
|
|
3146
|
+
private static writeConnector;
|
|
2886
3147
|
/** Modifica un node per nome. Il mutatore riceve la copia di lavoro. */
|
|
2887
3148
|
updateNode(name: string, mutate: (node: FlowAnyNode) => void, options?: {
|
|
2888
3149
|
silent?: boolean;
|
|
@@ -2903,6 +3164,8 @@ declare class FlowDocumentStore {
|
|
|
2903
3164
|
* e' `CONNECTOR_TARGET_UNKNOWN`, cioe' un errore che blocca l'attivazione (§7).
|
|
2904
3165
|
*/
|
|
2905
3166
|
removeNode(name: string): void;
|
|
3167
|
+
/** Toglie un nome dai `members` di ogni riquadro; una lista vuota si omette (§2). */
|
|
3168
|
+
private static forgetMember;
|
|
2906
3169
|
/** Toglie i connector che puntano a un node scomparso, Start compreso. */
|
|
2907
3170
|
private static clearReferencesTo;
|
|
2908
3171
|
/**
|
|
@@ -2962,10 +3225,61 @@ declare class FlowDocumentStore {
|
|
|
2962
3225
|
y: number;
|
|
2963
3226
|
};
|
|
2964
3227
|
}): string[];
|
|
2965
|
-
/**
|
|
3228
|
+
/**
|
|
3229
|
+
* Scrive la destinazione di un'uscita. `target` assente → il ramo si stacca del tutto.
|
|
3230
|
+
*
|
|
3231
|
+
* Staccare un ramo lo **omette** (§2), non lascia un oggetto senza destinazione: quello
|
|
3232
|
+
* sarebbe `CONNECTOR_TARGET_MISSING`, cioe' «ramo dichiarato ma non collegato» — un avviso —
|
|
3233
|
+
* mentre un ramo assente e' `CONNECTOR_MISSING`, la nota «il percorso finisce qui», che per
|
|
3234
|
+
* il default di una Decision e' legittimo (§3.5, §5.5). `isGoTo` non tiene in vita il
|
|
3235
|
+
* connector: e' solo un suggerimento di disegno sull'arco, e senza arco non ha niente da
|
|
3236
|
+
* suggerire — conservarlo faceva restare `{isGoTo: true}` e trasformava lo stacco di un arco
|
|
3237
|
+
* «a salto» in un avviso. La scrittura vera e' in `writeConnector`, che condivide con
|
|
3238
|
+
* l'innesto su un arco.
|
|
3239
|
+
*/
|
|
2966
3240
|
setConnector(fromName: string, outletKey: string, target: string | undefined, isGoTo?: boolean): void;
|
|
2967
3241
|
/** Rimuove un arco: il percorso finisce lì, che e' legittimo (§3.5). */
|
|
2968
3242
|
removeConnector(fromName: string, outletKey: string): void;
|
|
3243
|
+
addGroup(group: FlowGroup): void;
|
|
3244
|
+
updateGroup(index: number, mutate: (group: FlowGroup) => void, options?: {
|
|
3245
|
+
silent?: boolean;
|
|
3246
|
+
}): void;
|
|
3247
|
+
removeGroup(index: number): void;
|
|
3248
|
+
/**
|
|
3249
|
+
* Sposta un riquadro **e i suoi membri**, in una sola mutazione.
|
|
3250
|
+
*
|
|
3251
|
+
* E' il senso di `members` (§3.6, regola 2): il rettangolo dice come si disegna, l'elenco dice
|
|
3252
|
+
* chi c'e' dentro, e spostare la cornice senza il contenuto sarebbe un gesto che non serve a
|
|
3253
|
+
* nessuno. Un solo passo di storico perche' e' un solo gesto: annullarlo deve riportare
|
|
3254
|
+
* indietro riquadro e node insieme, non prima gli uni e poi l'altro.
|
|
3255
|
+
*
|
|
3256
|
+
* `silent` per il trascinamento: il chiamante registra un solo passo alla fine.
|
|
3257
|
+
*/
|
|
3258
|
+
moveGroup(name: string, x: number, y: number, options?: {
|
|
3259
|
+
silent?: boolean;
|
|
3260
|
+
}): void;
|
|
3261
|
+
/**
|
|
3262
|
+
* Scrive la geometria dichiarata di un riquadro: e' il ridimensionamento a mano.
|
|
3263
|
+
*
|
|
3264
|
+
* Scriverla e' anche il modo di **uscire** dal «calcolala sui membri» (§3.6): finche'
|
|
3265
|
+
* `width`/`height` valgono 0 il rettangolo segue i membri, e allora ridimensionarlo non
|
|
3266
|
+
* avrebbe effetto. L'appartenenza non si ricalcola qui: la ricalcola chi conosce le geometrie
|
|
3267
|
+
* dei node, cioe' il canvas.
|
|
3268
|
+
*/
|
|
3269
|
+
resizeGroup(name: string, rect: {
|
|
3270
|
+
x: number;
|
|
3271
|
+
y: number;
|
|
3272
|
+
width: number;
|
|
3273
|
+
height: number;
|
|
3274
|
+
}): void;
|
|
3275
|
+
/**
|
|
3276
|
+
* Riscrive i membri di un riquadro. Ritorna `true` se il documento e' cambiato: il canvas lo
|
|
3277
|
+
* chiama a ogni fine di trascinamento, e riscrivere un elenco identico riempirebbe lo storico
|
|
3278
|
+
* di passi che non annullano niente.
|
|
3279
|
+
*/
|
|
3280
|
+
setGroupMembers(name: string, members: readonly string[], options?: {
|
|
3281
|
+
silent?: boolean;
|
|
3282
|
+
}): boolean;
|
|
2969
3283
|
addResource(collection: FlowResourceCollection, resource: Record<string, unknown>): void;
|
|
2970
3284
|
updateResource(collection: FlowResourceCollection, index: number, mutate: (resource: Record<string, unknown>) => void): void;
|
|
2971
3285
|
removeResource(collection: FlowResourceCollection, index: number): void;
|
|
@@ -3467,6 +3781,14 @@ declare function parseTargetConnectorId(id: string): string | null;
|
|
|
3467
3781
|
/** L'id del node sul canvas: prefissato per non collidere con quello dei connettori. */
|
|
3468
3782
|
declare function canvasNodeId(nodeName: string): string;
|
|
3469
3783
|
declare function parseCanvasNodeId(id: string): string | null;
|
|
3784
|
+
/**
|
|
3785
|
+
* L'id di un riquadro sul canvas (§3.6). Prefisso diverso da quello dei node perche' gli
|
|
3786
|
+
* eventi della libreria — `fMoveNodes`, `fSelectionChange`, `fDeleteSelected` — portano node e
|
|
3787
|
+
* riquadri **nello stesso elenco**: senza due prefissi distinti, spostare un riquadro finirebbe
|
|
3788
|
+
* in `moveNode` di un node che non esiste, cioe' in un gesto che non fa niente.
|
|
3789
|
+
*/
|
|
3790
|
+
declare function canvasGroupId(groupName: string): string;
|
|
3791
|
+
declare function parseCanvasGroupId(id: string): string | null;
|
|
3470
3792
|
interface FlowCanvasNode {
|
|
3471
3793
|
/** Nome nel documento; `$start` per lo Start, che nel modello non ha nome. */
|
|
3472
3794
|
name: string;
|
|
@@ -3524,6 +3846,40 @@ interface FlowCanvasEdge {
|
|
|
3524
3846
|
label?: string | null;
|
|
3525
3847
|
isGoTo: boolean;
|
|
3526
3848
|
}
|
|
3849
|
+
/**
|
|
3850
|
+
* Un riquadro di raggruppamento come lo disegna il canvas (§3.6).
|
|
3851
|
+
*
|
|
3852
|
+
* Il rettangolo qui dentro e' **già risolto**: `width`/`height` a 0 nel documento significano
|
|
3853
|
+
* «calcolala sui membri», e il template non deve sapere quale delle due strade e' stata presa —
|
|
3854
|
+
* disegnare la geometria del documento farebbe sparire i riquadri auto-dimensionati.
|
|
3855
|
+
*/
|
|
3856
|
+
interface FlowCanvasGroup {
|
|
3857
|
+
name: string;
|
|
3858
|
+
/** Id per il canvas, prefissato: vedi {@link canvasGroupId}. */
|
|
3859
|
+
id: string;
|
|
3860
|
+
label: string;
|
|
3861
|
+
description?: string | null;
|
|
3862
|
+
position: {
|
|
3863
|
+
x: number;
|
|
3864
|
+
y: number;
|
|
3865
|
+
};
|
|
3866
|
+
size: {
|
|
3867
|
+
width: number;
|
|
3868
|
+
height: number;
|
|
3869
|
+
};
|
|
3870
|
+
/** La classe del colore; token fuori elenco → neutro (§3.6: la libreria non lo interpreta). */
|
|
3871
|
+
colorClass: string;
|
|
3872
|
+
isCollapsed: boolean;
|
|
3873
|
+
/** Quanti membri corrispondono a un node esistente. */
|
|
3874
|
+
memberCount: number;
|
|
3875
|
+
/**
|
|
3876
|
+
* Membri che nominano un node che non c'e' piu'. Non e' un difetto (§3.6, regola 3) ed e' un
|
|
3877
|
+
* avviso: si mostra come tale, perche' e' l'unico posto in cui si vede senza validare.
|
|
3878
|
+
*/
|
|
3879
|
+
unknownMembers: string[];
|
|
3880
|
+
/** La geometria e' calcolata sui membri: ridimensionarlo la dichiara (§3.6). */
|
|
3881
|
+
isAutoSized: boolean;
|
|
3882
|
+
}
|
|
3527
3883
|
|
|
3528
3884
|
/**
|
|
3529
3885
|
* Dimensioni nominali di un node, usate dal layout automatico.
|
|
@@ -3541,6 +3897,11 @@ declare class FlowCanvasComponent {
|
|
|
3541
3897
|
private readonly store;
|
|
3542
3898
|
private readonly dictionaries;
|
|
3543
3899
|
private readonly validation;
|
|
3900
|
+
/** L'elemento del componente: serve per convertire punti e per il hit test degli archi. */
|
|
3901
|
+
private readonly host;
|
|
3902
|
+
private readonly destroyRef;
|
|
3903
|
+
/** Lo schema dei gesti: serve a scambiare «trascina per spostare la vista» con «per selezionare». */
|
|
3904
|
+
private readonly gestures;
|
|
3544
3905
|
/**
|
|
3545
3906
|
* Marker di fine arco: la variante "all states" crea sia quello normale sia quello
|
|
3546
3907
|
* selezionato, evitando che l'arco selezionato perda la punta.
|
|
@@ -3553,8 +3914,16 @@ declare class FlowCanvasComponent {
|
|
|
3553
3914
|
* uscirebbe di fianco.
|
|
3554
3915
|
*/
|
|
3555
3916
|
readonly sides: typeof EFConnectableSide;
|
|
3917
|
+
/**
|
|
3918
|
+
* I lati della maniglia di ridimensionamento di un riquadro. Una sola, in basso a destra:
|
|
3919
|
+
* quattro maniglie su una cornice che sta **sotto** i node sarebbero quattro bersagli da
|
|
3920
|
+
* prendere per sbaglio mentre si lavora al grafo.
|
|
3921
|
+
*/
|
|
3922
|
+
readonly resizeHandles: typeof EFResizeHandleType;
|
|
3556
3923
|
/** Il nome dell'elemento selezionato, `$start` per lo Start. */
|
|
3557
3924
|
readonly selectedName: _angular_core.InputSignal<string | null>;
|
|
3925
|
+
/** Il riquadro selezionato (§3.6): la selezione dei riquadri e' separata da quella dei node. */
|
|
3926
|
+
readonly selectedGroupName: _angular_core.InputSignal<string | null>;
|
|
3558
3927
|
/**
|
|
3559
3928
|
* La selezione **intera**, quando ne fa parte piu' di un elemento: la libreria sa selezionare
|
|
3560
3929
|
* a rettangolo e con `Ctrl`+`A`, e i comandi che agiscono su un blocco (copia, duplica,
|
|
@@ -3581,6 +3950,9 @@ declare class FlowCanvasComponent {
|
|
|
3581
3950
|
readonly nodeOpened: _angular_core.OutputEmitterRef<string>;
|
|
3582
3951
|
readonly nodeRemoveRequested: _angular_core.OutputEmitterRef<string>;
|
|
3583
3952
|
readonly nodeDuplicateRequested: _angular_core.OutputEmitterRef<string>;
|
|
3953
|
+
/** Un riquadro e' stato scelto: chi ascolta ne apre il pannello (§3.6). */
|
|
3954
|
+
readonly groupSelected: _angular_core.OutputEmitterRef<string>;
|
|
3955
|
+
readonly groupRemoveRequested: _angular_core.OutputEmitterRef<string>;
|
|
3584
3956
|
/** Rilascio di un elemento dalla palette: tipo + punto nel sistema del canvas. */
|
|
3585
3957
|
readonly elementDropped: _angular_core.OutputEmitterRef<{
|
|
3586
3958
|
type: FlowElementType;
|
|
@@ -3588,11 +3960,28 @@ declare class FlowCanvasComponent {
|
|
|
3588
3960
|
variant?: string;
|
|
3589
3961
|
x: number;
|
|
3590
3962
|
y: number;
|
|
3963
|
+
/**
|
|
3964
|
+
* L'arco sotto il puntatore al momento del rilascio, se ce n'era uno: allora l'elemento
|
|
3965
|
+
* non nasce scollegato ma **in mezzo** a quel percorso.
|
|
3966
|
+
*/
|
|
3967
|
+
edge?: {
|
|
3968
|
+
from: string;
|
|
3969
|
+
outletKey: string;
|
|
3970
|
+
to: string;
|
|
3971
|
+
};
|
|
3591
3972
|
}>;
|
|
3592
3973
|
private readonly canvas;
|
|
3593
3974
|
private readonly _hasMovedViewport;
|
|
3594
3975
|
/** L'utente ha zoomato o spostato la vista: il comando per rimetterla a posto ha senso. */
|
|
3595
3976
|
readonly hasMovedViewport: _angular_core.Signal<boolean>;
|
|
3977
|
+
/**
|
|
3978
|
+
* L'ingrandimento corrente, in percentuale. Esiste perche' senza il numero non si capisce
|
|
3979
|
+
* dove si e': su un flow grande si finisce all'8% con la rotella e sembra che il canvas si
|
|
3980
|
+
* sia svuotato. Si aggiorna dagli eventi della libreria e dopo i nostri comandi — la
|
|
3981
|
+
* libreria non espone un signal.
|
|
3982
|
+
*/
|
|
3983
|
+
private readonly _zoomPercent;
|
|
3984
|
+
readonly zoomPercent: _angular_core.Signal<number>;
|
|
3596
3985
|
/** Il primo `fNodesRendered` inquadra, i successivi no: rifarlo combatterebbe con l'utente. */
|
|
3597
3986
|
private hasFramedOnce;
|
|
3598
3987
|
/**
|
|
@@ -3603,24 +3992,175 @@ declare class FlowCanvasComponent {
|
|
|
3603
3992
|
* vista si spalancherebbe su una card sola.
|
|
3604
3993
|
*/
|
|
3605
3994
|
onNodesRendered(): void;
|
|
3995
|
+
/**
|
|
3996
|
+
* Porta la vista **su** un elemento: e' l'arrivo della ricerca e del clic su un problema.
|
|
3997
|
+
* Se si stava troppo indietro si avvicina, altrimenti la scala non si tocca — chi stava al
|
|
3998
|
+
* 100% non vuole essere rimpicciolito per aver cercato un nome.
|
|
3999
|
+
*/
|
|
4000
|
+
bringIntoView(name: string): void;
|
|
4001
|
+
zoomIn(): void;
|
|
4002
|
+
zoomOut(): void;
|
|
4003
|
+
/**
|
|
4004
|
+
* Torna al 100% **sull'elemento corrente**, non sull'origine del canvas: al 9% l'origine puo'
|
|
4005
|
+
* essere a settemila pixel da cio' che si stava guardando, e un «100%» che porta nel vuoto e'
|
|
4006
|
+
* peggio di nessun comando. Senza selezione l'ancora e' lo Start.
|
|
4007
|
+
*/
|
|
4008
|
+
zoomToActual(): void;
|
|
4009
|
+
private applyScale;
|
|
4010
|
+
/** Rilegge la scala dalla libreria: la percentuale mostrata e' quella vera, non una stima. */
|
|
4011
|
+
private syncZoom;
|
|
3606
4012
|
/**
|
|
3607
4013
|
* Qualunque zoom o panoramica accende il pulsante. `frameFlow` passa
|
|
3608
4014
|
* `emitCanvasChange: false`, quindi il ritorno alla vista iniziale non rientra da qui e il
|
|
3609
4015
|
* pulsante si spegne invece di restare acceso per sempre.
|
|
3610
4016
|
*/
|
|
3611
4017
|
onCanvasChange(): void;
|
|
4018
|
+
/**
|
|
4019
|
+
* La modalita' selezione: sul canvas vuoto il trascinamento **seleziona** invece di spostare
|
|
4020
|
+
* la vista.
|
|
4021
|
+
*
|
|
4022
|
+
* Esiste per un motivo solo, e non e' un vezzo. Spostare venti elementi su un flow di
|
|
4023
|
+
* produzione richiede di selezionarli, e i due gesti che la libreria offre di serie —
|
|
4024
|
+
* `Ctrl`+clic per aggiungere, `Shift`+trascina per il rettangolo — **non si vedono**: chi non
|
|
4025
|
+
* li conosce sposta un elemento alla volta, che e' esattamente cio' che accadeva. Un
|
|
4026
|
+
* interruttore visibile e' l'unico modo di annunciare un gesto.
|
|
4027
|
+
*
|
|
4028
|
+
* I due gesti di prima restano validi: questo cambia solo cosa fa il **trascinamento nudo**.
|
|
4029
|
+
* Con la modalita' accesa la vista si sposta col tasto centrale — la rotella continua a
|
|
4030
|
+
* zoomare — e per questo la modalita' e' un interruttore e non un cambio permanente: chi ha un
|
|
4031
|
+
* mouse senza tasto centrale la spegne e torna a spostare la vista trascinando.
|
|
4032
|
+
*/
|
|
4033
|
+
private readonly _isSelecting;
|
|
4034
|
+
readonly isSelecting: _angular_core.Signal<boolean>;
|
|
4035
|
+
toggleSelectionMode(): void;
|
|
4036
|
+
/**
|
|
4037
|
+
* Quanti elementi sono selezionati. Serve al suggerimento: «trascinane uno per spostarli
|
|
4038
|
+
* tutti» e' l'informazione che rende utile la selezione, e senza dirla si continua a
|
|
4039
|
+
* spostarli uno per uno anche dopo averli selezionati.
|
|
4040
|
+
*/
|
|
4041
|
+
readonly selectionCount: _angular_core.Signal<number>;
|
|
3612
4042
|
resetViewport(): void;
|
|
4043
|
+
/**
|
|
4044
|
+
* Inquadra il flow, ma **non oltre** {@link MIN_READABLE_SCALE}: quando ci starebbe tutto solo
|
|
4045
|
+
* a una scala illeggibile si tiene quella e si inquadra l'**inizio**, che e' il posto da cui
|
|
4046
|
+
* si comincia a leggerlo.
|
|
4047
|
+
*
|
|
4048
|
+
* Le due strade sono **alternative**, e non «fai il fit, poi correggi»: `fitToScreen` applica
|
|
4049
|
+
* in modo asincrono (la libreria rimanda al frame successivo), quindi rileggerne la scala
|
|
4050
|
+
* subito dopo restituisce quella di prima, e la correzione partiva sempre o mai. Per questo la
|
|
4051
|
+
* scala di inquadratura la calcoliamo noi: le geometrie sono nel documento, non c'e' niente da
|
|
4052
|
+
* chiedere alla libreria.
|
|
4053
|
+
*/
|
|
3613
4054
|
private frameFlow;
|
|
4055
|
+
/**
|
|
4056
|
+
* La scala a cui il flow ci starebbe tutto, senza pavimento. Si calcola dal **documento**:
|
|
4057
|
+
* posizioni e ingombri dei node li conosciamo (la larghezza dipende dal numero di rami), e la
|
|
4058
|
+
* viewport e' l'elemento del componente. Non si chiede alla libreria perche' la sua risposta
|
|
4059
|
+
* arriva un frame dopo.
|
|
4060
|
+
*/
|
|
4061
|
+
private fittingScale;
|
|
3614
4062
|
/** Raggiungibilita': backend se c'e', locale altrimenti. */
|
|
3615
4063
|
private readonly reachability;
|
|
3616
4064
|
readonly nodes: _angular_core.Signal<FlowCanvasNode[]>;
|
|
3617
4065
|
private toCanvasNode;
|
|
3618
4066
|
/** Gli archi con destinazione: solo questi diventano `<f-connection>`. */
|
|
3619
4067
|
readonly edges: _angular_core.Signal<FlowCanvasEdge[]>;
|
|
4068
|
+
/**
|
|
4069
|
+
* Gli ingombri dei node, per l'appartenenza ai riquadri. Lo Start non c'e': `members` porta i
|
|
4070
|
+
* `name` dei node (§3.6) e lo Start nel modello non ha nome.
|
|
4071
|
+
*/
|
|
4072
|
+
private readonly nodeRects;
|
|
4073
|
+
private rectsOf;
|
|
4074
|
+
/**
|
|
4075
|
+
* I riquadri da disegnare. Vengono dal **documento** e non dall'outline: l'outline li porta
|
|
4076
|
+
* (§6.4) ma arriva mezzo secondo dopo, e una cornice che segue il trascinamento con un
|
|
4077
|
+
* ritardo e' peggio di nessuna cornice. Dell'outline si usa la raggiungibilita', che il
|
|
4078
|
+
* client non puo' sapere meglio del backend; la geometria la conosciamo noi.
|
|
4079
|
+
*/
|
|
4080
|
+
readonly groups: _angular_core.Signal<FlowCanvasGroup[]>;
|
|
4081
|
+
/**
|
|
4082
|
+
* Ricalcola l'appartenenza dai rettangoli: e' il gesto «trascino un node dentro o fuori dal
|
|
4083
|
+
* riquadro» della §3.6, regola 2 — la geometria non **e'** l'appartenenza, la **calcola**, e
|
|
4084
|
+
* il risultato va scritto in `members`.
|
|
4085
|
+
*
|
|
4086
|
+
* `moved` sono i node appena trascinati, e servono per i riquadri **senza** geometria
|
|
4087
|
+
* dichiarata: lì il rettangolo e' l'ingombro dei membri, quindi comprende sempre il membro
|
|
4088
|
+
* che si sta portando fuori — che così non ne uscirebbe mai. Escludendolo dal calcolo del
|
|
4089
|
+
* rettangolo, il confronto avviene contro la cornice che l'utente vedeva prima del gesto.
|
|
4090
|
+
*
|
|
4091
|
+
* Sempre `silent`: accompagna una mutazione che ha già registrato il suo passo di storico, e
|
|
4092
|
+
* un annulla che riporta indietro l'appartenenza ma non la posizione sarebbe incomprensibile.
|
|
4093
|
+
*/
|
|
4094
|
+
private syncGroupMembers;
|
|
4095
|
+
/** Apre e chiude il riquadro. Non tocca i membri: chiuso e' un fatto del disegno (§3.6). */
|
|
4096
|
+
toggleGroupCollapsed(event: Event, name: string): void;
|
|
4097
|
+
onGroupClick(event: Event, name: string): void;
|
|
4098
|
+
onGroupRemoveClick(event: Event, name: string): void;
|
|
4099
|
+
/**
|
|
4100
|
+
* Ridimensionamento a mano: `fGroupSizeChange` porta il rettangolo intero, posizione
|
|
4101
|
+
* compresa — trascinare la maniglia di un lato sposta anche l'angolo opposto.
|
|
4102
|
+
*
|
|
4103
|
+
* Scrivere la geometria e' anche il modo di uscire dal «calcolala sui membri» (§3.6): finche'
|
|
4104
|
+
* `width`/`height` sono 0 la cornice segue i membri, e allora ridimensionarla non si vedrebbe.
|
|
4105
|
+
*/
|
|
4106
|
+
onGroupResized(name: string, rect: {
|
|
4107
|
+
x: number;
|
|
4108
|
+
y: number;
|
|
4109
|
+
width: number;
|
|
4110
|
+
height: number;
|
|
4111
|
+
}): void;
|
|
4112
|
+
isGroupSelected(group: FlowCanvasGroup): boolean;
|
|
3620
4113
|
/** Sintesi mostrata sul node: la cosa che serve sapere senza aprire l'inspector. */
|
|
3621
4114
|
private subtitleOf;
|
|
3622
4115
|
/** Sullo Start conta il trigger: e' cio' che decide quando il flow parte (§3.4). */
|
|
3623
4116
|
private startSubtitle;
|
|
4117
|
+
/**
|
|
4118
|
+
* L'arco su cui si innesterebbe l'elemento che si sta trascinando dalla palette.
|
|
4119
|
+
*
|
|
4120
|
+
* Esiste per **dirlo prima**: senza l'evidenziazione, rilasciare sopra un arco e scoprire dopo
|
|
4121
|
+
* che il flow si e' ricollegato e' una sorpresa, e non ci sarebbe modo di rilasciare *accanto*
|
|
4122
|
+
* di proposito. Con l'arco acceso, il gesto e' una scelta.
|
|
4123
|
+
*/
|
|
4124
|
+
private readonly _insertionEdgeId;
|
|
4125
|
+
readonly insertionEdgeId: _angular_core.Signal<string | null>;
|
|
4126
|
+
/** Gli id degli archi disegnati: il hit test accetta solo questi. */
|
|
4127
|
+
private readonly edgeIds;
|
|
4128
|
+
/** L'ascoltatore attivo solo durante un trascinamento dalla palette. */
|
|
4129
|
+
private pointerListener;
|
|
4130
|
+
/**
|
|
4131
|
+
* Inizio di un trascinamento. Interessa **solo** quello di una voce della palette: trascinare
|
|
4132
|
+
* un node o il capo di una connessione non innesta niente, e accendere gli archi in quei casi
|
|
4133
|
+
* sarebbe rumore. La libreria chiama `drag-external-item` quel gesto (`kind`, o `fEventType`
|
|
4134
|
+
* nella forma vecchia).
|
|
4135
|
+
*/
|
|
4136
|
+
onDragStarted(event: {
|
|
4137
|
+
kind?: string;
|
|
4138
|
+
fEventType?: string;
|
|
4139
|
+
}): void;
|
|
4140
|
+
onDragEnded(): void;
|
|
4141
|
+
/**
|
|
4142
|
+
* L'arco sotto un punto dello schermo.
|
|
4143
|
+
*
|
|
4144
|
+
* Non serve nessuna geometria: @foblex/flow disegna gia', sotto ogni arco, un secondo path
|
|
4145
|
+
* spesso (`.f-connection-selection`, 14px) con `pointer-events: stroke` — e' quello che rende
|
|
4146
|
+
* cliccabile un arco da 2px, ed e' quello che risponde qui. L'id dell'elemento
|
|
4147
|
+
* `<f-connection>` e' il nostro `fConnectionId`, cioe' `<sorgente>|<uscita>`.
|
|
4148
|
+
*
|
|
4149
|
+
* Si scorre l'elenco invece di guardare il solo primo elemento: sopra l'arco ci sono
|
|
4150
|
+
* l'anteprima del trascinamento e il velo del canvas.
|
|
4151
|
+
*/
|
|
4152
|
+
private edgeIdAt;
|
|
4153
|
+
/**
|
|
4154
|
+
* Da coordinate del flow a coordinate dello schermo.
|
|
4155
|
+
*
|
|
4156
|
+
* `f-canvas` porta la trasformazione del canvas (`matrix(s,0,0,s,tx,ty)`) e il suo riquadro
|
|
4157
|
+
* comincia dall'origine del flow: l'angolo del suo `getBoundingClientRect` **e'** il punto
|
|
4158
|
+
* (0,0) del flow, e da li' basta la scala. Serve perche' il rilascio arriva in coordinate del
|
|
4159
|
+
* flow mentre il hit test lavora su quelle dello schermo.
|
|
4160
|
+
*/
|
|
4161
|
+
private toClientPoint;
|
|
4162
|
+
/** L'arco da cui viene un id, per rimandare al chiamante anche la destinazione. */
|
|
4163
|
+
private edgeById;
|
|
3624
4164
|
/**
|
|
3625
4165
|
* Creazione di un arco. `targetId` assente significa rilascio nel vuoto: il ramo resta
|
|
3626
4166
|
* **staccato**, cioe' omesso dal documento (`CONNECTOR_MISSING`, «il percorso finisce
|
|
@@ -3670,6 +4210,10 @@ declare class FlowCanvasComponent {
|
|
|
3670
4210
|
x: number;
|
|
3671
4211
|
y: number;
|
|
3672
4212
|
};
|
|
4213
|
+
dropPosition?: {
|
|
4214
|
+
x: number;
|
|
4215
|
+
y: number;
|
|
4216
|
+
};
|
|
3673
4217
|
}): void;
|
|
3674
4218
|
onNodeDoubleClick(name: string): void;
|
|
3675
4219
|
/**
|
|
@@ -3699,7 +4243,7 @@ declare class FlowCanvasComponent {
|
|
|
3699
4243
|
/** Classe della fascia colorata, per categoria del dizionario. */
|
|
3700
4244
|
categoryClass(node: FlowCanvasNode): string;
|
|
3701
4245
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<FlowCanvasComponent, never>;
|
|
3702
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<FlowCanvasComponent, "fb-flow-canvas", never, { "selectedName": { "alias": "selectedName"; "required": false; "isSignal": true; }; "selectedNames": { "alias": "selectedNames"; "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>;
|
|
4246
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<FlowCanvasComponent, "fb-flow-canvas", never, { "selectedName": { "alias": "selectedName"; "required": false; "isSignal": true; }; "selectedGroupName": { "alias": "selectedGroupName"; "required": false; "isSignal": true; }; "selectedNames": { "alias": "selectedNames"; "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"; "groupSelected": "groupSelected"; "groupRemoveRequested": "groupRemoveRequested"; "elementDropped": "elementDropped"; }, never, never, true, never>;
|
|
3703
4247
|
}
|
|
3704
4248
|
|
|
3705
4249
|
/** Il gesto scelto sulla palette: un tipo e, dove esiste, la sua variante (§5.6). */
|
|
@@ -3829,6 +4373,7 @@ declare class ReferencePickerComponent {
|
|
|
3829
4373
|
private readonly loadError;
|
|
3830
4374
|
readonly isOpen: _angular_core.WritableSignal<boolean>;
|
|
3831
4375
|
readonly query: _angular_core.WritableSignal<string>;
|
|
4376
|
+
private readonly panel;
|
|
3832
4377
|
constructor();
|
|
3833
4378
|
/**
|
|
3834
4379
|
* Il riferimento dichiarato piu' **lungo** che sia un prefisso del valore, e la tappa da cui
|
|
@@ -4097,6 +4642,20 @@ declare class NamePickerComponent {
|
|
|
4097
4642
|
readonly emptyMessage: _angular_core.InputSignal<string>;
|
|
4098
4643
|
/** Testo monospazio: i nomi tecnici si leggono meglio, ed e' come li mostra il resto del form. */
|
|
4099
4644
|
readonly isMono: _angular_core.InputSignal<boolean>;
|
|
4645
|
+
/**
|
|
4646
|
+
* Quando si emette cio' che si **digita**.
|
|
4647
|
+
*
|
|
4648
|
+
* `'input'` (predefinito) e' il caso normale: il picker e' legato a un campo del documento, e a
|
|
4649
|
+
* ogni tasto il valore va lì — come in una casella di testo qualunque.
|
|
4650
|
+
*
|
|
4651
|
+
* `'enter'` serve dove il picker **non** e' un campo ma un comando: l'aggiunta di un'opzione a un
|
|
4652
|
+
* elenco (§5.2), dove ogni emissione e' una riga in piu'. Lì «una per tasto» significa che
|
|
4653
|
+
* scrivere `Alta` aggiunge `A`, `Al`, `Alt` e `Alta`: la scelta dall'elenco resta immediata, il
|
|
4654
|
+
* testo scritto a mano si conferma con Invio. Non si conferma sul blur di proposito — il blur
|
|
4655
|
+
* arriva **prima** del click su un'opzione, e confermerebbe la parola incompleta insieme alla
|
|
4656
|
+
* voce scelta.
|
|
4657
|
+
*/
|
|
4658
|
+
readonly commitOn: _angular_core.InputSignal<"input" | "enter">;
|
|
4100
4659
|
readonly valueChange: _angular_core.OutputEmitterRef<string | undefined>;
|
|
4101
4660
|
readonly isOpen: _angular_core.WritableSignal<boolean>;
|
|
4102
4661
|
private readonly query;
|
|
@@ -4112,11 +4671,13 @@ declare class NamePickerComponent {
|
|
|
4112
4671
|
close(): void;
|
|
4113
4672
|
toggle(): void;
|
|
4114
4673
|
onInput(text: string): void;
|
|
4674
|
+
/** Invio: conferma il testo scritto a mano dove non lo fa la digitazione. */
|
|
4675
|
+
commit(): void;
|
|
4115
4676
|
choose(option: NamePickerOption): void;
|
|
4116
4677
|
clear(): void;
|
|
4117
4678
|
describe(option: NamePickerOption): string;
|
|
4118
4679
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NamePickerComponent, never>;
|
|
4119
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NamePickerComponent, "fb-name-picker", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "unknownMessage": { "alias": "unknownMessage"; "required": false; "isSignal": true; }; "unknownSeverity": { "alias": "unknownSeverity"; "required": false; "isSignal": true; }; "unusableOptions": { "alias": "unusableOptions"; "required": false; "isSignal": true; }; "unusableMessage": { "alias": "unusableMessage"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "isMono": { "alias": "isMono"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
|
|
4680
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NamePickerComponent, "fb-name-picker", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "unknownMessage": { "alias": "unknownMessage"; "required": false; "isSignal": true; }; "unknownSeverity": { "alias": "unknownSeverity"; "required": false; "isSignal": true; }; "unusableOptions": { "alias": "unusableOptions"; "required": false; "isSignal": true; }; "unusableMessage": { "alias": "unusableMessage"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "isMono": { "alias": "isMono"; "required": false; "isSignal": true; }; "commitOn": { "alias": "commitOn"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
|
|
4120
4681
|
}
|
|
4121
4682
|
|
|
4122
4683
|
declare class StructurePickerComponent {
|
|
@@ -4858,6 +5419,11 @@ declare class ElementInspectorComponent {
|
|
|
4858
5419
|
* nell'intestazione della dialog, e ripeterli sprecherebbe la riga piu' preziosa.
|
|
4859
5420
|
*/
|
|
4860
5421
|
readonly showHeader: _angular_core.InputSignal<boolean>;
|
|
5422
|
+
/**
|
|
5423
|
+
* Il campo di screen dinamico da selezionare all'apertura, quando si arriva da un rilievo o
|
|
5424
|
+
* dalla ricerca. Si passa avanti al compositore: qui non si sa nemmeno che forma abbia.
|
|
5425
|
+
*/
|
|
5426
|
+
readonly initialFieldPath: _angular_core.InputSignal<FlowScreenFieldPath | null>;
|
|
4861
5427
|
readonly closed: _angular_core.OutputEmitterRef<void>;
|
|
4862
5428
|
readonly removeRequested: _angular_core.OutputEmitterRef<string>;
|
|
4863
5429
|
readonly duplicateRequested: _angular_core.OutputEmitterRef<string>;
|
|
@@ -4877,6 +5443,18 @@ declare class ElementInspectorComponent {
|
|
|
4877
5443
|
/** I rilievi ancorati all'elemento (§7). */
|
|
4878
5444
|
readonly issues: _angular_core.Signal<_esfaenza_flow_builder.FlowValidationIssue[]>;
|
|
4879
5445
|
/** Il nome tecnico in modifica: si applica con un comando esplicito, non a ogni tasto. */
|
|
5446
|
+
/**
|
|
5447
|
+
* I rilievi mostrati per intero o accorciati.
|
|
5448
|
+
*
|
|
5449
|
+
* Un elemento con sei rilievi apriva il form con un muro di 350px di avvisi prima del primo
|
|
5450
|
+
* campo: su una dialog alta 550px e' il 63% di cio' che si vede, e il form sembra non esserci.
|
|
5451
|
+
* Se ne mostrano due — quanti bastano a sapere che qualcosa non va — e il resto si chiede.
|
|
5452
|
+
*/
|
|
5453
|
+
readonly issuesExpanded: _angular_core.WritableSignal<boolean>;
|
|
5454
|
+
private static readonly ISSUE_PREVIEW;
|
|
5455
|
+
readonly visibleIssues: _angular_core.Signal<_esfaenza_flow_builder.FlowValidationIssue[]>;
|
|
5456
|
+
readonly hiddenIssueCount: _angular_core.Signal<number>;
|
|
5457
|
+
toggleIssues(): void;
|
|
4880
5458
|
readonly pendingName: _angular_core.WritableSignal<string | null>;
|
|
4881
5459
|
readonly nameError: _angular_core.Signal<string | null>;
|
|
4882
5460
|
/**
|
|
@@ -4903,7 +5481,7 @@ declare class ElementInspectorComponent {
|
|
|
4903
5481
|
y: number;
|
|
4904
5482
|
}>;
|
|
4905
5483
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<ElementInspectorComponent, never>;
|
|
4906
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<ElementInspectorComponent, "fb-element-inspector", never, { "selectedName": { "alias": "selectedName"; "required": false; "isSignal": true; }; "showHeader": { "alias": "showHeader"; "required": false; "isSignal": true; }; }, { "closed": "closed"; "removeRequested": "removeRequested"; "duplicateRequested": "duplicateRequested"; "renamed": "renamed"; }, never, never, true, never>;
|
|
5484
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<ElementInspectorComponent, "fb-element-inspector", never, { "selectedName": { "alias": "selectedName"; "required": false; "isSignal": true; }; "showHeader": { "alias": "showHeader"; "required": false; "isSignal": true; }; "initialFieldPath": { "alias": "initialFieldPath"; "required": false; "isSignal": true; }; }, { "closed": "closed"; "removeRequested": "removeRequested"; "duplicateRequested": "duplicateRequested"; "renamed": "renamed"; }, never, never, true, never>;
|
|
4907
5485
|
}
|
|
4908
5486
|
|
|
4909
5487
|
declare class ElementDialogComponent {
|
|
@@ -4911,6 +5489,8 @@ declare class ElementDialogComponent {
|
|
|
4911
5489
|
private readonly dictionaries;
|
|
4912
5490
|
/** L'elemento da configurare; `$start` per lo Start. */
|
|
4913
5491
|
readonly selectedName: _angular_core.InputSignal<string | null>;
|
|
5492
|
+
/** Il campo di screen dinamico da selezionare all'apertura: si passa avanti all'inspector. */
|
|
5493
|
+
readonly initialFieldPath: _angular_core.InputSignal<FlowScreenFieldPath | null>;
|
|
4914
5494
|
readonly closed: _angular_core.OutputEmitterRef<void>;
|
|
4915
5495
|
readonly removeRequested: _angular_core.OutputEmitterRef<string>;
|
|
4916
5496
|
readonly duplicateRequested: _angular_core.OutputEmitterRef<string>;
|
|
@@ -4922,12 +5502,42 @@ declare class ElementDialogComponent {
|
|
|
4922
5502
|
readonly typeLabel: _angular_core.Signal<string>;
|
|
4923
5503
|
readonly title: _angular_core.Signal<string>;
|
|
4924
5504
|
constructor();
|
|
5505
|
+
/**
|
|
5506
|
+
* Vincolo dello spostamento: cio' che deve restare nel builder e' la **maniglia**, non la
|
|
5507
|
+
* finestra. Un `cdkDragBoundary` chiede che l'elemento ci stia tutto, e con una dialog quasi
|
|
5508
|
+
* grande quanto il builder non lascia nessun margine di movimento; qui invece si spinge la
|
|
5509
|
+
* finestra fin quasi fuori — che e' il punto: si sposta per guardare cio' che copre — e
|
|
5510
|
+
* l'intestazione resta comunque sotto il puntatore per riportarla indietro.
|
|
5511
|
+
*
|
|
5512
|
+
* Attenzione alla firma, che non e' simmetrica e il compilatore non lo dice: **in** arriva la
|
|
5513
|
+
* posizione del puntatore in coordinate di pagina, **fuori** deve andare l'angolo in alto a
|
|
5514
|
+
* sinistra dell'**elemento** — con un `constrainPosition` il CDK calcola la trasformazione da
|
|
5515
|
+
* `_initialDomRect`, non dal punto di presa. Restituendo un puntatore la finestra si sposta di
|
|
5516
|
+
* quanto e' distante la presa dal suo bordo, e il vincolo scatta nel posto sbagliato.
|
|
5517
|
+
*
|
|
5518
|
+
* Per lo stesso motivo i conti si fanno in coordinate del **viewport**: `_initialDomRect` viene
|
|
5519
|
+
* da `getBoundingClientRect`, mentre il punto in ingresso comprende lo scorrimento della pagina.
|
|
5520
|
+
*/
|
|
5521
|
+
readonly constrainPosition: (point: {
|
|
5522
|
+
x: number;
|
|
5523
|
+
y: number;
|
|
5524
|
+
}, _drag: unknown, dimensions: DOMRect, pickup: {
|
|
5525
|
+
x: number;
|
|
5526
|
+
y: number;
|
|
5527
|
+
}) => {
|
|
5528
|
+
x: number;
|
|
5529
|
+
y: number;
|
|
5530
|
+
};
|
|
5531
|
+
/** Altezza dell'intestazione: la fetta che deve restare visibile in basso. */
|
|
5532
|
+
private static readonly HEAD_HEIGHT;
|
|
5533
|
+
/** Il rettangolo del builder, nelle stesse coordinate in cui il CDK vuole la risposta. */
|
|
5534
|
+
private builderBounds;
|
|
4925
5535
|
close(): void;
|
|
4926
5536
|
onRemoveRequested(name: string): void;
|
|
4927
5537
|
onDuplicateRequested(name: string): void;
|
|
4928
5538
|
onRenamed(name: string): void;
|
|
4929
5539
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<ElementDialogComponent, never>;
|
|
4930
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<ElementDialogComponent, "fb-element-dialog", never, { "selectedName": { "alias": "selectedName"; "required": false; "isSignal": true; }; }, { "closed": "closed"; "removeRequested": "removeRequested"; "duplicateRequested": "duplicateRequested"; "renamed": "renamed"; }, never, never, true, never>;
|
|
5540
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<ElementDialogComponent, "fb-element-dialog", never, { "selectedName": { "alias": "selectedName"; "required": false; "isSignal": true; }; "initialFieldPath": { "alias": "initialFieldPath"; "required": false; "isSignal": true; }; }, { "closed": "closed"; "removeRequested": "removeRequested"; "duplicateRequested": "duplicateRequested"; "renamed": "renamed"; }, never, never, true, never>;
|
|
4931
5541
|
}
|
|
4932
5542
|
|
|
4933
5543
|
declare class PasteDialogComponent {
|
|
@@ -5113,6 +5723,16 @@ declare class DynamicScreenInspectorComponent extends NodeInspectorBase {
|
|
|
5113
5723
|
protected readonly dictionary: FlowDictionaryStore;
|
|
5114
5724
|
readonly elementType: FlowElementType;
|
|
5115
5725
|
readonly screen: _angular_core.Signal<FlowDynamicScreen>;
|
|
5726
|
+
/**
|
|
5727
|
+
* Il campo da selezionare all'apertura: lo passa chi apre il form (un rilievo del pannello dei
|
|
5728
|
+
* problemi, un risultato della ricerca). L'effetto scatta solo quando l'input **cambia**,
|
|
5729
|
+
* quindi non litiga con la selezione dell'utente; un `null` non e' un'istruzione — significa
|
|
5730
|
+
* «apri come sempre», cioe' sulle proprieta' della schermata.
|
|
5731
|
+
*/
|
|
5732
|
+
readonly initialSelection: _angular_core.InputSignal<FlowScreenFieldPath | null>;
|
|
5733
|
+
/** Il compositore: si porta in vista quando la selezione arriva da fuori (vedi il costruttore). */
|
|
5734
|
+
private readonly composer;
|
|
5735
|
+
private readonly injector;
|
|
5116
5736
|
/** Il percorso del campo selezionato: `null` = nessuno, e a destra ci sono le proprieta'
|
|
5117
5737
|
* della **schermata** — lo stesso gesto del cliccare fuori da un campo. */
|
|
5118
5738
|
private readonly selection;
|
|
@@ -5453,9 +6073,19 @@ declare class DynamicScreenInspectorComponent extends NodeInspectorBase {
|
|
|
5453
6073
|
/** I flag con default `true` si scrivono solo quando si nega, per non sporcare il diff. */
|
|
5454
6074
|
setScreenFlag(flag: 'allowBack' | 'allowFinish' | 'allowPause' | 'showHeader' | 'showFooter', value: boolean): void;
|
|
5455
6075
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<DynamicScreenInspectorComponent, never>;
|
|
5456
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<DynamicScreenInspectorComponent, "fb-dynamic-screen-inspector", never, {}, {}, never, never, true, never>;
|
|
6076
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<DynamicScreenInspectorComponent, "fb-dynamic-screen-inspector", never, { "initialSelection": { "alias": "initialSelection"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
5457
6077
|
}
|
|
5458
6078
|
|
|
6079
|
+
/**
|
|
6080
|
+
* La risorsa su cui aprire il pannello, quando ci arriva dalla ricerca. `token` esiste per far
|
|
6081
|
+
* ripartire l'effetto anche se si scegliesse due volte la stessa risorsa: senza, il secondo
|
|
6082
|
+
* arrivo non cambierebbe l'input e non accadrebbe niente.
|
|
6083
|
+
*/
|
|
6084
|
+
interface FlowResourceTarget {
|
|
6085
|
+
collection: FlowResourceCollection;
|
|
6086
|
+
index: number;
|
|
6087
|
+
token: number;
|
|
6088
|
+
}
|
|
5459
6089
|
interface ResourceKindDescriptor {
|
|
5460
6090
|
collection: FlowResourceCollection;
|
|
5461
6091
|
label: string;
|
|
@@ -5469,6 +6099,8 @@ declare class ResourcePanelComponent {
|
|
|
5469
6099
|
private readonly dictionaries;
|
|
5470
6100
|
private readonly catalog;
|
|
5471
6101
|
readonly closed: _angular_core.OutputEmitterRef<void>;
|
|
6102
|
+
/** Dove aprire il pannello: e' l'arrivo della ricerca su una risorsa. */
|
|
6103
|
+
readonly target: _angular_core.InputSignal<FlowResourceTarget | null>;
|
|
5472
6104
|
readonly kinds: ResourceKindDescriptor[];
|
|
5473
6105
|
readonly dataTypes: _angular_core.Signal<_esfaenza_flow_builder.FlowDataTypeEntry[]>;
|
|
5474
6106
|
readonly sortOrders: _angular_core.Signal<_esfaenza_flow_builder.FlowDictionaryEntry[]>;
|
|
@@ -5477,6 +6109,12 @@ declare class ResourcePanelComponent {
|
|
|
5477
6109
|
readonly activeCollection: _angular_core.WritableSignal<"variables" | "constants" | "formulas" | "textTemplates" | "choices" | "dynamicChoiceSets" | "stages">;
|
|
5478
6110
|
/** L'indice della risorsa in modifica, o `null`. */
|
|
5479
6111
|
readonly editingIndex: _angular_core.WritableSignal<number | null>;
|
|
6112
|
+
/**
|
|
6113
|
+
* La risorsa per cui e' stata chiesta la rimozione ma che risulta **usata**: si conferma.
|
|
6114
|
+
* La chiave e' `collection:index`, non la risorsa, perche' l'oggetto viene ricostruito a ogni
|
|
6115
|
+
* ricalcolo del documento.
|
|
6116
|
+
*/
|
|
6117
|
+
readonly pendingRemoval: _angular_core.WritableSignal<string | null>;
|
|
5480
6118
|
constructor();
|
|
5481
6119
|
readonly enumOptions: _angular_core.Signal<FlowCatalogEntry[]>;
|
|
5482
6120
|
readonly activeKind: _angular_core.Signal<ResourceKindDescriptor>;
|
|
@@ -5487,6 +6125,27 @@ declare class ResourcePanelComponent {
|
|
|
5487
6125
|
/** Nome valido e libero nello spazio dei nomi condiviso con i node (§3.3, §13.5). */
|
|
5488
6126
|
nameError(reference: FlowResourceRef): string | null;
|
|
5489
6127
|
add(): void;
|
|
6128
|
+
/**
|
|
6129
|
+
* Quante volte la risorsa e' **usata** nel documento.
|
|
6130
|
+
*
|
|
6131
|
+
* Serve dove il danno di una cancellazione non si vede: togliere una variabile non fa sparire
|
|
6132
|
+
* nessun arco dal canvas, e i riferimenti orfani restano lì fino alla validazione successiva.
|
|
6133
|
+
* A zero occorrenze e' l'informazione opposta, ed e' quella che serve su un flow grande: dice
|
|
6134
|
+
* quali delle venti variabili sono morte.
|
|
6135
|
+
*
|
|
6136
|
+
* Il conteggio comprende le **formule**, che citano le risorse per nome dentro l'espressione:
|
|
6137
|
+
* senza, tre formule che leggono una variabile la direbbero «non usata».
|
|
6138
|
+
*/
|
|
6139
|
+
usesOf(reference: FlowResourceRef): number;
|
|
6140
|
+
private keyOf;
|
|
6141
|
+
isPendingRemoval(reference: FlowResourceRef): boolean;
|
|
6142
|
+
/**
|
|
6143
|
+
* Il primo clic su «×» di una risorsa usata **chiede**, non cancella: e' l'unico punto
|
|
6144
|
+
* dell'editor in cui un gesto rompe silenziosamente qualcosa che sta altrove. Su una risorsa
|
|
6145
|
+
* che nessuno usa si cancella subito — l'annulla dell'editor basta come rete.
|
|
6146
|
+
*/
|
|
6147
|
+
requestRemove(reference: FlowResourceRef): void;
|
|
6148
|
+
cancelRemove(): void;
|
|
5490
6149
|
remove(reference: FlowResourceRef): void;
|
|
5491
6150
|
rename(reference: FlowResourceRef, name: string): void;
|
|
5492
6151
|
setField(reference: FlowResourceRef, field: string, value: unknown): void;
|
|
@@ -5555,14 +6214,98 @@ declare class ResourcePanelComponent {
|
|
|
5555
6214
|
value(reference: FlowResourceRef): FlowValue | undefined;
|
|
5556
6215
|
close(): void;
|
|
5557
6216
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<ResourcePanelComponent, never>;
|
|
5558
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<ResourcePanelComponent, "fb-resource-panel", never, {}, { "closed": "closed"; }, never, never, true, never>;
|
|
6217
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<ResourcePanelComponent, "fb-resource-panel", never, { "target": { "alias": "target"; "required": false; "isSignal": true; }; }, { "closed": "closed"; }, never, never, true, never>;
|
|
6218
|
+
}
|
|
6219
|
+
|
|
6220
|
+
/** Il riquadro su cui aprire il pannello. `token` fa ripartire l'effetto sulla stessa scelta. */
|
|
6221
|
+
interface FlowGroupTarget {
|
|
6222
|
+
name: string;
|
|
6223
|
+
token: number;
|
|
6224
|
+
}
|
|
6225
|
+
declare class GroupPanelComponent {
|
|
6226
|
+
private readonly store;
|
|
6227
|
+
readonly isEditable: _angular_core.InputSignal<boolean>;
|
|
6228
|
+
/** La selezione del canvas: e' cio' che si puo' aggiungere a un riquadro con un comando. */
|
|
6229
|
+
readonly selectedNodeNames: _angular_core.InputSignal<readonly string[]>;
|
|
6230
|
+
/** Il riquadro da aprire, quando ci si arriva dal canvas o dal pannello dei problemi. */
|
|
6231
|
+
readonly target: _angular_core.InputSignal<FlowGroupTarget | null>;
|
|
6232
|
+
readonly closed: _angular_core.OutputEmitterRef<void>;
|
|
6233
|
+
/** «Nuovo riquadro»: lo crea il builder, che conosce le geometrie dei node. */
|
|
6234
|
+
readonly createRequested: _angular_core.OutputEmitterRef<void>;
|
|
6235
|
+
/** Un elemento del riquadro: si porta la vista su di lui. */
|
|
6236
|
+
readonly memberFocused: _angular_core.OutputEmitterRef<string>;
|
|
6237
|
+
readonly colors: readonly {
|
|
6238
|
+
value: string;
|
|
6239
|
+
label: string;
|
|
6240
|
+
}[];
|
|
6241
|
+
readonly groups: _angular_core.Signal<_esfaenza_flow_builder.FlowGroupRef[]>;
|
|
6242
|
+
/** Quale riquadro e' aperto, per nome: l'indice cambia quando se ne cancella uno prima. */
|
|
6243
|
+
readonly openName: _angular_core.WritableSignal<string | null>;
|
|
6244
|
+
constructor();
|
|
6245
|
+
toggleOpen(name: string): void;
|
|
6246
|
+
isOpen(name: string): boolean;
|
|
6247
|
+
/** I nomi dei node esistenti: distingue un membro vivo da uno rimasto indietro (regola 3). */
|
|
6248
|
+
private readonly knownNodes;
|
|
6249
|
+
isKnownMember(member: string): boolean;
|
|
6250
|
+
membersOf(index: number): string[];
|
|
6251
|
+
staleMembersOf(index: number): string[];
|
|
6252
|
+
/** La geometria e' calcolata sui membri: si dice, perche' spiega perche' la cornice si muove. */
|
|
6253
|
+
isAutoSized(index: number): boolean;
|
|
6254
|
+
/**
|
|
6255
|
+
* Il doppione si cerca **fra i riquadri** e in nessun altro posto (§3.6, regola 1). E' l'unico
|
|
6256
|
+
* controllo di nome dell'editor che non guarda `usedNames`: un riquadro non e' referenziabile,
|
|
6257
|
+
* quindi non c'e' niente da rendere ambiguo.
|
|
6258
|
+
*/
|
|
6259
|
+
nameProblem(index: number): string | null;
|
|
6260
|
+
setName(index: number, value: string): void;
|
|
6261
|
+
setLabel(index: number, value: string): void;
|
|
6262
|
+
setDescription(index: number, value: string): void;
|
|
6263
|
+
setColor(index: number, value: string): void;
|
|
6264
|
+
setCollapsed(index: number, value: boolean): void;
|
|
6265
|
+
/** Aggiunge gli elementi selezionati sul canvas: e' il gesto per i riquadri sovrapposti. */
|
|
6266
|
+
addSelection(index: number): void;
|
|
6267
|
+
removeMember(index: number, member: string): void;
|
|
6268
|
+
/** Toglie i membri che non esistono piu': la ripulitura e' dell'editor (§3.6, regola 3). */
|
|
6269
|
+
cleanStale(index: number): void;
|
|
6270
|
+
/** Il riquadro va via, il contenuto resta: e' un commento, non un contenitore. */
|
|
6271
|
+
remove(index: number): void;
|
|
6272
|
+
canAddSelection(): boolean;
|
|
6273
|
+
/** Il colore scritto nel documento non e' fra quelli proposti: si mostra, non si corregge. */
|
|
6274
|
+
isColorOutOfList(index: number): boolean;
|
|
6275
|
+
colorOf(index: number): string;
|
|
6276
|
+
close(): void;
|
|
6277
|
+
create(): void;
|
|
6278
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<GroupPanelComponent, never>;
|
|
6279
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<GroupPanelComponent, "fb-group-panel", never, { "isEditable": { "alias": "isEditable"; "required": false; "isSignal": true; }; "selectedNodeNames": { "alias": "selectedNodeNames"; "required": false; "isSignal": true; }; "target": { "alias": "target"; "required": false; "isSignal": true; }; }, { "closed": "closed"; "createRequested": "createRequested"; "memberFocused": "memberFocused"; }, never, never, true, never>;
|
|
5559
6280
|
}
|
|
5560
6281
|
|
|
5561
6282
|
type SeverityFilter = 'all' | FlowSeverityBucket;
|
|
5562
6283
|
declare class ProblemsPanelComponent {
|
|
5563
6284
|
private readonly validation;
|
|
5564
|
-
/**
|
|
5565
|
-
readonly
|
|
6285
|
+
/** Serve solo a **leggere** i nomi: il `path` di un rilievo arriva a indici (vedi `pathLabel`). */
|
|
6286
|
+
private readonly store;
|
|
6287
|
+
/**
|
|
6288
|
+
* Chiede di **mostrare** il rilievo: selezionare l'elemento e portarlo al centro, senza
|
|
6289
|
+
* aprirne il form. E' cio' che fa il clic su una riga, ed e' deliberato: guardare l'elenco dei
|
|
6290
|
+
* problemi vuol dire scorrerlo, e un form che si apre a ogni riga copre il grafo che si sta
|
|
6291
|
+
* leggendo. `$start` per i rilievi che riguardano il documento.
|
|
6292
|
+
*/
|
|
6293
|
+
readonly elementFocused: _angular_core.OutputEmitterRef<{
|
|
6294
|
+
name: string;
|
|
6295
|
+
path?: string | null;
|
|
6296
|
+
}>;
|
|
6297
|
+
/**
|
|
6298
|
+
* Chiede di **aprire** il form sul rilievo, che e' il gesto successivo: si guarda dov'e', poi
|
|
6299
|
+
* si va a correggerlo. Sta su un bottone suo (e sul doppio clic) invece di essere il
|
|
6300
|
+
* comportamento della riga.
|
|
6301
|
+
*
|
|
6302
|
+
* Il `path` viaggia col nome perche' e' cio' che permette di selezionare il **campo** dentro
|
|
6303
|
+
* uno screen dinamico, e non solo la schermata che lo contiene.
|
|
6304
|
+
*/
|
|
6305
|
+
readonly elementOpened: _angular_core.OutputEmitterRef<{
|
|
6306
|
+
name: string;
|
|
6307
|
+
path?: string | null;
|
|
6308
|
+
}>;
|
|
5566
6309
|
readonly closed: _angular_core.OutputEmitterRef<void>;
|
|
5567
6310
|
readonly filter: _angular_core.WritableSignal<SeverityFilter>;
|
|
5568
6311
|
readonly isRunning: _angular_core.Signal<boolean>;
|
|
@@ -5587,10 +6330,23 @@ declare class ProblemsPanelComponent {
|
|
|
5587
6330
|
bucketOf(issue: FlowValidationIssue): FlowSeverityBucket;
|
|
5588
6331
|
iconText(bucket: FlowSeverityBucket): string;
|
|
5589
6332
|
labelText(bucket: FlowSeverityBucket): string;
|
|
6333
|
+
/** Clic sulla riga: porta la vista sull'elemento e lo seleziona. Non apre niente. */
|
|
5590
6334
|
focus(issue: FlowValidationIssue): void;
|
|
6335
|
+
/** Il bottone «✎» e il doppio clic: apre il form, con il campo selezionato quando c'e'. */
|
|
6336
|
+
open(issue: FlowValidationIssue, event?: Event): void;
|
|
6337
|
+
/**
|
|
6338
|
+
* Il `path` del rilievo, scritto in modo che si possa **seguire**.
|
|
6339
|
+
*
|
|
6340
|
+
* Il backend lo manda come percorso di campi (§7), e sugli screen dinamici lo manda spesso a
|
|
6341
|
+
* **indici**: `fields[1].fields[1].fields[0]` e' esatto e inutile, perche' per arrivarci si
|
|
6342
|
+
* devono contare i figli a mano. I nomi li ha il documento, quindi tradurre e' compito
|
|
6343
|
+
* dell'editor. Quando il path non nomina campi — o nomina campi che non esistono piu' — si
|
|
6344
|
+
* mostra tale e quale: inventare un'etichetta sarebbe peggio.
|
|
6345
|
+
*/
|
|
6346
|
+
pathLabel(issue: FlowValidationIssue): string;
|
|
5591
6347
|
close(): void;
|
|
5592
6348
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<ProblemsPanelComponent, never>;
|
|
5593
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<ProblemsPanelComponent, "fb-problems-panel", never, {}, { "elementFocused": "elementFocused"; "closed": "closed"; }, never, never, true, never>;
|
|
6349
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<ProblemsPanelComponent, "fb-problems-panel", never, {}, { "elementFocused": "elementFocused"; "elementOpened": "elementOpened"; "closed": "closed"; }, never, never, true, never>;
|
|
5594
6350
|
}
|
|
5595
6351
|
|
|
5596
6352
|
declare class VersionPanelComponent {
|
|
@@ -5714,7 +6470,47 @@ declare class DebugPanelComponent {
|
|
|
5714
6470
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<DebugPanelComponent, "fb-debug-panel", never, { "outcome": { "alias": "outcome"; "required": false; "isSignal": true; }; "wasDebug": { "alias": "wasDebug"; "required": false; "isSignal": true; }; "isRunning": { "alias": "isRunning"; "required": false; "isSignal": true; }; }, { "closed": "closed"; "elementFocused": "elementFocused"; "cleared": "cleared"; }, never, never, true, never>;
|
|
5715
6471
|
}
|
|
5716
6472
|
|
|
5717
|
-
|
|
6473
|
+
/**
|
|
6474
|
+
* Trovare qualcosa **nel documento** per nome.
|
|
6475
|
+
*
|
|
6476
|
+
* Non esisteva: l'unica casella di ricerca dell'editor filtra i **tipi** della palette, cioe'
|
|
6477
|
+
* cio' che si puo' aggiungere, non cio' che c'e'. Su un flow da dieci elementi non serve — si
|
|
6478
|
+
* vedono tutti; su uno da quaranta, distribuiti su settemila pixel di canvas, cercare
|
|
6479
|
+
* `CreaRigaEle` a occhio e' l'operazione piu' frequente e la piu' lenta.
|
|
6480
|
+
*
|
|
6481
|
+
* Cosa entra nell'indice: tutto cio' che ha un **nome nello spazio dei nomi comune** (§3.3) —
|
|
6482
|
+
* elementi, risorse, e le tre cose che non sono ne' l'uno ne' l'altro ma il cui nome e' la
|
|
6483
|
+
* radice di un riferimento: step di orchestrazione, campi di screen dinamico e screen action.
|
|
6484
|
+
* E' lo stesso insieme di `usedNames` dello store, e non e' una coincidenza: se un nome puo'
|
|
6485
|
+
* comparire in un riferimento, deve essere cercabile.
|
|
6486
|
+
*
|
|
6487
|
+
* Quello che l'indice **non** fa e' cercare nei valori: un'espressione che cita `Totale` non
|
|
6488
|
+
* rende `Totale` un risultato per «Totale», perche' il risultato sarebbe l'espressione. Il
|
|
6489
|
+
* «dove e' usato» e' un'altra domanda, e la risposta sta in `flow-references.ts`.
|
|
6490
|
+
*/
|
|
6491
|
+
|
|
6492
|
+
/** Cosa e' stato trovato: decide dove porta il clic. */
|
|
6493
|
+
type FlowSearchKind = 'node' | 'field' | 'action' | 'step' | 'resource';
|
|
6494
|
+
interface FlowSearchHit {
|
|
6495
|
+
kind: FlowSearchKind;
|
|
6496
|
+
/** Il nome nello spazio dei nomi comune: e' cio' su cui si cerca. */
|
|
6497
|
+
name: string;
|
|
6498
|
+
/** Testo mostrato in grande: l'etichetta se c'e', il nome altrimenti. */
|
|
6499
|
+
label: string;
|
|
6500
|
+
/** Riga secondaria: il tipo, e per cio' che sta dentro un elemento l'elemento che lo contiene. */
|
|
6501
|
+
detail: string;
|
|
6502
|
+
/** L'elemento su cui portare l'utente. Per una risorsa e' assente. */
|
|
6503
|
+
elementName?: string;
|
|
6504
|
+
/** Il percorso del campo dentro lo screen dinamico, quando `kind` e' `field`. */
|
|
6505
|
+
fieldPath?: FlowScreenFieldPath;
|
|
6506
|
+
/** Dove sta la risorsa, quando `kind` e' `resource`. */
|
|
6507
|
+
resource?: {
|
|
6508
|
+
collection: string;
|
|
6509
|
+
index: number;
|
|
6510
|
+
};
|
|
6511
|
+
}
|
|
6512
|
+
|
|
6513
|
+
type SidePanel = 'inspector' | 'resources' | 'groups' | 'versions' | 'debug';
|
|
5718
6514
|
interface Notice {
|
|
5719
6515
|
kind: 'info' | 'error';
|
|
5720
6516
|
message: string;
|
|
@@ -5758,6 +6554,30 @@ declare class FlowBuilderComponent {
|
|
|
5758
6554
|
readonly notice: _angular_core.WritableSignal<Notice | null>;
|
|
5759
6555
|
readonly outline: _angular_core.WritableSignal<FlowOutline | null>;
|
|
5760
6556
|
readonly isLoading: _angular_core.WritableSignal<boolean>;
|
|
6557
|
+
/** Il canvas: serve per portare la vista su un elemento (ricerca, clic su un problema). */
|
|
6558
|
+
private readonly canvas;
|
|
6559
|
+
private readonly search;
|
|
6560
|
+
/**
|
|
6561
|
+
* Il campo di screen dinamico da selezionare quando il form si apre.
|
|
6562
|
+
*
|
|
6563
|
+
* Esiste perche' «apri l'elemento» non basta: un rilievo su `fields[1].fields[1].fields[0]`
|
|
6564
|
+
* porta su una schermata da venti campi, e senza la selezione il campo va ritrovato contando
|
|
6565
|
+
* i figli a mano. Si azzera appena il form lo consuma: e' un'istruzione per un'apertura, non
|
|
6566
|
+
* uno stato dell'editor.
|
|
6567
|
+
*/
|
|
6568
|
+
readonly pendingFieldPath: _angular_core.WritableSignal<FlowScreenFieldPath | null>;
|
|
6569
|
+
/** La risorsa su cui aprire il pannello: e' l'arrivo della ricerca su una risorsa. */
|
|
6570
|
+
readonly resourceTarget: _angular_core.WritableSignal<FlowResourceTarget | null>;
|
|
6571
|
+
private resourceReveals;
|
|
6572
|
+
/**
|
|
6573
|
+
* Il riquadro corrente (§3.6). E' una selezione **separata** da `selectedName`: un riquadro
|
|
6574
|
+
* non e' un elemento — non si copia, non si duplica, non si valida come tale — e tenerlo nella
|
|
6575
|
+
* stessa variabile avrebbe fatto puntare l'inspector a un nome che nelle collection dei node
|
|
6576
|
+
* non esiste.
|
|
6577
|
+
*/
|
|
6578
|
+
readonly selectedGroupName: _angular_core.WritableSignal<string | null>;
|
|
6579
|
+
readonly groupTarget: _angular_core.WritableSignal<FlowGroupTarget | null>;
|
|
6580
|
+
private groupReveals;
|
|
5761
6581
|
/** Il documento e' cambiato: usato per riscadenzare validazione e outline. */
|
|
5762
6582
|
private lastDocument?;
|
|
5763
6583
|
private outlineTimer?;
|
|
@@ -5819,10 +6639,40 @@ declare class FlowBuilderComponent {
|
|
|
5819
6639
|
onSelectionChange(names: string[]): void;
|
|
5820
6640
|
/** Doppio click o bottone «✎» sul node: qui il dettaglio si apre. */
|
|
5821
6641
|
onNodeOpened(name: string): void;
|
|
5822
|
-
/**
|
|
5823
|
-
|
|
6642
|
+
/**
|
|
6643
|
+
* **Mostra** il rilievo: seleziona l'elemento e lo porta al centro, senza aprire niente.
|
|
6644
|
+
*
|
|
6645
|
+
* E' il clic su una riga del pannello dei problemi, ed e' cio' che serve nel 90% dei casi:
|
|
6646
|
+
* l'elenco si scorre, e il primo bisogno e' capire **dove** sta la cosa segnalata. Aprire il
|
|
6647
|
+
* form a ogni riga copriva il grafo che si stava leggendo, e per tornare a guardarlo si doveva
|
|
6648
|
+
* chiudere una finestra per riga.
|
|
6649
|
+
*
|
|
6650
|
+
* Un riquadro (§3.6) si seleziona come tale: gli spazi dei nomi sono due, e l'elemento vince
|
|
6651
|
+
* sull'omonimia per la stessa ragione di {@link openIssueElement}.
|
|
6652
|
+
*/
|
|
6653
|
+
revealIssueElement(event: string | {
|
|
6654
|
+
name: string;
|
|
6655
|
+
path?: string | null;
|
|
6656
|
+
}): void;
|
|
6657
|
+
/**
|
|
6658
|
+
* Porta l'utente sull'elemento **e** ne apre il form: e' il bottone «✎» di una riga dei
|
|
6659
|
+
* problemi, e il doppio clic sulla riga (§7).
|
|
6660
|
+
*
|
|
6661
|
+
* Il `path` del rilievo, quando nomina un campo di uno screen dinamico, diventa la selezione
|
|
6662
|
+
* dentro il form: e' la differenza fra «ti apro la schermata» e «ti apro il campo».
|
|
6663
|
+
*/
|
|
6664
|
+
openIssueElement(event: string | {
|
|
6665
|
+
name: string;
|
|
6666
|
+
path?: string | null;
|
|
6667
|
+
}): void;
|
|
5824
6668
|
/** Apre il dettaglio dell'elemento, nella dialog o nel pannello secondo la modalita'. */
|
|
5825
|
-
openElement(name: string): void;
|
|
6669
|
+
openElement(name: string, fieldPath?: FlowScreenFieldPath | null): void;
|
|
6670
|
+
/**
|
|
6671
|
+
* L'arrivo della ricerca. Un elemento si apre; cio' che sta **dentro** un elemento apre
|
|
6672
|
+
* l'elemento che lo contiene (con il campo selezionato, quando e' un campo); una risorsa apre
|
|
6673
|
+
* il pannello delle risorse su di lei — non c'e' niente da inquadrare sul canvas.
|
|
6674
|
+
*/
|
|
6675
|
+
onSearchPicked(hit: FlowSearchHit): void;
|
|
5826
6676
|
/** Il comando della top bar: apre il dettaglio di cio' che e' selezionato. */
|
|
5827
6677
|
openSelectedElement(): void;
|
|
5828
6678
|
closeDialog(): void;
|
|
@@ -5832,16 +6682,36 @@ declare class FlowBuilderComponent {
|
|
|
5832
6682
|
* sostituirlo con l'inspector farebbe sparire la traccia che si stava leggendo.
|
|
5833
6683
|
*/
|
|
5834
6684
|
highlightElement(name: string): void;
|
|
5835
|
-
/**
|
|
6685
|
+
/**
|
|
6686
|
+
* Rilascio dalla palette: il punto di rilascio diventa `locationX`/`locationY` (§11), a meno
|
|
6687
|
+
* che sotto il puntatore non ci fosse un **arco** — allora l'elemento si innesta in quel
|
|
6688
|
+
* percorso e la posizione la decide il piano di innesto.
|
|
6689
|
+
*/
|
|
5836
6690
|
onElementDropped(event: {
|
|
5837
6691
|
type: FlowElementType;
|
|
5838
6692
|
variant?: string;
|
|
5839
6693
|
x: number;
|
|
5840
6694
|
y: number;
|
|
6695
|
+
edge?: {
|
|
6696
|
+
from: string;
|
|
6697
|
+
outletKey: string;
|
|
6698
|
+
to: string;
|
|
6699
|
+
};
|
|
5841
6700
|
}): void;
|
|
5842
6701
|
/** Click sulla palette: l'elemento si posiziona in una zona libera. */
|
|
5843
6702
|
onElementPicked(pick: FlowPalettePick): void;
|
|
5844
6703
|
private createElement;
|
|
6704
|
+
/**
|
|
6705
|
+
* Innesta l'elemento appena costruito **in mezzo** all'arco su cui e' stato rilasciato.
|
|
6706
|
+
*
|
|
6707
|
+
* Il piano lo calcola `core/flow-insert.ts` e lo applica lo store in una mutazione sola. Qui
|
|
6708
|
+
* restano le due cose che sono dell'interfaccia: la posizione scritta nel node — il punto del
|
|
6709
|
+
* rilascio non conta piu', conta il varco fra i due elementi — e il messaggio nel caso in cui
|
|
6710
|
+
* l'elemento **non abbia uscite** (un Custom Error interrompe l'esecuzione, §5.12): il
|
|
6711
|
+
* percorso a valle resta scollegato, e va detto subito invece di lasciarlo scoprire dal
|
|
6712
|
+
* pannello dei problemi.
|
|
6713
|
+
*/
|
|
6714
|
+
private insertOnEdge;
|
|
5845
6715
|
onRemoveNode(name: string): void;
|
|
5846
6716
|
/**
|
|
5847
6717
|
* La selezione dell'editor e' il **nome** dell'elemento: dopo una rinomina il nome vecchio
|
|
@@ -5849,6 +6719,23 @@ declare class FlowBuilderComponent {
|
|
|
5849
6719
|
*/
|
|
5850
6720
|
onNodeRenamed(newName: string): void;
|
|
5851
6721
|
onDuplicateNode(name: string): void;
|
|
6722
|
+
/**
|
|
6723
|
+
* Crea un riquadro **attorno alla selezione**, che e' il gesto per cui serve: si selezionano
|
|
6724
|
+
* gli elementi che vanno insieme e si dice «questi sono una cosa». Senza selezione nasce un
|
|
6725
|
+
* riquadro vuoto sotto il flow, da riempire trascinandoci dentro gli elementi.
|
|
6726
|
+
*
|
|
6727
|
+
* La geometria si scrive sempre, anche se il contratto ammette lo 0 («calcolala sui membri»,
|
|
6728
|
+
* §3.6): un riquadro nato con una misura si puo' spostare e ridimensionare subito, mentre uno
|
|
6729
|
+
* auto-dimensionato segue i membri e la maniglia non farebbe niente.
|
|
6730
|
+
*/
|
|
6731
|
+
createGroup(): void;
|
|
6732
|
+
/** Apre il pannello dei riquadri su uno di loro. Il token lo riapre anche sulla stessa scelta. */
|
|
6733
|
+
private revealGroup;
|
|
6734
|
+
onGroupSelected(name: string): void;
|
|
6735
|
+
/** Il riquadro va via, gli elementi che conteneva restano: e' documentazione (§3.6). */
|
|
6736
|
+
onGroupRemoved(name: string): void;
|
|
6737
|
+
/** Un membro del riquadro: si porta la vista su di lui, senza aprirne il form. */
|
|
6738
|
+
focusMember(name: string): void;
|
|
5852
6739
|
/** La selezione del canvas per intero; `selectedName` resta l'elemento «corrente». */
|
|
5853
6740
|
readonly selectedNames: _angular_core.WritableSignal<string[]>;
|
|
5854
6741
|
/** L'anteprima dell'incolla, mentre la finestra e' aperta. */
|
|
@@ -5989,5 +6876,5 @@ declare class SelectValueDirective implements AfterViewChecked {
|
|
|
5989
6876
|
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<SelectValueDirective, "select[fbValue]", never, { "fbValue": { "alias": "fbValue"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
5990
6877
|
}
|
|
5991
6878
|
|
|
5992
|
-
export { ConditionEditorComponent, ConnectorEditorComponent, DebugPanelComponent, DynamicScreenInspectorComponent, ENUM_CHOICE_SET_DEFAULT_DISPLAY_FIELD, ENUM_CHOICE_SET_DEFAULT_VALUE_FIELD, ENUM_CHOICE_SET_FIELDS, ElementDialogComponent, ElementInspectorComponent, ElementPaletteComponent, EnumValuePickerComponent, FALLBACK_COLLECTION_BY_TYPE, FALLBACK_TYPE_LABEL, FLOW_BUILDER_HTTP_CONFIG, FLOW_CLIPBOARD_KIND, FLOW_CLIPBOARD_VERSION, 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_REFERENCE_FIELDS, FLOW_RESOURCE_COLLECTIONS, FLOW_VALUE_FIELDS, FLOW_VALUE_LITERAL_FIELDS, FieldAssignmentEditorComponent, FieldPickerComponent, FieldValuePickerComponent, FlowApiError, FlowBuilderApi, FlowBuilderComponent, FlowCanvasComponent, FlowCatalogStore, FlowClipboardService, FlowDictionaryStore, FlowDocumentStore, FlowEditorSession, FlowLayoutService, FlowValidationStore, FormulaEditorComponent, FormulaValidationService, HttpFlowBuilderApi, NamePickerComponent, NodeInspectorBase, ORCHESTRATION_CONDITION_OUTPUT, ObjectPickerComponent, OrchestratedStageInspectorComponent, ParameterEditorComponent, PasteDialogComponent, ProblemsPanelComponent, RecordFilterEditorComponent, ReferencePickerComponent, ResourcePanelComponent, RunDialogComponent, SEVERITY_BUCKETS, SEVERITY_ICON, SEVERITY_LABEL, START_NODE_NAME, SelectValueDirective, StartInspectorComponent, StructureMemberPickerComponent, StructurePickerComponent, TYPES_WITH_AUTOMATIC_OUTPUT, TYPE_BY_COLLECTION, UNSUPPORTED_TYPES, ValueEditorComponent, VersionPanelComponent, allFieldsOf, applyPaste, areTypesComparable, buildClipboardPayload, canvasNodeId, checkConditionLogic, checkFlowName, choiceSetSourceOf, declaredChoiceSetSources, describePathEntry, duplicateField, elementIcon, emptyFlowDefinition, enumChoiceSetFieldType, fieldAt, filterReferences, flattenFields, flowNodeWidth, flowNodeWidthClass, innerNamesOf, insertField, isClipboardPayload, isCustomConditionLogic, isEmptyReferenceFilter, isFieldResource, isGlobalReference, isNumericType, isPathInside, isTypeCheckedOperator, isUnknownEnumChoiceSetField, isValidFlowName, isValued, loadPathLevel, matchesReferenceFilter, moveCondition, moveField, navigatePath, otherSourceFieldsOf, outletByKey, outletsOf, parseCanvasNodeId, parseInvariantNumber, parseSourceConnectorId, parseTargetConnectorId, pathAvailableNames, pathContainerLabel, pathKey, pathNotVerifiableMessage, planPaste, referenceRoot, referencedRootsOf, remapConditionLogic, removeCondition, removeField, resolvePath, rewriteReferences, samePath, screenActionNames, screenFieldNames, severityBucket, slugifyFlowName, sourceConnectorId, stageStepNames, stageStepOutputReferenced, stepsOf, targetConnectorId, typeOfCollection, uniqueFlowName, valuedFieldOf, valuedFieldsOf, variantFieldOf, variantOf, variantPresetOf };
|
|
5993
|
-
export type { ChoiceSetSource, FieldAssignmentHolder, FilterFieldOption, FilterHolder, FlowActionCall, FlowAnyNode, FlowAssignment, FlowAssignmentItem, FlowAssignmentOperator, FlowAssignmentOperatorEntry, FlowBuilderHttpConfig, FlowCanvasEdge, FlowCanvasNode, FlowCatalogEntry, FlowCatalogParameter, FlowChoice, FlowClipboardNode, FlowClipboardPayload, FlowClipboardResource, FlowCloneRequest, FlowCollectionProcessor, FlowCollectionProcessorType, FlowComparisonOperator, FlowComparisonOperatorEntry, FlowCondition, FlowConditionHolder, FlowConditionLogic, FlowConflictState, FlowConnectionKind, FlowConnector, FlowConnectorTarget, FlowConstant, FlowCreateRequest, FlowCustomError, FlowCustomErrorMessage, FlowCustomProperty, FlowDataType, FlowDataTypeEntry, FlowDecision, FlowDecisionRule, FlowDefinition, FlowDictionaries, FlowDictionaryEntry, FlowDynamicChoiceSet, FlowDynamicScreen, FlowEdge, FlowElementType, FlowElementTypeEntry, FlowEnumValue, FlowErrorCategory, FlowExportQuery, FlowFieldDescription, FlowFieldUsage, FlowFieldValue, FlowFormKind, FlowFormula, FlowFormulaFunction, FlowFormulaFunctionParameter, FlowFormulaIssue, FlowFormulaUsage, FlowFormulaValidationRequest, FlowFormulaValidationResult, FlowGlobalVariableEntry, FlowInputFieldAssignment, FlowInputParameter, FlowInterviewResult, FlowInterviewStatus, FlowIssueSeverity, FlowLayoutDirection, FlowLayoutNodeInput, FlowLayoutOptions, FlowLayoutResult, FlowListQuery, FlowLoop, FlowNameCheck, FlowNameProblem, FlowNewVersionRequest, FlowNodeBase, FlowNodeCollection, FlowNodeRef, FlowObjectDescription, FlowObjectSummary, FlowOffsetUnit, FlowOrchestratedStage, FlowOutlet, FlowOutline, FlowOutlineConnection, FlowOutlineNode, FlowOutputFieldAssignment, FlowOutputParameter, FlowPalettePick, FlowPastePlan, FlowPasteRename, FlowPasteResource, FlowPendingScreen, FlowProcessType, FlowRecordCreate, FlowRecordDelete, FlowRecordFilter, FlowRecordFilterOperator, FlowRecordLookup, FlowRecordRollback, FlowRecordTriggerType, FlowRecordUpdate, FlowRecordValue, FlowReference, FlowReferenceFilter, FlowReferenceKind, FlowRegionContainerType, FlowResourceCollection, FlowResourceKindEntry, FlowResourceRef, FlowResumeRequest, FlowRunOutcome, FlowRunRequest, FlowSaveRequest, FlowSaveResult, FlowSchedule, FlowScheduledPath, FlowScreen, FlowScreenAction, FlowScreenField, FlowScreenFieldInputsRevisited, FlowScreenFieldNode, FlowScreenFieldPath, FlowScreenFieldType, FlowScreenFieldTypeEntry, FlowScreenNavigation, FlowScreenResponseRequest, FlowScreenTrigger, FlowScreenTriggerInitBehavior, FlowScreenValidationRule, FlowScriptPluginCall, FlowSeverityBucket, FlowSortOption, FlowSortOrder, FlowStage, FlowStageStep, FlowStageStepActionType, FlowStageStepAssignee, FlowStageStepConditionActionType, FlowStageStepRequest, FlowStageStepState, FlowStageStepStatus, FlowStageStepTypeEntry, FlowStart, FlowStartInterviewRequest, FlowStructureDescribed, FlowStructureDescription, FlowStructureInstance, FlowStructureMember, FlowSubflow, FlowSubflowInputAssignment, FlowSubflowOutputAssignment, FlowSummary, FlowTextTemplate, FlowTraceEntry, FlowTransactionModel, FlowTransform, FlowTransformType, FlowTransformValue, FlowTransformValueAction, FlowTriggerType, FlowTypedEntry, FlowTypedValue, FlowUnsupportedNode, FlowValidationIssue, FlowValidationResult, FlowValue, FlowVariable, FlowVersionStatus, FlowVersionSummary, FlowWait, FlowWaitEvent, NamePickerOption, PaletteGroup, PaletteItem, ParameterHolder, PathCatalog, PathContainer, PathContainerKind, PathEntry, PathLevel, PathLevelStatus, PathNavigation, PathNavigationRequest, PathResolution, PathStopReason, PathValueSet, StructureMemberUsage, ValueMode };
|
|
6879
|
+
export { ConditionEditorComponent, ConnectorEditorComponent, DebugPanelComponent, DynamicScreenInspectorComponent, ENUM_CHOICE_SET_DEFAULT_DISPLAY_FIELD, ENUM_CHOICE_SET_DEFAULT_VALUE_FIELD, ENUM_CHOICE_SET_FIELDS, ElementDialogComponent, ElementInspectorComponent, ElementPaletteComponent, EnumValuePickerComponent, FALLBACK_COLLECTION_BY_TYPE, FALLBACK_TYPE_LABEL, FLOW_BUILDER_HTTP_CONFIG, FLOW_CLIPBOARD_KIND, FLOW_CLIPBOARD_VERSION, FLOW_ELEMENT_ICONS, FLOW_ELEMENT_VARIANT_FIELDS, FLOW_ELEMENT_VARIANT_ICONS, FLOW_ERROR_FALLBACK_MESSAGE, FLOW_ERROR_HTTP_STATUS, FLOW_GROUP_COLORS, FLOW_NAME_PATTERN, FLOW_NODE_COLLECTIONS, FLOW_NODE_HEIGHT, FLOW_NODE_WIDTH, FLOW_REFERENCE_FIELDS, FLOW_RESOURCE_COLLECTIONS, FLOW_VALUE_FIELDS, FLOW_VALUE_LITERAL_FIELDS, FieldAssignmentEditorComponent, FieldPickerComponent, FieldValuePickerComponent, FlowApiError, FlowBuilderApi, FlowBuilderComponent, FlowCanvasComponent, FlowCatalogStore, FlowClipboardService, FlowDictionaryStore, FlowDocumentStore, FlowEditorSession, FlowLayoutService, FlowValidationStore, FormulaEditorComponent, FormulaValidationService, GROUP_HEADER_HEIGHT, GROUP_MIN_HEIGHT, GROUP_MIN_WIDTH, GROUP_PADDING, GroupPanelComponent, HttpFlowBuilderApi, NamePickerComponent, NodeInspectorBase, ORCHESTRATION_CONDITION_OUTPUT, ObjectPickerComponent, OrchestratedStageInspectorComponent, ParameterEditorComponent, PasteDialogComponent, ProblemsPanelComponent, RecordFilterEditorComponent, ReferencePickerComponent, ResourcePanelComponent, RunDialogComponent, SEVERITY_BUCKETS, SEVERITY_ICON, SEVERITY_LABEL, START_NODE_NAME, SelectValueDirective, StartInspectorComponent, StructureMemberPickerComponent, StructurePickerComponent, TYPES_WITH_AUTOMATIC_OUTPUT, TYPE_BY_COLLECTION, UNSUPPORTED_TYPES, ValueEditorComponent, VersionPanelComponent, allFieldsOf, applyPaste, areTypesComparable, boundsAround, buildClipboardPayload, canvasGroupId, canvasNodeId, checkConditionLogic, checkFlowName, choiceSetSourceOf, declaredChoiceSetSources, describeFieldPath, describePathEntry, duplicateField, elementIcon, emptyFlowDefinition, enumChoiceSetFieldType, fieldAt, filterReferences, flattenFields, flowNodeWidth, flowNodeWidthClass, groupColorClass, groupRect, hasAutoSize, innerNamesOf, insertField, isClipboardPayload, isCustomConditionLogic, isEmptyReferenceFilter, isFieldResource, isGlobalReference, isNumericType, isPathInside, isTypeCheckedOperator, isUnknownEnumChoiceSetField, isValidFlowName, isValued, loadPathLevel, matchesReferenceFilter, membersInside, moveCondition, moveField, navigatePath, otherSourceFieldsOf, outletByKey, outletsOf, parseCanvasGroupId, parseCanvasNodeId, parseFieldPath, parseInvariantNumber, parseSourceConnectorId, parseTargetConnectorId, pathAvailableNames, pathContainerLabel, pathKey, pathNotVerifiableMessage, planPaste, recomputeMembers, referenceRoot, referencedRootsOf, remapConditionLogic, removeCondition, removeField, resolvePath, rewriteReferences, sameMembers, samePath, screenActionNames, screenFieldNames, severityBucket, slugifyFlowName, sourceConnectorId, stageStepNames, stageStepOutputReferenced, stepsOf, targetConnectorId, typeOfCollection, uniqueFlowName, valuedFieldOf, valuedFieldsOf, variantFieldOf, variantOf, variantPresetOf };
|
|
6880
|
+
export type { ChoiceSetSource, FieldAssignmentHolder, FilterFieldOption, FilterHolder, FlowActionCall, FlowAnyNode, FlowAssignment, FlowAssignmentItem, FlowAssignmentOperator, FlowAssignmentOperatorEntry, FlowBuilderHttpConfig, FlowCanvasEdge, FlowCanvasGroup, FlowCanvasNode, FlowCatalogEntry, FlowCatalogParameter, FlowChoice, FlowClipboardNode, FlowClipboardPayload, FlowClipboardResource, FlowCloneRequest, FlowCollectionProcessor, FlowCollectionProcessorType, FlowComparisonOperator, FlowComparisonOperatorEntry, FlowCondition, FlowConditionHolder, FlowConditionLogic, FlowConflictState, FlowConnectionKind, FlowConnector, FlowConnectorTarget, FlowConstant, FlowCreateRequest, FlowCustomError, FlowCustomErrorMessage, FlowCustomProperty, FlowDataType, FlowDataTypeEntry, FlowDecision, FlowDecisionRule, FlowDefinition, FlowDictionaries, FlowDictionaryEntry, FlowDynamicChoiceSet, FlowDynamicScreen, FlowEdge, FlowElementType, FlowElementTypeEntry, FlowEnumValue, FlowErrorCategory, FlowExportQuery, FlowFieldDescription, FlowFieldUsage, FlowFieldValue, FlowFormKind, FlowFormula, FlowFormulaFunction, FlowFormulaFunctionParameter, FlowFormulaIssue, FlowFormulaUsage, FlowFormulaValidationRequest, FlowFormulaValidationResult, FlowGlobalVariableEntry, FlowGroup, FlowGroupRef, FlowGroupTarget, FlowInputFieldAssignment, FlowInputParameter, FlowInterviewResult, FlowInterviewStatus, FlowIssueSeverity, FlowLayoutDirection, FlowLayoutNodeInput, FlowLayoutOptions, FlowLayoutResult, FlowListQuery, FlowLoop, FlowNameCheck, FlowNameProblem, FlowNewVersionRequest, FlowNodeBase, FlowNodeCollection, FlowNodeRef, FlowObjectDescription, FlowObjectSummary, FlowOffsetUnit, FlowOrchestratedStage, FlowOutlet, FlowOutline, FlowOutlineConnection, FlowOutlineGroup, FlowOutlineNode, FlowOutputFieldAssignment, FlowOutputParameter, FlowPalettePick, FlowPastePlan, FlowPasteRename, FlowPasteResource, FlowPendingScreen, FlowProcessType, FlowRecordCreate, FlowRecordDelete, FlowRecordFilter, FlowRecordFilterOperator, FlowRecordLookup, FlowRecordRollback, FlowRecordTriggerType, FlowRecordUpdate, FlowRecordValue, FlowRect, FlowReference, FlowReferenceFilter, FlowReferenceKind, FlowRegionContainerType, FlowResourceCollection, FlowResourceKindEntry, FlowResourceRef, FlowResourceTarget, FlowResumeRequest, FlowRunOutcome, FlowRunRequest, FlowSaveRequest, FlowSaveResult, FlowSchedule, FlowScheduledPath, FlowScreen, FlowScreenAction, FlowScreenField, FlowScreenFieldInputsRevisited, FlowScreenFieldNode, FlowScreenFieldPath, FlowScreenFieldType, FlowScreenFieldTypeEntry, FlowScreenNavigation, FlowScreenResponseRequest, FlowScreenTrigger, FlowScreenTriggerInitBehavior, FlowScreenValidationRule, FlowScriptPluginCall, FlowSeverityBucket, FlowSortOption, FlowSortOrder, FlowStage, FlowStageStep, FlowStageStepActionType, FlowStageStepAssignee, FlowStageStepConditionActionType, FlowStageStepRequest, FlowStageStepState, FlowStageStepStatus, FlowStageStepTypeEntry, FlowStart, FlowStartInterviewRequest, FlowStructureDescribed, FlowStructureDescription, FlowStructureInstance, FlowStructureMember, FlowSubflow, FlowSubflowInputAssignment, FlowSubflowOutputAssignment, FlowSummary, FlowTextTemplate, FlowTraceEntry, FlowTransactionModel, FlowTransform, FlowTransformType, FlowTransformValue, FlowTransformValueAction, FlowTriggerType, FlowTypedEntry, FlowTypedValue, FlowUnsupportedNode, FlowValidationIssue, FlowValidationResult, FlowValue, FlowVariable, FlowVersionStatus, FlowVersionSummary, FlowWait, FlowWaitEvent, NamePickerOption, PaletteGroup, PaletteItem, ParameterHolder, PathCatalog, PathContainer, PathContainerKind, PathEntry, PathLevel, PathLevelStatus, PathNavigation, PathNavigationRequest, PathResolution, PathStopReason, PathValueSet, StructureMemberUsage, ValueMode };
|