@esfaenza/flow-builder 20.3.10 → 20.3.11
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 +16 -8
- package/fesm2022/esfaenza-flow-builder.mjs +141 -71
- package/fesm2022/esfaenza-flow-builder.mjs.map +1 -1
- package/index.d.ts +89 -28
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -133,7 +133,7 @@ sono opzionali e rifiutano con `MissingService` se non sovrascritti.
|
|
|
133
133
|
| §6.4 Dizionari e cataloghi | |
|
|
134
134
|
|---|---|
|
|
135
135
|
| `getDictionaries(processType?)` | astratto — `processType` filtra le globali (§4.1) |
|
|
136
|
-
| `getReferences(
|
|
136
|
+
| `getReferences(definition)` / `getWritableReferences(definition)` | astratti — prendono il **documento nudo** e restituiscono **tutti** i riferimenti: nel body non c'e' nessun filtro di tipo, e la compatibilita' col campo la decide l'editor (§6.4, §13.17) |
|
|
137
137
|
| `getConnectorTargets(definition, excluding?)` | astratto |
|
|
138
138
|
| `getOutline(definition)` | astratto |
|
|
139
139
|
| `listObjects()`, `listFields(object, usage?)` | astratti |
|
|
@@ -254,14 +254,20 @@ Restano fuori i percorsi radicati sul risultato **automatico** di un elemento
|
|
|
254
254
|
(`Leggi_Contatti.Owner.Name`): la validazione non li verifica, e l'editor non accusa cio' che il
|
|
255
255
|
backend non verifica.
|
|
256
256
|
|
|
257
|
-
Il filtro di tipo di un campo (§6.4)
|
|
257
|
+
Il filtro di tipo di un campo (§6.4) lo applica **l'editor**: la primitiva prende il documento nudo
|
|
258
|
+
e restituisce tutti i riferimenti, così la stessa risposta serve tutte le tendine di una schermata
|
|
259
|
+
(§13.17). La regola sta in `core/reference-filter.util.ts`, ed e' la stessa per le radici e per i
|
|
260
|
+
segmenti di un percorso. Il filtro guarda il tipo della **radice**, e quindi non basta: in un
|
|
258
261
|
parametro `String` una variabile `Structure` non e' compatibile, ma `Richiesta.Ragione` sì. Per
|
|
259
|
-
questo `<fb-reference-picker
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
262
|
+
questo `<fb-reference-picker>` tiene l'elenco **completo** accanto a quello filtrato, e ne ricava
|
|
263
|
+
due cose: i contenitori compaiono come righe in cui si **entra** — cliccarle apre il percorso
|
|
264
|
+
invece di scegliere un valore del tipo sbagliato — e le radici si riconoscono tutte, così un
|
|
265
|
+
`Leggi_Ordine.Numero` già scritto in un campo `String` non viene accusato di non esistere. Nelle
|
|
266
|
+
proposte non entra comunque nessun valore del tipo sbagliato: i segmenti li filtra la stessa
|
|
267
|
+
regola, tenendo solo quelli da cui si scende. In un campo di **destinazione** le due liste sono due
|
|
268
|
+
richieste — `getWritableReferences` per le proposte, `getReferences` per le radici — perche' la
|
|
269
|
+
scrivibilita' e' del **percorso** e non della radice: un `$User.Anagrafica.Citta` scritto a mano e'
|
|
270
|
+
`TARGET_NOT_WRITABLE`, non un nome che non esiste.
|
|
265
271
|
|
|
266
272
|
**Le globali si navigano come le risorse.** Un percorso dichiarato dall'host puo' portare un
|
|
267
273
|
contenitore, e allora `objectType` dice di che tipo: `$User.Anagrafica.Citta` si propone e si
|
|
@@ -450,6 +456,8 @@ distribuire e nessuna dipendenza da un font di icone dell'applicazione ospite.
|
|
|
450
456
|
| 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** |
|
|
451
457
|
| 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 |
|
|
452
458
|
| 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) |
|
|
459
|
+
| 17 | **Due body diversi per due famiglie di primitive** | `HttpFlowBuilderApi`: le primitive che **analizzano** il documento — `validate`, `parse`, `references`, `references/writable`, `connector-targets`, `outline` — lo mandano **nudo alla radice**; l'involucro `{definition, flowName, …}` resta alle sole primitive di scrittura della §6.2. Sbagliare involucro non da' nessun errore: il backend legge un flow vuoto e risponde `200`. Per lo stesso motivo `getReferences`/`getWritableReferences` prendono la `FlowDefinition` e non un oggetto query: non c'e' nessun campo di filtro nel body, e il filtro di tipo lo applica l'editor con `core/reference-filter.util.ts` |
|
|
460
|
+
| 18 | **Gli enum si scrivono come stringhe** | Il modello e' fatto di unioni di stringhe letterali (`FlowDataType`, `FlowVersionStatus`, …) e non di enum numerici: `JSON.stringify` non ha modo di produrre un ordinale. Conta perche' `"status": 3` non e' `Draft` ma `InvalidDraft` e `"dataType": 0` e' `String`, non "non specificato" — nessun errore lo segnalerebbe. Chi scrive un'altra implementazione di `FlowBuilderApi` non traduca i valori in numeri |
|
|
453
461
|
|
|
454
462
|
Altre regole del contratto rispettate: liste vuote omesse invece di scritte come `[]` (§2),
|
|
455
463
|
`filterLogic` mostrato **solo** dove il modello lo prevede (§4.4), `fullName` / `status` mai
|
|
@@ -410,6 +410,12 @@ class HttpFlowBuilderApi extends FlowBuilderApi {
|
|
|
410
410
|
return this.del(`/flows/editor/${HttpFlowBuilderApi.segment(flowName)}`);
|
|
411
411
|
}
|
|
412
412
|
// ---------------------------------------------------------------- §6.3
|
|
413
|
+
/**
|
|
414
|
+
* Documento nudo alla radice: le primitive che **analizzano** il documento non usano
|
|
415
|
+
* l'involucro `{definition, flowName, …}` della §6.2, che serve solo a chi deve sapere dove
|
|
416
|
+
* riporlo (§6.4, §13.17). Sbagliare involucro qui non produce nessun errore: si otterrebbe la
|
|
417
|
+
* validazione di un flow vuoto, cioe' «manca lo Start».
|
|
418
|
+
*/
|
|
413
419
|
validateDefinition(definition) {
|
|
414
420
|
return this.post(`/flows/editor/validate`, definition);
|
|
415
421
|
}
|
|
@@ -421,11 +427,17 @@ class HttpFlowBuilderApi extends FlowBuilderApi {
|
|
|
421
427
|
// `processType` filtra le globali: `$Record` non esiste in uno screen flow (§4.1).
|
|
422
428
|
return this.get('/flows/editor/dictionaries', HttpFlowBuilderApi.params({ processType }));
|
|
423
429
|
}
|
|
424
|
-
|
|
425
|
-
|
|
430
|
+
/**
|
|
431
|
+
* Il body e' il documento **nudo**, come per validate/parse/outline/connector-targets (§6.4,
|
|
432
|
+
* §13.17): avvolgerlo (`{definition: …}`) o aggiungergli campi di filtro non da' nessun errore
|
|
433
|
+
* — il backend deserializza un `Flow` in cui non riconosce nessuna proprieta', risponde `200` e
|
|
434
|
+
* l'elenco contiene le sole globali. Se le tendine sembrano vuote, si guarda qui prima di tutto.
|
|
435
|
+
*/
|
|
436
|
+
getReferences(definition) {
|
|
437
|
+
return this.post('/flows/editor/references', definition);
|
|
426
438
|
}
|
|
427
|
-
getWritableReferences(
|
|
428
|
-
return this.post('/flows/editor/writable-references',
|
|
439
|
+
getWritableReferences(definition) {
|
|
440
|
+
return this.post('/flows/editor/writable-references', definition);
|
|
429
441
|
}
|
|
430
442
|
getConnectorTargets(definition, excluding) {
|
|
431
443
|
return this.post('/flows/editor/connector-targets', definition, HttpFlowBuilderApi.params({ excluding }));
|
|
@@ -1601,6 +1613,45 @@ function navigatePath(catalog, request) {
|
|
|
1601
1613
|
return { resolution: resolution.asReadonly(), isPending: isPending.asReadonly() };
|
|
1602
1614
|
}
|
|
1603
1615
|
|
|
1616
|
+
/**
|
|
1617
|
+
* Filtro di compatibilita' dei riferimenti — FRONTEND.md §6.4.
|
|
1618
|
+
*
|
|
1619
|
+
* `POST /flows/references` e `POST /flows/references/writable` prendono il **documento nudo** e
|
|
1620
|
+
* restituiscono **tutti** i riferimenti, ognuno col proprio `dataType`, `isCollection` e
|
|
1621
|
+
* `isWritable`: nel body non c'e' nessun campo di filtro. Chi sceglie cosa e' compatibile col
|
|
1622
|
+
* campo che l'utente sta compilando e' quindi l'editor, ed e' deliberato — la stessa risposta
|
|
1623
|
+
* serve tutte le tendine di una schermata, quindi si chiede una volta e si filtra n volte.
|
|
1624
|
+
*
|
|
1625
|
+
* Il filtro guarda **la radice**, non il percorso: una radice scartata si porta via anche cio'
|
|
1626
|
+
* che sta sotto, e chi propone i segmenti navigati applica la stessa regola separatamente
|
|
1627
|
+
* (`reference-picker`).
|
|
1628
|
+
*/
|
|
1629
|
+
/** `true` se il campo non pone nessun vincolo: lì filtrare e' inutile. */
|
|
1630
|
+
function isEmptyReferenceFilter(filter) {
|
|
1631
|
+
return !filter || (!filter.dataType && filter.isCollection == null && !filter.objectType);
|
|
1632
|
+
}
|
|
1633
|
+
function matchesReferenceFilter(entry, filter) {
|
|
1634
|
+
// Un riferimento di tipo ignoto non si scarta: sarebbe peggio nasconderlo.
|
|
1635
|
+
if (filter.dataType && entry.dataType && entry.dataType !== filter.dataType) {
|
|
1636
|
+
return false;
|
|
1637
|
+
}
|
|
1638
|
+
// `!= null`, non `!== undefined`: nei template il safe navigation di Angular produce **null**,
|
|
1639
|
+
// e trattarlo come "voglio i valori singoli" svuoterebbe l'elenco.
|
|
1640
|
+
if (filter.isCollection != null && entry.isCollection != null && !!entry.isCollection !== filter.isCollection) {
|
|
1641
|
+
return false;
|
|
1642
|
+
}
|
|
1643
|
+
if (filter.objectType && entry.objectType && entry.objectType !== filter.objectType) {
|
|
1644
|
+
return false;
|
|
1645
|
+
}
|
|
1646
|
+
return true;
|
|
1647
|
+
}
|
|
1648
|
+
function filterReferences(references, filter) {
|
|
1649
|
+
if (isEmptyReferenceFilter(filter)) {
|
|
1650
|
+
return [...references];
|
|
1651
|
+
}
|
|
1652
|
+
return references.filter((entry) => matchesReferenceFilter(entry, filter));
|
|
1653
|
+
}
|
|
1654
|
+
|
|
1604
1655
|
/**
|
|
1605
1656
|
* Lo store del documento in lavorazione.
|
|
1606
1657
|
*
|
|
@@ -3702,6 +3753,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.27", ngImpo
|
|
|
3702
3753
|
* pur non essendo dichiarati in nessuna collection di risorse: la primitiva li restituisce
|
|
3703
3754
|
* già, ed e' il motivo per cui non si ricostruisce l'elenco lato client.
|
|
3704
3755
|
*
|
|
3756
|
+
* La primitiva prende il **documento nudo** e restituisce **tutti** i riferimenti: il filtro di
|
|
3757
|
+
* tipo del campo lo applica l'editor, con `core/reference-filter.util` (§6.4, §13.17). L'elenco
|
|
3758
|
+
* completo resta comunque a portata di mano, e serve — il filtro guarda la **radice**, e una radice
|
|
3759
|
+
* scartata si porta via cio' che sta sotto: in un parametro `String` una variabile `Structure` non
|
|
3760
|
+
* e' compatibile, ma `Richiesta.Ragione` sì.
|
|
3761
|
+
*
|
|
3705
3762
|
* I **percorsi navigati** non sono piu' tutti uguali. Quando la radice e' una risorsa dichiarata
|
|
3706
3763
|
* di cui si conosce la forma — una `Structure` con la sua classe, un record con la sua entita' — il
|
|
3707
3764
|
* percorso si naviga **fino in fondo** (§4.4, §4.7.1): i segmenti si propongono un livello alla
|
|
@@ -3738,21 +3795,41 @@ class ReferencePickerComponent {
|
|
|
3738
3795
|
*/
|
|
3739
3796
|
elementsOnly = input(false, ...(ngDevMode ? [{ debugName: "elementsOnly" }] : []));
|
|
3740
3797
|
valueChange = output();
|
|
3741
|
-
references = signal([], ...(ngDevMode ? [{ debugName: "references" }] : []));
|
|
3742
3798
|
/**
|
|
3743
|
-
* L'elenco **senza** il filtro di tipo
|
|
3799
|
+
* L'elenco come arriva dalla primitiva, **senza** il filtro di tipo.
|
|
3744
3800
|
*
|
|
3745
|
-
*
|
|
3746
|
-
*
|
|
3747
|
-
*
|
|
3748
|
-
*
|
|
3749
|
-
*
|
|
3750
|
-
*
|
|
3751
|
-
*
|
|
3801
|
+
* Serve a due cose oltre che a produrre le proposte: riconoscere le radici dei percorsi e
|
|
3802
|
+
* mostrare i contenitori come righe in cui si entra. Il filtro (§6.4) guarda il tipo della
|
|
3803
|
+
* **radice**, e una radice scartata si porta via anche cio' che sta sotto: in un parametro
|
|
3804
|
+
* `String` una variabile `Structure` non e' compatibile, ma `Richiesta.Ragione` lo e', e
|
|
3805
|
+
* `Leggi_Ordine` non e' un `String` mentre `Leggi_Ordine.Numero` lo e'. Senza questo elenco il
|
|
3806
|
+
* primo membro non si puo' proporre e il secondo viene accusato di non esistere pur essendo un
|
|
3807
|
+
* riferimento valido (§4.5).
|
|
3752
3808
|
*/
|
|
3753
3809
|
unfiltered = signal([], ...(ngDevMode ? [{ debugName: "unfiltered" }] : []));
|
|
3810
|
+
/**
|
|
3811
|
+
* L'insieme da cui si pesca prima del filtro di tipo: in un campo di destinazione e' la
|
|
3812
|
+
* risposta di `getWritableReferences`, altrove {@link unfiltered} stesso.
|
|
3813
|
+
*/
|
|
3814
|
+
available = signal([], ...(ngDevMode ? [{ debugName: "available" }] : []));
|
|
3815
|
+
/**
|
|
3816
|
+
* Le proposte compatibili col campo. Il filtro e' **locale**: la primitiva prende il documento
|
|
3817
|
+
* nudo e restituisce tutto (§6.4, §13.17), cosi' la stessa risposta serve tutte le tendine di
|
|
3818
|
+
* una schermata.
|
|
3819
|
+
*/
|
|
3820
|
+
references = computed(() => filterReferences(this.available(), {
|
|
3821
|
+
/**
|
|
3822
|
+
* `?? undefined` non e' cosmetico: nei template il safe navigation di Angular
|
|
3823
|
+
* (`describe(x)?.isCollection`) produce **null**, non `undefined`. Un `isCollection: null`
|
|
3824
|
+
* letto come "filtra per valore singolo" svuoterebbe l'elenco: un campo senza filtro non
|
|
3825
|
+
* deve porre nessun vincolo.
|
|
3826
|
+
*/
|
|
3827
|
+
dataType: this.dataType() ?? undefined,
|
|
3828
|
+
isCollection: this.isCollection() ?? undefined,
|
|
3829
|
+
objectType: this.objectType() ?? undefined,
|
|
3830
|
+
}), ...(ngDevMode ? [{ debugName: "references" }] : []));
|
|
3754
3831
|
/** Tutto cio' che puo' essere la radice di un percorso, filtrato o no. */
|
|
3755
|
-
roots = computed(() =>
|
|
3832
|
+
roots = computed(() => this.unfiltered(), ...(ngDevMode ? [{ debugName: "roots" }] : []));
|
|
3756
3833
|
isLoading = signal(false, ...(ngDevMode ? [{ debugName: "isLoading" }] : []));
|
|
3757
3834
|
loadError = signal(null, ...(ngDevMode ? [{ debugName: "loadError" }] : []));
|
|
3758
3835
|
isOpen = signal(false, ...(ngDevMode ? [{ debugName: "isOpen" }] : []));
|
|
@@ -3763,65 +3840,64 @@ class ReferencePickerComponent {
|
|
|
3763
3840
|
effect(() => {
|
|
3764
3841
|
const definition = this.store.document();
|
|
3765
3842
|
const writable = this.writableOnly();
|
|
3766
|
-
const dataType = this.dataType();
|
|
3767
|
-
const isCollection = this.isCollection();
|
|
3768
|
-
const objectType = this.objectType();
|
|
3769
3843
|
if (this.elementsOnly()) {
|
|
3770
3844
|
// I node li conosce già il documento: nessuna richiesta necessaria.
|
|
3771
|
-
this.
|
|
3772
|
-
this.references.set(this.store.nodes().map((reference) => ({
|
|
3845
|
+
const nodes = this.store.nodes().map((reference) => ({
|
|
3773
3846
|
name: reference.name,
|
|
3774
3847
|
label: reference.node.label ?? null,
|
|
3775
3848
|
kind: 'ElementOutput',
|
|
3776
3849
|
description: this.dictionaries.labelOf(reference.type),
|
|
3777
3850
|
isWritable: false,
|
|
3778
|
-
}))
|
|
3851
|
+
}));
|
|
3852
|
+
this.unfiltered.set(nodes);
|
|
3853
|
+
this.available.set(nodes);
|
|
3779
3854
|
return;
|
|
3780
3855
|
}
|
|
3781
|
-
/**
|
|
3782
|
-
* `?? undefined` non e' cosmetico: nei template il safe navigation di Angular
|
|
3783
|
-
* (`describe(x)?.isCollection`) produce **null**, non `undefined`. Un `isCollection: null`
|
|
3784
|
-
* che arriva alla primitiva viene letto come "filtra per valore singolo" e svuota
|
|
3785
|
-
* l'elenco: un campo senza filtro deve mandare il campo **assente**.
|
|
3786
|
-
*/
|
|
3787
|
-
const query = {
|
|
3788
|
-
definition,
|
|
3789
|
-
dataType: dataType ?? undefined,
|
|
3790
|
-
isCollection: isCollection ?? undefined,
|
|
3791
|
-
objectType: objectType ?? undefined,
|
|
3792
|
-
};
|
|
3793
3856
|
this.isLoading.set(true);
|
|
3794
3857
|
this.loadError.set(null);
|
|
3795
|
-
|
|
3796
|
-
|
|
3797
|
-
|
|
3858
|
+
/**
|
|
3859
|
+
* Una sola richiesta dove non c'e' vincolo di scrittura: il body e' il documento nudo e la
|
|
3860
|
+
* risposta e' completa, quindi l'elenco delle radici e quello da cui si pesca sono lo stesso
|
|
3861
|
+
* (§6.4, §13.17). Il filtro di tipo lo applica {@link references}.
|
|
3862
|
+
*/
|
|
3863
|
+
void this.api
|
|
3864
|
+
.getReferences(definition)
|
|
3865
|
+
.then((list) => {
|
|
3866
|
+
this.unfiltered.set(list ?? []);
|
|
3867
|
+
if (!writable) {
|
|
3868
|
+
this.available.set(list ?? []);
|
|
3869
|
+
}
|
|
3870
|
+
})
|
|
3798
3871
|
.catch((error) => {
|
|
3799
3872
|
// Senza l'elenco il campo resta scrivibile a mano: e' meglio di un campo bloccato.
|
|
3800
3873
|
this.loadError.set(error instanceof Error ? error.message : String(error));
|
|
3801
|
-
this.references.set([]);
|
|
3802
|
-
})
|
|
3803
|
-
.finally(() => this.isLoading.set(false));
|
|
3804
|
-
/**
|
|
3805
|
-
* Seconda richiesta **senza filtri**, per le sole radici: chi filtra le proposte resta il
|
|
3806
|
-
* backend — da qui non entra nessun valore del tipo sbagliato, entrano i contenitori in cui
|
|
3807
|
-
* scendere e i nomi da non accusare.
|
|
3808
|
-
*
|
|
3809
|
-
* Non filtrata vuol dire anche `getReferences` e non `getWritableReferences`, pure in un campo
|
|
3810
|
-
* di destinazione: la scrivibilita' e' del **percorso**, non della radice, e le radici scartate
|
|
3811
|
-
* sono quelle che servono per dire la cosa giusta — un `$User.Anagrafica.Citta` scritto a mano
|
|
3812
|
-
* e' `TARGET_NOT_WRITABLE`, non un nome che non esiste. Dove non c'e' filtro **ne'** vincolo di
|
|
3813
|
-
* scrittura la prima richiesta le contiene già, e la seconda non si fa.
|
|
3814
|
-
*/
|
|
3815
|
-
const hasTypeFilter = !!query.dataType || query.isCollection != null || !!query.objectType;
|
|
3816
|
-
if (!hasTypeFilter && !writable) {
|
|
3817
3874
|
this.unfiltered.set([]);
|
|
3875
|
+
if (!writable) {
|
|
3876
|
+
this.available.set([]);
|
|
3877
|
+
}
|
|
3878
|
+
})
|
|
3879
|
+
.finally(() => {
|
|
3880
|
+
if (!writable) {
|
|
3881
|
+
this.isLoading.set(false);
|
|
3882
|
+
}
|
|
3883
|
+
});
|
|
3884
|
+
if (!writable) {
|
|
3818
3885
|
return;
|
|
3819
3886
|
}
|
|
3887
|
+
/**
|
|
3888
|
+
* In un campo di destinazione le proposte sono un elenco a parte, ma le **radici** restano
|
|
3889
|
+
* quelle di `getReferences`: la scrivibilita' e' del **percorso**, non della radice, e le
|
|
3890
|
+
* radici escluse sono quelle che servono per dire la cosa giusta — un `$User.Anagrafica.Citta`
|
|
3891
|
+
* scritto a mano e' `TARGET_NOT_WRITABLE`, non un nome che non esiste.
|
|
3892
|
+
*/
|
|
3820
3893
|
void this.api
|
|
3821
|
-
.
|
|
3822
|
-
.then((list) => this.
|
|
3823
|
-
|
|
3824
|
-
.
|
|
3894
|
+
.getWritableReferences(definition)
|
|
3895
|
+
.then((list) => this.available.set(list ?? []))
|
|
3896
|
+
.catch((error) => {
|
|
3897
|
+
this.loadError.set(error instanceof Error ? error.message : String(error));
|
|
3898
|
+
this.available.set([]);
|
|
3899
|
+
})
|
|
3900
|
+
.finally(() => this.isLoading.set(false));
|
|
3825
3901
|
});
|
|
3826
3902
|
}
|
|
3827
3903
|
/**
|
|
@@ -3922,25 +3998,19 @@ class ReferencePickerComponent {
|
|
|
3922
3998
|
}));
|
|
3923
3999
|
}, ...(ngDevMode ? [{ debugName: "pathReferences" }] : []));
|
|
3924
4000
|
/**
|
|
3925
|
-
* Lo stesso filtro
|
|
3926
|
-
*
|
|
3927
|
-
*
|
|
3928
|
-
* al membro che combacia.
|
|
4001
|
+
* Lo stesso filtro delle radici (§6.4), applicato ai segmenti di un percorso: in un parametro
|
|
4002
|
+
* `String` non si propone un membro `Date`. Un segmento da cui si scende resta comunque proposto
|
|
4003
|
+
* anche se il suo tipo non combacia — e' la strada per arrivare al membro che combacia.
|
|
3929
4004
|
*/
|
|
3930
4005
|
matchesTarget(entry) {
|
|
3931
4006
|
if (entry.next) {
|
|
3932
4007
|
return true;
|
|
3933
4008
|
}
|
|
3934
|
-
|
|
3935
|
-
|
|
3936
|
-
|
|
3937
|
-
|
|
3938
|
-
|
|
3939
|
-
if (isCollection != null && entry.isCollection != null && !!entry.isCollection !== isCollection) {
|
|
3940
|
-
return false;
|
|
3941
|
-
}
|
|
3942
|
-
const objectType = this.objectType();
|
|
3943
|
-
return !(objectType && entry.objectType && entry.objectType !== objectType);
|
|
4009
|
+
return matchesReferenceFilter(entry, {
|
|
4010
|
+
dataType: this.dataType() ?? undefined,
|
|
4011
|
+
isCollection: this.isCollection() ?? undefined,
|
|
4012
|
+
objectType: this.objectType() ?? undefined,
|
|
4013
|
+
});
|
|
3944
4014
|
}
|
|
3945
4015
|
/**
|
|
3946
4016
|
* I contenitori che il filtro di tipo ha scartato: si mostrano per **entrarci**, non per
|
|
@@ -5301,7 +5371,7 @@ class ConditionEditorComponent {
|
|
|
5301
5371
|
return;
|
|
5302
5372
|
}
|
|
5303
5373
|
void this.api
|
|
5304
|
-
.getReferences(
|
|
5374
|
+
.getReferences(definition)
|
|
5305
5375
|
.then((list) => this.references.set(list ?? []))
|
|
5306
5376
|
// Senza l'elenco non si segnala nulla: non sapere non e' sapere che e' sbagliato.
|
|
5307
5377
|
.catch(() => this.references.set([]));
|
|
@@ -9997,5 +10067,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.27", ngImpo
|
|
|
9997
10067
|
* Generated bundle index. Do not edit.
|
|
9998
10068
|
*/
|
|
9999
10069
|
|
|
10000
|
-
export { ConditionEditorComponent, ConnectorEditorComponent, DebugPanelComponent, ElementDialogComponent, ElementInspectorComponent, ElementPaletteComponent, FALLBACK_COLLECTION_BY_TYPE, FALLBACK_TYPE_LABEL, FLOW_BUILDER_HTTP_CONFIG, FLOW_ELEMENT_ICONS, FLOW_ELEMENT_VARIANT_FIELDS, FLOW_ELEMENT_VARIANT_ICONS, FLOW_ERROR_FALLBACK_MESSAGE, FLOW_ERROR_HTTP_STATUS, FLOW_NAME_PATTERN, FLOW_NODE_COLLECTIONS, FLOW_NODE_HEIGHT, FLOW_NODE_WIDTH, FLOW_RESOURCE_COLLECTIONS, FieldAssignmentEditorComponent, FieldPickerComponent, FlowApiError, FlowBuilderApi, FlowBuilderComponent, FlowCanvasComponent, FlowCatalogStore, FlowDictionaryStore, FlowDocumentStore, FlowEditorSession, FlowLayoutService, FlowValidationStore, HttpFlowBuilderApi, NamePickerComponent, NodeInspectorBase, ORCHESTRATION_CONDITION_OUTPUT, ObjectPickerComponent, OrchestratedStageInspectorComponent, ParameterEditorComponent, ProblemsPanelComponent, RecordFilterEditorComponent, ReferencePickerComponent, ResourcePanelComponent, SEVERITY_BUCKETS, SEVERITY_ICON, SEVERITY_LABEL, START_NODE_NAME, SelectValueDirective, StartInspectorComponent, StructureMemberPickerComponent, StructurePickerComponent, TYPES_WITH_AUTOMATIC_OUTPUT, TYPE_BY_COLLECTION, UNSUPPORTED_TYPES, ValueEditorComponent, VersionPanelComponent, areTypesComparable, canvasNodeId, checkConditionLogic, checkFlowName, describePathEntry, elementIcon, emptyFlowDefinition, flowNodeWidth, flowNodeWidthClass, isCustomConditionLogic, isGlobalReference, isNumericType, isTypeCheckedOperator, isValidFlowName, loadPathLevel, moveCondition, navigatePath, outletByKey, outletsOf, parseCanvasNodeId, parseInvariantNumber, parseSourceConnectorId, parseTargetConnectorId, pathAvailableNames, pathContainerLabel, pathNotVerifiableMessage, referenceRoot, remapConditionLogic, removeCondition, resolvePath, severityBucket, slugifyFlowName, sourceConnectorId, stageStepNames, stageStepOutputReferenced, stepsOf, targetConnectorId, uniqueFlowName, variantFieldOf, variantOf, variantPresetOf };
|
|
10070
|
+
export { ConditionEditorComponent, ConnectorEditorComponent, DebugPanelComponent, ElementDialogComponent, ElementInspectorComponent, ElementPaletteComponent, FALLBACK_COLLECTION_BY_TYPE, FALLBACK_TYPE_LABEL, FLOW_BUILDER_HTTP_CONFIG, FLOW_ELEMENT_ICONS, FLOW_ELEMENT_VARIANT_FIELDS, FLOW_ELEMENT_VARIANT_ICONS, FLOW_ERROR_FALLBACK_MESSAGE, FLOW_ERROR_HTTP_STATUS, FLOW_NAME_PATTERN, FLOW_NODE_COLLECTIONS, FLOW_NODE_HEIGHT, FLOW_NODE_WIDTH, FLOW_RESOURCE_COLLECTIONS, FieldAssignmentEditorComponent, FieldPickerComponent, FlowApiError, FlowBuilderApi, FlowBuilderComponent, FlowCanvasComponent, FlowCatalogStore, FlowDictionaryStore, FlowDocumentStore, FlowEditorSession, FlowLayoutService, FlowValidationStore, HttpFlowBuilderApi, NamePickerComponent, NodeInspectorBase, ORCHESTRATION_CONDITION_OUTPUT, ObjectPickerComponent, OrchestratedStageInspectorComponent, ParameterEditorComponent, ProblemsPanelComponent, RecordFilterEditorComponent, ReferencePickerComponent, ResourcePanelComponent, SEVERITY_BUCKETS, SEVERITY_ICON, SEVERITY_LABEL, START_NODE_NAME, SelectValueDirective, StartInspectorComponent, StructureMemberPickerComponent, StructurePickerComponent, TYPES_WITH_AUTOMATIC_OUTPUT, TYPE_BY_COLLECTION, UNSUPPORTED_TYPES, ValueEditorComponent, VersionPanelComponent, areTypesComparable, canvasNodeId, checkConditionLogic, checkFlowName, describePathEntry, elementIcon, emptyFlowDefinition, filterReferences, flowNodeWidth, flowNodeWidthClass, isCustomConditionLogic, isEmptyReferenceFilter, isGlobalReference, isNumericType, isTypeCheckedOperator, isValidFlowName, loadPathLevel, matchesReferenceFilter, moveCondition, navigatePath, outletByKey, outletsOf, parseCanvasNodeId, parseInvariantNumber, parseSourceConnectorId, parseTargetConnectorId, pathAvailableNames, pathContainerLabel, pathNotVerifiableMessage, referenceRoot, remapConditionLogic, removeCondition, resolvePath, severityBucket, slugifyFlowName, sourceConnectorId, stageStepNames, stageStepOutputReferenced, stepsOf, targetConnectorId, uniqueFlowName, variantFieldOf, variantOf, variantPresetOf };
|
|
10001
10071
|
//# sourceMappingURL=esfaenza-flow-builder.mjs.map
|