@esfaenza/flow-builder 20.3.42 → 20.3.43
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 +46 -3
- package/fesm2022/esfaenza-flow-builder.mjs +371 -22
- package/fesm2022/esfaenza-flow-builder.mjs.map +1 -1
- package/index.d.ts +148 -9
- package/package.json +1 -1
package/index.d.ts
CHANGED
|
@@ -74,7 +74,15 @@ interface FlowRecordFilter {
|
|
|
74
74
|
value?: FlowValue;
|
|
75
75
|
}
|
|
76
76
|
type FlowRecordFilterOperator = 'EqualTo' | 'NotEqualTo' | 'GreaterThan' | 'GreaterThanOrEqualTo' | 'LessThan' | 'LessThanOrEqualTo' | 'StartsWith' | 'EndsWith' | 'Contains' | 'IsNull' | string;
|
|
77
|
-
/**
|
|
77
|
+
/**
|
|
78
|
+
* §4.3 — `and` | `or` | espressione sugli indici 1-based | `Formula`.
|
|
79
|
+
*
|
|
80
|
+
* Il tipo e' uno, ma i due campi che lo usano non ammettono le stesse forme: `Formula` vale per
|
|
81
|
+
* il `conditionLogic` di una condizione (l'esito lo determina il campo `formula`), e **non** vale
|
|
82
|
+
* per nessun `filterLogic` — su un dynamic choice set e' un errore di validazione, altrove passa
|
|
83
|
+
* la validazione e fa fallire l'esecuzione (§4.4). La formula di un filtro e' un campo suo,
|
|
84
|
+
* `filterFormula`, e non passa da qui.
|
|
85
|
+
*/
|
|
78
86
|
type FlowConditionLogic = 'and' | 'or' | 'Formula' | string;
|
|
79
87
|
/** Blocco condizioni riusato da Decision rule, Wait event, Collection Processor, Start. */
|
|
80
88
|
interface FlowConditionHolder {
|
|
@@ -176,11 +184,22 @@ interface FlowDynamicChoiceSet {
|
|
|
176
184
|
displayField?: string;
|
|
177
185
|
/** Assente: il valore memorizzato e' `Name` su un enum, e va dichiarato altrove. */
|
|
178
186
|
valueField?: string;
|
|
187
|
+
/**
|
|
188
|
+
* Valgono sulle sole sorgenti `object` — dove diventano la query — ed `enumType`, dove sono
|
|
189
|
+
* valutati in memoria. Su una `collectionReference` le opzioni sono gli elementi della
|
|
190
|
+
* collection nell'ordine in cui ci sono: dichiararli lì e' `CHOICE_SET_FILTERS_IGNORED` (§5.2).
|
|
191
|
+
*/
|
|
179
192
|
sortField?: string;
|
|
180
193
|
sortOrder?: FlowSortOrder;
|
|
194
|
+
/** `limit` invece vale su tutt'e tre le sorgenti; default e massimo 200 (§5.2). */
|
|
181
195
|
limit?: number;
|
|
182
|
-
/** Sempre in AND: nessun `filterLogic` qui (§4.4). Su un enum sono valutati in memoria. */
|
|
183
196
|
filters?: FlowRecordFilter[];
|
|
197
|
+
/**
|
|
198
|
+
* §4.4 — c'e' anche qui: `AND` (o assente), `OR`, oppure la logica personalizzata sugli indici
|
|
199
|
+
* 1-based. Il valore `Formula` **non** e' supportato, e su un choice set e' un errore di
|
|
200
|
+
* validazione esplicito.
|
|
201
|
+
*/
|
|
202
|
+
filterLogic?: FlowConditionLogic;
|
|
184
203
|
}
|
|
185
204
|
interface FlowStage {
|
|
186
205
|
name?: string;
|
|
@@ -2122,8 +2141,14 @@ declare function moveCondition(holder: FlowConditionHolder, from: number, to: nu
|
|
|
2122
2141
|
* Verifica che un'espressione custom sia sintatticamente accettabile e che ogni indice
|
|
2123
2142
|
* esista. Serve al feedback immediato nel form: la verita' resta della validazione
|
|
2124
2143
|
* del backend (`CONDITION_LOGIC_INVALID`).
|
|
2144
|
+
*
|
|
2145
|
+
* Il `term` esiste perche' la stessa regola vale su **due strutture diverse**: le condizioni
|
|
2146
|
+
* (§4.3) e i filtri sui record (§4.4), che dalla revisione del contratto hanno la logica
|
|
2147
|
+
* personalizzata anche sui dynamic choice set. Il progetto tiene distinte le due cose in ogni
|
|
2148
|
+
* altro punto, e un messaggio che dice «condizione» dentro un elenco di filtri manda a cercare
|
|
2149
|
+
* qualcosa che in quel form non c'e'.
|
|
2125
2150
|
*/
|
|
2126
|
-
declare function checkConditionLogic(logic: string, conditionCount: number): string | null;
|
|
2151
|
+
declare function checkConditionLogic(logic: string, conditionCount: number, term?: 'condizione' | 'filtro'): string | null;
|
|
2127
2152
|
|
|
2128
2153
|
/**
|
|
2129
2154
|
* Testo e numero non si confrontano — FRONTEND.md §4.3, §13.13.
|
|
@@ -4792,7 +4817,7 @@ declare class NamePickerComponent {
|
|
|
4792
4817
|
* **errori** che bloccano l'attivazione (`ACTION_UNKNOWN`, `FORM_UNKNOWN`), mentre un flow
|
|
4793
4818
|
* senza versione attiva e' un avviso. Mostrarli con lo stesso colore direbbe il falso.
|
|
4794
4819
|
*/
|
|
4795
|
-
readonly unknownSeverity: _angular_core.InputSignal<"
|
|
4820
|
+
readonly unknownSeverity: _angular_core.InputSignal<"warn" | "error">;
|
|
4796
4821
|
/**
|
|
4797
4822
|
* Nomi che **esistono** ma non sono utilizzabili qui. Il caso vero e' il catalogo dei form,
|
|
4798
4823
|
* dove una schermata intera e un componente vivono nello stesso elenco e si distinguono per
|
|
@@ -5012,7 +5037,7 @@ declare class FormulaEditorComponent {
|
|
|
5012
5037
|
* dinamico — e riscriverla a ogni tasto costa. La **verifica** parte comunque durante la
|
|
5013
5038
|
* digitazione: usa la bozza locale, non cio' che e' arrivato al documento.
|
|
5014
5039
|
*/
|
|
5015
|
-
readonly commitOn: _angular_core.InputSignal<"
|
|
5040
|
+
readonly commitOn: _angular_core.InputSignal<"input" | "change">;
|
|
5016
5041
|
readonly expressionChange: _angular_core.OutputEmitterRef<string>;
|
|
5017
5042
|
private readonly area;
|
|
5018
5043
|
/**
|
|
@@ -5361,7 +5386,7 @@ declare class RecordFilterEditorComponent {
|
|
|
5361
5386
|
* (§5.8, §13.10).
|
|
5362
5387
|
*/
|
|
5363
5388
|
readonly emptyWarning: _angular_core.InputSignal<string | null>;
|
|
5364
|
-
readonly emptyWarningSeverity: _angular_core.InputSignal<"
|
|
5389
|
+
readonly emptyWarningSeverity: _angular_core.InputSignal<"warn" | "error">;
|
|
5365
5390
|
readonly changed: _angular_core.OutputEmitterRef<(holder: FilterHolder) => void>;
|
|
5366
5391
|
/** Tutti i campi, filtrabili o no: serve solo a riconoscere le chiavi composte (§5.8). */
|
|
5367
5392
|
private readonly allFields;
|
|
@@ -5384,8 +5409,28 @@ declare class RecordFilterEditorComponent {
|
|
|
5384
5409
|
* evita la ricerca di un campo che nell'elenco non c'e' e non ci sara'.
|
|
5385
5410
|
*/
|
|
5386
5411
|
readonly identifierNotFilterable: _angular_core.Signal<boolean>;
|
|
5412
|
+
/**
|
|
5413
|
+
* La modalita' attiva. La **formula si riconosce dal suo campo** e non da `filterLogic`: il
|
|
5414
|
+
* valore `Formula` non e' supportato da nessun elemento (§4.4), quindi non puo' essere cio' che
|
|
5415
|
+
* accende la modalita' — altrimenti l'editor riscriverebbe nel documento un valore che fa
|
|
5416
|
+
* fallire l'esecuzione.
|
|
5417
|
+
*/
|
|
5387
5418
|
readonly logicMode: _angular_core.Signal<"and" | "or" | "formula" | "custom">;
|
|
5419
|
+
/**
|
|
5420
|
+
* `filterLogic: "Formula"` letto dal documento. Non lo scrive nessun gesto di questo editor:
|
|
5421
|
+
* arriva da un flow scritto altrove, e va detto invece di essere corretto di soppiatto —
|
|
5422
|
+
* cancellarlo sarebbe una modifica che l'utente non ha chiesto, su un campo che potrebbe
|
|
5423
|
+
* essere l'unico indizio di cosa quel flow voleva fare.
|
|
5424
|
+
*/
|
|
5425
|
+
readonly unsupportedFormulaLogic: _angular_core.Signal<boolean>;
|
|
5388
5426
|
readonly customLogic: _angular_core.Signal<string>;
|
|
5427
|
+
/**
|
|
5428
|
+
* Il riscontro locale sull'espressione: indici che non esistono, parentesi sbilanciate, termini
|
|
5429
|
+
* rimasti orfani (`?`) dopo la cancellazione di un filtro. La verita' resta della validazione
|
|
5430
|
+
* del backend (`CONDITION_LOGIC_INVALID`, che e' un **errore** e blocca l'attivazione), ma
|
|
5431
|
+
* scoprirlo lì significa scoprirlo dopo.
|
|
5432
|
+
*/
|
|
5433
|
+
readonly customLogicError: _angular_core.Signal<string | null>;
|
|
5389
5434
|
readonly showEmptyWarning: _angular_core.Signal<boolean>;
|
|
5390
5435
|
addFilter(): void;
|
|
5391
5436
|
removeFilter(index: number): void;
|
|
@@ -5562,7 +5607,7 @@ declare class MergeTextEditorComponent {
|
|
|
5562
5607
|
readonly disabled: _angular_core.InputSignal<boolean>;
|
|
5563
5608
|
readonly rows: _angular_core.InputSignal<number>;
|
|
5564
5609
|
/** Come nel formula editor: `change` dove mutare il documento ridisegna mezza schermata. */
|
|
5565
|
-
readonly commitOn: _angular_core.InputSignal<"
|
|
5610
|
+
readonly commitOn: _angular_core.InputSignal<"input" | "change">;
|
|
5566
5611
|
readonly textChange: _angular_core.OutputEmitterRef<string>;
|
|
5567
5612
|
private readonly area;
|
|
5568
5613
|
/**
|
|
@@ -6432,6 +6477,26 @@ declare class ResourceDialogComponent {
|
|
|
6432
6477
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<ResourceDialogComponent, "fb-resource-dialog", never, { "edit": { "alias": "edit"; "required": true; "isSignal": true; }; }, { "closed": "closed"; }, never, never, true, never>;
|
|
6433
6478
|
}
|
|
6434
6479
|
|
|
6480
|
+
/**
|
|
6481
|
+
* Il filtro dell'elenco delle risorse.
|
|
6482
|
+
*
|
|
6483
|
+
* Esiste per la **scala**: un flow di produzione ha ventun variabili e dodici dynamic choice
|
|
6484
|
+
* set, e a quella misura il problema dell'elenco non e' leggerlo ma trovarci dentro una riga.
|
|
6485
|
+
* Non e' la ricerca del flow (`core/flow-search.ts`), che sa dov'e' un nome che si conosce
|
|
6486
|
+
* **già**: qui si restringe un elenco che si sta guardando, e le due domande che si fanno
|
|
6487
|
+
* davvero — «quali non sono usate» e «quali hanno qualcosa che non va» — non sono nomi.
|
|
6488
|
+
*
|
|
6489
|
+
* Cio' che il testo guarda e' cio' che l'elenco **mostra**, piu' il nome e l'etichetta: e' la
|
|
6490
|
+
* stessa scelta di `flow-search`, dove il contenuto dei valori resta fuori perche' «chi cita
|
|
6491
|
+
* `Totale`» e' un'altra domanda — quella la risponde il conteggio degli usi. Quindi
|
|
6492
|
+
* l'espressione di una formula e il valore di una costante **non** si cercano: chi digita
|
|
6493
|
+
* «IVA» e vede comparire una formula che non si chiama così crede di aver trovato una risorsa
|
|
6494
|
+
* che non c'e'.
|
|
6495
|
+
*/
|
|
6496
|
+
|
|
6497
|
+
/** Lo stato su cui si restringe l'elenco, oltre al testo. */
|
|
6498
|
+
type ResourceStateFilter = 'all' | 'unused' | 'issues';
|
|
6499
|
+
|
|
6435
6500
|
/**
|
|
6436
6501
|
* Le sette collection di risorse (§4.6).
|
|
6437
6502
|
*
|
|
@@ -6478,11 +6543,58 @@ declare class ResourcePanelComponent {
|
|
|
6478
6543
|
* ricalcolo del documento.
|
|
6479
6544
|
*/
|
|
6480
6545
|
readonly pendingRemoval: _angular_core.WritableSignal<string | null>;
|
|
6546
|
+
/** Il testo del filtro. Non si azzera cambiando scheda: vedi `select`. */
|
|
6547
|
+
readonly query: _angular_core.WritableSignal<string>;
|
|
6548
|
+
/** Lo stato su cui si restringe: sono le due domande che un nome non sa fare. */
|
|
6549
|
+
readonly stateFilter: _angular_core.WritableSignal<ResourceStateFilter>;
|
|
6550
|
+
readonly hasFilter: _angular_core.Signal<boolean>;
|
|
6481
6551
|
constructor();
|
|
6482
6552
|
readonly activeKind: _angular_core.Signal<ResourceKindDescriptor>;
|
|
6553
|
+
/** Tutte le risorse della collection aperta, **prima** del filtro. */
|
|
6554
|
+
readonly collectionItems: _angular_core.Signal<FlowResourceRef[]>;
|
|
6555
|
+
/** Le righe che l'elenco disegna: la collection aperta, filtrata. */
|
|
6483
6556
|
readonly items: _angular_core.Signal<FlowResourceRef[]>;
|
|
6484
|
-
countOf(collection: FlowResourceCollection): number;
|
|
6485
6557
|
select(collection: FlowResourceCollection): void;
|
|
6558
|
+
private readonly needle;
|
|
6559
|
+
/** `true` se la risorsa passa testo **e** stato. */
|
|
6560
|
+
private matches;
|
|
6561
|
+
/**
|
|
6562
|
+
* Quante risorse di ogni collection passano il filtro, e quante ce ne sono in tutto.
|
|
6563
|
+
*
|
|
6564
|
+
* Il numero sulla scheda diventa quello delle **corrispondenze** appena un filtro e' attivo,
|
|
6565
|
+
* ed e' il solo modo di rispondere alla domanda vera di chi digita: la risorsa che cerca sta
|
|
6566
|
+
* spesso in un'altra collection, e senza questo numero bisognerebbe aprire le sette schede
|
|
6567
|
+
* una per una per scoprire che non c'e' da nessuna parte. Il conteggio e' **uno** per tutte
|
|
6568
|
+
* le schede e non una `filter` per scheda nel template: quello lo rifaceva a ogni giro di
|
|
6569
|
+
* change detection, e con il filtro «non usate» dentro sarebbero cinquanta walk del
|
|
6570
|
+
* documento per volta.
|
|
6571
|
+
*/
|
|
6572
|
+
readonly tabCounts: _angular_core.Signal<Record<string, {
|
|
6573
|
+
total: number;
|
|
6574
|
+
matching: number;
|
|
6575
|
+
}>>;
|
|
6576
|
+
countOf(collection: FlowResourceCollection): number;
|
|
6577
|
+
totalOf(collection: FlowResourceCollection): number;
|
|
6578
|
+
/**
|
|
6579
|
+
* Quante risorse ha ogni stato nella scheda aperta, contate **dopo** il testo: i due chip
|
|
6580
|
+
* dicono quanto resterebbe, non quanto ce n'e' in assoluto. A zero si disabilitano, perche'
|
|
6581
|
+
* un filtro che da' certamente un elenco vuoto non e' un filtro ma un modo di nascondere
|
|
6582
|
+
* l'elenco.
|
|
6583
|
+
*/
|
|
6584
|
+
readonly stateCounts: _angular_core.Signal<{
|
|
6585
|
+
unused: number;
|
|
6586
|
+
issues: number;
|
|
6587
|
+
}>;
|
|
6588
|
+
/**
|
|
6589
|
+
* Le corrispondenze nelle **altre** schede: e' cio' che si dice quando qui non c'e' niente.
|
|
6590
|
+
* «Nessuna corrispondenza» su un elenco vuoto e' vero e inutile — il rimedio e' cambiare
|
|
6591
|
+
* scheda, e bisogna sapere se ce n'e' una da cambiare.
|
|
6592
|
+
*/
|
|
6593
|
+
readonly matchesElsewhere: _angular_core.Signal<number>;
|
|
6594
|
+
onQuery(value: string): void;
|
|
6595
|
+
/** Il secondo clic sullo stesso stato lo spegne, come nel pannello dei problemi. */
|
|
6596
|
+
setStateFilter(filter: ResourceStateFilter): void;
|
|
6597
|
+
resetFilter(): void;
|
|
6486
6598
|
isEditing(reference: FlowResourceRef): boolean;
|
|
6487
6599
|
/** Il click sul nome: apre la finestra, o la chiude se e' già quella risorsa. */
|
|
6488
6600
|
edit(reference: FlowResourceRef): void;
|
|
@@ -6490,6 +6602,12 @@ declare class ResourcePanelComponent {
|
|
|
6490
6602
|
nameError(reference: FlowResourceRef): string | null;
|
|
6491
6603
|
constantReferencesResource(reference: FlowResourceRef): boolean;
|
|
6492
6604
|
duplicateStageOrder(reference: FlowResourceRef): boolean;
|
|
6605
|
+
/**
|
|
6606
|
+
* §5.2 — cio' che su una sorgente collection il runtime ignora. Sta anche qui e non solo nel
|
|
6607
|
+
* form per la ragione di sempre: il filtro «con rilievi» porta la riga a galla, e una riga che
|
|
6608
|
+
* non dice **cosa** non va costringe ad aprirla per scoprirlo.
|
|
6609
|
+
*/
|
|
6610
|
+
ignoredChoiceSetFilters(reference: FlowResourceRef): string | null;
|
|
6493
6611
|
add(): void;
|
|
6494
6612
|
/**
|
|
6495
6613
|
* Quante volte la risorsa e' **usata** nel documento.
|
|
@@ -6503,6 +6621,19 @@ declare class ResourcePanelComponent {
|
|
|
6503
6621
|
* senza, tre formule che leggono una variabile la direbbero «non usata».
|
|
6504
6622
|
*/
|
|
6505
6623
|
usesOf(reference: FlowResourceRef): number;
|
|
6624
|
+
/**
|
|
6625
|
+
* Il conteggio di **tutte** le risorse, calcolato una volta per documento.
|
|
6626
|
+
*
|
|
6627
|
+
* `countNameUses` cammina il documento intero a ogni chiamata, e da quando il filtro lo
|
|
6628
|
+
* chiede per ogni risorsa di ogni collection — i numeri delle schede, il chip «non usate» —
|
|
6629
|
+
* chiamarlo dal template significherebbe cinquanta walk per giro di change detection.
|
|
6630
|
+
*
|
|
6631
|
+
* La chiave e' il nome **esatto** e non quello minuscolo: `countNameUses` confronta le
|
|
6632
|
+
* stringhe come sono, quindi due nomi che differiscono solo per il case — che sono un
|
|
6633
|
+
* `NAME_DUPLICATED`, non un caso da normalizzare qui — hanno due conteggi diversi, ed e'
|
|
6634
|
+
* quello che il pannello mostrava anche prima della memoizzazione.
|
|
6635
|
+
*/
|
|
6636
|
+
private readonly useCounts;
|
|
6506
6637
|
private keyOf;
|
|
6507
6638
|
isPendingRemoval(reference: FlowResourceRef): boolean;
|
|
6508
6639
|
/**
|
|
@@ -6569,6 +6700,14 @@ declare class ResourceFormComponent {
|
|
|
6569
6700
|
* tre `FIELD_UNKNOWN` che l'utente non ha scritto.
|
|
6570
6701
|
*/
|
|
6571
6702
|
setChoiceSetSource(source: ChoiceSetSource): void;
|
|
6703
|
+
/**
|
|
6704
|
+
* §5.2 — cio' che su una sorgente collection il runtime ignora, se il documento lo dichiara.
|
|
6705
|
+
* Il controllo sta in `resource-checks.ts` perche' serve anche all'**elenco**: senza, la riga
|
|
6706
|
+
* sarebbe verde e il rilievo si vedrebbe solo aprendo il form.
|
|
6707
|
+
*/
|
|
6708
|
+
ignoredChoiceSetFilters(): string | null;
|
|
6709
|
+
/** La ripulitura e' un comando, non un effetto dell'apertura del form. */
|
|
6710
|
+
clearIgnoredChoiceSetFilters(): void;
|
|
6572
6711
|
/** Su un choice set da enum il tipo e' `enumType`: il campo generico sarebbe un doppione. */
|
|
6573
6712
|
hidesObjectType(): boolean;
|
|
6574
6713
|
isChoiceSetSource(source: ChoiceSetSource): boolean;
|
|
@@ -6931,7 +7070,7 @@ declare class FlowBuilderComponent {
|
|
|
6931
7070
|
* troppo. `panel` tiene il form nel pannello laterale, che e' piu' comodo quando si
|
|
6932
7071
|
* modificano molti elementi di fila perche' non c'e' niente da aprire e chiudere.
|
|
6933
7072
|
*/
|
|
6934
|
-
readonly inspectorMode: _angular_core.InputSignal<"
|
|
7073
|
+
readonly inspectorMode: _angular_core.InputSignal<"dialog" | "panel">;
|
|
6935
7074
|
/**
|
|
6936
7075
|
* L'esito dell'ultima esecuzione, se l'ospite ne ha uno da mostrare.
|
|
6937
7076
|
*
|