@esfaenza/flow-builder 20.3.1 → 20.3.3

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/index.d.ts CHANGED
@@ -1294,10 +1294,45 @@ declare const TYPES_WITH_AUTOMATIC_OUTPUT: ReadonlySet<string>;
1294
1294
  */
1295
1295
  declare const FLOW_ELEMENT_ICONS: Record<string, string>;
1296
1296
  /**
1297
- * Il glifo del tipo. Per un tipo che il dizionario del backend aggiunge e questa mappa non
1298
- * conosce, l'iniziale dell'etichetta e' un segnaposto migliore di un simbolo generico.
1297
+ * Il glifo delle varianti (§5.5): due voci di palette dello stesso tipo con lo stesso simbolo
1298
+ * si distinguerebbero solo dall'etichetta, e sulla palette il simbolo e' la prima cosa che si
1299
+ * guarda. La chiave e' `tipo:variante`.
1299
1300
  */
1300
- declare function elementIcon(type: string, label?: string): string;
1301
+ declare const FLOW_ELEMENT_VARIANT_ICONS: Record<string, string>;
1302
+ /**
1303
+ * Il glifo del tipo, o della sua variante quando c'e'. Per un tipo che il dizionario del
1304
+ * backend aggiunge e questa mappa non conosce, l'iniziale dell'etichetta e' un segnaposto
1305
+ * migliore di un simbolo generico.
1306
+ */
1307
+ declare function elementIcon(type: string, label?: string, variant?: string): string;
1308
+
1309
+ /**
1310
+ * I tipi che sulla palette valgono per **piu' di una voce** — FRONTEND.md §5.5.
1311
+ *
1312
+ * Il Collection Processor e' un solo tipo di node con un discriminatore
1313
+ * (`collectionProcessorType`: `Sort` o `Filter`), e i campi rilevanti cambiano con esso: un
1314
+ * `Sort` vuole `sortOptions`, un `Filter` vuole condizioni. Sono due gesti diversi, e una
1315
+ * voce sola («ordina o filtra») costringe a scegliere dopo, dentro il form.
1316
+ *
1317
+ * Qui sta **solo** la mappa tipo → campo del discriminatore: i valori ammessi restano nel
1318
+ * dizionario del backend (`collectionProcessorTypes`), come per ogni altro enum (§6.4). Senza
1319
+ * quel dizionario il tipo torna a essere una voce sola, che e' il comportamento giusto quando
1320
+ * non si sa quali varianti esistano.
1321
+ *
1322
+ * Se un tipo nuovo arrivasse con lo stesso schema — un node con un discriminatore che ne
1323
+ * cambia i campi — si aggiunge una riga qui e la palette si divide da se'.
1324
+ */
1325
+ /** Tipo di elemento → campo del node che porta la variante. */
1326
+ declare const FLOW_ELEMENT_VARIANT_FIELDS: Record<string, string>;
1327
+ /** Il campo del discriminatore, se il tipo ne ha uno. */
1328
+ declare function variantFieldOf(type: string): string | undefined;
1329
+ /** La variante di un node già scritto, letta dal suo discriminatore. */
1330
+ declare function variantOf(type: string, node: Record<string, unknown>): string | undefined;
1331
+ /**
1332
+ * I campi da scrivere su un node appena creato dalla variante scelta. Vuoto per i tipi senza
1333
+ * varianti: chi crea l'elemento non deve sapere quali sono.
1334
+ */
1335
+ declare function variantPresetOf(type: string, variant: string | undefined): Record<string, unknown>;
1301
1336
 
1302
1337
  /**
1303
1338
  * Nomi — FRONTEND.md §3.3, §13.5.
@@ -1634,6 +1669,15 @@ declare class FlowDictionaryStore {
1634
1669
  /** Le categorie della palette, nell'ordine di prima apparizione nel dizionario. */
1635
1670
  readonly paletteCategories: _angular_core.Signal<string[]>;
1636
1671
  elementType(value: string): FlowElementTypeEntry | undefined;
1672
+ /**
1673
+ * Le varianti di un tipo, cioe' i valori del suo discriminatore (§5.5). L'unico oggi e' il
1674
+ * Collection Processor. Elenco vuoto = tipo senza varianti, **oppure** dizionario non
1675
+ * disponibile: in entrambi i casi la palette mostra una voce sola, che e' l'unica cosa
1676
+ * onesta da fare quando non si sa quali varianti esistano.
1677
+ */
1678
+ variantsOf(type: string): FlowDictionaryEntry[];
1679
+ /** L'etichetta di una variante, con fallback sul valore grezzo. */
1680
+ variantLabelOf(type: string, variant: string | undefined): string;
1637
1681
  /** La collection in cui scrivere un node: `metadataProperty`, con fallback locale (§3.2). */
1638
1682
  collectionOf(type: string): FlowNodeCollection | undefined;
1639
1683
  /** Etichetta di un tipo, con fallback: un tipo sconosciuto mostra il proprio `value`. */
@@ -2018,6 +2062,8 @@ declare class FlowCanvasComponent {
2018
2062
  /** Rilascio di un elemento dalla palette: tipo + punto nel sistema del canvas. */
2019
2063
  readonly elementDropped: _angular_core.OutputEmitterRef<{
2020
2064
  type: FlowElementType;
2065
+ /** La variante scelta sulla palette, dove il tipo ne ha (§5.5). */
2066
+ variant?: string;
2021
2067
  x: number;
2022
2068
  y: number;
2023
2069
  }>;
@@ -2068,7 +2114,11 @@ declare class FlowCanvasComponent {
2068
2114
  onDeleteSelected(event: {
2069
2115
  nodeIds: string[];
2070
2116
  }): void;
2071
- /** Rilascio di un elemento trascinato dalla palette. */
2117
+ /**
2118
+ * Rilascio di un elemento trascinato dalla palette. Il dato e' `{type, variant}`, ma si
2119
+ * accetta ancora la stringa nuda: un ospite che monta il canvas con una palette propria
2120
+ * potrebbe passare il solo tipo.
2121
+ */
2072
2122
  onCreateNode(event: {
2073
2123
  data: unknown;
2074
2124
  externalItemRect: {
@@ -2094,9 +2144,27 @@ declare class FlowCanvasComponent {
2094
2144
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<FlowCanvasComponent, "fb-flow-canvas", never, { "selectedName": { "alias": "selectedName"; "required": false; "isSignal": true; }; "outline": { "alias": "outline"; "required": false; "isSignal": true; }; }, { "selectionChange": "selectionChange"; "nodeOpened": "nodeOpened"; "nodeRemoveRequested": "nodeRemoveRequested"; "nodeDuplicateRequested": "nodeDuplicateRequested"; "elementDropped": "elementDropped"; }, never, never, true, never>;
2095
2145
  }
2096
2146
 
2147
+ /** Il gesto scelto sulla palette: un tipo e, dove esiste, la sua variante (§5.5). */
2148
+ interface FlowPalettePick {
2149
+ type: FlowElementType;
2150
+ variant?: string;
2151
+ }
2152
+ /**
2153
+ * Una voce della palette. Non coincide con una voce del dizionario: un tipo con varianti ne
2154
+ * produce una per variante, perche' «ordina» e «filtra» sono due gesti diversi anche se il
2155
+ * modello li scrive nello stesso node.
2156
+ */
2157
+ interface PaletteItem {
2158
+ /** Chiave stabile della voce: serve al `track` e all'id del trascinamento. */
2159
+ key: string;
2160
+ entry: FlowElementTypeEntry;
2161
+ variant?: string;
2162
+ label: string;
2163
+ data: FlowPalettePick;
2164
+ }
2097
2165
  interface PaletteGroup {
2098
2166
  category: string;
2099
- entries: FlowElementTypeEntry[];
2167
+ items: PaletteItem[];
2100
2168
  }
2101
2169
  declare class ElementPaletteComponent {
2102
2170
  private readonly dictionaries;
@@ -2106,23 +2174,29 @@ declare class ElementPaletteComponent {
2106
2174
  * prima che l'utente lo scopra dal pannello dei problemi.
2107
2175
  */
2108
2176
  readonly processType: _angular_core.InputSignal<string | undefined>;
2109
- readonly elementPicked: _angular_core.OutputEmitterRef<string>;
2177
+ readonly elementPicked: _angular_core.OutputEmitterRef<FlowPalettePick>;
2110
2178
  private readonly filter;
2179
+ /** Le voci, con i tipi a varianti già divisi: e' l'elenco che l'utente vede. */
2180
+ private readonly items;
2111
2181
  readonly groups: _angular_core.Signal<PaletteGroup[]>;
2112
2182
  readonly isEmpty: _angular_core.Signal<boolean>;
2113
2183
  onFilter(value: string): void;
2114
- pick(entry: FlowElementTypeEntry): void;
2184
+ pick(item: PaletteItem): void;
2115
2185
  /** Uno screen in un flow che non mostra nulla: si segnala, non si nasconde (§3.1). */
2116
- isIncompatible(entry: FlowElementTypeEntry): boolean;
2117
- incompatibleHint(entry: FlowElementTypeEntry): string | null;
2186
+ isIncompatible(item: PaletteItem): boolean;
2187
+ /**
2188
+ * Il testo del tooltip. Su una voce che nasce da una variante ci va anche il nome del tipo:
2189
+ * e' l'unico posto in cui si vede che «ordina» e «filtra» sono lo stesso elemento.
2190
+ */
2191
+ hintOf(item: PaletteItem): string;
2118
2192
  /** Lo stesso glifo che l'elemento avra' sul canvas, così il trascinamento e' prevedibile. */
2119
- iconOf(entry: FlowElementTypeEntry): string;
2193
+ iconOf(item: PaletteItem): string;
2120
2194
  /**
2121
2195
  * L'etichetta del ramo di fault, presa dalla mappa delle uscite invece di scrivere «ramo di
2122
2196
  * errore» per tutti: su uno stage di orchestrazione quel ramo **non** e' un guasto, e' lo step
2123
2197
  * rifiutato (§5.13). Un tipo nuovo eredita l'etichetta giusta senza toccare la palette.
2124
2198
  */
2125
- faultLabel(entry: FlowElementTypeEntry): string | null;
2199
+ faultLabel(item: PaletteItem): string | null;
2126
2200
  categoryClass(category: string): string;
2127
2201
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ElementPaletteComponent, never>;
2128
2202
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<ElementPaletteComponent, "fb-element-palette", never, { "processType": { "alias": "processType"; "required": false; "isSignal": true; }; }, { "elementPicked": "elementPicked"; }, never, never, true, never>;
@@ -2192,6 +2266,126 @@ declare class ReferencePickerComponent {
2192
2266
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<ReferencePickerComponent, "fb-reference-picker", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "dataType": { "alias": "dataType"; "required": false; "isSignal": true; }; "isCollection": { "alias": "isCollection"; "required": false; "isSignal": true; }; "objectType": { "alias": "objectType"; "required": false; "isSignal": true; }; "writableOnly": { "alias": "writableOnly"; "required": false; "isSignal": true; }; "elementsOnly": { "alias": "elementsOnly"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
2193
2267
  }
2194
2268
 
2269
+ declare class ObjectPickerComponent {
2270
+ private readonly catalog;
2271
+ readonly value: _angular_core.InputSignal<string | undefined>;
2272
+ readonly label: _angular_core.InputSignal<string>;
2273
+ readonly placeholder: _angular_core.InputSignal<string>;
2274
+ readonly disabled: _angular_core.InputSignal<boolean>;
2275
+ readonly valueChange: _angular_core.OutputEmitterRef<string | undefined>;
2276
+ private readonly objects;
2277
+ private readonly loadFailed;
2278
+ readonly isOpen: _angular_core.WritableSignal<boolean>;
2279
+ /**
2280
+ * Il testo digitato **mentre** il pannello e' aperto: filtra l'elenco. Chiuso il pannello
2281
+ * torna a null e la casella mostra di nuovo il valore del documento, che e' l'unica
2282
+ * fonte di verita'.
2283
+ */
2284
+ private readonly query;
2285
+ constructor();
2286
+ /** Quel che si vede nella casella: il filtro se si sta digitando, il valore altrimenti. */
2287
+ readonly text: _angular_core.Signal<string>;
2288
+ readonly options: _angular_core.Signal<FlowObjectSummary[]>;
2289
+ readonly hasCatalog: _angular_core.Signal<boolean>;
2290
+ /**
2291
+ * Nome fuori catalogo: si avvisa e non si blocca. Senza catalogo non si accusa nessuno —
2292
+ * "non lo so" non e' "non esiste".
2293
+ */
2294
+ readonly isUnknown: _angular_core.Signal<boolean>;
2295
+ readonly labelOfValue: _angular_core.Signal<string | null>;
2296
+ readonly loadErrored: _angular_core.Signal<boolean>;
2297
+ open(): void;
2298
+ close(): void;
2299
+ toggle(): void;
2300
+ /** Digitare filtra **e** scrive: il nome puo' non essere in catalogo. */
2301
+ onInput(text: string): void;
2302
+ choose(object: FlowObjectSummary): void;
2303
+ clear(): void;
2304
+ describe(object: FlowObjectSummary): string;
2305
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ObjectPickerComponent, never>;
2306
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ObjectPickerComponent, "fb-object-picker", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
2307
+ }
2308
+
2309
+ declare class FieldPickerComponent {
2310
+ private readonly catalog;
2311
+ readonly value: _angular_core.InputSignal<string | undefined>;
2312
+ /** L'entita' di cui elencare i campi: senza oggetto non c'e' catalogo. */
2313
+ readonly object: _angular_core.InputSignal<string | undefined>;
2314
+ readonly usage: _angular_core.InputSignal<FlowFieldUsage>;
2315
+ readonly label: _angular_core.InputSignal<string>;
2316
+ readonly placeholder: _angular_core.InputSignal<string>;
2317
+ readonly disabled: _angular_core.InputSignal<boolean>;
2318
+ readonly valueChange: _angular_core.OutputEmitterRef<string | undefined>;
2319
+ private readonly fields;
2320
+ private readonly loadFailed;
2321
+ readonly isOpen: _angular_core.WritableSignal<boolean>;
2322
+ /** Il testo digitato mentre il pannello e' aperto: filtra l'elenco. */
2323
+ private readonly query;
2324
+ constructor();
2325
+ readonly text: _angular_core.Signal<string>;
2326
+ readonly options: _angular_core.Signal<FlowFieldDescription[]>;
2327
+ readonly hasCatalog: _angular_core.Signal<boolean>;
2328
+ /** `true` se il valore e' un percorso di relazione: non enumerabile, non verificato (§4.4). */
2329
+ readonly isRelationPath: _angular_core.Signal<boolean>;
2330
+ readonly isUnknown: _angular_core.Signal<boolean>;
2331
+ /** L'avviso dipende dall'uso: un campo puo' esistere e non essere filtrabile. */
2332
+ readonly unknownMessage: _angular_core.Signal<"Questo campo non e’ fra quelli filtrabili dell’oggetto." | "Questo campo non e’ fra quelli su cui si puo’ ordinare." | "Questo campo non e’ fra quelli aggiornabili dell’oggetto." | "Questo campo non e’ fra quelli dell’oggetto.">;
2333
+ readonly describeValue: _angular_core.Signal<string | null>;
2334
+ readonly loadErrored: _angular_core.Signal<boolean>;
2335
+ open(): void;
2336
+ close(): void;
2337
+ toggle(): void;
2338
+ onInput(text: string): void;
2339
+ choose(field: FlowFieldDescription): void;
2340
+ clear(): void;
2341
+ describe(field: FlowFieldDescription): string;
2342
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FieldPickerComponent, never>;
2343
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FieldPickerComponent, "fb-field-picker", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "object": { "alias": "object"; "required": false; "isSignal": true; }; "usage": { "alias": "usage"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
2344
+ }
2345
+
2346
+ interface NamePickerOption {
2347
+ name: string;
2348
+ label?: string | null;
2349
+ description?: string | null;
2350
+ }
2351
+ declare class NamePickerComponent {
2352
+ readonly value: _angular_core.InputSignal<string | undefined>;
2353
+ readonly options: _angular_core.InputSignal<NamePickerOption[]>;
2354
+ readonly label: _angular_core.InputSignal<string>;
2355
+ readonly placeholder: _angular_core.InputSignal<string>;
2356
+ readonly disabled: _angular_core.InputSignal<boolean>;
2357
+ /** Il testo dell'avviso sul nome fuori elenco: dipende da cosa si sta scegliendo. */
2358
+ readonly unknownMessage: _angular_core.InputSignal<string>;
2359
+ /**
2360
+ * La gravita' dell'avviso. Non e' cosmetica: un'action o un form che non esistono sono
2361
+ * **errori** che bloccano l'attivazione (`ACTION_UNKNOWN`, `FORM_UNKNOWN`), mentre un flow
2362
+ * senza versione attiva e' un avviso. Mostrarli con lo stesso colore direbbe il falso.
2363
+ */
2364
+ readonly unknownSeverity: _angular_core.InputSignal<"error" | "warn">;
2365
+ /** Cosa dire quando l'elenco e' vuoto: e' il caso "non lo so", non un errore. */
2366
+ readonly emptyMessage: _angular_core.InputSignal<string>;
2367
+ /** Testo monospazio: i nomi tecnici si leggono meglio, ed e' come li mostra il resto del form. */
2368
+ readonly isMono: _angular_core.InputSignal<boolean>;
2369
+ readonly valueChange: _angular_core.OutputEmitterRef<string | undefined>;
2370
+ readonly isOpen: _angular_core.WritableSignal<boolean>;
2371
+ private readonly query;
2372
+ constructor();
2373
+ readonly text: _angular_core.Signal<string>;
2374
+ readonly visibleOptions: _angular_core.Signal<NamePickerOption[]>;
2375
+ readonly hasOptions: _angular_core.Signal<boolean>;
2376
+ readonly isUnknown: _angular_core.Signal<boolean>;
2377
+ readonly labelOfValue: _angular_core.Signal<string | null>;
2378
+ open(): void;
2379
+ close(): void;
2380
+ toggle(): void;
2381
+ onInput(text: string): void;
2382
+ choose(option: NamePickerOption): void;
2383
+ clear(): void;
2384
+ describe(option: NamePickerOption): string;
2385
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NamePickerComponent, never>;
2386
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NamePickerComponent, "fb-name-picker", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "unknownMessage": { "alias": "unknownMessage"; "required": false; "isSignal": true; }; "unknownSeverity": { "alias": "unknownSeverity"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "isMono": { "alias": "isMono"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
2387
+ }
2388
+
2195
2389
  /** Le modalita' offerte: una per campo del modello. */
2196
2390
  type ValueMode = 'reference' | 'literal' | 'formula' | 'globalConstant' | 'empty';
2197
2391
  declare class ValueEditorComponent {
@@ -2367,9 +2561,6 @@ declare class RecordFilterEditorComponent {
2367
2561
  readonly filters: _angular_core.Signal<FlowRecordFilter[]>;
2368
2562
  readonly operators: _angular_core.Signal<_esfaenza_flow_builder.FlowDictionaryEntry[]>;
2369
2563
  constructor();
2370
- readonly fieldOptions: _angular_core.Signal<FlowFieldDescription[]>;
2371
- /** Catalogo vuoto = "non lo so": si lascia il campo libero, non si blocca (§7). */
2372
- readonly hasFieldCatalog: _angular_core.Signal<boolean>;
2373
2564
  readonly logicMode: _angular_core.Signal<"and" | "or" | "formula" | "custom">;
2374
2565
  readonly customLogic: _angular_core.Signal<string>;
2375
2566
  readonly showEmptyWarning: _angular_core.Signal<boolean>;
@@ -2384,10 +2575,11 @@ declare class RecordFilterEditorComponent {
2384
2575
  setLogicMode(mode: 'and' | 'or' | 'custom' | 'formula'): void;
2385
2576
  setCustomLogic(logic: string): void;
2386
2577
  setFormula(formula: string): void;
2387
- /** Il tipo del campo, per proporre il controllo giusto sul valore. */
2578
+ /**
2579
+ * Il tipo del campo, per proporre il controllo giusto sul valore: e' il motivo per cui il
2580
+ * catalogo resta caricato qui, e non solo dentro il picker.
2581
+ */
2388
2582
  fieldDataType(filter: FlowRecordFilter): string | undefined;
2389
- /** `true` se il campo referenzia una relazione: la validazione non lo verifica (§4.4). */
2390
- isRelationPath(filter: FlowRecordFilter): boolean;
2391
2583
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RecordFilterEditorComponent, never>;
2392
2584
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<RecordFilterEditorComponent, "fb-record-filter-editor", never, { "holder": { "alias": "holder"; "required": true; "isSignal": true; }; "object": { "alias": "object"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "usage": { "alias": "usage"; "required": false; "isSignal": true; }; "supportsLogic": { "alias": "supportsLogic"; "required": false; "isSignal": true; }; "supportsFormula": { "alias": "supportsFormula"; "required": false; "isSignal": true; }; "emptyWarning": { "alias": "emptyWarning"; "required": false; "isSignal": true; }; "emptyWarningSeverity": { "alias": "emptyWarningSeverity"; "required": false; "isSignal": true; }; }, { "changed": "changed"; }, never, never, true, never>;
2393
2585
  }
@@ -2413,11 +2605,18 @@ declare class ParameterEditorComponent {
2413
2605
  readonly hasCatalog: _angular_core.Signal<boolean>;
2414
2606
  readonly inputCatalog: _angular_core.Signal<FlowCatalogParameter[]>;
2415
2607
  readonly outputCatalog: _angular_core.Signal<FlowCatalogParameter[]>;
2608
+ /**
2609
+ * I candidati come li vuole il picker. Il tipo e l'obbligatorieta' finiscono nella
2610
+ * descrizione: nel `<select>` erano un asterisco muto, che non diceva quale valore ci sta.
2611
+ */
2612
+ readonly inputOptions: _angular_core.Signal<NamePickerOption[]>;
2613
+ readonly outputOptions: _angular_core.Signal<NamePickerOption[]>;
2416
2614
  /** Parametri obbligatori dichiarati dal catalogo e non ancora presenti. */
2417
2615
  readonly missingRequired: _angular_core.Signal<FlowCatalogParameter[]>;
2418
- /** Parametri presenti che il catalogo non conosce: sarebbero `PARAMETER_UNKNOWN`. */
2419
- unknownInput(parameter: FlowInputParameter): boolean;
2420
- unknownOutput(parameter: FlowOutputParameter): boolean;
2616
+ /**
2617
+ * Il parametro fuori catalogo (`PARAMETER_UNKNOWN`) lo segnala il picker, che ha in mano sia
2618
+ * l'elenco sia il valore. Qui resta la descrizione, che serve all'editor di valore.
2619
+ */
2421
2620
  describe(name: string | undefined): FlowCatalogParameter | undefined;
2422
2621
  addInput(name?: string): void;
2423
2622
  addOutput(name?: string): void;
@@ -2443,7 +2642,6 @@ declare class FieldAssignmentEditorComponent {
2443
2642
  readonly changed: _angular_core.OutputEmitterRef<(holder: FieldAssignmentHolder) => void>;
2444
2643
  private readonly fields;
2445
2644
  readonly assignments: _angular_core.Signal<FlowInputFieldAssignment[]>;
2446
- readonly fieldOptions: _angular_core.Signal<FlowFieldDescription[]>;
2447
2645
  readonly hasCatalog: _angular_core.Signal<boolean>;
2448
2646
  /** Campi obbligatori dell'entita' non ancora valorizzati. */
2449
2647
  readonly missingRequired: _angular_core.Signal<FlowFieldDescription[]>;
@@ -2452,9 +2650,11 @@ declare class FieldAssignmentEditorComponent {
2452
2650
  remove(index: number): void;
2453
2651
  setField(index: number, field: string): void;
2454
2652
  setValue(index: number, value: FlowValue | undefined): void;
2653
+ /**
2654
+ * Il tipo del campo serve all'editor di valore: e' il motivo per cui il catalogo resta
2655
+ * caricato anche qui, oltre che dentro il picker.
2656
+ */
2455
2657
  describe(name: string | undefined): FlowFieldDescription | undefined;
2456
- /** Il catalogo e' popolato ma non conosce questo campo: sarebbe `FIELD_UNKNOWN`. */
2457
- isUnknown(assignment: FlowInputFieldAssignment): boolean;
2458
2658
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FieldAssignmentEditorComponent, never>;
2459
2659
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<FieldAssignmentEditorComponent, "fb-field-assignment-editor", never, { "holder": { "alias": "holder"; "required": true; "isSignal": true; }; "object": { "alias": "object"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "disabledReason": { "alias": "disabledReason"; "required": false; "isSignal": true; }; }, { "changed": "changed"; }, never, never, true, never>;
2460
2660
  }
@@ -2597,7 +2797,6 @@ declare class ElementDialogComponent {
2597
2797
  declare class StartInspectorComponent {
2598
2798
  private readonly store;
2599
2799
  private readonly dictionaries;
2600
- private readonly catalog;
2601
2800
  private readonly validation;
2602
2801
  readonly start: _angular_core.Signal<FlowStart>;
2603
2802
  readonly startNode: _angular_core.Signal<FlowAnyNode>;
@@ -2606,10 +2805,6 @@ declare class StartInspectorComponent {
2606
2805
  readonly recordTriggerTypes: _angular_core.Signal<_esfaenza_flow_builder.FlowDictionaryEntry[]>;
2607
2806
  readonly frequencies: _angular_core.Signal<_esfaenza_flow_builder.FlowDictionaryEntry[]>;
2608
2807
  readonly offsetUnits: _angular_core.Signal<_esfaenza_flow_builder.FlowDictionaryEntry[]>;
2609
- private readonly objects;
2610
- constructor();
2611
- readonly objectOptions: _angular_core.Signal<FlowObjectSummary[]>;
2612
- readonly hasObjectCatalog: _angular_core.Signal<boolean>;
2613
2808
  readonly triggerType: _angular_core.Signal<string>;
2614
2809
  readonly isRecordTrigger: _angular_core.Signal<boolean>;
2615
2810
  readonly isScheduled: _angular_core.Signal<boolean>;
@@ -2663,9 +2858,8 @@ declare class OrchestratedStageInspectorComponent extends NodeInspectorBase {
2663
2858
  */
2664
2859
  private readonly flowCandidates;
2665
2860
  constructor();
2666
- readonly candidates: _angular_core.Signal<FlowSummary[]>;
2667
- /** L'id del `datalist`: dipende dall'elemento, per non collidere con un altro stage. */
2668
- readonly flowListId: _angular_core.Signal<string>;
2861
+ /** I candidati come li vuole il picker: il nome del flow e' il suo `flowName`. */
2862
+ readonly candidateOptions: _angular_core.Signal<NamePickerOption[]>;
2669
2863
  /**
2670
2864
  * I contenitori di condizioni, uno per step, calcolati **una volta** per documento: costruirli
2671
2865
  * nel template creerebbe un oggetto nuovo a ogni ciclo di change detection.
@@ -2750,14 +2944,12 @@ declare class ResourcePanelComponent {
2750
2944
  readonly kinds: ResourceKindDescriptor[];
2751
2945
  readonly dataTypes: _angular_core.Signal<_esfaenza_flow_builder.FlowDataTypeEntry[]>;
2752
2946
  readonly sortOrders: _angular_core.Signal<_esfaenza_flow_builder.FlowDictionaryEntry[]>;
2753
- private readonly objects;
2754
2947
  private readonly enumTypes;
2755
2948
  /** La collection aperta nel pannello. */
2756
2949
  readonly activeCollection: _angular_core.WritableSignal<"variables" | "constants" | "formulas" | "textTemplates" | "choices" | "dynamicChoiceSets" | "stages">;
2757
2950
  /** L'indice della risorsa in modifica, o `null`. */
2758
2951
  readonly editingIndex: _angular_core.WritableSignal<number | null>;
2759
2952
  constructor();
2760
- readonly objectOptions: _angular_core.Signal<FlowObjectSummary[]>;
2761
2953
  readonly enumOptions: _angular_core.Signal<FlowCatalogEntry[]>;
2762
2954
  readonly activeKind: _angular_core.Signal<ResourceKindDescriptor>;
2763
2955
  readonly items: _angular_core.Signal<FlowResourceRef[]>;
@@ -2948,7 +3140,7 @@ declare class FlowBuilderComponent {
2948
3140
  * troppo. `panel` tiene il form nel pannello laterale, che e' piu' comodo quando si
2949
3141
  * modificano molti elementi di fila perche' non c'e' niente da aprire e chiudere.
2950
3142
  */
2951
- readonly inspectorMode: _angular_core.InputSignal<"panel" | "dialog">;
3143
+ readonly inspectorMode: _angular_core.InputSignal<"dialog" | "panel">;
2952
3144
  readonly saved: _angular_core.OutputEmitterRef<FlowSaveResult>;
2953
3145
  readonly activated: _angular_core.OutputEmitterRef<FlowSaveResult>;
2954
3146
  readonly closeRequested: _angular_core.OutputEmitterRef<void>;
@@ -3023,11 +3215,12 @@ declare class FlowBuilderComponent {
3023
3215
  /** Rilascio dalla palette: il punto di rilascio diventa `locationX`/`locationY` (§11). */
3024
3216
  onElementDropped(event: {
3025
3217
  type: FlowElementType;
3218
+ variant?: string;
3026
3219
  x: number;
3027
3220
  y: number;
3028
3221
  }): void;
3029
3222
  /** Click sulla palette: l'elemento si posiziona in una zona libera. */
3030
- onElementPicked(type: FlowElementType): void;
3223
+ onElementPicked(pick: FlowPalettePick): void;
3031
3224
  private createElement;
3032
3225
  onRemoveNode(name: string): void;
3033
3226
  onDuplicateNode(name: string): void;
@@ -3071,5 +3264,5 @@ declare class SelectValueDirective implements AfterViewChecked {
3071
3264
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<SelectValueDirective, "select[fbValue]", never, { "fbValue": { "alias": "fbValue"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
3072
3265
  }
3073
3266
 
3074
- export { ConditionEditorComponent, ConnectorEditorComponent, DebugPanelComponent, ElementDialogComponent, ElementInspectorComponent, ElementPaletteComponent, FALLBACK_COLLECTION_BY_TYPE, FALLBACK_TYPE_LABEL, FLOW_BUILDER_HTTP_CONFIG, FLOW_ELEMENT_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, FlowApiError, FlowBuilderApi, FlowBuilderComponent, FlowCanvasComponent, FlowCatalogStore, FlowDictionaryStore, FlowDocumentStore, FlowEditorSession, FlowLayoutService, FlowValidationStore, HttpFlowBuilderApi, NodeInspectorBase, ORCHESTRATION_CONDITION_OUTPUT, OrchestratedStageInspectorComponent, ParameterEditorComponent, ProblemsPanelComponent, RecordFilterEditorComponent, ReferencePickerComponent, ResourcePanelComponent, START_NODE_NAME, SelectValueDirective, StartInspectorComponent, TYPES_WITH_AUTOMATIC_OUTPUT, TYPE_BY_COLLECTION, UNSUPPORTED_TYPES, ValueEditorComponent, VersionPanelComponent, areTypesComparable, canvasNodeId, checkConditionLogic, checkFlowName, elementIcon, emptyFlowDefinition, flowNodeWidth, flowNodeWidthClass, isCustomConditionLogic, isGlobalReference, isNumericType, isTypeCheckedOperator, isValidFlowName, moveCondition, outletByKey, outletsOf, parseCanvasNodeId, parseInvariantNumber, parseSourceConnectorId, parseTargetConnectorId, referenceRoot, remapConditionLogic, removeCondition, slugifyFlowName, sourceConnectorId, stageStepNames, stageStepOutputReferenced, stepsOf, targetConnectorId, uniqueFlowName };
3075
- export type { FieldAssignmentHolder, FilterHolder, FlowActionCall, FlowAnyNode, FlowAssignment, FlowAssignmentItem, FlowAssignmentOperator, FlowAssignmentOperatorEntry, FlowBuilderHttpConfig, FlowCanvasEdge, FlowCanvasNode, FlowCatalogEntry, FlowCatalogParameter, FlowChoice, FlowCloneRequest, FlowCollectionProcessor, FlowCollectionProcessorType, FlowComparisonOperator, FlowComparisonOperatorEntry, FlowCondition, FlowConditionHolder, FlowConditionLogic, FlowConflictState, FlowConnectionKind, FlowConnector, FlowConnectorTarget, FlowConstant, FlowCreateRequest, FlowCustomError, FlowCustomErrorMessage, FlowCustomProperty, FlowDataType, FlowDataTypeEntry, FlowDecision, FlowDecisionRule, FlowDefinition, FlowDictionaries, FlowDictionaryEntry, FlowDynamicChoiceSet, FlowEdge, FlowElementType, FlowElementTypeEntry, FlowErrorCategory, FlowExportQuery, FlowFieldDescription, FlowFieldUsage, FlowFieldValue, FlowFormula, FlowGlobalVariableEntry, FlowInputFieldAssignment, FlowInputParameter, FlowInterviewResult, FlowInterviewStatus, FlowIssueSeverity, FlowLayoutDirection, FlowLayoutNodeInput, FlowLayoutOptions, FlowLayoutResult, FlowListQuery, FlowLoop, FlowNameCheck, FlowNameProblem, FlowNewVersionRequest, FlowNodeBase, FlowNodeCollection, FlowNodeRef, FlowObjectDescription, FlowObjectSummary, FlowOffsetUnit, FlowOrchestratedStage, FlowOutlet, FlowOutline, FlowOutlineConnection, FlowOutlineNode, FlowOutputFieldAssignment, FlowOutputParameter, FlowPendingScreen, FlowProcessType, FlowRecordCreate, FlowRecordDelete, FlowRecordFilter, FlowRecordFilterOperator, FlowRecordLookup, FlowRecordRollback, FlowRecordTriggerType, FlowRecordUpdate, FlowReference, FlowReferenceKind, FlowReferenceQuery, FlowResourceCollection, FlowResourceKindEntry, FlowResourceRef, FlowResumeRequest, FlowSaveRequest, FlowSaveResult, FlowSchedule, FlowScheduledPath, FlowScreen, FlowScreenNavigation, FlowScreenResponseRequest, FlowScriptPluginCall, FlowSortOption, FlowSortOrder, FlowStage, FlowStageStep, FlowStageStepActionType, FlowStageStepAssignee, FlowStageStepConditionActionType, FlowStageStepRequest, FlowStageStepState, FlowStageStepStatus, FlowStageStepTypeEntry, FlowStart, FlowStartInterviewRequest, FlowSubflow, FlowSubflowInputAssignment, FlowSubflowOutputAssignment, FlowSummary, FlowTextTemplate, FlowTraceEntry, FlowTransactionModel, FlowTransform, FlowTransformType, FlowTransformValue, FlowTransformValueAction, FlowTriggerType, FlowTypedValue, FlowUnsupportedNode, FlowValidationIssue, FlowValidationResult, FlowValue, FlowVariable, FlowVersionStatus, FlowVersionSummary, FlowWait, FlowWaitEvent, ParameterHolder, ValueMode };
3267
+ 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, START_NODE_NAME, SelectValueDirective, StartInspectorComponent, TYPES_WITH_AUTOMATIC_OUTPUT, TYPE_BY_COLLECTION, UNSUPPORTED_TYPES, ValueEditorComponent, VersionPanelComponent, areTypesComparable, canvasNodeId, checkConditionLogic, checkFlowName, elementIcon, emptyFlowDefinition, flowNodeWidth, flowNodeWidthClass, isCustomConditionLogic, isGlobalReference, isNumericType, isTypeCheckedOperator, isValidFlowName, moveCondition, outletByKey, outletsOf, parseCanvasNodeId, parseInvariantNumber, parseSourceConnectorId, parseTargetConnectorId, referenceRoot, remapConditionLogic, removeCondition, slugifyFlowName, sourceConnectorId, stageStepNames, stageStepOutputReferenced, stepsOf, targetConnectorId, uniqueFlowName, variantFieldOf, variantOf, variantPresetOf };
3268
+ export type { FieldAssignmentHolder, FilterHolder, FlowActionCall, FlowAnyNode, FlowAssignment, FlowAssignmentItem, FlowAssignmentOperator, FlowAssignmentOperatorEntry, FlowBuilderHttpConfig, FlowCanvasEdge, FlowCanvasNode, FlowCatalogEntry, FlowCatalogParameter, FlowChoice, FlowCloneRequest, FlowCollectionProcessor, FlowCollectionProcessorType, FlowComparisonOperator, FlowComparisonOperatorEntry, FlowCondition, FlowConditionHolder, FlowConditionLogic, FlowConflictState, FlowConnectionKind, FlowConnector, FlowConnectorTarget, FlowConstant, FlowCreateRequest, FlowCustomError, FlowCustomErrorMessage, FlowCustomProperty, FlowDataType, FlowDataTypeEntry, FlowDecision, FlowDecisionRule, FlowDefinition, FlowDictionaries, FlowDictionaryEntry, FlowDynamicChoiceSet, FlowEdge, FlowElementType, FlowElementTypeEntry, FlowErrorCategory, FlowExportQuery, FlowFieldDescription, FlowFieldUsage, FlowFieldValue, FlowFormula, FlowGlobalVariableEntry, FlowInputFieldAssignment, FlowInputParameter, FlowInterviewResult, FlowInterviewStatus, FlowIssueSeverity, FlowLayoutDirection, FlowLayoutNodeInput, FlowLayoutOptions, FlowLayoutResult, FlowListQuery, FlowLoop, FlowNameCheck, FlowNameProblem, FlowNewVersionRequest, FlowNodeBase, FlowNodeCollection, FlowNodeRef, FlowObjectDescription, FlowObjectSummary, FlowOffsetUnit, FlowOrchestratedStage, FlowOutlet, FlowOutline, FlowOutlineConnection, FlowOutlineNode, FlowOutputFieldAssignment, FlowOutputParameter, FlowPalettePick, FlowPendingScreen, FlowProcessType, FlowRecordCreate, FlowRecordDelete, FlowRecordFilter, FlowRecordFilterOperator, FlowRecordLookup, FlowRecordRollback, FlowRecordTriggerType, FlowRecordUpdate, FlowReference, FlowReferenceKind, FlowReferenceQuery, FlowResourceCollection, FlowResourceKindEntry, FlowResourceRef, FlowResumeRequest, FlowSaveRequest, FlowSaveResult, FlowSchedule, FlowScheduledPath, FlowScreen, FlowScreenNavigation, FlowScreenResponseRequest, FlowScriptPluginCall, FlowSortOption, FlowSortOrder, FlowStage, FlowStageStep, FlowStageStepActionType, FlowStageStepAssignee, FlowStageStepConditionActionType, FlowStageStepRequest, FlowStageStepState, FlowStageStepStatus, FlowStageStepTypeEntry, FlowStart, FlowStartInterviewRequest, FlowSubflow, FlowSubflowInputAssignment, FlowSubflowOutputAssignment, FlowSummary, FlowTextTemplate, FlowTraceEntry, FlowTransactionModel, FlowTransform, FlowTransformType, FlowTransformValue, FlowTransformValueAction, FlowTriggerType, FlowTypedValue, FlowUnsupportedNode, FlowValidationIssue, FlowValidationResult, FlowValue, FlowVariable, FlowVersionStatus, FlowVersionSummary, FlowWait, FlowWaitEvent, NamePickerOption, PaletteGroup, PaletteItem, ParameterHolder, ValueMode };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@esfaenza/flow-builder",
3
- "version": "20.3.1",
3
+ "version": "20.3.3",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^20.3.25",
6
6
  "@angular/core": "^20.3.25",
@@ -413,6 +413,19 @@ f-flow .fb-edge--goto .f-connection-path {
413
413
  margin-bottom: 6px;
414
414
  }
415
415
 
416
+ /**
417
+ * I picker sono elementi custom: senza `flex` occuperebbero la larghezza del loro contenuto,
418
+ * e dentro l'intestazione di una voce di elenco resterebbero una casella minuscola accanto al
419
+ * bottone di rimozione. La regola sta qui perche' vale per ogni editor che li mette in fila.
420
+ */
421
+ .fb-list__header > fb-name-picker,
422
+ .fb-list__header > fb-field-picker,
423
+ .fb-list__header > fb-object-picker,
424
+ .fb-list__header > fb-reference-picker {
425
+ flex: 1;
426
+ min-width: 0;
427
+ }
428
+
416
429
  .fb-list__index {
417
430
  display: grid;
418
431
  place-items: center;