@esfaenza/flow-builder 20.3.15 → 20.3.17
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 +45 -13
- package/fesm2022/esfaenza-flow-builder.mjs +1207 -241
- package/fesm2022/esfaenza-flow-builder.mjs.map +1 -1
- package/index.d.ts +501 -67
- package/package.json +1 -1
- package/styles/flow-builder.css +35 -33
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
|
|---|---|
|
|
@@ -139,7 +140,7 @@ sono opzionali e rifiutano con `MissingService` se non sovrascritti.
|
|
|
139
140
|
| `listObjects()`, `listFields(object, usage?)` | astratti |
|
|
140
141
|
| `listActionTypes` / `listActions` / `listActionParameters` | astratti |
|
|
141
142
|
| `listScripts` / `listScriptParameters` | astratti |
|
|
142
|
-
| `listForms` / `listFormParameters` | astratti |
|
|
143
|
+
| `listForms(kind?)` / `listFormParameters` | astratti — **un catalogo, due ruoli** (§5.1, §5.2): le schermate intere di uno Screen (`formName`) e i componenti di uno screen dinamico (`extensionName`) stanno nello stesso elenco e si distinguono per `formKind`. `kind` vale `Form`, `Component` o assente per tutto; una voce **senza** `formKind` vale `Any` e resta proponibile in entrambi i posti, perche' un catalogo che il ruolo non lo dichiara non deve vietare tutto. Usare l'uno al posto dell'altro e' `FORM_KIND_MISMATCH`, che e' un errore **diverso** da «il nome non esiste». I parametri si chiedono per nome, uguali per i due ruoli |
|
|
143
144
|
| `listEnumTypes`, `listEvents`, `listSubflowCandidates` | astratti |
|
|
144
145
|
| `describeObject`, `listFieldValues` | opzionali |
|
|
145
146
|
| `listEnumValues(enumType)` | opzionale — i **valori** di un tipo di enumerazione, cioe' i nomi scrivibili in `enumValue` (§4.2, §4.6). `listEnumTypes` e' l'altra meta' e non basta: quella dice quali tipi esistono, questa quali valori ha un tipo. `enumType` e' esattamente l'`objectType` della risorsa, del parametro o del **membro** di una classe (§4.7.1): la risposta e' del tipo, non del punto di uso, e la cache e' per nome del tipo. Lista vuota = "non lo so" — il valore si scrive a mano, e un tipo sconosciuto risponde vuoto, non 404 |
|
|
@@ -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).** È
|
|
230
|
-
|
|
231
|
-
|
|
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
|
|
248
|
-
|
|
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
|
-
- **
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
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,
|