wuic-framework-lib 1.0.11 → 1.0.20

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 (16) hide show
  1. package/fesm2022/{wuic-framework-lib-chart-list.component-vuzmQW9F.mjs → wuic-framework-lib-chart-list.component-B44k_wZe.mjs} +79 -19
  2. package/fesm2022/{wuic-framework-lib-code-editor.component-BjbIkm4g.mjs → wuic-framework-lib-code-editor.component-D1dy4Dl9.mjs} +261 -261
  3. package/fesm2022/{wuic-framework-lib-designer.component-BM3elB-a.mjs → wuic-framework-lib-designer.component-CnOQbvEH.mjs} +178 -151
  4. package/fesm2022/{wuic-framework-lib-first-run-wizard.component-5tcl67dK.mjs → wuic-framework-lib-first-run-wizard.component-C9lswoxG.mjs} +248 -42
  5. package/fesm2022/{wuic-framework-lib-framework-docs.component-BGcJ7k1X.mjs → wuic-framework-lib-framework-docs.component-B6qNTs5H.mjs} +830 -121
  6. package/fesm2022/{wuic-framework-lib-pivot-builder.component-ChNyMAfi.mjs → wuic-framework-lib-pivot-builder.component-DMk26H0M.mjs} +475 -100
  7. package/fesm2022/{wuic-framework-lib-prompt-dialog-fallback-host.component-DFLR_EmK.mjs → wuic-framework-lib-prompt-dialog-fallback-host.component-y3shST6g.mjs} +5 -5
  8. package/fesm2022/{wuic-framework-lib-report-designer.component-B_SC7VkW.mjs → wuic-framework-lib-report-designer.component-BnngR2eL.mjs} +15 -15
  9. package/fesm2022/{wuic-framework-lib-report-viewer.component-BTK-p8xF.mjs → wuic-framework-lib-report-viewer.component-LGNRIQh2.mjs} +82 -12
  10. package/fesm2022/{wuic-framework-lib-scheduler-list.component-CIoGVf4O.mjs → wuic-framework-lib-scheduler-list.component-DbcFMwx5.mjs} +42 -19
  11. package/fesm2022/{wuic-framework-lib-spreadsheet-list-sf.component-DQ5OxO4j.mjs → wuic-framework-lib-spreadsheet-list-sf.component-DXyRX0YK.mjs} +25 -11
  12. package/fesm2022/{wuic-framework-lib-workflow-designer.component-BHLT4MER.mjs → wuic-framework-lib-workflow-designer.component-Bm719AWV.mjs} +9 -9
  13. package/fesm2022/{wuic-framework-lib-wuic-framework-lib-DDokY6wY.mjs → wuic-framework-lib-wuic-framework-lib-CGCZvtKK.mjs} +3795 -1466
  14. package/fesm2022/wuic-framework-lib.mjs +1 -1
  15. package/package.json +1 -1
  16. package/types/wuic-framework-lib.d.ts +647 -26
@@ -18,7 +18,7 @@ import { GoogleMap, MapInfoWindow, MapPolygon } from '@angular/google-maps';
18
18
  import { MarkerClusterer } from '@googlemaps/markerclusterer';
19
19
  import { SplitButton } from 'primeng/splitbutton';
20
20
  import { Menubar } from 'primeng/menubar';
21
- import { AutoCompleteCompleteEvent } from 'primeng/autocomplete';
21
+ import { AutoComplete, AutoCompleteCompleteEvent } from 'primeng/autocomplete';
22
22
  import { Select } from 'primeng/select';
23
23
  import { PrimeNG } from 'primeng/config';
24
24
  import { Popover } from 'primeng/popover';
@@ -94,11 +94,106 @@ declare class WuicClientException extends Error {
94
94
  });
95
95
  }
96
96
 
97
+ /**
98
+ * Normalized context passed to error delegates registered via
99
+ * {@link GlobalHandler.registerDelegate}.
100
+ *
101
+ * Built from any raw error (HttpErrorResponse, Error, WuicClientException,
102
+ * or arbitrary thrown object) so component delegates can do lookups
103
+ * (e.g. `ctx.message.includes('METADATA_DB_EXISTS_CONFIRM_REQUIRED')`)
104
+ * without caring about the envelope shape.
105
+ */
106
+ interface ErrorDelegateContext {
107
+ /** Raw error as received by the GlobalHandler. */
108
+ error: any;
109
+ /** `errorCode` from the typed-exception envelope (e.g. `errors.server.unhandled`). */
110
+ errorCode?: string;
111
+ /** `args` map from the typed-exception envelope. */
112
+ args?: Record<string, unknown>;
113
+ /** Server's `fallbackMessage` (raw, untranslated). */
114
+ fallbackMessage?: string;
115
+ /** Best-effort merged message — concatenates every plausible source
116
+ * (body.message, body.rootMessage, args.message, fallbackMessage,
117
+ * err.message) so substring matches work regardless of envelope shape. */
118
+ message: string;
119
+ /** HTTP status code, if the error is an HttpErrorResponse. */
120
+ status?: number;
121
+ /** Request URL, if the error is an HttpErrorResponse. */
122
+ url?: string;
123
+ /** True if the raw error looks like an HttpErrorResponse. */
124
+ isHttpError: boolean;
125
+ /** True if the raw error is a typed `WuicClientException`. */
126
+ isClientException: boolean;
127
+ }
128
+ /**
129
+ * Delegate function: returns true (sync or via Promise) to suppress the
130
+ * default error dialog. See {@link GlobalHandler.registerDelegate} for the
131
+ * full contract and async semantics.
132
+ */
133
+ type ErrorDelegate = (ctx: ErrorDelegateContext) => boolean | void | Promise<boolean | void>;
134
+ /**
135
+ * Options for {@link GlobalHandler.notify}: controls how the error is
136
+ * surfaced to the user (toast vs dialog) and what header/severity to use.
137
+ */
138
+ interface NotifyOptions {
139
+ /** True → render as PrimeNG toast (via WtoolboxService.messageNotificationService).
140
+ * False/undefined → full dialog flow (handleError path). Default: false. */
141
+ isToast?: boolean;
142
+ /** Toast header text. Default: 'Errore'. (Toast-only.) */
143
+ summary?: string;
144
+ /** Toast severity (PrimeNG). Default: 'error'. (Toast-only.) */
145
+ severity?: 'success' | 'info' | 'warn' | 'error';
146
+ /** Toast lifetime ms. Default: 6000. (Toast-only.) */
147
+ life?: number;
148
+ /** True → bypass registered delegates (rare; default false). */
149
+ skipDelegates?: boolean;
150
+ }
97
151
  declare class GlobalHandler implements ErrorHandler {
98
152
  static messageNotification: BehaviorSubject<{
99
153
  show: boolean;
100
154
  exception: CustomException;
101
155
  }>;
156
+ /**
157
+ * Flag globale "backend in restart" — quando true, `handleError` non
158
+ * mostra dialog/toast di errore e non inoltra al CrashReporter. Acceso
159
+ * da `app-settings-editor.component.ts:saveAndApply` mentre l'overlay
160
+ * "Riavvio in corso" e' visibile (poll-fail → bump → poll-up). Spento
161
+ * appena il nuovo worker risponde.
162
+ *
163
+ * Razionale: durante il restart il worker e' down per ~5-30s. Tutte le
164
+ * chiamate HTTP correnti (notification polling, crashForward, lazy
165
+ * fetches) falliscono con `ERR_CONNECTION_REFUSED`. Ogni fallimento
166
+ * fa partire `handleError` → dialog "Errore HTTP 0" sotto il dialog
167
+ * "Riavvio in corso". Brutto e fuorviante per l'utente che sta
168
+ * legittimamente aspettando il restart. Soppresso fino a fine restart.
169
+ */
170
+ private static _restartInProgress;
171
+ static setRestartInProgress(value: boolean): void;
172
+ static isRestartInProgress(): boolean;
173
+ /**
174
+ * Auto-bootstrap del CrashReporterService al primo istanziamento del
175
+ * GlobalHandler (registrato dal consumer come `{ provide: ErrorHandler,
176
+ * useClass: GlobalHandler }` → eager-instantiated dal DI Angular al boot).
177
+ *
178
+ * Bug fix 2026-04-28: prima nessun consumer (WuicTest, WuicDemo, CrmApp)
179
+ * chiamava `CrashReporterService.init()` esplicitamente → l'`enabled`
180
+ * restava false → `(globalThis as any).__wuicCrashReporter` mai assegnato
181
+ * → `handleError` saltava silenziosamente il forward → tutti i crash JS
182
+ * (incluse le `TypeError` da librerie 3p come Stimulsoft viewer)
183
+ * non arrivavano mai a `MetaService.crashForward` → e di conseguenza
184
+ * mai al receiver `errors.wuic-framework.com`. Visibile anche dal
185
+ * Network panel browser: nessuna POST a `crashForward` dopo un errore.
186
+ *
187
+ * Centralizzare il bootstrap qui ha questi vantaggi:
188
+ * 1. Niente codice consumer-side richiesto — la lib si auto-attiva.
189
+ * 2. Garantisce che `__wuicCrashReporter` sia popolato PRIMA che
190
+ * `handleError` lo legga (stesso ciclo di costruzione DI).
191
+ * 3. Guard `_bootstrapAttempted`: niente double-init se per qualche
192
+ * ragione GlobalHandler venisse istanziato N volte (es.
193
+ * `handleErrorStatic` ne crea uno transient per request).
194
+ */
195
+ private static _bootstrapAttempted;
196
+ constructor();
102
197
  /**
103
198
  * Static dispatcher — lets framework code that doesn't have access to
104
199
  * the Angular ErrorHandler instance (e.g. the HTTP interceptor)
@@ -112,6 +207,24 @@ declare class GlobalHandler implements ErrorHandler {
112
207
  * Angular zone (e.g. swallowed lifecycle errors).
113
208
  */
114
209
  static emitClientException(exc: WuicClientException): void;
210
+ /**
211
+ * Component-friendly entry point: take an error and surface it to the
212
+ * user as a TOAST (default) or DIALOG, choosing the right message
213
+ * automatically from the typed-exception envelope.
214
+ *
215
+ * Use case: components doing their own try/catch on HTTP calls (e.g.
216
+ * pivot-builder, view-builder) want to show a contextual error in a
217
+ * PrimeNG toast — they used to do
218
+ * `messageService.add({ severity:'error', detail: err.message })`
219
+ * which prints the useless "Http failure response for X: 500 OK".
220
+ * With `notify(err, { isToast:true })` the toast shows the SERVER's
221
+ * `fallbackMessage` / `args.message` from the JsonExceptionFilter envelope.
222
+ *
223
+ * Also runs the registered delegates first, so a marker-intercepting
224
+ * delegate (e.g. wizard's METADATA_DB_EXISTS) can take over and
225
+ * suppress the toast/dialog if it handles the error itself.
226
+ */
227
+ static notify(error: any, opts?: NotifyOptions): void;
115
228
  /**
116
229
  * Optional bootstrap: install window/promise handlers that wrap any
117
230
  * native unhandled error into a typed WuicClientException. Call once
@@ -123,6 +236,25 @@ declare class GlobalHandler implements ErrorHandler {
123
236
  static installWindowHandlers(opts?: {
124
237
  exposeForTests?: boolean;
125
238
  }): void;
239
+ private static delegates;
240
+ private static nextDelegateId;
241
+ /**
242
+ * Register a delegate that intercepts errors before the default dialog.
243
+ * Higher priority delegates are called first; first one returning true
244
+ * suppresses the default dialog and stops further delegate calls.
245
+ * @returns disposer function — call it to unregister (e.g. ngOnDestroy).
246
+ */
247
+ static registerDelegate(fn: ErrorDelegate, opts?: {
248
+ priority?: number;
249
+ }): () => void;
250
+ /** Build a normalized context from a raw error (HttpErrorResponse, Error,
251
+ * WuicClientException, or anything else with .error). */
252
+ private static extractErrorContext;
253
+ /** Iterate delegates; first one returning true suppresses default flow.
254
+ * Async delegates: their Promise is dispatched fire-and-forget; the
255
+ * return value seen here is `Promise` (truthy), which we treat as
256
+ * "delegate took over" → suppress default dialog. */
257
+ private static dispatchToDelegates;
126
258
  handleError(e: any): void;
127
259
  /**
128
260
  * @deprecated Pre-typed-envelope branches. Remove once server migration
@@ -1702,6 +1834,19 @@ declare class DataSourceComponent implements OnInit, OnDestroy {
1702
1834
  */
1703
1835
  private refreshPristineFromCurrent;
1704
1836
  /**
1837
+ * Rebase: sposta la pristine baseline al record corrente e azzera il tracker
1838
+ * dei pending changes. Usato dai custom edit-form component dopo aver
1839
+ * applicato `mc_default_value_callback` async (es. progressivo da stored)
1840
+ * sul record gia' BS-wrappato — senza questo refresh il record `__new=true`
1841
+ * risulterebbe `hasPendingChanges()=true` al primo open del dialog Insert
1842
+ * (i BS.next dei default callback vengono tracciati come edit utente).
1843
+ *
1844
+ * NB: usare SOLO se il record e' `__new=true` (modalita' Insert) e i valori
1845
+ * applicati sono default-set, non user-edit. Su record gia' persistente
1846
+ * questo metodo cancella i changes pendenti -> rischio data loss.
1847
+ */
1848
+ rebasePristineAfterDefaults(): void;
1849
+ /**
1705
1850
  * Pubblica uno stato locale aggiornato su `fetchInfo$` per riallineare i consumer del datasource.
1706
1851
  */
1707
1852
  private publishLocalStateUpdate;
@@ -1833,18 +1978,103 @@ declare class MapOptions implements IDesignerProperties {
1833
1978
  useCurrentLocation: boolean;
1834
1979
  useClusterer: boolean;
1835
1980
  filterByBoundaries: boolean;
1981
+ /**
1982
+ * Pass-through al `google.maps.MapOptions.clickableIcons`. Quando `false`,
1983
+ * Google Maps NON apre la propria info window built-in sui POI cliccati
1984
+ * (negozi, fermate, indirizzi, ecc.) — utile quando l'app deve gestire
1985
+ * solo i click dei marker custom (l'info window del POI di Google
1986
+ * intercetta i click che dovrebbero arrivare al marker e copre l'info
1987
+ * window del framework). Default `undefined` (= comportamento Google,
1988
+ * `true`).
1989
+ */
1990
+ clickableIcons?: boolean;
1836
1991
  customMarkerImageSrc: string;
1837
1992
  customMarkerImageSrcField: string;
1838
1993
  markerContentCallback: string;
1994
+ /**
1995
+ * Campo del record che contiene il colore (CSS string `#rrggbb`) da usare
1996
+ * sul `PinElement` del marker. Ignorato se il record ha
1997
+ * `customMarkerImageSrcField` valorizzato (immagine/SVG ha precedenza).
1998
+ */
1999
+ markerColorField?: string;
1839
2000
  titleField: string;
1840
2001
  infoField: string;
1841
2002
  infoFunction: string;
1842
2003
  itemTemplateString: string;
2004
+ /**
2005
+ * Polyline overlay configurabile via `mdpropsbag.archetypes.map.polyline`.
2006
+ * Quando `enabled=true`, il componente raggruppa i record per `groupByField`,
2007
+ * li ordina per `orderByField` e disegna una `<map-polyline>` per ogni gruppo
2008
+ * unendo i punti `{lat: record[latField], lng: record[lngField]}`.
2009
+ * Caso d'uso: tracciamento percorsi GPS (mezzi, persone, asset) dove ogni
2010
+ * record e' una posizione storicizzata.
2011
+ */
2012
+ polyline?: PolylineOverlayOptions;
1843
2013
  constructor();
1844
2014
  init(metaInfo: MetaInfo): void;
1845
2015
  archetypePropName: string;
1846
2016
  getDesignerProps(metaInfo: MetaInfo, action: BehaviorSubject<any>): MetaInfo;
1847
2017
  }
2018
+ /**
2019
+ * Configurazione overlay polyline per archetype map. Permette di trasformare un
2020
+ * elenco di record (es. posizioni GPS storicizzate) in una o piu' polyline,
2021
+ * raggruppate per un campo (es. mezzo_id) e ordinate per un campo (es. timestamp).
2022
+ *
2023
+ * Le coordinate vengono lette dalla colonna `point` esistente sulla tabella/view
2024
+ * (auto-detect: la stessa colonna che il map-list usa per i marker). Per usarla,
2025
+ * la tabella DEVE avere una colonna con `mc_ui_column_type='point'` contenente
2026
+ * JSON `{"lat":..,"lng":..}`.
2027
+ *
2028
+ * Quando `snapToRoads=true` il componente usa Google DirectionsService per
2029
+ * snappare i waypoint alle strade reali (max 25 waypoint per chiamata; se ci
2030
+ * sono piu' punti viene fatto batching automatico).
2031
+ */
2032
+ interface PolylineOverlayOptions {
2033
+ enabled: boolean;
2034
+ /** Campo record per raggruppare (es. 'mezzo_id'). Se omesso → 1 sola polyline globale. */
2035
+ groupByField?: string;
2036
+ /** Campo record per ordinare i punti dentro ogni gruppo (es. 'timestamp_pos'). */
2037
+ orderByField?: string;
2038
+ /**
2039
+ * Campo record alternativo per leggere le coordinate (auto-detect via
2040
+ * colonna `point` se omesso). Utile se la tabella/view ha piu' colonne
2041
+ * point e vuoi specificare quale usare per la polyline.
2042
+ */
2043
+ pointField?: string;
2044
+ /**
2045
+ * Campo record che contiene il colore della polyline (CSS string `#rrggbb`).
2046
+ * Quando valorizzato, il colore viene letto dal primo record del gruppo
2047
+ * (assume omogeneita' per gruppo) e sovrascrive `strokeColor` /
2048
+ * `strokeColorByGroup`. Tipico use-case: colore configurato sul mezzo
2049
+ * (FK lookup) e portato nella view sorgente.
2050
+ */
2051
+ colorField?: string;
2052
+ /** Colore tratto polyline (default `#1d4ed8`). */
2053
+ strokeColor?: string;
2054
+ /** Se true, ogni gruppo riceve un colore distinto (palette interna). */
2055
+ strokeColorByGroup?: boolean;
2056
+ /** Spessore tratto in pixel (default 4). */
2057
+ strokeWeight?: number;
2058
+ /** Opacita 0..1 (default 0.85). */
2059
+ strokeOpacity?: number;
2060
+ /** Se true, snappa la polyline alle strade reali via Google DirectionsService. */
2061
+ snapToRoads?: boolean;
2062
+ /** Se false, nasconde i marker (mostra solo la polyline). Default true. */
2063
+ showMarkers?: boolean;
2064
+ /** Modalita di viaggio per snapToRoads (`DRIVING` default, `WALKING`, `BICYCLING`). */
2065
+ travelMode?: 'DRIVING' | 'WALKING' | 'BICYCLING';
2066
+ /**
2067
+ * Se true, oltre alla polyline disegna un dot (`<map-circle>`) sulle
2068
+ * coordinate originali di ciascun record. Utile per distinguere visivamente
2069
+ * i punti GPS realmente storicizzati dal path interpolato/snapped.
2070
+ * Default false.
2071
+ */
2072
+ showWaypointDots?: boolean;
2073
+ /**
2074
+ * Raggio in metri del dot (cerchio reale, scala con lo zoom). Default 8.
2075
+ */
2076
+ waypointDotRadius?: number;
2077
+ }
1848
2078
  declare class Point {
1849
2079
  lat: number;
1850
2080
  lng: number;
@@ -2246,7 +2476,7 @@ declare class MetadatiTabella {
2246
2476
  * Flag toolbar-level controllati da `md_props_bag.toolbar.*` (JSON).
2247
2477
  * Cambiabili per-route senza toccare lo schema SQL di
2248
2478
  * `_metadati__tabelle`. Esempio in `md_props_bag`:
2249
- * { "toolbar": { "hideManageState": true } }
2479
+ * { "toolbar": { "hideManageState": true, "hideBatchActions": true } }
2250
2480
  *
2251
2481
  * - `hideManageState`: nasconde il bottone "Gestione stato"
2252
2482
  * (icona bookmark) + la select degli stati salvati nella
@@ -2254,9 +2484,18 @@ declare class MetadatiTabella {
2254
2484
  * demo dove il saved-state feature (persistenza user_id +
2255
2485
  * route via MetaService) non ha senso — es. Pattern 3 puro
2256
2486
  * OData senza route metadata registrata.
2487
+ * - `hideBatchActions`: nasconde dalla caption-left i pulsanti
2488
+ * "Salva modifiche" / "Annulla modifiche" + l'indicatore
2489
+ * conteggio changes (badge pencil + count) generati quando
2490
+ * `md_inline_cell_editing` + `md_batch_save` sono attivi.
2491
+ * Utile per nested grid (es. righe documento dentro un
2492
+ * parametric-dialog) dove il save/cancel del padre persiste
2493
+ * master + righe in un colpo via batch save framework e i
2494
+ * duplicati toolbar sulla nested confondono l'UX.
2257
2495
  */
2258
2496
  toolbar?: {
2259
2497
  hideManageState?: boolean;
2498
+ hideBatchActions?: boolean;
2260
2499
  };
2261
2500
  /**
2262
2501
  * Tuning server-side letto da `DataProviderMetaService.select`
@@ -3012,6 +3251,16 @@ declare class MetadataProviderService {
3012
3251
  value: string;
3013
3252
  type: string;
3014
3253
  }>>;
3254
+ /**
3255
+ * Elimina un report (file `.mrt`) e relativo cleanup metadata via `MetaService.removeReport`.
3256
+ * Solo gli utenti admin possono effettivamente cancellare; il backend ritorna `false` per non-admin.
3257
+ * Dopo successo invalida la cache report-list locale per la route, cosi' il prossimo
3258
+ * `getReportList` ricarica dal backend.
3259
+ * @param route Route applicativa che ospita il report.
3260
+ * @param name Nome file `.mrt` da rimuovere.
3261
+ * @returns `true` se la cancellazione e' andata a buon fine.
3262
+ */
3263
+ removeReport(route: string, name: string): Promise<boolean>;
3015
3264
  static ɵfac: i0.ɵɵFactoryDeclaration<MetadataProviderService, never>;
3016
3265
  static ɵprov: i0.ɵɵInjectableDeclaration<MetadataProviderService>;
3017
3266
  }
@@ -3212,6 +3461,18 @@ declare class DataProviderMetaService {
3212
3461
  * additional columns alongside the text field).
3213
3462
  */
3214
3463
  static buildSlimComboRestriction(field: MetadatiColonna | null | undefined): string[];
3464
+ /**
3465
+ * Sanitize di un body HTTP rimuovendo qualunque BehaviorSubject (e
3466
+ * BS-of-BS) che potrebbe essere finito dentro `filterInfo`,
3467
+ * `currentRecord`, slot di un record BS-wrapped, ecc. Pre-serializza
3468
+ * con replacer BS-aware e parse back: il risultato e' un body plain
3469
+ * che Angular `HttpRequest.serializeBody` puo' stringificare senza
3470
+ * "Converting circular structure to JSON" (SafeSubscriber →
3471
+ * Subscription._finalizers → _parentage). Da usare in tutti i
3472
+ * `http.post`/`http.put` che possono ricevere payload provenienti da
3473
+ * datasource reattive.
3474
+ */
3475
+ static sanitizeBodyForHttp(body: any): any;
3215
3476
  /**
3216
3477
  * Carica i dati della route corrente chiamando `MetaService.getFlatRecordData` (`MetadataProviderService.readUri`).
3217
3478
  * Invia paginazione/ordinamenti/gruppi/filtri/aggregazioni e `has_server_operation`, poi mappa la risposta
@@ -4267,6 +4528,36 @@ declare class WtoolboxService {
4267
4528
  suggestColumnMD(record: {
4268
4529
  [key: string]: BehaviorSubject<any>;
4269
4530
  }, field: MetadatiColonna, type: string, routeRef?: string): Promise<void>;
4531
+ /**
4532
+ * Suggest del campo `mc_ui_lookup_computed_dataTextField` (Lookup
4533
+ * Computed Data Text Field — formula display nella grid del parent):
4534
+ * apre albero da `MetaService.getLookupListByIDLevelUP` (root = tabella
4535
+ * proprietaria di mc_id, con i lookup edges per navigare alle target)
4536
+ * e genera il select con `appendOnly=2` (JOIN alias `<colFK>_<target>`
4537
+ * coerente con quello costruito da JoinBuilder a runtime nella query
4538
+ * della grid). Vedi anche `suggestLookupComputedEdit` per il caso
4539
+ * speculare nel field-editor.
4540
+ * @param record Record metadata corrente (`mc_id` usato dal backend).
4541
+ * @param field Campo formula da aggiornare.
4542
+ */
4543
+ suggestLookupComputed(record: {
4544
+ [key: string]: BehaviorSubject<any>;
4545
+ }, field: MetadatiColonna): Promise<void>;
4546
+ /**
4547
+ * Suggest del campo `mc_ui_lookup_combo_text_edit_computed_dataTextField`
4548
+ * (Lookup Edit Text Computed Formula — testo del lookup nel field-editor):
4549
+ * apre albero da `MetaService.getLookupListFromLookupTarget` con root
4550
+ * spostata sulla TABELLA TARGET del lookup (es. mc_id=`prodotto_id` -> root
4551
+ * `prodotti` con i suoi campi `codice`/`descrizione`/...). Genera il
4552
+ * select con `appendOnly=3` -> qualifier `[<targetTable>].[<col>]`
4553
+ * (es. `[prodotti].[codice]`), perche' la formula gira in un SELECT
4554
+ * diretto sulla target nel field-editor, senza JOIN alias.
4555
+ * @param record Record metadata corrente (`mc_id` usato dal backend).
4556
+ * @param field Campo formula da aggiornare.
4557
+ */
4558
+ suggestLookupComputedEdit(record: {
4559
+ [key: string]: BehaviorSubject<any>;
4560
+ }, field: MetadatiColonna): Promise<void>;
4270
4561
  /**
4271
4562
  * Costruisce formula computed partendo da gerarchia lookup: apre albero da
4272
4563
  * `MetaService.getLookupListByIDLevelUP` e invia la selezione a `getClauseByLookupHierarchy`
@@ -5078,6 +5369,14 @@ declare class ListGridComponent implements AfterViewInit, OnInit, OnDestroy, IDa
5078
5369
  hardcodedDatasource: DataSourceComponent;
5079
5370
  rowCustomSelect: (rowData: any, $event: any, dt: Table) => void;
5080
5371
  hideToolbar: boolean;
5372
+ /**
5373
+ * Provider letto da `<wuic-import-export-button>` al click su Export XLS.
5374
+ * Arrow function (NON metodo) per preservare il binding di `this` quando
5375
+ * passata come Input — un metodo verrebbe richiamato col `this` del child.
5376
+ * Ritorna lo stato filtri LIVE del datasource: include i filtri applicati
5377
+ * via header/filter-bar che NON vengono propagati nella URL query string.
5378
+ */
5379
+ getCurrentFilterInfoForExport: () => any;
5081
5380
  /**
5082
5381
  * Evento emesso subito prima del rendering logico della singola riga.
5083
5382
  * Il consumer puo annullare la riga chiamando `cancelRender()`.
@@ -5127,6 +5426,15 @@ declare class ListGridComponent implements AfterViewInit, OnInit, OnDestroy, IDa
5127
5426
  private outerTheadObserveRetryTimer?;
5128
5427
  records: any[];
5129
5428
  cols: any[];
5429
+ /**
5430
+ * Constant CSS value for `<col>`/`<th>` min-width binding. Pulled into a
5431
+ * field (instead of `getColumnMinWidthCss()` method) so the template binding
5432
+ * `[style.min-width]="columnMinWidthCss"` resolves to a property read
5433
+ * (no function call) and Angular's change-detection short-circuits when
5434
+ * the value didn't change. Saves ~3 function calls per column per CD cycle
5435
+ * (template uses it on `<col>`, header `<th>`, and filter row `<th>`).
5436
+ */
5437
+ readonly columnMinWidthCss = "10px";
5130
5438
  metas: MetadatiColonna[];
5131
5439
  metaInfo: MetaInfo;
5132
5440
  routeName: string;
@@ -6141,6 +6449,11 @@ declare class ListGridComponent implements AfterViewInit, OnInit, OnDestroy, IDa
6141
6449
  /**
6142
6450
  * Restituisce il valore CSS per `min-width` sulle colonne della tabella.
6143
6451
  * @returns Valore CSS da applicare.
6452
+ *
6453
+ * NOTE: per i template binding usare direttamente il field
6454
+ * `columnMinWidthCss`. Questa funzione resta solo per i call-site interni
6455
+ * (TS) che la consumano via `getColumnMinWidthForCol` o
6456
+ * `Number.parseFloat(getColumnMinWidthCss())`.
6144
6457
  */
6145
6458
  getColumnMinWidthCss(): string;
6146
6459
  /**
@@ -6480,8 +6793,25 @@ declare class ImportExportButtonComponent {
6480
6793
  private notificationRealtime;
6481
6794
  private trslSrv;
6482
6795
  private userInfo;
6796
+ private cdr;
6483
6797
  routeName: string;
6484
6798
  tableMetadata: any;
6799
+ /**
6800
+ * Callback opzionale fornito dal componente host (list-grid, spreadsheet-list-sf, ...)
6801
+ * per leggere il `filterInfo` corrente del datasource al momento del click su Export.
6802
+ *
6803
+ * Razionale: prima del fix, l'export leggeva il filtro SOLO dalla query string
6804
+ * (`?filterInfo=...`), che NON viene aggiornata quando l'utente filtra in-grid via
6805
+ * intestazioni di colonna o filter-bar — la URL resta `/cities/list` mentre lo stato
6806
+ * filtri vive in `datasource.value.filterInfo`. Risultato: l'XLS scaricato conteneva
6807
+ * SEMPRE l'intero dataset ignorando il filtro applicato.
6808
+ *
6809
+ * Il provider e' una funzione (non un binding `@Input() filterInfo: any`) per garantire
6810
+ * che venga letto il valore CORRENTE al click, non quello catturato all'ultima CD.
6811
+ * Fallback (provider non bindato): `parseFilterInfoFromQueryString()` per back-compat
6812
+ * con eventuali host esterni che non passano il provider.
6813
+ */
6814
+ filterInfoProvider?: () => any;
6485
6815
  importFileInputRef?: ElementRef<HTMLInputElement>;
6486
6816
  private popupMenuItemsCache;
6487
6817
  private popupMenuItemsCacheKey;
@@ -6526,7 +6856,7 @@ declare class ImportExportButtonComponent {
6526
6856
  private exportMonitoringOnly;
6527
6857
  private lastHandledExportResumeGuid;
6528
6858
  private exportBackgroundNotifiedGuids;
6529
- constructor(route: ActivatedRoute, dataSrv: DataProviderService, dataMetaSrv: DataProviderMetaService, notificationRealtime: NotificationRealtimeService, trslSrv: TranslationManagerService, userInfo: UserInfoService);
6859
+ constructor(route: ActivatedRoute, dataSrv: DataProviderService, dataMetaSrv: DataProviderMetaService, notificationRealtime: NotificationRealtimeService, trslSrv: TranslationManagerService, userInfo: UserInfoService, cdr: ChangeDetectorRef);
6530
6860
  private t;
6531
6861
  get canExportXls(): boolean;
6532
6862
  get canImportXls(): boolean;
@@ -6562,7 +6892,7 @@ declare class ImportExportButtonComponent {
6562
6892
  private applyImportProgressValue;
6563
6893
  private stopImportProgressPolling;
6564
6894
  static ɵfac: i0.ɵɵFactoryDeclaration<ImportExportButtonComponent, never>;
6565
- static ɵcmp: i0.ɵɵComponentDeclaration<ImportExportButtonComponent, "wuic-import-export-button", never, { "routeName": { "alias": "routeName"; "required": false; }; "tableMetadata": { "alias": "tableMetadata"; "required": false; }; }, {}, never, never, true, never>;
6895
+ static ɵcmp: i0.ɵɵComponentDeclaration<ImportExportButtonComponent, "wuic-import-export-button", never, { "routeName": { "alias": "routeName"; "required": false; }; "tableMetadata": { "alias": "tableMetadata"; "required": false; }; "filterInfoProvider": { "alias": "filterInfoProvider"; "required": false; }; }, {}, never, never, true, never>;
6566
6896
  }
6567
6897
 
6568
6898
  declare class PagerComponent implements OnInit, OnChanges, OnDestroy {
@@ -6797,6 +7127,14 @@ declare class FilterBarComponent implements OnInit, OnChanges, OnDestroy {
6797
7127
  * a bloated, unreadable URL with duplicated filter serializations.
6798
7128
  */
6799
7129
  skipUrlSync: boolean;
7130
+ /**
7131
+ * Quando true, il filter-bar non lancia `datasource.value.fetchData()` (e
7132
+ * quindi nessuna `MetaService.getFlatRecordData`) sugli apply* — emette solo
7133
+ * gli output. Usato dal pivot-builder dove il `nestedSource` non rappresenta
7134
+ * una grid visibile: la SQL preview viene rigenerata via
7135
+ * `previewViewDefinition` come reazione agli output, niente fetch sul route.
7136
+ */
7137
+ skipFetch: boolean;
6800
7138
  filterApplied: EventEmitter<void>;
6801
7139
  onFilterApplied: EventEmitter<{
6802
7140
  mode: "basic" | "advanced" | "clear";
@@ -6939,7 +7277,7 @@ declare class FilterBarComponent implements OnInit, OnChanges, OnDestroy {
6939
7277
  private syncGridStateQueryString;
6940
7278
  private resetCursorPagingState;
6941
7279
  static ɵfac: i0.ɵɵFactoryDeclaration<FilterBarComponent, never>;
6942
- static ɵcmp: i0.ɵɵComponentDeclaration<FilterBarComponent, "wuic-filter-bar", never, { "datasource": { "alias": "datasource"; "required": false; }; "hardcodedDatasource": { "alias": "hardcodedDatasource"; "required": false; }; "multiDatasourceMetas": { "alias": "multiDatasourceMetas"; "required": false; }; "skipUrlSync": { "alias": "skipUrlSync"; "required": false; }; }, { "filterApplied": "filterApplied"; "onFilterApplied": "onFilterApplied"; "onSortingApplied": "onSortingApplied"; "onPageSizeApplied": "onPageSizeApplied"; "onGroupingChanged": "onGroupingChanged"; "onFilterBarCollapseChanged": "onFilterBarCollapseChanged"; }, never, never, true, never>;
7280
+ static ɵcmp: i0.ɵɵComponentDeclaration<FilterBarComponent, "wuic-filter-bar", never, { "datasource": { "alias": "datasource"; "required": false; }; "hardcodedDatasource": { "alias": "hardcodedDatasource"; "required": false; }; "multiDatasourceMetas": { "alias": "multiDatasourceMetas"; "required": false; }; "skipUrlSync": { "alias": "skipUrlSync"; "required": false; }; "skipFetch": { "alias": "skipFetch"; "required": false; }; }, { "filterApplied": "filterApplied"; "onFilterApplied": "onFilterApplied"; "onSortingApplied": "onSortingApplied"; "onPageSizeApplied": "onPageSizeApplied"; "onGroupingChanged": "onGroupingChanged"; "onFilterBarCollapseChanged": "onFilterBarCollapseChanged"; }, never, never, true, never>;
6943
7281
  }
6944
7282
 
6945
7283
  declare class LazySchedulerListComponent implements OnInit {
@@ -7088,7 +7426,7 @@ interface IDesigner<T extends IDesignerProperties> {
7088
7426
  archetypeOptions: T;
7089
7427
  }
7090
7428
 
7091
- declare class MapListComponent implements OnInit, IBindable, IDesigner<MapOptions>, IDataBoundHostComponent {
7429
+ declare class MapListComponent implements OnInit, AfterViewInit, OnDestroy, IBindable, IDesigner<MapOptions>, IDataBoundHostComponent {
7092
7430
  private titleService;
7093
7431
  private cd;
7094
7432
  private route;
@@ -7122,10 +7460,6 @@ declare class MapListComponent implements OnInit, IBindable, IDesigner<MapOption
7122
7460
  * Proprieta di stato del componente per place lib, usata dalla logica interna e dal template.
7123
7461
  */
7124
7462
  PLACE_LIB: google.maps.PlacesLibrary;
7125
- /**
7126
- * Proprieta di stato del componente per drawing lib, usata dalla logica interna e dal template.
7127
- */
7128
- DRAWING_LIB: google.maps.DrawingLibrary;
7129
7463
  /**
7130
7464
  * Input dal componente padre per hardcoded route; usata nella configurazione e nel rendering del componente.
7131
7465
  */
@@ -7269,6 +7603,34 @@ declare class MapListComponent implements OnInit, IBindable, IDesigner<MapOption
7269
7603
  * Collezione dati per data, consumata dal rendering e dalle operazioni del componente.
7270
7604
  */
7271
7605
  data: any[];
7606
+ /**
7607
+ * Polyline overlay calcolate da `parseData` quando
7608
+ * `archetypeOptions.polyline.enabled=true`. Una polyline per gruppo
7609
+ * (`groupByField`), ordinate per `orderByField`. Renderizzate via
7610
+ * `<map-polyline>` nel template.
7611
+ */
7612
+ polylines: {
7613
+ path: {
7614
+ lat: number;
7615
+ lng: number;
7616
+ }[];
7617
+ options: any;
7618
+ group: any;
7619
+ }[];
7620
+ /**
7621
+ * Dot sui waypoint originali (coordinate reali dei record) renderizzati
7622
+ * via `<map-circle>` quando `archetypeOptions.polyline.showWaypointDots=true`.
7623
+ * Utile per distinguere i punti GPS storicizzati dal path interpolato/snapped.
7624
+ */
7625
+ polylineDots: {
7626
+ center: {
7627
+ lat: number;
7628
+ lng: number;
7629
+ };
7630
+ options: any;
7631
+ group: any;
7632
+ record: any;
7633
+ }[];
7272
7634
  /**
7273
7635
  * Configurazione di presentazione per item template string, usata nel rendering del componente.
7274
7636
  */
@@ -7436,6 +7798,21 @@ declare class MapListComponent implements OnInit, IBindable, IDesigner<MapOption
7436
7798
  * Rilascia risorse e sottoscrizioni per evitare leak e stati pendenti.
7437
7799
  */
7438
7800
  ngOnDestroy(): void;
7801
+ /** Cleanup function per ogni listener gmp-click attivo. */
7802
+ private markerGmpClickCleanups;
7803
+ /** Subscription a `markerElements.changes`. */
7804
+ private markerElementsChangesSub?;
7805
+ ngAfterViewInit(): void;
7806
+ /**
7807
+ * Iterazione `markerElements` ↔ `data.filter(__marker)` in parallelo
7808
+ * (stesso ordine di rendering). Per ogni AdvancedMarkerElement:
7809
+ * - removeEventListener su quello vecchio (cleanup);
7810
+ * - addEventListener('gmp-click', ...) sul nuovo, capturando record/marker
7811
+ * nello scope per chiamare `openInfo` esattamente come faceva
7812
+ * `(mapClick)="openInfo(markerElem, record.__marker)"`.
7813
+ */
7814
+ private wireMarkerGmpClick;
7815
+ private detachAllMarkerGmpClick;
7439
7816
  /**
7440
7817
  * Si sottoscrive a `fetchInfo$` del datasource, aggiorna metadati/viewport e inizializza Google Maps al primo caricamento.
7441
7818
  * Nei caricamenti successivi ripopola marker/poligoni e aggiorna clusterer e resize pass.
@@ -7454,11 +7831,54 @@ declare class MapListComponent implements OnInit, IBindable, IDesigner<MapOption
7454
7831
  */
7455
7832
  parseData(data: any): any;
7456
7833
  /**
7834
+ * Costruisce le polyline overlay dai record applicando
7835
+ * `archetypeOptions.polyline`. Ogni gruppo (`groupByField`) → 1 polyline
7836
+ * con path ordinato per `orderByField`. Estende `bounds` cosi' fitBounds
7837
+ * include i punti del percorso.
7838
+ *
7839
+ * Se `snapToRoads=true`, dopo il render iniziale (path = punti raw) viene
7840
+ * lanciato `snapPolylinesToRoads()` async che chiama Google DirectionsService
7841
+ * e sostituisce ogni `path` con `overview_path` della rotta calcolata.
7842
+ */
7843
+ buildPolylines(data: any[], bounds: google.maps.LatLngBounds): {
7844
+ path: {
7845
+ lat: number;
7846
+ lng: number;
7847
+ }[];
7848
+ options: any;
7849
+ group: any;
7850
+ }[];
7851
+ /**
7852
+ * Snap async delle polyline alle strade reali. Usa la nuova
7853
+ * **Routes API** (`google.maps.routes.Route.computeRoutes`) che sostituisce
7854
+ * `DirectionsService` deprecato dal 2026-02-25. Fallback automatico a
7855
+ * `DirectionsService` legacy se la libreria `routes` non e' disponibile
7856
+ * o la chiamata fallisce (key senza "Routes API" abilitata, ecc.).
7857
+ *
7858
+ * Migration guide: https://developers.google.com/maps/documentation/javascript/routes/routes-js-migration
7859
+ *
7860
+ * Limite waypoint per chiamata = 25 (origin + 23 intermediates + destination):
7861
+ * polyline piu' lunghe vengono chunkate.
7862
+ *
7863
+ * Travel mode legacy → routes mapping: DRIVING→DRIVE, WALKING→WALK,
7864
+ * BICYCLING→BICYCLE.
7865
+ */
7866
+ private snapPolylinesToRoads;
7867
+ /**
7457
7868
  * Recupera i dati/valori richiesti da `getMarkerContent`.
7458
7869
  * @param record Dato/record su cui il metodo applica elaborazioni o aggiornamenti.
7459
7870
  * @returns Valore risolto da `getMarkerContent` in base ai criteri implementati.
7460
7871
  */
7461
7872
  getMarkerContent(record: any): any;
7873
+ /**
7874
+ * Costruisce un HTMLElement marker-content da una stringa che puo' essere:
7875
+ * - SVG inline (`<svg ...>...</svg>`) → wrappato in un `<div>` per renderlo
7876
+ * un AdvancedMarker content valido (deve essere un Element, non un
7877
+ * DocumentFragment). Dimensioni controllate dal viewBox dell'SVG.
7878
+ * - URL immagine (http/https/data:image/...) → `<img src>`.
7879
+ * - Stringa vuota / null → null (caller usa il fallback successivo).
7880
+ */
7881
+ private buildMarkerVisualFromValue;
7462
7882
  /**
7463
7883
  * Restituisce una Promise che wrappa `navigator.geolocation.getCurrentPosition`.
7464
7884
  * @returns Posizione geolocalizzata del browser oppure errore se non disponibile/negata.
@@ -7618,6 +8038,15 @@ declare class MapListComponent implements OnInit, IBindable, IDesigner<MapOption
7618
8038
  * Apre l'info window del marker selezionato valorizzando `infoContent` con il template record.
7619
8039
  */
7620
8040
  openInfo(markerElem: any, marker: any): void;
8041
+ /**
8042
+ * Apre l'info window su un waypoint (`<map-circle>`) della polyline overlay.
8043
+ * Riusa lo stesso `itemTemplate` del marker principale: il record del
8044
+ * waypoint contiene tutti i campi (incluso `timestamp_pos`, `velocita_kmh`,
8045
+ * `note`, ecc.) che il template puo' leggere via `rowData.record?.<field>`.
8046
+ * L'anchor non e' un marker — passiamo la posizione esplicita via
8047
+ * `infoWindowOptions.position`.
8048
+ */
8049
+ openWaypointInfo(dot: any, $event?: any): void;
7621
8050
  /**
7622
8051
  * Apre la stessa info window usata dai marker quando l'utente clicca un poligono.
7623
8052
  * Se non e disponibile un anchor marker, usa la posizione click o il centro geometrico del poligono.
@@ -7745,7 +8174,7 @@ declare class MapListComponent implements OnInit, IBindable, IDesigner<MapOption
7745
8174
  static ɵcmp: i0.ɵɵComponentDeclaration<MapListComponent, "wuic-map-list", never, { "hardcodedRoute": { "alias": "hardcodedRoute"; "required": false; }; "parentRecord": { "alias": "parentRecord"; "required": false; }; "parentMetaInfo": { "alias": "parentMetaInfo"; "required": false; }; "datasource": { "alias": "datasource"; "required": false; }; "hardcodedDatasource": { "alias": "hardcodedDatasource"; "required": false; }; "hideToolbar": { "alias": "hideToolbar"; "required": false; }; }, { "onMapClick": "onMapClick"; "onMarkerDragStart": "onMarkerDragStart"; "onMarkerDragEnd": "onMarkerDragEnd"; "onMarkerClick": "onMarkerClick"; "onPolygonClick": "onPolygonClick"; "onPolygonShapeChangedEvent": "onPolygonShapeChangedEvent"; "onMapDataBound": "onMapDataBound"; "onMapBoundsChanged": "onMapBoundsChanged"; "onMapCenterChanged": "onMapCenterChanged"; "onMapContextMenu": "onMapContextMenu"; "onMapDrag": "onMapDrag"; "onMapDragEnd": "onMapDragEnd"; "onMapDragStart": "onMapDragStart"; "onMapMouseMove": "onMapMouseMove"; "onMapMouseOut": "onMapMouseOut"; "onMapMouseOver": "onMapMouseOver"; "onMapResize": "onMapResize"; "onMapZoomChanged": "onMapZoomChanged"; }, never, never, true, never>;
7746
8175
  }
7747
8176
 
7748
- declare class CarouselListComponent implements IBindable, IDesigner<CarouselOptions>, AfterViewInit, OnDestroy, IDataBoundHostComponent {
8177
+ declare class CarouselListComponent implements IBindable, IDesigner<CarouselOptions>, OnInit, AfterViewInit, OnDestroy, IDataBoundHostComponent {
7749
8178
  private titleService;
7750
8179
  private cd;
7751
8180
  private route;
@@ -8002,7 +8431,7 @@ declare class LazySpreadsheetListSfComponent implements OnInit {
8002
8431
  static ɵcmp: i0.ɵɵComponentDeclaration<LazySpreadsheetListSfComponent, "wuic-spreadsheet-list-sf-lazy", never, { "hardcodedRoute": { "alias": "hardcodedRoute"; "required": false; }; "parentRecord": { "alias": "parentRecord"; "required": false; }; "parentMetaInfo": { "alias": "parentMetaInfo"; "required": false; }; "datasource": { "alias": "datasource"; "required": false; }; "hardcodedDatasource": { "alias": "hardcodedDatasource"; "required": false; }; "hideToolbar": { "alias": "hideToolbar"; "required": false; }; }, {}, never, never, true, never>;
8003
8432
  }
8004
8433
 
8005
- declare class TreeListComponent implements OnDestroy, IDataBoundHostComponent {
8434
+ declare class TreeListComponent implements OnInit, OnDestroy, IDataBoundHostComponent {
8006
8435
  private titleService;
8007
8436
  private dataSrv;
8008
8437
  private cd;
@@ -8146,8 +8575,12 @@ declare class TreeListComponent implements OnDestroy, IDataBoundHostComponent {
8146
8575
  constructor(titleService: Title, dataSrv: DataProviderService, cd: ChangeDetectorRef, trslSrv: TranslationManagerService);
8147
8576
  /**
8148
8577
  * Inizializza il componente preparando stato, sottoscrizioni e primi caricamenti richiesti.
8578
+ *
8579
+ * Fire-and-forget: Angular `OnInit.ngOnInit` deve ritornare void; deleghiamo
8580
+ * la logica async a `initAsync()` per evitare Promise floating tipizzata void.
8149
8581
  */
8150
- ngOnInit(): Promise<void>;
8582
+ ngOnInit(): void;
8583
+ private initAsync;
8151
8584
  /**
8152
8585
  * Gestisce la logica di `subscribeToDS` con regole guidate dai metadati server `_Metadati_*` (tabella/colonna), gestendo esplicitamente il ciclo di vita delle subscription RxJS, preparando/aggiornando il dataset visualizzato.
8153
8586
  */
@@ -8209,7 +8642,7 @@ declare class TreeListComponent implements OnDestroy, IDataBoundHostComponent {
8209
8642
  static ɵcmp: i0.ɵɵComponentDeclaration<TreeListComponent, "wuic-tree-list", never, { "hardcodedRoute": { "alias": "hardcodedRoute"; "required": false; }; "parentRecord": { "alias": "parentRecord"; "required": false; }; "parentMetaInfo": { "alias": "parentMetaInfo"; "required": false; }; "datasource": { "alias": "datasource"; "required": false; }; "hardcodedDatasource": { "alias": "hardcodedDatasource"; "required": false; }; "hideToolbar": { "alias": "hideToolbar"; "required": false; }; }, { "onTreeDataBound": "onTreeDataBound"; "onTreeNodeExpand": "onTreeNodeExpand"; "onTreeNodeExpanded": "onTreeNodeExpanded"; "onTreeNodeSelect": "onTreeNodeSelect"; "onTreeNodeUnselect": "onTreeNodeUnselect"; "onTreeNodeCollapse": "onTreeNodeCollapse"; }, never, never, true, never>;
8210
8643
  }
8211
8644
 
8212
- declare class ParametricDialogComponent implements OnDestroy, IDataBoundHostComponent {
8645
+ declare class ParametricDialogComponent implements OnInit, AfterViewInit, OnDestroy, IDataBoundHostComponent {
8213
8646
  ref: DynamicDialogRef | null;
8214
8647
  config: DynamicDialogConfig | null;
8215
8648
  private route;
@@ -8709,6 +9142,18 @@ declare class AppSettingsEditorComponent implements OnInit {
8709
9142
  private pristine;
8710
9143
  current: Map<string, any>;
8711
9144
  readonly activeTabValue: i0.WritableSignal<number>;
9145
+ /**
9146
+ * Chiave localStorage per persistere il tab corrente. Salvato per `name`
9147
+ * (stable identifier della sezione, non per index che puo' cambiare se
9148
+ * vengono aggiunte/rimosse sezioni). Letto in `loadSchema` per ripristinare
9149
+ * il tab dopo refresh / restart-driven reload.
9150
+ */
9151
+ private static readonly ACTIVE_TAB_LS_KEY;
9152
+ /**
9153
+ * Wire-up dal template: persiste il tab corrente su localStorage ad
9154
+ * ogni cambio. Salva il `name` della sezione (stabile cross-reload).
9155
+ */
9156
+ onTabChange(newIndex: number): void;
8712
9157
  readonly pendingChanges: i0.Signal<SaveChange[]>;
8713
9158
  readonly hasPendingChanges: i0.Signal<boolean>;
8714
9159
  readonly pendingChangesCount: i0.Signal<number>;
@@ -8777,6 +9222,52 @@ declare class AppSettingsEditorComponent implements OnInit {
8777
9222
  onReload(): Promise<void>;
8778
9223
  private confirmDiscardChanges;
8779
9224
  private sleep;
9225
+ /**
9226
+ * Restart-completion poll con flow a 4 fasi (algoritmo concordato):
9227
+ *
9228
+ * 1) Phase A — poll Health finche' fallisce. Quando il save di un setting
9229
+ * con impact `restart` ritorna, il vecchio worker e' ancora vivo per
9230
+ * ~800ms-5s prima dello StopApplication. Se non aspettiamo che muoia
9231
+ * davvero, qualunque "200 OK" iniziale e' un FALSE POSITIVE — il vecchio
9232
+ * worker risponde, dismissa il dialog, l'utente naviga e si schianta.
9233
+ *
9234
+ * 2) Phase B — wait `postDownGraceMs` (default 10s) DOPO la prima failure.
9235
+ * Margine per dotnet-watch di completare lo shutdown e arrivare in
9236
+ * "Waiting for changes" idle state.
9237
+ *
9238
+ * 3) Phase C — chiama `/api/__dev__/bump-watch-trigger` (Angular dev-server
9239
+ * proxy bypass middleware in `proxy.conf.js`). Il middleware riscrive
9240
+ * `HotReloadTrigger.cs` con un nome metodo unico → rude edit → dotnet-watch
9241
+ * fa rebuild + restart del worker. In IIS/ANCM o dotnet run puro l'endpoint
9242
+ * non esiste, la chiamata fallisce silente, ANCM/NSSM ricicla per conto suo.
9243
+ *
9244
+ * 4) Phase D — poll Health finche' un nuovo response 200 arriva: nuovo worker up.
9245
+ *
9246
+ * @param maxWaitMs budget totale in ms (default 90s).
9247
+ * @param postDownGraceMs grace post-down (default 10s).
9248
+ * @returns true se il restart e' stato completato, false su timeout.
9249
+ */
9250
+ private waitForRestart;
9251
+ /**
9252
+ * [PROD path] Polling semplice usato sotto IIS/ANCM/NSSM dove il
9253
+ * supervisor ricicla il worker autonomamente in pochi secondi.
9254
+ * Comportamento identico alla versione legacy: polla finche' Health
9255
+ * risponde 200, senza fasi di pre-attesa o trigger esterni.
9256
+ *
9257
+ * Nota: c'e' un piccolo rischio di falso positivo nel primo ping se il
9258
+ * vecchio worker non e' ancora morto (~1-2s di sovrapposizione), ma sotto
9259
+ * ANCM/NSSM la finestra e' molto stretta e il caller (`saveAndApply`)
9260
+ * gia' fa un `sleep(Math.max(800, restartDelayMs+200))` prima di chiamare
9261
+ * questo metodo, coprendo il caso normale.
9262
+ */
9263
+ private waitForHealthSimple;
9264
+ /**
9265
+ * Wrapper legacy mantenuto per back-compat: alias di
9266
+ * `waitForHealthSimple`. Eventuali consumer storici che chiamavano
9267
+ * `waitForHealth(ms)` continuano a vedere il polling semplice (non il
9268
+ * 4-phase) — coerente con ambienti prod dove il supervisor gestisce
9269
+ * il restart.
9270
+ */
8780
9271
  private waitForHealth;
8781
9272
  private forceLogout;
8782
9273
  static ɵfac: i0.ɵɵFactoryDeclaration<AppSettingsEditorComponent, never>;
@@ -8987,6 +9478,19 @@ interface LicenseStatusResponse {
8987
9478
  maintenanceExpiryUtc?: string | null;
8988
9479
  tier?: string;
8989
9480
  features?: string[];
9481
+ /**
9482
+ * DBMS utilizzato dal backend per il **DB DATI** (`AppSettings.dbms`):
9483
+ * `'mssql'` o `'mysql'`. Aggiunto 2026-04-28 per il tooltip license del
9484
+ * meta-menu — sysadmin vede a colpo d'occhio su quale provider gira il
9485
+ * deploy.
9486
+ */
9487
+ dataDbms?: string;
9488
+ /**
9489
+ * DBMS utilizzato dal backend per il **DB METADATI** (`AppSettings.meta-dbms`).
9490
+ * Tipicamente uguale a `dataDbms` ma puo' divergere quando
9491
+ * `allowMultipleDBMS=true` (es. data MySQL + metadata MSSQL).
9492
+ */
9493
+ metaDbms?: string;
8990
9494
  }
8991
9495
  /**
8992
9496
  * Client-side view of the current license. Exposes synchronous `has(feature)`
@@ -9235,6 +9739,11 @@ declare class AuthSessionService {
9235
9739
  */
9236
9740
  setSessionTimeout(minutes: number, warningMinutes?: number): void;
9237
9741
  private activityListenersAttached;
9742
+ /** Timestamp dell'ultimo reset throttled, in ms epoch. */
9743
+ private lastActivityResetAt;
9744
+ /** Min intervallo tra reset throttled (mousemove/scroll). 1s e' un buon compromesso
9745
+ * tra responsiveness al "vero" idle e overhead da event flood. */
9746
+ private static readonly ACTIVITY_RESET_THROTTLE_MS;
9238
9747
  private setupActivityListeners;
9239
9748
  /**
9240
9749
  * Avvia/riavvia i timer di sessione. Chiamato dopo login e ad ogni attività HTTP.
@@ -9410,6 +9919,7 @@ declare class MetaMenuComponent implements OnInit, AfterViewInit, OnDestroy {
9410
9919
  */
9411
9920
  private runtimeMenuSub?;
9412
9921
  private authStateSub?;
9922
+ private authConfigRefreshHandler;
9413
9923
  /**
9414
9924
  * Proprieta di stato del componente per menu updated sub, usata dalla logica interna e dal template.
9415
9925
  */
@@ -9639,7 +10149,18 @@ declare class MetaMenuComponent implements OnInit, AfterViewInit, OnDestroy {
9639
10149
  * sincronizza permessi/menu e applica l'eventuale redirect richiesto via query/hash.
9640
10150
  */
9641
10151
  loginLegacy(): Promise<void>;
9642
- private loadAuthConfig;
10152
+ /**
10153
+ * Re-carica la AuthConfig dal backend. Chiamato in `ngOnInit` al boot e
10154
+ * (via global event `wuic:auth-config-refresh`) dopo il restart del
10155
+ * backend per applicare immediatamente nuovi `sessionTimeoutMinutes`,
10156
+ * `notifySessionExpirationBefore`, `enableUserLanguageSwitch` e altri
10157
+ * setting hot-reload-relevant senza richiedere page reload.
10158
+ *
10159
+ * Esposto come `public` cosi' altri componenti (es. app-settings-editor
10160
+ * post-save) possono triggerarlo direttamente quando hanno il riferimento
10161
+ * al meta-menu, oppure dispatcciare l'evento globale.
10162
+ */
10163
+ loadAuthConfig(): Promise<void>;
9643
10164
  onDocumentClick(): void;
9644
10165
  toggleUserLanguageMenu(event?: Event): void;
9645
10166
  isCurrentUserLanguage(langId: string): boolean;
@@ -10120,7 +10641,7 @@ declare class NumberEditorComponent implements IFieldEditor, AfterViewInit {
10120
10641
  static ɵcmp: i0.ɵɵComponentDeclaration<NumberEditorComponent, "wuic-number-editor", never, { "record": { "alias": "record"; "required": false; }; "field": { "alias": "field"; "required": false; }; "metaInfo": { "alias": "metaInfo"; "required": false; }; "isFilter": { "alias": "isFilter"; "required": false; }; "nestedIndex": { "alias": "nestedIndex"; "required": false; }; "triggerProp": { "alias": "triggerProp"; "required": false; }; "readOnly": { "alias": "readOnly"; "required": false; }; "tabIndex": { "alias": "tabIndex"; "required": false; }; }, {}, never, never, true, never>;
10121
10642
  }
10122
10643
 
10123
- declare class LookupEditorComponent implements IFieldEditor, AfterViewInit, AfterViewChecked, OnInit, OnChanges {
10644
+ declare class LookupEditorComponent implements IFieldEditor, AfterViewInit, AfterViewChecked, OnChanges, OnDestroy {
10124
10645
  private trslSrv;
10125
10646
  private cd;
10126
10647
  private hostElementRef;
@@ -10167,6 +10688,14 @@ declare class LookupEditorComponent implements IFieldEditor, AfterViewInit, Afte
10167
10688
  * Riferimento a elementi o componenti figli usato dalla logica UI per nested source.
10168
10689
  */
10169
10690
  nestedSource: DataSourceComponent;
10691
+ /**
10692
+ * Riferimento al p-autoComplete PrimeNG, usato per re-triggerare l'apertura
10693
+ * della dropdown dopo che il layout di focus-expand inline-cell-editing ha
10694
+ * riposizionato l'input (cell -> 360px). Senza re-show, la prima onDropdownClick
10695
+ * calcola la posizione overlay sulla larghezza vecchia e l'overlay puo' restare
10696
+ * chiuso o ancorato male.
10697
+ */
10698
+ autoCompleteRef: AutoComplete;
10170
10699
  /**
10171
10700
  * Collezione dati per items, consumata dal rendering e dalle operazioni del componente.
10172
10701
  */
@@ -10194,11 +10723,8 @@ declare class LookupEditorComponent implements IFieldEditor, AfterViewInit, Afte
10194
10723
  * @param hostElementRef Parametro in ingresso utilizzato per determinare il flusso operativo del metodo.
10195
10724
  */
10196
10725
  constructor(trslSrv: TranslationManagerService, cd: ChangeDetectorRef, hostElementRef: ElementRef<HTMLElement>);
10197
- /**
10198
- * Inizializza il componente preparando stato, sottoscrizioni e primi caricamenti richiesti.
10199
- */
10200
- ngOnInit(): void;
10201
10726
  ngOnChanges(_changes: SimpleChanges): void;
10727
+ ngOnDestroy(): void;
10202
10728
  /**
10203
10729
  * Legge `mc_props_bag.lookup.virtualize` e determina se abilitare il virtual scroll del p-autocomplete.
10204
10730
  * Supporta boolean/number/string oppure object con `enabled`.
@@ -10213,6 +10739,52 @@ declare class LookupEditorComponent implements IFieldEditor, AfterViewInit, Afte
10213
10739
  * Completa inizializzazione dopo il rendering della view e collega riferimenti UI.
10214
10740
  */
10215
10741
  ngAfterViewInit(): void;
10742
+ /**
10743
+ * Subscribe a `record[mc_nome_colonna]` BehaviorSubject: quando un FK viene
10744
+ * settato programmaticamente (es. importazione documento sorgente, CAI
10745
+ * setRecordValue, custom callback) e il valore NON e' presente in `items`
10746
+ * — perche' la prima fetch e' avvenuta prima che il setRecordValue propagasse,
10747
+ * o il valore e' fuori dalla pagina corrente del combo — avviare una
10748
+ * second-stage fetch filtrata sul valore per recuperare il record correlato e
10749
+ * popolare `__lookup_obj` (cosi' il dropdown mostra il display text).
10750
+ *
10751
+ * Skip cases:
10752
+ * - lookupByID multi-value (isFilter operatore=eqor, multiple_check)
10753
+ * - prima emit del BS (init flow gia' coperto sopra)
10754
+ * - valore null/undefined (utente ha clearato)
10755
+ * - valore gia' nei items
10756
+ * - hasActiveLookupQuery true (utente sta typing una query manuale)
10757
+ */
10758
+ private installProgrammaticValueAutoFetch;
10759
+ /**
10760
+ * Workaround per inline-cell-editing + focus-expand:
10761
+ *
10762
+ * Quando la lookup vive dentro una <wuic-list-grid> con `md_inline_cell_editing=1`,
10763
+ * il primo click sul chevron (button.p-autocomplete-dropdown) genera questa sequenza:
10764
+ * 1. mousedown sul chevron alla posizione X
10765
+ * 2. PrimeNG sposta il focus sull'input
10766
+ * 3. il selector CSS `:focus-within` sul TD espande l'input da cell-width a 360px
10767
+ * 4. il chevron, che e' inline-flex accanto all'input, si sposta verso destra
10768
+ * 5. mouseup avviene alla posizione X originale, che ora e' DENTRO l'input
10769
+ * espanso (non piu' sul chevron)
10770
+ * 6. il browser NON emette `click` perche' mouseup-target != mousedown-target
10771
+ * 7. di conseguenza ne il PrimeNG handler interno ne il nostro
10772
+ * `(onDropdownClick)` ricevono mai l'evento -> overlay mai aperto
10773
+ *
10774
+ * Soluzione: ascoltare `mousedown` sul chevron (che PARTE prima di qualunque
10775
+ * reflow e si triggera regolarmente) e schedulare `show()` con un delay che
10776
+ * lascia stabilizzare il focus-expand. Cosi' l'overlay si aggancia al chevron
10777
+ * nella sua posizione finale, esattamente come ci si aspetta.
10778
+ */
10779
+ /**
10780
+ * Handler delegato dal template (`<p-autoComplete (mousedown)="onLookupHostMousedown($event)">`).
10781
+ * Si triggera al mousedown su qualunque punto dell'autoComplete, e in particolare
10782
+ * cattura il mousedown sul chevron PRIMA del reflow del focus-expand.
10783
+ *
10784
+ * Solo dentro inline-cell-editing: in normale edit form il click funziona gia'
10785
+ * nativamente (nessun focus-expand che muove il chevron) e qui ritorniamo NOOP.
10786
+ */
10787
+ onLookupHostMousedown(event: MouseEvent): void;
10216
10788
  ngAfterViewChecked(): void;
10217
10789
  private applyAriaLabelledByToInput;
10218
10790
  /**
@@ -10243,11 +10815,27 @@ declare class LookupEditorComponent implements IFieldEditor, AfterViewInit, Afte
10243
10815
  private restoreLookupInputFocusIfNeeded;
10244
10816
  onLookupOverlayShow(): void;
10245
10817
  onLookupOverlayHide(): void;
10818
+ /**
10819
+ * Re-triggera l'apertura della dropdown dopo un breve delay.
10820
+ *
10821
+ * Use case: quando la lookup vive dentro una <wuic-list-grid> con
10822
+ * `md_inline_cell_editing=1`, il click sul chevron mette il focus sull'input
10823
+ * e attiva la regola CSS `:focus-within` che espande l'input da cell-width a
10824
+ * 360px (Excel-like). PrimeNG calcola la posizione dell'overlay e fa il
10825
+ * primo `show()` PRIMA che il reflow CSS sia stato applicato, quindi
10826
+ * l'overlay puo' risultare chiuso, mal posizionato o riagganciato a
10827
+ * un'ancora di larghezza vecchia.
10828
+ *
10829
+ * Il delay di 120ms lascia che il reflow del focus-expand si stabilizzi,
10830
+ * poi forziamo un secondo `show()` che ricalcola posizione/larghezza
10831
+ * coerenti con l'input gia' espanso.
10832
+ */
10833
+ onDropdownClickHandler(_event: any): void;
10246
10834
  static ɵfac: i0.ɵɵFactoryDeclaration<LookupEditorComponent, never>;
10247
10835
  static ɵcmp: i0.ɵɵComponentDeclaration<LookupEditorComponent, "wuic-lookup-editor", never, { "record": { "alias": "record"; "required": false; }; "field": { "alias": "field"; "required": false; }; "metaInfo": { "alias": "metaInfo"; "required": false; }; "isFilter": { "alias": "isFilter"; "required": false; }; "nestedIndex": { "alias": "nestedIndex"; "required": false; }; "triggerProp": { "alias": "triggerProp"; "required": false; }; "readOnly": { "alias": "readOnly"; "required": false; }; "tabIndex": { "alias": "tabIndex"; "required": false; }; "ariaLabelledBy": { "alias": "ariaLabelledBy"; "required": false; }; }, {}, never, never, true, never>;
10248
10836
  }
10249
10837
 
10250
- declare class DictionaryEditorComponent implements OnInit, OnChanges, AfterViewChecked, OnDestroy {
10838
+ declare class DictionaryEditorComponent implements OnInit, OnChanges, AfterViewChecked, AfterViewInit, OnDestroy {
10251
10839
  private trnSrv;
10252
10840
  private hostElementRef;
10253
10841
  /**
@@ -10688,10 +11276,6 @@ declare class ButtonEditorComponent {
10688
11276
  */
10689
11277
  constructor(confirmationService: ConfirmationService, trn: TranslateService, wtoolbox: WtoolboxService);
10690
11278
  /**
10691
- * Completa inizializzazione dopo il rendering della view e collega riferimenti UI.
10692
- */
10693
- ngAfterViewInit(): void;
10694
- /**
10695
11279
  * Valuta una condizione tramite `isButtonVisible` con il flusso specifico definito dalla sua implementazione.
10696
11280
  * @returns Esito booleano calcolato dal metodo.
10697
11281
  */
@@ -10841,6 +11425,23 @@ declare class FieldEditorComponent implements OnInit, OnChanges, OnDestroy, DoCh
10841
11425
  * @returns Valore calcolato dinamicamente a partire dallo stato corrente del componente.
10842
11426
  */
10843
11427
  get classes(): string | null;
11428
+ /**
11429
+ * True quando il field-editor e' renderizzato dentro una cella di una
11430
+ * list-grid in `md_inline_cell_editing` mode. In quel contesto la
11431
+ * larghezza della cella e' governata dalla colonna del p-table (e da
11432
+ * `mc_ui_grid_size_width`), non dalla form-default `mc_ui_size_width`
11433
+ * — applicare 300px sull'editor o sul span readonly inflerebbe le
11434
+ * colonne. Il caller (list-grid row template) NON passa un input
11435
+ * dedicato: identifichiamo l'inline mode dal flag tableMetadata.
11436
+ */
11437
+ get isInlineCellHost(): boolean;
11438
+ /**
11439
+ * Width da applicare all'editor / span readonly. In inline cell host
11440
+ * usa `100%` (la cella ha gia' la sua larghezza dalla colonna). Fuori
11441
+ * inline-grid (form/dialog) usa la logica storica:
11442
+ * `mc_ui_size_width || widgetMap[type].width || undefined`.
11443
+ */
11444
+ get widgetWidth(): string | undefined;
10844
11445
  private syncDomAttrs;
10845
11446
  /**
10846
11447
  * function Object() { [native code] }
@@ -10861,6 +11462,16 @@ declare class FieldEditorComponent implements OnInit, OnChanges, OnDestroy, DoCh
10861
11462
  */
10862
11463
  ngOnChanges(_changes: SimpleChanges): void;
10863
11464
  ngOnDestroy(): void;
11465
+ /**
11466
+ * Valore formattato per il readonly span (template: `{{readonlySpanValue}}`).
11467
+ * Aggiornato reattivamente in setupReadonlySpanBinding subscribendo alla
11468
+ * BehaviorSubject del campo: quando un setRecordValue programmatico (es.
11469
+ * default async di sp_next_progressivo) chiama BS.next, lo span si
11470
+ * aggiorna senza dover rendere `formatGridViewValue` impure.
11471
+ */
11472
+ readonlySpanValue: unknown;
11473
+ private readonlySpanSub?;
11474
+ private setupReadonlySpanBinding;
10864
11475
  /**
10865
11476
  * Rileva mutazioni in-place del tipo widget (es. da text a dictionary nel designer)
10866
11477
  * e riallinea il componente editor visualizzato.
@@ -13645,8 +14256,18 @@ declare class WuicErrorDialogComponent implements OnInit, OnDestroy {
13645
14256
  private cdr;
13646
14257
  visible: boolean;
13647
14258
  currentException: CustomException | null;
14259
+ /**
14260
+ * Set di firme errori che l'utente ha gia' chiuso esplicitamente in
14261
+ * questa sessione (dismissedSignatures). Il dialog NON si riapre per
14262
+ * eventi successivi con stessa firma -> evita il loop "fetch fallisce
14263
+ * -> dialog si riapre" che impedisce all'utente di intervenire sulla
14264
+ * pagina sotto (es. aprire metadata-editor per riparare la causa).
14265
+ * Firma = `<traceId>` se presente, altrimenti `<title>::<body>`.
14266
+ */
14267
+ private dismissedSignatures;
13648
14268
  private sub?;
13649
14269
  constructor(cdr: ChangeDetectorRef);
14270
+ private signatureOf;
13650
14271
  ngOnInit(): void;
13651
14272
  ngOnDestroy(): void;
13652
14273
  formatParameters(params: Record<string, unknown> | undefined | null): string;
@@ -13790,4 +14411,4 @@ declare function getThemeOptions(): ThemeOption[];
13790
14411
  declare function getThemePrimaryHex(value: string): string;
13791
14412
 
13792
14413
  export { AUTH_REDIRECT_REASON_KEY, AppSettingsEditorComponent, AuthSessionService, BooleanEditorComponent, BoundedRepeaterComponent, ButtonEditorComponent, CallbackPipe, CallbackPipe2, CarouselListComponent, CodeAreaEditorComponent, ColorEditorComponent, CrashReporterService, 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, WidgetDefinition, WorkflowDesignerRouteComponent, WorkflowRunnerComponent, WorkflowRuntimeMetadataService, WtoolboxService, 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 };
13793
- export type { AuthSessionState, Breadcrumb, CompileDynamicComponentOptions, CrashReportPayload, CrashReportingConfig, DataSourceAfterSyncEvent, DataSourceBeforeSyncEvent, DataSourceSyncOperation, IDataBoundHostComponent, IFieldEditor, KanbanStatusColumn, LicenseStatusResponse, ListGridAfterRenderEvent, ListGridAfterRowRenderEvent, ListGridBeforeRowRenderEvent, MultiDatasourceMeta, NotificationItem, RagAskAcceptedResponse, RagAskRequest, RagChatHistorySnapshot, RagChatMessageDto, RagChatMessageStatus, RagChatRequest, RagChatResponse, RagChatSessionDto, RagChatTurn, RagChatbotTurn, RagHealthResponse, RagQueryRequest, RagQueryResponse, RagSource, RealtimeProgressEvent, ThemeOption, ThemePresetName, ThemePrimaryName, WorkflowRuntimeLinkedActionRouteMetadataEntry, WorkflowRuntimePreviousRouteNodeEntry, WorkflowRuntimeRouteMetadataEntry, WorkflowRuntimeRouteNodePayloadEntry };
14414
+ export type { AuthSessionState, Breadcrumb, CompileDynamicComponentOptions, CrashReportPayload, CrashReportingConfig, DataSourceAfterSyncEvent, DataSourceBeforeSyncEvent, DataSourceSyncOperation, ErrorDelegate, ErrorDelegateContext, IDataBoundHostComponent, IFieldEditor, KanbanStatusColumn, LicenseStatusResponse, ListGridAfterRenderEvent, ListGridAfterRowRenderEvent, ListGridBeforeRowRenderEvent, MultiDatasourceMeta, NotificationItem, NotifyOptions, RagAskAcceptedResponse, RagAskRequest, RagChatHistorySnapshot, RagChatMessageDto, RagChatMessageStatus, RagChatRequest, RagChatResponse, RagChatSessionDto, RagChatTurn, RagChatbotTurn, RagHealthResponse, RagQueryRequest, RagQueryResponse, RagSource, RealtimeProgressEvent, ThemeOption, ThemePresetName, ThemePrimaryName, WorkflowRuntimeLinkedActionRouteMetadataEntry, WorkflowRuntimePreviousRouteNodeEntry, WorkflowRuntimeRouteMetadataEntry, WorkflowRuntimeRouteNodePayloadEntry };