@esfaenza/flow-builder 20.3.36 → 20.3.38

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 CHANGED
@@ -79,8 +79,11 @@ l'attributo di scope di Angular, quindi un CSS incapsulato non li raggiunge.
79
79
  [flowName]="'ApprovazioneOrdine'"
80
80
  [version]="null"
81
81
  [author]="utenteCorrente"
82
+ [runOutcome]="esitoUltimaEsecuzione()"
83
+ [isRunning]="esecuzioneInCorso()"
82
84
  (saved)="onSaved($event)"
83
85
  (activated)="onActivated($event)"
86
+ (runRequested)="esegui($event)"
84
87
  />
85
88
  ```
86
89
 
@@ -91,11 +94,14 @@ l'attributo di scope di Angular, quindi un CSS incapsulato non li raggiunge.
91
94
  | `author` | registrato sulla versione e mostrato nell'elenco |
92
95
  | `defaultProcessType` | `processType` iniziale di un flow nuovo |
93
96
  | `inspectorMode` | `'dialog'` (predefinito) apre il dettaglio dell'elemento in una finestra sopra il canvas; `'panel'` lo tiene nel pannello laterale |
97
+ | `runOutcome` | l'esito che l'host vuole far vedere nel pannello «Debug» dopo un `runRequested` (`FlowRunOutcome`); `null` → il pannello dice che non c'e' niente. Facoltativo: chi mostra l'esecuzione in una sua interfaccia non passa niente |
98
+ | `isRunning` | l'esecuzione annunciata e' ancora in corso. Solo l'host lo sa: accende il puntino sul tab «Debug» e tiene spento il bottone della finestra degli ingressi |
94
99
 
95
100
  | Output | Quando |
96
101
  |---|---|
97
102
  | `saved` | dopo un salvataggio riuscito, con `FlowSaveResult`. Lo emette anche «Duplica», e in quel caso `flowName` e' quello della **copia**: la sessione si e' spostata su di essa, quindi l'host che tiene il nome da parte deve adottarlo |
98
103
  | `activated` | dopo un'attivazione riuscita |
104
+ | `runRequested` | l'utente ha premuto **Esegui** o **Debug**, con `FlowRunRequest`: `debug`, `flowName`, `version`, `inputs` già convertiti, `processType`, `isDirty` e la `definition` in mano all'editor. **L'editor non esegue e non chiama niente**: cosa significhi eseguire — una navigazione, delle API dell'host, una dialog con l'interview dentro — lo decide l'host. Un host che non ascolta questo output fa sì che i due comandi non facciano niente: non c'e' nessuna primitiva che possa mancare, quindi nessun errore da mostrare |
99
105
 
100
106
  Il componente vuole un'altezza: `<fb-flow-builder style="height: 100vh">`, oppure un
101
107
  contenitore flex. Gli store sono provider **del componente**, quindi due builder sulla stessa
@@ -150,8 +156,7 @@ sono opzionali e rifiutano con `MissingService` se non sovrascritti.
150
156
 
151
157
  | Esecuzione dall'editor | |
152
158
  |---|---|
153
- | `runFlow(request)`, `debugFlow(request)` | opzionali — i comandi **Esegui** e **Debug** della barra. Non sono primitive del contratto: l'editor raccoglie i valori di ingresso in una finestra e passa la mano all'ospite, che sa dove gira il motore. Senza implementazione il comando fallisce con `MissingService` e l'editor lo dice non finge un avvio. Sono due metodi e non un flag perche' quasi sempre sono due strade diverse, e perche' un ambiente puo' esporre l'una senza l'altra. **Il ritorno e' facoltativo e conta**: un `FlowRunOutcome` finisce nel pannello «Debug» dell'editor — stato, traccia, risorse, output — mentre `void` significa «guardo altrove». Restituirlo e' quasi obbligatorio sui flow **senza schermate**, dove non esiste nessun'altra interfaccia in cui vedere cos'e' successo |
154
- | `startInterview`, `respondToScreen`, `resumeInterview`, `inspectInterview`, `abandonInterview` | opzionali — le primitive §6.5 dell'interview. **L'editor non le usa**: servono a chi implementa `runFlow`/`debugFlow` con un runner proprio (la demo lo fa) |
159
+ | `startInterview`, `respondToScreen`, `resumeInterview`, `inspectInterview`, `abandonInterview` | opzionalile primitive §6.5 dell'interview. **L'editor non le usa**: servono a chi risponde a `runRequested` con un runner proprio (la demo lo fa) |
155
160
  | `completeStageStep(request)` | opzionale — conclude uno step di orchestrazione (§5.14) |
156
161
 
157
162
  **Errori.** Ogni metodo, in caso di rifiuto, deve fallire con un `FlowApiError`
@@ -639,24 +644,31 @@ ripiego dove `cloneFlow` non c'e' (e' opzionale). Un nome già usato lo rifiuta
639
644
  generato dalle variabili `isInput` del documento — tipo dichiarato rispettato anche in scrittura,
640
645
  istanze di classe compilate un membro alla volta (§4.7), enum per **nome** da `listEnumValues`
641
646
  (§4.6). Un campo lasciato vuoto non viene mandato: non valorizzato e stringa vuota sono cose
642
- diverse. Poi l'editor **passa la mano**: chiama `runFlow` o `debugFlow` e non esegue niente per
643
- conto suo. Si esegue la versione **salvata**, quindi i comandi sono spenti su un flow mai scritto
644
- e la finestra avverte quando ci sono modifiche non salvate. Senza implementazione categoria
645
- `MissingService` il banner dice quale delle due primitive manca, con parole comprensibili a chi
646
- ha appena premuto «Esegui».
647
-
648
- **Il pannello «Debug».** Cosa l'ospite ha restituito dall'ultima esecuzione: stato, output,
647
+ diverse. Poi l'editor **passa la mano**, e non con una chiamata: emette `runRequested` con tutto
648
+ cio' che sa del momento `debug`, `flowName`, `version`, `inputs`, `processType`, `isDirty`, la
649
+ `definition` in mano e non esegue niente per conto suo. Cosa significhi eseguire lo decide
650
+ l'host: una navigazione, una chiamata alle sue API, una dialog con l'interview dentro, o niente.
651
+ Nessuna primitiva di `FlowBuilderApi` viene toccata, quindi non c'e' nessun `MissingService` da
652
+ mostrare: un host che non ascolta l'output fa sì che il comando non faccia niente. Si esegue la
653
+ versione **salvata**, quindi i comandi sono spenti su un flow mai scritto e la finestra avverte
654
+ quando ci sono modifiche non salvate — con `isDirty` nel payload, se l'host preferisce provare la
655
+ bozza che ha in `definition`.
656
+
657
+ **Il pannello «Debug».** Cosa l'ospite ha voluto ridare all'editor dell'ultima esecuzione,
658
+ passandolo all'input `runOutcome`: stato, output,
649
659
  traccia degli elementi eseguiti — ogni riga porta all'elemento sul canvas — e risorse. Esiste per
650
660
  un caso che altrimenti non ha risposta: un flow **senza schermate** (`AutoLaunched`, o
651
661
  un'orchestrazione tutta in background) non apre nessuna interfaccia del runtime, quindi senza
652
- questo pannello non ci sarebbe **nessun** posto in cui vedere cosa e' successo. `trace` e
662
+ questo pannello non ci sarebbe **nessun** posto in cui vedere cosa e' successo. Passarlo e'
663
+ facoltativo — chi mostra tutto in casa sua non passa niente, e il pannello lo dice invece di
664
+ sembrare rotto. `trace` e
653
665
  `resources` arrivano solo con `debug: true` (§6.5), e riportano i valori di tutte le risorse —
654
666
  dati personali compresi: l'avviso e' in chiaro. Il pannello non conduce niente: guarda, e basta.
655
667
 
656
668
  Come si implementa l'altra metà si vede nella demo
657
669
  (`projects/flow-builder-example/src/app/runner`), e la scelta interessante e' **quando** aprire una finestra: un
658
- flow che non ha niente da chiedere finisce da solo e l'esito torna subito all'editor, mentre uno
659
- interattivo apre il runner e restituisce l'ultimo risultato alla chiusura — così la traccia resta
670
+ flow che non ha niente da chiedere finisce da solo e l'esito va subito in `runOutcome`, mentre uno
671
+ interattivo apre il runner e ci mette l'ultimo risultato alla chiusura — così la traccia resta
660
672
  comunque lì dove si stava lavorando. Il runner guida l'interview con le primitive della §6.5,
661
673
  distingue le due attese di `Suspended` (`isWaitingForEvent` / `isWaitingForStageStep`), conclude
662
674
  uno step al posto dell'assegnatario — rifiuto compreso, con la `interviewKey` nuova che sostituisce