wuic-framework-lib 1.0.19 → 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-C0OYuZoM.mjs → wuic-framework-lib-chart-list.component-B44k_wZe.mjs} +73 -13
  2. package/fesm2022/{wuic-framework-lib-code-editor.component-B8OQ3Z0k.mjs → wuic-framework-lib-code-editor.component-D1dy4Dl9.mjs} +5 -5
  3. package/fesm2022/{wuic-framework-lib-designer.component-DsWgWtFj.mjs → wuic-framework-lib-designer.component-CnOQbvEH.mjs} +82 -49
  4. package/fesm2022/{wuic-framework-lib-first-run-wizard.component-wR_LrvPK.mjs → wuic-framework-lib-first-run-wizard.component-C9lswoxG.mjs} +8 -8
  5. package/fesm2022/{wuic-framework-lib-framework-docs.component-eyzu9tdV.mjs → wuic-framework-lib-framework-docs.component-B6qNTs5H.mjs} +803 -110
  6. package/fesm2022/{wuic-framework-lib-pivot-builder.component-BFdZW5Ch.mjs → wuic-framework-lib-pivot-builder.component-DMk26H0M.mjs} +264 -16
  7. package/fesm2022/{wuic-framework-lib-prompt-dialog-fallback-host.component-B583WbYe.mjs → wuic-framework-lib-prompt-dialog-fallback-host.component-y3shST6g.mjs} +5 -5
  8. package/fesm2022/{wuic-framework-lib-report-designer.component-HJUpslLX.mjs → wuic-framework-lib-report-designer.component-BnngR2eL.mjs} +5 -5
  9. package/fesm2022/{wuic-framework-lib-report-viewer.component-El32zpzi.mjs → wuic-framework-lib-report-viewer.component-LGNRIQh2.mjs} +5 -5
  10. package/fesm2022/{wuic-framework-lib-scheduler-list.component-E8s_e533.mjs → wuic-framework-lib-scheduler-list.component-DbcFMwx5.mjs} +28 -5
  11. package/fesm2022/{wuic-framework-lib-spreadsheet-list-sf.component-CDn0qi_C.mjs → wuic-framework-lib-spreadsheet-list-sf.component-DXyRX0YK.mjs} +9 -9
  12. package/fesm2022/{wuic-framework-lib-workflow-designer.component-hL7oKqYO.mjs → wuic-framework-lib-workflow-designer.component-Bm719AWV.mjs} +9 -9
  13. package/fesm2022/{wuic-framework-lib-wuic-framework-lib-ABS_G7lO.mjs → wuic-framework-lib-wuic-framework-lib-CGCZvtKK.mjs} +1680 -411
  14. package/fesm2022/wuic-framework-lib.mjs +1 -1
  15. package/package.json +1 -1
  16. package/types/wuic-framework-lib.d.ts +340 -3
@@ -1,2 +1,2 @@
1
- export { s as AUTH_REDIRECT_REASON_KEY, t as AppSettingsEditorComponent, n as AuthSessionService, B as BooleanEditorComponent, u as BoundedRepeaterComponent, v as ButtonEditorComponent, C as CallbackPipe, w as CallbackPipe2, x as CarouselListComponent, y as CodeAreaEditorComponent, z as ColorEditorComponent, E as CrashReporterService, H as CustomException, J as DataActionButtonComponent, K as DataProviderOdataService, c as DataRepeaterComponent, b as DataSourceComponent, N as DateEditorComponent, O as DesignerRouteComponent, Q as DictionaryEditorComponent, a as DynamicCompilerService, R as DynamicRowTemplateComponent, i as FieldEditorComponent, F as FilterBarComponent, o as FilterInfo, S as FormatGridViewValuePipe, V as GetSrcUploadPreviewPipe, G as GlobalHandler, X as HtmlEditorComponent, Y as ImageWrapperComponent, I as ImportExportButtonComponent, Z as IsSelectedRowPipe, _ as KanbanListComponent, $ as KanbanOptions, a0 as KanbanStatusColumnItem, a1 as LazyChartListComponent, a2 as LazyCodeEditorComponent, a3 as LazyDataActionButtonComponent, a4 as LazyDataSourceComponent, a5 as LazyFieldEditorComponent, a6 as LazyFirstRunWizardComponent, a7 as LazyImageWrapperComponent, a8 as LazyKanbanListComponent, a9 as LazyMetaMenuComponent, aa as LazyPivotBuilderComponent, ab as LazyReportDesignerComponent, ac as LazyReportViewerComponent, ad as LazySchedulerListComponent, ae as LazySpreadsheetListSfComponent, p as LicenseFeatureService, af as ListGridComponent, ag as LookupEditorComponent, ah as MapListComponent, m as MetaInfo, ai as MetaMenuComponent, g as MetadataEditorService, M as MetadataProviderService, e as MetadatiColonna, aj as MetadatiTabella, ak as NotificationBellComponent, al as NotificationRealtimeService, am as NumberEditorComponent, an as PRIMARY_PALETTES, P as PagerComponent, d as ParametricDialogComponent, ao as PropertyArrayEditorComponent, ap as PropertyObjectEditorComponent, aq as THEME_OPTIONS, ar as TextAreaEditorComponent, as as TextEditorComponent, T as TranslationManagerService, at as TreeListComponent, au as TreeViewSelectorComponent, av as UploadDialogComponent, aw as UploadEditorComponent, U as UserInfoService, ax as ValidationRule, ay as ValueChangedPayload, az as VisibleFieldListPipe, aA as WidgetDefinition, aB as WorkflowDesignerRouteComponent, aC as WorkflowRunnerComponent, h as WorkflowRuntimeMetadataService, W as WtoolboxService, aD as WuicErrorDialogComponent, aE as WuicErrorInterceptor, aF as WuicFeatureDirective, aG as WuicFrozenColumnDirective, aH as WuicRagChatbotComponent, aI as WuicRagChatbotFabComponent, aJ as WuicRagService, aK as WuicRowTogglerDirective, aL as _PRIMENG_TABLE_DIRECTIVES_NAMES, aM as authExpiredInterceptor, aN as boundedRepeaterPendingChangesGuard, aO as featureRouteCanActivateGuard, aP as featureRouteCanMatchGuard, r as getThemeOptions, aQ as getThemePrimaryHex, aR as inferTemplateFieldFromBaseClass, aS as loadBooleanEditorComponent, aT as loadButtonEditorComponent, aU as loadCodeAreaEditorComponent, aV as loadColorEditorComponent, aW as loadDateEditorComponent, aX as loadDictionaryEditorComponent, aY as loadHtmlEditorComponent, aZ as loadLookupEditorComponent, a_ as loadNumberEditorComponent, a$ as loadPropertyArrayEditorComponent, b0 as loadPropertyObjectEditorComponent, b1 as loadTextAreaEditorComponent, b2 as loadTextEditorComponent, b3 as loadTreeViewSelectorComponent, b4 as loadUploadEditorComponent, b5 as menuRouteAccessCanActivateGuard, b6 as menuRouteAccessCanMatchGuard, b7 as routes, b8 as wuicErrorInterceptor } from './wuic-framework-lib-wuic-framework-lib-ABS_G7lO.mjs';
1
+ export { s as AUTH_REDIRECT_REASON_KEY, t as AppSettingsEditorComponent, n as AuthSessionService, B as BooleanEditorComponent, u as BoundedRepeaterComponent, v as ButtonEditorComponent, C as CallbackPipe, w as CallbackPipe2, x as CarouselListComponent, y as CodeAreaEditorComponent, z as ColorEditorComponent, E as CrashReporterService, H as CustomException, J as DataActionButtonComponent, K as DataProviderOdataService, c as DataRepeaterComponent, b as DataSourceComponent, N as DateEditorComponent, O as DesignerRouteComponent, Q as DictionaryEditorComponent, a as DynamicCompilerService, R as DynamicRowTemplateComponent, i as FieldEditorComponent, F as FilterBarComponent, o as FilterInfo, S as FormatGridViewValuePipe, V as GetSrcUploadPreviewPipe, G as GlobalHandler, X as HtmlEditorComponent, Y as ImageWrapperComponent, I as ImportExportButtonComponent, Z as IsSelectedRowPipe, _ as KanbanListComponent, $ as KanbanOptions, a0 as KanbanStatusColumnItem, a1 as LazyChartListComponent, a2 as LazyCodeEditorComponent, a3 as LazyDataActionButtonComponent, a4 as LazyDataSourceComponent, a5 as LazyFieldEditorComponent, a6 as LazyFirstRunWizardComponent, a7 as LazyImageWrapperComponent, a8 as LazyKanbanListComponent, a9 as LazyMetaMenuComponent, aa as LazyPivotBuilderComponent, ab as LazyReportDesignerComponent, ac as LazyReportViewerComponent, ad as LazySchedulerListComponent, ae as LazySpreadsheetListSfComponent, p as LicenseFeatureService, af as ListGridComponent, ag as LookupEditorComponent, ah as MapListComponent, m as MetaInfo, ai as MetaMenuComponent, g as MetadataEditorService, M as MetadataProviderService, e as MetadatiColonna, aj as MetadatiTabella, ak as NotificationBellComponent, al as NotificationRealtimeService, am as NumberEditorComponent, an as PRIMARY_PALETTES, P as PagerComponent, d as ParametricDialogComponent, ao as PropertyArrayEditorComponent, ap as PropertyObjectEditorComponent, aq as THEME_OPTIONS, ar as TextAreaEditorComponent, as as TextEditorComponent, T as TranslationManagerService, at as TreeListComponent, au as TreeViewSelectorComponent, av as UploadDialogComponent, aw as UploadEditorComponent, U as UserInfoService, ax as ValidationRule, ay as ValueChangedPayload, az as VisibleFieldListPipe, aA as WidgetDefinition, aB as WorkflowDesignerRouteComponent, aC as WorkflowRunnerComponent, h as WorkflowRuntimeMetadataService, W as WtoolboxService, aD as WuicErrorDialogComponent, aE as WuicErrorInterceptor, aF as WuicFeatureDirective, aG as WuicFrozenColumnDirective, aH as WuicRagChatbotComponent, aI as WuicRagChatbotFabComponent, aJ as WuicRagService, aK as WuicRowTogglerDirective, aL as _PRIMENG_TABLE_DIRECTIVES_NAMES, aM as authExpiredInterceptor, aN as boundedRepeaterPendingChangesGuard, aO as featureRouteCanActivateGuard, aP as featureRouteCanMatchGuard, r as getThemeOptions, aQ as getThemePrimaryHex, aR as inferTemplateFieldFromBaseClass, aS as loadBooleanEditorComponent, aT as loadButtonEditorComponent, aU as loadCodeAreaEditorComponent, aV as loadColorEditorComponent, aW as loadDateEditorComponent, aX as loadDictionaryEditorComponent, aY as loadHtmlEditorComponent, aZ as loadLookupEditorComponent, a_ as loadNumberEditorComponent, a$ as loadPropertyArrayEditorComponent, b0 as loadPropertyObjectEditorComponent, b1 as loadTextAreaEditorComponent, b2 as loadTextEditorComponent, b3 as loadTreeViewSelectorComponent, b4 as loadUploadEditorComponent, b5 as menuRouteAccessCanActivateGuard, b6 as menuRouteAccessCanMatchGuard, b7 as routes, b8 as wuicErrorInterceptor } from './wuic-framework-lib-wuic-framework-lib-CGCZvtKK.mjs';
2
2
  //# sourceMappingURL=wuic-framework-lib.mjs.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wuic-framework-lib",
3
- "version": "1.0.19",
3
+ "version": "1.0.20",
4
4
  "description": "Wuic Angular Framework Library",
5
5
  "author": "Wuic",
6
6
  "license": "MIT",
@@ -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';
@@ -1834,6 +1834,19 @@ declare class DataSourceComponent implements OnInit, OnDestroy {
1834
1834
  */
1835
1835
  private refreshPristineFromCurrent;
1836
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
+ /**
1837
1850
  * Pubblica uno stato locale aggiornato su `fetchInfo$` per riallineare i consumer del datasource.
1838
1851
  */
1839
1852
  private publishLocalStateUpdate;
@@ -1965,18 +1978,103 @@ declare class MapOptions implements IDesignerProperties {
1965
1978
  useCurrentLocation: boolean;
1966
1979
  useClusterer: boolean;
1967
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;
1968
1991
  customMarkerImageSrc: string;
1969
1992
  customMarkerImageSrcField: string;
1970
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;
1971
2000
  titleField: string;
1972
2001
  infoField: string;
1973
2002
  infoFunction: string;
1974
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;
1975
2013
  constructor();
1976
2014
  init(metaInfo: MetaInfo): void;
1977
2015
  archetypePropName: string;
1978
2016
  getDesignerProps(metaInfo: MetaInfo, action: BehaviorSubject<any>): MetaInfo;
1979
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
+ }
1980
2078
  declare class Point {
1981
2079
  lat: number;
1982
2080
  lng: number;
@@ -2378,7 +2476,7 @@ declare class MetadatiTabella {
2378
2476
  * Flag toolbar-level controllati da `md_props_bag.toolbar.*` (JSON).
2379
2477
  * Cambiabili per-route senza toccare lo schema SQL di
2380
2478
  * `_metadati__tabelle`. Esempio in `md_props_bag`:
2381
- * { "toolbar": { "hideManageState": true } }
2479
+ * { "toolbar": { "hideManageState": true, "hideBatchActions": true } }
2382
2480
  *
2383
2481
  * - `hideManageState`: nasconde il bottone "Gestione stato"
2384
2482
  * (icona bookmark) + la select degli stati salvati nella
@@ -2386,9 +2484,18 @@ declare class MetadatiTabella {
2386
2484
  * demo dove il saved-state feature (persistenza user_id +
2387
2485
  * route via MetaService) non ha senso — es. Pattern 3 puro
2388
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.
2389
2495
  */
2390
2496
  toolbar?: {
2391
2497
  hideManageState?: boolean;
2498
+ hideBatchActions?: boolean;
2392
2499
  };
2393
2500
  /**
2394
2501
  * Tuning server-side letto da `DataProviderMetaService.select`
@@ -3354,6 +3461,18 @@ declare class DataProviderMetaService {
3354
3461
  * additional columns alongside the text field).
3355
3462
  */
3356
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;
3357
3476
  /**
3358
3477
  * Carica i dati della route corrente chiamando `MetaService.getFlatRecordData` (`MetadataProviderService.readUri`).
3359
3478
  * Invia paginazione/ordinamenti/gruppi/filtri/aggregazioni e `has_server_operation`, poi mappa la risposta
@@ -4409,6 +4528,36 @@ declare class WtoolboxService {
4409
4528
  suggestColumnMD(record: {
4410
4529
  [key: string]: BehaviorSubject<any>;
4411
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>;
4412
4561
  /**
4413
4562
  * Costruisce formula computed partendo da gerarchia lookup: apre albero da
4414
4563
  * `MetaService.getLookupListByIDLevelUP` e invia la selezione a `getClauseByLookupHierarchy`
@@ -7454,6 +7603,34 @@ declare class MapListComponent implements OnInit, AfterViewInit, OnDestroy, IBin
7454
7603
  * Collezione dati per data, consumata dal rendering e dalle operazioni del componente.
7455
7604
  */
7456
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
+ }[];
7457
7634
  /**
7458
7635
  * Configurazione di presentazione per item template string, usata nel rendering del componente.
7459
7636
  */
@@ -7654,11 +7831,54 @@ declare class MapListComponent implements OnInit, AfterViewInit, OnDestroy, IBin
7654
7831
  */
7655
7832
  parseData(data: any): any;
7656
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
+ /**
7657
7868
  * Recupera i dati/valori richiesti da `getMarkerContent`.
7658
7869
  * @param record Dato/record su cui il metodo applica elaborazioni o aggiornamenti.
7659
7870
  * @returns Valore risolto da `getMarkerContent` in base ai criteri implementati.
7660
7871
  */
7661
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;
7662
7882
  /**
7663
7883
  * Restituisce una Promise che wrappa `navigator.geolocation.getCurrentPosition`.
7664
7884
  * @returns Posizione geolocalizzata del browser oppure errore se non disponibile/negata.
@@ -7818,6 +8038,15 @@ declare class MapListComponent implements OnInit, AfterViewInit, OnDestroy, IBin
7818
8038
  * Apre l'info window del marker selezionato valorizzando `infoContent` con il template record.
7819
8039
  */
7820
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;
7821
8050
  /**
7822
8051
  * Apre la stessa info window usata dai marker quando l'utente clicca un poligono.
7823
8052
  * Se non e disponibile un anchor marker, usa la posizione click o il centro geometrico del poligono.
@@ -10412,7 +10641,7 @@ declare class NumberEditorComponent implements IFieldEditor, AfterViewInit {
10412
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>;
10413
10642
  }
10414
10643
 
10415
- declare class LookupEditorComponent implements IFieldEditor, AfterViewInit, AfterViewChecked, OnChanges {
10644
+ declare class LookupEditorComponent implements IFieldEditor, AfterViewInit, AfterViewChecked, OnChanges, OnDestroy {
10416
10645
  private trslSrv;
10417
10646
  private cd;
10418
10647
  private hostElementRef;
@@ -10459,6 +10688,14 @@ declare class LookupEditorComponent implements IFieldEditor, AfterViewInit, Afte
10459
10688
  * Riferimento a elementi o componenti figli usato dalla logica UI per nested source.
10460
10689
  */
10461
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;
10462
10699
  /**
10463
10700
  * Collezione dati per items, consumata dal rendering e dalle operazioni del componente.
10464
10701
  */
@@ -10487,6 +10724,7 @@ declare class LookupEditorComponent implements IFieldEditor, AfterViewInit, Afte
10487
10724
  */
10488
10725
  constructor(trslSrv: TranslationManagerService, cd: ChangeDetectorRef, hostElementRef: ElementRef<HTMLElement>);
10489
10726
  ngOnChanges(_changes: SimpleChanges): void;
10727
+ ngOnDestroy(): void;
10490
10728
  /**
10491
10729
  * Legge `mc_props_bag.lookup.virtualize` e determina se abilitare il virtual scroll del p-autocomplete.
10492
10730
  * Supporta boolean/number/string oppure object con `enabled`.
@@ -10501,6 +10739,52 @@ declare class LookupEditorComponent implements IFieldEditor, AfterViewInit, Afte
10501
10739
  * Completa inizializzazione dopo il rendering della view e collega riferimenti UI.
10502
10740
  */
10503
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;
10504
10788
  ngAfterViewChecked(): void;
10505
10789
  private applyAriaLabelledByToInput;
10506
10790
  /**
@@ -10531,6 +10815,22 @@ declare class LookupEditorComponent implements IFieldEditor, AfterViewInit, Afte
10531
10815
  private restoreLookupInputFocusIfNeeded;
10532
10816
  onLookupOverlayShow(): void;
10533
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;
10534
10834
  static ɵfac: i0.ɵɵFactoryDeclaration<LookupEditorComponent, never>;
10535
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>;
10536
10836
  }
@@ -11125,6 +11425,23 @@ declare class FieldEditorComponent implements OnInit, OnChanges, OnDestroy, DoCh
11125
11425
  * @returns Valore calcolato dinamicamente a partire dallo stato corrente del componente.
11126
11426
  */
11127
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;
11128
11445
  private syncDomAttrs;
11129
11446
  /**
11130
11447
  * function Object() { [native code] }
@@ -11145,6 +11462,16 @@ declare class FieldEditorComponent implements OnInit, OnChanges, OnDestroy, DoCh
11145
11462
  */
11146
11463
  ngOnChanges(_changes: SimpleChanges): void;
11147
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;
11148
11475
  /**
11149
11476
  * Rileva mutazioni in-place del tipo widget (es. da text a dictionary nel designer)
11150
11477
  * e riallinea il componente editor visualizzato.
@@ -13929,8 +14256,18 @@ declare class WuicErrorDialogComponent implements OnInit, OnDestroy {
13929
14256
  private cdr;
13930
14257
  visible: boolean;
13931
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;
13932
14268
  private sub?;
13933
14269
  constructor(cdr: ChangeDetectorRef);
14270
+ private signatureOf;
13934
14271
  ngOnInit(): void;
13935
14272
  ngOnDestroy(): void;
13936
14273
  formatParameters(params: Record<string, unknown> | undefined | null): string;