@esfaenza/flow-builder 20.3.13 → 20.3.15
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 +52 -5
- package/fesm2022/esfaenza-flow-builder.mjs +979 -66
- package/fesm2022/esfaenza-flow-builder.mjs.map +1 -1
- package/index.d.ts +428 -11
- package/package.json +2 -1
- package/styles/flow-builder.css +33 -0
package/README.md
CHANGED
|
@@ -90,7 +90,7 @@ l'attributo di scope di Angular, quindi un CSS incapsulato non li raggiunge.
|
|
|
90
90
|
| `version` | la versione da aprire; assente → l'attiva se c'e', altrimenti l'ultima (§6.1) |
|
|
91
91
|
| `author` | registrato sulla versione e mostrato nell'elenco |
|
|
92
92
|
| `defaultProcessType` | `processType` iniziale di un flow nuovo |
|
|
93
|
-
| `inspectorMode` | `'dialog'` (predefinito) apre il dettaglio dell'elemento in una finestra sopra il canvas
|
|
93
|
+
| `inspectorMode` | `'dialog'` (predefinito) apre il dettaglio dell'elemento in una finestra sopra il canvas; `'panel'` lo tiene nel pannello laterale |
|
|
94
94
|
|
|
95
95
|
| Output | Quando |
|
|
96
96
|
|---|---|
|
|
@@ -221,10 +221,31 @@ stesso che avra' sul canvas. `core/element-variants.ts` tiene la mappa tipo →
|
|
|
221
221
|
discriminatore; i valori restano nel dizionario del backend (`collectionProcessorTypes`), e
|
|
222
222
|
senza quel dizionario il tipo torna a essere una voce sola.
|
|
223
223
|
|
|
224
|
-
**Inspector.** Un form per ogni tipo supportato: Start, Screen,
|
|
225
|
-
Collection Processor, Get / Create / Update / Delete / Rollback Records,
|
|
226
|
-
Subflow, Wait, Custom Error, Transform, Orchestrated Stage. Più l'intestazione
|
|
227
|
-
rinomina, che **riscrive tutti i riferimenti** all'elemento.
|
|
224
|
+
**Inspector.** Un form per ogni tipo supportato: Start, Screen, Screen dinamico, Assignment,
|
|
225
|
+
Decision, Loop, Collection Processor, Get / Create / Update / Delete / Rollback Records,
|
|
226
|
+
Action, Script, Subflow, Wait, Custom Error, Transform, Orchestrated Stage. Più l'intestazione
|
|
227
|
+
comune con la rinomina, che **riscrive tutti i riferimenti** all'elemento.
|
|
228
|
+
|
|
229
|
+
**Screen dinamico (§5.2).** È l'unico inspector a due pannelli, e per questo la dialog e' larga
|
|
230
|
+
il doppio di com'era: a sinistra l'albero dei campi con la larghezza in dodicesimi disegnata, a
|
|
231
|
+
destra le proprieta' del campo selezionato. Quali proprieta' mostrare **lo decide il dizionario**
|
|
232
|
+
(`screenFieldTypes` e i suoi flag `storesValue`, `isCollection`, `acceptsChoices`, `isContainer`,
|
|
233
|
+
`requiresDataType`), non il codice: sono gli stessi flag che applica il runtime, e
|
|
234
|
+
reimplementarli porta a proporre configurazioni che il motore rifiuta.
|
|
235
|
+
|
|
236
|
+
Tre cose che il modello non mostra e il form dice:
|
|
237
|
+
|
|
238
|
+
- un campo che raccoglie un valore **e' una risorsa del flow**, referenziabile per nome ovunque
|
|
239
|
+
e di **sola lettura** — il suo nome vive nello spazio dei nomi comune, e rinominarlo riscrive i
|
|
240
|
+
riferimenti (`FlowDocumentStore.renameScreenField`, come per i node: nessuna primitiva del
|
|
241
|
+
backend lo fa);
|
|
242
|
+
- le regole di visibilita' si rivalutano **sui valori appena inviati**, i campi nascosti vengono
|
|
243
|
+
**azzerati** e solo i visibili vengono validati;
|
|
244
|
+
- `choiceReferences` accetta **solo** `Choice` e `DynamicChoiceSet`, e gli output automatici di un
|
|
245
|
+
`ComponentInstance` sono esclusivi con i suoi `outputParameters`.
|
|
246
|
+
|
|
247
|
+
Il riordino e l'annidamento si fanno trascinando (`@angular/cdk/drag-drop`) oppure con i comandi
|
|
248
|
+
«su / giu' / porta dentro / porta fuori», che coprono anche gli alberi piu' alti del pannello.
|
|
228
249
|
|
|
229
250
|
Sullo stage di orchestrazione il form dice le tre cose che il modello non mostra: gli step
|
|
230
251
|
**non sono una sequenza** (le frecce riordinano l'esame, non l'esecuzione), ingresso e uscita
|
|
@@ -334,6 +355,17 @@ vuoto resta "non lo so" — primitiva non esposta, tipo senza valori dichiarati,
|
|
|
334
355
|
da scegliere — e allora il valore si digita; con l'elenco popolato un valore fuori elenco e' un
|
|
335
356
|
**avviso**, perche' nessun codice della §7 lo blocca ed e' l'editor ad accorgersene prima del runtime.
|
|
336
357
|
|
|
358
|
+
**Un campo a `null` e' assente.** Il valore ha un campo per tipo e va valorizzato **uno e un solo**
|
|
359
|
+
campo (§4.2); la §2 dice che cio' che non c'e' si omette, ma un backend che serializza tutte le
|
|
360
|
+
proprieta' — `System.Text.Json` senza `IgnoreNullValues` lo fa di default — manda
|
|
361
|
+
`{"enumValue": "InIstruttoria", "formulaExpression": null, …}`: un solo valore e sette caselle piene
|
|
362
|
+
di niente. Riconoscere il campo con `!== undefined` faceva vincere il primo letto, cioe'
|
|
363
|
+
`formulaExpression`: l'editor apriva la **formula** (vuota) e il valore, pur presente nel documento,
|
|
364
|
+
spariva dalla vista — e il conteggio dei campi accusava `VALUE_AMBIGUOUS`. La regola sta in
|
|
365
|
+
`core/flow-value.util.ts` (`isValued`, `valuedFieldOf`, `valuedFieldsOf`) e la usano l'editor del
|
|
366
|
+
valore e quello delle condizioni: `null` e `undefined` significano la stessa cosa, mentre
|
|
367
|
+
`booleanValue: false`, `numberValue: 0` e `stringValue: ''` restano valori.
|
|
368
|
+
|
|
337
369
|
Perche' l'editor conosca il tipo della destinazione serve saperlo, e i percorsi non fanno eccezione:
|
|
338
370
|
`POST /flows/references` elenca le **radici** e non i percorsi, quindi su `Richiesta.Stato` la
|
|
339
371
|
corrispondenza esatta del nome non trova niente. Il tipo si ricava allora navigando la catena —
|
|
@@ -401,6 +433,7 @@ src/lib/
|
|
|
401
433
|
condition-logic.util.ts riscrittura di conditionLogic su cancella / riordina
|
|
402
434
|
condition-types.util.ts quali tipi si confrontano, e i numeri in cultura invariante
|
|
403
435
|
stage-step.util.ts gli step di uno stage: nomi, output non condizionabili
|
|
436
|
+
screen-field.util.ts l'albero dei campi di uno screen dinamico: percorsi, nomi, mutazioni
|
|
404
437
|
ui/
|
|
405
438
|
flow-builder.component.ts il componente da montare
|
|
406
439
|
canvas/ palette/ inspector/ resources/ problems/ versions/ debug/ shared/
|
|
@@ -431,6 +464,7 @@ Oltre ad Angular:
|
|
|
431
464
|
|---|---|
|
|
432
465
|
| `@foblex/flow` (+ `@foblex/platform`, `@foblex/mediator`, `@foblex/2d`, `@foblex/utils`) | rendering del grafo, pan/zoom, gesti su node e connessioni. Usata in *classic mode*: la libreria disegna e riconosce i gesti, lo stato resta nostro |
|
|
433
466
|
| `dagre` | auto-layout gerarchico del comando «Riordina» |
|
|
467
|
+
| `@angular/cdk` | il solo `drag-drop`, per l'albero dei campi dello screen dinamico. Nessun componente Material: i controlli restano input nativi |
|
|
434
468
|
|
|
435
469
|
Nessun design system: i controlli sono input nativi con binding espliciti e CSS custom, così
|
|
436
470
|
il builder si integra nel tema dell'app ospite senza imporre il proprio.
|
|
@@ -454,6 +488,12 @@ Le variabili si sovrascrivono sul contenitore:
|
|
|
454
488
|
Elenco completo in `styles/flow-builder.css`. Per la variante scura basta
|
|
455
489
|
`data-fb-theme="dark"` su un antenato.
|
|
456
490
|
|
|
491
|
+
La dialog di modifica ha **una misura sola per ogni tipo di elemento** — l'inspector dentro
|
|
492
|
+
cambia, la finestra no, altrimenti i comandi si spostano sotto il mouse a ogni apertura — e le
|
|
493
|
+
due misure sono token: `--fb-dialog-width` (1400px) e `--fb-dialog-height` (860px), entrambe
|
|
494
|
+
limitate allo spazio disponibile. La larghezza e' quella che serve al compositore dello screen
|
|
495
|
+
dinamico, che e' a due pannelli.
|
|
496
|
+
|
|
457
497
|
Nota sugli archi: il colore si imposta valorizzando le custom properties del tema di
|
|
458
498
|
@foblex/flow (`--ff-connection-color`, `--ff-marker-color`) invece di sovrascrivere le sue
|
|
459
499
|
regole, perche' i selettori hanno la stessa specificita' e chi vince dipenderebbe dall'ordine
|
|
@@ -512,6 +552,13 @@ possibile anche con errori e attivazione bloccata dagli errori (§8).
|
|
|
512
552
|
vivono dentro `rules[i].connector`, ma un arco selezionato perde la selezione.
|
|
513
553
|
- **`relatedRecords` di Get Records** e' esposto in sola lettura con un avviso: e' modellato
|
|
514
554
|
ma non tradotto in query.
|
|
555
|
+
- **L'albero dei campi dello screen dinamico e' una lista di rilascio piatta**, non una per
|
|
556
|
+
contenitore: le drop list annidate del CDK sono ambigue proprio qui — il rettangolo di una
|
|
557
|
+
sezione contiene quello delle sue colonne, e a ricevere il rilascio e' sempre la lista
|
|
558
|
+
registrata per prima, cioe' la radice. Con la lista piatta il contenitore di arrivo si deduce
|
|
559
|
+
dalla riga che precede il punto di rilascio (sotto un contenitore = dentro, sotto un campo =
|
|
560
|
+
accanto). Il prezzo: trascinando una sezione, i suoi figli restano fermi finche' non si
|
|
561
|
+
rilascia — poi si spostano con lei.
|
|
515
562
|
- **L'esecutore della demo non valuta le condizioni**: prende il primo ramo disponibile e lo
|
|
516
563
|
scrive nella traccia. È un mock per esercitare il pannello, non il motore.
|
|
517
564
|
- **Nessun test automatico**: la libreria e' stata verificata a mano sull'app demo (canvas,
|