wuic-framework-lib 1.3.2 → 1.5.0

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.
Files changed (21) hide show
  1. package/fesm2022/{wuic-framework-lib-chart-list.component-DAP-TPJR.mjs → wuic-framework-lib-chart-list.component-0J1ghIrS.mjs} +4 -4
  2. package/fesm2022/{wuic-framework-lib-code-editor.component-CLMDvOWs.mjs → wuic-framework-lib-code-editor.component-C21mvjyr.mjs} +277 -13
  3. package/fesm2022/{wuic-framework-lib-designer.component-DA7abiLW.mjs → wuic-framework-lib-designer.component-x10ZzUEy.mjs} +1583 -194
  4. package/fesm2022/{wuic-framework-lib-first-run-wizard.component-BLrUrfZ9.mjs → wuic-framework-lib-first-run-wizard.component-BuSxs_CM.mjs} +7 -7
  5. package/fesm2022/{wuic-framework-lib-framework-docs.component-DphKhTef.mjs → wuic-framework-lib-framework-docs.component-xTGLbEnp.mjs} +1289 -82
  6. package/fesm2022/{wuic-framework-lib-pivot-builder.component-BqUUwrJM.mjs → wuic-framework-lib-pivot-builder.component-BkFFjPm4.mjs} +6 -6
  7. package/fesm2022/{wuic-framework-lib-prompt-dialog-fallback-host.component-DZrhwMH5.mjs → wuic-framework-lib-prompt-dialog-fallback-host.component-Bi-TrJB6.mjs} +2 -2
  8. package/fesm2022/{wuic-framework-lib-report-designer.component-D_qbefud.mjs → wuic-framework-lib-report-designer.component-ZvB46-LV.mjs} +2 -2
  9. package/fesm2022/{wuic-framework-lib-report-viewer.component-CIN2fY0P.mjs → wuic-framework-lib-report-viewer.component-BR-BfI2r.mjs} +2 -2
  10. package/fesm2022/wuic-framework-lib-scene3d-designer.component-BQzFxSXP.mjs +4578 -0
  11. package/fesm2022/wuic-framework-lib-scene3d-light-baker-gpu-0LjqhSNn.mjs +303 -0
  12. package/fesm2022/wuic-framework-lib-scene3d-shader-effect-CQLWkuh1.mjs +2227 -0
  13. package/fesm2022/wuic-framework-lib-scene3d-viewer.component-imoV3HOs.mjs +999 -0
  14. package/fesm2022/{wuic-framework-lib-scheduler-list.component-CdcI1Uor.mjs → wuic-framework-lib-scheduler-list.component-xzlTEkoq.mjs} +2 -2
  15. package/fesm2022/{wuic-framework-lib-spreadsheet-list-sf.component-j1HTRI_P.mjs → wuic-framework-lib-spreadsheet-list-sf.component-CrS6fOGj.mjs} +4 -4
  16. package/fesm2022/wuic-framework-lib-workflow-designer.component-5xtQ7-6z.mjs +9474 -0
  17. package/fesm2022/{wuic-framework-lib-wuic-framework-lib-BRujEwpR.mjs → wuic-framework-lib-wuic-framework-lib-3TZ-j-yL.mjs} +2615 -719
  18. package/fesm2022/wuic-framework-lib.mjs +1 -1
  19. package/package.json +2 -1
  20. package/types/wuic-framework-lib.d.ts +740 -8
  21. package/fesm2022/wuic-framework-lib-workflow-designer.component-SE_7ZogW.mjs +0 -5114
@@ -975,6 +975,27 @@ type WorkflowRuntimeLinkedActionRouteMetadataEntry = {
975
975
  targetRoute: string;
976
976
  targetAction?: string;
977
977
  metadata: any;
978
+ /** Feature I: guardie di transizione (espressioni JS su `record`) raccolte dai nodi condition attraversati. */
979
+ conditionExpressions?: string[];
980
+ /** Feature J: permessi richiesti (es. 'role:<id_ruolo>') raccolti dalle transizioni sugli archi attraversati. */
981
+ requiredPermissions?: string[];
982
+ };
983
+ type WorkflowRuntimeInternalActionEntry = {
984
+ sourceRoute: string;
985
+ tableActionId: number;
986
+ /** Node id dell'azione trigger (per memorizzarne il payload di ritorno). */
987
+ triggerNodeId?: string;
988
+ /**
989
+ * Catena ordinata di azioni interne a valle del trigger. `splitConfig` e'
990
+ * presente SOLO per le azioni sintetiche del parallel_split (tipo 102, F5):
991
+ * il consumer (data-source) le esegue nativamente materializzando i task.
992
+ */
993
+ internalActions: Array<{
994
+ nodeId: string;
995
+ actionTypeId: number;
996
+ callback: string;
997
+ splitConfig?: any;
998
+ }>;
978
999
  };
979
1000
  type WorkflowRuntimeRouteNodePayloadEntry = {
980
1001
  nodeId: string;
@@ -989,21 +1010,38 @@ type WorkflowRuntimePreviousRouteNodeEntry = {
989
1010
  previousAction?: string;
990
1011
  };
991
1012
  declare class WorkflowRuntimeMetadataService {
1013
+ private userInfoSrv?;
992
1014
  private static instance?;
993
1015
  private readonly storageKey;
994
1016
  private readonly byRouteAction;
995
1017
  private readonly byRoute;
996
1018
  private readonly linkedBySourceAction;
1019
+ /** Feature L — azioni INTERNE (concatenate) a valle di una table action: key `route::actionId`. */
1020
+ private readonly internalBySourceAction;
997
1021
  private readonly pendingByRouteAction;
998
1022
  private readonly pendingByRoute;
999
1023
  private readonly routeNodePayloadByNodeId;
1000
1024
  private readonly routeNodeIdsByRouteAction;
1001
1025
  private readonly routeNodeIdsByRoute;
1002
1026
  private readonly previousRouteNodeByRouteNodeId;
1027
+ /**
1028
+ * Contesto della navigazione workflow in corso (impostato dal wrapper action
1029
+ * del data-source prima di invocare il callback). Serve a `navigateToNextStep`
1030
+ * per sapere QUALE azione/route sorgente sta risolvendo il prossimo step,
1031
+ * senza che il callback debba conoscere l'action id. Transiente, non persistito.
1032
+ */
1033
+ private currentNavContext;
1034
+ /**
1035
+ * Chiave (`wg_key`) del grafo workflow ATTIVO nel runner. Viaggia verso il
1036
+ * server dentro `routeContext.workflowGraphId` (buildCrudRouteContext): il
1037
+ * server la usa per rileggere il bundle dal grafo persistito e applicare
1038
+ * autorizzazioni tabella/colonne e record restriction server-side.
1039
+ */
1040
+ private activeGraphKey;
1003
1041
  /**
1004
1042
  * Inizializza il singleton runtime metadata e prova il restore dello stato persistito da sessionStorage.
1005
1043
  */
1006
- constructor();
1044
+ constructor(userInfoSrv?: UserInfoService);
1007
1045
  /**
1008
1046
  * Restituisce l'istanza singleton runtime metadata inizializzata dal DI Angular.
1009
1047
  * Utile per accessi statici da utility/service non iniettati.
@@ -1016,6 +1054,14 @@ declare class WorkflowRuntimeMetadataService {
1016
1054
  * @param entries Elenco metadata runtime per route/azione.
1017
1055
  */
1018
1056
  setRouteMetadata(entries: WorkflowRuntimeRouteMetadataEntry[]): void;
1057
+ /**
1058
+ * Route degli step del workflow ATTIVO (chiavi di `byRoute`, lowercase).
1059
+ * Usate dal menu-route-access guard: la navigazione fra gli step di un
1060
+ * workflow attivo e' legittima anche quando le route non compaiono nel
1061
+ * menu applicativo dell'utente (es. il runner instrada il richiedente
1062
+ * sullo step successivo del flusso).
1063
+ */
1064
+ getActiveWorkflowRoutes(): string[];
1019
1065
  /**
1020
1066
  * Risolve i metadata runtime attivi per route/action usando priorita:
1021
1067
  * chiave specifica `route::action` e fallback metadata di sola route.
@@ -1024,6 +1070,14 @@ declare class WorkflowRuntimeMetadataService {
1024
1070
  * @returns Metadata runtime associato oppure `null`.
1025
1071
  */
1026
1072
  getRouteMetadata(route: string, action?: string): any | null;
1073
+ /**
1074
+ * Imposta la chiave del grafo workflow attivo (settata dal runner al load).
1075
+ */
1076
+ setActiveGraphKey(graphKey: string): void;
1077
+ /**
1078
+ * Chiave del grafo workflow attivo ('' se nessun workflow in corso).
1079
+ */
1080
+ getActiveGraphKey(): string;
1027
1081
  /**
1028
1082
  * Pulisce lo stato runtime e le cache associate.
1029
1083
  */
@@ -1034,13 +1088,108 @@ declare class WorkflowRuntimeMetadataService {
1034
1088
  * @param entries Collegamenti sourceRoute+tableActionId -> targetRoute/targetAction.
1035
1089
  */
1036
1090
  setLinkedActionRouteMetadata(entries: WorkflowRuntimeLinkedActionRouteMetadataEntry[]): void;
1091
+ /**
1092
+ * True se l'azione (route sorgente + table action id) ha collegamenti di
1093
+ * navigazione nel grafo ATTIVO (archi verso condition/route). Usato dal
1094
+ * wrapper action del data-source per attivare la meccanica di flusso in
1095
+ * modo GRAPH-DRIVEN: e' il grafo a dire se un'azione naviga, il tipo
1096
+ * dell'azione descrive solo il payload di business.
1097
+ */
1098
+ hasLinkedNavigation(sourceRoute: string, tableActionId: number): boolean;
1037
1099
  /**
1038
1100
  * Attiva i metadata di navigazione collegati a una specifica azione tabellare, spostandoli nelle mappe "pending".
1039
1101
  * I metadata pending verranno consumati dalla prima apertura della route target (con o senza action).
1040
1102
  * @param sourceRoute Route sorgente da cui parte l'azione.
1041
1103
  * @param tableActionId Id dell'azione tabellare eseguita.
1042
1104
  */
1043
- activateLinkedNavigationMetadata(sourceRoute: string, tableActionId: number): void;
1105
+ activateLinkedNavigationMetadata(sourceRoute: string, tableActionId: number, record?: any, payload?: any): void;
1106
+ /**
1107
+ * Snapshot plain del record: i campi dei record framework sono BehaviorSubject,
1108
+ * qui srotolati a valore per la valutazione delle espressioni-guardia.
1109
+ */
1110
+ private snapshotRecord;
1111
+ /**
1112
+ * `true` se TUTTE le espressioni-guardia del target sono soddisfatte contro
1113
+ * lo snapshot (fail-closed: un'espressione invalida conta come non passata).
1114
+ * In scope, oltre a `record`, c'e' `payload`: il valore consegnato
1115
+ * dall'azione precedente della catena (3° argomento di `navigateToNextStep`,
1116
+ * tipicamente lo stesso valore poi passato a `resolve(...)` nel trigger) —
1117
+ * `undefined` se il chiamante non lo fornisce.
1118
+ */
1119
+ private targetGuardsPass;
1120
+ /**
1121
+ * Feature J — `true` se l'utente corrente soddisfa TUTTI i permessi richiesti
1122
+ * dalla transizione. Formato canonico `role:<id_ruolo>` (match su `role_id`);
1123
+ * valori legacy free-form confrontati case-insensitive col nome ruolo.
1124
+ * Fail-closed: senza utente/servizio la transizione non e' percorribile.
1125
+ */
1126
+ /**
1127
+ * Feature J — verifica pubblica dei permessi transizione per l'utente corrente
1128
+ * (usata dal runner anche per il gate delle table action nell'overlay:
1129
+ * permesso sull'arco route->action = chi puo' vedere/usare l'azione nello step).
1130
+ */
1131
+ userHasPermissions(requiredPermissions?: string[]): boolean;
1132
+ private permissionsPass;
1133
+ /**
1134
+ * Feature J — valuta una singola voce permesso:
1135
+ * - `deny:role:1,role:5` → i ruoli in lista sono BLOCCATI (lista vuota = tutti abilitati);
1136
+ * - `grant:role:1,role:5` → SOLO i ruoli in lista sono ammessi;
1137
+ * - legacy `role:<id>` o nome ruolo → grant singolo.
1138
+ */
1139
+ private permissionEntryPass;
1140
+ /** Match di un token ruolo: `role:<id>`, `<id>` numerico o nome ruolo (case-insensitive). */
1141
+ private roleTokenMatches;
1142
+ /**
1143
+ * Feature L — registra le catene di azioni INTERNE (concatenate) a valle
1144
+ * delle table action del workflow attivo. Chiamato dal runner; consumato dal
1145
+ * wrapper action del data-source dopo l'esecuzione del callback trigger.
1146
+ */
1147
+ setLinkedInternalActions(entries: WorkflowRuntimeInternalActionEntry[]): void;
1148
+ /** Feature L — catena di azioni interne collegata a una table action (o `null`). */
1149
+ getLinkedInternalActions(sourceRoute: string, tableActionId: number): WorkflowRuntimeInternalActionEntry | null;
1150
+ /**
1151
+ * Imposta il contesto della navigazione workflow in corso (sourceRoute +
1152
+ * actionId dell'azione che sta per eseguire il proprio callback). Chiamato dal
1153
+ * wrapper action del data-source; consumato da `navigateToNextStep`.
1154
+ */
1155
+ setNavigationContext(sourceRoute: string, tableActionId: number): void;
1156
+ /** Contesto navigazione workflow corrente, o `null` se non in un'azione workflow. */
1157
+ getNavigationContext(): {
1158
+ sourceRoute: string;
1159
+ actionId: number;
1160
+ } | null;
1161
+ /** Azzera il contesto navigazione (chiamato al termine del callback action). */
1162
+ clearNavigationContext(): void;
1163
+ /**
1164
+ * Feature I — risolve la route del PROSSIMO step workflow per un'azione di
1165
+ * navigazione, dato il record corrente (`context`):
1166
+ * - se i target hanno guardie (nodo condition a valle) sceglie il ramo
1167
+ * VINCENTE (tutte le espressioni soddisfatte) — es. true=pop>1000;
1168
+ * - se non ci sono guardie (il nodo successivo e' direttamente una route)
1169
+ * prende quella route.
1170
+ * @returns `{ targetRoute, targetAction }` scelta, oppure `null` se non c'e'
1171
+ * linking workflow per (sourceRoute, actionId).
1172
+ */
1173
+ resolveNextStepRoute(sourceRoute: string, tableActionId: number, record: any, payload?: any): {
1174
+ targetRoute: string;
1175
+ targetAction: string;
1176
+ } | null;
1177
+ /**
1178
+ * Feature I — valuta le guardie di transizione (espressioni dei nodi condition)
1179
+ * collegate a un'azione di navigazione workflow, contro il record corrente.
1180
+ *
1181
+ * Semantica: la navigazione e' consentita se ALMENO UN target collegato ha
1182
+ * tutte le sue guardie soddisfatte (nessuna espressione = sempre consentito).
1183
+ * Le espressioni sono JS con in scope `record` (snapshot plain, BehaviorSubject
1184
+ * gia' srotolati). Un errore di valutazione conta come guardia fallita.
1185
+ *
1186
+ * @returns `{ allowed, failedExpression }` — la prima espressione fallita
1187
+ * (per il toast) quando `allowed=false`.
1188
+ */
1189
+ evaluateLinkedNavigationGuards(sourceRoute: string, tableActionId: number, record: any): {
1190
+ allowed: boolean;
1191
+ failedExpression?: string;
1192
+ };
1044
1193
  /**
1045
1194
  * Consuma (read-once) metadata pending per route/azione: se presenti li ritorna e li rimuove dallo stato runtime.
1046
1195
  * La lookup prova prima la chiave `route::action`, poi il fallback per sola route.
@@ -1670,12 +1819,41 @@ declare class DataSourceComponent implements OnInit, OnDestroy {
1670
1819
  */
1671
1820
  private applyWorkflowRuntimeRouteMetadata;
1672
1821
  /**
1822
+ * Valuta le autorizzazioni del BUNDLE workflow (tablePermissions /
1823
+ * columnPermissions autorate nel grafo, sezioni "Autorizzazioni
1824
+ * tabella/colonna" del Metadata Route editor) per l'UTENTE CORRENTE e le
1825
+ * proietta sui metadata client. Le autorizzazioni fisiche
1826
+ * (_mtdt__tnt__trzzzioni__*) restano enforcement server-side globale; queste
1827
+ * valgono SOLO dentro il workflow (overlay-only, come le azioni). Specchia la
1828
+ * semantica di `applyTableRestrictions`/`applyColumnRestrictions` server:
1829
+ * tri-state (null=neutro), precedenza utente > ruolo, admin bypass.
1830
+ */
1831
+ private applyWorkflowRuntimePermissionsForCurrentUser;
1832
+ /**
1673
1833
  * Ricostruisce le callback delle custom action tabella (`action_callback__fn`, `disable_callback__fn`) e aggancia il linking di navigazione workflow.
1674
1834
  * @param actions Lista custom action tabella da rendere eseguibile (callback function ricostruite).
1675
1835
  * @param currentRoute Route sorgente usata per il linking automatico delle azioni di navigazione.
1676
1836
  */
1677
1837
  private rehydrateRuntimeTableActionCallbacks;
1678
1838
  /**
1839
+ * Feature L — esegue la catena di azioni INTERNE (concatenate) collegate a
1840
+ * una table action del workflow attivo. Il `payload` iniziale e' il valore
1841
+ * ritornato dal callback del trigger; il return (non-undefined) di ogni
1842
+ * interna diventa il payload della successiva. I payload sono memorizzati
1843
+ * anche nella mappa payload del workflow (`setRouteNodePayload` per node id).
1844
+ * Errori: notificati via errorHandler, non bloccano il flusso.
1845
+ */
1846
+ private executeLinkedInternalActions;
1847
+ /**
1848
+ * F5 — materializza i TASK PARALLELI del parallel_split: per ogni record del
1849
+ * payload del trigger e per ogni ramo della config, un `insertRecord` sulla
1850
+ * route task dell'app (CRUD standard: audit stamp e trigger dell'app gratis).
1851
+ * Config: { task_route, fk_field, record_pk_field, caption_field, done_field,
1852
+ * assignee_field?, due_days?, extra_defaults?, branches: [{caption,
1853
+ * assignee_user_id?}] }. Ritorna il payload arricchito di `tasksCreated`.
1854
+ */
1855
+ private materializeWorkflowParallelTasks;
1856
+ /**
1679
1857
  * Restituisce il primo valore definito tra più chiavi candidate, con fallback case-insensitive.
1680
1858
  * @param obj Oggetto su cui cercare i valori.
1681
1859
  * @param keys Lista ordinata di chiavi candidate da testare.
@@ -2829,10 +3007,19 @@ declare class MetadataProviderService {
2829
3007
  static loadDashboardUri: any;
2830
3008
  static deleteDashboardUri: any;
2831
3009
  static saveWorkflowGraphUri: any;
3010
+ static saveWorkflowTransitionsUri: any;
3011
+ static getWorkflowTransitionsUri: any;
3012
+ static saveWorkflowGraphVersionUri: any;
3013
+ static getWorkflowGraphVersionsUri: any;
3014
+ static getWorkflowGraphVersionUri: any;
2832
3015
  static loadWorkflowGraphUri: any;
2833
3016
  static getWorkflowGraphsUri: any;
2834
3017
  static renameWorkflowGraphUri: any;
2835
3018
  static deleteWorkflowGraphUri: any;
3019
+ static saveScene3dUri: any;
3020
+ static saveScene3dThumbnailUri: any;
3021
+ static loadScene3dUri: any;
3022
+ static getScene3dsUri: any;
2836
3023
  static getCssClassesFromSheetsUri: any;
2837
3024
  static writeChangesToCssFileUri: any;
2838
3025
  static scaffoldODataUri: any;
@@ -3881,6 +4068,16 @@ declare class DataProviderMetaService {
3881
4068
  * @returns Esito serializzato con id/chiave/nome e numero route metadata processate.
3882
4069
  */
3883
4070
  saveWorkflowGraph(payload: any): Promise<any>;
4071
+ /** Feature J — persiste le transizioni di stato del workflow (`MetaService.saveWorkflowTransitions`). */
4072
+ saveWorkflowTransitions(payload: any): Promise<any>;
4073
+ /** Feature J — rilegge le transizioni di stato del workflow (`MetaService.getWorkflowTransitions`). */
4074
+ getWorkflowTransitions(payload: any): Promise<any>;
4075
+ /** Feature K — salva uno snapshot versione del workflow graph (`MetaService.saveWorkflowGraphVersion`). */
4076
+ saveWorkflowGraphVersion(payload: any): Promise<any>;
4077
+ /** Feature K — elenca le versioni storicizzate (`MetaService.getWorkflowGraphVersions`). */
4078
+ getWorkflowGraphVersions(payload: any): Promise<any>;
4079
+ /** Feature K — ritorna il graph_json di una versione specifica (`MetaService.getWorkflowGraphVersion`). */
4080
+ getWorkflowGraphVersion(payload: any): Promise<any>;
3884
4081
  /**
3885
4082
  * Carica un workflow graph via `MetaService.loadWorkflowGraph`.
3886
4083
  * Se la chiave non esiste, il backend ritorna un grafo vuoto (`nodes/connections`) con `route_metadata=[]`.
@@ -3906,6 +4103,33 @@ declare class DataProviderMetaService {
3906
4103
  * @returns Esito serializzato `{ deleted, affected }`.
3907
4104
  */
3908
4105
  deleteWorkflowGraph(payload: any): Promise<any>;
4106
+ /**
4107
+ * Salva/aggiorna una scena 3D via `MetaService.saveScene3d`.
4108
+ * Il backend fa upsert su `_wuic_scene3d` partendo da `scene_json`.
4109
+ * @param payload Richiesta con `scene_key`, `scene_name`, `scene_json`.
4110
+ * @returns Esito serializzato con id/chiave/nome.
4111
+ */
4112
+ saveScene3d(payload: any): Promise<any>;
4113
+ /**
4114
+ * Salva la thumbnail (data-URL PNG) di una scena via
4115
+ * `MetaService.saveScene3dThumbnail`. Non usa il busy globale: e' una
4116
+ * chiamata di corredo fire-and-forget dopo il save (cattura del canvas GPU).
4117
+ * @param payload Richiesta con `scene_key` e `thumbnail` (data:image/png;base64,...).
4118
+ */
4119
+ saveScene3dThumbnail(payload: any): Promise<any>;
4120
+ /**
4121
+ * Carica una scena 3D via `MetaService.loadScene3d`.
4122
+ * Se la chiave non esiste, il backend ritorna una scena vuota.
4123
+ * @param payload Richiesta con `scene_key`.
4124
+ * @returns Struttura `{ scene_key, scene_name, scene_json }`.
4125
+ */
4126
+ loadScene3d(payload: any): Promise<any>;
4127
+ /**
4128
+ * Richiede al backend l'elenco delle scene 3D disponibili (`MetaService.getScene3ds`).
4129
+ * @param payload Payload richiesta/risposta usato nel metodo.
4130
+ * @returns Collezione scene restituita dal server.
4131
+ */
4132
+ getScene3ds(payload: any): Promise<any>;
3909
4133
  /**
3910
4134
  * Chiede al backend le classi CSS presenti nei fogli indicati (`MetaService.getCssClassesFromSheets`).
3911
4135
  * @param sheetPaths Percorsi fogli CSS da elaborare.
@@ -4311,6 +4535,16 @@ declare class DataProviderService {
4311
4535
  * @returns Valore restituito dal metodo (Promise<any>).
4312
4536
  */
4313
4537
  saveWorkflowGraph(payload: any): Promise<any>;
4538
+ /** Feature J — persiste le transizioni di stato del workflow. */
4539
+ saveWorkflowTransitions(payload: any): Promise<any>;
4540
+ /** Feature J — rilegge le transizioni di stato del workflow. */
4541
+ getWorkflowTransitions(payload: any): Promise<any>;
4542
+ /** Feature K — salva uno snapshot versione del workflow graph. */
4543
+ saveWorkflowGraphVersion(payload: any): Promise<any>;
4544
+ /** Feature K — elenca le versioni storicizzate del workflow graph. */
4545
+ getWorkflowGraphVersions(payload: any): Promise<any>;
4546
+ /** Feature K — ritorna il graph_json di una versione specifica. */
4547
+ getWorkflowGraphVersion(payload: any): Promise<any>;
4314
4548
  /**
4315
4549
  * Carica i dati richiesti dal flusso runtime del servizio.
4316
4550
  * @param payload Payload richiesta/risposta usato nel metodo.
@@ -4323,6 +4557,14 @@ declare class DataProviderService {
4323
4557
  * @returns Lista graph/metadata restituita dal backend.
4324
4558
  */
4325
4559
  getWorkflowGraphs(payload: any): Promise<any>;
4560
+ /** Scene3D — salva/aggiorna una scena 3D delegando al provider metadata (`MetaService.saveScene3d`). */
4561
+ saveScene3d(payload: any): Promise<any>;
4562
+ /** Scene3D — salva la thumbnail di una scena (`MetaService.saveScene3dThumbnail`). */
4563
+ saveScene3dThumbnail(payload: any): Promise<any>;
4564
+ /** Scene3D — carica una scena 3D delegando al provider metadata (`MetaService.loadScene3d`). */
4565
+ loadScene3d(payload: any): Promise<any>;
4566
+ /** Scene3D — elenca le scene 3D disponibili delegando al provider metadata (`MetaService.getScene3ds`). */
4567
+ getScene3ds(payload: any): Promise<any>;
4326
4568
  /**
4327
4569
  * Rinomina un workflow graph delegando al provider metadata.
4328
4570
  * @param payload Payload con identificativo grafo e nuovo nome.
@@ -4482,6 +4724,35 @@ declare class WtoolboxService {
4482
4724
  static get router(): {
4483
4725
  navigateByUrl: (url: string) => Promise<boolean>;
4484
4726
  };
4727
+ /**
4728
+ * Id dell'utente autenticato corrente (via `UserInfoService`, mai leggendo
4729
+ * cookie/session direttamente — AGENTS.md regola 7). Utile nei callback delle
4730
+ * table action per stampare "chi ha fatto l'azione" (es. `approvatore_id` nel
4731
+ * workflow di approvazione). Ritorna '' se l'injector non e' pronto.
4732
+ */
4733
+ static getCurrentUserId(): string;
4734
+ /**
4735
+ * Username dell'utente autenticato corrente (stessa fonte di
4736
+ * getCurrentUserId). Utile quando l'app ha una tabella utenti applicativa
4737
+ * separata dai login (es. crm_users) mappata per username: i callback
4738
+ * risolvono l'id applicativo cercando per username.
4739
+ */
4740
+ static getCurrentUsername(): string;
4741
+ getCurrentUserId(): string;
4742
+ getCurrentUsername(): string;
4743
+ countRelatedRows(route: string, fkField: string, value: any, extraFilters?: Array<{
4744
+ field: string;
4745
+ operatore: string;
4746
+ value: any;
4747
+ }>): Promise<number>;
4748
+ areWorkflowTasksDone(taskRoute: string, fkField: string, recordId: any, doneField: string): Promise<boolean>;
4749
+ enqueueEmail(opts: {
4750
+ to: string;
4751
+ subject: string;
4752
+ body?: string;
4753
+ relatedRoute?: string;
4754
+ relatedPk?: string | number;
4755
+ }): Promise<any>;
4485
4756
  private static tr;
4486
4757
  /**
4487
4758
  * Salva nel runtime workflow il payload associato a uno specifico route node.
@@ -4518,6 +4789,85 @@ declare class WtoolboxService {
4518
4789
  route: string;
4519
4790
  action: string;
4520
4791
  } | null;
4792
+ /**
4793
+ * Navigazione condizionale guidata dal workflow. Da usare nel callback di
4794
+ * un'azione di navigazione AL POSTO di una route hardcodata:
4795
+ *
4796
+ * wtoolbox.navigateToNextStep(record, filterInfoJson, payload);
4797
+ *
4798
+ * La ROUTE del prossimo step viene scelta dal grafo workflow attivo:
4799
+ * - se a valle dell'azione c'e' un nodo condition/switch, valuta le sue
4800
+ * guardie contro `context` (il record/selezione) e `payload` e segue il
4801
+ * ramo vincente;
4802
+ * - altrimenti prende direttamente la route successiva del grafo.
4803
+ * Applica anche il metadata overlay del ramo scelto e naviga passando `filter`
4804
+ * come querystring `filterInfo` (oggetto o stringa JSON); se `filter` e' gia'
4805
+ * una querystring `chiave=...` viene usata grezza.
4806
+ *
4807
+ * @param context Record/selezione corrente, passato al validatore della condition.
4808
+ * @param filter Payload filtro (oggetto o JSON string) o querystring grezza.
4809
+ * @param payload Valore dell'azione corrente reso disponibile alle espressioni
4810
+ * di condition/switch come variabile `payload` (tipicamente lo
4811
+ * stesso valore poi consegnato a `resolve(...)` nel callback).
4812
+ * Le espressioni che citano `payload` sono deferite al momento
4813
+ * della scelta del ramo (il gate pre-click non le valuta).
4814
+ * @returns `true` se ha risolto e avviato la navigazione; `false` se non c'e'
4815
+ * linking workflow attivo (il callback puo' gestire un fallback).
4816
+ */
4817
+ static navigateToNextStep(context?: any, filter?: any, payload?: any): boolean;
4818
+ /**
4819
+ * Invia (enqueue) una NOTIFICA server-side via `NotificationRealtimeService`
4820
+ * (POST `Notifications/enqueue` -> righe in `_notifications` + push realtime
4821
+ * a OGNI destinatario). Pensata per i callback utente
4822
+ * (`wtoolbox.enqueueNotification({...})`), es. le azioni interne del workflow.
4823
+ *
4824
+ * Destinatari:
4825
+ * - `userId`: singolo id o ARRAY di id utente;
4826
+ * - `roleId`: singolo id o ARRAY di id ruolo — il server li risolve in utenti
4827
+ * (utenti.id_ruolo + utenti_ruoli, esclusi i cancellati) e fa fan-out;
4828
+ * - senza destinatari espliciti: default l'utente corrente.
4829
+ * Import dinamici per evitare cicli (il service importa WtoolboxService).
4830
+ */
4831
+ static enqueueNotification(payload: {
4832
+ message: string;
4833
+ userId?: number | number[];
4834
+ roleId?: number | number[];
4835
+ type?: string;
4836
+ targetJson?: string;
4837
+ payloadJson?: string;
4838
+ source?: string;
4839
+ }): Promise<boolean>;
4840
+ /**
4841
+ * F6 — conta le righe CORRELATE a un record su un'altra route (es. allegati
4842
+ * di una fattura, task aperti di un onboarding). Pensata per i callback e le
4843
+ * validazioni delle azioni workflow: `await wtoolbox.countRelatedRows(route,
4844
+ * fkField, id)` (+ filtri extra opzionali in shape filterElement). Ritorna
4845
+ * -1 su errore (i callback distinguano "0 righe" da "non verificabile").
4846
+ */
4847
+ static countRelatedRows(route: string, fkField: string, value: any, extraFilters?: Array<{
4848
+ field: string;
4849
+ operatore: string;
4850
+ value: any;
4851
+ }>): Promise<number>;
4852
+ /**
4853
+ * F5 — vero se TUTTI i task workflow correlati al record sono completati
4854
+ * (nessuna riga con done_field = false). Usata dal template del parallel_join.
4855
+ */
4856
+ static areWorkflowTasksDone(taskRoute: string, fkField: string, recordId: any, doneField: string): Promise<boolean>;
4857
+ /**
4858
+ * F7 — accoda una email workflow nell'outbox server (`_wuic_mail_outbox`
4859
+ * via `MetaService.enqueueWorkflowEmail`). L'invio reale avviene solo se
4860
+ * l'app ha SMTP configurato (status `sent`), altrimenti la riga resta
4861
+ * `logged` (simulazione demo). Ritorna `{ok, mo_id, status}` o `null` su
4862
+ * errore. Usata dai callback delle azioni interne tipo 101 (Email).
4863
+ */
4864
+ static enqueueEmail(opts: {
4865
+ to: string;
4866
+ subject: string;
4867
+ body?: string;
4868
+ relatedRoute?: string;
4869
+ relatedPk?: string | number;
4870
+ }): Promise<any>;
4521
4871
  /**
4522
4872
  * Costruisce un contesto route/workflow utile ai CRUD hook host-side.
4523
4873
  * Include anche informazioni debug leggere per troubleshooting.
@@ -4644,6 +4994,9 @@ declare class WtoolboxService {
4644
4994
  }, field: MetadatiColonna, metaInfo: MetaInfo, newValue: any, oldValue: any, wtoolbox: typeof WtoolboxService, nestedIndex?: number, nodes?: any[]) => void;
4645
4995
  propsBag?: any;
4646
4996
  hide?: boolean;
4997
+ suggest?: (record: {
4998
+ [key: string]: BehaviorSubject<any>;
4999
+ }, field: MetadatiColonna, metaInfo: MetaInfo, wtoolbox: typeof WtoolboxService) => any;
4647
5000
  }[], width?: string, height?: string, customValidation?: any): Promise<any>;
4648
5001
  private static openPromptDialogFallback;
4649
5002
  private static resolveDialogServiceFromInjector;
@@ -7636,7 +7989,11 @@ declare class NotificationRealtimeService {
7636
7989
  deleteRead(notificationId: number): Promise<void>;
7637
7990
  clearRead(userId?: number | null): Promise<void>;
7638
7991
  enqueue(payload: {
7639
- userId: number;
7992
+ userId?: number;
7993
+ /** Destinatari multipli (unione con userId). */
7994
+ userIds?: number[];
7995
+ /** Ruoli destinatari: il server li risolve in utenti (fan-out). */
7996
+ roleIds?: number[];
7640
7997
  type?: string;
7641
7998
  message: string;
7642
7999
  targetJson?: string;
@@ -12382,6 +12739,223 @@ declare class LazyFieldEditorComponent implements OnInit {
12382
12739
  static ɵcmp: i0.ɵɵComponentDeclaration<LazyFieldEditorComponent, "wuic-field-editor-lazy", never, { "datasource": { "alias": "datasource"; "required": false; }; "record": { "alias": "record"; "required": false; }; "field": { "alias": "field"; "required": false; }; "metaInfo": { "alias": "metaInfo"; "required": false; }; "readOnly": { "alias": "readOnly"; "required": false; }; "isFilter": { "alias": "isFilter"; "required": false; }; "hideLabel": { "alias": "hideLabel"; "required": false; }; "forceShowLabel": { "alias": "forceShowLabel"; "required": false; }; "operator": { "alias": "operator"; "required": false; }; "nestedIndex": { "alias": "nestedIndex"; "required": false; }; "triggerProp": { "alias": "triggerProp"; "required": false; }; "tabIndex": { "alias": "tabIndex"; "required": false; }; "onInlineCellValueChange": { "alias": "onInlineCellValueChange"; "required": false; }; }, {}, never, never, true, never>;
12383
12740
  }
12384
12741
 
12742
+ declare class PointFilterComponent {
12743
+ /**
12744
+ * Input dal componente padre per record; usata nella configurazione e nel rendering del componente.
12745
+ */
12746
+ record?: any;
12747
+ /**
12748
+ * Input dal componente padre per field; usata nella configurazione e nel rendering del componente.
12749
+ */
12750
+ field: MetadatiColonna;
12751
+ /**
12752
+ * Input dal componente padre per meta info; usata nella configurazione e nel rendering del componente.
12753
+ */
12754
+ metaInfo: MetaInfo;
12755
+ /**
12756
+ * Input dal componente padre per datasource; usata nella configurazione e nel rendering del componente.
12757
+ */
12758
+ datasource?: BehaviorSubject<DataSourceComponent>;
12759
+ /**
12760
+ * Riferimento a elementi o componenti figli usato dalla logica UI per map.
12761
+ */
12762
+ map?: GoogleMap;
12763
+ /**
12764
+ * Proprieta di stato del componente per dialog visible, usata dalla logica interna e dal template.
12765
+ */
12766
+ dialogVisible: boolean;
12767
+ /**
12768
+ * Proprieta di stato del componente per map center, usata dalla logica interna e dal template.
12769
+ */
12770
+ mapCenter: google.maps.LatLngLiteral;
12771
+ /**
12772
+ * Proprieta di stato del componente per map zoom, usata dalla logica interna e dal template.
12773
+ */
12774
+ mapZoom: number;
12775
+ /**
12776
+ * Modalita' di disegno corrente. Sostituisce `google.maps.drawing.DrawingManager`
12777
+ * deprecato (Maps JavaScript API drawing library, deprecated 2025-08, removed
12778
+ * in versions released starting 2026-05). Implementiamo polygon + circle
12779
+ * manuali via click-handler diretti sulla mappa.
12780
+ */
12781
+ private drawingMode;
12782
+ /**
12783
+ * Listener registrati durante una sessione di drawing: vanno rimossi quando
12784
+ * la sessione si conclude (overlaycomplete equivalente) o cambia modalita'.
12785
+ */
12786
+ private drawingListeners;
12787
+ /**
12788
+ * Stato intermedio per il disegno polygon: vertici accumulati al click,
12789
+ * UX originale Google DrawingManager:
12790
+ * - 1° click → punto visibile (dot)
12791
+ * - click successivi → linea (polyline preview) + altri dot
12792
+ * - click sul 1° dot → chiude il poligono
12793
+ * - dblclick come alternativa di chiusura (compatibilita' con utenti
12794
+ * che si aspettano dblclick)
12795
+ */
12796
+ private polygonVertices;
12797
+ /**
12798
+ * Marker visibili per ogni vertice del polygon in draw (dot rossi).
12799
+ * Tipo `any` perche' AdvancedMarkerElement non e' direttamente nei
12800
+ * tipi `google.maps.*` esposti senza importLibrary('marker').
12801
+ */
12802
+ private polygonVertexMarkers;
12803
+ /**
12804
+ * Polyline di preview che collega i vertici durante il disegno.
12805
+ * Si trasforma in `activePolygon` (closed shape) alla chiusura.
12806
+ */
12807
+ private polylinePreview?;
12808
+ /**
12809
+ * Stato intermedio per il disegno cerchio: center fissato al primo click,
12810
+ * raggio calcolato live al mousemove, fissato al secondo click.
12811
+ */
12812
+ private circleCenter?;
12813
+ private circleStage;
12814
+ /**
12815
+ * Valore corrente selezionato per active polygon, usato dai flussi interattivi del componente.
12816
+ */
12817
+ private activePolygon?;
12818
+ /**
12819
+ * Valore corrente selezionato per active circle, usato dai flussi interattivi del componente.
12820
+ */
12821
+ private activeCircle?;
12822
+ /**
12823
+ * Proprieta di stato del componente per pending operator, usata dalla logica interna e dal template.
12824
+ */
12825
+ pendingOperator: 'maparea' | 'mapdistance' | null;
12826
+ /**
12827
+ * Proprieta di stato del componente per pending value, usata dalla logica interna e dal template.
12828
+ */
12829
+ pendingValue: string | null;
12830
+ /**
12831
+ * Gestisce comportamento UI tramite `openDialog` orchestrando le chiamate `setTimeout` e `initDrawingTools`.
12832
+ */
12833
+ openDialog(): void;
12834
+ /**
12835
+ * Gestisce comportamento UI tramite `closeDialog` con il flusso specifico definito dalla sua implementazione.
12836
+ */
12837
+ closeDialog(): void;
12838
+ /**
12839
+ * Gestisce la logica di `initDrawingTools`. No-op nel nuovo path (i click
12840
+ * handler vengono registrati on-demand in `drawArea`/`drawCircle`); il metodo
12841
+ * resta per compatibilita' con i call site esistenti (es. `openDialog`).
12842
+ */
12843
+ initDrawingTools(): Promise<void>;
12844
+ /**
12845
+ * Avvia il disegno di un'area poligonale: ogni click aggiunge un vertice,
12846
+ * il polygon di preview si aggiorna live, il doppio click chiude la forma
12847
+ * (richiede min 3 vertici). Sostituisce
12848
+ * `drawingManager.setDrawingMode(OverlayType.POLYGON)`.
12849
+ *
12850
+ * Note: il polygon di preview viene creato LAZY al primo click sulla mappa,
12851
+ * non subito al click del bottone. Pre-creare un polygon con `paths: []`
12852
+ * intercettava gli eventi `click` della mappa anche con `clickable: false`
12853
+ * e impediva al listener di firare → l'utente cliccava i bottoni e non
12854
+ * succedeva nulla.
12855
+ */
12856
+ drawArea(): void;
12857
+ /**
12858
+ * Avvia il disegno di un cerchio: il primo click fissa il centro, il
12859
+ * mousemove successivo regola il raggio in tempo reale, il secondo click
12860
+ * lo conferma. Sostituisce `drawingManager.setDrawingMode(OverlayType.CIRCLE)`.
12861
+ */
12862
+ drawCircle(): void;
12863
+ /**
12864
+ * Attacca i listener click/mousemove/dblclick alla mappa Google.
12865
+ * Schedule via `setTimeout` perche' alla prima apertura del dialog il
12866
+ * `<google-map>` ViewChild puo' non aver ancora popolato `googleMap`
12867
+ * (la libreria Maps si carica async). Riprova fino a 10 volte a 100ms.
12868
+ */
12869
+ private scheduleAttachMapListeners;
12870
+ /**
12871
+ * Effettiva attach dei listener. Chiamato da scheduleAttachMapListeners
12872
+ * quando `googleMap` e' pronto.
12873
+ */
12874
+ private attachMapListeners;
12875
+ /**
12876
+ * Cambia il cursore della mappa per dare feedback visivo che la modalita'
12877
+ * di disegno e' attiva (sostituisce il cursore drawingManager-managed).
12878
+ */
12879
+ private applyDrawingCursor;
12880
+ /**
12881
+ * Crea un AdvancedMarkerElement che rappresenta visivamente un vertice
12882
+ * del polygon in fase di disegno (un piccolo dot rosso).
12883
+ * Se `isFirst=true`, aggiunge un click handler per chiudere il polygon
12884
+ * quando l'utente cliccher sul primo vertice (UX classica DrawingManager).
12885
+ */
12886
+ private createVertexMarker;
12887
+ /**
12888
+ * Chiude il polygon: trasforma la polyline preview + i dot vertex in un
12889
+ * Polygon chiuso editabile e applica il filtro `maparea`.
12890
+ */
12891
+ private closePolygonFromFirstVertex;
12892
+ /**
12893
+ * Rimuove i listener registrati nella sessione di drawing corrente e
12894
+ * resetta lo stato. Idempotente.
12895
+ */
12896
+ private exitDrawingMode;
12897
+ /**
12898
+ * Distanza Haversine in metri tra due `LatLng`. Replica
12899
+ * `google.maps.geometry.spherical.computeDistanceBetween` senza forzare
12900
+ * il caricamento della geometry library (che non e' importata da
12901
+ * questo componente).
12902
+ */
12903
+ private haversineMeters;
12904
+ /**
12905
+ * Applica aggiornamenti di stato tramite `applyFilter` con regole guidate dai metadati server `_Metadati_*` (tabella/colonna), preparando/aggiornando il dataset visualizzato.
12906
+ *
12907
+ * Se l'utente ha disegnato una shape ma non l'ha chiusa esplicitamente
12908
+ * (dblclick per polygon, 2° click per circle) prima di premere "Usa
12909
+ * filtro", finalizziamo qui la shape corrente — altrimenti il bottone
12910
+ * sembra non fare nulla. Il legacy `DrawingManager` chiudeva
12911
+ * automaticamente al click sul primo vertice (polygon) / drag-release
12912
+ * (circle); il path manual richiede una gesture esplicita che l'utente
12913
+ * non sempre conosce.
12914
+ */
12915
+ applyFilter(): Promise<void>;
12916
+ /**
12917
+ * Gestisce la logica di `clearFilter` con regole guidate dai metadati server `_Metadati_*` (tabella/colonna), trasformando e filtrando collezioni dati.
12918
+ *
12919
+ * - Rimuove il filtro maparea/mapdistance dal `filterInfo.filters` per il
12920
+ * campo corrente (match field-name case-insensitive per evitare
12921
+ * mismatch di casing client/server).
12922
+ * - Resetta l'override `metaInfo.operators[<field>]` lasciato da
12923
+ * `applyFilter` — altrimenti la UI continua a mostrare lo status
12924
+ * "Filtro area pronto".
12925
+ * - Triggera `fetchData()` cosi' la query si rigenera senza il filtro:
12926
+ * pre-fix il filtro spariva dalla UI ma il prossimo payload (e quindi
12927
+ * l'SQL server-side) includeva ancora `operatore: 'maparea'`.
12928
+ */
12929
+ clearFilter(): Promise<void>;
12930
+ /**
12931
+ * Gestisce la logica di `clearShapes` orchestrando le chiamate `setMap`.
12932
+ * Rimuove polygon + circle dalla mappa, esce da eventuale modalita' di
12933
+ * disegno attiva e svuota lo stato dei vertici accumulati.
12934
+ */
12935
+ clearShapes(): void;
12936
+ /**
12937
+ * Gestisce la logica operativa di `toPolygonWkt` in modo coerente con l'implementazione corrente.
12938
+ * @param polygon Parametro utilizzato dal metodo nel flusso elaborativo.
12939
+ * @returns Stringa risultante calcolata da `toPolygonWkt` per chiavi/label o valori testuali.
12940
+ */
12941
+ private toPolygonWkt;
12942
+ /**
12943
+ * Gestisce la logica operativa di `toCircleExpression` in modo coerente con l'implementazione corrente.
12944
+ * @param circle Parametro utilizzato dal metodo nel flusso elaborativo.
12945
+ * @returns Stringa risultante calcolata da `toCircleExpression` per chiavi/label o valori testuali.
12946
+ */
12947
+ private toCircleExpression;
12948
+ /**
12949
+ * Gestisce la logica operativa di `extractCenterFromFilterValue` in modo coerente con l'implementazione corrente.
12950
+ * @param operator Parametro utilizzato dal metodo nel flusso elaborativo.
12951
+ * @param value Valore in ingresso elaborato o normalizzato dal metodo.
12952
+ * @returns Valore di tipo `{ lat: number; lng: number } | null` prodotto da `extractCenterFromFilterValue`.
12953
+ */
12954
+ private extractCenterFromFilterValue;
12955
+ static ɵfac: i0.ɵɵFactoryDeclaration<PointFilterComponent, never>;
12956
+ static ɵcmp: i0.ɵɵComponentDeclaration<PointFilterComponent, "wuic-point-filter", never, { "record": { "alias": "record"; "required": false; }; "field": { "alias": "field"; "required": false; }; "metaInfo": { "alias": "metaInfo"; "required": false; }; "datasource": { "alias": "datasource"; "required": false; }; }, {}, never, never, true, never>;
12957
+ }
12958
+
12385
12959
  /**
12386
12960
  * CodeEditorComponent (Monaco-based, ~3.4 MB) viene istanziato SOLO attraverso
12387
12961
  * il wrapper `LazyCodeEditorComponent`, che fa l'`import('./code-editor.component')`
@@ -12401,7 +12975,7 @@ declare class LazyFieldEditorComponent implements OnInit {
12401
12975
  * `import('./code-editor.component')` dinamico → esbuild estrae Monaco +
12402
12976
  * CodeEditorComponent + parser SQL/TS in un chunk separato caricato on-demand.
12403
12977
  */
12404
- declare class CodeAreaEditorComponent {
12978
+ declare class CodeAreaEditorComponent implements OnInit {
12405
12979
  /**
12406
12980
  * Input dal componente padre per record; usata nella configurazione e nel rendering del componente.
12407
12981
  */
@@ -12445,6 +13019,13 @@ declare class CodeAreaEditorComponent {
12445
13019
  */
12446
13020
  constructor();
12447
13021
  /**
13022
+ * `customEditorConfig.startInCodeView === true` -> il campo apre DIRETTAMENTE
13023
+ * il code-editor (Monaco) invece della textarea col toggle manuale. Utile
13024
+ * per i campi il cui valore e' sempre codice/JSON strutturato (es. effetti
13025
+ * shader Scene3D, props bag con schema).
13026
+ */
13027
+ ngOnInit(): void;
13028
+ /**
12448
13029
  * Gestisce comportamento UI tramite `toggleEditor` con regole guidate dai metadati server `_Metadati_*` (tabella/colonna).
12449
13030
  * @returns Esito booleano calcolato dal metodo.
12450
13031
  */
@@ -13020,6 +13601,10 @@ type WorkflowStartMenuItem = {
13020
13601
  mm_uri_menu: string;
13021
13602
  mm_ordine: number;
13022
13603
  mm_is_visible_by_default: boolean;
13604
+ /** F8 — badge contatore: route da contare (es. la coda dello step). */
13605
+ mm_badge_route?: string;
13606
+ /** F8 — filterInfo JSON opzionale per il conteggio (array di filterElement). */
13607
+ mm_badge_filter?: string;
13023
13608
  _Metadati_Utenti_Autorizzazioni_Menus: WorkflowMenuAuthorization[];
13024
13609
  };
13025
13610
  type WorkflowNodeSerialized = {
@@ -13037,14 +13622,35 @@ type WorkflowNodeSerialized = {
13037
13622
  }>;
13038
13623
  actionTypeId?: number;
13039
13624
  actionType?: string;
13625
+ actionScopeId?: number;
13626
+ /** Feature L — callback dell'azione INTERNA (concatenata), dal graph_json. */
13627
+ actionCallback?: string;
13040
13628
  routeNodeId?: string;
13041
13629
  metadataTargetType?: 'table_action' | 'column_button' | '';
13630
+ /** Feature I: espressione-guardia dei nodi condition (valutata come guardia di transizione). */
13631
+ conditionExpression?: string;
13632
+ /**
13633
+ * Config del nodo SWITCH: formula JS (`expression`, corpo-funzione con
13634
+ * `record` in scope) + case `{ key, label, condition }`. Le condizioni
13635
+ * confrontano il risultato tramite il token `resultExpression`, sostituito a
13636
+ * runtime con una IIFE della formula (vedi buildSwitchBranchGuard).
13637
+ */
13638
+ switchConfig?: {
13639
+ expression: string;
13640
+ cases: Array<{
13641
+ key: string;
13642
+ label: string;
13643
+ condition: string;
13644
+ }>;
13645
+ } | null;
13042
13646
  metadataTargetId?: number;
13043
13647
  startMenus?: WorkflowStartMenuItem[];
13044
13648
  startMenuCaption?: string;
13045
13649
  startExclusiveMenu?: boolean;
13046
13650
  startShowExit?: boolean;
13047
13651
  routeMetadata?: any;
13652
+ /** F5 — config del parallel_split (route task + mapping campi + rami). */
13653
+ splitConfig?: any;
13048
13654
  };
13049
13655
  type WorkflowConnectionSerialized = {
13050
13656
  id?: string;
@@ -13052,9 +13658,14 @@ type WorkflowConnectionSerialized = {
13052
13658
  sourceOutput: string;
13053
13659
  target: string;
13054
13660
  targetInput: string;
13661
+ /** Feature J: transizione di stato autorata sulla connessione (designer). */
13662
+ transitionEvent?: string;
13663
+ transitionGuard?: string;
13664
+ transitionPermission?: string;
13055
13665
  };
13056
13666
  declare class WorkflowRunnerComponent implements OnInit, OnDestroy {
13057
13667
  private route;
13668
+ private router;
13058
13669
  private dataSrv;
13059
13670
  private runtimeMetadataSrv;
13060
13671
  private runtimeMenuSrv;
@@ -13088,6 +13699,26 @@ declare class WorkflowRunnerComponent implements OnInit, OnDestroy {
13088
13699
  * Identificativo tecnico per route metadata by node id, usato in matching, lookup o routing interno.
13089
13700
  */
13090
13701
  routeMetadataByNodeId: Map<string, any>;
13702
+ /**
13703
+ * Bundle context-only del grafo (route metadata senza nodo corrispondente):
13704
+ * tabelle fisiche bersaglio dei callback, registrate a runtime insieme ai
13705
+ * bundle dei route-node.
13706
+ */
13707
+ contextRouteMetadata: {
13708
+ route: string;
13709
+ action: string;
13710
+ metadata: any;
13711
+ }[];
13712
+ /**
13713
+ * Prima route menu autorizzata per l'utente corrente (calcolata da
13714
+ * applyRuntimeMenus): destinazione del redirect per gli utenti NON superadmin.
13715
+ */
13716
+ private firstAuthorizedRoute;
13717
+ /**
13718
+ * True mentre si sta reindirizzando un utente non-superadmin alla sua prima
13719
+ * voce di menu: nasconde la vista di ispezione (riservata al superadmin).
13720
+ */
13721
+ redirecting: boolean;
13091
13722
  /**
13092
13723
  * Proprieta di stato del componente per param sub, usata dalla logica interna e dal template.
13093
13724
  */
@@ -13096,7 +13727,7 @@ declare class WorkflowRunnerComponent implements OnInit, OnDestroy {
13096
13727
  * Inietta le dipendenze runtime del runner:
13097
13728
  * route param source, provider dati workflow e servizi stato runtime (metadata/menu).
13098
13729
  */
13099
- constructor(route: ActivatedRoute, dataSrv: DataProviderService, runtimeMetadataSrv: WorkflowRuntimeMetadataService, runtimeMenuSrv: WorkflowRuntimeMenuService, userInfo: UserInfoService, trslSrv: TranslationManagerService);
13730
+ constructor(route: ActivatedRoute, router: Router, dataSrv: DataProviderService, runtimeMetadataSrv: WorkflowRuntimeMetadataService, runtimeMenuSrv: WorkflowRuntimeMenuService, userInfo: UserInfoService, trslSrv: TranslationManagerService);
13100
13731
  private t;
13101
13732
  /**
13102
13733
  * Inizializza il componente preparando stato, sottoscrizioni e primi caricamenti richiesti.
@@ -13106,6 +13737,12 @@ declare class WorkflowRunnerComponent implements OnInit, OnDestroy {
13106
13737
  * Rilascia risorse e sottoscrizioni per evitare leak e stati pendenti.
13107
13738
  */
13108
13739
  ngOnDestroy(): void;
13740
+ /**
13741
+ * True se l'utente corrente e' superadmin (flag `ruoli.superadmin`). Solo il
13742
+ * superadmin vede la vista di ispezione del runner; gli altri vengono
13743
+ * reindirizzati alla prima voce di menu del workflow.
13744
+ */
13745
+ get isSuperAdmin(): boolean;
13109
13746
  /**
13110
13747
  * Restituisce il nodo `start` corrente del grafo caricato.
13111
13748
  */
@@ -13130,6 +13767,26 @@ declare class WorkflowRunnerComponent implements OnInit, OnDestroy {
13130
13767
  * poi pubblica il risultato su `runtimeMenuSrv`.
13131
13768
  */
13132
13769
  private applyRuntimeMenus;
13770
+ /**
13771
+ * Gate del runner: il superadmin resta sulla vista di ispezione; ogni altro
13772
+ * utente viene reindirizzato alla prima voce di menu del workflow autorizzata
13773
+ * per lui (fallback home `/` se il workflow non ne prevede nessuna). Usa
13774
+ * `replaceUrl` perche' la pagina runner non deve restare nella history.
13775
+ */
13776
+ private maybeRedirectNonSuperadmin;
13777
+ /**
13778
+ * Prima route navigabile in un albero di `MenuItem` (DFS: scende nei figli,
13779
+ * poi la route del nodo), escludendo la voce Esci (`route === '/'`). Ritorna
13780
+ * null se nessuna voce ha una route utilizzabile.
13781
+ */
13782
+ private findFirstMenuLeafRoute;
13783
+ /**
13784
+ * F8 — risolve i badge contatore delle voci menu runtime (config stashata da
13785
+ * buildStartMenuTree: `__badgeRoute` + `__badgeFilter`): un selectByRoute
13786
+ * pageSize=1 per voce, `totalRowCount` come badge (nascosto se 0). Al termine
13787
+ * ri-emette i menu per far ricostruire gli item al meta-menu. Best-effort.
13788
+ */
13789
+ private resolveStartMenuBadges;
13133
13790
  /**
13134
13791
  * Valuta la visibilita di una voce Start menu in base alle autorizzazioni:
13135
13792
  * priorita `utente+ruolo` > `utente` > `ruolo` > `globale`; fallback al default della voce.
@@ -13164,7 +13821,37 @@ declare class WorkflowRunnerComponent implements OnInit, OnDestroy {
13164
13821
  * Estrae le navigation action collegate a una table action:
13165
13822
  * risolve route sorgente/target dal grafo e allega metadata route target.
13166
13823
  */
13824
+ /**
13825
+ * Feature L — catene di azioni INTERNE (concatenate) a valle delle table
13826
+ * action del grafo: per ogni action "trigger" (metadataTarget table_action,
13827
+ * scope non interno) segue gli archi `out` verso nodi action con scope
13828
+ * INTERNO (2) raccogliendo i callback in ordine. Le catene sono registrate
13829
+ * nel runtime (`setLinkedInternalActions`) ed eseguite dal wrapper action del
13830
+ * data-source DOPO il callback del trigger, passando il payload di ritorno.
13831
+ */
13832
+ private buildLinkedInternalActionEntries;
13833
+ /**
13834
+ * Feature J — gate delle TABLE ACTION per ruolo: un permesso autorato
13835
+ * sull'arco route->action nasconde l'azione (rimossa dall'overlay dello step,
13836
+ * `bundle.tableActions`) agli utenti che non lo soddisfano. Non tocca il
13837
+ * metadata reale della route: vale solo dentro il workflow in esecuzione.
13838
+ * Semantica distinta dal cammino action->...->route (che gata la NAVIGAZIONE).
13839
+ */
13840
+ private gateRouteNodeActionsByPermission;
13167
13841
  private buildLinkedActionRouteMetadataEntries;
13842
+ /**
13843
+ * Guardia di transizione di un RAMO del nodo switch, per SOSTITUZIONE: nella
13844
+ * condizione del case il token `resultExpression` viene rimpiazzato con una
13845
+ * IIFE della formula del nodo, cosi' l'espressione risultante e' valutabile
13846
+ * dal consumer standard (`new Function('record', 'return (expr)')` in
13847
+ * WorkflowRuntimeMetadataService.evaluateLinkedNavigationGuards).
13848
+ *
13849
+ * Esempio: formula `return record.x + record.y`, case `resultExpression <= 1`
13850
+ * → guardia `((function(record){ return record.x + record.y })(record)) <= 1`.
13851
+ * Ramo `else`: congiunzione delle negazioni di tutte le condizioni.
13852
+ * Ritorna '' (nessuna guardia) se formula o condizione mancano.
13853
+ */
13854
+ private buildSwitchBranchGuard;
13168
13855
  /**
13169
13856
  * Normalizza il payload `loadWorkflowGraph` (string/object, alias legacy/nuovi):
13170
13857
  * produce nodi/connessioni tipizzati, metadata route per node id e nome workflow.
@@ -13474,6 +14161,25 @@ declare class WorkflowDesignerRouteComponent implements OnInit {
13474
14161
  static ɵcmp: i0.ɵɵComponentDeclaration<WorkflowDesignerRouteComponent, "wuic-workflow-designer-route", never, {}, {}, never, never, true, never>;
13475
14162
  }
13476
14163
 
14164
+ declare class Scene3dDesignerRouteComponent implements OnInit {
14165
+ private outlet?;
14166
+ /** Componente designer runtime caricato lazy, usato dal template. */
14167
+ loadedComponent: any;
14168
+ ngOnInit(): Promise<void>;
14169
+ /** Delega al designer runtime la conferma navigazione con pending changes. */
14170
+ confirmNavigationWithPendingChanges(): Promise<boolean>;
14171
+ static ɵfac: i0.ɵɵFactoryDeclaration<Scene3dDesignerRouteComponent, never>;
14172
+ static ɵcmp: i0.ɵɵComponentDeclaration<Scene3dDesignerRouteComponent, "wuic-scene3d-designer-route", never, {}, {}, never, never, true, never>;
14173
+ }
14174
+
14175
+ declare class Scene3dViewerRouteComponent implements OnInit {
14176
+ /** Componente viewer runtime caricato lazy, usato dal template. */
14177
+ loadedComponent: any;
14178
+ ngOnInit(): Promise<void>;
14179
+ static ɵfac: i0.ɵɵFactoryDeclaration<Scene3dViewerRouteComponent, never>;
14180
+ static ɵcmp: i0.ɵɵComponentDeclaration<Scene3dViewerRouteComponent, "wuic-scene3d-viewer-route", never, {}, {}, never, never, true, never>;
14181
+ }
14182
+
13477
14183
  /**
13478
14184
  * Lazy wrapper di `<wuic-report-designer>`. Selector dedicato
13479
14185
  * `<wuic-report-designer-lazy>` per essere mountabile da template Angular
@@ -13925,6 +14631,12 @@ declare class DataRepeaterComponent implements OnInit, OnChanges, OnDestroy {
13925
14631
 
13926
14632
  declare const boundedRepeaterPendingChangesGuard: CanDeactivateFn<BoundedRepeaterComponent>;
13927
14633
 
14634
+ /**
14635
+ * Guard di navigazione per il Scene3D Designer — mirror di designerPendingChangesGuard.
14636
+ * Chiede conferma al designer runtime prima di lasciare la route con scena non salvata.
14637
+ */
14638
+ declare const scene3dDesignerPendingChangesGuard: CanDeactivateFn<Scene3dDesignerRouteComponent>;
14639
+
13928
14640
  declare const menuRouteAccessCanMatchGuard: CanMatchFn;
13929
14641
  declare const menuRouteAccessCanActivateGuard: CanActivateFn;
13930
14642
 
@@ -14475,7 +15187,27 @@ type RagProposedActionKind = 'toolbar_action' | 'row_action' | 'table_style' | '
14475
15187
  * Payload: `{kind, route, column_name, display_string, ui_column_type,
14476
15188
  * is_computed, real_column_name?, rationale}`.
14477
15189
  */
14478
- | 'metadata_column_create';
15190
+ | 'metadata_column_create'
15191
+ /**
15192
+ * Iniezione/edit di nodi nel canvas del workflow-designer.
15193
+ *
15194
+ * NB: kind CLIENT-ONLY — NON viene applicato dal backend
15195
+ * `RagController.ApplyAction` ma da un handler registrato dal
15196
+ * workflow-designer.component via `ChatbotHostRegistryService`
15197
+ * (`onChatbotProposedWorkflowAction`). Vedi
15198
+ * docs/pages/_internal/workflow-tool-catalog.md per il catalogo dei tipi
15199
+ * di nodo + config + constraint.
15200
+ *
15201
+ * Payload: `{ kind, action_type: 'inject'|'insert'|'set_property'|'remove'|
15202
+ * 'connect'|'disconnect', nodes?: [{local_id, type, name?, route?, action?,
15203
+ * actionTypeId?, actionScopeId?, x?, y?, conditionExpression?, switchConfig?,
15204
+ * timerConfig?, splitConfig?, actionCallback?}], connections?/disconnect?:
15205
+ * [{source, sourceOutput?, target, targetInput?}], node?/between? (insert),
15206
+ * target_name?/prop_name?/value? (set_property/remove), rationale }`.
15207
+ * Il chatbot popover bypassa `/api/Rag/ApplyAction` quando il registry ha un
15208
+ * handler per questo kind.
15209
+ */
15210
+ | 'workflow_inject';
14479
15211
  interface RagProposedAction {
14480
15212
  kind: RagProposedActionKind | string;
14481
15213
  route?: string;
@@ -15874,5 +16606,5 @@ declare const THEME_OPTIONS: ThemeOption[];
15874
16606
  declare function getThemeOptions(): ThemeOption[];
15875
16607
  declare function getThemePrimaryHex(value: string): string;
15876
16608
 
15877
- export { AUTH_REDIRECT_REASON_KEY, AppSettingsEditorComponent, AuthSessionService, BooleanEditorComponent, BoundedRepeaterComponent, ButtonEditorComponent, CallbackPipe, CallbackPipe2, CarouselListComponent, CodeAreaEditorComponent, ColorEditorComponent, CrashReporterService, CustomAttributesService, CustomException, DataActionButtonComponent, DataProviderOdataService, DataRepeaterComponent, DataSourceComponent, DateEditorComponent, DesignerRouteComponent, DictionaryEditorComponent, DynamicCompilerService, DynamicRowTemplateComponent, FieldEditorComponent, FilterBarComponent, FilterInfo, FormatGridViewValuePipe, GetSrcUploadPreviewPipe, GlobalHandler, HtmlEditorComponent, ImageWrapperComponent, ImportExportButtonComponent, IsSelectedRowPipe, KanbanListComponent, KanbanOptions, KanbanStatusColumnItem, LazyChartListComponent, LazyCodeEditorComponent, LazyDataActionButtonComponent, LazyDataSourceComponent, LazyFieldEditorComponent, LazyFirstRunWizardComponent, LazyImageWrapperComponent, LazyKanbanListComponent, LazyMetaMenuComponent, LazyPivotBuilderComponent, LazyReportDesignerComponent, LazyReportViewerComponent, LazySchedulerListComponent, LazySpreadsheetListSfComponent, LicenseFeatureService, ListGridComponent, LookupEditorComponent, MapListComponent, MetaInfo, MetaMenuComponent, MetadataEditorService, MetadataProviderService, MetadatiColonna, MetadatiTabella, NotificationBellComponent, NotificationRealtimeService, NumberEditorComponent, PRIMARY_PALETTES, PagerComponent, ParametricDialogComponent, PropertyArrayEditorComponent, PropertyObjectEditorComponent, THEME_OPTIONS, TextAreaEditorComponent, TextEditorComponent, TranslationManagerService, TreeListComponent, TreeViewSelectorComponent, UploadDialogComponent, UploadEditorComponent, UserInfoService, ValidationRule, ValueChangedPayload, VisibleFieldListPipe, WUIC_SUPPRESS_GLOBAL_ERROR, WidgetDefinition, WorkflowDesignerRouteComponent, WorkflowRunnerComponent, WorkflowRuntimeMetadataService, WtoolboxService, WuicAziendaSwitcherComponent, WuicErrorDialogComponent, WuicErrorInterceptor, WuicFeatureDirective, WuicFrozenColumnDirective, WuicRagChatbotComponent, WuicRagChatbotFabComponent, WuicRagService, WuicRowTogglerDirective, _PRIMENG_TABLE_DIRECTIVES_NAMES, authExpiredInterceptor, boundedRepeaterPendingChangesGuard, featureRouteCanActivateGuard, featureRouteCanMatchGuard, getThemeOptions, getThemePrimaryHex, inferTemplateFieldFromBaseClass, loadBooleanEditorComponent, loadButtonEditorComponent, loadCodeAreaEditorComponent, loadColorEditorComponent, loadDateEditorComponent, loadDictionaryEditorComponent, loadHtmlEditorComponent, loadLookupEditorComponent, loadNumberEditorComponent, loadPropertyArrayEditorComponent, loadPropertyObjectEditorComponent, loadTextAreaEditorComponent, loadTextEditorComponent, loadTreeViewSelectorComponent, loadUploadEditorComponent, menuRouteAccessCanActivateGuard, menuRouteAccessCanMatchGuard, routes, wuicErrorInterceptor };
15878
- export type { AuthSessionState, Breadcrumb, CompileDynamicComponentOptions, CrashReportPayload, CrashReportingConfig, CustomAttributeDefinition, CustomAttributeResolved, CustomLookupOption, CustomValue, CvUpsertItem, DataSourceAfterSyncEvent, DataSourceBeforeSyncEvent, DataSourceSyncOperation, ErrorDelegate, ErrorDelegateContext, IDataBoundHostComponent, IFieldEditor, KanbanStatusColumn, LicenseStatusResponse, ListGridAfterRenderEvent, ListGridAfterRowRenderEvent, ListGridBeforeRowRenderEvent, MultiDatasourceMeta, NotificationItem, NotifyOptions, RagApplyActionRequest, RagApplyActionResponse, RagAskAcceptedResponse, RagAskRequest, RagChatHistorySnapshot, RagChatMessageDto, RagChatMessageStatus, RagChatRequest, RagChatResponse, RagChatSessionDto, RagChatTurn, RagChatbotTurn, RagCompactRequest, RagCompactResponse, RagHealthResponse, RagProfile, RagProposedAction, RagProposedActionExtraField, RagProposedActionKind, RagQueryRequest, RagQueryResponse, RagRenameSessionRequest, RagRenameSessionResponse, RagSource, RagUpdateProposedActionRequest, RagUpdateProposedActionResponse, RealtimeProgressEvent, ThemeOption, ThemePresetName, ThemePrimaryName, WorkflowRuntimeLinkedActionRouteMetadataEntry, WorkflowRuntimePreviousRouteNodeEntry, WorkflowRuntimeRouteMetadataEntry, WorkflowRuntimeRouteNodePayloadEntry };
16609
+ export { AUTH_REDIRECT_REASON_KEY, AppSettingsEditorComponent, AuthSessionService, BooleanEditorComponent, BoundedRepeaterComponent, ButtonEditorComponent, CallbackPipe, CallbackPipe2, CarouselListComponent, CodeAreaEditorComponent, ColorEditorComponent, CrashReporterService, CustomAttributesService, CustomException, DataActionButtonComponent, DataProviderOdataService, DataRepeaterComponent, DataSourceComponent, DateEditorComponent, DesignerRouteComponent, DictionaryEditorComponent, DynamicCompilerService, DynamicRowTemplateComponent, FieldEditorComponent, FilterBarComponent, FilterInfo, FormatGridViewValuePipe, GetSrcUploadPreviewPipe, GlobalHandler, HtmlEditorComponent, ImageWrapperComponent, ImportExportButtonComponent, IsSelectedRowPipe, KanbanListComponent, KanbanOptions, KanbanStatusColumnItem, LazyChartListComponent, LazyCodeEditorComponent, LazyDataActionButtonComponent, LazyDataSourceComponent, LazyFieldEditorComponent, LazyFirstRunWizardComponent, LazyImageWrapperComponent, LazyKanbanListComponent, LazyMetaMenuComponent, LazyPivotBuilderComponent, LazyReportDesignerComponent, LazyReportViewerComponent, LazySchedulerListComponent, LazySpreadsheetListSfComponent, LicenseFeatureService, ListGridComponent, LookupEditorComponent, MapListComponent, MetaInfo, MetaMenuComponent, MetadataEditorService, MetadataProviderService, MetadatiColonna, MetadatiTabella, NotificationBellComponent, NotificationRealtimeService, NumberEditorComponent, PRIMARY_PALETTES, PagerComponent, ParametricDialogComponent, PointFilterComponent, PropertyArrayEditorComponent, PropertyObjectEditorComponent, Scene3dDesignerRouteComponent, Scene3dViewerRouteComponent, THEME_OPTIONS, TextAreaEditorComponent, TextEditorComponent, TranslationManagerService, TreeListComponent, TreeViewSelectorComponent, UploadDialogComponent, UploadEditorComponent, UserInfoService, ValidationRule, ValueChangedPayload, VisibleFieldListPipe, WUIC_SUPPRESS_GLOBAL_ERROR, WidgetDefinition, WorkflowDesignerRouteComponent, WorkflowRunnerComponent, WorkflowRuntimeMetadataService, WtoolboxService, WuicAziendaSwitcherComponent, WuicErrorDialogComponent, WuicErrorInterceptor, WuicFeatureDirective, WuicFrozenColumnDirective, WuicRagChatbotComponent, WuicRagChatbotFabComponent, WuicRagService, WuicRowTogglerDirective, _PRIMENG_TABLE_DIRECTIVES_NAMES, authExpiredInterceptor, boundedRepeaterPendingChangesGuard, featureRouteCanActivateGuard, featureRouteCanMatchGuard, getThemeOptions, getThemePrimaryHex, inferTemplateFieldFromBaseClass, loadBooleanEditorComponent, loadButtonEditorComponent, loadCodeAreaEditorComponent, loadColorEditorComponent, loadDateEditorComponent, loadDictionaryEditorComponent, loadHtmlEditorComponent, loadLookupEditorComponent, loadNumberEditorComponent, loadPropertyArrayEditorComponent, loadPropertyObjectEditorComponent, loadTextAreaEditorComponent, loadTextEditorComponent, loadTreeViewSelectorComponent, loadUploadEditorComponent, menuRouteAccessCanActivateGuard, menuRouteAccessCanMatchGuard, routes, scene3dDesignerPendingChangesGuard, wuicErrorInterceptor };
16610
+ export type { AuthSessionState, Breadcrumb, CompileDynamicComponentOptions, CrashReportPayload, CrashReportingConfig, CustomAttributeDefinition, CustomAttributeResolved, CustomLookupOption, CustomValue, CvUpsertItem, DataSourceAfterSyncEvent, DataSourceBeforeSyncEvent, DataSourceSyncOperation, ErrorDelegate, ErrorDelegateContext, IDataBoundHostComponent, IFieldEditor, KanbanStatusColumn, LicenseStatusResponse, ListGridAfterRenderEvent, ListGridAfterRowRenderEvent, ListGridBeforeRowRenderEvent, MultiDatasourceMeta, NotificationItem, NotifyOptions, RagApplyActionRequest, RagApplyActionResponse, RagAskAcceptedResponse, RagAskRequest, RagChatHistorySnapshot, RagChatMessageDto, RagChatMessageStatus, RagChatRequest, RagChatResponse, RagChatSessionDto, RagChatTurn, RagChatbotTurn, RagCompactRequest, RagCompactResponse, RagHealthResponse, RagProfile, RagProposedAction, RagProposedActionExtraField, RagProposedActionKind, RagQueryRequest, RagQueryResponse, RagRenameSessionRequest, RagRenameSessionResponse, RagSource, RagUpdateProposedActionRequest, RagUpdateProposedActionResponse, RealtimeProgressEvent, ThemeOption, ThemePresetName, ThemePrimaryName, WorkflowRuntimeInternalActionEntry, WorkflowRuntimeLinkedActionRouteMetadataEntry, WorkflowRuntimePreviousRouteNodeEntry, WorkflowRuntimeRouteMetadataEntry, WorkflowRuntimeRouteNodePayloadEntry };