wuic-framework-lib 1.7.12 → 1.7.14

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-BEps71hL.mjs} +4 -2
  2. package/fesm2022/{wuic-framework-lib-code-editor.component-CTI_gqvB.mjs → wuic-framework-lib-code-editor.component-c3x1X5O9.mjs} +2 -2
  3. package/fesm2022/{wuic-framework-lib-designer.component-67PCnDYC.mjs → wuic-framework-lib-designer.component-CXHYNEm5.mjs} +4 -2
  4. package/fesm2022/{wuic-framework-lib-first-run-wizard.component-Bg41Xfht.mjs → wuic-framework-lib-first-run-wizard.component-Hw4IM3po.mjs} +2 -2
  5. package/fesm2022/{wuic-framework-lib-framework-docs.component-BLxQmoDZ.mjs → wuic-framework-lib-framework-docs.component-BIULbCaM.mjs} +682 -141
  6. package/fesm2022/{wuic-framework-lib-pivot-builder.component-Dg-xWzxO.mjs → wuic-framework-lib-pivot-builder.component-DP60RcD5.mjs} +5 -2
  7. package/fesm2022/{wuic-framework-lib-prompt-dialog-fallback-host.component-BB0AhnsE.mjs → wuic-framework-lib-prompt-dialog-fallback-host.component-DysV00wF.mjs} +2 -2
  8. package/fesm2022/{wuic-framework-lib-report-designer.component-9_M4MA2p.mjs → wuic-framework-lib-report-designer.component-Cn3pUy16.mjs} +2 -2
  9. package/fesm2022/{wuic-framework-lib-report-scaffold-dialog.component-BsKSP1Dk.mjs → wuic-framework-lib-report-scaffold-dialog.component-DdRrsp8w.mjs} +2 -2
  10. package/fesm2022/{wuic-framework-lib-report-viewer.component-C5EAoGOx.mjs → wuic-framework-lib-report-viewer.component-m-ianUWE.mjs} +2 -2
  11. package/fesm2022/{wuic-framework-lib-scene3d-designer.component-CkoU_J5j.mjs → wuic-framework-lib-scene3d-designer.component-DtFyJ3QF.mjs} +3 -3
  12. package/fesm2022/{wuic-framework-lib-scene3d-light-baker-gpu-CjTKHG3s.mjs → wuic-framework-lib-scene3d-light-baker-gpu-I1Bidwkn.mjs} +2 -2
  13. package/fesm2022/{wuic-framework-lib-scene3d-viewer.component-Dt0fvwFX.mjs → wuic-framework-lib-scene3d-viewer.component-B7uh74v4.mjs} +2 -2
  14. package/fesm2022/{wuic-framework-lib-scheduler-list.component-CEMQJrsN.mjs → wuic-framework-lib-scheduler-list.component-B6lWGWEd.mjs} +24 -16
  15. package/fesm2022/{wuic-framework-lib-spreadsheet-list-sf.component-Cgmf9tb1.mjs → wuic-framework-lib-spreadsheet-list-sf.component-Bpxi8la8.mjs} +4 -2
  16. package/fesm2022/{wuic-framework-lib-timeline-list.component-B_bRKY_H.mjs → wuic-framework-lib-timeline-list.component-DsvQ8Wro.mjs} +6 -4
  17. package/fesm2022/{wuic-framework-lib-workflow-designer.component-DVEL_aHg.mjs → wuic-framework-lib-workflow-designer.component-DCQE7JQz.mjs} +2 -2
  18. package/fesm2022/{wuic-framework-lib-wuic-framework-lib-Ds_oD2In.mjs → wuic-framework-lib-wuic-framework-lib-BlysiZLp.mjs} +340 -41
  19. package/fesm2022/wuic-framework-lib.mjs +1 -1
  20. package/package.json +1 -1
  21. package/types/wuic-framework-lib.d.ts +99 -3
@@ -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',
@@ -202,6 +204,8 @@ const WuicErrorCodes = {
202
204
  // Causa tipica lato client: chiavi con case diverso da `mc_nome_colonna`, che e'
203
205
  // case-sensitive (es. `cityID` invece di `CityID`), o PK omessa dal payload.
204
206
  CrudMissingKeyPredicate: 'errors.metaservice.crud.missing_key_predicate',
207
+ // Export rifiutato: tutti gli slot export occupati e la coda (maxQueuedExports) piena. HTTP 503.
208
+ ExportQueueFull: 'errors.metaservice.export.queue_full',
205
209
  DbSqlException: 'errors.db.sql_exception', // passthrough — dialog dedicato
206
210
  DbConnection: 'errors.db.connection',
207
211
  DbTimeout: 'errors.db.timeout',
@@ -3418,7 +3422,7 @@ class WtoolboxService {
3418
3422
  const appRef = resolvedInjector.get(ApplicationRef);
3419
3423
  const environmentInjector = resolvedInjector.get(EnvironmentInjector);
3420
3424
  const close$ = new Subject();
3421
- const { PromptDialogFallbackHostComponent } = await import('./wuic-framework-lib-prompt-dialog-fallback-host.component-BB0AhnsE.mjs');
3425
+ const { PromptDialogFallbackHostComponent } = await import('./wuic-framework-lib-prompt-dialog-fallback-host.component-DysV00wF.mjs');
3422
3426
  const hostRef = createComponent(PromptDialogFallbackHostComponent, { environmentInjector });
3423
3427
  hostRef.instance.datasource = dialogConfig?.data?.datasource;
3424
3428
  hostRef.instance.header = String(dialogConfig?.header || '');
@@ -4743,6 +4747,8 @@ class WtoolboxService {
4743
4747
  commit_level: "R",
4744
4748
  use_column_captions: "C",
4745
4749
  use_descriptive_fkey: true,
4750
+ // Colonne lookup di export e import: "key" | "description" | "both" (vince su use_descriptive_fkey).
4751
+ fkey_mode: "description",
4746
4752
  separator: ";"
4747
4753
  },
4748
4754
  notifications: {
@@ -7697,6 +7703,10 @@ class MetadataProviderService {
7697
7703
  static metatableColumnAuthRoute;
7698
7704
  static metadataVersionInFlight;
7699
7705
  static lastMetadataVersionCheckAtMs = 0;
7706
+ // Ultima versione letta dal backend: dentro la finestra di throttle si
7707
+ // restituisce questa (non `null`), cosi' ogni route confronta la propria
7708
+ // cache Dexie con la versione piu' recente nota.
7709
+ static lastKnownMetadataVersion = 0;
7700
7710
  static minMetadataVersionIntervalMs = 5000;
7701
7711
  static minReportListIntervalMs = 5000;
7702
7712
  static reportListInFlightByRoute = new Map();
@@ -10565,9 +10575,9 @@ ${extraScope} ${suggestCallbackSanitized}
10565
10575
  }
10566
10576
  /**
10567
10577
  * 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.
10578
+ * usa `MetaService.getAppSettings`, salva il timestamp in localStorage e la versione in memoria per ridurre chiamate ripetute.
10569
10579
  * @param offsetMs Offset fuso client in millisecondi da riportare al backend.
10570
- * @returns Versione metadata progetto corrente oppure `null` se cache ancora valida/errore.
10580
+ * @returns Versione metadata progetto corrente (dentro la finestra: l'ultima letta dal backend).
10571
10581
  */
10572
10582
  async getProjectMetadataVersionIfExpired(offsetMs) {
10573
10583
  const effectiveOffsetMs = Math.max(Number(offsetMs) || 0, MetadataProviderService.minMetadataVersionIntervalMs);
@@ -10578,14 +10588,30 @@ ${extraScope} ${suggestCallbackSanitized}
10578
10588
  ? lastFromStorage
10579
10589
  : MetadataProviderService.lastMetadataVersionCheckAtMs;
10580
10590
  if (effectiveOffsetMs > 0 && lastCheckAt > 0 && nowMs <= (lastCheckAt + effectiveOffsetMs)) {
10581
- return null;
10591
+ // Dentro la finestra NON si ritorna `null` ("cache valida"): la finestra
10592
+ // vale per TUTTE le route, e al caricamento della pagina la prima route
10593
+ // (il menu) scarica la versione nuova; le route lette subito dopo
10594
+ // ricevevano `null` e servivano la cache Dexie stale senza confrontarla
10595
+ // (verificato 23/09 su cities: stile colonna appena inserito + invalidate
10596
+ // + reload, la list-grid restava con i metadati vecchi). Si restituisce
10597
+ // l'ultima versione letta DA QUESTA PAGINA, se letta dentro la finestra:
10598
+ // il chiamante la confronta con quella in cache.
10599
+ const ownCheckAt = MetadataProviderService.lastMetadataVersionCheckAtMs;
10600
+ const knownVersion = MetadataProviderService.lastKnownMetadataVersion;
10601
+ if (knownVersion > 0 && ownCheckAt > 0 && nowMs <= (ownCheckAt + effectiveOffsetMs)) {
10602
+ return knownVersion;
10603
+ }
10604
+ // Timestamp scritto prima del reload o da un'altra scheda: la versione
10605
+ // non e' nota qui, si interroga il backend invece di fidarsi della cache.
10582
10606
  }
10583
10607
  if (!MetadataProviderService.metadataVersionInFlight) {
10584
10608
  MetadataProviderService.metadataVersionInFlight = this.http.post(this.getMetadataVersionUri, {}).toPromise().then((version) => {
10585
10609
  const checkedAt = Date.now();
10586
10610
  MetadataProviderService.lastMetadataVersionCheckAtMs = checkedAt;
10587
10611
  localStorage.setItem("lastprojectmetaversionretrieve", String(checkedAt));
10588
- return Number(version || 0);
10612
+ const fetchedVersion = Number(version || 0);
10613
+ MetadataProviderService.lastKnownMetadataVersion = fetchedVersion;
10614
+ return fetchedVersion;
10589
10615
  }).finally(() => {
10590
10616
  MetadataProviderService.metadataVersionInFlight = undefined;
10591
10617
  });
@@ -15265,6 +15291,12 @@ class DataSourceComponent {
15265
15291
  * Proprieta di stato del componente per last action, usata dalla logica interna e dal template.
15266
15292
  */
15267
15293
  lastAction = null;
15294
+ /**
15295
+ * Ultimo valore del parametro di route `:filters` (id del record in edit/detail, o
15296
+ * descriptor `campo||op||valore`) visto dal gestore NavigationEnd: serve a riconoscere
15297
+ * una navigazione che cambia SOLO il record, a parita' di route e action.
15298
+ */
15299
+ lastRouteFiltersParam = null;
15268
15300
  /**
15269
15301
  * Contatore richieste in-flight per gestire il busy in modo concorrente-safe.
15270
15302
  */
@@ -15692,6 +15724,7 @@ class DataSourceComponent {
15692
15724
  }
15693
15725
  catch { /* defensive */ }
15694
15726
  this.lastAction = this.aRoute.snapshot.paramMap.get('action');
15727
+ this.lastRouteFiltersParam = this.aRoute.snapshot.paramMap.get('filters');
15695
15728
  if (this.routeFromRouting) {
15696
15729
  this.routerEventsSubscription?.unsubscribe();
15697
15730
  this.routerEventsSubscription = this.router.events.subscribe((val) => {
@@ -15708,7 +15741,21 @@ class DataSourceComponent {
15708
15741
  const pageInfoChanged = currentPageInfoQueryRaw !== this.lastPageInfoQueryRaw;
15709
15742
  const sortInfoChanged = currentSortInfoQueryRaw !== this.lastSortInfoQueryRaw;
15710
15743
  const actionChanged = this.lastAction !== newaction;
15711
- if (this.route.value && (newroute !== this.route.value || actionChanged)) {
15744
+ // Anche il solo cambio di `:filters` va ricaricato. Da `cities/edit/1` a
15745
+ // `cities/edit/3` la configurazione di route e' la stessa, quindi Angular riusa
15746
+ // il componente e questo datasource: con il confronto solo su route e action non
15747
+ // partiva nessuna getFlatRecordData, la form di edit/3 mostrava il record 1 e il
15748
+ // salvataggio lo avrebbe sovrascritto. Stesso difetto su `detail/<id>` e su
15749
+ // `list/<campo||op||valore>`. Si passa dal ramo del cambio action (init completo)
15750
+ // e non da un semplice fetchData perche' applyRouteParamFilterFromSnapshot
15751
+ // aggiorna o aggiunge il filtro di route ma non toglie quello precedente: con un
15752
+ // descriptor su un campo diverso resterebbero attivi entrambi.
15753
+ // Nessun doppio caricamento: al primo ingresso (e da list a edit, che cambia
15754
+ // configurazione di route e ricrea il componente) il valore e' gia' allineato in
15755
+ // ngOnInit, e se cambiano insieme action e record il ramo scatta una volta sola.
15756
+ const newFiltersParam = this.aRoute.snapshot.paramMap.get('filters');
15757
+ const filtersParamChanged = this.lastRouteFiltersParam !== newFiltersParam;
15758
+ if (this.route.value && (newroute !== this.route.value || actionChanged || filtersParamChanged)) {
15712
15759
  this.init();
15713
15760
  this.applyFilterInfoFromQueryString();
15714
15761
  this.applyPageInfoFromQueryString();
@@ -15730,6 +15777,7 @@ class DataSourceComponent {
15730
15777
  }
15731
15778
  }
15732
15779
  this.lastAction = newaction;
15780
+ this.lastRouteFiltersParam = newFiltersParam;
15733
15781
  }
15734
15782
  });
15735
15783
  this.applyFilterInfoFromQueryString();
@@ -17232,11 +17280,18 @@ class DataSourceComponent {
17232
17280
  // Si emette su fetchInfo$ direttamente e NON tramite publishFetchInfo, perche' quello
17233
17281
  // fa scattare anche afterFirstLoad$ — che i consumer aspettano per il primo
17234
17282
  // caricamento VERO, non per un payload vuoto.
17283
+ //
17284
+ // `preliminare: true` lo dichiara anche a chi legge solo fetchInfo$: la form di
17285
+ // edit (parametric-dialog) su questo payload crea un record vuoto con
17286
+ // addNewRecord, e senza il marcatore scambiava quel record per quello caricato
17287
+ // (data-record-loaded="true" con i campi ancora vuoti, prima ancora che partisse
17288
+ // getFlatRecordData).
17235
17289
  if (!this.resultInfo?.dato?.length) {
17236
17290
  this.fetchInfo$.next({
17237
17291
  resultInfo: { ...this.resultInfo, dato: [], totalRowCount: 0 },
17238
17292
  metaInfo: this.metaInfo,
17239
- filterDescriptor: this.filterDescriptor
17293
+ filterDescriptor: this.filterDescriptor,
17294
+ preliminare: true
17240
17295
  });
17241
17296
  }
17242
17297
  await this.fetchData();
@@ -19668,6 +19723,82 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
19668
19723
  type: Output
19669
19724
  }] } });
19670
19725
 
19726
+ /**
19727
+ * Espone l'istanza del componente sull'elemento DOM ospite come `__wuicCmp`.
19728
+ *
19729
+ * PERCHE'. I test e2e docs-driven devono poter leggere lo stato runtime di un
19730
+ * componente. Lo facevano con `window.ng.getComponent(host)`, che Angular
19731
+ * **rimuove nelle build di produzione** (`enableProdMode` toglie i debug tools):
19732
+ * contro un'installazione vera — cioe' quella che usano i clienti — quei test
19733
+ * non fallivano per un difetto, fallivano perche' lo strumento non c'era.
19734
+ * Misurato il 21/09/2026 sulla campagna docs-driven: **una trentina di prove**
19735
+ * (`timeline-list`, `list-grid`, `chart-list`, `kanban-list`, `scheduler-list`,
19736
+ * `tree-list`, `carousel-list`, `designer`, piu' tutti gli `--host-events`)
19737
+ * chiudevano con "introspezione runtime fallita: window.ng.getComponent not
19738
+ * available (production build?)", su entrambi i motori e su entrambi i sistemi
19739
+ * operativi.
19740
+ *
19741
+ * `__wuicCmp` e' la strada gia' adottata da `pivot-builder`, `report-designer`,
19742
+ * `workflow-designer`, `data-source`, `code-editor` e `app-settings-editor`, e
19743
+ * 11 test la cercano gia' prima di ripiegare su `window.ng`. Questo helper la
19744
+ * rende una riga sola, senza toccare costruttori ne' cicli di vita:
19745
+ *
19746
+ * ```ts
19747
+ * export class ListGridComponent {
19748
+ * private readonly wuicCmpHandle = exposeWuicCmpOnHost(this);
19749
+ * }
19750
+ * ```
19751
+ *
19752
+ * QUANDO SI ATTACCA. Non sempre: esporre l'istanza di un componente la rende
19753
+ * raggiungibile da qualunque script della pagina, e in un'installazione di un
19754
+ * cliente non serve a nessuno. Quindi:
19755
+ *
19756
+ * - in sviluppo (`isDevMode()`): sempre, dove `window.ng` c'e' comunque;
19757
+ * - in produzione: SOLO se la pagina ha dichiarato `globalThis.__wuicE2E = true`
19758
+ * prima dell'avvio dell'applicazione. Lo fa il bootstrap dei test e2e
19759
+ * (`playwright/docs/_shared/e2e-login-utils.mjs`, via `addInitScript`), non
19760
+ * il prodotto.
19761
+ *
19762
+ * Costo quando e' attivo: un assegnamento di proprieta' per istanza piu' una
19763
+ * callback di pulizia. Quando e' spento: un confronto booleano.
19764
+ */
19765
+ function exposeWuicCmpOnHost(cmp) {
19766
+ try {
19767
+ if (!isWuicIntrospectionEnabled()) {
19768
+ return;
19769
+ }
19770
+ const ref = inject(ElementRef, { optional: true });
19771
+ const el = ref?.nativeElement;
19772
+ if (!el) {
19773
+ return;
19774
+ }
19775
+ el.__wuicCmp = cmp;
19776
+ // Pulizia senza obbligare il componente ad avere (o a modificare) ngOnDestroy.
19777
+ inject(DestroyRef, { optional: true })?.onDestroy(() => {
19778
+ try {
19779
+ delete el.__wuicCmp;
19780
+ }
19781
+ catch { /* elemento gia' smontato */ }
19782
+ });
19783
+ }
19784
+ catch {
19785
+ // Fuori da un contesto di injection, o ambiente senza DOM (unit test, SSR):
19786
+ // l'handle e' un extra, non deve mai rompere il componente.
19787
+ }
19788
+ }
19789
+ /** True quando l'introspezione dei test e' consentita su questa pagina. */
19790
+ function isWuicIntrospectionEnabled() {
19791
+ try {
19792
+ if (isDevMode()) {
19793
+ return true;
19794
+ }
19795
+ return globalThis.__wuicE2E === true;
19796
+ }
19797
+ catch {
19798
+ return false;
19799
+ }
19800
+ }
19801
+
19671
19802
  /**
19672
19803
  * Metametrics — Dashboard amministrativa delle metriche route
19673
19804
  * (menu Amministrazione → route `/route-metrics-dashboard`).
@@ -19705,6 +19836,9 @@ class RouteMetricsDashboardComponent {
19705
19836
  metric = 'fetch';
19706
19837
  valueKind = 'avg';
19707
19838
  scope = 'global';
19839
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E): in build di
19840
+ * produzione `window.ng` non c'e' e route-metrics-dashboard--filters legge lo stato da qui. */
19841
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
19708
19842
  /** Palette serie (ciclica) — colori PrimeNG standard, ok light/dark. */
19709
19843
  palette = ['#3b82f6', '#22c55e', '#f97316', '#a855f7', '#ef4444', '#14b8a6', '#eab308', '#64748b'];
19710
19844
  /**
@@ -22001,7 +22135,7 @@ class LazySchedulerListComponent {
22001
22135
  * Inizializza il componente preparando stato, sottoscrizioni e primi caricamenti richiesti.
22002
22136
  */
22003
22137
  async ngOnInit() {
22004
- schedulerListComponentPromise ??= import('./wuic-framework-lib-scheduler-list.component-CEMQJrsN.mjs').then((m) => m.SchedulerListComponent);
22138
+ schedulerListComponentPromise ??= import('./wuic-framework-lib-scheduler-list.component-B6lWGWEd.mjs').then((m) => m.SchedulerListComponent);
22005
22139
  this.loadedComponent = await schedulerListComponentPromise;
22006
22140
  this.cdr.markForCheck();
22007
22141
  }
@@ -22209,7 +22343,7 @@ class LazySpreadsheetListSfComponent {
22209
22343
  this.activatedRoute = activatedRoute;
22210
22344
  }
22211
22345
  async ngOnInit() {
22212
- spreadsheetListSfComponentPromise ??= import('./wuic-framework-lib-spreadsheet-list-sf.component-Cgmf9tb1.mjs').then((m) => m.SpreadsheetListSfComponent);
22346
+ spreadsheetListSfComponentPromise ??= import('./wuic-framework-lib-spreadsheet-list-sf.component-Bpxi8la8.mjs').then((m) => m.SpreadsheetListSfComponent);
22213
22347
  this.loadedComponent = await spreadsheetListSfComponentPromise;
22214
22348
  // Quando la promise e' gia' risolta dal cache module-scope (secondo mount
22215
22349
  // post-refresh), il microtask che risolve `await` non scatena sempre CD
@@ -22487,7 +22621,7 @@ class LazyChartListComponent {
22487
22621
  * Inizializza il componente preparando stato, sottoscrizioni e primi caricamenti richiesti.
22488
22622
  */
22489
22623
  async ngOnInit() {
22490
- chartListComponentPromise ??= import('./wuic-framework-lib-chart-list.component-C9rj-6-8.mjs').then((m) => m.ChartListComponent);
22624
+ chartListComponentPromise ??= import('./wuic-framework-lib-chart-list.component-BEps71hL.mjs').then((m) => m.ChartListComponent);
22491
22625
  this.loadedComponent = await chartListComponentPromise;
22492
22626
  this.cdr.markForCheck();
22493
22627
  }
@@ -22809,7 +22943,7 @@ class LazyTimelineListComponent {
22809
22943
  this.cdr = cdr;
22810
22944
  }
22811
22945
  async ngOnInit() {
22812
- timelineListComponentPromise ??= import('./wuic-framework-lib-timeline-list.component-B_bRKY_H.mjs').then((m) => m.TimelineListComponent);
22946
+ timelineListComponentPromise ??= import('./wuic-framework-lib-timeline-list.component-DsvQ8Wro.mjs').then((m) => m.TimelineListComponent);
22813
22947
  this.loadedComponent = await timelineListComponentPromise;
22814
22948
  this.cdr.markForCheck();
22815
22949
  }
@@ -24078,7 +24212,7 @@ class MetadataEditorComponent {
24078
24212
  }
24079
24213
  let result;
24080
24214
  try {
24081
- const { ReportScaffoldDialogComponent } = await import('./wuic-framework-lib-report-scaffold-dialog.component-BsKSP1Dk.mjs');
24215
+ const { ReportScaffoldDialogComponent } = await import('./wuic-framework-lib-report-scaffold-dialog.component-DdRrsp8w.mjs');
24082
24216
  WtoolboxService.resolveDialogServiceFromInjector();
24083
24217
  const ref = WtoolboxService.dialogService?.open?.(ReportScaffoldDialogComponent, {
24084
24218
  header: this.t('report.scaffold.dialog_title', 'Create report'),
@@ -26719,6 +26853,15 @@ class PointFilterComponent {
26719
26853
  * Proprieta di stato del componente per map zoom, usata dalla logica interna e dal template.
26720
26854
  */
26721
26855
  mapZoom = 6;
26856
+ /**
26857
+ * Il template monta `<google-map>` solo se lo script Maps e' caricato (stesso controllo di
26858
+ * `MapListComponent.isMapsApiAvailable`). E' un getter perche' la condizione va rivalutata a
26859
+ * ogni change detection: se lo script arriva dopo, la mappa compare senza ricaricare.
26860
+ */
26861
+ get mapsApiReady() {
26862
+ const g = globalThis.google;
26863
+ return !!(g && g.maps && typeof g.maps.importLibrary === 'function');
26864
+ }
26722
26865
  /**
26723
26866
  * Modalita' di disegno corrente. Sostituisce `google.maps.drawing.DrawingManager`
26724
26867
  * deprecato (Maps JavaScript API drawing library, deprecated 2025-08, removed
@@ -27274,11 +27417,11 @@ class PointFilterComponent {
27274
27417
  };
27275
27418
  }
27276
27419
  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" }] });
27420
+ 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
27421
  }
27279
27422
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: PointFilterComponent, decorators: [{
27280
27423
  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"] }]
27424
+ 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
27425
  }], propDecorators: { record: [{
27283
27426
  type: Input
27284
27427
  }], field: [{
@@ -27293,6 +27436,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
27293
27436
  }] } });
27294
27437
 
27295
27438
  class NumberEditorComponent {
27439
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
27440
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
27296
27441
  /**
27297
27442
  * Input dal componente padre per record; usata nella configurazione e nel rendering del componente.
27298
27443
  */
@@ -29626,6 +29771,8 @@ class BoundedRepeaterComponent {
29626
29771
  userService;
29627
29772
  sanitizer;
29628
29773
  cdr;
29774
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
29775
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
29629
29776
  /**
29630
29777
  * Input dal componente padre per hardcoded route; usata nella configurazione e nel rendering del componente.
29631
29778
  */
@@ -30178,6 +30325,8 @@ class FieldEditorComponent {
30178
30325
  userInfo;
30179
30326
  metadataEditorSrv;
30180
30327
  hostElementRef;
30328
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
30329
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
30181
30330
  static LABEL_FOR_SUPPORTED_WIDGETS = new Set([
30182
30331
  'text',
30183
30332
  'textarea',
@@ -31137,6 +31286,8 @@ class ParametricDialogComponent {
31137
31286
  hostElementRef;
31138
31287
  customAttributesService;
31139
31288
  dialogService;
31289
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
31290
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
31140
31291
  /**
31141
31292
  * Input dal componente padre per datasource; usata nella configurazione e nel rendering del componente.
31142
31293
  */
@@ -31361,7 +31512,11 @@ class ParametricDialogComponent {
31361
31512
  const fetchInfo$ = this.datasource.value?.fetchInfo$;
31362
31513
  if (fetchInfo$ && typeof fetchInfo$.subscribe === 'function') {
31363
31514
  this.fetchInfoSubscription = fetchInfo$.subscribe((info) => {
31364
- if (info?.metaInfo) {
31515
+ if (!info) {
31516
+ this.segnalaRecordNonCaricato();
31517
+ return;
31518
+ }
31519
+ if (info.metaInfo) {
31365
31520
  this.applyDatasourceSnapshot(this.datasource?.value, info.metaInfo);
31366
31521
  this.ensureWizardTrackingBound(this.datasource?.value);
31367
31522
  this.bootstrapConditionalActions();
@@ -31380,7 +31535,11 @@ class ParametricDialogComponent {
31380
31535
  const fetchInfo$ = this.datasource.value?.fetchInfo$;
31381
31536
  if (fetchInfo$ && typeof fetchInfo$.subscribe === 'function') {
31382
31537
  this.fetchInfoSubscription = fetchInfo$.subscribe((info) => {
31383
- if (info?.metaInfo) {
31538
+ if (!info) {
31539
+ this.segnalaRecordNonCaricato();
31540
+ return;
31541
+ }
31542
+ if (info.metaInfo) {
31384
31543
  this.applyDatasourceSnapshot(this.datasource?.value, info.metaInfo);
31385
31544
  this.ensureWizardTrackingBound(this.datasource?.value);
31386
31545
  this.bootstrapConditionalActions();
@@ -31442,6 +31601,62 @@ class ParametricDialogComponent {
31442
31601
  record: this.record,
31443
31602
  pristine: this.pristine
31444
31603
  });
31604
+ // `data-record-loaded`: il record non e' solo ASSEGNATO, i valori sono arrivati.
31605
+ //
31606
+ // Serviva distinguerlo. `wuic-field-editor` espone `data-has-record`, che vale
31607
+ // `this.record ? true : false`, cioe' diventa vero appena la form costruisce lo
31608
+ // scheletro — mentre `getFlatRecordData` e' ancora in volo (misurato su VM il
31609
+ // 21/09/2026: 1,3 s per il record, dentro una raffica di 18 `getTableMetadata`
31610
+ // paralleli, il piu' lento 2,8 s). Chi leggeva un campo appoggiandosi a quel
31611
+ // flag trovava stringa vuota e la scambiava per un difetto: otto prove
31612
+ // `field-widget-*` rosse su entrambi i motori.
31613
+ //
31614
+ // Avere un record non basta: questo metodo gira anche prima dei dati, e in quel
31615
+ // caso il record e' quello VUOTO creato qui sopra da `addNewRecord`. Succede
31616
+ // (a) sul payload anticipato del datasource (`preliminare: true`, emesso appena
31617
+ // arrivano i metadati) e (b) quando il dialogo nasce dopo il reset di `init()`,
31618
+ // con `fetchInfo$` ancora a null. Misurato il 23/09/2026 su Linux x MySQL e
31619
+ // Windows x PostgreSQL: il segnale saliva a +0,2 s, PRIMA che partisse la
31620
+ // richiesta `getFlatRecordData`, e il valore arrivava a +1,0/1,6 s. Si alza
31621
+ // quindi solo quando il payload corrente e' una risposta vera: quella del
31622
+ // record in edit, o quella vuota di un inserimento (dove il record di
31623
+ // `addNewRecord` E' il record giusto). Un datasource senza `fetchInfo$` (quello
31624
+ // costruito da `promptDialog`) non ha niente da caricare: il suo record e' gia'
31625
+ // quello definitivo.
31626
+ try {
31627
+ const el = this.hostElementRef?.nativeElement;
31628
+ const cicloDati = ds.fetchInfo$;
31629
+ const payloadCorrente = cicloDati?.value;
31630
+ const datiArrivati = !!this.record
31631
+ && (!cicloDati || (!!payloadCorrente && payloadCorrente.preliminare !== true));
31632
+ if (el) {
31633
+ el.setAttribute('data-record-loaded', datiArrivati ? 'true' : 'false');
31634
+ }
31635
+ }
31636
+ catch { /* ambiente senza DOM */ }
31637
+ }
31638
+ /**
31639
+ * Abbassa `data-record-loaded` quando il datasource pubblica `null` su `fetchInfo$`.
31640
+ *
31641
+ * Quel `null` lo emette solo `init()` del datasource, cioe' un ricaricamento appena
31642
+ * partito: da `cities/edit/A` a `cities/edit/B` il componente e' riusato e il
31643
+ * gestore NavigationEnd rifa' init + getSchemaAndData. La subscribe ignorava il
31644
+ * payload nullo, e siccome `resultInfo.dato` ha ancora il record A il datasource non
31645
+ * emette nemmeno il payload preliminare: il segnale restava "true" sul record A per
31646
+ * tutta la durata della richiesta di B, e chi lo aspettava leggeva i valori di A
31647
+ * credendoli di B. Qui non si ricalcola niente: con il payload corrente a `null` la
31648
+ * formula di `applyDatasourceSnapshot` darebbe comunque "false", e il segnale si
31649
+ * rialza da li' quando arriva la risposta vera. Il contratto degli altri casi non
31650
+ * cambia: popup (`config.data`, senza subscribe) e promptDialog (senza `fetchInfo$`)
31651
+ * non ricevono mai questo `null`; un inserimento raggiunto navigando riparte da
31652
+ * "false" e si rialza con la sua risposta vuota, come gia' prevedeva la formula; una
31653
+ * form senza record era gia' a "false".
31654
+ */
31655
+ segnalaRecordNonCaricato() {
31656
+ try {
31657
+ this.hostElementRef?.nativeElement?.setAttribute('data-record-loaded', 'false');
31658
+ }
31659
+ catch { /* ambiente senza DOM */ }
31445
31660
  }
31446
31661
  /**
31447
31662
  * In modalita wizard forza una singola riallocazione del current record sul datasource
@@ -34272,6 +34487,9 @@ class NotificationRealtimeService {
34272
34487
  route: String(payload?.route || '').trim() || undefined,
34273
34488
  totalRecords: Number.isFinite(Number(payload?.totalRecords))
34274
34489
  ? Number(payload?.totalRecords)
34490
+ : null,
34491
+ queuePosition: Number(payload?.queuePosition) > 0
34492
+ ? Math.floor(Number(payload?.queuePosition))
34275
34493
  : null
34276
34494
  };
34277
34495
  this.progressEvents$.next(event);
@@ -34472,6 +34690,9 @@ class ImportExportButtonComponent {
34472
34690
  trslSrv;
34473
34691
  userInfo;
34474
34692
  cdr;
34693
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E): in build di
34694
+ * produzione `window.ng` non c'e' e i test leggono lo stato dei dialog import/export da qui. */
34695
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
34475
34696
  routeName = '';
34476
34697
  tableMetadata = null;
34477
34698
  /**
@@ -34502,7 +34723,7 @@ class ImportExportButtonComponent {
34502
34723
  import_type: 'I',
34503
34724
  commit_level: 'R',
34504
34725
  use_column_captions: 'C',
34505
- use_descriptive_fkey: true,
34726
+ fkey_mode: 'description',
34506
34727
  separator: ';',
34507
34728
  allowedExtensions: ['xls', 'xlsx']
34508
34729
  };
@@ -34823,9 +35044,23 @@ class ImportExportButtonComponent {
34823
35044
  if (this.exportProgressTotalRecords <= 0 && Number.isFinite(totalFromEvent) && totalFromEvent > 0) {
34824
35045
  this.exportProgressTotalRecords = Math.floor(totalFromEvent);
34825
35046
  }
35047
+ const queuePosition = Number(evt?.queuePosition);
35048
+ if (queuePosition > 0) {
35049
+ this.applyExportQueuePosition(queuePosition);
35050
+ return;
35051
+ }
34826
35052
  this.applyExportProgressValue(progress);
34827
35053
  });
34828
35054
  }
35055
+ /** Il server ha gia' il massimo di export in corso: questo aspetta il suo turno. */
35056
+ applyExportQueuePosition(position) {
35057
+ this.exportProgressValue = 0;
35058
+ this.exportProgressDetail = this.trslSrv.format(this.t('import_export.export_queued_{0}', "In coda: posizione {0}. L'export parte appena si libera un posto."), String(Math.floor(position)));
35059
+ try {
35060
+ this.cdr.detectChanges();
35061
+ }
35062
+ catch { /* host destroyed mid-export */ }
35063
+ }
34829
35064
  stopExportProgressPolling() {
34830
35065
  this.exportProgressWsSubscription?.unsubscribe();
34831
35066
  this.exportProgressWsSubscription = undefined;
@@ -34891,6 +35126,14 @@ class ImportExportButtonComponent {
34891
35126
  this.exportProgressDialogVisible = true;
34892
35127
  this.startExportProgressPolling(guid);
34893
35128
  }
35129
+ /** extraProps.import.fkey_mode, altrimenti il booleano storico use_descriptive_fkey (default descrizione). */
35130
+ resolveFkeyMode(importCfg) {
35131
+ const mode = String(importCfg?.fkey_mode || '').trim().toLowerCase();
35132
+ if (mode === 'key' || mode === 'description' || mode === 'both') {
35133
+ return mode;
35134
+ }
35135
+ return importCfg?.use_descriptive_fkey === false ? 'key' : 'description';
35136
+ }
34894
35137
  getImportConfigFromMetadata() {
34895
35138
  return (this.tableMetadata?.extraProps)?.import || {};
34896
35139
  }
@@ -34907,7 +35150,7 @@ class ImportExportButtonComponent {
34907
35150
  import_type: String(importCfg?.import_type || 'I').trim() || 'I',
34908
35151
  commit_level: String(importCfg?.commit_level || 'R').trim() || 'R',
34909
35152
  use_column_captions: String(importCfg?.use_column_captions || 'C').trim() || 'C',
34910
- use_descriptive_fkey: importCfg?.use_descriptive_fkey === undefined ? true : !!importCfg?.use_descriptive_fkey,
35153
+ fkey_mode: this.resolveFkeyMode(importCfg),
34911
35154
  separator: String(importCfg?.separator || ';') || ';',
34912
35155
  allowedExtensions: allowedExtensions.length ? allowedExtensions : ['xls', 'xlsx']
34913
35156
  };
@@ -35033,7 +35276,9 @@ class ImportExportButtonComponent {
35033
35276
  appendOpt('import_type', this.importOptionsForm.import_type || 'I');
35034
35277
  appendOpt('commit_level', this.importOptionsForm.commit_level || 'R');
35035
35278
  appendOpt('use_column_captions', this.importOptionsForm.use_column_captions || 'C');
35036
- appendOpt('use_descriptive_fkey', this.importOptionsForm.use_descriptive_fkey ?? true);
35279
+ appendOpt('fkey_mode', this.importOptionsForm.fkey_mode || 'description');
35280
+ // Per i backend che non conoscono fkey_mode: 'both' e 'description' sono descrittivi.
35281
+ appendOpt('use_descriptive_fkey', (this.importOptionsForm.fkey_mode || 'description') !== 'key');
35037
35282
  appendOpt('separator', this.importOptionsForm.separator || ';');
35038
35283
  appendOpt('route_context_json', JSON.stringify(WtoolboxService.buildCrudRouteContext(routeName, 'import', 'ImportExportButton.importFile')));
35039
35284
  const response = await fetch(uploadEndpoint, {
@@ -35274,11 +35519,11 @@ class ImportExportButtonComponent {
35274
35519
  this.importProgressWsSubscription = undefined;
35275
35520
  }
35276
35521
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ImportExportButtonComponent, deps: [{ token: i1$2.ActivatedRoute }, { token: DataProviderService }, { token: DataProviderMetaService }, { token: NotificationRealtimeService }, { token: TranslationManagerService }, { token: UserInfoService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
35277
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: ImportExportButtonComponent, isStandalone: true, selector: "wuic-import-export-button", inputs: { routeName: "routeName", tableMetadata: "tableMetadata", filterInfoProvider: "filterInfoProvider" }, host: { listeners: { "window:wuic-export-progress-resume": "onExportProgressResumeEvent($event)", "window:wuic-import-progress-resume": "onImportProgressResumeEvent($event)" } }, viewQueries: [{ propertyName: "importFileInputRef", first: true, predicate: ["importFileInput"], descendants: true }], ngImport: i0, template: "@if (hasAnyAction) {\r\n@if (hasBothActions) {\r\n<p-button [label]=\"label\" [icon]=\"icon\" (onClick)=\"toggleMenu($event, importExportMenu)\" />\r\n<p-menu #importExportMenu [popup]=\"true\" [model]=\"popupMenuItems\" appendTo=\"body\"></p-menu>\r\n} @else {\r\n<p-button [label]=\"label\" [icon]=\"icon\" (onClick)=\"onPrimaryClick()\" />\r\n}\r\n@if (canImportXls) {\r\n<input #importFileInput type=\"file\"\r\n accept=\".xls,.xlsx,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"\r\n style=\"display: none;\" (change)=\"onImportFileSelected($event)\" />\r\n}\r\n}\r\n\r\n<p-dialog [header]=\"'import_export.import_dialog_title' | translate\" [(visible)]=\"importDialogVisible\" [modal]=\"true\" [closable]=\"true\"\r\n [style]=\"{ width: '34rem', maxWidth: '95vw' }\">\r\n <div class=\"wuic-import-dialog\">\r\n <div class=\"wuic-import-grid\">\r\n <label for=\"wuic-import-type\">{{ 'import_export.import_type' | translate }}</label>\r\n <select id=\"wuic-import-type\" class=\"p-inputtext p-component\" [(ngModel)]=\"importOptionsForm.import_type\">\r\n <option value=\"I\">{{ 'import_export.import_type_i' | translate }}</option>\r\n <option value=\"U\">{{ 'import_export.import_type_u' | translate }}</option>\r\n <option value=\"IU\">{{ 'import_export.import_type_iu' | translate }}</option>\r\n </select>\r\n\r\n <label for=\"wuic-import-commit-level\">{{ 'import_export.commit_level' | translate }}</label>\r\n <select id=\"wuic-import-commit-level\" class=\"p-inputtext p-component\" [(ngModel)]=\"importOptionsForm.commit_level\">\r\n <option value=\"R\">{{ 'import_export.commit_level_r' | translate }}</option>\r\n <option value=\"I\">{{ 'import_export.commit_level_i' | translate }}</option>\r\n <option value=\"C\">{{ 'import_export.commit_level_c' | translate }}</option>\r\n <option value=\"T\">{{ 'import_export.commit_level_t' | translate }}</option>\r\n </select>\r\n\r\n <label for=\"wuic-import-use-column-captions\">{{ 'import_export.use_column_captions' | translate }}</label>\r\n <select id=\"wuic-import-use-column-captions\" class=\"p-inputtext p-component\" [(ngModel)]=\"importOptionsForm.use_column_captions\">\r\n <option value=\"N\">{{ 'import_export.use_column_captions_n' | translate }}</option>\r\n <option value=\"C\">{{ 'import_export.use_column_captions_c' | translate }}</option>\r\n </select>\r\n\r\n <label for=\"wuic-import-separator\">{{ 'import_export.separator' | translate }}</label>\r\n <input id=\"wuic-import-separator\" type=\"text\" pInputText [(ngModel)]=\"importOptionsForm.separator\" />\r\n </div>\r\n\r\n <label class=\"wuic-column-layout-check\">\r\n <input type=\"checkbox\" [(ngModel)]=\"importOptionsForm.use_descriptive_fkey\" />\r\n <span>{{ 'import_export.use_descriptive_fkey' | translate }}</span>\r\n </label>\r\n\r\n <div class=\"wuic-import-file-row\">\r\n <p-button icon=\"pi pi-paperclip\" [label]=\"'import_export.select_file' | translate\" [outlined]=\"true\" (onClick)=\"triggerImportFileSelection()\" />\r\n <span>{{ importSelectedFileName || ('import_export.no_file_selected' | translate) }}</span>\r\n </div>\r\n </div>\r\n\r\n <ng-template pTemplate=\"footer\">\r\n <p-button [label]=\"'cancel' | translate\" [outlined]=\"true\" [disabled]=\"importDialogBusy\"\r\n (onClick)=\"importDialogVisible = false\" />\r\n <p-button [label]=\"'import_export.confirm_import' | translate\" [disabled]=\"importDialogBusy || !importSelectedFileName\"\r\n (onClick)=\"confirmImportDialog()\" />\r\n </ng-template>\r\n</p-dialog>\r\n\r\n<p-dialog [header]=\"'import_export.import_progress_title' | translate\" [(visible)]=\"importProgressDialogVisible\" [modal]=\"true\" [closable]=\"false\"\r\n [draggable]=\"false\" [resizable]=\"false\" [style]=\"{ width: '30rem', maxWidth: '95vw' }\"\r\n styleClass=\"wuic-progress-dialog\">\r\n <div class=\"wuic-export-progress-dialog\">\r\n <p-progressbar [value]=\"importProgressValue\"></p-progressbar>\r\n <div class=\"wuic-export-progress-detail\">{{ importProgressDetail }}</div>\r\n </div>\r\n <ng-template pTemplate=\"footer\">\r\n <p-button [label]=\"'import_export.continue_in_background' | translate\" [outlined]=\"true\" [disabled]=\"importControlBusy\"\r\n (onClick)=\"continueImportInBackground()\" />\r\n <p-button [label]=\"'import_export.cancel_import_rollback' | translate\" severity=\"danger\" [outlined]=\"true\" [disabled]=\"importControlBusy\"\r\n (onClick)=\"cancelImportTaskFromDialog()\" />\r\n <p-button [label]=\"'import_export.stop_commit_partial' | translate\" [disabled]=\"importControlBusy\"\r\n (onClick)=\"stopImportAndCommitFromDialog()\" />\r\n </ng-template>\r\n</p-dialog>\r\n\r\n<p-dialog [header]=\"'import_export.export_progress_title' | translate\" [(visible)]=\"exportProgressDialogVisible\" [modal]=\"true\" [closable]=\"false\"\r\n [draggable]=\"false\" [resizable]=\"false\" [style]=\"{ width: '30rem', maxWidth: '95vw' }\"\r\n styleClass=\"wuic-progress-dialog\">\r\n <div class=\"wuic-export-progress-dialog\">\r\n <p-progressbar [value]=\"exportProgressValue\"></p-progressbar>\r\n <div class=\"wuic-export-progress-detail\">{{ exportProgressDetail }}</div>\r\n </div>\r\n <ng-template pTemplate=\"footer\">\r\n <p-button [label]=\"'import_export.continue_in_background' | translate\" [outlined]=\"true\" [disabled]=\"exportControlBusy\"\r\n (onClick)=\"continueExportInBackground()\" />\r\n <p-button [label]=\"'import_export.cancel_task' | translate\" severity=\"danger\" [outlined]=\"true\" [disabled]=\"exportControlBusy\"\r\n (onClick)=\"cancelExportTaskFromDialog()\" />\r\n <p-button [label]=\"'import_export.stop_download_partial' | translate\" [disabled]=\"exportControlBusy\"\r\n (onClick)=\"stopExportAndDownloadPartialFromDialog()\" />\r\n </ng-template>\r\n</p-dialog>\r\n", styles: [".wuic-export-progress-dialog{display:flex;flex-direction:column;gap:.65rem}::ng-deep .wuic-progress-dialog .p-progressbar{--p-progressbar-value-transition: none}::ng-deep .wuic-progress-dialog .p-progressbar .p-progressbar-value,::ng-deep .wuic-progress-dialog .p-progressbar-value,:host ::ng-deep .wuic-export-progress-dialog .p-progressbar .p-progressbar-value,:host ::ng-deep .wuic-export-progress-dialog .p-progressbar-value{transition:none!important;animation:none!important}.wuic-export-progress-detail{font-size:.9rem;font-weight:600;text-align:right}.wuic-import-dialog{display:flex;flex-direction:column;gap:.75rem}.wuic-import-grid{display:grid;grid-template-columns:1fr;gap:.35rem}.wuic-import-file-row{display:flex;align-items:center;gap:.65rem}\n"], dependencies: [{ kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i4.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: MenuModule }, { kind: "component", type: i7$1.Menu, selector: "p-menu", inputs: ["model", "popup", "style", "styleClass", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaLabel", "ariaLabelledBy", "id", "tabindex", "appendTo", "motionOptions"], outputs: ["onShow", "onHide", "onBlur", "onFocus"] }, { 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: "ngmodule", type: ProgressBarModule }, { kind: "component", type: i6$3.ProgressBar, selector: "p-progressBar, p-progressbar, p-progress-bar", inputs: ["value", "showValue", "styleClass", "valueStyleClass", "unit", "mode", "color"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$3.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1$3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i3$2.InputText, selector: "[pInputText]", inputs: ["hostName", "ptInputText", "pInputTextPT", "pInputTextUnstyled", "pSize", "variant", "fluid", "invalid"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i8.TranslatePipe, name: "translate" }] });
35522
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: ImportExportButtonComponent, isStandalone: true, selector: "wuic-import-export-button", inputs: { routeName: "routeName", tableMetadata: "tableMetadata", filterInfoProvider: "filterInfoProvider" }, host: { listeners: { "window:wuic-export-progress-resume": "onExportProgressResumeEvent($event)", "window:wuic-import-progress-resume": "onImportProgressResumeEvent($event)" } }, viewQueries: [{ propertyName: "importFileInputRef", first: true, predicate: ["importFileInput"], descendants: true }], ngImport: i0, template: "@if (hasAnyAction) {\r\n@if (hasBothActions) {\r\n<p-button [label]=\"label\" [icon]=\"icon\" (onClick)=\"toggleMenu($event, importExportMenu)\" />\r\n<p-menu #importExportMenu [popup]=\"true\" [model]=\"popupMenuItems\" appendTo=\"body\"></p-menu>\r\n} @else {\r\n<p-button [label]=\"label\" [icon]=\"icon\" (onClick)=\"onPrimaryClick()\" />\r\n}\r\n@if (canImportXls) {\r\n<input #importFileInput type=\"file\"\r\n accept=\".xls,.xlsx,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"\r\n style=\"display: none;\" (change)=\"onImportFileSelected($event)\" />\r\n}\r\n}\r\n\r\n<p-dialog [header]=\"'import_export.import_dialog_title' | translate\" [(visible)]=\"importDialogVisible\" [modal]=\"true\" [closable]=\"true\"\r\n [style]=\"{ width: '34rem', maxWidth: '95vw' }\">\r\n <div class=\"wuic-import-dialog\">\r\n <div class=\"wuic-import-grid\">\r\n <label for=\"wuic-import-type\">{{ 'import_export.import_type' | translate }}</label>\r\n <select id=\"wuic-import-type\" class=\"p-inputtext p-component\" [(ngModel)]=\"importOptionsForm.import_type\">\r\n <option value=\"I\">{{ 'import_export.import_type_i' | translate }}</option>\r\n <option value=\"U\">{{ 'import_export.import_type_u' | translate }}</option>\r\n <option value=\"IU\">{{ 'import_export.import_type_iu' | translate }}</option>\r\n </select>\r\n\r\n <label for=\"wuic-import-commit-level\">{{ 'import_export.commit_level' | translate }}</label>\r\n <select id=\"wuic-import-commit-level\" class=\"p-inputtext p-component\" [(ngModel)]=\"importOptionsForm.commit_level\">\r\n <option value=\"R\">{{ 'import_export.commit_level_r' | translate }}</option>\r\n <option value=\"I\">{{ 'import_export.commit_level_i' | translate }}</option>\r\n <option value=\"C\">{{ 'import_export.commit_level_c' | translate }}</option>\r\n <option value=\"T\">{{ 'import_export.commit_level_t' | translate }}</option>\r\n </select>\r\n\r\n <label for=\"wuic-import-use-column-captions\">{{ 'import_export.use_column_captions' | translate }}</label>\r\n <select id=\"wuic-import-use-column-captions\" class=\"p-inputtext p-component\" [(ngModel)]=\"importOptionsForm.use_column_captions\">\r\n <option value=\"N\">{{ 'import_export.use_column_captions_n' | translate }}</option>\r\n <option value=\"C\">{{ 'import_export.use_column_captions_c' | translate }}</option>\r\n </select>\r\n\r\n <label for=\"wuic-import-separator\">{{ 'import_export.separator' | translate }}</label>\r\n <input id=\"wuic-import-separator\" type=\"text\" pInputText [(ngModel)]=\"importOptionsForm.separator\" />\r\n\r\n <label for=\"wuic-import-fkey-mode\">{{ 'import_export.fkey_mode' | translate }}</label>\r\n <select id=\"wuic-import-fkey-mode\" class=\"p-inputtext p-component\" [(ngModel)]=\"importOptionsForm.fkey_mode\">\r\n <option value=\"description\">{{ 'import_export.fkey_mode_description' | translate }}</option>\r\n <option value=\"key\">{{ 'import_export.fkey_mode_key' | translate }}</option>\r\n <option value=\"both\">{{ 'import_export.fkey_mode_both' | translate }}</option>\r\n </select>\r\n </div>\r\n\r\n <div class=\"wuic-import-file-row\">\r\n <p-button icon=\"pi pi-paperclip\" [label]=\"'import_export.select_file' | translate\" [outlined]=\"true\" (onClick)=\"triggerImportFileSelection()\" />\r\n <span>{{ importSelectedFileName || ('import_export.no_file_selected' | translate) }}</span>\r\n </div>\r\n </div>\r\n\r\n <ng-template pTemplate=\"footer\">\r\n <p-button [label]=\"'cancel' | translate\" [outlined]=\"true\" [disabled]=\"importDialogBusy\"\r\n (onClick)=\"importDialogVisible = false\" />\r\n <p-button [label]=\"'import_export.confirm_import' | translate\" [disabled]=\"importDialogBusy || !importSelectedFileName\"\r\n (onClick)=\"confirmImportDialog()\" />\r\n </ng-template>\r\n</p-dialog>\r\n\r\n<p-dialog [header]=\"'import_export.import_progress_title' | translate\" [(visible)]=\"importProgressDialogVisible\" [modal]=\"true\" [closable]=\"false\"\r\n [draggable]=\"false\" [resizable]=\"false\" [style]=\"{ width: '30rem', maxWidth: '95vw' }\"\r\n styleClass=\"wuic-progress-dialog\">\r\n <div class=\"wuic-export-progress-dialog\">\r\n <p-progressbar [value]=\"importProgressValue\"></p-progressbar>\r\n <div class=\"wuic-export-progress-detail\">{{ importProgressDetail }}</div>\r\n </div>\r\n <ng-template pTemplate=\"footer\">\r\n <p-button [label]=\"'import_export.continue_in_background' | translate\" [outlined]=\"true\" [disabled]=\"importControlBusy\"\r\n (onClick)=\"continueImportInBackground()\" />\r\n <p-button [label]=\"'import_export.cancel_import_rollback' | translate\" severity=\"danger\" [outlined]=\"true\" [disabled]=\"importControlBusy\"\r\n (onClick)=\"cancelImportTaskFromDialog()\" />\r\n <p-button [label]=\"'import_export.stop_commit_partial' | translate\" [disabled]=\"importControlBusy\"\r\n (onClick)=\"stopImportAndCommitFromDialog()\" />\r\n </ng-template>\r\n</p-dialog>\r\n\r\n<p-dialog [header]=\"'import_export.export_progress_title' | translate\" [(visible)]=\"exportProgressDialogVisible\" [modal]=\"true\" [closable]=\"false\"\r\n [draggable]=\"false\" [resizable]=\"false\" [style]=\"{ width: '30rem', maxWidth: '95vw' }\"\r\n styleClass=\"wuic-progress-dialog\">\r\n <div class=\"wuic-export-progress-dialog\">\r\n <p-progressbar [value]=\"exportProgressValue\"></p-progressbar>\r\n <div class=\"wuic-export-progress-detail\">{{ exportProgressDetail }}</div>\r\n </div>\r\n <ng-template pTemplate=\"footer\">\r\n <p-button [label]=\"'import_export.continue_in_background' | translate\" [outlined]=\"true\" [disabled]=\"exportControlBusy\"\r\n (onClick)=\"continueExportInBackground()\" />\r\n <p-button [label]=\"'import_export.cancel_task' | translate\" severity=\"danger\" [outlined]=\"true\" [disabled]=\"exportControlBusy\"\r\n (onClick)=\"cancelExportTaskFromDialog()\" />\r\n <p-button [label]=\"'import_export.stop_download_partial' | translate\" [disabled]=\"exportControlBusy\"\r\n (onClick)=\"stopExportAndDownloadPartialFromDialog()\" />\r\n </ng-template>\r\n</p-dialog>\r\n", styles: [".wuic-export-progress-dialog{display:flex;flex-direction:column;gap:.65rem}::ng-deep .wuic-progress-dialog .p-progressbar{--p-progressbar-value-transition: none}::ng-deep .wuic-progress-dialog .p-progressbar .p-progressbar-value,::ng-deep .wuic-progress-dialog .p-progressbar-value,:host ::ng-deep .wuic-export-progress-dialog .p-progressbar .p-progressbar-value,:host ::ng-deep .wuic-export-progress-dialog .p-progressbar-value{transition:none!important;animation:none!important}.wuic-export-progress-detail{font-size:.9rem;font-weight:600;text-align:right}.wuic-import-dialog{display:flex;flex-direction:column;gap:.75rem}.wuic-import-grid{display:grid;grid-template-columns:1fr;gap:.35rem}.wuic-import-file-row{display:flex;align-items:center;gap:.65rem}\n"], dependencies: [{ kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i4.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: MenuModule }, { kind: "component", type: i7$1.Menu, selector: "p-menu", inputs: ["model", "popup", "style", "styleClass", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaLabel", "ariaLabelledBy", "id", "tabindex", "appendTo", "motionOptions"], outputs: ["onShow", "onHide", "onBlur", "onFocus"] }, { 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: "ngmodule", type: ProgressBarModule }, { kind: "component", type: i6$3.ProgressBar, selector: "p-progressBar, p-progressbar, p-progress-bar", inputs: ["value", "showValue", "styleClass", "valueStyleClass", "unit", "mode", "color"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i3$2.InputText, selector: "[pInputText]", inputs: ["hostName", "ptInputText", "pInputTextPT", "pInputTextUnstyled", "pSize", "variant", "fluid", "invalid"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i8.TranslatePipe, name: "translate" }] });
35278
35523
  }
35279
35524
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ImportExportButtonComponent, decorators: [{
35280
35525
  type: Component,
35281
- args: [{ selector: 'wuic-import-export-button', imports: [ButtonModule, MenuModule, DialogModule, ProgressBarModule, FormsModule, InputTextModule, TranslateModule], template: "@if (hasAnyAction) {\r\n@if (hasBothActions) {\r\n<p-button [label]=\"label\" [icon]=\"icon\" (onClick)=\"toggleMenu($event, importExportMenu)\" />\r\n<p-menu #importExportMenu [popup]=\"true\" [model]=\"popupMenuItems\" appendTo=\"body\"></p-menu>\r\n} @else {\r\n<p-button [label]=\"label\" [icon]=\"icon\" (onClick)=\"onPrimaryClick()\" />\r\n}\r\n@if (canImportXls) {\r\n<input #importFileInput type=\"file\"\r\n accept=\".xls,.xlsx,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"\r\n style=\"display: none;\" (change)=\"onImportFileSelected($event)\" />\r\n}\r\n}\r\n\r\n<p-dialog [header]=\"'import_export.import_dialog_title' | translate\" [(visible)]=\"importDialogVisible\" [modal]=\"true\" [closable]=\"true\"\r\n [style]=\"{ width: '34rem', maxWidth: '95vw' }\">\r\n <div class=\"wuic-import-dialog\">\r\n <div class=\"wuic-import-grid\">\r\n <label for=\"wuic-import-type\">{{ 'import_export.import_type' | translate }}</label>\r\n <select id=\"wuic-import-type\" class=\"p-inputtext p-component\" [(ngModel)]=\"importOptionsForm.import_type\">\r\n <option value=\"I\">{{ 'import_export.import_type_i' | translate }}</option>\r\n <option value=\"U\">{{ 'import_export.import_type_u' | translate }}</option>\r\n <option value=\"IU\">{{ 'import_export.import_type_iu' | translate }}</option>\r\n </select>\r\n\r\n <label for=\"wuic-import-commit-level\">{{ 'import_export.commit_level' | translate }}</label>\r\n <select id=\"wuic-import-commit-level\" class=\"p-inputtext p-component\" [(ngModel)]=\"importOptionsForm.commit_level\">\r\n <option value=\"R\">{{ 'import_export.commit_level_r' | translate }}</option>\r\n <option value=\"I\">{{ 'import_export.commit_level_i' | translate }}</option>\r\n <option value=\"C\">{{ 'import_export.commit_level_c' | translate }}</option>\r\n <option value=\"T\">{{ 'import_export.commit_level_t' | translate }}</option>\r\n </select>\r\n\r\n <label for=\"wuic-import-use-column-captions\">{{ 'import_export.use_column_captions' | translate }}</label>\r\n <select id=\"wuic-import-use-column-captions\" class=\"p-inputtext p-component\" [(ngModel)]=\"importOptionsForm.use_column_captions\">\r\n <option value=\"N\">{{ 'import_export.use_column_captions_n' | translate }}</option>\r\n <option value=\"C\">{{ 'import_export.use_column_captions_c' | translate }}</option>\r\n </select>\r\n\r\n <label for=\"wuic-import-separator\">{{ 'import_export.separator' | translate }}</label>\r\n <input id=\"wuic-import-separator\" type=\"text\" pInputText [(ngModel)]=\"importOptionsForm.separator\" />\r\n </div>\r\n\r\n <label class=\"wuic-column-layout-check\">\r\n <input type=\"checkbox\" [(ngModel)]=\"importOptionsForm.use_descriptive_fkey\" />\r\n <span>{{ 'import_export.use_descriptive_fkey' | translate }}</span>\r\n </label>\r\n\r\n <div class=\"wuic-import-file-row\">\r\n <p-button icon=\"pi pi-paperclip\" [label]=\"'import_export.select_file' | translate\" [outlined]=\"true\" (onClick)=\"triggerImportFileSelection()\" />\r\n <span>{{ importSelectedFileName || ('import_export.no_file_selected' | translate) }}</span>\r\n </div>\r\n </div>\r\n\r\n <ng-template pTemplate=\"footer\">\r\n <p-button [label]=\"'cancel' | translate\" [outlined]=\"true\" [disabled]=\"importDialogBusy\"\r\n (onClick)=\"importDialogVisible = false\" />\r\n <p-button [label]=\"'import_export.confirm_import' | translate\" [disabled]=\"importDialogBusy || !importSelectedFileName\"\r\n (onClick)=\"confirmImportDialog()\" />\r\n </ng-template>\r\n</p-dialog>\r\n\r\n<p-dialog [header]=\"'import_export.import_progress_title' | translate\" [(visible)]=\"importProgressDialogVisible\" [modal]=\"true\" [closable]=\"false\"\r\n [draggable]=\"false\" [resizable]=\"false\" [style]=\"{ width: '30rem', maxWidth: '95vw' }\"\r\n styleClass=\"wuic-progress-dialog\">\r\n <div class=\"wuic-export-progress-dialog\">\r\n <p-progressbar [value]=\"importProgressValue\"></p-progressbar>\r\n <div class=\"wuic-export-progress-detail\">{{ importProgressDetail }}</div>\r\n </div>\r\n <ng-template pTemplate=\"footer\">\r\n <p-button [label]=\"'import_export.continue_in_background' | translate\" [outlined]=\"true\" [disabled]=\"importControlBusy\"\r\n (onClick)=\"continueImportInBackground()\" />\r\n <p-button [label]=\"'import_export.cancel_import_rollback' | translate\" severity=\"danger\" [outlined]=\"true\" [disabled]=\"importControlBusy\"\r\n (onClick)=\"cancelImportTaskFromDialog()\" />\r\n <p-button [label]=\"'import_export.stop_commit_partial' | translate\" [disabled]=\"importControlBusy\"\r\n (onClick)=\"stopImportAndCommitFromDialog()\" />\r\n </ng-template>\r\n</p-dialog>\r\n\r\n<p-dialog [header]=\"'import_export.export_progress_title' | translate\" [(visible)]=\"exportProgressDialogVisible\" [modal]=\"true\" [closable]=\"false\"\r\n [draggable]=\"false\" [resizable]=\"false\" [style]=\"{ width: '30rem', maxWidth: '95vw' }\"\r\n styleClass=\"wuic-progress-dialog\">\r\n <div class=\"wuic-export-progress-dialog\">\r\n <p-progressbar [value]=\"exportProgressValue\"></p-progressbar>\r\n <div class=\"wuic-export-progress-detail\">{{ exportProgressDetail }}</div>\r\n </div>\r\n <ng-template pTemplate=\"footer\">\r\n <p-button [label]=\"'import_export.continue_in_background' | translate\" [outlined]=\"true\" [disabled]=\"exportControlBusy\"\r\n (onClick)=\"continueExportInBackground()\" />\r\n <p-button [label]=\"'import_export.cancel_task' | translate\" severity=\"danger\" [outlined]=\"true\" [disabled]=\"exportControlBusy\"\r\n (onClick)=\"cancelExportTaskFromDialog()\" />\r\n <p-button [label]=\"'import_export.stop_download_partial' | translate\" [disabled]=\"exportControlBusy\"\r\n (onClick)=\"stopExportAndDownloadPartialFromDialog()\" />\r\n </ng-template>\r\n</p-dialog>\r\n", styles: [".wuic-export-progress-dialog{display:flex;flex-direction:column;gap:.65rem}::ng-deep .wuic-progress-dialog .p-progressbar{--p-progressbar-value-transition: none}::ng-deep .wuic-progress-dialog .p-progressbar .p-progressbar-value,::ng-deep .wuic-progress-dialog .p-progressbar-value,:host ::ng-deep .wuic-export-progress-dialog .p-progressbar .p-progressbar-value,:host ::ng-deep .wuic-export-progress-dialog .p-progressbar-value{transition:none!important;animation:none!important}.wuic-export-progress-detail{font-size:.9rem;font-weight:600;text-align:right}.wuic-import-dialog{display:flex;flex-direction:column;gap:.75rem}.wuic-import-grid{display:grid;grid-template-columns:1fr;gap:.35rem}.wuic-import-file-row{display:flex;align-items:center;gap:.65rem}\n"] }]
35526
+ args: [{ selector: 'wuic-import-export-button', imports: [ButtonModule, MenuModule, DialogModule, ProgressBarModule, FormsModule, InputTextModule, TranslateModule], template: "@if (hasAnyAction) {\r\n@if (hasBothActions) {\r\n<p-button [label]=\"label\" [icon]=\"icon\" (onClick)=\"toggleMenu($event, importExportMenu)\" />\r\n<p-menu #importExportMenu [popup]=\"true\" [model]=\"popupMenuItems\" appendTo=\"body\"></p-menu>\r\n} @else {\r\n<p-button [label]=\"label\" [icon]=\"icon\" (onClick)=\"onPrimaryClick()\" />\r\n}\r\n@if (canImportXls) {\r\n<input #importFileInput type=\"file\"\r\n accept=\".xls,.xlsx,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"\r\n style=\"display: none;\" (change)=\"onImportFileSelected($event)\" />\r\n}\r\n}\r\n\r\n<p-dialog [header]=\"'import_export.import_dialog_title' | translate\" [(visible)]=\"importDialogVisible\" [modal]=\"true\" [closable]=\"true\"\r\n [style]=\"{ width: '34rem', maxWidth: '95vw' }\">\r\n <div class=\"wuic-import-dialog\">\r\n <div class=\"wuic-import-grid\">\r\n <label for=\"wuic-import-type\">{{ 'import_export.import_type' | translate }}</label>\r\n <select id=\"wuic-import-type\" class=\"p-inputtext p-component\" [(ngModel)]=\"importOptionsForm.import_type\">\r\n <option value=\"I\">{{ 'import_export.import_type_i' | translate }}</option>\r\n <option value=\"U\">{{ 'import_export.import_type_u' | translate }}</option>\r\n <option value=\"IU\">{{ 'import_export.import_type_iu' | translate }}</option>\r\n </select>\r\n\r\n <label for=\"wuic-import-commit-level\">{{ 'import_export.commit_level' | translate }}</label>\r\n <select id=\"wuic-import-commit-level\" class=\"p-inputtext p-component\" [(ngModel)]=\"importOptionsForm.commit_level\">\r\n <option value=\"R\">{{ 'import_export.commit_level_r' | translate }}</option>\r\n <option value=\"I\">{{ 'import_export.commit_level_i' | translate }}</option>\r\n <option value=\"C\">{{ 'import_export.commit_level_c' | translate }}</option>\r\n <option value=\"T\">{{ 'import_export.commit_level_t' | translate }}</option>\r\n </select>\r\n\r\n <label for=\"wuic-import-use-column-captions\">{{ 'import_export.use_column_captions' | translate }}</label>\r\n <select id=\"wuic-import-use-column-captions\" class=\"p-inputtext p-component\" [(ngModel)]=\"importOptionsForm.use_column_captions\">\r\n <option value=\"N\">{{ 'import_export.use_column_captions_n' | translate }}</option>\r\n <option value=\"C\">{{ 'import_export.use_column_captions_c' | translate }}</option>\r\n </select>\r\n\r\n <label for=\"wuic-import-separator\">{{ 'import_export.separator' | translate }}</label>\r\n <input id=\"wuic-import-separator\" type=\"text\" pInputText [(ngModel)]=\"importOptionsForm.separator\" />\r\n\r\n <label for=\"wuic-import-fkey-mode\">{{ 'import_export.fkey_mode' | translate }}</label>\r\n <select id=\"wuic-import-fkey-mode\" class=\"p-inputtext p-component\" [(ngModel)]=\"importOptionsForm.fkey_mode\">\r\n <option value=\"description\">{{ 'import_export.fkey_mode_description' | translate }}</option>\r\n <option value=\"key\">{{ 'import_export.fkey_mode_key' | translate }}</option>\r\n <option value=\"both\">{{ 'import_export.fkey_mode_both' | translate }}</option>\r\n </select>\r\n </div>\r\n\r\n <div class=\"wuic-import-file-row\">\r\n <p-button icon=\"pi pi-paperclip\" [label]=\"'import_export.select_file' | translate\" [outlined]=\"true\" (onClick)=\"triggerImportFileSelection()\" />\r\n <span>{{ importSelectedFileName || ('import_export.no_file_selected' | translate) }}</span>\r\n </div>\r\n </div>\r\n\r\n <ng-template pTemplate=\"footer\">\r\n <p-button [label]=\"'cancel' | translate\" [outlined]=\"true\" [disabled]=\"importDialogBusy\"\r\n (onClick)=\"importDialogVisible = false\" />\r\n <p-button [label]=\"'import_export.confirm_import' | translate\" [disabled]=\"importDialogBusy || !importSelectedFileName\"\r\n (onClick)=\"confirmImportDialog()\" />\r\n </ng-template>\r\n</p-dialog>\r\n\r\n<p-dialog [header]=\"'import_export.import_progress_title' | translate\" [(visible)]=\"importProgressDialogVisible\" [modal]=\"true\" [closable]=\"false\"\r\n [draggable]=\"false\" [resizable]=\"false\" [style]=\"{ width: '30rem', maxWidth: '95vw' }\"\r\n styleClass=\"wuic-progress-dialog\">\r\n <div class=\"wuic-export-progress-dialog\">\r\n <p-progressbar [value]=\"importProgressValue\"></p-progressbar>\r\n <div class=\"wuic-export-progress-detail\">{{ importProgressDetail }}</div>\r\n </div>\r\n <ng-template pTemplate=\"footer\">\r\n <p-button [label]=\"'import_export.continue_in_background' | translate\" [outlined]=\"true\" [disabled]=\"importControlBusy\"\r\n (onClick)=\"continueImportInBackground()\" />\r\n <p-button [label]=\"'import_export.cancel_import_rollback' | translate\" severity=\"danger\" [outlined]=\"true\" [disabled]=\"importControlBusy\"\r\n (onClick)=\"cancelImportTaskFromDialog()\" />\r\n <p-button [label]=\"'import_export.stop_commit_partial' | translate\" [disabled]=\"importControlBusy\"\r\n (onClick)=\"stopImportAndCommitFromDialog()\" />\r\n </ng-template>\r\n</p-dialog>\r\n\r\n<p-dialog [header]=\"'import_export.export_progress_title' | translate\" [(visible)]=\"exportProgressDialogVisible\" [modal]=\"true\" [closable]=\"false\"\r\n [draggable]=\"false\" [resizable]=\"false\" [style]=\"{ width: '30rem', maxWidth: '95vw' }\"\r\n styleClass=\"wuic-progress-dialog\">\r\n <div class=\"wuic-export-progress-dialog\">\r\n <p-progressbar [value]=\"exportProgressValue\"></p-progressbar>\r\n <div class=\"wuic-export-progress-detail\">{{ exportProgressDetail }}</div>\r\n </div>\r\n <ng-template pTemplate=\"footer\">\r\n <p-button [label]=\"'import_export.continue_in_background' | translate\" [outlined]=\"true\" [disabled]=\"exportControlBusy\"\r\n (onClick)=\"continueExportInBackground()\" />\r\n <p-button [label]=\"'import_export.cancel_task' | translate\" severity=\"danger\" [outlined]=\"true\" [disabled]=\"exportControlBusy\"\r\n (onClick)=\"cancelExportTaskFromDialog()\" />\r\n <p-button [label]=\"'import_export.stop_download_partial' | translate\" [disabled]=\"exportControlBusy\"\r\n (onClick)=\"stopExportAndDownloadPartialFromDialog()\" />\r\n </ng-template>\r\n</p-dialog>\r\n", styles: [".wuic-export-progress-dialog{display:flex;flex-direction:column;gap:.65rem}::ng-deep .wuic-progress-dialog .p-progressbar{--p-progressbar-value-transition: none}::ng-deep .wuic-progress-dialog .p-progressbar .p-progressbar-value,::ng-deep .wuic-progress-dialog .p-progressbar-value,:host ::ng-deep .wuic-export-progress-dialog .p-progressbar .p-progressbar-value,:host ::ng-deep .wuic-export-progress-dialog .p-progressbar-value{transition:none!important;animation:none!important}.wuic-export-progress-detail{font-size:.9rem;font-weight:600;text-align:right}.wuic-import-dialog{display:flex;flex-direction:column;gap:.75rem}.wuic-import-grid{display:grid;grid-template-columns:1fr;gap:.35rem}.wuic-import-file-row{display:flex;align-items:center;gap:.65rem}\n"] }]
35282
35527
  }], ctorParameters: () => [{ type: i1$2.ActivatedRoute }, { type: DataProviderService }, { type: DataProviderMetaService }, { type: NotificationRealtimeService }, { type: TranslationManagerService }, { type: UserInfoService }, { type: i0.ChangeDetectorRef }], propDecorators: { routeName: [{
35283
35528
  type: Input
35284
35529
  }], tableMetadata: [{
@@ -35310,6 +35555,8 @@ class ListGridComponent {
35310
35555
  deviceAwareness;
35311
35556
  zone;
35312
35557
  customAttributesService;
35558
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
35559
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
35313
35560
  static FORCED_VIRTUALIZATION_PAGE_SIZE_THRESHOLD = 1000;
35314
35561
  static FORCED_VIRTUALIZATION_ITEM_SIZE = 44;
35315
35562
  static ACTION_BUTTON_VISIBLE_ROWS_OVERSCAN = 4;
@@ -42271,6 +42518,8 @@ class MapListComponent {
42271
42518
  route;
42272
42519
  userInfo;
42273
42520
  trslSrv;
42521
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
42522
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
42274
42523
  /**
42275
42524
  * Riferimento a elementi o componenti figli usato dalla logica UI per map.
42276
42525
  */
@@ -44656,6 +44905,8 @@ class CarouselListComponent {
44656
44905
  route;
44657
44906
  trslSrv;
44658
44907
  userInfo;
44908
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
44909
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
44659
44910
  /**
44660
44911
  * Input dal componente padre per hardcoded route; usata nella configurazione e nel rendering del componente.
44661
44912
  */
@@ -45278,6 +45529,8 @@ class TreeListComponent {
45278
45529
  dataSrv;
45279
45530
  cd;
45280
45531
  trslSrv;
45532
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
45533
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
45281
45534
  /**
45282
45535
  * Input dal componente padre per hardcoded route; usata nella configurazione e nel rendering del componente.
45283
45536
  */
@@ -48602,6 +48855,8 @@ class MetaMenuComponent {
48602
48855
  userLanguage;
48603
48856
  headerConfig;
48604
48857
  themeCatalog;
48858
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
48859
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
48605
48860
  /**
48606
48861
  * Collezione dati per items, consumata dal rendering e dalle operazioni del componente.
48607
48862
  */
@@ -50344,7 +50599,7 @@ class LazyFirstRunWizardComponent {
50344
50599
  this.cdr = cdr;
50345
50600
  }
50346
50601
  async ngOnInit() {
50347
- firstRunWizardComponentPromise ??= import('./wuic-framework-lib-first-run-wizard.component-Bg41Xfht.mjs').then((m) => m.WuicFirstRunWizardComponent);
50602
+ firstRunWizardComponentPromise ??= import('./wuic-framework-lib-first-run-wizard.component-Hw4IM3po.mjs').then((m) => m.WuicFirstRunWizardComponent);
50348
50603
  const componentClass = await firstRunWizardComponentPromise;
50349
50604
  this.componentRef = this.vcr.createComponent(componentClass);
50350
50605
  // Forward output del componente reale al wrapper. Type assertion necessaria
@@ -50379,6 +50634,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
50379
50634
  }] } });
50380
50635
 
50381
50636
  class TextEditorComponent {
50637
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
50638
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
50382
50639
  /**
50383
50640
  * Input dal componente padre per record; usata nella configurazione e nel rendering del componente.
50384
50641
  */
@@ -50501,6 +50758,8 @@ var textEditor_component = /*#__PURE__*/Object.freeze({
50501
50758
  });
50502
50759
 
50503
50760
  class TextAreaEditorComponent {
50761
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
50762
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
50504
50763
  /**
50505
50764
  * Input dal componente padre per record; usata nella configurazione e nel rendering del componente.
50506
50765
  */
@@ -50608,6 +50867,8 @@ class LookupEditorComponent {
50608
50867
  trslSrv;
50609
50868
  cd;
50610
50869
  hostElementRef;
50870
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
50871
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
50611
50872
  static LOOKUP_VIRTUALIZATION_DEFAULT_ITEM_SIZE = 44;
50612
50873
  pendingSearchFocusRestore = false;
50613
50874
  lookupOverlayVisible = false;
@@ -51415,6 +51676,8 @@ var lookupEditor_component = /*#__PURE__*/Object.freeze({
51415
51676
  class DictionaryEditorComponent {
51416
51677
  trnSrv;
51417
51678
  hostElementRef;
51679
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
51680
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
51418
51681
  /**
51419
51682
  * Input dal componente padre per record; usata nella configurazione e nel rendering del componente.
51420
51683
  */
@@ -51779,6 +52042,8 @@ var dictionaryEditor_component = /*#__PURE__*/Object.freeze({
51779
52042
  });
51780
52043
 
51781
52044
  class BooleanEditorComponent {
52045
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
52046
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
51782
52047
  /**
51783
52048
  * Input dal componente padre per record; usata nella configurazione e nel rendering del componente.
51784
52049
  */
@@ -51930,6 +52195,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
51930
52195
  }] });
51931
52196
 
51932
52197
  class DateEditorComponent {
52198
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
52199
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
51933
52200
  /**
51934
52201
  * Input dal componente padre per record; usata nella configurazione e nel rendering del componente.
51935
52202
  */
@@ -52038,6 +52305,8 @@ var dateEditor_component = /*#__PURE__*/Object.freeze({
52038
52305
  });
52039
52306
 
52040
52307
  class HtmlEditorComponent {
52308
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
52309
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
52041
52310
  /**
52042
52311
  * Input dal componente padre per record; usata nella configurazione e nel rendering del componente.
52043
52312
  */
@@ -61282,6 +61551,8 @@ class UploadEditorComponent {
61282
61551
  trnsl;
61283
61552
  usrSrv;
61284
61553
  config;
61554
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
61555
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
61285
61556
  /**
61286
61557
  * Input dal componente padre per record; usata nella configurazione e nel rendering del componente.
61287
61558
  */
@@ -61924,6 +62195,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
61924
62195
  * CodeEditorComponent + parser SQL/TS in un chunk separato caricato on-demand.
61925
62196
  */
61926
62197
  class CodeAreaEditorComponent {
62198
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
62199
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
61927
62200
  /**
61928
62201
  * Input dal componente padre per record; usata nella configurazione e nel rendering del componente.
61929
62202
  */
@@ -62045,7 +62318,7 @@ class LazyCodeEditorComponent {
62045
62318
  this.cdr = cdr;
62046
62319
  }
62047
62320
  async ngOnInit() {
62048
- codeEditorComponentPromise ??= import('./wuic-framework-lib-code-editor.component-CTI_gqvB.mjs').then((m) => m.CodeEditorComponent);
62321
+ codeEditorComponentPromise ??= import('./wuic-framework-lib-code-editor.component-c3x1X5O9.mjs').then((m) => m.CodeEditorComponent);
62049
62322
  this.loadedComponent = await codeEditorComponentPromise;
62050
62323
  this.cdr.markForCheck();
62051
62324
  }
@@ -62218,6 +62491,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
62218
62491
  }] } });
62219
62492
 
62220
62493
  class ColorEditorComponent {
62494
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
62495
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
62221
62496
  /**
62222
62497
  * Input dal componente padre per record; usata nella configurazione e nel rendering del componente.
62223
62498
  */
@@ -62568,6 +62843,8 @@ var propertyObjectEditor_component = /*#__PURE__*/Object.freeze({
62568
62843
  });
62569
62844
 
62570
62845
  class TreeViewSelectorComponent {
62846
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
62847
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
62571
62848
  /**
62572
62849
  * Input dal componente padre per record; usata nella configurazione e nel rendering del componente.
62573
62850
  */
@@ -63817,6 +64094,8 @@ class NotificationBellComponent {
63817
64094
  router;
63818
64095
  trslSrv;
63819
64096
  authSession;
64097
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
64098
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
63820
64099
  userId;
63821
64100
  // Default sentinel vuoto: se il consumer NON passa l'input, risolviamo via
63822
64101
  // TranslationManagerService all'ngOnInit. I fallback italiani restano nel
@@ -63831,6 +64110,8 @@ class NotificationBellComponent {
63831
64110
  notifications = [];
63832
64111
  isVisible = true;
63833
64112
  progressByGuid = {};
64113
+ /** Posizione nella coda export del server per le notifiche di progress in attesa. */
64114
+ queuePositionByGuid = {};
63834
64115
  /** Title del bottone "elimina notifica letta" (X), localizzato. */
63835
64116
  deleteNotificationTitle = '';
63836
64117
  sub = new Subscription();
@@ -63902,6 +64183,13 @@ class NotificationBellComponent {
63902
64183
  }
63903
64184
  const normalized = Math.max(0, Math.min(100, progress));
63904
64185
  this.progressByGuid[guid] = normalized;
64186
+ const queuePosition = Number(evt?.queuePosition);
64187
+ if (queuePosition > 0) {
64188
+ this.queuePositionByGuid[guid] = Math.floor(queuePosition);
64189
+ }
64190
+ else {
64191
+ delete this.queuePositionByGuid[guid];
64192
+ }
63905
64193
  }));
63906
64194
  // Riaggancio al LOGIN TARDIVO: `connect()` da solo non basta.
63907
64195
  // La campanella vive nell'header, quindi si monta anche sulla pagina di
@@ -64098,6 +64386,15 @@ class NotificationBellComponent {
64098
64386
  }));
64099
64387
  return true;
64100
64388
  }
64389
+ /** Testo "In coda: posizione N" per un export che aspetta il suo turno, altrimenti null. */
64390
+ getNotificationQueueText(item) {
64391
+ const guid = this.getNotificationProgressGuid(item);
64392
+ const position = guid ? this.queuePositionByGuid[guid] : undefined;
64393
+ if (!position) {
64394
+ return null;
64395
+ }
64396
+ return this.trslSrv.format(this.safeT('import_export.export_queued_short_{0}', 'In coda: posizione {0}'), String(position));
64397
+ }
64101
64398
  getNotificationProgress(item) {
64102
64399
  const guid = this.getNotificationProgressGuid(item);
64103
64400
  if (!guid) {
@@ -64158,11 +64455,11 @@ class NotificationBellComponent {
64158
64455
  }
64159
64456
  }
64160
64457
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: NotificationBellComponent, deps: [{ token: NotificationRealtimeService }, { token: i1$2.Router }, { token: TranslationManagerService }, { token: AuthSessionService }], target: i0.ɵɵFactoryTarget.Component });
64161
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: NotificationBellComponent, isStandalone: true, selector: "wuic-notification-bell", inputs: { userId: "userId", title: "title", emptyMessage: "emptyMessage", clearReadLabel: "clearReadLabel", markAllReadLabel: "markAllReadLabel" }, viewQueries: [{ propertyName: "notificationPanel", first: true, predicate: ["notificationPanel"], descendants: true }], ngImport: i0, template: "@if (isVisible) {\r\n <button type=\"button\" class=\"notification-bell-btn\" (click)=\"notificationPanel.toggle($event)\"\r\n [attr.aria-label]=\"title || 'Notifiche'\" [attr.title]=\"title || 'Notifiche'\">\r\n <i class=\"pi pi-bell\"></i>\r\n @if (unreadCount > 0) {\r\n <span class=\"notification-bell-badge\">{{ unreadCount }}</span>\r\n }\r\n </button>\r\n\r\n <p-popover #notificationPanel appendTo=\"body\" [style]=\"{ width: '26rem', maxWidth: '92vw' }\">\r\n <div class=\"notification-panel\">\r\n <div class=\"notification-panel-header-row\">\r\n <div class=\"notification-panel-header\">{{ title }}</div>\r\n @if (notifications.length) {\r\n <div class=\"notification-panel-actions\">\r\n @if (unreadCount > 0) {\r\n <button type=\"button\" class=\"notification-mark-all-btn\" (click)=\"markAllRead()\" [title]=\"markAllReadLabel\">{{ markAllReadLabel }}</button>\r\n }\r\n <button type=\"button\" class=\"notification-clear-read-btn\" (click)=\"clearRead()\">{{ clearReadLabel }}</button>\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (!notifications.length) {\r\n <div class=\"notification-empty\">{{ emptyMessage }}</div>\r\n }\r\n\r\n @for (n of notifications; track n.id) {\r\n <div class=\"notification-item\"\r\n [class.notification-item-unread]=\"!n.isRead\"\r\n [class.notification-item-clickable]=\"isClickable(n)\">\r\n <button type=\"button\" class=\"notification-item-open\" (click)=\"openNotification(n)\">\r\n <div class=\"notification-item-message\">\r\n {{ n.message }}\r\n @if (isClickable(n)) {\r\n <i class=\"pi pi-angle-right notification-item-chevron\" aria-hidden=\"true\"></i>\r\n }\r\n </div>\r\n @if (getNotificationProgress(n) !== null) {\r\n <div class=\"notification-item-progress\">\r\n <p-progressbar [value]=\"getNotificationProgress(n) || 0\"></p-progressbar>\r\n <div class=\"notification-item-progress-text\">{{ (getNotificationProgress(n) || 0).toFixed(2) }}%</div>\r\n </div>\r\n }\r\n <div class=\"notification-item-meta\">{{ n.type }} \u00B7 {{ n.createdAt | date:'dd/MM/yyyy HH:mm' }}</div>\r\n </button>\r\n @if (n.isRead) {\r\n <button type=\"button\" class=\"notification-item-delete\" (click)=\"deleteReadNotification($event, n)\" [title]=\"deleteNotificationTitle\">\r\n <i class=\"pi pi-times\"></i>\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </p-popover>\r\n}\r\n", styles: [":host{display:inline-flex}.notification-bell-btn{position:relative;border:0;background:transparent;cursor:pointer;width:2.25rem;height:2.25rem;border-radius:999px;color:inherit}.notification-bell-btn:hover{background:color-mix(in srgb,var(--wuic-accent, #3b82f6) 12%,transparent)}.notification-bell-badge{position:absolute;top:-.2rem;right:-.2rem;min-width:1.1rem;height:1.1rem;padding:0 .2rem;border-radius:999px;background:#ef4444;color:#fff;font-size:.68rem;line-height:1.1rem;text-align:center}.notification-panel{display:flex;flex-direction:column;gap:.35rem}.notification-panel-header-row{display:flex;align-items:center;justify-content:space-between;gap:.5rem}.notification-panel-header{font-weight:700}.notification-panel-actions{display:flex;align-items:center;gap:.5rem}.notification-clear-read-btn,.notification-mark-all-btn{border:0;background:transparent;color:var(--wuic-accent, #3b82f6);cursor:pointer;font-size:.85rem;padding:.2rem .45rem;border-radius:.35rem}.notification-clear-read-btn:hover,.notification-mark-all-btn:hover{background:color-mix(in srgb,var(--wuic-accent, #3b82f6) 12%,transparent)}.notification-mark-all-btn{font-weight:600}.notification-empty{color:var(--wuic-text-muted, #64748b);padding:.5rem 0}.notification-item{display:flex;align-items:flex-start;gap:.4rem;border:1px solid var(--wuic-border, #dbe2ef);border-radius:.5rem;background:var(--wuic-surface, #fff);padding:.4rem}.notification-item:hover{border-color:color-mix(in srgb,var(--wuic-accent, #3b82f6) 40%,var(--wuic-border, #dbe2ef))}.notification-item-unread{border-left:4px solid var(--wuic-accent, #3b82f6)}.notification-item-message{font-size:.95rem;line-height:1.25rem}.notification-item-open{flex:1;border:0;background:transparent;text-align:left;cursor:pointer;padding:.15rem}.notification-item-delete{border:0;background:transparent;color:var(--wuic-text-muted, #64748b);cursor:pointer;width:1.8rem;height:1.8rem;border-radius:999px;margin-top:.05rem}.notification-item-delete:hover{background:#ef44441f;color:#b91c1c}.notification-item-meta{margin-top:.25rem;color:var(--wuic-text-muted, #64748b);font-size:.78rem}.notification-item-progress{margin-top:.35rem}:host ::ng-deep .notification-item-progress .p-progressbar .p-progressbar-value,:host ::ng-deep .notification-item-progress .p-progressbar-value{transition:none!important}.notification-item-progress-text{margin-top:.2rem;text-align:right;color:var(--wuic-text-muted, #64748b);font-size:.74rem;font-weight:600}.notification-item-clickable{background:linear-gradient(to right,color-mix(in srgb,var(--wuic-accent, #3b82f6) 6%,transparent),color-mix(in srgb,var(--wuic-accent, #3b82f6) 2%,transparent));border-color:color-mix(in srgb,var(--wuic-accent, #3b82f6) 35%,transparent)}.notification-item-clickable:hover{background:linear-gradient(to right,color-mix(in srgb,var(--wuic-accent, #3b82f6) 14%,transparent),color-mix(in srgb,var(--wuic-accent, #3b82f6) 6%,transparent));border-color:var(--wuic-accent, #3b82f6);box-shadow:0 1px 3px color-mix(in srgb,var(--wuic-accent, #3b82f6) 15%,transparent)}.notification-item-clickable .notification-item-message{color:var(--wuic-accent, #3b82f6);font-weight:500;display:flex;align-items:center;justify-content:space-between;gap:.5rem}.notification-item-chevron{color:var(--wuic-accent, #3b82f6);font-size:.9rem;flex-shrink:0;opacity:.75;transition:transform .15s ease-out,opacity .15s ease-out}.notification-item-clickable:hover .notification-item-chevron{opacity:1;transform:translate(2px)}.notification-item:not(.notification-item-clickable) .notification-item-open{cursor:default}\n"], dependencies: [{ kind: "ngmodule", type: ButtonModule }, { kind: "ngmodule", type: PopoverModule }, { kind: "component", type: i5$5.Popover, selector: "p-popover", inputs: ["ariaLabel", "ariaLabelledBy", "dismissable", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions", "motionOptions"], outputs: ["onShow", "onHide"] }, { kind: "ngmodule", type: ProgressBarModule }, { kind: "component", type: i6$3.ProgressBar, selector: "p-progressBar, p-progressbar, p-progress-bar", inputs: ["value", "showValue", "styleClass", "valueStyleClass", "unit", "mode", "color"] }, { kind: "pipe", type: DatePipe, name: "date" }] });
64458
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: NotificationBellComponent, isStandalone: true, selector: "wuic-notification-bell", inputs: { userId: "userId", title: "title", emptyMessage: "emptyMessage", clearReadLabel: "clearReadLabel", markAllReadLabel: "markAllReadLabel" }, viewQueries: [{ propertyName: "notificationPanel", first: true, predicate: ["notificationPanel"], descendants: true }], ngImport: i0, template: "@if (isVisible) {\r\n <button type=\"button\" class=\"notification-bell-btn\" (click)=\"notificationPanel.toggle($event)\"\r\n [attr.aria-label]=\"title || 'Notifiche'\" [attr.title]=\"title || 'Notifiche'\">\r\n <i class=\"pi pi-bell\"></i>\r\n @if (unreadCount > 0) {\r\n <span class=\"notification-bell-badge\">{{ unreadCount }}</span>\r\n }\r\n </button>\r\n\r\n <p-popover #notificationPanel appendTo=\"body\" [style]=\"{ width: '26rem', maxWidth: '92vw' }\">\r\n <div class=\"notification-panel\">\r\n <div class=\"notification-panel-header-row\">\r\n <div class=\"notification-panel-header\">{{ title }}</div>\r\n @if (notifications.length) {\r\n <div class=\"notification-panel-actions\">\r\n @if (unreadCount > 0) {\r\n <button type=\"button\" class=\"notification-mark-all-btn\" (click)=\"markAllRead()\" [title]=\"markAllReadLabel\">{{ markAllReadLabel }}</button>\r\n }\r\n <button type=\"button\" class=\"notification-clear-read-btn\" (click)=\"clearRead()\">{{ clearReadLabel }}</button>\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (!notifications.length) {\r\n <div class=\"notification-empty\">{{ emptyMessage }}</div>\r\n }\r\n\r\n @for (n of notifications; track n.id) {\r\n <div class=\"notification-item\"\r\n [class.notification-item-unread]=\"!n.isRead\"\r\n [class.notification-item-clickable]=\"isClickable(n)\">\r\n <button type=\"button\" class=\"notification-item-open\" (click)=\"openNotification(n)\">\r\n <div class=\"notification-item-message\">\r\n {{ n.message }}\r\n @if (isClickable(n)) {\r\n <i class=\"pi pi-angle-right notification-item-chevron\" aria-hidden=\"true\"></i>\r\n }\r\n </div>\r\n @if (getNotificationProgress(n) !== null) {\r\n <div class=\"notification-item-progress\">\r\n <p-progressbar [value]=\"getNotificationProgress(n) || 0\"></p-progressbar>\r\n <div class=\"notification-item-progress-text\">{{ getNotificationQueueText(n) || ((getNotificationProgress(n) || 0).toFixed(2) + '%') }}</div>\r\n </div>\r\n }\r\n <div class=\"notification-item-meta\">{{ n.type }} \u00B7 {{ n.createdAt | date:'dd/MM/yyyy HH:mm' }}</div>\r\n </button>\r\n @if (n.isRead) {\r\n <button type=\"button\" class=\"notification-item-delete\" (click)=\"deleteReadNotification($event, n)\" [title]=\"deleteNotificationTitle\">\r\n <i class=\"pi pi-times\"></i>\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </p-popover>\r\n}\r\n", styles: [":host{display:inline-flex}.notification-bell-btn{position:relative;border:0;background:transparent;cursor:pointer;width:2.25rem;height:2.25rem;border-radius:999px;color:inherit}.notification-bell-btn:hover{background:color-mix(in srgb,var(--wuic-accent, #3b82f6) 12%,transparent)}.notification-bell-badge{position:absolute;top:-.2rem;right:-.2rem;min-width:1.1rem;height:1.1rem;padding:0 .2rem;border-radius:999px;background:#ef4444;color:#fff;font-size:.68rem;line-height:1.1rem;text-align:center}.notification-panel{display:flex;flex-direction:column;gap:.35rem}.notification-panel-header-row{display:flex;align-items:center;justify-content:space-between;gap:.5rem}.notification-panel-header{font-weight:700}.notification-panel-actions{display:flex;align-items:center;gap:.5rem}.notification-clear-read-btn,.notification-mark-all-btn{border:0;background:transparent;color:var(--wuic-accent, #3b82f6);cursor:pointer;font-size:.85rem;padding:.2rem .45rem;border-radius:.35rem}.notification-clear-read-btn:hover,.notification-mark-all-btn:hover{background:color-mix(in srgb,var(--wuic-accent, #3b82f6) 12%,transparent)}.notification-mark-all-btn{font-weight:600}.notification-empty{color:var(--wuic-text-muted, #64748b);padding:.5rem 0}.notification-item{display:flex;align-items:flex-start;gap:.4rem;border:1px solid var(--wuic-border, #dbe2ef);border-radius:.5rem;background:var(--wuic-surface, #fff);padding:.4rem}.notification-item:hover{border-color:color-mix(in srgb,var(--wuic-accent, #3b82f6) 40%,var(--wuic-border, #dbe2ef))}.notification-item-unread{border-left:4px solid var(--wuic-accent, #3b82f6)}.notification-item-message{font-size:.95rem;line-height:1.25rem}.notification-item-open{flex:1;border:0;background:transparent;text-align:left;cursor:pointer;padding:.15rem}.notification-item-delete{border:0;background:transparent;color:var(--wuic-text-muted, #64748b);cursor:pointer;width:1.8rem;height:1.8rem;border-radius:999px;margin-top:.05rem}.notification-item-delete:hover{background:#ef44441f;color:#b91c1c}.notification-item-meta{margin-top:.25rem;color:var(--wuic-text-muted, #64748b);font-size:.78rem}.notification-item-progress{margin-top:.35rem}:host ::ng-deep .notification-item-progress .p-progressbar .p-progressbar-value,:host ::ng-deep .notification-item-progress .p-progressbar-value{transition:none!important}.notification-item-progress-text{margin-top:.2rem;text-align:right;color:var(--wuic-text-muted, #64748b);font-size:.74rem;font-weight:600}.notification-item-clickable{background:linear-gradient(to right,color-mix(in srgb,var(--wuic-accent, #3b82f6) 6%,transparent),color-mix(in srgb,var(--wuic-accent, #3b82f6) 2%,transparent));border-color:color-mix(in srgb,var(--wuic-accent, #3b82f6) 35%,transparent)}.notification-item-clickable:hover{background:linear-gradient(to right,color-mix(in srgb,var(--wuic-accent, #3b82f6) 14%,transparent),color-mix(in srgb,var(--wuic-accent, #3b82f6) 6%,transparent));border-color:var(--wuic-accent, #3b82f6);box-shadow:0 1px 3px color-mix(in srgb,var(--wuic-accent, #3b82f6) 15%,transparent)}.notification-item-clickable .notification-item-message{color:var(--wuic-accent, #3b82f6);font-weight:500;display:flex;align-items:center;justify-content:space-between;gap:.5rem}.notification-item-chevron{color:var(--wuic-accent, #3b82f6);font-size:.9rem;flex-shrink:0;opacity:.75;transition:transform .15s ease-out,opacity .15s ease-out}.notification-item-clickable:hover .notification-item-chevron{opacity:1;transform:translate(2px)}.notification-item:not(.notification-item-clickable) .notification-item-open{cursor:default}\n"], dependencies: [{ kind: "ngmodule", type: ButtonModule }, { kind: "ngmodule", type: PopoverModule }, { kind: "component", type: i5$5.Popover, selector: "p-popover", inputs: ["ariaLabel", "ariaLabelledBy", "dismissable", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions", "motionOptions"], outputs: ["onShow", "onHide"] }, { kind: "ngmodule", type: ProgressBarModule }, { kind: "component", type: i6$3.ProgressBar, selector: "p-progressBar, p-progressbar, p-progress-bar", inputs: ["value", "showValue", "styleClass", "valueStyleClass", "unit", "mode", "color"] }, { kind: "pipe", type: DatePipe, name: "date" }] });
64162
64459
  }
64163
64460
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: NotificationBellComponent, decorators: [{
64164
64461
  type: Component,
64165
- args: [{ selector: 'wuic-notification-bell', imports: [DatePipe, ButtonModule, PopoverModule, ProgressBarModule], template: "@if (isVisible) {\r\n <button type=\"button\" class=\"notification-bell-btn\" (click)=\"notificationPanel.toggle($event)\"\r\n [attr.aria-label]=\"title || 'Notifiche'\" [attr.title]=\"title || 'Notifiche'\">\r\n <i class=\"pi pi-bell\"></i>\r\n @if (unreadCount > 0) {\r\n <span class=\"notification-bell-badge\">{{ unreadCount }}</span>\r\n }\r\n </button>\r\n\r\n <p-popover #notificationPanel appendTo=\"body\" [style]=\"{ width: '26rem', maxWidth: '92vw' }\">\r\n <div class=\"notification-panel\">\r\n <div class=\"notification-panel-header-row\">\r\n <div class=\"notification-panel-header\">{{ title }}</div>\r\n @if (notifications.length) {\r\n <div class=\"notification-panel-actions\">\r\n @if (unreadCount > 0) {\r\n <button type=\"button\" class=\"notification-mark-all-btn\" (click)=\"markAllRead()\" [title]=\"markAllReadLabel\">{{ markAllReadLabel }}</button>\r\n }\r\n <button type=\"button\" class=\"notification-clear-read-btn\" (click)=\"clearRead()\">{{ clearReadLabel }}</button>\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (!notifications.length) {\r\n <div class=\"notification-empty\">{{ emptyMessage }}</div>\r\n }\r\n\r\n @for (n of notifications; track n.id) {\r\n <div class=\"notification-item\"\r\n [class.notification-item-unread]=\"!n.isRead\"\r\n [class.notification-item-clickable]=\"isClickable(n)\">\r\n <button type=\"button\" class=\"notification-item-open\" (click)=\"openNotification(n)\">\r\n <div class=\"notification-item-message\">\r\n {{ n.message }}\r\n @if (isClickable(n)) {\r\n <i class=\"pi pi-angle-right notification-item-chevron\" aria-hidden=\"true\"></i>\r\n }\r\n </div>\r\n @if (getNotificationProgress(n) !== null) {\r\n <div class=\"notification-item-progress\">\r\n <p-progressbar [value]=\"getNotificationProgress(n) || 0\"></p-progressbar>\r\n <div class=\"notification-item-progress-text\">{{ (getNotificationProgress(n) || 0).toFixed(2) }}%</div>\r\n </div>\r\n }\r\n <div class=\"notification-item-meta\">{{ n.type }} \u00B7 {{ n.createdAt | date:'dd/MM/yyyy HH:mm' }}</div>\r\n </button>\r\n @if (n.isRead) {\r\n <button type=\"button\" class=\"notification-item-delete\" (click)=\"deleteReadNotification($event, n)\" [title]=\"deleteNotificationTitle\">\r\n <i class=\"pi pi-times\"></i>\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </p-popover>\r\n}\r\n", styles: [":host{display:inline-flex}.notification-bell-btn{position:relative;border:0;background:transparent;cursor:pointer;width:2.25rem;height:2.25rem;border-radius:999px;color:inherit}.notification-bell-btn:hover{background:color-mix(in srgb,var(--wuic-accent, #3b82f6) 12%,transparent)}.notification-bell-badge{position:absolute;top:-.2rem;right:-.2rem;min-width:1.1rem;height:1.1rem;padding:0 .2rem;border-radius:999px;background:#ef4444;color:#fff;font-size:.68rem;line-height:1.1rem;text-align:center}.notification-panel{display:flex;flex-direction:column;gap:.35rem}.notification-panel-header-row{display:flex;align-items:center;justify-content:space-between;gap:.5rem}.notification-panel-header{font-weight:700}.notification-panel-actions{display:flex;align-items:center;gap:.5rem}.notification-clear-read-btn,.notification-mark-all-btn{border:0;background:transparent;color:var(--wuic-accent, #3b82f6);cursor:pointer;font-size:.85rem;padding:.2rem .45rem;border-radius:.35rem}.notification-clear-read-btn:hover,.notification-mark-all-btn:hover{background:color-mix(in srgb,var(--wuic-accent, #3b82f6) 12%,transparent)}.notification-mark-all-btn{font-weight:600}.notification-empty{color:var(--wuic-text-muted, #64748b);padding:.5rem 0}.notification-item{display:flex;align-items:flex-start;gap:.4rem;border:1px solid var(--wuic-border, #dbe2ef);border-radius:.5rem;background:var(--wuic-surface, #fff);padding:.4rem}.notification-item:hover{border-color:color-mix(in srgb,var(--wuic-accent, #3b82f6) 40%,var(--wuic-border, #dbe2ef))}.notification-item-unread{border-left:4px solid var(--wuic-accent, #3b82f6)}.notification-item-message{font-size:.95rem;line-height:1.25rem}.notification-item-open{flex:1;border:0;background:transparent;text-align:left;cursor:pointer;padding:.15rem}.notification-item-delete{border:0;background:transparent;color:var(--wuic-text-muted, #64748b);cursor:pointer;width:1.8rem;height:1.8rem;border-radius:999px;margin-top:.05rem}.notification-item-delete:hover{background:#ef44441f;color:#b91c1c}.notification-item-meta{margin-top:.25rem;color:var(--wuic-text-muted, #64748b);font-size:.78rem}.notification-item-progress{margin-top:.35rem}:host ::ng-deep .notification-item-progress .p-progressbar .p-progressbar-value,:host ::ng-deep .notification-item-progress .p-progressbar-value{transition:none!important}.notification-item-progress-text{margin-top:.2rem;text-align:right;color:var(--wuic-text-muted, #64748b);font-size:.74rem;font-weight:600}.notification-item-clickable{background:linear-gradient(to right,color-mix(in srgb,var(--wuic-accent, #3b82f6) 6%,transparent),color-mix(in srgb,var(--wuic-accent, #3b82f6) 2%,transparent));border-color:color-mix(in srgb,var(--wuic-accent, #3b82f6) 35%,transparent)}.notification-item-clickable:hover{background:linear-gradient(to right,color-mix(in srgb,var(--wuic-accent, #3b82f6) 14%,transparent),color-mix(in srgb,var(--wuic-accent, #3b82f6) 6%,transparent));border-color:var(--wuic-accent, #3b82f6);box-shadow:0 1px 3px color-mix(in srgb,var(--wuic-accent, #3b82f6) 15%,transparent)}.notification-item-clickable .notification-item-message{color:var(--wuic-accent, #3b82f6);font-weight:500;display:flex;align-items:center;justify-content:space-between;gap:.5rem}.notification-item-chevron{color:var(--wuic-accent, #3b82f6);font-size:.9rem;flex-shrink:0;opacity:.75;transition:transform .15s ease-out,opacity .15s ease-out}.notification-item-clickable:hover .notification-item-chevron{opacity:1;transform:translate(2px)}.notification-item:not(.notification-item-clickable) .notification-item-open{cursor:default}\n"] }]
64462
+ args: [{ selector: 'wuic-notification-bell', imports: [DatePipe, ButtonModule, PopoverModule, ProgressBarModule], template: "@if (isVisible) {\r\n <button type=\"button\" class=\"notification-bell-btn\" (click)=\"notificationPanel.toggle($event)\"\r\n [attr.aria-label]=\"title || 'Notifiche'\" [attr.title]=\"title || 'Notifiche'\">\r\n <i class=\"pi pi-bell\"></i>\r\n @if (unreadCount > 0) {\r\n <span class=\"notification-bell-badge\">{{ unreadCount }}</span>\r\n }\r\n </button>\r\n\r\n <p-popover #notificationPanel appendTo=\"body\" [style]=\"{ width: '26rem', maxWidth: '92vw' }\">\r\n <div class=\"notification-panel\">\r\n <div class=\"notification-panel-header-row\">\r\n <div class=\"notification-panel-header\">{{ title }}</div>\r\n @if (notifications.length) {\r\n <div class=\"notification-panel-actions\">\r\n @if (unreadCount > 0) {\r\n <button type=\"button\" class=\"notification-mark-all-btn\" (click)=\"markAllRead()\" [title]=\"markAllReadLabel\">{{ markAllReadLabel }}</button>\r\n }\r\n <button type=\"button\" class=\"notification-clear-read-btn\" (click)=\"clearRead()\">{{ clearReadLabel }}</button>\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (!notifications.length) {\r\n <div class=\"notification-empty\">{{ emptyMessage }}</div>\r\n }\r\n\r\n @for (n of notifications; track n.id) {\r\n <div class=\"notification-item\"\r\n [class.notification-item-unread]=\"!n.isRead\"\r\n [class.notification-item-clickable]=\"isClickable(n)\">\r\n <button type=\"button\" class=\"notification-item-open\" (click)=\"openNotification(n)\">\r\n <div class=\"notification-item-message\">\r\n {{ n.message }}\r\n @if (isClickable(n)) {\r\n <i class=\"pi pi-angle-right notification-item-chevron\" aria-hidden=\"true\"></i>\r\n }\r\n </div>\r\n @if (getNotificationProgress(n) !== null) {\r\n <div class=\"notification-item-progress\">\r\n <p-progressbar [value]=\"getNotificationProgress(n) || 0\"></p-progressbar>\r\n <div class=\"notification-item-progress-text\">{{ getNotificationQueueText(n) || ((getNotificationProgress(n) || 0).toFixed(2) + '%') }}</div>\r\n </div>\r\n }\r\n <div class=\"notification-item-meta\">{{ n.type }} \u00B7 {{ n.createdAt | date:'dd/MM/yyyy HH:mm' }}</div>\r\n </button>\r\n @if (n.isRead) {\r\n <button type=\"button\" class=\"notification-item-delete\" (click)=\"deleteReadNotification($event, n)\" [title]=\"deleteNotificationTitle\">\r\n <i class=\"pi pi-times\"></i>\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </p-popover>\r\n}\r\n", styles: [":host{display:inline-flex}.notification-bell-btn{position:relative;border:0;background:transparent;cursor:pointer;width:2.25rem;height:2.25rem;border-radius:999px;color:inherit}.notification-bell-btn:hover{background:color-mix(in srgb,var(--wuic-accent, #3b82f6) 12%,transparent)}.notification-bell-badge{position:absolute;top:-.2rem;right:-.2rem;min-width:1.1rem;height:1.1rem;padding:0 .2rem;border-radius:999px;background:#ef4444;color:#fff;font-size:.68rem;line-height:1.1rem;text-align:center}.notification-panel{display:flex;flex-direction:column;gap:.35rem}.notification-panel-header-row{display:flex;align-items:center;justify-content:space-between;gap:.5rem}.notification-panel-header{font-weight:700}.notification-panel-actions{display:flex;align-items:center;gap:.5rem}.notification-clear-read-btn,.notification-mark-all-btn{border:0;background:transparent;color:var(--wuic-accent, #3b82f6);cursor:pointer;font-size:.85rem;padding:.2rem .45rem;border-radius:.35rem}.notification-clear-read-btn:hover,.notification-mark-all-btn:hover{background:color-mix(in srgb,var(--wuic-accent, #3b82f6) 12%,transparent)}.notification-mark-all-btn{font-weight:600}.notification-empty{color:var(--wuic-text-muted, #64748b);padding:.5rem 0}.notification-item{display:flex;align-items:flex-start;gap:.4rem;border:1px solid var(--wuic-border, #dbe2ef);border-radius:.5rem;background:var(--wuic-surface, #fff);padding:.4rem}.notification-item:hover{border-color:color-mix(in srgb,var(--wuic-accent, #3b82f6) 40%,var(--wuic-border, #dbe2ef))}.notification-item-unread{border-left:4px solid var(--wuic-accent, #3b82f6)}.notification-item-message{font-size:.95rem;line-height:1.25rem}.notification-item-open{flex:1;border:0;background:transparent;text-align:left;cursor:pointer;padding:.15rem}.notification-item-delete{border:0;background:transparent;color:var(--wuic-text-muted, #64748b);cursor:pointer;width:1.8rem;height:1.8rem;border-radius:999px;margin-top:.05rem}.notification-item-delete:hover{background:#ef44441f;color:#b91c1c}.notification-item-meta{margin-top:.25rem;color:var(--wuic-text-muted, #64748b);font-size:.78rem}.notification-item-progress{margin-top:.35rem}:host ::ng-deep .notification-item-progress .p-progressbar .p-progressbar-value,:host ::ng-deep .notification-item-progress .p-progressbar-value{transition:none!important}.notification-item-progress-text{margin-top:.2rem;text-align:right;color:var(--wuic-text-muted, #64748b);font-size:.74rem;font-weight:600}.notification-item-clickable{background:linear-gradient(to right,color-mix(in srgb,var(--wuic-accent, #3b82f6) 6%,transparent),color-mix(in srgb,var(--wuic-accent, #3b82f6) 2%,transparent));border-color:color-mix(in srgb,var(--wuic-accent, #3b82f6) 35%,transparent)}.notification-item-clickable:hover{background:linear-gradient(to right,color-mix(in srgb,var(--wuic-accent, #3b82f6) 14%,transparent),color-mix(in srgb,var(--wuic-accent, #3b82f6) 6%,transparent));border-color:var(--wuic-accent, #3b82f6);box-shadow:0 1px 3px color-mix(in srgb,var(--wuic-accent, #3b82f6) 15%,transparent)}.notification-item-clickable .notification-item-message{color:var(--wuic-accent, #3b82f6);font-weight:500;display:flex;align-items:center;justify-content:space-between;gap:.5rem}.notification-item-chevron{color:var(--wuic-accent, #3b82f6);font-size:.9rem;flex-shrink:0;opacity:.75;transition:transform .15s ease-out,opacity .15s ease-out}.notification-item-clickable:hover .notification-item-chevron{opacity:1;transform:translate(2px)}.notification-item:not(.notification-item-clickable) .notification-item-open{cursor:default}\n"] }]
64166
64463
  }], ctorParameters: () => [{ type: NotificationRealtimeService }, { type: i1$2.Router }, { type: TranslationManagerService }, { type: AuthSessionService }], propDecorators: { userId: [{
64167
64464
  type: Input
64168
64465
  }], title: [{
@@ -64224,7 +64521,7 @@ class DesignerRouteComponent {
64224
64521
  * Inizializza il componente preparando stato, sottoscrizioni e primi caricamenti richiesti.
64225
64522
  */
64226
64523
  async ngOnInit() {
64227
- designerComponentPromise ??= import('./wuic-framework-lib-designer.component-67PCnDYC.mjs').then((m) => m.DesignerComponent);
64524
+ designerComponentPromise ??= import('./wuic-framework-lib-designer.component-CXHYNEm5.mjs').then((m) => m.DesignerComponent);
64228
64525
  this.loadedComponent = await designerComponentPromise;
64229
64526
  }
64230
64527
  /**
@@ -64305,7 +64602,7 @@ class LazyPivotBuilderComponent {
64305
64602
  this.cdr = cdr;
64306
64603
  }
64307
64604
  async ngOnInit() {
64308
- pivotBuilderComponentPromise ??= import('./wuic-framework-lib-pivot-builder.component-Dg-xWzxO.mjs').then((m) => m.PivotBuilderComponent);
64605
+ pivotBuilderComponentPromise ??= import('./wuic-framework-lib-pivot-builder.component-DP60RcD5.mjs').then((m) => m.PivotBuilderComponent);
64309
64606
  this.loadedComponent = await pivotBuilderComponentPromise;
64310
64607
  this.cdr.markForCheck();
64311
64608
  }
@@ -64344,7 +64641,7 @@ class WorkflowDesignerRouteComponent {
64344
64641
  * Inizializza il componente preparando stato, sottoscrizioni e primi caricamenti richiesti.
64345
64642
  */
64346
64643
  async ngOnInit() {
64347
- workflowDesignerComponentPromise ??= import('./wuic-framework-lib-workflow-designer.component-DVEL_aHg.mjs').then((m) => m.WorkflowDesignerComponent);
64644
+ workflowDesignerComponentPromise ??= import('./wuic-framework-lib-workflow-designer.component-DCQE7JQz.mjs').then((m) => m.WorkflowDesignerComponent);
64348
64645
  this.loadedComponent = await workflowDesignerComponentPromise;
64349
64646
  }
64350
64647
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: WorkflowDesignerRouteComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
@@ -64390,7 +64687,7 @@ class Scene3dDesignerRouteComponent {
64390
64687
  /** Componente designer runtime caricato lazy, usato dal template. */
64391
64688
  loadedComponent = null;
64392
64689
  async ngOnInit() {
64393
- scene3dDesignerComponentPromise ??= import('./wuic-framework-lib-scene3d-designer.component-CkoU_J5j.mjs').then(function (n) { return n.s; }).then((m) => m.Scene3dDesignerComponent);
64690
+ scene3dDesignerComponentPromise ??= import('./wuic-framework-lib-scene3d-designer.component-DtFyJ3QF.mjs').then(function (n) { return n.s; }).then((m) => m.Scene3dDesignerComponent);
64394
64691
  this.loadedComponent = await scene3dDesignerComponentPromise;
64395
64692
  }
64396
64693
  /** Delega al designer runtime la conferma navigazione con pending changes. */
@@ -64446,7 +64743,7 @@ class Scene3dViewerRouteComponent {
64446
64743
  /** Componente viewer runtime caricato lazy, usato dal template. */
64447
64744
  loadedComponent = null;
64448
64745
  async ngOnInit() {
64449
- scene3dViewerComponentPromise ??= import('./wuic-framework-lib-scene3d-viewer.component-Dt0fvwFX.mjs').then((m) => m.Scene3dViewerComponent);
64746
+ scene3dViewerComponentPromise ??= import('./wuic-framework-lib-scene3d-viewer.component-B7uh74v4.mjs').then((m) => m.Scene3dViewerComponent);
64450
64747
  this.loadedComponent = await scene3dViewerComponentPromise;
64451
64748
  }
64452
64749
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: Scene3dViewerRouteComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
@@ -64507,7 +64804,7 @@ class LazyReportDesignerComponent {
64507
64804
  this.cdr = cdr;
64508
64805
  }
64509
64806
  async ngOnInit() {
64510
- reportDesignerComponentPromise ??= import('./wuic-framework-lib-report-designer.component-9_M4MA2p.mjs').then((m) => m.ReportDesignerComponent);
64807
+ reportDesignerComponentPromise ??= import('./wuic-framework-lib-report-designer.component-Cn3pUy16.mjs').then((m) => m.ReportDesignerComponent);
64511
64808
  this.loadedComponent = await reportDesignerComponentPromise;
64512
64809
  this.cdr.markForCheck();
64513
64810
  }
@@ -64562,7 +64859,7 @@ class LazyReportViewerComponent {
64562
64859
  this.cdr = cdr;
64563
64860
  }
64564
64861
  async ngOnInit() {
64565
- reportViewerComponentPromise ??= import('./wuic-framework-lib-report-viewer.component-C5EAoGOx.mjs').then((m) => m.ReportViewerComponent);
64862
+ reportViewerComponentPromise ??= import('./wuic-framework-lib-report-viewer.component-m-ianUWE.mjs').then((m) => m.ReportViewerComponent);
64566
64863
  this.loadedComponent = await reportViewerComponentPromise;
64567
64864
  this.cdr.markForCheck();
64568
64865
  }
@@ -64592,6 +64889,8 @@ class KanbanListComponent {
64592
64889
  userInfo;
64593
64890
  cdr;
64594
64891
  ngZone;
64892
+ /** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
64893
+ wuicCmpHandle = exposeWuicCmpOnHost(this);
64595
64894
  hardcodedRoute;
64596
64895
  parentRecord;
64597
64896
  parentMetaInfo;
@@ -68886,7 +69185,7 @@ const themeBuilderPendingChangesGuard = (component) => {
68886
69185
  const routes = [
68887
69186
  {
68888
69187
  path: 'framework-docs',
68889
- loadComponent: () => import('./wuic-framework-lib-framework-docs.component-BLxQmoDZ.mjs').then((m) => m.FrameworkDocsComponent),
69188
+ loadComponent: () => import('./wuic-framework-lib-framework-docs.component-BIULbCaM.mjs').then((m) => m.FrameworkDocsComponent),
68890
69189
  canMatch: [menuRouteAccessCanMatchGuard],
68891
69190
  canActivate: [menuRouteAccessCanActivateGuard],
68892
69191
  data: {
@@ -68895,7 +69194,7 @@ const routes = [
68895
69194
  },
68896
69195
  {
68897
69196
  path: 'framework-docs/:slug',
68898
- loadComponent: () => import('./wuic-framework-lib-framework-docs.component-BLxQmoDZ.mjs').then((m) => m.FrameworkDocsComponent),
69197
+ loadComponent: () => import('./wuic-framework-lib-framework-docs.component-BIULbCaM.mjs').then((m) => m.FrameworkDocsComponent),
68899
69198
  canMatch: [menuRouteAccessCanMatchGuard],
68900
69199
  canActivate: [menuRouteAccessCanActivateGuard],
68901
69200
  data: {
@@ -68940,7 +69239,7 @@ const routes = [
68940
69239
  },
68941
69240
  {
68942
69241
  path: ':route/report-designer',
68943
- loadComponent: () => import('./wuic-framework-lib-report-designer.component-9_M4MA2p.mjs').then((m) => m.ReportDesignerComponent),
69242
+ loadComponent: () => import('./wuic-framework-lib-report-designer.component-Cn3pUy16.mjs').then((m) => m.ReportDesignerComponent),
68944
69243
  canMatch: [menuRouteAccessCanMatchGuard, featureRouteCanMatchGuard],
68945
69244
  canActivate: [menuRouteAccessCanActivateGuard, featureRouteCanActivateGuard],
68946
69245
  data: {
@@ -68950,7 +69249,7 @@ const routes = [
68950
69249
  },
68951
69250
  {
68952
69251
  path: ':route/report-viewer',
68953
- loadComponent: () => import('./wuic-framework-lib-report-viewer.component-C5EAoGOx.mjs').then((m) => m.ReportViewerComponent),
69252
+ loadComponent: () => import('./wuic-framework-lib-report-viewer.component-m-ianUWE.mjs').then((m) => m.ReportViewerComponent),
68954
69253
  canMatch: [menuRouteAccessCanMatchGuard],
68955
69254
  canActivate: [menuRouteAccessCanActivateGuard],
68956
69255
  data: {
@@ -68970,7 +69269,7 @@ const routes = [
68970
69269
  },
68971
69270
  {
68972
69271
  path: ':route/pivot-builder',
68973
- loadComponent: () => import('./wuic-framework-lib-pivot-builder.component-Dg-xWzxO.mjs').then((m) => m.PivotBuilderComponent),
69272
+ loadComponent: () => import('./wuic-framework-lib-pivot-builder.component-DP60RcD5.mjs').then((m) => m.PivotBuilderComponent),
68974
69273
  canMatch: [menuRouteAccessCanMatchGuard, featureRouteCanMatchGuard],
68975
69274
  canActivate: [menuRouteAccessCanActivateGuard, featureRouteCanActivateGuard],
68976
69275
  data: {
@@ -68980,7 +69279,7 @@ const routes = [
68980
69279
  },
68981
69280
  {
68982
69281
  path: 'pivot-builder',
68983
- loadComponent: () => import('./wuic-framework-lib-pivot-builder.component-Dg-xWzxO.mjs').then((m) => m.PivotBuilderComponent),
69282
+ loadComponent: () => import('./wuic-framework-lib-pivot-builder.component-DP60RcD5.mjs').then((m) => m.PivotBuilderComponent),
68984
69283
  canMatch: [menuRouteAccessCanMatchGuard, featureRouteCanMatchGuard],
68985
69284
  canActivate: [menuRouteAccessCanActivateGuard, featureRouteCanActivateGuard],
68986
69285
  data: {
@@ -71079,5 +71378,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
71079
71378
  * Generated bundle index. Do not edit.
71080
71379
  */
71081
71380
 
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
71381
+ 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 };
71382
+ //# sourceMappingURL=wuic-framework-lib-wuic-framework-lib-BlysiZLp.mjs.map