@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 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, Assignment, Decision, Loop,
225
- Collection Processor, Get / Create / Update / Delete / Rollback Records, Action, Script,
226
- Subflow, Wait, Custom Error, Transform, Orchestrated Stage. Più l'intestazione comune con la
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,