@esfaenza/flow-builder 20.3.5 → 20.3.7
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 +29 -11
- package/fesm2022/esfaenza-flow-builder.mjs +621 -269
- package/fesm2022/esfaenza-flow-builder.mjs.map +1 -1
- package/index.d.ts +433 -190
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -235,12 +235,30 @@ non ha nulla da istanziare — mentre il campo «valore iniziale» non c'e' affa
|
|
|
235
235
|
esiste un `structureValue` e la variabile parte con un'istanza vuota. I membri si scelgono con
|
|
236
236
|
`<fb-structure-member-picker>`, e nelle destinazioni si propongono **solo** quelli scrivibili: un
|
|
237
237
|
membro calcolato si legge in una condizione ma assegnarlo e' `TARGET_NOT_WRITABLE`. Lo stesso
|
|
238
|
-
vale dentro `<fb-reference-picker>`, dove
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
238
|
+
vale dentro `<fb-reference-picker>`, dove `Richiesta.Ragione` si propone e si verifica
|
|
239
|
+
(`STRUCTURE_MEMBER_UNKNOWN`). Un Transform con target `Structure` compone l'istanza intera in un
|
|
240
|
+
elemento solo: lì `outputFieldApiName` e' il nome di un membro, e il form lo dice invece di far
|
|
241
|
+
indovinare (§5.12).
|
|
242
|
+
|
|
243
|
+
**Percorsi annidati.** I percorsi con il punto non sono piu' un buco nero: la validazione li segue,
|
|
244
|
+
e quindi li segue l'editor. `core/path-navigation.ts` naviga la catena una tappa alla volta —
|
|
245
|
+
`objectType` di un membro `Structure` porta la classe annidata, quello di un membro `Object` porta
|
|
246
|
+
un'**entita' dello schema**, e da lì si continua con i campi (§4.7.1) — ed e' lo stesso codice per
|
|
247
|
+
i membri di una classe e per i percorsi di relazione di un record (`Cliente.Citta`, §4.4). Tre
|
|
248
|
+
conseguenze visibili: i pickers propongono **il livello in cui si sta scrivendo** e hanno un «›»
|
|
249
|
+
per scendere di uno; un refuso in mezzo (`Richiesta.Clente.Nome`) e' segnalato subito, con l'elenco
|
|
250
|
+
di cio' che esiste in **quella** tappa; e dove la catena si interrompe — un membro senza
|
|
251
|
+
`objectType`, una classe annidata non descritta, una collection — il rilievo e' l'avviso
|
|
252
|
+
`PATH_NOT_VERIFIABLE` con il **motivo**, che vuol dire "non lo so" e non impedisce di scrivere.
|
|
253
|
+
Restano fuori i percorsi radicati sul risultato **automatico** di un elemento
|
|
254
|
+
(`Leggi_Contatti.Owner.Name`): la validazione non li verifica, e l'editor non accusa cio' che il
|
|
255
|
+
backend non verifica.
|
|
256
|
+
|
|
257
|
+
Su una destinazione la colonna che decide non e' la stessa nei due mondi: un membro porta il proprio
|
|
258
|
+
`isWritable`, un campo no. Fuori da un Create o da un Update il contesto non c'e' — un Assignment su
|
|
259
|
+
`Cliente.Codice` non sa se quel record verra' creato o aggiornato — quindi lì basta `isCreateable`
|
|
260
|
+
**oppure** `isUpdateable`, e un campo che non e' ne' l'uno ne' l'altro e' `TARGET_NOT_WRITABLE` in
|
|
261
|
+
qualunque contesto (§5.7).
|
|
244
262
|
|
|
245
263
|
Dei tre esiti di `describeStructure` il picker mostra tre messaggi diversi, perche' portano a
|
|
246
264
|
gesti opposti: con l'elenco autorevole un nome fuori elenco e' un errore; con `members: []` la
|
|
@@ -253,10 +271,10 @@ ragione per cui la risposta ha un involucro invece di essere un array.
|
|
|
253
271
|
`<fb-object-picker>` e `<fb-field-picker>`, una casella con autocomplete che filtra il catalogo
|
|
254
272
|
mentre si scrive. Un `<select>` andava bene con dieci entita', non con trecento; e dove il
|
|
255
273
|
catalogo non arriva il controllo resta lo stesso, con un avviso, invece di degradare in un
|
|
256
|
-
campo di testo cieco. La scrittura libera e' voluta —
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
274
|
+
campo di testo cieco. La scrittura libera e' voluta — il catalogo dell'host puo' essere incompleto —
|
|
275
|
+
ma un nome fuori catalogo viene segnalato subito, prima che il backend risponda `OBJECT_UNKNOWN` o
|
|
276
|
+
`FIELD_UNKNOWN`. I percorsi di relazione (`Cliente.Citta`) si **navigano**: l'elenco diventa quello
|
|
277
|
+
dell'oggetto referenziato e l'ultimo segmento si verifica con l'uso richiesto (§4.4). Il campo si chiede sempre con l'uso giusto (`filterable`, `sortable`,
|
|
260
278
|
`updateable`, `createable`), che decide sia l'elenco sia il testo dell'avviso: "non filtrabile",
|
|
261
279
|
"non aggiornabile" e "non valorizzabile alla creazione" sono errori diversi. In particolare
|
|
262
280
|
`createable` e `updateable` **non** sono sinonimi (§5.7): un Create propone i primi, un Update i
|
|
@@ -411,7 +429,7 @@ distribuire e nessuna dipendenza da un font di icone dell'applicazione ospite.
|
|
|
411
429
|
| 13 | **Testo e numero non si confrontano** (`CONDITION_TYPE_MISMATCH`) | `ConditionEditorComponent` conosce il tipo del lato sinistro da `POST /flows/references`: filtra gli operatori applicabili, guida il campo del letterale del secondo operando e segnala la coppia vietata. La regola sta in `core/condition-types.util.ts`, che salta gli operatori con semantica propria (`Contains`, `In`, …). I numeri si scrivono in cultura invariante: `1234,50` viene tradotto in `1234.50`, non troncato |
|
|
412
430
|
| 14 | **`None` non e' un operatore, e' un "da completare"** | Condizione evidenziata come incompleta, con il conteggio in testa alla sezione e la frase «la bozza si salva, l'attivazione no»; il validatore della demo lo emette come **errore** |
|
|
413
431
|
| 15 | **Un valore data senza `Z` significa ora locale** | `ValueEditorComponent` ha un selettore «Ora locale / UTC (Z)», dice che cambiare fuso riscrive l'orario e non lo converte, e toglie il suffisso solo per il controllo `datetime-local`, che con il fuso resterebbe vuoto |
|
|
414
|
-
| 16 | **`Structure` e `Object` non sono intercambiabili** | `StructurePickerComponent` per la classe (fuori catalogo = **errore**, `STRUCTURE_TYPE_UNKNOWN`) e `StructureMemberPickerComponent` per i membri, filtrati su `isWritable` dove serve una destinazione. Il pannello risorse mostra la classe come obbligatoria con severita' di errore e **non** mostra il valore iniziale, perche' un `structureValue` non esiste; `ReferencePickerComponent` propone `Variabile.Membro` e verifica il
|
|
432
|
+
| 16 | **`Structure` e `Object` non sono intercambiabili** | `StructurePickerComponent` per la classe (fuori catalogo = **errore**, `STRUCTURE_TYPE_UNKNOWN`) e `StructureMemberPickerComponent` per i membri, filtrati su `isWritable` dove serve una destinazione. Il pannello risorse mostra la classe come obbligatoria con severita' di errore e **non** mostra il valore iniziale, perche' un `structureValue` non esiste; `ReferencePickerComponent` propone `Variabile.Membro` e verifica il percorso **fino in fondo** con `core/path-navigation.ts`, con `PATH_NOT_VERIFIABLE` dove la catena si interrompe; il Transform con target classe chiede un membro invece di un campo. `FlowDictionaryStore.isStructure` legge il flag dal dizionario, non dal nome del tipo. La risposta dei membri e' la **descrizione della classe** (`{className, label, members}`), e i suoi tre esiti restano distinti fino alla UI: `FlowCatalogStore.describeStructure` li traduce in `declared` / `undeclared` / `unknown-class` / `unknown-catalog`, e solo `declared` autorizza a dire che un membro non esiste (§4.7.1) |
|
|
415
433
|
|
|
416
434
|
Altre regole del contratto rispettate: liste vuote omesse invece di scritte come `[]` (§2),
|
|
417
435
|
`filterLogic` mostrato **solo** dove il modello lo prevede (§4.4), `fullName` / `status` mai
|