@esfaenza/flow-builder 20.3.14 → 20.3.16
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 +72 -4
- package/fesm2022/esfaenza-flow-builder.mjs +1528 -33
- package/fesm2022/esfaenza-flow-builder.mjs.map +1 -1
- package/index.d.ts +661 -16
- package/package.json +2 -1
- package/styles/flow-builder.css +35 -0
package/README.md
CHANGED
|
@@ -129,6 +129,7 @@ sono opzionali e rifiutano con `MissingService` se non sovrascritti.
|
|
|
129
129
|
|---|---|
|
|
130
130
|
| `validateDefinition(definition)` | astratto — e' il pannello dei problemi |
|
|
131
131
|
| `validateVersion(flowName, version)` | opzionale |
|
|
132
|
+
| `validateFormula(request)` | opzionale — verifica **una** espressione mentre si digita, ed e' cio' che alimenta `<fb-formula-editor>`. Unica primitiva di analisi con un involucro: il documento sta sotto `flow`, insieme a `expression`, `usage` e `expectedDataType` (§6.3, §6.4). I rilievi portano `position`/`length`, che la validazione dell'intero documento non ha. Tre esiti da tenere distinti e nessuno dei tre e' «formula valida»: rifiuto `MissingService` (primitiva assente), `isVerified: false` (primitiva sì, motore non configurato), `isValid` (verificata davvero) |
|
|
132
133
|
|
|
133
134
|
| §6.4 Dizionari e cataloghi | |
|
|
134
135
|
|---|---|
|
|
@@ -221,10 +222,37 @@ stesso che avra' sul canvas. `core/element-variants.ts` tiene la mappa tipo →
|
|
|
221
222
|
discriminatore; i valori restano nel dizionario del backend (`collectionProcessorTypes`), e
|
|
222
223
|
senza quel dizionario il tipo torna a essere una voce sola.
|
|
223
224
|
|
|
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.
|
|
225
|
+
**Inspector.** Un form per ogni tipo supportato: Start, Screen, Screen dinamico, Assignment,
|
|
226
|
+
Decision, Loop, Collection Processor, Get / Create / Update / Delete / Rollback Records,
|
|
227
|
+
Action, Script, Subflow, Wait, Custom Error, Transform, Orchestrated Stage. Più l'intestazione
|
|
228
|
+
comune con la rinomina, che **riscrive tutti i riferimenti** all'elemento.
|
|
229
|
+
|
|
230
|
+
**Screen dinamico (§5.2).** È un **compositore**, non un form, e per questo la dialog e' larga il
|
|
231
|
+
doppio di com'era: **tre colonne**. A sinistra la palette (due schede — i componenti, e i campi di
|
|
232
|
+
un'entita' che portano tipo ed etichetta dallo schema), al centro **la schermata disegnata** (si
|
|
233
|
+
clicca il campo da configurare, lo si trascina dove deve stare, la larghezza in dodicesimi si
|
|
234
|
+
vede), a destra le proprieta' di cio' che e' selezionato — o della schermata, se non c'e'
|
|
235
|
+
selezione, che e' anche cio' che si ottiene cliccando l'anteprima fuori dai campi. L'anteprima e'
|
|
236
|
+
inerte di proposito: i controlli non ricevono il puntatore, perche' un input che accetta testo in
|
|
237
|
+
un editor di metadati fa credere di star compilando la schermata. Quali proprieta' mostrare **lo
|
|
238
|
+
decide il dizionario**
|
|
239
|
+
(`screenFieldTypes` e i suoi flag `storesValue`, `isCollection`, `acceptsChoices`, `isContainer`,
|
|
240
|
+
`requiresDataType`), non il codice: sono gli stessi flag che applica il runtime, e
|
|
241
|
+
reimplementarli porta a proporre configurazioni che il motore rifiuta.
|
|
242
|
+
|
|
243
|
+
Tre cose che il modello non mostra e il form dice:
|
|
244
|
+
|
|
245
|
+
- un campo che raccoglie un valore **e' una risorsa del flow**, referenziabile per nome ovunque
|
|
246
|
+
e di **sola lettura** — il suo nome vive nello spazio dei nomi comune, e rinominarlo riscrive i
|
|
247
|
+
riferimenti (`FlowDocumentStore.renameScreenField`, come per i node: nessuna primitiva del
|
|
248
|
+
backend lo fa);
|
|
249
|
+
- le regole di visibilita' si rivalutano **sui valori appena inviati**, i campi nascosti vengono
|
|
250
|
+
**azzerati** e solo i visibili vengono validati;
|
|
251
|
+
- `choiceReferences` accetta **solo** `Choice` e `DynamicChoiceSet`, e gli output automatici di un
|
|
252
|
+
`ComponentInstance` sono esclusivi con i suoi `outputParameters`.
|
|
253
|
+
|
|
254
|
+
Il riordino e l'annidamento si fanno trascinando (`@angular/cdk/drag-drop`, senza drop list: il
|
|
255
|
+
bersaglio si calcola dal DOM) oppure con i comandi «su / giu' / porta fuori».
|
|
228
256
|
|
|
229
257
|
Sullo stage di orchestrazione il form dice le tre cose che il modello non mostra: gli step
|
|
230
258
|
**non sono una sequenza** (le frecce riordinano l'esame, non l'esecuzione), ingresso e uscita
|
|
@@ -334,6 +362,27 @@ vuoto resta "non lo so" — primitiva non esposta, tipo senza valori dichiarati,
|
|
|
334
362
|
da scegliere — e allora il valore si digita; con l'elenco popolato un valore fuori elenco e' un
|
|
335
363
|
**avviso**, perche' nessun codice della §7 lo blocca ed e' l'editor ad accorgersene prima del runtime.
|
|
336
364
|
|
|
365
|
+
**Formule.** L'espressione va al motore di regole e la sua sintassi resta del motore: la libreria
|
|
366
|
+
non ha nessun parser. Cio' che ha e' il **controllo**, `validateFormula` (`POST /flows/validate-formula`,
|
|
367
|
+
§6.3), chiesto con debounce mentre si digita: risponde lo stesso motore, e i suoi rilievi portano la
|
|
368
|
+
**posizione** del tratto sbagliato. Li mostra `<fb-formula-editor>`, che monta la casella e sotto
|
|
369
|
+
l'elenco dei rilievi, ognuno con un bottone che **seleziona quel tratto** nella casella — senza il
|
|
370
|
+
salto, `position` resterebbe un numero da contare a mano. Lo stesso componente offre i nomi
|
|
371
|
+
citabili come **autocompletamento** mentre si scrive un identificatore: la fonte e'
|
|
372
|
+
`POST /flows/references`, la stessa del reference picker, output automatici compresi; frecce per
|
|
373
|
+
scorrere, Invio o clic per inserire. Elenco non disponibile = nessun suggerimento e nessuna
|
|
374
|
+
accusa — la formula si scrive lo stesso. Lo usano tutti i punti in cui si scrive
|
|
375
|
+
un'espressione: la risorsa `Formula`, la modalita' Formula di una condizione, la `filterFormula`
|
|
376
|
+
di un filtro, la regola di validazione di un campo di screen dinamico e il `formulaExpression`
|
|
377
|
+
dentro un valore. A ogni punto corrispondono un `usage` e un `expectedDataType` — `Boolean` per
|
|
378
|
+
condizioni e validation rule, il tipo dichiarato per una risorsa — e mandarli e' cio' che permette
|
|
379
|
+
al motore di dire «qui serve un booleano» invece di accettare un'espressione che fallira' davanti
|
|
380
|
+
all'utente. Il documento si manda **in lavorazione**: una formula cita le variabili appena
|
|
381
|
+
aggiunte. Tre esiti restano distinti e nessuno dei tre e' «formula valida»: primitiva assente
|
|
382
|
+
(`MissingService`, silenzio), `isVerified: false` (motore non configurato: si dice che non e'
|
|
383
|
+
stata controllata), `isValid` (verificata davvero, ed e' l'unico caso con la spunta verde) — una
|
|
384
|
+
spunta su un'espressione mai controllata e' peggio di nessuna spunta.
|
|
385
|
+
|
|
337
386
|
**Un campo a `null` e' assente.** Il valore ha un campo per tipo e va valorizzato **uno e un solo**
|
|
338
387
|
campo (§4.2); la §2 dice che cio' che non c'e' si omette, ma un backend che serializza tutte le
|
|
339
388
|
proprieta' — `System.Text.Json` senza `IgnoreNullValues` lo fa di default — manda
|
|
@@ -406,12 +455,15 @@ src/lib/
|
|
|
406
455
|
flow-document.store.ts il documento come fonte di verita': flatten, CRUD, undo/redo
|
|
407
456
|
flow-dictionary.store.ts cache dei dizionari e memoizzazione dei cataloghi
|
|
408
457
|
flow-validation.store.ts debounce, indicizzazione dei rilievi per elemento e campo
|
|
458
|
+
formula-validation.service.ts la verifica di una singola formula, e la memoria di
|
|
459
|
+
"questo ambiente la primitiva non ce l'ha"
|
|
409
460
|
flow-editor-session.ts versioni, salvataggio, concorrenza ottimistica
|
|
410
461
|
flow-layout.service.ts auto-layout con dagre
|
|
411
462
|
flow-name.util.ts nomi: regexp, namespace unico, slug dalla label
|
|
412
463
|
condition-logic.util.ts riscrittura di conditionLogic su cancella / riordina
|
|
413
464
|
condition-types.util.ts quali tipi si confrontano, e i numeri in cultura invariante
|
|
414
465
|
stage-step.util.ts gli step di uno stage: nomi, output non condizionabili
|
|
466
|
+
screen-field.util.ts l'albero dei campi di uno screen dinamico: percorsi, nomi, mutazioni
|
|
415
467
|
ui/
|
|
416
468
|
flow-builder.component.ts il componente da montare
|
|
417
469
|
canvas/ palette/ inspector/ resources/ problems/ versions/ debug/ shared/
|
|
@@ -442,6 +494,7 @@ Oltre ad Angular:
|
|
|
442
494
|
|---|---|
|
|
443
495
|
| `@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 |
|
|
444
496
|
| `dagre` | auto-layout gerarchico del comando «Riordina» |
|
|
497
|
+
| `@angular/cdk` | il solo `drag-drop`, per l'albero dei campi dello screen dinamico. Nessun componente Material: i controlli restano input nativi |
|
|
445
498
|
|
|
446
499
|
Nessun design system: i controlli sono input nativi con binding espliciti e CSS custom, così
|
|
447
500
|
il builder si integra nel tema dell'app ospite senza imporre il proprio.
|
|
@@ -465,6 +518,12 @@ Le variabili si sovrascrivono sul contenitore:
|
|
|
465
518
|
Elenco completo in `styles/flow-builder.css`. Per la variante scura basta
|
|
466
519
|
`data-fb-theme="dark"` su un antenato.
|
|
467
520
|
|
|
521
|
+
La dialog di modifica ha **una misura sola per ogni tipo di elemento** — l'inspector dentro
|
|
522
|
+
cambia, la finestra no, altrimenti i comandi si spostano sotto il mouse a ogni apertura — e le
|
|
523
|
+
due misure sono token: `--fb-dialog-width` (1400px) e `--fb-dialog-height` (860px), entrambe
|
|
524
|
+
limitate allo spazio disponibile. La larghezza e' quella che serve al compositore dello screen
|
|
525
|
+
dinamico, che e' a due pannelli.
|
|
526
|
+
|
|
468
527
|
Nota sugli archi: il colore si imposta valorizzando le custom properties del tema di
|
|
469
528
|
@foblex/flow (`--ff-connection-color`, `--ff-marker-color`) invece di sovrascrivere le sue
|
|
470
529
|
regole, perche' i selettori hanno la stessa specificita' e chi vince dipenderebbe dall'ordine
|
|
@@ -523,6 +582,15 @@ possibile anche con errori e attivazione bloccata dagli errori (§8).
|
|
|
523
582
|
vivono dentro `rules[i].connector`, ma un arco selezionato perde la selezione.
|
|
524
583
|
- **`relatedRecords` di Get Records** e' esposto in sola lettura con un avviso: e' modellato
|
|
525
584
|
ma non tradotto in query.
|
|
585
|
+
- **La verifica delle formule e' del sistema ospite**: senza un motore configurato l'editor non
|
|
586
|
+
ha nulla da dire sulla sintassi, e lo dice — non finge una conferma. La libreria non prova a
|
|
587
|
+
supplire con un parser proprio: una grammatica indovinata segnalerebbe come sbagliate le
|
|
588
|
+
espressioni che il motore vero accetta.
|
|
589
|
+
- **Il compositore dello screen dinamico non usa le drop list del CDK**: annidate sono ambigue
|
|
590
|
+
— il rettangolo di una sezione contiene quello delle sue colonne, e a ricevere il rilascio e'
|
|
591
|
+
sempre la lista registrata per prima, cioe' la radice. Il bersaglio si calcola dal DOM
|
|
592
|
+
(`elementFromPoint` per il contenitore piu' interno, i rettangoli dei fratelli per la
|
|
593
|
+
posizione).
|
|
526
594
|
- **L'esecutore della demo non valuta le condizioni**: prende il primo ramo disponibile e lo
|
|
527
595
|
scrive nella traccia. È un mock per esercitare il pannello, non il motore.
|
|
528
596
|
- **Nessun test automatico**: la libreria e' stata verificata a mano sull'app demo (canvas,
|