@esfaenza/flow-builder 20.3.52 → 20.3.54

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
@@ -162,7 +162,7 @@ sono opzionali e rifiutano con `MissingService` se non sovrascritti.
162
162
  | `listEnumTypes`, `listEvents`, `listSubflowCandidates` | astratti |
163
163
  | `describeObject` | opzionale |
164
164
  | `listFieldValues(object, field)` | opzionale — i valori ammessi di un campo a **scelta chiusa** (`hasClosedValueSet`, §6.4), cioe' l'altra meta' degli insiemi chiusi: quelli di un `Enum` sono del **tipo** (`listEnumValues`), questi della **colonna** — `Ordine.Stato` e `Attivita.Stato` possono ammettere valori diversi pur essendo due `String`, ed e' perche' serve la coppia. Lista vuota = "non lo so": il valore si scrive a mano |
165
- | `listFormulaFunctions(usage?)` | opzionale — le funzioni (e gli operatori, se il motore li dichiara) scrivibili in un'espressione: e' la **palette** di `<fb-formula-editor>`, la terza gamba accanto ai nomi (`getReferences`) e al giudizio (`validateFormula`). `usage` e' lo stesso di `validateFormula` e un motore che non filtra risponde comunque tutto, che e' legittimo. Due regole: lista vuota = «il motore non le dichiara» e la palette non compare (§4.6), e l'elenco **non e' autoritativo** — accusare una funzione fuori catalogo sarebbe un rilievo falso su una formula valida |
165
+ | `listFormulaFunctions(usage?)` | opzionale — le funzioni (e gli operatori, se il motore li dichiara) scrivibili in un'espressione: e' la **palette** di `<fb-formula-editor>`, la terza gamba accanto ai nomi (`getReferences`) e al giudizio (`validateFormula`). `usage` e' lo stesso di `validateFormula` e un motore che non filtra risponde comunque tutto, che e' legittimo. Due regole: lista vuota = «il motore non le dichiara» e la palette non compare (§4.6), e l'elenco **non e' autoritativo** — accusare una funzione fuori catalogo sarebbe un rilievo falso su una formula valida. `requiresPriorValues` marca le funzioni sui valori precedenti del record: la palette le toglie dove un «prima» non c'e' (§6.3) |
166
166
  | `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 |
167
167
  | `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**) |
168
168
 
@@ -394,11 +394,62 @@ Tre conseguenze nell'editor:
394
394
  - **la coppia si legge in un posto solo**, `FlowDictionaryStore.flowTypeOf`. Tre dei sei tipi sono
395
395
  `AutoLaunched`, quindi ogni domanda posta al solo `processType` da qui in avanti risponde male: e'
396
396
  il motivo per cui la palette decide di offrire gli screen da `allowsScreens` e non piu' dal
397
- `processType`, e per cui lo Start propone i soli `triggerTypes` del tipo scelto;
397
+ `processType`, e per cui lo Start propone i soli `triggerTypes` del tipo scelto — e su un flow
398
+ innescato da un record nemmeno quelli, vedi qui sotto;
398
399
  - `flowType` compare **derivato** nell'elenco dei flow, nelle versioni e nell'outline, e vale `null`
399
400
  per cio' che non e' uno dei sei (un `Evaluation`, un'orchestrazione senza trigger): lì si mostra il
400
401
  `processType`, e non e' un difetto da correggere.
401
402
 
403
+ **Quando parte un flow innescato da un record (§3.4).** I campi sono due — `recordTriggerType` è
404
+ l'**operazione**, `triggerType` il **momento** rispetto alla scrittura — ma non sono due assi liberi,
405
+ perché l'eliminazione ha un momento solo: le coppie che significano qualcosa sono sei. Da due tendine
406
+ indipendenti si dichiara «prima dell'eliminazione» insieme a «alla creazione», e il runtime la legge
407
+ come un'eliminazione — con `RecordBeforeDelete` l'operazione la dice il trigger e `recordTriggerType`
408
+ non viene guardato — cioè il flow parte su un'operazione che nessuno ha scelto.
409
+
410
+ Quindi su questi flow l'inspector dello Start **non ha la tendina «quando parte»**: chiede
411
+ l'oggetto, poi l'**operazione**, poi i criteri, poi il **momento** fra i soli che l'operazione
412
+ ammette. Quali siano lo dice la voce di `recordTriggerTypes` nei dizionari — `triggerTypes`,
413
+ `defaultTriggerType`, `allowsTimingChoice`, `usesPriorRecord` — e sono gli stessi flag che applica il
414
+ backend: proporre i `triggerTypes` di primo livello significa proporre coppie che la validazione
415
+ rifiuta. Quattro conseguenze:
416
+
417
+ - i due campi si scrivono **insieme, in una sola mutazione**: con due, l'annulla riporterebbe
418
+ indietro il momento lasciando l'operazione nuova, cioè una coppia che non è nessuna delle sei;
419
+ - dove il momento è unico la domanda **non si pone** e il campo si scrive comunque, perché il
420
+ contratto chiede entrambi;
421
+ - `doesRequireRecordChangedToMeetCriteria` compare **solo** dove l'operazione porta
422
+ `usesPriorRecord`: alla creazione e all'eliminazione non c'è un «prima» da confrontare, e il flag
423
+ resterebbe inerte;
424
+ - `START_TRIGGER_MISMATCH` da questa sequenza **non è esprimibile**. Lo si incontra solo aprendo un
425
+ documento scritto altrove, e lì l'editor lo **dice** e offre il comando per rimettere il momento fra
426
+ quelli ammessi, invece di correggerlo da sé — quale metà della coppia sia quella voluta non lo sa.
427
+ Gli altri due rilievi sono avvisi: operazione assente su un trigger di salvataggio vale «ogni
428
+ salvataggio» (`START_RECORD_TRIGGER_MISSING`), operazione su un flow che non è innescato da un
429
+ record è inerte (`START_RECORD_TRIGGER_IGNORED`).
430
+
431
+ **I valori precedenti del record non ci sono sempre (§7).** Chi li legge — l'operatore `IsChanged`,
432
+ un riferimento radicato su `$Record__Prior`, il flag `doesRequireRecordChangedToMeetCriteria` — vale
433
+ quanto l'**operazione** che innesca il flow, non quanto il momento. È l'unico codice con **tre**
434
+ gravità: sull'aggiornamento i valori ci sono a ogni esecuzione e non c'è niente da dire; su
435
+ «creazione e aggiornamento» sulla creazione non ci sono, e lì la condizione non è valutabile — il
436
+ flow funziona a metà, quindi `Warning`; sulla creazione e sull'eliminazione non ci sono mai e a
437
+ runtime l'interview **fallisce** davanti a chi stava salvando, quindi `Error`. Su un flow che non è
438
+ innescato da un record resta un avviso: i valori può passarli chi avvia l'interview.
439
+
440
+ La regola sta in `core/record-trigger.ts` — `priorValuesOfDefinition`, `priorValuesSeverity`,
441
+ `priorCriteriaSeverity` — ed è esportata perché la applicano i due capi: l'editor la dice **mentre
442
+ si scrive** la condizione (condition editor, editor dei filtri, reference picker), il backend la
443
+ emette come `PRIOR_VALUES_NOT_AVAILABLE`. Tre conseguenze:
444
+
445
+ - il flag dei criteri di ingresso è l'eccezione: il runtime lo **ignora** invece di fallire, quindi
446
+ non è mai un errore, e su «creazione e aggiornamento» non è nemmeno un rilievo;
447
+ - nel reference picker `$Record__Prior` ha uno stato suo, guardato **prima** degli altri: un host
448
+ che smette di proporre quello scope — ed è giusto che lo faccia dove i valori non ci sono mai — lo
449
+ farebbe altrimenti cadere in «questo nome non esiste», che manda a cercare un nome sbagliato;
450
+ - le **formule** restano fuori: un'espressione che cita `$Record__Prior` non è analizzabile lato
451
+ client, perché la sintassi la conosce solo il motore (§6.3).
452
+
402
453
  **L'attivazione, e la sua seconda meta' (§8).** I tre tipi che non partono da soli vanno **presi in
403
454
  carico** dall'infrastruttura dell'ospite — uno scheduler, un bus, un intercettore delle scritture — e
404
455
  il backend li registra prima di attivare. Da lì due esiti che il pannello dei problemi non spiega,
@@ -765,7 +816,15 @@ Due cose che non si devono confondere: elenco vuoto significa «il motore non le
765
816
  il bottone non compare affatto invece di aprire un pannello vuoto; e l'elenco **non e'
766
817
  autoritativo** — a giudicare resta `validateFormula`, e accusare una funzione fuori catalogo
767
818
  sarebbe un rilievo falso su una formula valida, perche' un motore puo' supportare piu' di quanto
768
- dichiara. `signature` e `description` si mostrano e non si parsano: la grammatica resta del motore. Lo usano tutti i punti in cui si scrive
819
+ dichiara. `signature` e `description` si mostrano e non si parsano: la grammatica resta del motore.
820
+ Il solo filtro che la palette applica da sé è `requiresPriorValues` (§6.3): le funzioni che leggono i
821
+ **valori precedenti** del record — `PRIORVALUE`, `ISCHANGED` — non si propongono dove un «prima» non
822
+ c'è mai (creazione, eliminazione) né dove non c'è un record che innesca; su «creazione e
823
+ aggiornamento» restano, perché la metà aggiornamento le usa. La regola è quella di
824
+ `core/record-trigger.ts`, la stessa che il backend applica quando il suo endpoint riceve il
825
+ documento — la `GET` proposta dal contratto non lo porta, quindi filtrare qui è ciò che la fa
826
+ funzionare comunque; e resta una **proposta**, perché a giudicare una `PRIORVALUE` scritta a mano è
827
+ sempre `validateFormula`, con il codice che il motore dichiara. Lo usano tutti i punti in cui si scrive
769
828
  un'espressione: la risorsa `Formula`, la modalita' Formula di una condizione, la `filterFormula`
770
829
  di un filtro, la regola di validazione di un campo di screen dinamico e il `formulaExpression`
771
830
  dentro un valore. A ogni punto corrispondono un `usage` e un `expectedDataType` — `Boolean` per