@esfaenza/flow-builder 20.3.41 → 20.3.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.d.ts CHANGED
@@ -74,7 +74,15 @@ interface FlowRecordFilter {
74
74
  value?: FlowValue;
75
75
  }
76
76
  type FlowRecordFilterOperator = 'EqualTo' | 'NotEqualTo' | 'GreaterThan' | 'GreaterThanOrEqualTo' | 'LessThan' | 'LessThanOrEqualTo' | 'StartsWith' | 'EndsWith' | 'Contains' | 'IsNull' | string;
77
- /** §4.3 — `and` | `or` | espressione sugli indici 1-based | `Formula`. */
77
+ /**
78
+ * §4.3 — `and` | `or` | espressione sugli indici 1-based | `Formula`.
79
+ *
80
+ * Il tipo e' uno, ma i due campi che lo usano non ammettono le stesse forme: `Formula` vale per
81
+ * il `conditionLogic` di una condizione (l'esito lo determina il campo `formula`), e **non** vale
82
+ * per nessun `filterLogic` — su un dynamic choice set e' un errore di validazione, altrove passa
83
+ * la validazione e fa fallire l'esecuzione (§4.4). La formula di un filtro e' un campo suo,
84
+ * `filterFormula`, e non passa da qui.
85
+ */
78
86
  type FlowConditionLogic = 'and' | 'or' | 'Formula' | string;
79
87
  /** Blocco condizioni riusato da Decision rule, Wait event, Collection Processor, Start. */
80
88
  interface FlowConditionHolder {
@@ -176,11 +184,22 @@ interface FlowDynamicChoiceSet {
176
184
  displayField?: string;
177
185
  /** Assente: il valore memorizzato e' `Name` su un enum, e va dichiarato altrove. */
178
186
  valueField?: string;
187
+ /**
188
+ * Valgono sulle sole sorgenti `object` — dove diventano la query — ed `enumType`, dove sono
189
+ * valutati in memoria. Su una `collectionReference` le opzioni sono gli elementi della
190
+ * collection nell'ordine in cui ci sono: dichiararli lì e' `CHOICE_SET_FILTERS_IGNORED` (§5.2).
191
+ */
179
192
  sortField?: string;
180
193
  sortOrder?: FlowSortOrder;
194
+ /** `limit` invece vale su tutt'e tre le sorgenti; default e massimo 200 (§5.2). */
181
195
  limit?: number;
182
- /** Sempre in AND: nessun `filterLogic` qui (§4.4). Su un enum sono valutati in memoria. */
183
196
  filters?: FlowRecordFilter[];
197
+ /**
198
+ * §4.4 — c'e' anche qui: `AND` (o assente), `OR`, oppure la logica personalizzata sugli indici
199
+ * 1-based. Il valore `Formula` **non** e' supportato, e su un choice set e' un errore di
200
+ * validazione esplicito.
201
+ */
202
+ filterLogic?: FlowConditionLogic;
184
203
  }
185
204
  interface FlowStage {
186
205
  name?: string;
@@ -2122,8 +2141,14 @@ declare function moveCondition(holder: FlowConditionHolder, from: number, to: nu
2122
2141
  * Verifica che un'espressione custom sia sintatticamente accettabile e che ogni indice
2123
2142
  * esista. Serve al feedback immediato nel form: la verita' resta della validazione
2124
2143
  * del backend (`CONDITION_LOGIC_INVALID`).
2144
+ *
2145
+ * Il `term` esiste perche' la stessa regola vale su **due strutture diverse**: le condizioni
2146
+ * (§4.3) e i filtri sui record (§4.4), che dalla revisione del contratto hanno la logica
2147
+ * personalizzata anche sui dynamic choice set. Il progetto tiene distinte le due cose in ogni
2148
+ * altro punto, e un messaggio che dice «condizione» dentro un elenco di filtri manda a cercare
2149
+ * qualcosa che in quel form non c'e'.
2125
2150
  */
2126
- declare function checkConditionLogic(logic: string, conditionCount: number): string | null;
2151
+ declare function checkConditionLogic(logic: string, conditionCount: number, term?: 'condizione' | 'filtro'): string | null;
2127
2152
 
2128
2153
  /**
2129
2154
  * Testo e numero non si confrontano — FRONTEND.md §4.3, §13.13.
@@ -3187,6 +3212,21 @@ declare class FlowDocumentStore {
3187
3212
  * riferimenti a output automatico (`Vecchio.Campo` → `Nuovo.Campo`).
3188
3213
  */
3189
3214
  renameNode(oldName: string, newName: string): void;
3215
+ /**
3216
+ * Etichetta **e** nome tecnico in una sola mutazione.
3217
+ *
3218
+ * Serve al nome che segue l'etichetta di un elemento appena creato (§3.3): farlo con due
3219
+ * `update` scriverebbe due passi di storico per ogni battuta, e l'annulla riporterebbe
3220
+ * indietro il nome lasciando l'etichetta nuova — uno stato che non e' mai esistito. Con
3221
+ * `newName` assente e' un semplice cambio di etichetta.
3222
+ */
3223
+ relabelNode(name: string, label: string, newName?: string | null): void;
3224
+ /**
3225
+ * Il corpo della rinomina, sul draft: nome del node, riferimenti, appartenenza ai riquadri.
3226
+ * `reference` va risolto **prima** dell'`update`, perche' l'indice viene dal documento
3227
+ * corrente e dentro il mutatore i signal derivati sono ancora quelli di prima.
3228
+ */
3229
+ private static applyRename;
3190
3230
  /**
3191
3231
  * §5.2 — rinomina un campo di screen dinamico riscrivendo i riferimenti che lo usano.
3192
3232
  *
@@ -4777,7 +4817,7 @@ declare class NamePickerComponent {
4777
4817
  * **errori** che bloccano l'attivazione (`ACTION_UNKNOWN`, `FORM_UNKNOWN`), mentre un flow
4778
4818
  * senza versione attiva e' un avviso. Mostrarli con lo stesso colore direbbe il falso.
4779
4819
  */
4780
- readonly unknownSeverity: _angular_core.InputSignal<"error" | "warn">;
4820
+ readonly unknownSeverity: _angular_core.InputSignal<"warn" | "error">;
4781
4821
  /**
4782
4822
  * Nomi che **esistono** ma non sono utilizzabili qui. Il caso vero e' il catalogo dei form,
4783
4823
  * dove una schermata intera e un componente vivono nello stesso elenco e si distinguono per
@@ -5346,7 +5386,7 @@ declare class RecordFilterEditorComponent {
5346
5386
  * (§5.8, §13.10).
5347
5387
  */
5348
5388
  readonly emptyWarning: _angular_core.InputSignal<string | null>;
5349
- readonly emptyWarningSeverity: _angular_core.InputSignal<"error" | "warn">;
5389
+ readonly emptyWarningSeverity: _angular_core.InputSignal<"warn" | "error">;
5350
5390
  readonly changed: _angular_core.OutputEmitterRef<(holder: FilterHolder) => void>;
5351
5391
  /** Tutti i campi, filtrabili o no: serve solo a riconoscere le chiavi composte (§5.8). */
5352
5392
  private readonly allFields;
@@ -5369,8 +5409,28 @@ declare class RecordFilterEditorComponent {
5369
5409
  * evita la ricerca di un campo che nell'elenco non c'e' e non ci sara'.
5370
5410
  */
5371
5411
  readonly identifierNotFilterable: _angular_core.Signal<boolean>;
5412
+ /**
5413
+ * La modalita' attiva. La **formula si riconosce dal suo campo** e non da `filterLogic`: il
5414
+ * valore `Formula` non e' supportato da nessun elemento (§4.4), quindi non puo' essere cio' che
5415
+ * accende la modalita' — altrimenti l'editor riscriverebbe nel documento un valore che fa
5416
+ * fallire l'esecuzione.
5417
+ */
5372
5418
  readonly logicMode: _angular_core.Signal<"and" | "or" | "formula" | "custom">;
5419
+ /**
5420
+ * `filterLogic: "Formula"` letto dal documento. Non lo scrive nessun gesto di questo editor:
5421
+ * arriva da un flow scritto altrove, e va detto invece di essere corretto di soppiatto —
5422
+ * cancellarlo sarebbe una modifica che l'utente non ha chiesto, su un campo che potrebbe
5423
+ * essere l'unico indizio di cosa quel flow voleva fare.
5424
+ */
5425
+ readonly unsupportedFormulaLogic: _angular_core.Signal<boolean>;
5373
5426
  readonly customLogic: _angular_core.Signal<string>;
5427
+ /**
5428
+ * Il riscontro locale sull'espressione: indici che non esistono, parentesi sbilanciate, termini
5429
+ * rimasti orfani (`?`) dopo la cancellazione di un filtro. La verita' resta della validazione
5430
+ * del backend (`CONDITION_LOGIC_INVALID`, che e' un **errore** e blocca l'attivazione), ma
5431
+ * scoprirlo lì significa scoprirlo dopo.
5432
+ */
5433
+ readonly customLogicError: _angular_core.Signal<string | null>;
5374
5434
  readonly showEmptyWarning: _angular_core.Signal<boolean>;
5375
5435
  addFilter(): void;
5376
5436
  removeFilter(index: number): void;
@@ -5668,6 +5728,9 @@ declare class ElementInspectorComponent {
5668
5728
  private readonly store;
5669
5729
  private readonly dictionaries;
5670
5730
  private readonly validation;
5731
+ private readonly injector;
5732
+ /** L'etichetta: e' il primo campo di un elemento nuovo, e prende il focus da se'. */
5733
+ private readonly labelInput;
5671
5734
  /** Il nome dell'elemento selezionato; `$start` per lo Start. */
5672
5735
  readonly selectedName: _angular_core.InputSignal<string | null>;
5673
5736
  /**
@@ -5712,6 +5775,43 @@ declare class ElementInspectorComponent {
5712
5775
  readonly hiddenIssueCount: _angular_core.Signal<number>;
5713
5776
  toggleIssues(): void;
5714
5777
  readonly pendingName: _angular_core.WritableSignal<string | null>;
5778
+ /**
5779
+ * L'elemento il cui nome si sta ancora componendo, e cosa c'e' scritto nel campo.
5780
+ *
5781
+ * `draft: null` e' «segue l'etichetta», che e' lo stato iniziale e quello in cui si torna
5782
+ * svuotando il campo. `element` segue le rinomine: senza, la prima battuta sull'etichetta —
5783
+ * che rinomina — farebbe ripartire lo stato da capo e il campo tornerebbe a seguire una
5784
+ * scelta che l'utente aveva già disfatto.
5785
+ */
5786
+ private readonly composing;
5787
+ /** Il nome si compone qui invece di stare dietro il comando di rinomina. */
5788
+ readonly isComposingName: _angular_core.Signal<boolean>;
5789
+ /** Cio' che si vede nel campo: vuoto finche' non c'e' un'etichetta da cui costruirlo. */
5790
+ readonly composedName: _angular_core.Signal<string>;
5791
+ readonly composedNameError: _angular_core.Signal<string | null>;
5792
+ constructor();
5793
+ /**
5794
+ * Un elemento **senza etichetta** e' un elemento che nessuno ha ancora nominato: il campo del
5795
+ * nome parte vuoto e segue l'etichetta. Uno che ce l'ha e' un elemento vero, e il suo nome si
5796
+ * cambia solo col comando di rinomina, che dice prima quanti riferimenti riscrivera'.
5797
+ */
5798
+ private seedComposing;
5799
+ /**
5800
+ * Il nome scritto a mano: smette di seguire l'etichetta e, appena e' valido, diventa il nome
5801
+ * dell'elemento. Un nome intermedio non valido resta nel campo senza toccare il documento —
5802
+ * ricopiarci sopra il nome corrente impedirebbe di digitare.
5803
+ */
5804
+ onComposedNameInput(value: string): void;
5805
+ /**
5806
+ * Il nome costruito dall'etichetta (§3.3): spazi e caratteri non ammessi diventano `_`, i
5807
+ * diacritici cadono e un nome già preso prende un suffisso.
5808
+ *
5809
+ * Etichetta vuota → `null`, cioe' resta il nome provvisorio con cui l'elemento e' nato: il
5810
+ * documento non puo' stare senza, perche' il nome e' la chiave di tutto (§3.3).
5811
+ */
5812
+ private deriveName;
5813
+ /** Rimette il nome a seguire l'etichetta, dopo che il campo e' stato svuotato. */
5814
+ private applyDerivedName;
5715
5815
  readonly nameError: _angular_core.Signal<string | null>;
5716
5816
  /**
5717
5817
  * Quanti riferimenti verrebbero riscritti dalla rinomina. Serve a rendere visibile che
@@ -5786,6 +5886,15 @@ declare class ElementDialogComponent {
5786
5886
  private readonly reference;
5787
5887
  readonly typeLabel: _angular_core.Signal<string>;
5788
5888
  readonly title: _angular_core.Signal<string>;
5889
+ /**
5890
+ * L'ultimo nome adottato da una rinomina.
5891
+ *
5892
+ * La selezione dell'editor **e' il nome**, quindi una rinomina cambia `selectedName` senza
5893
+ * che l'elemento sia cambiato. Senza distinguere i due casi il nome che si costruisce
5894
+ * dall'etichetta mentre la si digita riportava il focus sul pannello a ogni battuta, e
5895
+ * l'etichetta si scriveva una lettera alla volta.
5896
+ */
5897
+ private renamedTo?;
5789
5898
  constructor();
5790
5899
  /** Il vincolo: dentro il builder resta la maniglia, non la finestra intera. */
5791
5900
  readonly constrainPosition: DialogConstrainPosition;
@@ -6368,6 +6477,26 @@ declare class ResourceDialogComponent {
6368
6477
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<ResourceDialogComponent, "fb-resource-dialog", never, { "edit": { "alias": "edit"; "required": true; "isSignal": true; }; }, { "closed": "closed"; }, never, never, true, never>;
6369
6478
  }
6370
6479
 
6480
+ /**
6481
+ * Il filtro dell'elenco delle risorse.
6482
+ *
6483
+ * Esiste per la **scala**: un flow di produzione ha ventun variabili e dodici dynamic choice
6484
+ * set, e a quella misura il problema dell'elenco non e' leggerlo ma trovarci dentro una riga.
6485
+ * Non e' la ricerca del flow (`core/flow-search.ts`), che sa dov'e' un nome che si conosce
6486
+ * **già**: qui si restringe un elenco che si sta guardando, e le due domande che si fanno
6487
+ * davvero — «quali non sono usate» e «quali hanno qualcosa che non va» — non sono nomi.
6488
+ *
6489
+ * Cio' che il testo guarda e' cio' che l'elenco **mostra**, piu' il nome e l'etichetta: e' la
6490
+ * stessa scelta di `flow-search`, dove il contenuto dei valori resta fuori perche' «chi cita
6491
+ * `Totale`» e' un'altra domanda — quella la risponde il conteggio degli usi. Quindi
6492
+ * l'espressione di una formula e il valore di una costante **non** si cercano: chi digita
6493
+ * «IVA» e vede comparire una formula che non si chiama così crede di aver trovato una risorsa
6494
+ * che non c'e'.
6495
+ */
6496
+
6497
+ /** Lo stato su cui si restringe l'elenco, oltre al testo. */
6498
+ type ResourceStateFilter = 'all' | 'unused' | 'issues';
6499
+
6371
6500
  /**
6372
6501
  * Le sette collection di risorse (§4.6).
6373
6502
  *
@@ -6414,11 +6543,58 @@ declare class ResourcePanelComponent {
6414
6543
  * ricalcolo del documento.
6415
6544
  */
6416
6545
  readonly pendingRemoval: _angular_core.WritableSignal<string | null>;
6546
+ /** Il testo del filtro. Non si azzera cambiando scheda: vedi `select`. */
6547
+ readonly query: _angular_core.WritableSignal<string>;
6548
+ /** Lo stato su cui si restringe: sono le due domande che un nome non sa fare. */
6549
+ readonly stateFilter: _angular_core.WritableSignal<ResourceStateFilter>;
6550
+ readonly hasFilter: _angular_core.Signal<boolean>;
6417
6551
  constructor();
6418
6552
  readonly activeKind: _angular_core.Signal<ResourceKindDescriptor>;
6553
+ /** Tutte le risorse della collection aperta, **prima** del filtro. */
6554
+ readonly collectionItems: _angular_core.Signal<FlowResourceRef[]>;
6555
+ /** Le righe che l'elenco disegna: la collection aperta, filtrata. */
6419
6556
  readonly items: _angular_core.Signal<FlowResourceRef[]>;
6420
- countOf(collection: FlowResourceCollection): number;
6421
6557
  select(collection: FlowResourceCollection): void;
6558
+ private readonly needle;
6559
+ /** `true` se la risorsa passa testo **e** stato. */
6560
+ private matches;
6561
+ /**
6562
+ * Quante risorse di ogni collection passano il filtro, e quante ce ne sono in tutto.
6563
+ *
6564
+ * Il numero sulla scheda diventa quello delle **corrispondenze** appena un filtro e' attivo,
6565
+ * ed e' il solo modo di rispondere alla domanda vera di chi digita: la risorsa che cerca sta
6566
+ * spesso in un'altra collection, e senza questo numero bisognerebbe aprire le sette schede
6567
+ * una per una per scoprire che non c'e' da nessuna parte. Il conteggio e' **uno** per tutte
6568
+ * le schede e non una `filter` per scheda nel template: quello lo rifaceva a ogni giro di
6569
+ * change detection, e con il filtro «non usate» dentro sarebbero cinquanta walk del
6570
+ * documento per volta.
6571
+ */
6572
+ readonly tabCounts: _angular_core.Signal<Record<string, {
6573
+ total: number;
6574
+ matching: number;
6575
+ }>>;
6576
+ countOf(collection: FlowResourceCollection): number;
6577
+ totalOf(collection: FlowResourceCollection): number;
6578
+ /**
6579
+ * Quante risorse ha ogni stato nella scheda aperta, contate **dopo** il testo: i due chip
6580
+ * dicono quanto resterebbe, non quanto ce n'e' in assoluto. A zero si disabilitano, perche'
6581
+ * un filtro che da' certamente un elenco vuoto non e' un filtro ma un modo di nascondere
6582
+ * l'elenco.
6583
+ */
6584
+ readonly stateCounts: _angular_core.Signal<{
6585
+ unused: number;
6586
+ issues: number;
6587
+ }>;
6588
+ /**
6589
+ * Le corrispondenze nelle **altre** schede: e' cio' che si dice quando qui non c'e' niente.
6590
+ * «Nessuna corrispondenza» su un elenco vuoto e' vero e inutile — il rimedio e' cambiare
6591
+ * scheda, e bisogna sapere se ce n'e' una da cambiare.
6592
+ */
6593
+ readonly matchesElsewhere: _angular_core.Signal<number>;
6594
+ onQuery(value: string): void;
6595
+ /** Il secondo clic sullo stesso stato lo spegne, come nel pannello dei problemi. */
6596
+ setStateFilter(filter: ResourceStateFilter): void;
6597
+ resetFilter(): void;
6422
6598
  isEditing(reference: FlowResourceRef): boolean;
6423
6599
  /** Il click sul nome: apre la finestra, o la chiude se e' già quella risorsa. */
6424
6600
  edit(reference: FlowResourceRef): void;
@@ -6426,6 +6602,12 @@ declare class ResourcePanelComponent {
6426
6602
  nameError(reference: FlowResourceRef): string | null;
6427
6603
  constantReferencesResource(reference: FlowResourceRef): boolean;
6428
6604
  duplicateStageOrder(reference: FlowResourceRef): boolean;
6605
+ /**
6606
+ * §5.2 — cio' che su una sorgente collection il runtime ignora. Sta anche qui e non solo nel
6607
+ * form per la ragione di sempre: il filtro «con rilievi» porta la riga a galla, e una riga che
6608
+ * non dice **cosa** non va costringe ad aprirla per scoprirlo.
6609
+ */
6610
+ ignoredChoiceSetFilters(reference: FlowResourceRef): string | null;
6429
6611
  add(): void;
6430
6612
  /**
6431
6613
  * Quante volte la risorsa e' **usata** nel documento.
@@ -6439,6 +6621,19 @@ declare class ResourcePanelComponent {
6439
6621
  * senza, tre formule che leggono una variabile la direbbero «non usata».
6440
6622
  */
6441
6623
  usesOf(reference: FlowResourceRef): number;
6624
+ /**
6625
+ * Il conteggio di **tutte** le risorse, calcolato una volta per documento.
6626
+ *
6627
+ * `countNameUses` cammina il documento intero a ogni chiamata, e da quando il filtro lo
6628
+ * chiede per ogni risorsa di ogni collection — i numeri delle schede, il chip «non usate» —
6629
+ * chiamarlo dal template significherebbe cinquanta walk per giro di change detection.
6630
+ *
6631
+ * La chiave e' il nome **esatto** e non quello minuscolo: `countNameUses` confronta le
6632
+ * stringhe come sono, quindi due nomi che differiscono solo per il case — che sono un
6633
+ * `NAME_DUPLICATED`, non un caso da normalizzare qui — hanno due conteggi diversi, ed e'
6634
+ * quello che il pannello mostrava anche prima della memoizzazione.
6635
+ */
6636
+ private readonly useCounts;
6442
6637
  private keyOf;
6443
6638
  isPendingRemoval(reference: FlowResourceRef): boolean;
6444
6639
  /**
@@ -6505,6 +6700,14 @@ declare class ResourceFormComponent {
6505
6700
  * tre `FIELD_UNKNOWN` che l'utente non ha scritto.
6506
6701
  */
6507
6702
  setChoiceSetSource(source: ChoiceSetSource): void;
6703
+ /**
6704
+ * §5.2 — cio' che su una sorgente collection il runtime ignora, se il documento lo dichiara.
6705
+ * Il controllo sta in `resource-checks.ts` perche' serve anche all'**elenco**: senza, la riga
6706
+ * sarebbe verde e il rilievo si vedrebbe solo aprendo il form.
6707
+ */
6708
+ ignoredChoiceSetFilters(): string | null;
6709
+ /** La ripulitura e' un comando, non un effetto dell'apertura del form. */
6710
+ clearIgnoredChoiceSetFilters(): void;
6508
6711
  /** Su un choice set da enum il tipo e' `enumType`: il campo generico sarebbe un doppione. */
6509
6712
  hidesObjectType(): boolean;
6510
6713
  isChoiceSetSource(source: ChoiceSetSource): boolean;
@@ -6964,8 +7167,23 @@ declare class FlowBuilderComponent {
6964
7167
  setFullName(value: string): void;
6965
7168
  setDescription(value: string): void;
6966
7169
  setInterviewLabel(value: string): void;
7170
+ /**
7171
+ * Il tipo di flow si sceglie **alla creazione**, e su un flow salvato non si tocca.
7172
+ *
7173
+ * Non e' una preferenza: decide quali globali esistono (`$Record` non c'e' in uno screen
7174
+ * flow, §4.1), quali elementi sono ammessi (§13.6) e come il motore lo esegue. Cambiarlo su
7175
+ * un documento già scritto lo lascia pieno di riferimenti a cose che da quel momento non
7176
+ * esistono — e nessuna primitiva del backend rimedia. Il comando non c'e' nemmeno
7177
+ * nell'interfaccia; il controllo qui e' perché la chiamata resta pubblica.
7178
+ */
6967
7179
  setProcessType(value: string): void;
6968
7180
  readonly processTypes: _angular_core.Signal<_esfaenza_flow_builder.FlowDictionaryEntry[]>;
7181
+ /**
7182
+ * Il tipo scritto per esteso, per il flow salvato dove non e' più una scelta. Fuori catalogo
7183
+ * si mostra il valore grezzo: e' del backend, non nostro da correggere (vedi
7184
+ * {@link isProcessTypeOutOfCatalog}).
7185
+ */
7186
+ readonly processTypeLabel: _angular_core.Signal<string>;
6969
7187
  /**
6970
7188
  * Il `processType` del documento non e' fra quelli del dizionario. Non e' un caso di scuola:
6971
7189
  * basta che il dizionario arrivi senza `processTypes`, o che il backend salvi una scrittura
@@ -7143,6 +7361,17 @@ declare class FlowBuilderComponent {
7143
7361
  autoLayout(): void;
7144
7362
  undo(): void;
7145
7363
  redo(): void;
7364
+ /**
7365
+ * Un passo di storico, con la selezione che lo segue.
7366
+ *
7367
+ * La selezione dell'editor **e' il nome** (§3.3), e un annulla può riportare indietro una
7368
+ * rinomina — succede a ogni battuta sull'etichetta di un elemento appena creato, dove il nome
7369
+ * la segue. Il nome selezionato allora non esiste più: l'inspector resta puntato sul vuoto, il
7370
+ * form del tipo sparisce e l'intestazione mostra un nome che nel documento non c'è. L'annulla
7371
+ * però non sposta gli elementi nella loro collection, quindi **dove** stavano — collection e
7372
+ * indice — e' la traccia che sopravvive: dopo il passo si adotta il nome che si trova lì.
7373
+ */
7374
+ private stepHistory;
7146
7375
  save(): Promise<void>;
7147
7376
  /** Il modulo del duplicato e' aperto. */
7148
7377
  readonly isCopyOpen: _angular_core.WritableSignal<boolean>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@esfaenza/flow-builder",
3
- "version": "20.3.41",
3
+ "version": "20.3.43",
4
4
  "peerDependencies": {
5
5
  "@angular/cdk": "^20.2.14",
6
6
  "@angular/common": "^20.3.28",