@esfaenza/flow-builder 20.3.15 → 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
  |---|---|
@@ -226,9 +227,15 @@ Decision, Loop, Collection Processor, Get / Create / Update / Delete / Rollback
226
227
  Action, Script, Subflow, Wait, Custom Error, Transform, Orchestrated Stage. Più l'intestazione
227
228
  comune con la rinomina, che **riscrive tutti i riferimenti** all'elemento.
228
229
 
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**
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**
232
239
  (`screenFieldTypes` e i suoi flag `storesValue`, `isCollection`, `acceptsChoices`, `isContainer`,
233
240
  `requiresDataType`), non il codice: sono gli stessi flag che applica il runtime, e
234
241
  reimplementarli porta a proporre configurazioni che il motore rifiuta.
@@ -244,8 +251,8 @@ Tre cose che il modello non mostra e il form dice:
244
251
  - `choiceReferences` accetta **solo** `Choice` e `DynamicChoiceSet`, e gli output automatici di un
245
252
  `ComponentInstance` sono esclusivi con i suoi `outputParameters`.
246
253
 
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.
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».
249
256
 
250
257
  Sullo stage di orchestrazione il form dice le tre cose che il modello non mostra: gli step
251
258
  **non sono una sequenza** (le frecce riordinano l'esame, non l'esecuzione), ingresso e uscita
@@ -355,6 +362,27 @@ vuoto resta "non lo so" — primitiva non esposta, tipo senza valori dichiarati,
355
362
  da scegliere — e allora il valore si digita; con l'elenco popolato un valore fuori elenco e' un
356
363
  **avviso**, perche' nessun codice della §7 lo blocca ed e' l'editor ad accorgersene prima del runtime.
357
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
+
358
386
  **Un campo a `null` e' assente.** Il valore ha un campo per tipo e va valorizzato **uno e un solo**
359
387
  campo (§4.2); la §2 dice che cio' che non c'e' si omette, ma un backend che serializza tutte le
360
388
  proprieta' — `System.Text.Json` senza `IgnoreNullValues` lo fa di default — manda
@@ -427,6 +455,8 @@ src/lib/
427
455
  flow-document.store.ts il documento come fonte di verita': flatten, CRUD, undo/redo
428
456
  flow-dictionary.store.ts cache dei dizionari e memoizzazione dei cataloghi
429
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"
430
460
  flow-editor-session.ts versioni, salvataggio, concorrenza ottimistica
431
461
  flow-layout.service.ts auto-layout con dagre
432
462
  flow-name.util.ts nomi: regexp, namespace unico, slug dalla label
@@ -552,13 +582,15 @@ possibile anche con errori e attivazione bloccata dagli errori (§8).
552
582
  vivono dentro `rules[i].connector`, ma un arco selezionato perde la selezione.
553
583
  - **`relatedRecords` di Get Records** e' esposto in sola lettura con un avviso: e' modellato
554
584
  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.
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).
562
594
  - **L'esecutore della demo non valuta le condizioni**: prende il primo ramo disponibile e lo
563
595
  scrive nella traccia. È un mock per esercitare il pannello, non il motore.
564
596
  - **Nessun test automatico**: la libreria e' stata verificata a mano sull'app demo (canvas,