@esfaenza/flow-builder 20.3.37 → 20.3.39

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`
@@ -230,6 +235,14 @@ il trascinamento sul canvas vuoto disegna il rettangolo di selezione invece di s
230
235
  un elemento, il canvas lo dice e dice **cosa farne**: «trascinane uno per spostarli tutti». Un
231
236
  gesto che nessuno annuncia non esiste.
232
237
 
238
+ **Risorse.** Il pannello «Risorse» e' un **elenco**: nome, tipo, quante volte e' usata, i rilievi
239
+ della riga. Aggiungerne una o cliccarne il nome apre una **finestra** dedicata con il form dentro,
240
+ come per il dettaglio di un elemento — e per la stessa ragione: il form di un dynamic choice set
241
+ (sorgente, due campi, ordinamento, limite, filtri) dentro la colonna laterale spingeva l'elenco
242
+ fuori dallo schermo, cioe' faceva sparire il contesto per cui l'elenco esiste. La finestra si
243
+ sposta prendendola per l'intestazione, non ha «Annulla» — le modifiche sono già nel documento, e
244
+ a tornare indietro e' l'annulla dell'editor — e si chiude da se' se la risorsa viene rimossa.
245
+
233
246
  *Quante volte e' usata.* Ogni risorsa porta il numero dei suoi usi, formule comprese; a zero
234
247
  occorrenze lo dice, ed e' l'unico modo di sapere quali delle venti variabili sono morte.
235
248
  Rimuovere una risorsa **usata** chiede conferma e dice quanti riferimenti resterebbero orfani:
@@ -639,24 +652,31 @@ ripiego dove `cloneFlow` non c'e' (e' opzionale). Un nome già usato lo rifiuta
639
652
  generato dalle variabili `isInput` del documento — tipo dichiarato rispettato anche in scrittura,
640
653
  istanze di classe compilate un membro alla volta (§4.7), enum per **nome** da `listEnumValues`
641
654
  (§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,
655
+ diverse. Poi l'editor **passa la mano**, e non con una chiamata: emette `runRequested` con tutto
656
+ cio' che sa del momento `debug`, `flowName`, `version`, `inputs`, `processType`, `isDirty`, la
657
+ `definition` in mano e non esegue niente per conto suo. Cosa significhi eseguire lo decide
658
+ l'host: una navigazione, una chiamata alle sue API, una dialog con l'interview dentro, o niente.
659
+ Nessuna primitiva di `FlowBuilderApi` viene toccata, quindi non c'e' nessun `MissingService` da
660
+ mostrare: un host che non ascolta l'output fa sì che il comando non faccia niente. Si esegue la
661
+ versione **salvata**, quindi i comandi sono spenti su un flow mai scritto e la finestra avverte
662
+ quando ci sono modifiche non salvate — con `isDirty` nel payload, se l'host preferisce provare la
663
+ bozza che ha in `definition`.
664
+
665
+ **Il pannello «Debug».** Cosa l'ospite ha voluto ridare all'editor dell'ultima esecuzione,
666
+ passandolo all'input `runOutcome`: stato, output,
649
667
  traccia degli elementi eseguiti — ogni riga porta all'elemento sul canvas — e risorse. Esiste per
650
668
  un caso che altrimenti non ha risposta: un flow **senza schermate** (`AutoLaunched`, o
651
669
  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
670
+ questo pannello non ci sarebbe **nessun** posto in cui vedere cosa e' successo. Passarlo e'
671
+ facoltativo — chi mostra tutto in casa sua non passa niente, e il pannello lo dice invece di
672
+ sembrare rotto. `trace` e
653
673
  `resources` arrivano solo con `debug: true` (§6.5), e riportano i valori di tutte le risorse —
654
674
  dati personali compresi: l'avviso e' in chiaro. Il pannello non conduce niente: guarda, e basta.
655
675
 
656
676
  Come si implementa l'altra metà si vede nella demo
657
677
  (`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
678
+ flow che non ha niente da chiedere finisce da solo e l'esito va subito in `runOutcome`, mentre uno
679
+ interattivo apre il runner e ci mette l'ultimo risultato alla chiusura — così la traccia resta
660
680
  comunque lì dove si stava lavorando. Il runner guida l'interview con le primitive della §6.5,
661
681
  distingue le due attese di `Suspended` (`isWaitingForEvent` / `isWaitingForStageStep`), conclude
662
682
  uno step al posto dell'assegnatario — rifiuto compreso, con la `interviewKey` nuova che sostituisce
@@ -788,6 +808,10 @@ due misure sono token: `--fb-dialog-width` (1400px) e `--fb-dialog-height` (860p
788
808
  limitate allo spazio disponibile. La larghezza e' quella che serve al compositore dello screen
789
809
  dinamico, che e' a due pannelli.
790
810
 
811
+ La finestra di una **risorsa** ha una misura sua — `--fb-resource-dialog-width` (760px) e
812
+ `--fb-resource-dialog-height` (720px) — perche' dentro c'e' una colonna sola di campi: la misura
813
+ del compositore lascerebbe due terzi di bianco.
814
+
791
815
  Nota sugli archi: il colore si imposta valorizzando le custom properties del tema di
792
816
  @foblex/flow (`--ff-connection-color`, `--ff-marker-color`) invece di sovrascrivere le sue
793
817
  regole, perche' i selettori hanno la stessa specificita' e chi vince dipenderebbe dall'ordine