@esfaenza/flow-builder 20.3.3 → 20.3.5
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 +34 -5
- package/fesm2022/esfaenza-flow-builder.mjs +902 -88
- package/fesm2022/esfaenza-flow-builder.mjs.map +1 -1
- package/index.d.ts +461 -23
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -142,6 +142,7 @@ sono opzionali e rifiutano con `MissingService` se non sovrascritti.
|
|
|
142
142
|
| `listForms` / `listFormParameters` | astratti |
|
|
143
143
|
| `listEnumTypes`, `listEvents`, `listSubflowCandidates` | astratti |
|
|
144
144
|
| `describeObject`, `listFieldValues` | opzionali |
|
|
145
|
+
| `listStructures`, `describeStructure(className)` | opzionali — le classi e i loro membri per le risorse `Structure` (§4.7). `listStructures` e' l'**elenco delle classi** senza membri; `describeStructure` restituisce la **descrizione** di una classe (`className`, `label`, `members`), non un array nudo (§4.7.1). Senza, le classi non sono verificabili e il nome si scrive a mano: "non lo so", non "non esiste". I tre esiti sono distinti: `members` popolato = elenco autorevole, `members: []` = membri non dichiarati (si digita, nessuna accusa), rifiuto `StructureNotFound` = classe non registrata (si segnala la **classe**) |
|
|
145
146
|
|
|
146
147
|
| §6.5 Esecuzione | |
|
|
147
148
|
|---|---|
|
|
@@ -224,8 +225,29 @@ fa fallire l'interview. Una condizione che referenzia l'output di un altro step
|
|
|
224
225
|
con la via d'uscita: scrivere quel risultato in una variabile.
|
|
225
226
|
|
|
226
227
|
**Risorse.** I sette tipi, con i vincoli visibili: `dataType` obbligatorio, `objectType` per
|
|
227
|
-
`Object` / `Enum`, `scale` solo sui numerici, costanti che non possono referenziare
|
|
228
|
-
`stageOrder` distinti.
|
|
228
|
+
`Object` / `Enum` / `Structure`, `scale` solo sui numerici, costanti che non possono referenziare
|
|
229
|
+
risorse, `stageOrder` distinti.
|
|
230
|
+
|
|
231
|
+
**Classi (`Structure`).** L'ottavo tipo di dato non e' un doppione di `Object` (§4.7): di
|
|
232
|
+
un'istanza di classe il flow legge e scrive i **membri**. Cambia quindi il form: la classe si
|
|
233
|
+
scoglie con `<fb-structure-picker>` e la sua assenza e' un **errore** — senza classe il runtime
|
|
234
|
+
non ha nulla da istanziare — mentre il campo «valore iniziale» non c'e' affatto, perche' non
|
|
235
|
+
esiste un `structureValue` e la variabile parte con un'istanza vuota. I membri si scelgono con
|
|
236
|
+
`<fb-structure-member-picker>`, e nelle destinazioni si propongono **solo** quelli scrivibili: un
|
|
237
|
+
membro calcolato si legge in una condizione ma assegnarlo e' `TARGET_NOT_WRITABLE`. Lo stesso
|
|
238
|
+
vale dentro `<fb-reference-picker>`, dove i membri di una variabile `Structure` sono l'unica
|
|
239
|
+
eccezione ai percorsi non verificati: `Richiesta.Ragione` si propone e il **primo** segmento si
|
|
240
|
+
verifica (`STRUCTURE_MEMBER_UNKNOWN`), oltre quello si torna a "non lo so" — la descrizione della
|
|
241
|
+
classe e' piatta, e i membri di una classe annidata sono una seconda chiamata (§4.7.1). Un
|
|
242
|
+
Transform con target `Structure` compone l'istanza intera in un elemento solo: lì
|
|
243
|
+
`outputFieldApiName` e' il nome di un membro, e il form lo dice invece di far indovinare (§5.12).
|
|
244
|
+
|
|
245
|
+
Dei tre esiti di `describeStructure` il picker mostra tre messaggi diversi, perche' portano a
|
|
246
|
+
gesti opposti: con l'elenco autorevole un nome fuori elenco e' un errore; con `members: []` la
|
|
247
|
+
classe e' valida ma i membri non sono dichiarati e il nome si **digita**, senza accuse; con un
|
|
248
|
+
404 (`StructureNotFound`) e' la **classe** a essere sbagliata, e il messaggio manda a correggere
|
|
249
|
+
quella invece del membro. L'intestazione dell'elenco usa la `label` della classe, che e' la
|
|
250
|
+
ragione per cui la risposta ha un involucro invece di essere un array.
|
|
229
251
|
|
|
230
252
|
**Oggetti e campi.** Ogni punto che chiede un'entita' o un suo campo usa lo stesso controllo:
|
|
231
253
|
`<fb-object-picker>` e `<fb-field-picker>`, una casella con autocomplete che filtra il catalogo
|
|
@@ -235,9 +257,15 @@ campo di testo cieco. La scrittura libera e' voluta — i percorsi di relazione
|
|
|
235
257
|
(`Cliente.Citta`) non sono enumerabili e il catalogo dell'host puo' essere incompleto — ma un
|
|
236
258
|
nome fuori catalogo viene segnalato subito, prima che il backend risponda `OBJECT_UNKNOWN` o
|
|
237
259
|
`FIELD_UNKNOWN`. Il campo si chiede sempre con l'uso giusto (`filterable`, `sortable`,
|
|
238
|
-
`updateable`), che decide sia l'elenco sia il testo dell'avviso: "non filtrabile"
|
|
239
|
-
aggiornabile"
|
|
240
|
-
|
|
260
|
+
`updateable`, `createable`), che decide sia l'elenco sia il testo dell'avviso: "non filtrabile",
|
|
261
|
+
"non aggiornabile" e "non valorizzabile alla creazione" sono errori diversi. In particolare
|
|
262
|
+
`createable` e `updateable` **non** sono sinonimi (§5.7): un Create propone i primi, un Update i
|
|
263
|
+
secondi, e il validatore usa il codice giusto per l'elemento (`FIELD_NOT_CREATEABLE` /
|
|
264
|
+
`FIELD_NOT_UPDATEABLE`). Per lo stesso motivo l'editor non da' per scontato che `Id` sia
|
|
265
|
+
filtrabile: su una chiave composta porta la forma canonica della chiave e non e' filtrabile,
|
|
266
|
+
quindi l'editor dice di filtrare per le colonne della chiave invece di far cercare un campo che
|
|
267
|
+
nell'elenco non c'e'. Restano `<select>` i dizionari chiusi — tipi di dato, operatori,
|
|
268
|
+
enumerazioni — dove non c'e' niente da scrivere a mano.
|
|
241
269
|
|
|
242
270
|
Lo stesso controllo, nella variante `<fb-name-picker>`, vale per **ogni altro nome che il flow
|
|
243
271
|
prende da fuori**: tipo di action e action, script, form, i nomi dei loro parametri di ingresso
|
|
@@ -383,6 +411,7 @@ distribuire e nessuna dipendenza da un font di icone dell'applicazione ospite.
|
|
|
383
411
|
| 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 |
|
|
384
412
|
| 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** |
|
|
385
413
|
| 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 primo segmento; 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) |
|
|
386
415
|
|
|
387
416
|
Altre regole del contratto rispettate: liste vuote omesse invece di scritte come `[]` (§2),
|
|
388
417
|
`filterLogic` mostrato **solo** dove il modello lo prevede (§4.4), `fullName` / `status` mai
|