wuic-framework-lib 1.7.12 → 1.7.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (21) hide show
  1. package/fesm2022/{wuic-framework-lib-chart-list.component-C9rj-6-8.mjs → wuic-framework-lib-chart-list.component-BIpu6QY3.mjs} +4 -2
  2. package/fesm2022/{wuic-framework-lib-code-editor.component-CTI_gqvB.mjs → wuic-framework-lib-code-editor.component-P181nIU9.mjs} +2 -2
  3. package/fesm2022/{wuic-framework-lib-designer.component-67PCnDYC.mjs → wuic-framework-lib-designer.component-DZ7C9ygB.mjs} +4 -2
  4. package/fesm2022/{wuic-framework-lib-first-run-wizard.component-Bg41Xfht.mjs → wuic-framework-lib-first-run-wizard.component-CGCBKpdv.mjs} +2 -2
  5. package/fesm2022/{wuic-framework-lib-framework-docs.component-BLxQmoDZ.mjs → wuic-framework-lib-framework-docs.component-CX4DuW-Q.mjs} +484 -3
  6. package/fesm2022/{wuic-framework-lib-pivot-builder.component-Dg-xWzxO.mjs → wuic-framework-lib-pivot-builder.component-CrJUJDxX.mjs} +5 -2
  7. package/fesm2022/{wuic-framework-lib-prompt-dialog-fallback-host.component-BB0AhnsE.mjs → wuic-framework-lib-prompt-dialog-fallback-host.component-fk_u2CFB.mjs} +2 -2
  8. package/fesm2022/{wuic-framework-lib-report-designer.component-9_M4MA2p.mjs → wuic-framework-lib-report-designer.component-urOz2Pq8.mjs} +2 -2
  9. package/fesm2022/{wuic-framework-lib-report-scaffold-dialog.component-BsKSP1Dk.mjs → wuic-framework-lib-report-scaffold-dialog.component-okexsstE.mjs} +2 -2
  10. package/fesm2022/{wuic-framework-lib-report-viewer.component-C5EAoGOx.mjs → wuic-framework-lib-report-viewer.component-CCpUOyb4.mjs} +2 -2
  11. package/fesm2022/{wuic-framework-lib-scene3d-designer.component-CkoU_J5j.mjs → wuic-framework-lib-scene3d-designer.component-DLcruDYB.mjs} +3 -3
  12. package/fesm2022/{wuic-framework-lib-scene3d-light-baker-gpu-CjTKHG3s.mjs → wuic-framework-lib-scene3d-light-baker-gpu-Dj22rwPQ.mjs} +2 -2
  13. package/fesm2022/{wuic-framework-lib-scene3d-viewer.component-Dt0fvwFX.mjs → wuic-framework-lib-scene3d-viewer.component-DA47y9vo.mjs} +2 -2
  14. package/fesm2022/{wuic-framework-lib-scheduler-list.component-CEMQJrsN.mjs → wuic-framework-lib-scheduler-list.component-BXx84Cc7.mjs} +24 -16
  15. package/fesm2022/{wuic-framework-lib-spreadsheet-list-sf.component-Cgmf9tb1.mjs → wuic-framework-lib-spreadsheet-list-sf.component-v7rE3WW_.mjs} +4 -2
  16. package/fesm2022/{wuic-framework-lib-timeline-list.component-B_bRKY_H.mjs → wuic-framework-lib-timeline-list.component-CP9PpRQB.mjs} +6 -4
  17. package/fesm2022/{wuic-framework-lib-workflow-designer.component-DVEL_aHg.mjs → wuic-framework-lib-workflow-designer.component-CETZSZzu.mjs} +2 -2
  18. package/fesm2022/{wuic-framework-lib-wuic-framework-lib-Ds_oD2In.mjs → wuic-framework-lib-wuic-framework-lib-CRUM1gc_.mjs} +284 -34
  19. package/fesm2022/wuic-framework-lib.mjs +1 -1
  20. package/package.json +1 -1
  21. package/types/wuic-framework-lib.d.ts +87 -2
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Injectable, ApplicationRef, EnvironmentInjector, createComponent, NgModule, Component, createNgModule, inject, NgZone, ElementRef, Input, EventEmitter, Output, signal, HostBinding, ChangeDetectionStrategy, Pipe, ViewChild, forwardRef, HostListener, Optional, Directive, ViewChildren, computed, ViewContainerRef, ViewEncapsulation } from '@angular/core';
2
+ import { Injectable, ApplicationRef, EnvironmentInjector, createComponent, NgModule, Component, createNgModule, inject, NgZone, ElementRef, Input, EventEmitter, Output, DestroyRef, isDevMode, signal, HostBinding, ChangeDetectionStrategy, Pipe, ViewChild, forwardRef, HostListener, Optional, Directive, ViewChildren, computed, ViewContainerRef, ViewEncapsulation } from '@angular/core';
3
3
  import { BehaviorSubject, firstValueFrom, Subject, combineLatest, catchError, EMPTY, throwError, Subscription } from 'rxjs';
4
4
  import * as i1$2 from '@angular/router';
5
5
  import { Router, NavigationEnd, NavigationStart, RouterModule, RouterLink } from '@angular/router';
@@ -180,6 +180,8 @@ const WuicErrorCodes = {
180
180
  AuthCookieMalformed: 'errors.auth.cookie_malformed',
181
181
  AuthOperationDisabled: 'errors.auth.operation_disabled',
182
182
  AuthLoginFailed: 'errors.auth.login_failed',
183
+ // HTTP 403: richiesta sulle notifiche di un altro utente (NotificationsController).
184
+ AuthNotificationForbidden: 'errors.auth.notification_forbidden',
183
185
  MetadataPropsBagMalformed: 'errors.metadata.props_bag.malformed',
184
186
  MetadataRouteNotFound: 'errors.metadata.route.not_found',
185
187
  MetadataRouteAmbiguousCase: 'errors.metadata.route.ambiguous_case',
@@ -3418,7 +3420,7 @@ class WtoolboxService {
3418
3420
  const appRef = resolvedInjector.get(ApplicationRef);
3419
3421
  const environmentInjector = resolvedInjector.get(EnvironmentInjector);
3420
3422
  const close$ = new Subject();
3421
- const { PromptDialogFallbackHostComponent } = await import('./wuic-framework-lib-prompt-dialog-fallback-host.component-BB0AhnsE.mjs');
3423
+ const { PromptDialogFallbackHostComponent } = await import('./wuic-framework-lib-prompt-dialog-fallback-host.component-fk_u2CFB.mjs');
3422
3424
  const hostRef = createComponent(PromptDialogFallbackHostComponent, { environmentInjector });
3423
3425
  hostRef.instance.datasource = dialogConfig?.data?.datasource;
3424
3426
  hostRef.instance.header = String(dialogConfig?.header || '');
@@ -7697,6 +7699,10 @@ class MetadataProviderService {
7697
7699
  static metatableColumnAuthRoute;
7698
7700
  static metadataVersionInFlight;
7699
7701
  static lastMetadataVersionCheckAtMs = 0;
7702
+ // Ultima versione letta dal backend: dentro la finestra di throttle si
7703
+ // restituisce questa (non `null`), cosi' ogni route confronta la propria
7704
+ // cache Dexie con la versione piu' recente nota.
7705
+ static lastKnownMetadataVersion = 0;
7700
7706
  static minMetadataVersionIntervalMs = 5000;
7701
7707
  static minReportListIntervalMs = 5000;
7702
7708
  static reportListInFlightByRoute = new Map();
@@ -10565,9 +10571,9 @@ ${extraScope} ${suggestCallbackSanitized}
10565
10571
  }
10566
10572
  /**
10567
10573
  * Recupera `ProjectMetadataVersion` dal backend solo quando la cache versione e scaduta;
10568
- * usa `MetaService.getAppSettings` e salva timestamp+versione in localStorage per ridurre chiamate ripetute.
10574
+ * usa `MetaService.getAppSettings`, salva il timestamp in localStorage e la versione in memoria per ridurre chiamate ripetute.
10569
10575
  * @param offsetMs Offset fuso client in millisecondi da riportare al backend.
10570
- * @returns Versione metadata progetto corrente oppure `null` se cache ancora valida/errore.
10576
+ * @returns Versione metadata progetto corrente (dentro la finestra: l'ultima letta dal backend).
10571
10577
  */
10572
10578
  async getProjectMetadataVersionIfExpired(offsetMs) {
10573
10579
  const effectiveOffsetMs = Math.max(Number(offsetMs) || 0, MetadataProviderService.minMetadataVersionIntervalMs);
@@ -10578,14 +10584,30 @@ ${extraScope} ${suggestCallbackSanitized}
10578
10584
  ? lastFromStorage
10579
10585
  : MetadataProviderService.lastMetadataVersionCheckAtMs;
10580
10586
  if (effectiveOffsetMs > 0 && lastCheckAt > 0 && nowMs <= (lastCheckAt + effectiveOffsetMs)) {
10581
- return null;
10587
+ // Dentro la finestra NON si ritorna `null` ("cache valida"): la finestra
10588
+ // vale per TUTTE le route, e al caricamento della pagina la prima route
10589
+ // (il menu) scarica la versione nuova; le route lette subito dopo
10590
+ // ricevevano `null` e servivano la cache Dexie stale senza confrontarla
10591
+ // (verificato 23/09 su cities: stile colonna appena inserito + invalidate
10592
+ // + reload, la list-grid restava con i metadati vecchi). Si restituisce
10593
+ // l'ultima versione letta DA QUESTA PAGINA, se letta dentro la finestra:
10594
+ // il chiamante la confronta con quella in cache.
10595
+ const ownCheckAt = MetadataProviderService.lastMetadataVersionCheckAtMs;
10596
+ const knownVersion = MetadataProviderService.lastKnownMetadataVersion;
10597
+ if (knownVersion > 0 && ownCheckAt > 0 && nowMs <= (ownCheckAt + effectiveOffsetMs)) {
10598
+ return knownVersion;
10599
+ }
10600
+ // Timestamp scritto prima del reload o da un'altra scheda: la versione
10601
+ // non e' nota qui, si interroga il backend invece di fidarsi della cache.
10582
10602
  }
10583
10603
  if (!MetadataProviderService.metadataVersionInFlight) {
10584
10604
  MetadataProviderService.metadataVersionInFlight = this.http.post(this.getMetadataVersionUri, {}).toPromise().then((version) => {
10585
10605
  const checkedAt = Date.now();
10586
10606
  MetadataProviderService.lastMetadataVersionCheckAtMs = checkedAt;
10587
10607
  localStorage.setItem("lastprojectmetaversionretrieve", String(checkedAt));
10588
- return Number(version || 0);
10608
+ const fetchedVersion = Number(version || 0);
10609
+ MetadataProviderService.lastKnownMetadataVersion = fetchedVersion;
10610
+ return fetchedVersion;
10589
10611
  }).finally(() => {
10590
10612
  MetadataProviderService.metadataVersionInFlight = undefined;
10591
10613
  });
@@ -15265,6 +15287,12 @@ class DataSourceComponent {
15265
15287
  * Proprieta di stato del componente per last action, usata dalla logica interna e dal template.
15266
15288
  */
15267
15289
  lastAction = null;
15290
+ /**
15291
+ * Ultimo valore del parametro di route `:filters` (id del record in edit/detail, o
15292
+ * descriptor `campo||op||valore`) visto dal gestore NavigationEnd: serve a riconoscere
15293
+ * una navigazione che cambia SOLO il record, a parita' di route e action.
15294
+ */
15295
+ lastRouteFiltersParam = null;
15268
15296
  /**
15269
15297
  * Contatore richieste in-flight per gestire il busy in modo concorrente-safe.
15270
15298
  */
@@ -15692,6 +15720,7 @@ class DataSourceComponent {
15692
15720
  }
15693
15721
  catch { /* defensive */ }
15694
15722
  this.lastAction = this.aRoute.snapshot.paramMap.get('action');
15723
+ this.lastRouteFiltersParam = this.aRoute.snapshot.paramMap.get('filters');
15695
15724
  if (this.routeFromRouting) {
15696
15725
  this.routerEventsSubscription?.unsubscribe();
15697
15726
  this.routerEventsSubscription = this.router.events.subscribe((val) => {
@@ -15708,7 +15737,21 @@ class DataSourceComponent {
15708
15737
  const pageInfoChanged = currentPageInfoQueryRaw !== this.lastPageInfoQueryRaw;
15709
15738
  const sortInfoChanged = currentSortInfoQueryRaw !== this.lastSortInfoQueryRaw;
15710
15739
  const actionChanged = this.lastAction !== newaction;
15711
- if (this.route.value && (newroute !== this.route.value || actionChanged)) {
15740
+ // Anche il solo cambio di `:filters` va ricaricato. Da `cities/edit/1` a
15741
+ // `cities/edit/3` la configurazione di route e' la stessa, quindi Angular riusa
15742
+ // il componente e questo datasource: con il confronto solo su route e action non
15743
+ // partiva nessuna getFlatRecordData, la form di edit/3 mostrava il record 1 e il
15744
+ // salvataggio lo avrebbe sovrascritto. Stesso difetto su `detail/<id>` e su
15745
+ // `list/<campo||op||valore>`. Si passa dal ramo del cambio action (init completo)
15746
+ // e non da un semplice fetchData perche' applyRouteParamFilterFromSnapshot
15747
+ // aggiorna o aggiunge il filtro di route ma non toglie quello precedente: con un
15748
+ // descriptor su un campo diverso resterebbero attivi entrambi.
15749
+ // Nessun doppio caricamento: al primo ingresso (e da list a edit, che cambia
15750
+ // configurazione di route e ricrea il componente) il valore e' gia' allineato in
15751
+ // ngOnInit, e se cambiano insieme action e record il ramo scatta una volta sola.
15752
+ const newFiltersParam = this.aRoute.snapshot.paramMap.get('filters');
15753
+ const filtersParamChanged = this.lastRouteFiltersParam !== newFiltersParam;
15754
+ if (this.route.value && (newroute !== this.route.value || actionChanged || filtersParamChanged)) {
15712
15755
  this.init();
15713
15756
  this.applyFilterInfoFromQueryString();
15714
15757
  this.applyPageInfoFromQueryString();
@@ -15730,6 +15773,7 @@ class DataSourceComponent {
15730
15773
  }
15731
15774
  }
15732
15775
  this.lastAction = newaction;
15776
+ this.lastRouteFiltersParam = newFiltersParam;
15733
15777
  }
15734
15778
  });
15735
15779
  this.applyFilterInfoFromQueryString();
@@ -17232,11 +17276,18 @@ class DataSourceComponent {
17232
17276
  // Si emette su fetchInfo$ direttamente e NON tramite publishFetchInfo, perche' quello
17233
17277
  // fa scattare anche afterFirstLoad$ — che i consumer aspettano per il primo
17234
17278
  // caricamento VERO, non per un payload vuoto.
17279
+ //
17280
+ // `preliminare: true` lo dichiara anche a chi legge solo fetchInfo$: la form di
17281
+ // edit (parametric-dialog) su questo payload crea un record vuoto con
17282
+ // addNewRecord, e senza il marcatore scambiava quel record per quello caricato
17283
+ // (data-record-loaded="true" con i campi ancora vuoti, prima ancora che partisse
17284
+ // getFlatRecordData).
17235
17285
  if (!this.resultInfo?.dato?.length) {
17236
17286
  this.fetchInfo$.next({
17237
17287
  resultInfo: { ...this.resultInfo, dato: [], totalRowCount: 0 },
17238
17288
  metaInfo: this.metaInfo,
17239
- filterDescriptor: this.filterDescriptor
17289
+ filterDescriptor: this.filterDescriptor,
17290
+ preliminare: true
17240
17291
  });
17241
17292
  }
17242
17293
  await this.fetchData();
@@ -19668,6 +19719,82 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
19668
19719
  type: Output
19669
19720
  }] } });
19670
19721
 
19722
+ /**
19723
+ * Espone l'istanza del componente sull'elemento DOM ospite come `__wuicCmp`.
19724
+ *
19725
+ * PERCHE'. I test e2e docs-driven devono poter leggere lo stato runtime di un
19726
+ * componente. Lo facevano con `window.ng.getComponent(host)`, che Angular
19727
+ * **rimuove nelle build di produzione** (`enableProdMode` toglie i debug tools):
19728
+ * contro un'installazione vera — cioe' quella che usano i clienti — quei test
19729
+ * non fallivano per un difetto, fallivano perche' lo strumento non c'era.
19730
+ * Misurato il 21/09/2026 sulla campagna docs-driven: **una trentina di prove**
19731
+ * (`timeline-list`, `list-grid`, `chart-list`, `kanban-list`, `scheduler-list`,
19732
+ * `tree-list`, `carousel-list`, `designer`, piu' tutti gli `--host-events`)
19733
+ * chiudevano con "introspezione runtime fallita: window.ng.getComponent not
19734
+ * available (production build?)", su entrambi i motori e su entrambi i sistemi
19735
+ * operativi.
19736
+ *
19737
+ * `__wuicCmp` e' la strada gia' adottata da `pivot-builder`, `report-designer`,
19738
+ * `workflow-designer`, `data-source`, `code-editor` e `app-settings-editor`, e
19739
+ * 11 test la cercano gia' prima di ripiegare su `window.ng`. Questo helper la
19740
+ * rende una riga sola, senza toccare costruttori ne' cicli di vita:
19741
+ *
19742
+ * ```ts
19743
+ * export class ListGridComponent {
19744
+ * private readonly wuicCmpHandle = exposeWuicCmpOnHost(this);
19745
+ * }
19746
+ * ```
19747
+ *
19748
+ * QUANDO SI ATTACCA. Non sempre: esporre l'istanza di un componente la rende
19749
+ * raggiungibile da qualunque script della pagina, e in un'installazione di un
19750
+ * cliente non serve a nessuno. Quindi:
19751
+ *
19752
+ * - in sviluppo (`isDevMode()`): sempre, dove `window.ng` c'e' comunque;
19753
+ * - in produzione: SOLO se la pagina ha dichiarato `globalThis.__wuicE2E = true`
19754
+ * prima dell'avvio dell'applicazione. Lo fa il bootstrap dei test e2e
19755
+ * (`playwright/docs/_shared/e2e-login-utils.mjs`, via `addInitScript`), non
19756
+ * il prodotto.
19757
+ *
19758
+ * Costo quando e' attivo: un assegnamento di proprieta' per istanza piu' una
19759
+ * callback di pulizia. Quando e' spento: un confronto booleano.
19760
+ */
19761
+ function exposeWuicCmpOnHost(cmp) {
19762
+ try {
19763
+ if (!isWuicIntrospectionEnabled()) {
19764
+ return;
19765
+ }
19766
+ const ref = inject(ElementRef, { optional: true });
19767
+ const el = ref?.nativeElement;
19768
+ if (!el) {
19769
+ return;
19770
+ }
19771
+ el.__wuicCmp = cmp;
19772
+ // Pulizia senza obbligare il componente ad avere (o a modificare) ngOnDestroy.
19773
+ inject(DestroyRef, { optional: true })?.onDestroy(() => {
19774
+ try {
19775
+ delete el.__wuicCmp;
19776
+ }
19777
+ catch { /* elemento gia' smontato */ }
19778
+ });
19779
+ }
19780
+ catch {
19781
+ // Fuori da un contesto di injection, o ambiente senza DOM (unit test, SSR):
19782
+ // l'handle e' un extra, non deve mai rompere il componente.
19783
+ }
19784
+ }
19785
+ /** True quando l'introspezione dei test e' consentita su questa pagina. */
19786
+ function isWuicIntrospectionEnabled() {
19787
+ try {
19788
+ if (isDevMode()) {
19789
+ return true;
19790
+ }
19791
+ return globalThis.__wuicE2E === true;
19792
+ }
19793
+ catch {
19794
+ return false;
19795
+ }
19796
+ }
19797
+
19671
19798
  /**
19672
19799
  * Metametrics — Dashboard amministrativa delle metriche route
19673
19800
  * (menu Amministrazione → route `/route-metrics-dashboard`).
@@ -19705,6 +19832,9 @@ class RouteMetricsDashboardComponent {
19705
19832
  metric = 'fetch';
19706
19833
  valueKind = 'avg';
19707
19834
  scope = 'global';
19835
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E): in build di
19836
+ * produzione `window.ng` non c'e' e route-metrics-dashboard--filters legge lo stato da qui. */
19837
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
19708
19838
  /** Palette serie (ciclica) — colori PrimeNG standard, ok light/dark. */
19709
19839
  palette = ['#3b82f6', '#22c55e', '#f97316', '#a855f7', '#ef4444', '#14b8a6', '#eab308', '#64748b'];
19710
19840
  /**
@@ -22001,7 +22131,7 @@ class LazySchedulerListComponent {
22001
22131
  * Inizializza il componente preparando stato, sottoscrizioni e primi caricamenti richiesti.
22002
22132
  */
22003
22133
  async ngOnInit() {
22004
- schedulerListComponentPromise ??= import('./wuic-framework-lib-scheduler-list.component-CEMQJrsN.mjs').then((m) => m.SchedulerListComponent);
22134
+ schedulerListComponentPromise ??= import('./wuic-framework-lib-scheduler-list.component-BXx84Cc7.mjs').then((m) => m.SchedulerListComponent);
22005
22135
  this.loadedComponent = await schedulerListComponentPromise;
22006
22136
  this.cdr.markForCheck();
22007
22137
  }
@@ -22209,7 +22339,7 @@ class LazySpreadsheetListSfComponent {
22209
22339
  this.activatedRoute = activatedRoute;
22210
22340
  }
22211
22341
  async ngOnInit() {
22212
- spreadsheetListSfComponentPromise ??= import('./wuic-framework-lib-spreadsheet-list-sf.component-Cgmf9tb1.mjs').then((m) => m.SpreadsheetListSfComponent);
22342
+ spreadsheetListSfComponentPromise ??= import('./wuic-framework-lib-spreadsheet-list-sf.component-v7rE3WW_.mjs').then((m) => m.SpreadsheetListSfComponent);
22213
22343
  this.loadedComponent = await spreadsheetListSfComponentPromise;
22214
22344
  // Quando la promise e' gia' risolta dal cache module-scope (secondo mount
22215
22345
  // post-refresh), il microtask che risolve `await` non scatena sempre CD
@@ -22487,7 +22617,7 @@ class LazyChartListComponent {
22487
22617
  * Inizializza il componente preparando stato, sottoscrizioni e primi caricamenti richiesti.
22488
22618
  */
22489
22619
  async ngOnInit() {
22490
- chartListComponentPromise ??= import('./wuic-framework-lib-chart-list.component-C9rj-6-8.mjs').then((m) => m.ChartListComponent);
22620
+ chartListComponentPromise ??= import('./wuic-framework-lib-chart-list.component-BIpu6QY3.mjs').then((m) => m.ChartListComponent);
22491
22621
  this.loadedComponent = await chartListComponentPromise;
22492
22622
  this.cdr.markForCheck();
22493
22623
  }
@@ -22809,7 +22939,7 @@ class LazyTimelineListComponent {
22809
22939
  this.cdr = cdr;
22810
22940
  }
22811
22941
  async ngOnInit() {
22812
- timelineListComponentPromise ??= import('./wuic-framework-lib-timeline-list.component-B_bRKY_H.mjs').then((m) => m.TimelineListComponent);
22942
+ timelineListComponentPromise ??= import('./wuic-framework-lib-timeline-list.component-CP9PpRQB.mjs').then((m) => m.TimelineListComponent);
22813
22943
  this.loadedComponent = await timelineListComponentPromise;
22814
22944
  this.cdr.markForCheck();
22815
22945
  }
@@ -24078,7 +24208,7 @@ class MetadataEditorComponent {
24078
24208
  }
24079
24209
  let result;
24080
24210
  try {
24081
- const { ReportScaffoldDialogComponent } = await import('./wuic-framework-lib-report-scaffold-dialog.component-BsKSP1Dk.mjs');
24211
+ const { ReportScaffoldDialogComponent } = await import('./wuic-framework-lib-report-scaffold-dialog.component-okexsstE.mjs');
24082
24212
  WtoolboxService.resolveDialogServiceFromInjector();
24083
24213
  const ref = WtoolboxService.dialogService?.open?.(ReportScaffoldDialogComponent, {
24084
24214
  header: this.t('report.scaffold.dialog_title', 'Create report'),
@@ -26719,6 +26849,15 @@ class PointFilterComponent {
26719
26849
  * Proprieta di stato del componente per map zoom, usata dalla logica interna e dal template.
26720
26850
  */
26721
26851
  mapZoom = 6;
26852
+ /**
26853
+ * Il template monta `<google-map>` solo se lo script Maps e' caricato (stesso controllo di
26854
+ * `MapListComponent.isMapsApiAvailable`). E' un getter perche' la condizione va rivalutata a
26855
+ * ogni change detection: se lo script arriva dopo, la mappa compare senza ricaricare.
26856
+ */
26857
+ get mapsApiReady() {
26858
+ const g = globalThis.google;
26859
+ return !!(g && g.maps && typeof g.maps.importLibrary === 'function');
26860
+ }
26722
26861
  /**
26723
26862
  * Modalita' di disegno corrente. Sostituisce `google.maps.drawing.DrawingManager`
26724
26863
  * deprecato (Maps JavaScript API drawing library, deprecated 2025-08, removed
@@ -27274,11 +27413,11 @@ class PointFilterComponent {
27274
27413
  };
27275
27414
  }
27276
27415
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: PointFilterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
27277
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: PointFilterComponent, isStandalone: true, selector: "wuic-point-filter", inputs: { record: "record", field: "field", metaInfo: "metaInfo", datasource: "datasource" }, viewQueries: [{ propertyName: "map", first: true, predicate: GoogleMap, descendants: true }], ngImport: i0, template: "<div class=\"point-filter-box\">\r\n <div class=\"point-filter-actions\">\r\n <button pButton type=\"button\" icon=\"pi pi-map\" [pTooltip]=\"'map.configure' | translate\" tooltipPosition=\"top\"\r\n class=\"p-button-sm\" (click)=\"openDialog()\"></button>\r\n <button pButton type=\"button\" icon=\"pi pi-times\" [pTooltip]=\"'form_reset' | translate\" tooltipPosition=\"top\"\r\n class=\"p-button-sm p-button-secondary p-button-outlined\" (click)=\"clearFilter()\"></button>\r\n\r\n <span class=\"point-filter-status\">\r\n @if (pendingOperator === 'maparea') {\r\n <i class=\"pi pi-check-circle point-filter-status-icon active\"></i>\r\n <span>{{ 'point_filter.area_ready' | translate }}</span>\r\n } @else if (pendingOperator === 'mapdistance') {\r\n <i class=\"pi pi-check-circle point-filter-status-icon active\"></i>\r\n <span>{{ 'point_filter.circle_ready' | translate }}</span>\r\n } @else {\r\n <i class=\"pi pi-map-marker point-filter-status-icon\"></i>\r\n <span>{{ 'point_filter.none' | translate }}</span>\r\n }\r\n </span>\r\n </div>\r\n</div>\r\n\r\n<p-dialog [header]=\"'point_filter.header' | translate\" [(visible)]=\"dialogVisible\" [modal]=\"true\" [closable]=\"true\" [style]=\"{ width: '920px', maxWidth: '95vw' }\">\r\n <div class=\"point-filter-dialog-actions\">\r\n <button pButton type=\"button\" icon=\"pi pi-pencil\" [label]=\"'point_filter.draw_area' | translate\"\r\n class=\"p-button-sm\" (click)=\"drawArea()\"></button>\r\n <button pButton type=\"button\" icon=\"pi pi-circle\" [label]=\"'point_filter.draw_circle' | translate\"\r\n class=\"p-button-sm\" (click)=\"drawCircle()\"></button>\r\n <button pButton type=\"button\" icon=\"pi pi-trash\" [label]=\"'point_filter.clear_shape' | translate\"\r\n class=\"p-button-sm p-button-secondary p-button-outlined\" (click)=\"clearShapes()\"></button>\r\n </div>\r\n\r\n <google-map [height]=\"'420px'\" [width]=\"'100%'\" [center]=\"mapCenter\" [zoom]=\"mapZoom\"></google-map>\r\n\r\n <ng-template pTemplate=\"footer\">\r\n <button pButton type=\"button\" icon=\"pi pi-times\" [label]=\"'cancel' | translate\"\r\n class=\"p-button-secondary\" (click)=\"closeDialog()\"></button>\r\n <button pButton type=\"button\" icon=\"pi pi-check\" [label]=\"'point_filter.use_filter' | translate\"\r\n (click)=\"applyFilter()\"></button>\r\n </ng-template>\r\n</p-dialog>\r\n", styles: [".point-filter-box{display:flex;flex-direction:column;gap:.25rem}.point-filter-actions{display:flex;align-items:center;gap:.4rem}.point-filter-status{display:inline-flex;align-items:center;gap:.3rem;font-size:.8rem;color:#64748b;margin-left:.25rem}.point-filter-status-icon{font-size:.85rem;color:#94a3b8}.point-filter-status-icon.active{color:#22c55e}.point-filter-dialog-actions{display:flex;gap:.5rem;margin-bottom:.75rem}\n"], dependencies: [{ kind: "ngmodule", type: GoogleMapsModule }, { kind: "component", type: i5$2.GoogleMap, selector: "google-map", inputs: ["height", "width", "mapId", "mapTypeId", "center", "zoom", "options"], outputs: ["mapInitialized", "authFailure", "boundsChanged", "centerChanged", "mapClick", "mapDblclick", "mapDrag", "mapDragend", "mapDragstart", "headingChanged", "idle", "maptypeidChanged", "mapMousemove", "mapMouseout", "mapMouseover", "projectionChanged", "mapRightclick", "tilesloaded", "tiltChanged", "zoomChanged"], exportAs: ["googleMap"] }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i2.Dialog, selector: "p-dialog", inputs: ["hostName", "header", "draggable", "resizable", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "maskMotionOptions", "motionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "closeButtonProps", "maximizeButtonProps", "visible", "style", "position", "role", "appendTo", "content", "contentTemplate", "footerTemplate", "closeIconTemplate", "maximizeIconTemplate", "minimizeIconTemplate", "headlessTemplate"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i4.ButtonDirective, selector: "[pButton]", inputs: ["ptButtonDirective", "pButtonPT", "pButtonUnstyled", "hostName", "text", "plain", "raised", "size", "outlined", "rounded", "iconPos", "loadingIcon", "fluid", "label", "icon", "loading", "buttonProps", "severity"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i7.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "showOnEllipsis", "pTooltip", "tooltipDisabled", "tooltipOptions", "appendTo", "ptTooltip", "pTooltipPT", "pTooltipUnstyled"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i8.TranslatePipe, name: "translate" }] });
27416
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: PointFilterComponent, isStandalone: true, selector: "wuic-point-filter", inputs: { record: "record", field: "field", metaInfo: "metaInfo", datasource: "datasource" }, viewQueries: [{ propertyName: "map", first: true, predicate: GoogleMap, descendants: true }], ngImport: i0, template: "<div class=\"point-filter-box\">\r\n <div class=\"point-filter-actions\">\r\n <button pButton type=\"button\" icon=\"pi pi-map\" [pTooltip]=\"'map.configure' | translate\" tooltipPosition=\"top\"\r\n class=\"p-button-sm\" (click)=\"openDialog()\"></button>\r\n <button pButton type=\"button\" icon=\"pi pi-times\" [pTooltip]=\"'form_reset' | translate\" tooltipPosition=\"top\"\r\n class=\"p-button-sm p-button-secondary p-button-outlined\" (click)=\"clearFilter()\"></button>\r\n\r\n <span class=\"point-filter-status\">\r\n @if (pendingOperator === 'maparea') {\r\n <i class=\"pi pi-check-circle point-filter-status-icon active\"></i>\r\n <span>{{ 'point_filter.area_ready' | translate }}</span>\r\n } @else if (pendingOperator === 'mapdistance') {\r\n <i class=\"pi pi-check-circle point-filter-status-icon active\"></i>\r\n <span>{{ 'point_filter.circle_ready' | translate }}</span>\r\n } @else {\r\n <i class=\"pi pi-map-marker point-filter-status-icon\"></i>\r\n <span>{{ 'point_filter.none' | translate }}</span>\r\n }\r\n </span>\r\n </div>\r\n</div>\r\n\r\n<p-dialog [header]=\"'point_filter.header' | translate\" [(visible)]=\"dialogVisible\" [modal]=\"true\" [closable]=\"true\" [style]=\"{ width: '920px', maxWidth: '95vw' }\">\r\n <div class=\"point-filter-dialog-actions\">\r\n <button pButton type=\"button\" icon=\"pi pi-pencil\" [label]=\"'point_filter.draw_area' | translate\"\r\n class=\"p-button-sm\" (click)=\"drawArea()\"></button>\r\n <button pButton type=\"button\" icon=\"pi pi-circle\" [label]=\"'point_filter.draw_circle' | translate\"\r\n class=\"p-button-sm\" (click)=\"drawCircle()\"></button>\r\n <button pButton type=\"button\" icon=\"pi pi-trash\" [label]=\"'point_filter.clear_shape' | translate\"\r\n class=\"p-button-sm p-button-secondary p-button-outlined\" (click)=\"clearShapes()\"></button>\r\n </div>\r\n\r\n <!-- `mapsApiReady` come in map-list: il contenuto proiettato nel p-dialog viene creato\r\n SUBITO, anche a dialog chiuso, quindi <google-map> girava il suo ngOnInit appena la\r\n filter-bar mostrava il filtro geografico. Senza lo script Maps (chiave API vuota) lanciava\r\n `ReferenceError: google is not defined`, che apriva il dialog di errore applicativo sopra\r\n la filter-bar e bloccava tutta la pagina (cella Windows x postgres, 23/09/2026:\r\n filter-bar--operators, responsive filter-bar-overlay, point-filter--*). -->\r\n @if (mapsApiReady) {\r\n <google-map [height]=\"'420px'\" [width]=\"'100%'\" [center]=\"mapCenter\" [zoom]=\"mapZoom\"></google-map>\r\n } @else {\r\n <div class=\"point-filter-map-unavailable\" role=\"status\">\r\n <i class=\"pi pi-map\" aria-hidden=\"true\"></i>\r\n <div class=\"point-filter-map-unavailable__title\">{{ 'map.api_key_missing.title' | translate }}</div>\r\n <div>{{ 'map.api_key_missing.detail' | translate }}</div>\r\n </div>\r\n }\r\n\r\n <ng-template pTemplate=\"footer\">\r\n <button pButton type=\"button\" icon=\"pi pi-times\" [label]=\"'cancel' | translate\"\r\n class=\"p-button-secondary\" (click)=\"closeDialog()\"></button>\r\n <button pButton type=\"button\" icon=\"pi pi-check\" [label]=\"'point_filter.use_filter' | translate\"\r\n (click)=\"applyFilter()\"></button>\r\n </ng-template>\r\n</p-dialog>\r\n", styles: [".point-filter-box{display:flex;flex-direction:column;gap:.25rem}.point-filter-actions{display:flex;align-items:center;gap:.4rem}.point-filter-status{display:inline-flex;align-items:center;gap:.3rem;font-size:.8rem;color:#64748b;margin-left:.25rem}.point-filter-status-icon{font-size:.85rem;color:#94a3b8}.point-filter-status-icon.active{color:#22c55e}.point-filter-dialog-actions{display:flex;gap:.5rem;margin-bottom:.75rem}.point-filter-map-unavailable{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.5rem;min-height:220px;padding:1.5rem;text-align:center;color:var(--text-color-secondary, #64748b);border:1px dashed var(--surface-border, #e2e8f0)}.point-filter-map-unavailable__title{font-weight:600}\n"], dependencies: [{ kind: "ngmodule", type: GoogleMapsModule }, { kind: "component", type: i5$2.GoogleMap, selector: "google-map", inputs: ["height", "width", "mapId", "mapTypeId", "center", "zoom", "options"], outputs: ["mapInitialized", "authFailure", "boundsChanged", "centerChanged", "mapClick", "mapDblclick", "mapDrag", "mapDragend", "mapDragstart", "headingChanged", "idle", "maptypeidChanged", "mapMousemove", "mapMouseout", "mapMouseover", "projectionChanged", "mapRightclick", "tilesloaded", "tiltChanged", "zoomChanged"], exportAs: ["googleMap"] }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i2.Dialog, selector: "p-dialog", inputs: ["hostName", "header", "draggable", "resizable", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "maskMotionOptions", "motionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "closeButtonProps", "maximizeButtonProps", "visible", "style", "position", "role", "appendTo", "content", "contentTemplate", "footerTemplate", "closeIconTemplate", "maximizeIconTemplate", "minimizeIconTemplate", "headlessTemplate"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i4.ButtonDirective, selector: "[pButton]", inputs: ["ptButtonDirective", "pButtonPT", "pButtonUnstyled", "hostName", "text", "plain", "raised", "size", "outlined", "rounded", "iconPos", "loadingIcon", "fluid", "label", "icon", "loading", "buttonProps", "severity"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i7.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "showOnEllipsis", "pTooltip", "tooltipDisabled", "tooltipOptions", "appendTo", "ptTooltip", "pTooltipPT", "pTooltipUnstyled"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i8.TranslatePipe, name: "translate" }] });
27278
27417
  }
27279
27418
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: PointFilterComponent, decorators: [{
27280
27419
  type: Component,
27281
- args: [{ selector: 'wuic-point-filter', imports: [GoogleMapsModule, DialogModule, ButtonModule, TooltipModule, TranslateModule], template: "<div class=\"point-filter-box\">\r\n <div class=\"point-filter-actions\">\r\n <button pButton type=\"button\" icon=\"pi pi-map\" [pTooltip]=\"'map.configure' | translate\" tooltipPosition=\"top\"\r\n class=\"p-button-sm\" (click)=\"openDialog()\"></button>\r\n <button pButton type=\"button\" icon=\"pi pi-times\" [pTooltip]=\"'form_reset' | translate\" tooltipPosition=\"top\"\r\n class=\"p-button-sm p-button-secondary p-button-outlined\" (click)=\"clearFilter()\"></button>\r\n\r\n <span class=\"point-filter-status\">\r\n @if (pendingOperator === 'maparea') {\r\n <i class=\"pi pi-check-circle point-filter-status-icon active\"></i>\r\n <span>{{ 'point_filter.area_ready' | translate }}</span>\r\n } @else if (pendingOperator === 'mapdistance') {\r\n <i class=\"pi pi-check-circle point-filter-status-icon active\"></i>\r\n <span>{{ 'point_filter.circle_ready' | translate }}</span>\r\n } @else {\r\n <i class=\"pi pi-map-marker point-filter-status-icon\"></i>\r\n <span>{{ 'point_filter.none' | translate }}</span>\r\n }\r\n </span>\r\n </div>\r\n</div>\r\n\r\n<p-dialog [header]=\"'point_filter.header' | translate\" [(visible)]=\"dialogVisible\" [modal]=\"true\" [closable]=\"true\" [style]=\"{ width: '920px', maxWidth: '95vw' }\">\r\n <div class=\"point-filter-dialog-actions\">\r\n <button pButton type=\"button\" icon=\"pi pi-pencil\" [label]=\"'point_filter.draw_area' | translate\"\r\n class=\"p-button-sm\" (click)=\"drawArea()\"></button>\r\n <button pButton type=\"button\" icon=\"pi pi-circle\" [label]=\"'point_filter.draw_circle' | translate\"\r\n class=\"p-button-sm\" (click)=\"drawCircle()\"></button>\r\n <button pButton type=\"button\" icon=\"pi pi-trash\" [label]=\"'point_filter.clear_shape' | translate\"\r\n class=\"p-button-sm p-button-secondary p-button-outlined\" (click)=\"clearShapes()\"></button>\r\n </div>\r\n\r\n <google-map [height]=\"'420px'\" [width]=\"'100%'\" [center]=\"mapCenter\" [zoom]=\"mapZoom\"></google-map>\r\n\r\n <ng-template pTemplate=\"footer\">\r\n <button pButton type=\"button\" icon=\"pi pi-times\" [label]=\"'cancel' | translate\"\r\n class=\"p-button-secondary\" (click)=\"closeDialog()\"></button>\r\n <button pButton type=\"button\" icon=\"pi pi-check\" [label]=\"'point_filter.use_filter' | translate\"\r\n (click)=\"applyFilter()\"></button>\r\n </ng-template>\r\n</p-dialog>\r\n", styles: [".point-filter-box{display:flex;flex-direction:column;gap:.25rem}.point-filter-actions{display:flex;align-items:center;gap:.4rem}.point-filter-status{display:inline-flex;align-items:center;gap:.3rem;font-size:.8rem;color:#64748b;margin-left:.25rem}.point-filter-status-icon{font-size:.85rem;color:#94a3b8}.point-filter-status-icon.active{color:#22c55e}.point-filter-dialog-actions{display:flex;gap:.5rem;margin-bottom:.75rem}\n"] }]
27420
+ args: [{ selector: 'wuic-point-filter', imports: [GoogleMapsModule, DialogModule, ButtonModule, TooltipModule, TranslateModule], template: "<div class=\"point-filter-box\">\r\n <div class=\"point-filter-actions\">\r\n <button pButton type=\"button\" icon=\"pi pi-map\" [pTooltip]=\"'map.configure' | translate\" tooltipPosition=\"top\"\r\n class=\"p-button-sm\" (click)=\"openDialog()\"></button>\r\n <button pButton type=\"button\" icon=\"pi pi-times\" [pTooltip]=\"'form_reset' | translate\" tooltipPosition=\"top\"\r\n class=\"p-button-sm p-button-secondary p-button-outlined\" (click)=\"clearFilter()\"></button>\r\n\r\n <span class=\"point-filter-status\">\r\n @if (pendingOperator === 'maparea') {\r\n <i class=\"pi pi-check-circle point-filter-status-icon active\"></i>\r\n <span>{{ 'point_filter.area_ready' | translate }}</span>\r\n } @else if (pendingOperator === 'mapdistance') {\r\n <i class=\"pi pi-check-circle point-filter-status-icon active\"></i>\r\n <span>{{ 'point_filter.circle_ready' | translate }}</span>\r\n } @else {\r\n <i class=\"pi pi-map-marker point-filter-status-icon\"></i>\r\n <span>{{ 'point_filter.none' | translate }}</span>\r\n }\r\n </span>\r\n </div>\r\n</div>\r\n\r\n<p-dialog [header]=\"'point_filter.header' | translate\" [(visible)]=\"dialogVisible\" [modal]=\"true\" [closable]=\"true\" [style]=\"{ width: '920px', maxWidth: '95vw' }\">\r\n <div class=\"point-filter-dialog-actions\">\r\n <button pButton type=\"button\" icon=\"pi pi-pencil\" [label]=\"'point_filter.draw_area' | translate\"\r\n class=\"p-button-sm\" (click)=\"drawArea()\"></button>\r\n <button pButton type=\"button\" icon=\"pi pi-circle\" [label]=\"'point_filter.draw_circle' | translate\"\r\n class=\"p-button-sm\" (click)=\"drawCircle()\"></button>\r\n <button pButton type=\"button\" icon=\"pi pi-trash\" [label]=\"'point_filter.clear_shape' | translate\"\r\n class=\"p-button-sm p-button-secondary p-button-outlined\" (click)=\"clearShapes()\"></button>\r\n </div>\r\n\r\n <!-- `mapsApiReady` come in map-list: il contenuto proiettato nel p-dialog viene creato\r\n SUBITO, anche a dialog chiuso, quindi <google-map> girava il suo ngOnInit appena la\r\n filter-bar mostrava il filtro geografico. Senza lo script Maps (chiave API vuota) lanciava\r\n `ReferenceError: google is not defined`, che apriva il dialog di errore applicativo sopra\r\n la filter-bar e bloccava tutta la pagina (cella Windows x postgres, 23/09/2026:\r\n filter-bar--operators, responsive filter-bar-overlay, point-filter--*). -->\r\n @if (mapsApiReady) {\r\n <google-map [height]=\"'420px'\" [width]=\"'100%'\" [center]=\"mapCenter\" [zoom]=\"mapZoom\"></google-map>\r\n } @else {\r\n <div class=\"point-filter-map-unavailable\" role=\"status\">\r\n <i class=\"pi pi-map\" aria-hidden=\"true\"></i>\r\n <div class=\"point-filter-map-unavailable__title\">{{ 'map.api_key_missing.title' | translate }}</div>\r\n <div>{{ 'map.api_key_missing.detail' | translate }}</div>\r\n </div>\r\n }\r\n\r\n <ng-template pTemplate=\"footer\">\r\n <button pButton type=\"button\" icon=\"pi pi-times\" [label]=\"'cancel' | translate\"\r\n class=\"p-button-secondary\" (click)=\"closeDialog()\"></button>\r\n <button pButton type=\"button\" icon=\"pi pi-check\" [label]=\"'point_filter.use_filter' | translate\"\r\n (click)=\"applyFilter()\"></button>\r\n </ng-template>\r\n</p-dialog>\r\n", styles: [".point-filter-box{display:flex;flex-direction:column;gap:.25rem}.point-filter-actions{display:flex;align-items:center;gap:.4rem}.point-filter-status{display:inline-flex;align-items:center;gap:.3rem;font-size:.8rem;color:#64748b;margin-left:.25rem}.point-filter-status-icon{font-size:.85rem;color:#94a3b8}.point-filter-status-icon.active{color:#22c55e}.point-filter-dialog-actions{display:flex;gap:.5rem;margin-bottom:.75rem}.point-filter-map-unavailable{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.5rem;min-height:220px;padding:1.5rem;text-align:center;color:var(--text-color-secondary, #64748b);border:1px dashed var(--surface-border, #e2e8f0)}.point-filter-map-unavailable__title{font-weight:600}\n"] }]
27282
27421
  }], propDecorators: { record: [{
27283
27422
  type: Input
27284
27423
  }], field: [{
@@ -27293,6 +27432,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
27293
27432
  }] } });
27294
27433
 
27295
27434
  class NumberEditorComponent {
27435
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
27436
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
27296
27437
  /**
27297
27438
  * Input dal componente padre per record; usata nella configurazione e nel rendering del componente.
27298
27439
  */
@@ -29626,6 +29767,8 @@ class BoundedRepeaterComponent {
29626
29767
  userService;
29627
29768
  sanitizer;
29628
29769
  cdr;
29770
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
29771
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
29629
29772
  /**
29630
29773
  * Input dal componente padre per hardcoded route; usata nella configurazione e nel rendering del componente.
29631
29774
  */
@@ -30178,6 +30321,8 @@ class FieldEditorComponent {
30178
30321
  userInfo;
30179
30322
  metadataEditorSrv;
30180
30323
  hostElementRef;
30324
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
30325
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
30181
30326
  static LABEL_FOR_SUPPORTED_WIDGETS = new Set([
30182
30327
  'text',
30183
30328
  'textarea',
@@ -31137,6 +31282,8 @@ class ParametricDialogComponent {
31137
31282
  hostElementRef;
31138
31283
  customAttributesService;
31139
31284
  dialogService;
31285
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
31286
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
31140
31287
  /**
31141
31288
  * Input dal componente padre per datasource; usata nella configurazione e nel rendering del componente.
31142
31289
  */
@@ -31361,7 +31508,11 @@ class ParametricDialogComponent {
31361
31508
  const fetchInfo$ = this.datasource.value?.fetchInfo$;
31362
31509
  if (fetchInfo$ && typeof fetchInfo$.subscribe === 'function') {
31363
31510
  this.fetchInfoSubscription = fetchInfo$.subscribe((info) => {
31364
- if (info?.metaInfo) {
31511
+ if (!info) {
31512
+ this.segnalaRecordNonCaricato();
31513
+ return;
31514
+ }
31515
+ if (info.metaInfo) {
31365
31516
  this.applyDatasourceSnapshot(this.datasource?.value, info.metaInfo);
31366
31517
  this.ensureWizardTrackingBound(this.datasource?.value);
31367
31518
  this.bootstrapConditionalActions();
@@ -31380,7 +31531,11 @@ class ParametricDialogComponent {
31380
31531
  const fetchInfo$ = this.datasource.value?.fetchInfo$;
31381
31532
  if (fetchInfo$ && typeof fetchInfo$.subscribe === 'function') {
31382
31533
  this.fetchInfoSubscription = fetchInfo$.subscribe((info) => {
31383
- if (info?.metaInfo) {
31534
+ if (!info) {
31535
+ this.segnalaRecordNonCaricato();
31536
+ return;
31537
+ }
31538
+ if (info.metaInfo) {
31384
31539
  this.applyDatasourceSnapshot(this.datasource?.value, info.metaInfo);
31385
31540
  this.ensureWizardTrackingBound(this.datasource?.value);
31386
31541
  this.bootstrapConditionalActions();
@@ -31442,6 +31597,62 @@ class ParametricDialogComponent {
31442
31597
  record: this.record,
31443
31598
  pristine: this.pristine
31444
31599
  });
31600
+ // `data-record-loaded`: il record non e' solo ASSEGNATO, i valori sono arrivati.
31601
+ //
31602
+ // Serviva distinguerlo. `wuic-field-editor` espone `data-has-record`, che vale
31603
+ // `this.record ? true : false`, cioe' diventa vero appena la form costruisce lo
31604
+ // scheletro — mentre `getFlatRecordData` e' ancora in volo (misurato su VM il
31605
+ // 21/09/2026: 1,3 s per il record, dentro una raffica di 18 `getTableMetadata`
31606
+ // paralleli, il piu' lento 2,8 s). Chi leggeva un campo appoggiandosi a quel
31607
+ // flag trovava stringa vuota e la scambiava per un difetto: otto prove
31608
+ // `field-widget-*` rosse su entrambi i motori.
31609
+ //
31610
+ // Avere un record non basta: questo metodo gira anche prima dei dati, e in quel
31611
+ // caso il record e' quello VUOTO creato qui sopra da `addNewRecord`. Succede
31612
+ // (a) sul payload anticipato del datasource (`preliminare: true`, emesso appena
31613
+ // arrivano i metadati) e (b) quando il dialogo nasce dopo il reset di `init()`,
31614
+ // con `fetchInfo$` ancora a null. Misurato il 23/09/2026 su Linux x MySQL e
31615
+ // Windows x PostgreSQL: il segnale saliva a +0,2 s, PRIMA che partisse la
31616
+ // richiesta `getFlatRecordData`, e il valore arrivava a +1,0/1,6 s. Si alza
31617
+ // quindi solo quando il payload corrente e' una risposta vera: quella del
31618
+ // record in edit, o quella vuota di un inserimento (dove il record di
31619
+ // `addNewRecord` E' il record giusto). Un datasource senza `fetchInfo$` (quello
31620
+ // costruito da `promptDialog`) non ha niente da caricare: il suo record e' gia'
31621
+ // quello definitivo.
31622
+ try {
31623
+ const el = this.hostElementRef?.nativeElement;
31624
+ const cicloDati = ds.fetchInfo$;
31625
+ const payloadCorrente = cicloDati?.value;
31626
+ const datiArrivati = !!this.record
31627
+ && (!cicloDati || (!!payloadCorrente && payloadCorrente.preliminare !== true));
31628
+ if (el) {
31629
+ el.setAttribute('data-record-loaded', datiArrivati ? 'true' : 'false');
31630
+ }
31631
+ }
31632
+ catch { /* ambiente senza DOM */ }
31633
+ }
31634
+ /**
31635
+ * Abbassa `data-record-loaded` quando il datasource pubblica `null` su `fetchInfo$`.
31636
+ *
31637
+ * Quel `null` lo emette solo `init()` del datasource, cioe' un ricaricamento appena
31638
+ * partito: da `cities/edit/A` a `cities/edit/B` il componente e' riusato e il
31639
+ * gestore NavigationEnd rifa' init + getSchemaAndData. La subscribe ignorava il
31640
+ * payload nullo, e siccome `resultInfo.dato` ha ancora il record A il datasource non
31641
+ * emette nemmeno il payload preliminare: il segnale restava "true" sul record A per
31642
+ * tutta la durata della richiesta di B, e chi lo aspettava leggeva i valori di A
31643
+ * credendoli di B. Qui non si ricalcola niente: con il payload corrente a `null` la
31644
+ * formula di `applyDatasourceSnapshot` darebbe comunque "false", e il segnale si
31645
+ * rialza da li' quando arriva la risposta vera. Il contratto degli altri casi non
31646
+ * cambia: popup (`config.data`, senza subscribe) e promptDialog (senza `fetchInfo$`)
31647
+ * non ricevono mai questo `null`; un inserimento raggiunto navigando riparte da
31648
+ * "false" e si rialza con la sua risposta vuota, come gia' prevedeva la formula; una
31649
+ * form senza record era gia' a "false".
31650
+ */
31651
+ segnalaRecordNonCaricato() {
31652
+ try {
31653
+ this.hostElementRef?.nativeElement?.setAttribute('data-record-loaded', 'false');
31654
+ }
31655
+ catch { /* ambiente senza DOM */ }
31445
31656
  }
31446
31657
  /**
31447
31658
  * In modalita wizard forza una singola riallocazione del current record sul datasource
@@ -34472,6 +34683,9 @@ class ImportExportButtonComponent {
34472
34683
  trslSrv;
34473
34684
  userInfo;
34474
34685
  cdr;
34686
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E): in build di
34687
+ * produzione `window.ng` non c'e' e i test leggono lo stato dei dialog import/export da qui. */
34688
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
34475
34689
  routeName = '';
34476
34690
  tableMetadata = null;
34477
34691
  /**
@@ -35310,6 +35524,8 @@ class ListGridComponent {
35310
35524
  deviceAwareness;
35311
35525
  zone;
35312
35526
  customAttributesService;
35527
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
35528
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
35313
35529
  static FORCED_VIRTUALIZATION_PAGE_SIZE_THRESHOLD = 1000;
35314
35530
  static FORCED_VIRTUALIZATION_ITEM_SIZE = 44;
35315
35531
  static ACTION_BUTTON_VISIBLE_ROWS_OVERSCAN = 4;
@@ -42271,6 +42487,8 @@ class MapListComponent {
42271
42487
  route;
42272
42488
  userInfo;
42273
42489
  trslSrv;
42490
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
42491
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
42274
42492
  /**
42275
42493
  * Riferimento a elementi o componenti figli usato dalla logica UI per map.
42276
42494
  */
@@ -44656,6 +44874,8 @@ class CarouselListComponent {
44656
44874
  route;
44657
44875
  trslSrv;
44658
44876
  userInfo;
44877
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
44878
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
44659
44879
  /**
44660
44880
  * Input dal componente padre per hardcoded route; usata nella configurazione e nel rendering del componente.
44661
44881
  */
@@ -45278,6 +45498,8 @@ class TreeListComponent {
45278
45498
  dataSrv;
45279
45499
  cd;
45280
45500
  trslSrv;
45501
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
45502
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
45281
45503
  /**
45282
45504
  * Input dal componente padre per hardcoded route; usata nella configurazione e nel rendering del componente.
45283
45505
  */
@@ -48602,6 +48824,8 @@ class MetaMenuComponent {
48602
48824
  userLanguage;
48603
48825
  headerConfig;
48604
48826
  themeCatalog;
48827
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
48828
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
48605
48829
  /**
48606
48830
  * Collezione dati per items, consumata dal rendering e dalle operazioni del componente.
48607
48831
  */
@@ -50344,7 +50568,7 @@ class LazyFirstRunWizardComponent {
50344
50568
  this.cdr = cdr;
50345
50569
  }
50346
50570
  async ngOnInit() {
50347
- firstRunWizardComponentPromise ??= import('./wuic-framework-lib-first-run-wizard.component-Bg41Xfht.mjs').then((m) => m.WuicFirstRunWizardComponent);
50571
+ firstRunWizardComponentPromise ??= import('./wuic-framework-lib-first-run-wizard.component-CGCBKpdv.mjs').then((m) => m.WuicFirstRunWizardComponent);
50348
50572
  const componentClass = await firstRunWizardComponentPromise;
50349
50573
  this.componentRef = this.vcr.createComponent(componentClass);
50350
50574
  // Forward output del componente reale al wrapper. Type assertion necessaria
@@ -50379,6 +50603,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
50379
50603
  }] } });
50380
50604
 
50381
50605
  class TextEditorComponent {
50606
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
50607
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
50382
50608
  /**
50383
50609
  * Input dal componente padre per record; usata nella configurazione e nel rendering del componente.
50384
50610
  */
@@ -50501,6 +50727,8 @@ var textEditor_component = /*#__PURE__*/Object.freeze({
50501
50727
  });
50502
50728
 
50503
50729
  class TextAreaEditorComponent {
50730
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
50731
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
50504
50732
  /**
50505
50733
  * Input dal componente padre per record; usata nella configurazione e nel rendering del componente.
50506
50734
  */
@@ -50608,6 +50836,8 @@ class LookupEditorComponent {
50608
50836
  trslSrv;
50609
50837
  cd;
50610
50838
  hostElementRef;
50839
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
50840
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
50611
50841
  static LOOKUP_VIRTUALIZATION_DEFAULT_ITEM_SIZE = 44;
50612
50842
  pendingSearchFocusRestore = false;
50613
50843
  lookupOverlayVisible = false;
@@ -51415,6 +51645,8 @@ var lookupEditor_component = /*#__PURE__*/Object.freeze({
51415
51645
  class DictionaryEditorComponent {
51416
51646
  trnSrv;
51417
51647
  hostElementRef;
51648
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
51649
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
51418
51650
  /**
51419
51651
  * Input dal componente padre per record; usata nella configurazione e nel rendering del componente.
51420
51652
  */
@@ -51779,6 +52011,8 @@ var dictionaryEditor_component = /*#__PURE__*/Object.freeze({
51779
52011
  });
51780
52012
 
51781
52013
  class BooleanEditorComponent {
52014
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
52015
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
51782
52016
  /**
51783
52017
  * Input dal componente padre per record; usata nella configurazione e nel rendering del componente.
51784
52018
  */
@@ -51930,6 +52164,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
51930
52164
  }] });
51931
52165
 
51932
52166
  class DateEditorComponent {
52167
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
52168
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
51933
52169
  /**
51934
52170
  * Input dal componente padre per record; usata nella configurazione e nel rendering del componente.
51935
52171
  */
@@ -52038,6 +52274,8 @@ var dateEditor_component = /*#__PURE__*/Object.freeze({
52038
52274
  });
52039
52275
 
52040
52276
  class HtmlEditorComponent {
52277
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
52278
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
52041
52279
  /**
52042
52280
  * Input dal componente padre per record; usata nella configurazione e nel rendering del componente.
52043
52281
  */
@@ -61282,6 +61520,8 @@ class UploadEditorComponent {
61282
61520
  trnsl;
61283
61521
  usrSrv;
61284
61522
  config;
61523
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
61524
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
61285
61525
  /**
61286
61526
  * Input dal componente padre per record; usata nella configurazione e nel rendering del componente.
61287
61527
  */
@@ -61924,6 +62164,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
61924
62164
  * CodeEditorComponent + parser SQL/TS in un chunk separato caricato on-demand.
61925
62165
  */
61926
62166
  class CodeAreaEditorComponent {
62167
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
62168
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
61927
62169
  /**
61928
62170
  * Input dal componente padre per record; usata nella configurazione e nel rendering del componente.
61929
62171
  */
@@ -62045,7 +62287,7 @@ class LazyCodeEditorComponent {
62045
62287
  this.cdr = cdr;
62046
62288
  }
62047
62289
  async ngOnInit() {
62048
- codeEditorComponentPromise ??= import('./wuic-framework-lib-code-editor.component-CTI_gqvB.mjs').then((m) => m.CodeEditorComponent);
62290
+ codeEditorComponentPromise ??= import('./wuic-framework-lib-code-editor.component-P181nIU9.mjs').then((m) => m.CodeEditorComponent);
62049
62291
  this.loadedComponent = await codeEditorComponentPromise;
62050
62292
  this.cdr.markForCheck();
62051
62293
  }
@@ -62218,6 +62460,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
62218
62460
  }] } });
62219
62461
 
62220
62462
  class ColorEditorComponent {
62463
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
62464
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
62221
62465
  /**
62222
62466
  * Input dal componente padre per record; usata nella configurazione e nel rendering del componente.
62223
62467
  */
@@ -62568,6 +62812,8 @@ var propertyObjectEditor_component = /*#__PURE__*/Object.freeze({
62568
62812
  });
62569
62813
 
62570
62814
  class TreeViewSelectorComponent {
62815
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
62816
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
62571
62817
  /**
62572
62818
  * Input dal componente padre per record; usata nella configurazione e nel rendering del componente.
62573
62819
  */
@@ -63817,6 +64063,8 @@ class NotificationBellComponent {
63817
64063
  router;
63818
64064
  trslSrv;
63819
64065
  authSession;
64066
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
64067
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
63820
64068
  userId;
63821
64069
  // Default sentinel vuoto: se il consumer NON passa l'input, risolviamo via
63822
64070
  // TranslationManagerService all'ngOnInit. I fallback italiani restano nel
@@ -64224,7 +64472,7 @@ class DesignerRouteComponent {
64224
64472
  * Inizializza il componente preparando stato, sottoscrizioni e primi caricamenti richiesti.
64225
64473
  */
64226
64474
  async ngOnInit() {
64227
- designerComponentPromise ??= import('./wuic-framework-lib-designer.component-67PCnDYC.mjs').then((m) => m.DesignerComponent);
64475
+ designerComponentPromise ??= import('./wuic-framework-lib-designer.component-DZ7C9ygB.mjs').then((m) => m.DesignerComponent);
64228
64476
  this.loadedComponent = await designerComponentPromise;
64229
64477
  }
64230
64478
  /**
@@ -64305,7 +64553,7 @@ class LazyPivotBuilderComponent {
64305
64553
  this.cdr = cdr;
64306
64554
  }
64307
64555
  async ngOnInit() {
64308
- pivotBuilderComponentPromise ??= import('./wuic-framework-lib-pivot-builder.component-Dg-xWzxO.mjs').then((m) => m.PivotBuilderComponent);
64556
+ pivotBuilderComponentPromise ??= import('./wuic-framework-lib-pivot-builder.component-CrJUJDxX.mjs').then((m) => m.PivotBuilderComponent);
64309
64557
  this.loadedComponent = await pivotBuilderComponentPromise;
64310
64558
  this.cdr.markForCheck();
64311
64559
  }
@@ -64344,7 +64592,7 @@ class WorkflowDesignerRouteComponent {
64344
64592
  * Inizializza il componente preparando stato, sottoscrizioni e primi caricamenti richiesti.
64345
64593
  */
64346
64594
  async ngOnInit() {
64347
- workflowDesignerComponentPromise ??= import('./wuic-framework-lib-workflow-designer.component-DVEL_aHg.mjs').then((m) => m.WorkflowDesignerComponent);
64595
+ workflowDesignerComponentPromise ??= import('./wuic-framework-lib-workflow-designer.component-CETZSZzu.mjs').then((m) => m.WorkflowDesignerComponent);
64348
64596
  this.loadedComponent = await workflowDesignerComponentPromise;
64349
64597
  }
64350
64598
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: WorkflowDesignerRouteComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
@@ -64390,7 +64638,7 @@ class Scene3dDesignerRouteComponent {
64390
64638
  /** Componente designer runtime caricato lazy, usato dal template. */
64391
64639
  loadedComponent = null;
64392
64640
  async ngOnInit() {
64393
- scene3dDesignerComponentPromise ??= import('./wuic-framework-lib-scene3d-designer.component-CkoU_J5j.mjs').then(function (n) { return n.s; }).then((m) => m.Scene3dDesignerComponent);
64641
+ scene3dDesignerComponentPromise ??= import('./wuic-framework-lib-scene3d-designer.component-DLcruDYB.mjs').then(function (n) { return n.s; }).then((m) => m.Scene3dDesignerComponent);
64394
64642
  this.loadedComponent = await scene3dDesignerComponentPromise;
64395
64643
  }
64396
64644
  /** Delega al designer runtime la conferma navigazione con pending changes. */
@@ -64446,7 +64694,7 @@ class Scene3dViewerRouteComponent {
64446
64694
  /** Componente viewer runtime caricato lazy, usato dal template. */
64447
64695
  loadedComponent = null;
64448
64696
  async ngOnInit() {
64449
- scene3dViewerComponentPromise ??= import('./wuic-framework-lib-scene3d-viewer.component-Dt0fvwFX.mjs').then((m) => m.Scene3dViewerComponent);
64697
+ scene3dViewerComponentPromise ??= import('./wuic-framework-lib-scene3d-viewer.component-DA47y9vo.mjs').then((m) => m.Scene3dViewerComponent);
64450
64698
  this.loadedComponent = await scene3dViewerComponentPromise;
64451
64699
  }
64452
64700
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: Scene3dViewerRouteComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
@@ -64507,7 +64755,7 @@ class LazyReportDesignerComponent {
64507
64755
  this.cdr = cdr;
64508
64756
  }
64509
64757
  async ngOnInit() {
64510
- reportDesignerComponentPromise ??= import('./wuic-framework-lib-report-designer.component-9_M4MA2p.mjs').then((m) => m.ReportDesignerComponent);
64758
+ reportDesignerComponentPromise ??= import('./wuic-framework-lib-report-designer.component-urOz2Pq8.mjs').then((m) => m.ReportDesignerComponent);
64511
64759
  this.loadedComponent = await reportDesignerComponentPromise;
64512
64760
  this.cdr.markForCheck();
64513
64761
  }
@@ -64562,7 +64810,7 @@ class LazyReportViewerComponent {
64562
64810
  this.cdr = cdr;
64563
64811
  }
64564
64812
  async ngOnInit() {
64565
- reportViewerComponentPromise ??= import('./wuic-framework-lib-report-viewer.component-C5EAoGOx.mjs').then((m) => m.ReportViewerComponent);
64813
+ reportViewerComponentPromise ??= import('./wuic-framework-lib-report-viewer.component-CCpUOyb4.mjs').then((m) => m.ReportViewerComponent);
64566
64814
  this.loadedComponent = await reportViewerComponentPromise;
64567
64815
  this.cdr.markForCheck();
64568
64816
  }
@@ -64592,6 +64840,8 @@ class KanbanListComponent {
64592
64840
  userInfo;
64593
64841
  cdr;
64594
64842
  ngZone;
64843
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
64844
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
64595
64845
  hardcodedRoute;
64596
64846
  parentRecord;
64597
64847
  parentMetaInfo;
@@ -68886,7 +69136,7 @@ const themeBuilderPendingChangesGuard = (component) => {
68886
69136
  const routes = [
68887
69137
  {
68888
69138
  path: 'framework-docs',
68889
- loadComponent: () => import('./wuic-framework-lib-framework-docs.component-BLxQmoDZ.mjs').then((m) => m.FrameworkDocsComponent),
69139
+ loadComponent: () => import('./wuic-framework-lib-framework-docs.component-CX4DuW-Q.mjs').then((m) => m.FrameworkDocsComponent),
68890
69140
  canMatch: [menuRouteAccessCanMatchGuard],
68891
69141
  canActivate: [menuRouteAccessCanActivateGuard],
68892
69142
  data: {
@@ -68895,7 +69145,7 @@ const routes = [
68895
69145
  },
68896
69146
  {
68897
69147
  path: 'framework-docs/:slug',
68898
- loadComponent: () => import('./wuic-framework-lib-framework-docs.component-BLxQmoDZ.mjs').then((m) => m.FrameworkDocsComponent),
69148
+ loadComponent: () => import('./wuic-framework-lib-framework-docs.component-CX4DuW-Q.mjs').then((m) => m.FrameworkDocsComponent),
68899
69149
  canMatch: [menuRouteAccessCanMatchGuard],
68900
69150
  canActivate: [menuRouteAccessCanActivateGuard],
68901
69151
  data: {
@@ -68940,7 +69190,7 @@ const routes = [
68940
69190
  },
68941
69191
  {
68942
69192
  path: ':route/report-designer',
68943
- loadComponent: () => import('./wuic-framework-lib-report-designer.component-9_M4MA2p.mjs').then((m) => m.ReportDesignerComponent),
69193
+ loadComponent: () => import('./wuic-framework-lib-report-designer.component-urOz2Pq8.mjs').then((m) => m.ReportDesignerComponent),
68944
69194
  canMatch: [menuRouteAccessCanMatchGuard, featureRouteCanMatchGuard],
68945
69195
  canActivate: [menuRouteAccessCanActivateGuard, featureRouteCanActivateGuard],
68946
69196
  data: {
@@ -68950,7 +69200,7 @@ const routes = [
68950
69200
  },
68951
69201
  {
68952
69202
  path: ':route/report-viewer',
68953
- loadComponent: () => import('./wuic-framework-lib-report-viewer.component-C5EAoGOx.mjs').then((m) => m.ReportViewerComponent),
69203
+ loadComponent: () => import('./wuic-framework-lib-report-viewer.component-CCpUOyb4.mjs').then((m) => m.ReportViewerComponent),
68954
69204
  canMatch: [menuRouteAccessCanMatchGuard],
68955
69205
  canActivate: [menuRouteAccessCanActivateGuard],
68956
69206
  data: {
@@ -68970,7 +69220,7 @@ const routes = [
68970
69220
  },
68971
69221
  {
68972
69222
  path: ':route/pivot-builder',
68973
- loadComponent: () => import('./wuic-framework-lib-pivot-builder.component-Dg-xWzxO.mjs').then((m) => m.PivotBuilderComponent),
69223
+ loadComponent: () => import('./wuic-framework-lib-pivot-builder.component-CrJUJDxX.mjs').then((m) => m.PivotBuilderComponent),
68974
69224
  canMatch: [menuRouteAccessCanMatchGuard, featureRouteCanMatchGuard],
68975
69225
  canActivate: [menuRouteAccessCanActivateGuard, featureRouteCanActivateGuard],
68976
69226
  data: {
@@ -68980,7 +69230,7 @@ const routes = [
68980
69230
  },
68981
69231
  {
68982
69232
  path: 'pivot-builder',
68983
- loadComponent: () => import('./wuic-framework-lib-pivot-builder.component-Dg-xWzxO.mjs').then((m) => m.PivotBuilderComponent),
69233
+ loadComponent: () => import('./wuic-framework-lib-pivot-builder.component-CrJUJDxX.mjs').then((m) => m.PivotBuilderComponent),
68984
69234
  canMatch: [menuRouteAccessCanMatchGuard, featureRouteCanMatchGuard],
68985
69235
  canActivate: [menuRouteAccessCanActivateGuard, featureRouteCanActivateGuard],
68986
69236
  data: {
@@ -71079,5 +71329,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
71079
71329
  * Generated bundle index. Do not edit.
71080
71330
  */
71081
71331
 
71082
- export { DEFAULT_THEME_VALUE as $, ArchetypeConfiguratorComponent as A, AuthSessionService as B, ChatbotHostRegistryService as C, DynamicGenericTemplateComponent as D, BooleanEditorComponent as E, FilterBarComponent as F, GlobalHandler as G, BoundedRepeaterComponent as H, ImportExportButtonComponent as I, ButtonEditorComponent as J, CUSTOM_THEMES_STORAGE_KEY as K, LazyParametricDialogComponent as L, MetadataProviderService as M, CallbackPipe as N, CallbackPipe2 as O, PagerComponent as P, CarouselListComponent as Q, CodeAreaEditorComponent as R, ColorEditorComponent as S, TranslationManagerService as T, UserInfoService as U, CrashReporterService as V, WtoolboxService as W, CustomAttributesService as X, CustomException as Y, DEFAULT_FONT_STACK as Z, DEFAULT_THEME_STORAGE_KEY as _, DynamicCompilerService as a, UserMenuComponent as a$, DataActionButtonComponent as a0, DataProviderOdataService as a1, DateEditorComponent as a2, DesignerRouteComponent as a3, DictionaryEditorComponent as a4, DynamicRowTemplateComponent as a5, FormatGridViewValuePipe as a6, GetSrcUploadPreviewPipe as a7, HtmlEditorComponent as a8, ImageWrapperComponent as a9, NumberEditorComponent as aA, PALETTE_STOPS as aB, PREVIEW_RESTORE_KEY as aC, PRIMARY_PALETTES as aD, PerformanceInspectorComponent as aE, PointFilterComponent as aF, PropertyArrayEditorComponent as aG, PropertyObjectEditorComponent as aH, RAG_DESTRUCTIVE_KINDS as aI, RouteMetricsDashboardComponent as aJ, Scene3dDesignerRouteComponent as aK, Scene3dViewerRouteComponent as aL, THEME_MODE_STORAGE_KEY as aM, THEME_OPTIONS as aN, THEME_STORAGE_KEY as aO, TextAreaEditorComponent as aP, TextEditorComponent as aQ, ThemeBuilderComponent as aR, ThemeCatalogService as aS, ThemePreviewPanelComponent as aT, ThemeRuntimeService as aU, ThemeSelectorComponent as aV, TreeListComponent as aW, TreeViewSelectorComponent as aX, UploadDialogComponent as aY, UploadEditorComponent as aZ, UserLanguageService as a_, IsSelectedRowPipe as aa, KanbanListComponent as ab, KanbanOptions as ac, KanbanStatusColumnItem as ad, LazyChartListComponent as ae, LazyCodeEditorComponent as af, LazyDataActionButtonComponent as ag, LazyDataSourceComponent as ah, LazyFieldEditorComponent as ai, LazyFirstRunWizardComponent as aj, LazyImageWrapperComponent as ak, LazyKanbanListComponent as al, LazyMetaMenuComponent as am, LazyPivotBuilderComponent as an, LazyReportDesignerComponent as ao, LazyReportViewerComponent as ap, LazySchedulerListComponent as aq, LazySpreadsheetListSfComponent as ar, LazyTimelineListComponent as as, ListGridComponent as at, LookupEditorComponent as au, MapListComponent as av, MetaMenuComponent as aw, MetadatiTabella as ax, NotificationBellComponent as ay, NotificationRealtimeService as az, DataSourceComponent as b, resolveThemePresetForOption as b$, ValidationRule as b0, ValueChangedPayload as b1, VisibleFieldListPipe as b2, WUIC_FONT_CATALOG as b3, WidgetDefinition as b4, WorkflowDesignerRouteComponent as b5, WorkflowRunnerComponent as b6, WuicAziendaSwitcherComponent as b7, WuicErrorDialogComponent as b8, WuicErrorInterceptor as b9, isDestructiveRagAction as bA, isRoutePersistenceEnabled as bB, loadBooleanEditorComponent as bC, loadButtonEditorComponent as bD, loadCodeAreaEditorComponent as bE, loadColorEditorComponent as bF, loadDateEditorComponent as bG, loadDictionaryEditorComponent as bH, loadHtmlEditorComponent as bI, loadLookupEditorComponent as bJ, loadNumberEditorComponent as bK, loadPropertyArrayEditorComponent as bL, loadPropertyObjectEditorComponent as bM, loadTextAreaEditorComponent as bN, loadTextEditorComponent as bO, loadTreeViewSelectorComponent as bP, loadUploadEditorComponent as bQ, menuRouteAccessCanActivateGuard as bR, menuRouteAccessCanMatchGuard as bS, nearestPrimaryName as bT, normalizeHex$1 as bU, oklchToHex as bV, oklchToRgb as bW, resolveBackgroundCss as bX, resolveFontStack as bY, resolveGridStrengths as bZ, resolveThemePreset as b_, WuicFeatureDirective as ba, WuicFrozenColumnDirective as bb, WuicRagChatbotComponent as bc, WuicRagChatbotFabComponent as bd, WuicRagService as be, WuicRowTogglerDirective as bf, _PRIMENG_TABLE_DIRECTIVES_NAMES as bg, authExpiredInterceptor as bh, bestContrastColor as bi, boundedRepeaterPendingChangesGuard as bj, buildCustomPreset as bk, buildThemeValue as bl, computeDataQualitySummary as bm, contrastRatio as bn, createDraftTheme as bo, featureRouteCanActivateGuard as bp, featureRouteCanMatchGuard as bq, generatePrimaryPalette as br, generateSurfacePalette as bs, getQualityInspectorOptions as bt, getThemePrimaryHex as bu, hexToOklch as bv, hexToRgb as bw, hsbaToRgbaString as bx, inferTemplateFieldFromBaseClass as by, isCustomThemeValue as bz, DataRepeaterComponent as c, rgbToHex as c0, rgbToOklch as c1, rgbaToHsbaModel as c2, routeMetricsClient as c3, routes as c4, scene3dDesignerPendingChangesGuard as c5, themeBuilderPendingChangesGuard as c6, wcagLevel as c7, wuicErrorInterceptor as c8, parametricDialog_component as c9, clampAlpha as d, toPersistedColor as e, ParametricDialogComponent as f, MetadatiColonna as g, DataProviderService as h, MetadataEditorService as i, WorkflowRuntimeMetadataService as j, FieldEditorComponent as k, MetadataEditorComponent as l, WuicClientException as m, WuicErrorCodes as n, MetaInfo as o, WUIC_SUPPRESS_GLOBAL_ERROR as p, FilterInfo as q, LicenseFeatureService as r, FilterItem as s, toHsbaModel as t, TimelineOptions as u, getThemeOptions as v, AUTH_REDIRECT_REASON_KEY as w, AppHeaderComponent as x, AppHeaderConfigService as y, AppSettingsEditorComponent as z };
71083
- //# sourceMappingURL=wuic-framework-lib-wuic-framework-lib-Ds_oD2In.mjs.map
71332
+ export { DEFAULT_THEME_STORAGE_KEY as $, ArchetypeConfiguratorComponent as A, AppSettingsEditorComponent as B, ChatbotHostRegistryService as C, DynamicGenericTemplateComponent as D, AuthSessionService as E, FilterBarComponent as F, GlobalHandler as G, BooleanEditorComponent as H, ImportExportButtonComponent as I, BoundedRepeaterComponent as J, ButtonEditorComponent as K, LazyParametricDialogComponent as L, MetadataProviderService as M, CUSTOM_THEMES_STORAGE_KEY as N, CallbackPipe as O, PagerComponent as P, CallbackPipe2 as Q, CarouselListComponent as R, CodeAreaEditorComponent as S, TranslationManagerService as T, UserInfoService as U, ColorEditorComponent as V, WtoolboxService as W, CrashReporterService as X, CustomAttributesService as Y, CustomException as Z, DEFAULT_FONT_STACK as _, DynamicCompilerService as a, UserLanguageService as a$, DEFAULT_THEME_VALUE as a0, DataActionButtonComponent as a1, DataProviderOdataService as a2, DateEditorComponent as a3, DesignerRouteComponent as a4, DictionaryEditorComponent as a5, DynamicRowTemplateComponent as a6, FormatGridViewValuePipe as a7, GetSrcUploadPreviewPipe as a8, HtmlEditorComponent as a9, NotificationRealtimeService as aA, NumberEditorComponent as aB, PALETTE_STOPS as aC, PREVIEW_RESTORE_KEY as aD, PRIMARY_PALETTES as aE, PerformanceInspectorComponent as aF, PointFilterComponent as aG, PropertyArrayEditorComponent as aH, PropertyObjectEditorComponent as aI, RAG_DESTRUCTIVE_KINDS as aJ, RouteMetricsDashboardComponent as aK, Scene3dDesignerRouteComponent as aL, Scene3dViewerRouteComponent as aM, THEME_MODE_STORAGE_KEY as aN, THEME_OPTIONS as aO, THEME_STORAGE_KEY as aP, TextAreaEditorComponent as aQ, TextEditorComponent as aR, ThemeBuilderComponent as aS, ThemeCatalogService as aT, ThemePreviewPanelComponent as aU, ThemeRuntimeService as aV, ThemeSelectorComponent as aW, TreeListComponent as aX, TreeViewSelectorComponent as aY, UploadDialogComponent as aZ, UploadEditorComponent as a_, ImageWrapperComponent as aa, IsSelectedRowPipe as ab, KanbanListComponent as ac, KanbanOptions as ad, KanbanStatusColumnItem as ae, LazyChartListComponent as af, LazyCodeEditorComponent as ag, LazyDataActionButtonComponent as ah, LazyDataSourceComponent as ai, LazyFieldEditorComponent as aj, LazyFirstRunWizardComponent as ak, LazyImageWrapperComponent as al, LazyKanbanListComponent as am, LazyMetaMenuComponent as an, LazyPivotBuilderComponent as ao, LazyReportDesignerComponent as ap, LazyReportViewerComponent as aq, LazySchedulerListComponent as ar, LazySpreadsheetListSfComponent as as, LazyTimelineListComponent as at, ListGridComponent as au, LookupEditorComponent as av, MapListComponent as aw, MetaMenuComponent as ax, MetadatiTabella as ay, NotificationBellComponent as az, DataSourceComponent as b, resolveThemePreset as b$, UserMenuComponent as b0, ValidationRule as b1, ValueChangedPayload as b2, VisibleFieldListPipe as b3, WUIC_FONT_CATALOG as b4, WidgetDefinition as b5, WorkflowDesignerRouteComponent as b6, WorkflowRunnerComponent as b7, WuicAziendaSwitcherComponent as b8, WuicErrorDialogComponent as b9, isCustomThemeValue as bA, isDestructiveRagAction as bB, isRoutePersistenceEnabled as bC, loadBooleanEditorComponent as bD, loadButtonEditorComponent as bE, loadCodeAreaEditorComponent as bF, loadColorEditorComponent as bG, loadDateEditorComponent as bH, loadDictionaryEditorComponent as bI, loadHtmlEditorComponent as bJ, loadLookupEditorComponent as bK, loadNumberEditorComponent as bL, loadPropertyArrayEditorComponent as bM, loadPropertyObjectEditorComponent as bN, loadTextAreaEditorComponent as bO, loadTextEditorComponent as bP, loadTreeViewSelectorComponent as bQ, loadUploadEditorComponent as bR, menuRouteAccessCanActivateGuard as bS, menuRouteAccessCanMatchGuard as bT, nearestPrimaryName as bU, normalizeHex$1 as bV, oklchToHex as bW, oklchToRgb as bX, resolveBackgroundCss as bY, resolveFontStack as bZ, resolveGridStrengths as b_, WuicErrorInterceptor as ba, WuicFeatureDirective as bb, WuicFrozenColumnDirective as bc, WuicRagChatbotComponent as bd, WuicRagChatbotFabComponent as be, WuicRagService as bf, WuicRowTogglerDirective as bg, _PRIMENG_TABLE_DIRECTIVES_NAMES as bh, authExpiredInterceptor as bi, bestContrastColor as bj, boundedRepeaterPendingChangesGuard as bk, buildCustomPreset as bl, buildThemeValue as bm, computeDataQualitySummary as bn, contrastRatio as bo, createDraftTheme as bp, featureRouteCanActivateGuard as bq, featureRouteCanMatchGuard as br, generatePrimaryPalette as bs, generateSurfacePalette as bt, getQualityInspectorOptions as bu, getThemePrimaryHex as bv, hexToOklch as bw, hexToRgb as bx, hsbaToRgbaString as by, inferTemplateFieldFromBaseClass as bz, DataRepeaterComponent as c, resolveThemePresetForOption as c0, rgbToHex as c1, rgbToOklch as c2, rgbaToHsbaModel as c3, routeMetricsClient as c4, routes as c5, scene3dDesignerPendingChangesGuard as c6, themeBuilderPendingChangesGuard as c7, wcagLevel as c8, wuicErrorInterceptor as c9, parametricDialog_component as ca, clampAlpha as d, toPersistedColor as e, exposeWuicCmpOnHost as f, ParametricDialogComponent as g, MetadatiColonna as h, DataProviderService as i, MetadataEditorService as j, WorkflowRuntimeMetadataService as k, FieldEditorComponent as l, MetadataEditorComponent as m, WuicClientException as n, WuicErrorCodes as o, MetaInfo as p, WUIC_SUPPRESS_GLOBAL_ERROR as q, FilterInfo as r, LicenseFeatureService as s, toHsbaModel as t, FilterItem as u, TimelineOptions as v, getThemeOptions as w, AUTH_REDIRECT_REASON_KEY as x, AppHeaderComponent as y, AppHeaderConfigService as z };
71333
+ //# sourceMappingURL=wuic-framework-lib-wuic-framework-lib-CRUM1gc_.mjs.map